use native_activity::{PollEvent, MainEvent}; use log::info; #[no_mangle] extern "C" fn android_main() { android_logger::init_once( android_logger::Config::default().with_min_level(log::Level::Info) ); let mut quit = false; let mut redraw_pending = true; let mut render_state: Option<()> = Default::default(); let app = native_activity::android_app(); while !quit { app.poll_events(Some(std::time::Duration::from_millis(500)) /* timeout */, |event| { match event { PollEvent::Wake => { info!("Early wake up"); }, PollEvent::Timeout => { info!("Timed out"); // Real app would probably rely on vblank sync via graphics API... redraw_pending = true; }, PollEvent::Main(main_event) => { info!("Main event: {:?}", main_event); match main_event { MainEvent::SaveState { saver, .. } => { saver.store("foo://bar".as_bytes()); }, MainEvent::Pause => {}, MainEvent::Resume { loader, .. } => { if let Some(state) = loader.load() { if let Ok(uri) = String::from_utf8(state) { info!("Resumed with saved state = {uri:#?}"); } } }, MainEvent::InitWindow { .. } => { render_state = Some(()); redraw_pending = true; }, MainEvent::TerminateWindow { .. } => { render_state = None; } MainEvent::WindowResized { .. } => { redraw_pending = true; }, MainEvent::RedrawNeeded { ..} => { redraw_pending = true; }, MainEvent::LowMemory => {}, MainEvent::Destroy => { quit = true }, _ => { /* ... */} } }, _ => {} } if redraw_pending { if let Some(_rs) = render_state { redraw_pending = false; // Handle input app.input_events(|event| { info!("Input Event: {event:?}"); }); info!("Render..."); } } }); } }