From 8bf3a7b352711cc93f5cb3c77a6d3e6eaca262b1 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Thu, 4 Jul 2024 20:23:16 +0200 Subject: [PATCH] Replace input enums with `ndk` --- android-activity/CHANGELOG.md | 44 +- android-activity/src/game_activity/input.rs | 18 +- android-activity/src/input.rs | 840 +----------------- android-activity/src/input/sdk.rs | 6 +- android-activity/src/native_activity/input.rs | 64 +- 5 files changed, 63 insertions(+), 909 deletions(-) diff --git a/android-activity/CHANGELOG.md b/android-activity/CHANGELOG.md index 3d3524b..362cfbd 100644 --- a/android-activity/CHANGELOG.md +++ b/android-activity/CHANGELOG.md @@ -6,6 +6,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- input: Replaced custom types with their `ndk` crate equivalent. + > [!NOTE] + > These types existed because the `ndk` crate didn't provide them in an extensible way. Now that they have the `#[non_exhaustive]` flag and contain a `__Unknown(T)` variant to result in lossless conversions, and not to mention use an ABI type that how its used by most functions (when the original constants were defined in a "typeless" way), the `ndk` types are used and reexported once again. + + > [!IMPORTANT] + > **Relevant breaking changes**: + > - `repr()` types for some `enum`s have changed to match the type that returned and consumed by functions interacting with this wrapper type. + > - `Source::is_xxx_class()` functions are replaced by querying `Source::class()` and comparing against variants from the returned `SourceClass` `bitflags` enum. + > - `SourceFlags::TRACKBALL` (from `Source::is_trackball_class()`) is named `SourceClass::NAVIGATION` in the `ndk`. + ## [0.6.0] - 2024-04-26 ### Changed @@ -25,32 +35,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Avoids depending on default features for `ndk` crate to avoid pulling in any `raw-window-handle` dependencies ([#142](https://github.com/rust-mobile/android-activity/pull/142)) - **Note:** Technically, this could be observed as a breaking change in case you - were depending on the `rwh_06` feature that was enabled by default in the - `ndk` crate. This could be observed via the `NativeWindow` type (exposed via - `AndroidApp::native_window()`) no longer implementing `rwh_06::HasWindowHandle`. + **Note:** Technically, this could be observed as a breaking change in case you + were depending on the `rwh_06` feature that was enabled by default in the + `ndk` crate. This could be observed via the `NativeWindow` type (exposed via + `AndroidApp::native_window()`) no longer implementing `rwh_06::HasWindowHandle`. - In the unlikely case that you were depending on the `ndk`'s `rwh_06` API - being enabled by default via `android-activity`'s `ndk` dependency, your crate - should explicitly enable the `rwh_06` feature for the `ndk` crate. + In the unlikely case that you were depending on the `ndk`'s `rwh_06` API + being enabled by default via `android-activity`'s `ndk` dependency, your crate + should explicitly enable the `rwh_06` feature for the `ndk` crate. - As far as could be seen though, it's not expected that anything was - depending on this (e.g. anything based on Winit enables the `ndk` feature - based on an equivalent `winit` feature). + As far as could be seen though, it's not expected that anything was + depending on this (e.g. anything based on Winit enables the `ndk` feature + based on an equivalent `winit` feature). - The benefit of the change is that it can help avoid a redundant - `raw-window-handle 0.6` dependency in projects that still need to use older - (non-default) `raw-window-handle` versions. (Though note that this may be - awkward to achieve in practice since other crates that depend on the `ndk` - are still likely to use default features and also pull in - `raw-window-handles 0.6`) + The benefit of the change is that it can help avoid a redundant + `raw-window-handle 0.6` dependency in projects that still need to use older + (non-default) `raw-window-handle` versions. (Though note that this may be + awkward to achieve in practice since other crates that depend on the `ndk` + are still likely to use default features and also pull in + `raw-window-handles 0.6`) - The IO thread now gets named `stdio-to-logcat` and main thread is named `android_main` ([#145](https://github.com/rust-mobile/android-activity/pull/145)) - Improved IO error handling in `stdio-to-logcat` IO loop. ([#133](https://github.com/rust-mobile/android-activity/pull/133)) ## [0.5.0] - 2023-10-16 ### Added -- Added `MotionEvent::action_button()` exposing the button associated with button press/release actions () +- Added `MotionEvent::action_button()` exposing the button associated with button press/release actions ([#138](https://github.com/rust-mobile/android-activity/pull/138)) ### Changed - rust-version bumped to 0.68 ([#123](https://github.com/rust-mobile/android-activity/pull/123)) diff --git a/android-activity/src/game_activity/input.rs b/android-activity/src/game_activity/input.rs index b5a23ae..6b46638 100644 --- a/android-activity/src/game_activity/input.rs +++ b/android-activity/src/game_activity/input.rs @@ -13,10 +13,12 @@ // The `Class` was also bound differently to `android-ndk-rs` considering how the class is defined // by masking bits from the `Source`. +use ndk::event::ButtonState; + use crate::activity_impl::ffi::{GameActivityKeyEvent, GameActivityMotionEvent}; use crate::input::{ - Axis, Button, ButtonState, EdgeFlags, KeyAction, KeyEventFlags, Keycode, MetaState, - MotionAction, MotionEventFlags, Pointer, PointersIter, Source, ToolType, + Axis, Button, EdgeFlags, KeyAction, KeyEventFlags, Keycode, MetaState, MotionAction, + MotionEventFlags, Pointer, PointersIter, Source, ToolType, }; // Note: try to keep this wrapper API compatible with the AInputEvent API if possible @@ -63,7 +65,7 @@ impl<'a> MotionEvent<'a> { /// See [the MotionEvent docs](https://developer.android.com/reference/android/view/MotionEvent#getActionMasked()) #[inline] pub fn action(&self) -> MotionAction { - let action = self.ga_event.action as u32 & ndk_sys::AMOTION_EVENT_ACTION_MASK; + let action = self.ga_event.action & ndk_sys::AMOTION_EVENT_ACTION_MASK as i32; action.into() } @@ -176,6 +178,7 @@ impl<'a> MotionEvent<'a> { /// See [the NDK /// docs](https://developer.android.com/ndk/reference/group/input#amotionevent_getbuttonstate) #[inline] + // TODO: Button enum to signify only one bitflag can be set? pub fn button_state(&self) -> ButtonState { ButtonState(self.ga_event.buttonState as u32) } @@ -297,8 +300,7 @@ impl<'a> PointerImpl<'a> { #[inline] pub fn tool_type(&self) -> ToolType { let pointer = &self.event.ga_event.pointers[self.index]; - let tool_type = pointer.toolType as i32; - tool_type.into() + pointer.toolType.into() } } @@ -681,13 +683,13 @@ impl<'a> KeyEvent<'a> { /// See [the KeyEvent docs](https://developer.android.com/reference/android/view/KeyEvent#getAction()) #[inline] pub fn action(&self) -> KeyAction { - let action = self.ga_event.action as u32; + let action = self.ga_event.action; action.into() } #[inline] pub fn action_button(&self) -> KeyAction { - let action = self.ga_event.action as u32; + let action = self.ga_event.action; action.into() } @@ -717,7 +719,7 @@ impl<'a> KeyEvent<'a> { /// docs](https://developer.android.com/ndk/reference/group/input#akeyevent_getkeycode) #[inline] pub fn key_code(&self) -> Keycode { - let keycode = self.ga_event.keyCode as u32; + let keycode = self.ga_event.keyCode; keycode.into() } diff --git a/android-activity/src/input.rs b/android-activity/src/input.rs index 513ffa5..ed3fcc4 100644 --- a/android-activity/src/input.rs +++ b/android-activity/src/input.rs @@ -1,4 +1,7 @@ -use bitflags::bitflags; +pub use ndk::event::{ + Axis, EdgeFlags, KeyAction, KeyEventFlags, Keycode, MetaState, MotionAction, MotionEventFlags, + Source, SourceClass, ToolType, +}; pub use crate::activity_impl::input::*; use crate::InputStatus; @@ -6,241 +9,6 @@ use crate::InputStatus; mod sdk; pub use sdk::*; -/// An enum representing the source of an [`MotionEvent`] or [`KeyEvent`] -/// -/// See [the InputDevice docs](https://developer.android.com/reference/android/view/InputDevice#SOURCE_ANY) -/// -/// # Android Extensible Enum -/// -/// This is a runtime [extensible enum](crate#android-extensible-enums) and -/// should be handled similar to a `#[non_exhaustive]` enum to maintain -/// forwards compatibility. -/// -/// This implements [`Into`] and [`From`] for converting to/from Android -/// SDK integer values. -/// -#[derive(Debug, Clone, Copy, PartialEq, Eq, num_enum::FromPrimitive, num_enum::IntoPrimitive)] -#[non_exhaustive] -#[repr(i32)] -pub enum Source { - Unknown = 0, - - BluetoothStylus = 0x0000c002, - Dpad = 0x00000201, - /// Either a gamepad or a joystick - Gamepad = 0x00000401, - Hdmi = 0x02000001, - /// Either a gamepad or a joystick - Joystick = 0x01000010, - /// Pretty much any device with buttons. Query the keyboard type to determine - /// if it has alphabetic keys and can be used for text entry. - Keyboard = 0x00000101, - /// A pointing device, such as a mouse or trackpad - Mouse = 0x00002002, - /// A pointing device, such as a mouse or trackpad whose relative motions should be treated as navigation events - MouseRelative = 0x00020004, - /// An input device akin to a scroll wheel - RotaryEncoder = 0x00400000, - Sensor = 0x04000000, - Stylus = 0x00004002, - Touchpad = 0x00100008, - Touchscreen = 0x00001002, - TouchNavigation = 0x00200000, - Trackball = 0x00010004, - - // We need to consider that the enum variants may be extended across - // different versions of Android (i.e. effectively at runtime) but at the - // same time we don't want it to be an API break to extend this enum in - // future releases of `android-activity` with new variants from the latest - // NDK/SDK. - // - // We can't just use `#[non_exhaustive]` because that only really helps - // when adding new variants in sync with android-activity releases. - // - // On the other hand we also can't rely on a catch-all `Unknown(i32)` that - // only really helps with unknown variants seen at runtime. - // - // What we aim for instead is to have a hidden catch-all variant that - // is considered (practically) unmatchable so code is forced to have - // a `unknown => {}` catch-all pattern match that will cover unknown variants - // either in the form of Rust variants added in future versions or - // in the form of an `__Unknown(i32)` integer that represents an unknown - // variant seen at runtime. - // - // Any `unknown => {}` pattern match can rely on `IntoPrimitive` to convert - // the `unknown` variant to the integer that comes from the Android SDK - // in case that values needs to be passed on, even without knowing its - // semantic meaning at compile time. - #[doc(hidden)] - #[num_enum(catch_all)] - __Unknown(i32), -} - -// ndk_sys doesn't currently have the `TRACKBALL` flag so we define our -// own internal class constants for now -// TODO: It does, aliased to NAVIGATION -bitflags! { - #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] - struct SourceFlags: i32 { - const CLASS_MASK = 0x000000ff; - - const BUTTON = 0x00000001; - const POINTER = 0x00000002; - const TRACKBALL = 0x00000004; - const POSITION = 0x00000008; - const JOYSTICK = 0x00000010; - const NONE = 0; - } -} - -impl Source { - #[inline] - pub fn is_button_class(self) -> bool { - let class = SourceFlags::from_bits_truncate(self.into()); - class.contains(SourceFlags::BUTTON) - } - #[inline] - pub fn is_pointer_class(self) -> bool { - let class = SourceFlags::from_bits_truncate(self.into()); - class.contains(SourceFlags::POINTER) - } - #[inline] - pub fn is_trackball_class(self) -> bool { - let class = SourceFlags::from_bits_truncate(self.into()); - class.contains(SourceFlags::TRACKBALL) - } - #[inline] - pub fn is_position_class(self) -> bool { - let class = SourceFlags::from_bits_truncate(self.into()); - class.contains(SourceFlags::POSITION) - } - #[inline] - pub fn is_joystick_class(self) -> bool { - let class = SourceFlags::from_bits_truncate(self.into()); - class.contains(SourceFlags::JOYSTICK) - } -} - -/// A bitfield representing the state of modifier keys during an event. -/// -/// See [the NDK docs](https://developer.android.com/ndk/reference/group/input#anonymous-enum-25) -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -pub struct MetaState(pub u32); - -impl MetaState { - #[inline] - pub fn alt_on(self) -> bool { - self.0 & ndk_sys::AMETA_ALT_ON != 0 - } - #[inline] - pub fn alt_left_on(self) -> bool { - self.0 & ndk_sys::AMETA_ALT_LEFT_ON != 0 - } - #[inline] - pub fn alt_right_on(self) -> bool { - self.0 & ndk_sys::AMETA_ALT_RIGHT_ON != 0 - } - #[inline] - pub fn shift_on(self) -> bool { - self.0 & ndk_sys::AMETA_SHIFT_ON != 0 - } - #[inline] - pub fn shift_left_on(self) -> bool { - self.0 & ndk_sys::AMETA_SHIFT_LEFT_ON != 0 - } - #[inline] - pub fn shift_right_on(self) -> bool { - self.0 & ndk_sys::AMETA_SHIFT_RIGHT_ON != 0 - } - #[inline] - pub fn sym_on(self) -> bool { - self.0 & ndk_sys::AMETA_SYM_ON != 0 - } - #[inline] - pub fn function_on(self) -> bool { - self.0 & ndk_sys::AMETA_FUNCTION_ON != 0 - } - #[inline] - pub fn ctrl_on(self) -> bool { - self.0 & ndk_sys::AMETA_CTRL_ON != 0 - } - #[inline] - pub fn ctrl_left_on(self) -> bool { - self.0 & ndk_sys::AMETA_CTRL_LEFT_ON != 0 - } - #[inline] - pub fn ctrl_right_on(self) -> bool { - self.0 & ndk_sys::AMETA_CTRL_RIGHT_ON != 0 - } - #[inline] - pub fn meta_on(self) -> bool { - self.0 & ndk_sys::AMETA_META_ON != 0 - } - #[inline] - pub fn meta_left_on(self) -> bool { - self.0 & ndk_sys::AMETA_META_LEFT_ON != 0 - } - #[inline] - pub fn meta_right_on(self) -> bool { - self.0 & ndk_sys::AMETA_META_RIGHT_ON != 0 - } - #[inline] - pub fn caps_lock_on(self) -> bool { - self.0 & ndk_sys::AMETA_CAPS_LOCK_ON != 0 - } - #[inline] - pub fn num_lock_on(self) -> bool { - self.0 & ndk_sys::AMETA_NUM_LOCK_ON != 0 - } - #[inline] - pub fn scroll_lock_on(self) -> bool { - self.0 & ndk_sys::AMETA_SCROLL_LOCK_ON != 0 - } -} - -impl From for MetaState { - fn from(value: ndk::event::MetaState) -> Self { - Self(value.0) - } -} - -/// A motion action. -/// -/// See [the NDK -/// docs](https://developer.android.com/ndk/reference/group/input#anonymous-enum-29) -/// -/// # Android Extensible Enum -/// -/// This is a runtime [extensible enum](`crate#android-extensible-enums`) and -/// should be handled similar to a `#[non_exhaustive]` enum to maintain -/// forwards compatibility. -/// -/// This implements `Into` and `From` for converting to/from Android -/// SDK integer values. -/// -#[derive(Copy, Clone, Debug, PartialEq, Eq, num_enum::FromPrimitive, num_enum::IntoPrimitive)] -#[non_exhaustive] -#[repr(u32)] -pub enum MotionAction { - Down = ndk_sys::AMOTION_EVENT_ACTION_DOWN, - Up = ndk_sys::AMOTION_EVENT_ACTION_UP, - Move = ndk_sys::AMOTION_EVENT_ACTION_MOVE, - Cancel = ndk_sys::AMOTION_EVENT_ACTION_CANCEL, - Outside = ndk_sys::AMOTION_EVENT_ACTION_OUTSIDE, - PointerDown = ndk_sys::AMOTION_EVENT_ACTION_POINTER_DOWN, - PointerUp = ndk_sys::AMOTION_EVENT_ACTION_POINTER_UP, - HoverMove = ndk_sys::AMOTION_EVENT_ACTION_HOVER_MOVE, - Scroll = ndk_sys::AMOTION_EVENT_ACTION_SCROLL, - HoverEnter = ndk_sys::AMOTION_EVENT_ACTION_HOVER_ENTER, - HoverExit = ndk_sys::AMOTION_EVENT_ACTION_HOVER_EXIT, - ButtonPress = ndk_sys::AMOTION_EVENT_ACTION_BUTTON_PRESS, - ButtonRelease = ndk_sys::AMOTION_EVENT_ACTION_BUTTON_RELEASE, - - #[doc(hidden)] - #[num_enum(catch_all)] - __Unknown(u32), -} - /// Identifies buttons that are associated with motion events. /// /// See [the NDK @@ -272,606 +40,6 @@ pub enum Button { __Unknown(u32), } -/// An axis of a motion event. -/// -/// See [the NDK docs](https://developer.android.com/ndk/reference/group/input#anonymous-enum-32) -/// -/// # Android Extensible Enum -/// -/// This is a runtime [extensible enum](`crate#android-extensible-enums`) and -/// should be handled similar to a `#[non_exhaustive]` enum to maintain -/// forwards compatibility. -/// -/// This implements [`Into]` and [`From`] for converting to/from Android -/// SDK integer values. -/// -#[derive(Copy, Clone, Debug, PartialEq, Eq, num_enum::FromPrimitive, num_enum::IntoPrimitive)] -#[non_exhaustive] -#[repr(i32)] -pub enum Axis { - X = ndk_sys::AMOTION_EVENT_AXIS_X as i32, - Y = ndk_sys::AMOTION_EVENT_AXIS_Y as i32, - Pressure = ndk_sys::AMOTION_EVENT_AXIS_PRESSURE as i32, - Size = ndk_sys::AMOTION_EVENT_AXIS_SIZE as i32, - TouchMajor = ndk_sys::AMOTION_EVENT_AXIS_TOUCH_MAJOR as i32, - TouchMinor = ndk_sys::AMOTION_EVENT_AXIS_TOUCH_MINOR as i32, - ToolMajor = ndk_sys::AMOTION_EVENT_AXIS_TOOL_MAJOR as i32, - ToolMinor = ndk_sys::AMOTION_EVENT_AXIS_TOOL_MINOR as i32, - Orientation = ndk_sys::AMOTION_EVENT_AXIS_ORIENTATION as i32, - Vscroll = ndk_sys::AMOTION_EVENT_AXIS_VSCROLL as i32, - Hscroll = ndk_sys::AMOTION_EVENT_AXIS_HSCROLL as i32, - Z = ndk_sys::AMOTION_EVENT_AXIS_Z as i32, - Rx = ndk_sys::AMOTION_EVENT_AXIS_RX as i32, - Ry = ndk_sys::AMOTION_EVENT_AXIS_RY as i32, - Rz = ndk_sys::AMOTION_EVENT_AXIS_RZ as i32, - HatX = ndk_sys::AMOTION_EVENT_AXIS_HAT_X as i32, - HatY = ndk_sys::AMOTION_EVENT_AXIS_HAT_Y as i32, - Ltrigger = ndk_sys::AMOTION_EVENT_AXIS_LTRIGGER as i32, - Rtrigger = ndk_sys::AMOTION_EVENT_AXIS_RTRIGGER as i32, - Throttle = ndk_sys::AMOTION_EVENT_AXIS_THROTTLE as i32, - Rudder = ndk_sys::AMOTION_EVENT_AXIS_RUDDER as i32, - Wheel = ndk_sys::AMOTION_EVENT_AXIS_WHEEL as i32, - Gas = ndk_sys::AMOTION_EVENT_AXIS_GAS as i32, - Brake = ndk_sys::AMOTION_EVENT_AXIS_BRAKE as i32, - Distance = ndk_sys::AMOTION_EVENT_AXIS_DISTANCE as i32, - Tilt = ndk_sys::AMOTION_EVENT_AXIS_TILT as i32, - Scroll = ndk_sys::AMOTION_EVENT_AXIS_SCROLL as i32, - RelativeX = ndk_sys::AMOTION_EVENT_AXIS_RELATIVE_X as i32, - RelativeY = ndk_sys::AMOTION_EVENT_AXIS_RELATIVE_Y as i32, - Generic1 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_1 as i32, - Generic2 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_2 as i32, - Generic3 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_3 as i32, - Generic4 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_4 as i32, - Generic5 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_5 as i32, - Generic6 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_6 as i32, - Generic7 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_7 as i32, - Generic8 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_8 as i32, - Generic9 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_9 as i32, - Generic10 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_10 as i32, - Generic11 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_11 as i32, - Generic12 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_12 as i32, - Generic13 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_13 as i32, - Generic14 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_14 as i32, - Generic15 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_15 as i32, - Generic16 = ndk_sys::AMOTION_EVENT_AXIS_GENERIC_16 as i32, - - #[doc(hidden)] - #[num_enum(catch_all)] - __Unknown(i32), -} - -/// The tool type of a pointer. -/// -/// See [the NDK docs](https://developer.android.com/ndk/reference/group/input#anonymous-enum-48) -/// -/// # Android Extensible Enum -/// -/// This is a runtime [extensible enum](`crate#android-extensible-enums`) and -/// should be handled similar to a `#[non_exhaustive]` enum to maintain -/// forwards compatibility. -/// -/// Implements [`Into`] and [`From`] for converting to/from Android SDK -/// integer values. -/// -#[derive(Copy, Clone, Debug, PartialEq, Eq, num_enum::FromPrimitive, num_enum::IntoPrimitive)] -#[non_exhaustive] -#[repr(i32)] -pub enum ToolType { - /// Unknown tool type. - /// - /// This constant is used when the tool type is not known or is not relevant, such as for a trackball or other non-pointing device. - Unknown = ndk_sys::AMOTION_EVENT_TOOL_TYPE_UNKNOWN as i32, - - /// The tool is a finger. - Finger = ndk_sys::AMOTION_EVENT_TOOL_TYPE_FINGER as i32, - - /// The tool is a stylus. - Stylus = ndk_sys::AMOTION_EVENT_TOOL_TYPE_STYLUS as i32, - - /// The tool is a mouse. - Mouse = ndk_sys::AMOTION_EVENT_TOOL_TYPE_MOUSE as i32, - - /// The tool is an eraser or a stylus being used in an inverted posture. - Eraser = ndk_sys::AMOTION_EVENT_TOOL_TYPE_ERASER as i32, - - /// The tool is a palm and should be rejected - Palm = ndk_sys::AMOTION_EVENT_TOOL_TYPE_PALM as i32, - - #[doc(hidden)] - #[num_enum(catch_all)] - __Unknown(i32), -} - -/// A bitfield representing the state of buttons during a motion event. -/// -/// See [the NDK docs](https://developer.android.com/ndk/reference/group/input#anonymous-enum-33) -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -pub struct ButtonState(pub u32); - -impl ButtonState { - #[inline] - pub fn primary(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_BUTTON_PRIMARY != 0 - } - #[inline] - pub fn secondary(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_BUTTON_SECONDARY != 0 - } - #[inline] - pub fn teriary(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_BUTTON_TERTIARY != 0 - } - #[inline] - pub fn back(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_BUTTON_BACK != 0 - } - #[inline] - pub fn forward(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_BUTTON_FORWARD != 0 - } - #[inline] - pub fn stylus_primary(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_BUTTON_STYLUS_PRIMARY != 0 - } - #[inline] - pub fn stylus_secondary(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_BUTTON_STYLUS_SECONDARY != 0 - } -} - -impl From for ButtonState { - fn from(value: ndk::event::ButtonState) -> Self { - Self(value.0) - } -} - -/// A bitfield representing which edges were touched by a motion event. -/// -/// See [the NDK docs](https://developer.android.com/ndk/reference/group/input#anonymous-enum-31) -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -pub struct EdgeFlags(pub u32); - -impl EdgeFlags { - #[inline] - pub fn top(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_EDGE_FLAG_TOP != 0 - } - #[inline] - pub fn bottom(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_EDGE_FLAG_BOTTOM != 0 - } - #[inline] - pub fn left(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_EDGE_FLAG_LEFT != 0 - } - #[inline] - pub fn right(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_EDGE_FLAG_RIGHT != 0 - } -} - -impl From for EdgeFlags { - fn from(value: ndk::event::EdgeFlags) -> Self { - Self(value.0) - } -} - -/// Flags associated with this [`MotionEvent`]. -/// -/// See [the NDK docs](https://developer.android.com/ndk/reference/group/input#anonymous-enum-30) -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -pub struct MotionEventFlags(pub u32); - -impl MotionEventFlags { - #[inline] - pub fn window_is_obscured(self) -> bool { - self.0 & ndk_sys::AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED != 0 - } -} - -impl From for MotionEventFlags { - fn from(value: ndk::event::MotionEventFlags) -> Self { - Self(value.0) - } -} - -/// Key actions. -/// -/// See [the NDK docs](https://developer.android.com/ndk/reference/group/input#anonymous-enum-27) -/// -/// # Android Extensible Enum -/// -/// This is a runtime [extensible enum](`crate#android-extensible-enums`) and -/// should be handled similar to a `#[non_exhaustive]` enum to maintain -/// forwards compatibility. -/// -/// Implements `Into` and `From` for converting to/from Android SDK -/// integer values. -/// -#[derive(Copy, Clone, Debug, PartialEq, Eq, num_enum::FromPrimitive, num_enum::IntoPrimitive)] -#[non_exhaustive] -#[repr(u32)] -pub enum KeyAction { - Down = ndk_sys::AKEY_EVENT_ACTION_DOWN, - Up = ndk_sys::AKEY_EVENT_ACTION_UP, - Multiple = ndk_sys::AKEY_EVENT_ACTION_MULTIPLE, - - #[doc(hidden)] - #[num_enum(catch_all)] - __Unknown(u32), -} - -/// Key codes. -/// -/// See [the NDK docs](https://developer.android.com/ndk/reference/group/input#anonymous-enum-39) -/// -/// # Android Extensible Enum -/// -/// This is a runtime [extensible enum](`crate#android-extensible-enums`) and -/// should be handled similar to a `#[non_exhaustive]` enum to maintain -/// forwards compatibility. -/// -/// Implements `Into` and `From` for converting to/from Android SDK -/// integer values. -/// -#[derive(Copy, Clone, Debug, PartialEq, Eq, num_enum::FromPrimitive, num_enum::IntoPrimitive)] -#[non_exhaustive] -#[repr(u32)] -pub enum Keycode { - Unknown = ndk_sys::AKEYCODE_UNKNOWN, - SoftLeft = ndk_sys::AKEYCODE_SOFT_LEFT, - SoftRight = ndk_sys::AKEYCODE_SOFT_RIGHT, - Home = ndk_sys::AKEYCODE_HOME, - Back = ndk_sys::AKEYCODE_BACK, - Call = ndk_sys::AKEYCODE_CALL, - Endcall = ndk_sys::AKEYCODE_ENDCALL, - Keycode0 = ndk_sys::AKEYCODE_0, - Keycode1 = ndk_sys::AKEYCODE_1, - Keycode2 = ndk_sys::AKEYCODE_2, - Keycode3 = ndk_sys::AKEYCODE_3, - Keycode4 = ndk_sys::AKEYCODE_4, - Keycode5 = ndk_sys::AKEYCODE_5, - Keycode6 = ndk_sys::AKEYCODE_6, - Keycode7 = ndk_sys::AKEYCODE_7, - Keycode8 = ndk_sys::AKEYCODE_8, - Keycode9 = ndk_sys::AKEYCODE_9, - Star = ndk_sys::AKEYCODE_STAR, - Pound = ndk_sys::AKEYCODE_POUND, - DpadUp = ndk_sys::AKEYCODE_DPAD_UP, - DpadDown = ndk_sys::AKEYCODE_DPAD_DOWN, - DpadLeft = ndk_sys::AKEYCODE_DPAD_LEFT, - DpadRight = ndk_sys::AKEYCODE_DPAD_RIGHT, - DpadCenter = ndk_sys::AKEYCODE_DPAD_CENTER, - VolumeUp = ndk_sys::AKEYCODE_VOLUME_UP, - VolumeDown = ndk_sys::AKEYCODE_VOLUME_DOWN, - Power = ndk_sys::AKEYCODE_POWER, - Camera = ndk_sys::AKEYCODE_CAMERA, - Clear = ndk_sys::AKEYCODE_CLEAR, - A = ndk_sys::AKEYCODE_A, - B = ndk_sys::AKEYCODE_B, - C = ndk_sys::AKEYCODE_C, - D = ndk_sys::AKEYCODE_D, - E = ndk_sys::AKEYCODE_E, - F = ndk_sys::AKEYCODE_F, - G = ndk_sys::AKEYCODE_G, - H = ndk_sys::AKEYCODE_H, - I = ndk_sys::AKEYCODE_I, - J = ndk_sys::AKEYCODE_J, - K = ndk_sys::AKEYCODE_K, - L = ndk_sys::AKEYCODE_L, - M = ndk_sys::AKEYCODE_M, - N = ndk_sys::AKEYCODE_N, - O = ndk_sys::AKEYCODE_O, - P = ndk_sys::AKEYCODE_P, - Q = ndk_sys::AKEYCODE_Q, - R = ndk_sys::AKEYCODE_R, - S = ndk_sys::AKEYCODE_S, - T = ndk_sys::AKEYCODE_T, - U = ndk_sys::AKEYCODE_U, - V = ndk_sys::AKEYCODE_V, - W = ndk_sys::AKEYCODE_W, - X = ndk_sys::AKEYCODE_X, - Y = ndk_sys::AKEYCODE_Y, - Z = ndk_sys::AKEYCODE_Z, - Comma = ndk_sys::AKEYCODE_COMMA, - Period = ndk_sys::AKEYCODE_PERIOD, - AltLeft = ndk_sys::AKEYCODE_ALT_LEFT, - AltRight = ndk_sys::AKEYCODE_ALT_RIGHT, - ShiftLeft = ndk_sys::AKEYCODE_SHIFT_LEFT, - ShiftRight = ndk_sys::AKEYCODE_SHIFT_RIGHT, - Tab = ndk_sys::AKEYCODE_TAB, - Space = ndk_sys::AKEYCODE_SPACE, - Sym = ndk_sys::AKEYCODE_SYM, - Explorer = ndk_sys::AKEYCODE_EXPLORER, - Envelope = ndk_sys::AKEYCODE_ENVELOPE, - Enter = ndk_sys::AKEYCODE_ENTER, - Del = ndk_sys::AKEYCODE_DEL, - Grave = ndk_sys::AKEYCODE_GRAVE, - Minus = ndk_sys::AKEYCODE_MINUS, - Equals = ndk_sys::AKEYCODE_EQUALS, - LeftBracket = ndk_sys::AKEYCODE_LEFT_BRACKET, - RightBracket = ndk_sys::AKEYCODE_RIGHT_BRACKET, - Backslash = ndk_sys::AKEYCODE_BACKSLASH, - Semicolon = ndk_sys::AKEYCODE_SEMICOLON, - Apostrophe = ndk_sys::AKEYCODE_APOSTROPHE, - Slash = ndk_sys::AKEYCODE_SLASH, - At = ndk_sys::AKEYCODE_AT, - Num = ndk_sys::AKEYCODE_NUM, - Headsethook = ndk_sys::AKEYCODE_HEADSETHOOK, - Focus = ndk_sys::AKEYCODE_FOCUS, - Plus = ndk_sys::AKEYCODE_PLUS, - Menu = ndk_sys::AKEYCODE_MENU, - Notification = ndk_sys::AKEYCODE_NOTIFICATION, - Search = ndk_sys::AKEYCODE_SEARCH, - MediaPlayPause = ndk_sys::AKEYCODE_MEDIA_PLAY_PAUSE, - MediaStop = ndk_sys::AKEYCODE_MEDIA_STOP, - MediaNext = ndk_sys::AKEYCODE_MEDIA_NEXT, - MediaPrevious = ndk_sys::AKEYCODE_MEDIA_PREVIOUS, - MediaRewind = ndk_sys::AKEYCODE_MEDIA_REWIND, - MediaFastForward = ndk_sys::AKEYCODE_MEDIA_FAST_FORWARD, - Mute = ndk_sys::AKEYCODE_MUTE, - PageUp = ndk_sys::AKEYCODE_PAGE_UP, - PageDown = ndk_sys::AKEYCODE_PAGE_DOWN, - Pictsymbols = ndk_sys::AKEYCODE_PICTSYMBOLS, - SwitchCharset = ndk_sys::AKEYCODE_SWITCH_CHARSET, - ButtonA = ndk_sys::AKEYCODE_BUTTON_A, - ButtonB = ndk_sys::AKEYCODE_BUTTON_B, - ButtonC = ndk_sys::AKEYCODE_BUTTON_C, - ButtonX = ndk_sys::AKEYCODE_BUTTON_X, - ButtonY = ndk_sys::AKEYCODE_BUTTON_Y, - ButtonZ = ndk_sys::AKEYCODE_BUTTON_Z, - ButtonL1 = ndk_sys::AKEYCODE_BUTTON_L1, - ButtonR1 = ndk_sys::AKEYCODE_BUTTON_R1, - ButtonL2 = ndk_sys::AKEYCODE_BUTTON_L2, - ButtonR2 = ndk_sys::AKEYCODE_BUTTON_R2, - ButtonThumbl = ndk_sys::AKEYCODE_BUTTON_THUMBL, - ButtonThumbr = ndk_sys::AKEYCODE_BUTTON_THUMBR, - ButtonStart = ndk_sys::AKEYCODE_BUTTON_START, - ButtonSelect = ndk_sys::AKEYCODE_BUTTON_SELECT, - ButtonMode = ndk_sys::AKEYCODE_BUTTON_MODE, - Escape = ndk_sys::AKEYCODE_ESCAPE, - ForwardDel = ndk_sys::AKEYCODE_FORWARD_DEL, - CtrlLeft = ndk_sys::AKEYCODE_CTRL_LEFT, - CtrlRight = ndk_sys::AKEYCODE_CTRL_RIGHT, - CapsLock = ndk_sys::AKEYCODE_CAPS_LOCK, - ScrollLock = ndk_sys::AKEYCODE_SCROLL_LOCK, - MetaLeft = ndk_sys::AKEYCODE_META_LEFT, - MetaRight = ndk_sys::AKEYCODE_META_RIGHT, - Function = ndk_sys::AKEYCODE_FUNCTION, - Sysrq = ndk_sys::AKEYCODE_SYSRQ, - Break = ndk_sys::AKEYCODE_BREAK, - MoveHome = ndk_sys::AKEYCODE_MOVE_HOME, - MoveEnd = ndk_sys::AKEYCODE_MOVE_END, - Insert = ndk_sys::AKEYCODE_INSERT, - Forward = ndk_sys::AKEYCODE_FORWARD, - MediaPlay = ndk_sys::AKEYCODE_MEDIA_PLAY, - MediaPause = ndk_sys::AKEYCODE_MEDIA_PAUSE, - MediaClose = ndk_sys::AKEYCODE_MEDIA_CLOSE, - MediaEject = ndk_sys::AKEYCODE_MEDIA_EJECT, - MediaRecord = ndk_sys::AKEYCODE_MEDIA_RECORD, - F1 = ndk_sys::AKEYCODE_F1, - F2 = ndk_sys::AKEYCODE_F2, - F3 = ndk_sys::AKEYCODE_F3, - F4 = ndk_sys::AKEYCODE_F4, - F5 = ndk_sys::AKEYCODE_F5, - F6 = ndk_sys::AKEYCODE_F6, - F7 = ndk_sys::AKEYCODE_F7, - F8 = ndk_sys::AKEYCODE_F8, - F9 = ndk_sys::AKEYCODE_F9, - F10 = ndk_sys::AKEYCODE_F10, - F11 = ndk_sys::AKEYCODE_F11, - F12 = ndk_sys::AKEYCODE_F12, - NumLock = ndk_sys::AKEYCODE_NUM_LOCK, - Numpad0 = ndk_sys::AKEYCODE_NUMPAD_0, - Numpad1 = ndk_sys::AKEYCODE_NUMPAD_1, - Numpad2 = ndk_sys::AKEYCODE_NUMPAD_2, - Numpad3 = ndk_sys::AKEYCODE_NUMPAD_3, - Numpad4 = ndk_sys::AKEYCODE_NUMPAD_4, - Numpad5 = ndk_sys::AKEYCODE_NUMPAD_5, - Numpad6 = ndk_sys::AKEYCODE_NUMPAD_6, - Numpad7 = ndk_sys::AKEYCODE_NUMPAD_7, - Numpad8 = ndk_sys::AKEYCODE_NUMPAD_8, - Numpad9 = ndk_sys::AKEYCODE_NUMPAD_9, - NumpadDivide = ndk_sys::AKEYCODE_NUMPAD_DIVIDE, - NumpadMultiply = ndk_sys::AKEYCODE_NUMPAD_MULTIPLY, - NumpadSubtract = ndk_sys::AKEYCODE_NUMPAD_SUBTRACT, - NumpadAdd = ndk_sys::AKEYCODE_NUMPAD_ADD, - NumpadDot = ndk_sys::AKEYCODE_NUMPAD_DOT, - NumpadComma = ndk_sys::AKEYCODE_NUMPAD_COMMA, - NumpadEnter = ndk_sys::AKEYCODE_NUMPAD_ENTER, - NumpadEquals = ndk_sys::AKEYCODE_NUMPAD_EQUALS, - NumpadLeftParen = ndk_sys::AKEYCODE_NUMPAD_LEFT_PAREN, - NumpadRightParen = ndk_sys::AKEYCODE_NUMPAD_RIGHT_PAREN, - VolumeMute = ndk_sys::AKEYCODE_VOLUME_MUTE, - Info = ndk_sys::AKEYCODE_INFO, - ChannelUp = ndk_sys::AKEYCODE_CHANNEL_UP, - ChannelDown = ndk_sys::AKEYCODE_CHANNEL_DOWN, - ZoomIn = ndk_sys::AKEYCODE_ZOOM_IN, - ZoomOut = ndk_sys::AKEYCODE_ZOOM_OUT, - Tv = ndk_sys::AKEYCODE_TV, - Window = ndk_sys::AKEYCODE_WINDOW, - Guide = ndk_sys::AKEYCODE_GUIDE, - Dvr = ndk_sys::AKEYCODE_DVR, - Bookmark = ndk_sys::AKEYCODE_BOOKMARK, - Captions = ndk_sys::AKEYCODE_CAPTIONS, - Settings = ndk_sys::AKEYCODE_SETTINGS, - TvPower = ndk_sys::AKEYCODE_TV_POWER, - TvInput = ndk_sys::AKEYCODE_TV_INPUT, - StbPower = ndk_sys::AKEYCODE_STB_POWER, - StbInput = ndk_sys::AKEYCODE_STB_INPUT, - AvrPower = ndk_sys::AKEYCODE_AVR_POWER, - AvrInput = ndk_sys::AKEYCODE_AVR_INPUT, - ProgRed = ndk_sys::AKEYCODE_PROG_RED, - ProgGreen = ndk_sys::AKEYCODE_PROG_GREEN, - ProgYellow = ndk_sys::AKEYCODE_PROG_YELLOW, - ProgBlue = ndk_sys::AKEYCODE_PROG_BLUE, - AppSwitch = ndk_sys::AKEYCODE_APP_SWITCH, - Button1 = ndk_sys::AKEYCODE_BUTTON_1, - Button2 = ndk_sys::AKEYCODE_BUTTON_2, - Button3 = ndk_sys::AKEYCODE_BUTTON_3, - Button4 = ndk_sys::AKEYCODE_BUTTON_4, - Button5 = ndk_sys::AKEYCODE_BUTTON_5, - Button6 = ndk_sys::AKEYCODE_BUTTON_6, - Button7 = ndk_sys::AKEYCODE_BUTTON_7, - Button8 = ndk_sys::AKEYCODE_BUTTON_8, - Button9 = ndk_sys::AKEYCODE_BUTTON_9, - Button10 = ndk_sys::AKEYCODE_BUTTON_10, - Button11 = ndk_sys::AKEYCODE_BUTTON_11, - Button12 = ndk_sys::AKEYCODE_BUTTON_12, - Button13 = ndk_sys::AKEYCODE_BUTTON_13, - Button14 = ndk_sys::AKEYCODE_BUTTON_14, - Button15 = ndk_sys::AKEYCODE_BUTTON_15, - Button16 = ndk_sys::AKEYCODE_BUTTON_16, - LanguageSwitch = ndk_sys::AKEYCODE_LANGUAGE_SWITCH, - MannerMode = ndk_sys::AKEYCODE_MANNER_MODE, - Keycode3dMode = ndk_sys::AKEYCODE_3D_MODE, - Contacts = ndk_sys::AKEYCODE_CONTACTS, - Calendar = ndk_sys::AKEYCODE_CALENDAR, - Music = ndk_sys::AKEYCODE_MUSIC, - Calculator = ndk_sys::AKEYCODE_CALCULATOR, - ZenkakuHankaku = ndk_sys::AKEYCODE_ZENKAKU_HANKAKU, - Eisu = ndk_sys::AKEYCODE_EISU, - Muhenkan = ndk_sys::AKEYCODE_MUHENKAN, - Henkan = ndk_sys::AKEYCODE_HENKAN, - KatakanaHiragana = ndk_sys::AKEYCODE_KATAKANA_HIRAGANA, - Yen = ndk_sys::AKEYCODE_YEN, - Ro = ndk_sys::AKEYCODE_RO, - Kana = ndk_sys::AKEYCODE_KANA, - Assist = ndk_sys::AKEYCODE_ASSIST, - BrightnessDown = ndk_sys::AKEYCODE_BRIGHTNESS_DOWN, - BrightnessUp = ndk_sys::AKEYCODE_BRIGHTNESS_UP, - MediaAudioTrack = ndk_sys::AKEYCODE_MEDIA_AUDIO_TRACK, - Sleep = ndk_sys::AKEYCODE_SLEEP, - Wakeup = ndk_sys::AKEYCODE_WAKEUP, - Pairing = ndk_sys::AKEYCODE_PAIRING, - MediaTopMenu = ndk_sys::AKEYCODE_MEDIA_TOP_MENU, - Keycode11 = ndk_sys::AKEYCODE_11, - Keycode12 = ndk_sys::AKEYCODE_12, - LastChannel = ndk_sys::AKEYCODE_LAST_CHANNEL, - TvDataService = ndk_sys::AKEYCODE_TV_DATA_SERVICE, - VoiceAssist = ndk_sys::AKEYCODE_VOICE_ASSIST, - TvRadioService = ndk_sys::AKEYCODE_TV_RADIO_SERVICE, - TvTeletext = ndk_sys::AKEYCODE_TV_TELETEXT, - TvNumberEntry = ndk_sys::AKEYCODE_TV_NUMBER_ENTRY, - TvTerrestrialAnalog = ndk_sys::AKEYCODE_TV_TERRESTRIAL_ANALOG, - TvTerrestrialDigital = ndk_sys::AKEYCODE_TV_TERRESTRIAL_DIGITAL, - TvSatellite = ndk_sys::AKEYCODE_TV_SATELLITE, - TvSatelliteBs = ndk_sys::AKEYCODE_TV_SATELLITE_BS, - TvSatelliteCs = ndk_sys::AKEYCODE_TV_SATELLITE_CS, - TvSatelliteService = ndk_sys::AKEYCODE_TV_SATELLITE_SERVICE, - TvNetwork = ndk_sys::AKEYCODE_TV_NETWORK, - TvAntennaCable = ndk_sys::AKEYCODE_TV_ANTENNA_CABLE, - TvInputHdmi1 = ndk_sys::AKEYCODE_TV_INPUT_HDMI_1, - TvInputHdmi2 = ndk_sys::AKEYCODE_TV_INPUT_HDMI_2, - TvInputHdmi3 = ndk_sys::AKEYCODE_TV_INPUT_HDMI_3, - TvInputHdmi4 = ndk_sys::AKEYCODE_TV_INPUT_HDMI_4, - TvInputComposite1 = ndk_sys::AKEYCODE_TV_INPUT_COMPOSITE_1, - TvInputComposite2 = ndk_sys::AKEYCODE_TV_INPUT_COMPOSITE_2, - TvInputComponent1 = ndk_sys::AKEYCODE_TV_INPUT_COMPONENT_1, - TvInputComponent2 = ndk_sys::AKEYCODE_TV_INPUT_COMPONENT_2, - TvInputVga1 = ndk_sys::AKEYCODE_TV_INPUT_VGA_1, - TvAudioDescription = ndk_sys::AKEYCODE_TV_AUDIO_DESCRIPTION, - TvAudioDescriptionMixUp = ndk_sys::AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP, - TvAudioDescriptionMixDown = ndk_sys::AKEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN, - TvZoomMode = ndk_sys::AKEYCODE_TV_ZOOM_MODE, - TvContentsMenu = ndk_sys::AKEYCODE_TV_CONTENTS_MENU, - TvMediaContextMenu = ndk_sys::AKEYCODE_TV_MEDIA_CONTEXT_MENU, - TvTimerProgramming = ndk_sys::AKEYCODE_TV_TIMER_PROGRAMMING, - Help = ndk_sys::AKEYCODE_HELP, - NavigatePrevious = ndk_sys::AKEYCODE_NAVIGATE_PREVIOUS, - NavigateNext = ndk_sys::AKEYCODE_NAVIGATE_NEXT, - NavigateIn = ndk_sys::AKEYCODE_NAVIGATE_IN, - NavigateOut = ndk_sys::AKEYCODE_NAVIGATE_OUT, - StemPrimary = ndk_sys::AKEYCODE_STEM_PRIMARY, - Stem1 = ndk_sys::AKEYCODE_STEM_1, - Stem2 = ndk_sys::AKEYCODE_STEM_2, - Stem3 = ndk_sys::AKEYCODE_STEM_3, - DpadUpLeft = ndk_sys::AKEYCODE_DPAD_UP_LEFT, - DpadDownLeft = ndk_sys::AKEYCODE_DPAD_DOWN_LEFT, - DpadUpRight = ndk_sys::AKEYCODE_DPAD_UP_RIGHT, - DpadDownRight = ndk_sys::AKEYCODE_DPAD_DOWN_RIGHT, - MediaSkipForward = ndk_sys::AKEYCODE_MEDIA_SKIP_FORWARD, - MediaSkipBackward = ndk_sys::AKEYCODE_MEDIA_SKIP_BACKWARD, - MediaStepForward = ndk_sys::AKEYCODE_MEDIA_STEP_FORWARD, - MediaStepBackward = ndk_sys::AKEYCODE_MEDIA_STEP_BACKWARD, - SoftSleep = ndk_sys::AKEYCODE_SOFT_SLEEP, - Cut = ndk_sys::AKEYCODE_CUT, - Copy = ndk_sys::AKEYCODE_COPY, - Paste = ndk_sys::AKEYCODE_PASTE, - SystemNavigationUp = ndk_sys::AKEYCODE_SYSTEM_NAVIGATION_UP, - SystemNavigationDown = ndk_sys::AKEYCODE_SYSTEM_NAVIGATION_DOWN, - SystemNavigationLeft = ndk_sys::AKEYCODE_SYSTEM_NAVIGATION_LEFT, - SystemNavigationRight = ndk_sys::AKEYCODE_SYSTEM_NAVIGATION_RIGHT, - AllApps = ndk_sys::AKEYCODE_ALL_APPS, - Refresh = ndk_sys::AKEYCODE_REFRESH, - ThumbsUp = ndk_sys::AKEYCODE_THUMBS_UP, - ThumbsDown = ndk_sys::AKEYCODE_THUMBS_DOWN, - ProfileSwitch = ndk_sys::AKEYCODE_PROFILE_SWITCH, - - #[doc(hidden)] - #[num_enum(catch_all)] - __Unknown(u32), -} - -/// Flags associated with [`KeyEvent`]. -/// -/// See [the NDK docs](https://developer.android.com/ndk/reference/group/input#anonymous-enum-28) -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -pub struct KeyEventFlags(pub u32); - -impl KeyEventFlags { - #[inline] - pub fn cancelled(&self) -> bool { - self.0 & ndk_sys::AKEY_EVENT_FLAG_CANCELED != 0 - } - #[inline] - pub fn cancelled_long_press(&self) -> bool { - self.0 & ndk_sys::AKEY_EVENT_FLAG_CANCELED_LONG_PRESS != 0 - } - #[inline] - pub fn editor_action(&self) -> bool { - self.0 & ndk_sys::AKEY_EVENT_FLAG_EDITOR_ACTION != 0 - } - #[inline] - pub fn fallback(&self) -> bool { - self.0 & ndk_sys::AKEY_EVENT_FLAG_FALLBACK != 0 - } - #[inline] - pub fn from_system(&self) -> bool { - self.0 & ndk_sys::AKEY_EVENT_FLAG_FROM_SYSTEM != 0 - } - #[inline] - pub fn keep_touch_mode(&self) -> bool { - self.0 & ndk_sys::AKEY_EVENT_FLAG_KEEP_TOUCH_MODE != 0 - } - #[inline] - pub fn long_press(&self) -> bool { - self.0 & ndk_sys::AKEY_EVENT_FLAG_LONG_PRESS != 0 - } - #[inline] - pub fn soft_keyboard(&self) -> bool { - self.0 & ndk_sys::AKEY_EVENT_FLAG_SOFT_KEYBOARD != 0 - } - #[inline] - pub fn tracking(&self) -> bool { - self.0 & ndk_sys::AKEY_EVENT_FLAG_TRACKING != 0 - } - #[inline] - pub fn virtual_hard_key(&self) -> bool { - self.0 & ndk_sys::AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY != 0 - } - #[inline] - pub fn woke_here(&self) -> bool { - self.0 & ndk_sys::AKEY_EVENT_FLAG_WOKE_HERE != 0 - } -} - -impl From for KeyEventFlags { - fn from(value: ndk::event::KeyEventFlags) -> Self { - Self(value.0) - } -} - /// This struct holds a span within a region of text from `start` to `end`. /// /// The `start` index may be greater than the `end` index (swapping `start` and `end` will represent the same span) diff --git a/android-activity/src/input/sdk.rs b/android-activity/src/input/sdk.rs index 688b512..70a2c2c 100644 --- a/android-activity/src/input/sdk.rs +++ b/android-activity/src/input/sdk.rs @@ -246,10 +246,8 @@ impl KeyCharacterMap { /// a [`AppError::JavaError`] in case there is a spurious JNI error or an exception /// is caught. pub fn get(&self, key_code: Keycode, meta_state: MetaState) -> Result { - let key_code: u32 = key_code.into(); - let key_code = key_code as jni_sys::jint; - let meta_state: u32 = meta_state.0; - let meta_state = meta_state as jni_sys::jint; + let key_code = key_code.into(); + let meta_state = meta_state.0 as i32; // Since we expect this API to be called from the `main` thread then we expect to already be // attached to the JVM diff --git a/android-activity/src/native_activity/input.rs b/android-activity/src/native_activity/input.rs index 613ea1c..e07e926 100644 --- a/android-activity/src/native_activity/input.rs +++ b/android-activity/src/native_activity/input.rs @@ -1,8 +1,10 @@ use std::marker::PhantomData; +use ndk::event::ButtonState; + use crate::input::{ - Axis, Button, ButtonState, EdgeFlags, KeyAction, Keycode, MetaState, MotionAction, - MotionEventFlags, Pointer, PointersIter, Source, ToolType, + Axis, EdgeFlags, KeyAction, Keycode, MetaState, MotionAction, MotionEventFlags, Pointer, + PointersIter, Source, ToolType, }; /// A motion event @@ -30,12 +32,7 @@ impl<'a> MotionEvent<'a> { /// #[inline] pub fn source(&self) -> Source { - // XXX: we use `AInputEvent_getSource` directly (instead of calling - // ndk_event.source()) since we have our own `Source` enum that we - // share between backends, which may also capture unknown variants - // added in new versions of Android. - let source = unsafe { ndk_sys::AInputEvent_getSource(self.ndk_event.ptr().as_ptr()) }; - source.into() + self.ndk_event.source() } /// Get the device id associated with the event. @@ -50,13 +47,7 @@ impl<'a> MotionEvent<'a> { /// See [the MotionEvent docs](https://developer.android.com/reference/android/view/MotionEvent#getActionMasked()) #[inline] pub fn action(&self) -> MotionAction { - // XXX: we use `AMotionEvent_getAction` directly since we have our own - // `MotionAction` enum that we share between backends, which may also - // capture unknown variants added in new versions of Android. - let action = - unsafe { ndk_sys::AMotionEvent_getAction(self.ndk_event.ptr().as_ptr()) as u32 } - & ndk_sys::AMOTION_EVENT_ACTION_MASK; - action.into() + self.ndk_event.action() } /// Returns which button has been modified during a press or release action. @@ -66,10 +57,11 @@ impl<'a> MotionEvent<'a> { /// /// See [the MotionEvent docs](https://developer.android.com/reference/android/view/MotionEvent#getActionButton()) #[inline] - pub fn action_button(&self) -> Button { - let action_button = - unsafe { ndk_sys::AMotionEvent_getActionButton(self.ndk_event.ptr().as_ptr()) as u32 }; - action_button.into() + #[cfg(feature = "api-level-33")] + #[doc(alias = "AMotionEvent_getActionButton")] + // TODO: Button enum to signify only one bitflag can be set? + pub fn action_button(&self) -> ButtonState { + self.ndk_event.action_button() } /// Returns the pointer index of an `Up` or `Down` event. @@ -153,7 +145,7 @@ impl<'a> MotionEvent<'a> { /// docs](https://developer.android.com/ndk/reference/group/input#amotionevent_getmetastate) #[inline] pub fn meta_state(&self) -> MetaState { - self.ndk_event.meta_state().into() + self.ndk_event.meta_state() } /// Returns the button state during this event, as a bitfield. @@ -162,7 +154,7 @@ impl<'a> MotionEvent<'a> { /// docs](https://developer.android.com/ndk/reference/group/input#amotionevent_getbuttonstate) #[inline] pub fn button_state(&self) -> ButtonState { - self.ndk_event.button_state().into() + self.ndk_event.button_state() } /// Returns the time of the start of this gesture, in the `java.lang.System.nanoTime()` time @@ -181,7 +173,7 @@ impl<'a> MotionEvent<'a> { /// docs](https://developer.android.com/ndk/reference/group/input#amotionevent_getedgeflags) #[inline] pub fn edge_flags(&self) -> EdgeFlags { - self.ndk_event.edge_flags().into() + self.ndk_event.edge_flags() } /// Returns the time of this event, in the `java.lang.System.nanoTime()` time base @@ -199,7 +191,7 @@ impl<'a> MotionEvent<'a> { /// docs](https://developer.android.com/ndk/reference/group/input#amotionevent_getflags) #[inline] pub fn flags(&self) -> MotionEventFlags { - self.ndk_event.flags().into() + self.ndk_event.flags() } /* Missing from GameActivity currently... @@ -328,15 +320,9 @@ impl<'a> KeyEvent<'a> { } /// Get the source of the event. - /// #[inline] pub fn source(&self) -> Source { - // XXX: we use `AInputEvent_getSource` directly (instead of calling - // ndk_event.source()) since we have our own `Source` enum that we - // share between backends, which may also capture unknown variants - // added in new versions of Android. - let source = unsafe { ndk_sys::AInputEvent_getSource(self.ndk_event.ptr().as_ptr()) }; - source.into() + self.ndk_event.source() } /// Get the device id associated with the event. @@ -351,11 +337,7 @@ impl<'a> KeyEvent<'a> { /// See [the KeyEvent docs](https://developer.android.com/reference/android/view/KeyEvent#getAction()) #[inline] pub fn action(&self) -> KeyAction { - // XXX: we use `AInputEvent_getAction` directly since we have our own - // `KeyAction` enum that we share between backends, which may also - // capture unknown variants added in new versions of Android. - let action = unsafe { ndk_sys::AKeyEvent_getAction(self.ndk_event.ptr().as_ptr()) as u32 }; - action.into() + self.ndk_event.action() } /// Returns the last time the key was pressed. This is on the scale of @@ -384,12 +366,7 @@ impl<'a> KeyEvent<'a> { /// docs](https://developer.android.com/ndk/reference/group/input#akeyevent_getkeycode) #[inline] pub fn key_code(&self) -> Keycode { - // XXX: we use `AInputEvent_getKeyCode` directly since we have our own - // `Keycode` enum that we share between backends, which may also - // capture unknown variants added in new versions of Android. - let keycode = - unsafe { ndk_sys::AKeyEvent_getKeyCode(self.ndk_event.ptr().as_ptr()) as u32 }; - keycode.into() + self.ndk_event.key_code() } /// Returns the number of repeats of a key. @@ -416,13 +393,12 @@ impl<'a> KeyEvent<'a> { /// docs](https://developer.android.com/ndk/reference/group/input#akeyevent_getmetastate) #[inline] pub fn meta_state(&self) -> MetaState { - self.ndk_event.meta_state().into() + self.ndk_event.meta_state() } } // We use our own wrapper type for input events to have better consistency -// with GameActivity and ensure the enum can be extended without needing a -// semver bump +// with GameActivity /// Enum of possible input events #[derive(Debug)] #[non_exhaustive]