#[cfg(target_os = "android")]
use android_activity::{AndroidApp, MainEvent, PollEvent};
#[cfg(target_os = "android")]
use ndk::native_window::NativeWindow;
#[cfg(target_os = "android")]
use tracing::{debug, info, warn};
#[cfg(target_os = "android")]
pub struct BlincAndroidApp {
window: Option<NativeWindow>,
running: bool,
focused: bool,
}
#[cfg(target_os = "android")]
impl BlincAndroidApp {
pub fn new() -> Self {
Self {
window: None,
running: true,
focused: false,
}
}
pub fn handle_event(&mut self, app: &AndroidApp, event: PollEvent) {
match event {
PollEvent::Main(main_event) => {
self.handle_main_event(app, main_event);
}
_ => {}
}
}
fn handle_main_event(&mut self, app: &AndroidApp, event: MainEvent) {
match event {
MainEvent::InitWindow { .. } => {
info!("Native window initialized");
if let Some(window) = app.native_window() {
let width = window.width();
let height = window.height();
info!("Window size: {}x{}", width, height);
self.window = Some(window);
self.init_graphics();
}
}
MainEvent::TerminateWindow { .. } => {
info!("Native window terminated");
self.window = None;
}
MainEvent::WindowResized { .. } => {
if let Some(ref window) = self.window {
let width = window.width();
let height = window.height();
info!("Window resized: {}x{}", width, height);
}
}
MainEvent::GainedFocus => {
info!("App gained focus");
self.focused = true;
}
MainEvent::LostFocus => {
info!("App lost focus");
self.focused = false;
}
MainEvent::Pause => {
info!("App paused");
self.focused = false;
}
MainEvent::Resume { .. } => {
info!("App resumed");
self.focused = true;
}
MainEvent::Start => {
info!("App started");
}
MainEvent::Stop => {
info!("App stopped");
}
MainEvent::Destroy => {
info!("App destroyed");
self.running = false;
}
MainEvent::SaveState { .. } => {
debug!("Saving app state");
}
MainEvent::ConfigChanged { .. } => {
debug!("Configuration changed");
}
MainEvent::LowMemory => {
warn!("Low memory warning");
}
MainEvent::ContentRectChanged { .. } => {
debug!("Content rect changed");
}
_ => {}
}
}
fn init_graphics(&mut self) {
if let Some(ref _window) = self.window {
info!("Graphics initialization placeholder");
}
}
pub fn render_frame(&mut self) {
}
pub fn is_running(&self) -> bool {
self.running
}
pub fn should_render(&self) -> bool {
self.window.is_some() && self.focused
}
}
#[cfg(target_os = "android")]
impl Default for BlincAndroidApp {
fn default() -> Self {
Self::new()
}
}
#[cfg(all(target_os = "android", feature = "default-activity"))]
#[no_mangle]
pub fn android_main(app: AndroidApp) {
android_logger::init_once(
android_logger::Config::default()
.with_max_level(log::LevelFilter::Debug)
.with_tag("Blinc"),
);
info!("android_main called");
let mut blinc_app = BlincAndroidApp::new();
while blinc_app.is_running() {
app.poll_events(Some(std::time::Duration::from_millis(16)), |event| {
blinc_app.handle_event(&app, event);
});
if blinc_app.should_render() {
blinc_app.render_frame();
}
}
info!("Blinc Android app shutting down");
}
#[cfg(not(target_os = "android"))]
pub fn android_main() {
}
#[cfg(test)]
mod tests {
#[test]
fn test_placeholder() {
}
}