use std::ffi::CStr;
use std::os::raw::c_void;
use std::ptr::NonNull;
#[derive(Debug)]
pub struct NativeActivity {
ptr: NonNull<ffi::ANativeActivity>,
}
unsafe impl Send for NativeActivity {}
unsafe impl Sync for NativeActivity {}
impl NativeActivity {
pub unsafe fn from_ptr(ptr: NonNull<ffi::ANativeActivity>) -> Self {
Self { ptr }
}
pub fn ptr(&self) -> NonNull<ffi::ANativeActivity> {
self.ptr
}
}
impl NativeActivity {
pub fn sdk_version(&self) -> i32 {
unsafe { self.ptr.as_ref().sdkVersion }
}
pub fn internal_data_path(&self) -> &CStr {
unsafe { CStr::from_ptr(self.ptr.as_ref().internalDataPath) }
}
pub fn external_data_path(&self) -> &CStr {
unsafe { CStr::from_ptr(self.ptr.as_ref().externalDataPath) }
}
pub fn asset_manager(&self) -> crate::asset::AssetManager {
unsafe {
crate::asset::AssetManager::from_ptr(
NonNull::new(self.ptr.as_ref().assetManager).unwrap(),
)
}
}
pub fn instance(&self) -> *mut c_void {
unsafe { self.ptr.as_ref().instance }
}
pub unsafe fn set_instance(&mut self, data: *mut c_void) {
self.ptr.as_mut().instance = data;
}
pub fn vm(&self) -> *mut jni_sys::JavaVM {
unsafe { self.ptr.as_ref().vm as *mut jni_sys::JavaVM }
}
pub fn activity(&self) -> jni_sys::jobject {
unsafe { self.ptr.as_ref().clazz as jni_sys::jobject }
}
pub unsafe fn obb_path(&self) -> &CStr {
CStr::from_ptr(self.ptr.as_ref().obbPath)
}
}
impl NativeActivity {
pub fn finish(&self) {
unsafe { ffi::ANativeActivity_finish(self.ptr.as_ptr()) }
}
pub fn show_soft_input(&self, force: bool) {
let flag = if force {
ffi::ANATIVEACTIVITY_SHOW_SOFT_INPUT_FORCED
} else {
ffi::ANATIVEACTIVITY_SHOW_SOFT_INPUT_IMPLICIT
};
unsafe { ffi::ANativeActivity_showSoftInput(self.ptr.as_ptr(), flag) }
}
pub fn hide_soft_input(&self, not_always: bool) {
let flag = if not_always {
ffi::ANATIVEACTIVITY_HIDE_SOFT_INPUT_NOT_ALWAYS
} else {
ffi::ANATIVEACTIVITY_HIDE_SOFT_INPUT_IMPLICIT_ONLY
};
unsafe { ffi::ANativeActivity_hideSoftInput(self.ptr.as_ptr(), flag) }
}
}