use android_activity::{AndroidApp, InputStatus, MainEvent, PollEvent}; use log::info; #[no_mangle] fn android_main(app: AndroidApp) { 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(); while !quit { app.poll_events( Some(std::time::Duration::from_secs(1)), /* 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::InputAvailable { .. } => { redraw_pending = true; } MainEvent::ConfigChanged { .. } => { info!("Config Changed: {:#?}", app.config()); } 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:?}"); InputStatus::Unhandled }); info!("Render..."); } } }, ); } }