1#![cfg(target_os = "android")]
2extern crate android_ffi;
3use std::mem;
16use std::os::raw::c_void;
17use std::sync::mpsc::Sender;
18
19#[derive(Clone, Copy, Debug)]
21pub enum Event {
22 EventMotion(Motion),
23 EventKeyUp,
24 EventKeyDown,
25 InitWindow,
26 SaveState,
27 TermWindow,
28 GainedFocus,
29 LostFocus,
30 InputChanged,
31 WindowResized,
32 WindowRedrawNeeded,
33 ContentRectChanged,
34 ConfigChanged,
35 LowMemory,
36 Start,
37 Resume,
38 Pause,
39 Stop,
40 Destroy,
41 Wake
42}
43
44#[derive(Clone, Copy, Debug)]
46pub struct Motion {
47 pub action: MotionAction,
48 pub pointer_id: i32,
49 pub x: f32,
50 pub y: f32,
51}
52
53#[derive(Clone, Copy, Debug)]
55pub enum MotionAction {
56 Down,
57 Move,
58 Up,
59 Cancel,
60}
61
62pub enum AssetError {
63 AssetMissing,
64 EmptyBuffer,
65}
66
67pub trait SyncEventHandler {
69 fn handle(&mut self, event: &Event);
70}
71
72#[inline]
74pub fn add_sender(sender: Sender<Event>) {
75 unsafe {
76 let sender = Box::into_raw(Box::new(sender)) as *mut _;
77 android_ffi::cargo_apk_injected_glue_add_sender(sender);
78 }
79}
80
81#[inline]
83pub fn add_sync_event_handler(handler: Box<SyncEventHandler>) {
84 unsafe {
85 let handler = Box::into_raw(Box::new(handler)) as *mut _;
86 android_ffi::cargo_apk_injected_glue_add_sync_event_handler(handler);
87 }
88}
89
90#[inline]
92pub fn remove_sync_event_handler(handler: *const SyncEventHandler) {
93 unsafe {
94 let handler = Box::into_raw(Box::new(handler)) as *mut _;
95 android_ffi::cargo_apk_injected_glue_remove_sync_event_handler(handler);
96 }
97}
98
99#[inline]
100pub fn set_multitouch(multitouch: bool) {
101 unsafe {
102 android_ffi::cargo_apk_injected_glue_set_multitouch(multitouch);
103 }
104}
105
106#[inline]
113pub fn add_sender_missing(sender: Sender<Event>) {
114 unsafe {
115 let sender = Box::into_raw(Box::new(sender)) as *mut _;
116 android_ffi::cargo_apk_injected_glue_add_sender_missing(sender);
117 }
118}
119
120#[inline]
122pub unsafe fn get_native_window() -> *const c_void {
123 android_ffi::cargo_apk_injected_glue_get_native_window()
124}
125
126#[inline]
128pub fn write_log(message: &str) {
129 unsafe {
130 let (message_ptr, message_len) = mem::transmute(message);
131 android_ffi::cargo_apk_injected_glue_write_log(message_ptr, message_len);
132 }
133}
134
135#[inline]
136pub fn load_asset(filename: &str) -> Result<Vec<u8>, AssetError> {
137 unsafe {
138 let (filename_ptr, filename_len) = mem::transmute(filename);
139 let data = android_ffi::cargo_apk_injected_glue_load_asset(filename_ptr, filename_len);
140 let data: Box<Result<Vec<u8>, AssetError>> = Box::from_raw(data as *mut _);
141 *data
142 }
143}
144
145#[inline]
148pub fn wake_event_loop() {
149 unsafe {
150 android_ffi::cargo_apk_injected_glue_wake_event_loop();
151 }
152}