use crate::error::Result;
use crate::presentation::PresentationWindow;
use jni::objects::{JClass, JObject};
use jni::sys::{jboolean, jint, jintArray, jlong};
use jni::JNIEnv;
use std::ptr;
#[no_mangle]
pub extern "system" fn Java_com_presentation_PresentationHelper_initializePresentationSystem(
env: JNIEnv,
_class: JClass,
context: JObject,
) -> jboolean {
let result = || -> Result<()> {
let java_vm = env.get_java_vm()?;
let vm_ptr = java_vm.get_java_vm_pointer();
unsafe {
PresentationWindow::initialize(vm_ptr, context)?;
}
Ok(())
};
match result() {
Ok(_) => {
log::info!("Presentation system initialized successfully");
1 }
Err(e) => {
log::error!("Failed to initialize presentation system: {}", e);
0 }
}
}
#[no_mangle]
pub extern "system" fn Java_com_presentation_PresentationHelper_createPresentationOnDisplay(
_env: JNIEnv,
_class: JClass,
display_id: jint,
timeout_ms: jlong,
) -> jlong {
let result = || -> Result<*mut PresentationWindow> {
let presentation = PresentationWindow::new_on_display(display_id, timeout_ms as u64)?;
let boxed = Box::new(presentation);
Ok(Box::into_raw(boxed))
};
match result() {
Ok(ptr) => {
log::info!("Created presentation on display {}", display_id);
ptr as jlong
}
Err(e) => {
log::error!("Failed to create presentation on display {}: {}", display_id, e);
0
}
}
}
#[no_mangle]
pub extern "system" fn Java_com_presentation_PresentationHelper_createPresentationOnSecondaryDisplay(
_env: JNIEnv,
_class: JClass,
timeout_ms: jlong,
) -> jlong {
let result = || -> Result<*mut PresentationWindow> {
let presentation = PresentationWindow::new_on_secondary_display(timeout_ms as u64)?;
let boxed = Box::new(presentation);
Ok(Box::into_raw(boxed))
};
match result() {
Ok(ptr) => {
log::info!("Created presentation on secondary display");
ptr as jlong
}
Err(e) => {
log::error!("Failed to create presentation on secondary display: {}", e);
0
}
}
}
#[no_mangle]
pub extern "system" fn Java_com_presentation_PresentationHelper_getAvailableDisplays(
env: JNIEnv,
_class: JClass,
) -> jintArray {
let result = || -> Result<jintArray> {
let displays = PresentationWindow::get_available_displays()?;
let array = env.new_int_array(displays.len() as i32)?;
env.set_int_array_region(&array, 0, &displays)?;
Ok(array.into_raw())
};
match result() {
Ok(array) => array,
Err(e) => {
log::error!("Failed to get available displays: {}", e);
ptr::null_mut()
}
}
}
#[no_mangle]
pub extern "system" fn Java_com_presentation_PresentationHelper_getPresentationWidth(
_env: JNIEnv,
_class: JClass,
presentation_ptr: jlong,
) -> jint {
if presentation_ptr == 0 {
return 0;
}
let presentation = unsafe { &*(presentation_ptr as *const PresentationWindow) };
presentation.width()
}
#[no_mangle]
pub extern "system" fn Java_com_presentation_PresentationHelper_getPresentationHeight(
_env: JNIEnv,
_class: JClass,
presentation_ptr: jlong,
) -> jint {
if presentation_ptr == 0 {
return 0;
}
let presentation = unsafe { &*(presentation_ptr as *const PresentationWindow) };
presentation.height()
}
#[no_mangle]
pub extern "system" fn Java_com_presentation_PresentationHelper_getPresentationDisplayId(
_env: JNIEnv,
_class: JClass,
presentation_ptr: jlong,
) -> jint {
if presentation_ptr == 0 {
return -1;
}
let presentation = unsafe { &*(presentation_ptr as *const PresentationWindow) };
presentation.display_id().unwrap_or(-1)
}
#[no_mangle]
pub extern "system" fn Java_com_presentation_PresentationHelper_isPresentationShowing(
_env: JNIEnv,
_class: JClass,
presentation_ptr: jlong,
) -> jboolean {
if presentation_ptr == 0 {
return 0;
}
let presentation = unsafe { &*(presentation_ptr as *const PresentationWindow) };
match presentation.is_showing() {
Ok(showing) => if showing { 1 } else { 0 },
Err(_) => 0,
}
}
#[no_mangle]
pub extern "system" fn Java_com_presentation_PresentationHelper_dismissPresentation(
_env: JNIEnv,
_class: JClass,
presentation_ptr: jlong,
) -> jboolean {
if presentation_ptr == 0 {
return 0;
}
let presentation = unsafe { &mut *(presentation_ptr as *mut PresentationWindow) };
match presentation.dismiss() {
Ok(_) => {
log::info!("Presentation dismissed successfully");
1
}
Err(e) => {
log::error!("Failed to dismiss presentation: {}", e);
0
}
}
}
#[no_mangle]
pub extern "system" fn Java_com_presentation_PresentationHelper_destroyPresentation(
_env: JNIEnv,
_class: JClass,
presentation_ptr: jlong,
) {
if presentation_ptr == 0 {
return;
}
let presentation = unsafe { Box::from_raw(presentation_ptr as *mut PresentationWindow) };
drop(presentation);
log::info!("Presentation destroyed");
}
#[no_mangle]
pub extern "system" fn Java_com_presentation_PresentationHelper_getPresentationNativeWindow(
_env: JNIEnv,
_class: JClass,
presentation_ptr: jlong,
) -> jlong {
if presentation_ptr == 0 {
return 0;
}
let presentation = unsafe { &*(presentation_ptr as *const PresentationWindow) };
if let Some(surface_window) = presentation.surface_window() {
unsafe { surface_window.as_ptr() as jlong }
} else {
0
}
}