use jni::EnvUnowned;
use jni::objects::JClass;
use jni::sys::{jboolean, jlong};
use crate::WuiEnv;
unsafe fn environment<'a>(env_ptr: jlong) -> Option<&'a WuiEnv> {
let pointer = env_ptr as *const WuiEnv;
if pointer.is_null() {
return None;
}
Some(unsafe { crate::borrow_ffi(pointer) })
}
#[unsafe(no_mangle)]
extern "system" fn Java_dev_waterui_android_ffi_InspectorJni_isAvailable<'local>(
_env: EnvUnowned<'local>,
_class: JClass<'local>,
env_ptr: jlong,
) -> jboolean {
let available = unsafe { environment(env_ptr) }
.is_some_and(|env| env.get::<waterui::inspector::InspectorRuntime>().is_some());
jboolean::from(available)
}
#[unsafe(no_mangle)]
extern "system" fn Java_dev_waterui_android_ffi_InspectorJni_open<'local>(
_env: EnvUnowned<'local>,
_class: JClass<'local>,
env_ptr: jlong,
) {
let Some(env) = (unsafe { environment(env_ptr) }) else {
return;
};
let Some(inspector) = env.get::<waterui::inspector::InspectorRuntime>() else {
return;
};
inspector.open();
}
#[unsafe(no_mangle)]
extern "system" fn Java_dev_waterui_android_ffi_InspectorJni_inspectNode<'local>(
_env: EnvUnowned<'local>,
_class: JClass<'local>,
env_ptr: jlong,
node: jlong,
) {
let Some(env) = (unsafe { environment(env_ptr) }) else {
return;
};
let Some(inspector) = env.get::<waterui::inspector::InspectorRuntime>() else {
return;
};
#[expect(
clippy::cast_sign_loss,
reason = "a node id is an opaque bit pattern; Java has no unsigned long"
)]
inspector.inspect_node(waterui::inspector::protocol::NodeId(node as u64));
}
#[unsafe(no_mangle)]
extern "system" fn Java_dev_waterui_android_ffi_InspectorJni_wantsTree<'local>(
_env: EnvUnowned<'local>,
_class: JClass<'local>,
env_ptr: jlong,
) -> jboolean {
let wants = unsafe { environment(env_ptr) }.is_some_and(|env| {
env.get::<waterui::inspector::TreeRecorder>()
.is_some_and(waterui::inspector::TreeRecorder::is_active)
});
jboolean::from(wants)
}