1*38e8c45fSAndroid Build Coastguard Worker /* 2*38e8c45fSAndroid Build Coastguard Worker * Copyright 2023 The Android Open Source Project 3*38e8c45fSAndroid Build Coastguard Worker * 4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*38e8c45fSAndroid Build Coastguard Worker * 8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*38e8c45fSAndroid Build Coastguard Worker * 10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License. 15*38e8c45fSAndroid Build Coastguard Worker */ 16*38e8c45fSAndroid Build Coastguard Worker 17*38e8c45fSAndroid Build Coastguard Worker //! Common definitions of the Android Input Framework in rust. 18*38e8c45fSAndroid Build Coastguard Worker 19*38e8c45fSAndroid Build Coastguard Worker use crate::ffi::RustInputDeviceIdentifier; 20*38e8c45fSAndroid Build Coastguard Worker use bitflags::bitflags; 21*38e8c45fSAndroid Build Coastguard Worker use inputconstants::aidl::android::os::IInputConstants; 22*38e8c45fSAndroid Build Coastguard Worker use inputconstants::aidl::android::os::MotionEventFlag::MotionEventFlag; 23*38e8c45fSAndroid Build Coastguard Worker use serde::{Deserialize, Serialize}; 24*38e8c45fSAndroid Build Coastguard Worker use std::fmt; 25*38e8c45fSAndroid Build Coastguard Worker 26*38e8c45fSAndroid Build Coastguard Worker /// The InputDevice ID. 27*38e8c45fSAndroid Build Coastguard Worker #[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)] 28*38e8c45fSAndroid Build Coastguard Worker pub struct DeviceId(pub i32); 29*38e8c45fSAndroid Build Coastguard Worker 30*38e8c45fSAndroid Build Coastguard Worker /// The InputDevice equivalent for Rust inputflinger 31*38e8c45fSAndroid Build Coastguard Worker #[derive(Debug)] 32*38e8c45fSAndroid Build Coastguard Worker pub struct InputDevice { 33*38e8c45fSAndroid Build Coastguard Worker /// InputDevice ID 34*38e8c45fSAndroid Build Coastguard Worker pub device_id: DeviceId, 35*38e8c45fSAndroid Build Coastguard Worker /// InputDevice unique identifier 36*38e8c45fSAndroid Build Coastguard Worker pub identifier: RustInputDeviceIdentifier, 37*38e8c45fSAndroid Build Coastguard Worker /// InputDevice classes (equivalent to EventHub InputDeviceClass) 38*38e8c45fSAndroid Build Coastguard Worker pub classes: DeviceClass, 39*38e8c45fSAndroid Build Coastguard Worker } 40*38e8c45fSAndroid Build Coastguard Worker 41*38e8c45fSAndroid Build Coastguard Worker #[repr(u32)] 42*38e8c45fSAndroid Build Coastguard Worker pub enum SourceClass { 43*38e8c45fSAndroid Build Coastguard Worker None = input_bindgen::AINPUT_SOURCE_CLASS_NONE, 44*38e8c45fSAndroid Build Coastguard Worker Button = input_bindgen::AINPUT_SOURCE_CLASS_BUTTON, 45*38e8c45fSAndroid Build Coastguard Worker Pointer = input_bindgen::AINPUT_SOURCE_CLASS_POINTER, 46*38e8c45fSAndroid Build Coastguard Worker Navigation = input_bindgen::AINPUT_SOURCE_CLASS_NAVIGATION, 47*38e8c45fSAndroid Build Coastguard Worker Position = input_bindgen::AINPUT_SOURCE_CLASS_POSITION, 48*38e8c45fSAndroid Build Coastguard Worker Joystick = input_bindgen::AINPUT_SOURCE_CLASS_JOYSTICK, 49*38e8c45fSAndroid Build Coastguard Worker } 50*38e8c45fSAndroid Build Coastguard Worker 51*38e8c45fSAndroid Build Coastguard Worker bitflags! { 52*38e8c45fSAndroid Build Coastguard Worker /// Source of the input device or input events. 53*38e8c45fSAndroid Build Coastguard Worker #[derive(Debug, PartialEq)] 54*38e8c45fSAndroid Build Coastguard Worker pub struct Source: u32 { 55*38e8c45fSAndroid Build Coastguard Worker // Constants from SourceClass, added here for compatibility reasons 56*38e8c45fSAndroid Build Coastguard Worker /// SourceClass::Button 57*38e8c45fSAndroid Build Coastguard Worker const SourceClassButton = SourceClass::Button as u32; 58*38e8c45fSAndroid Build Coastguard Worker /// SourceClass::Pointer 59*38e8c45fSAndroid Build Coastguard Worker const SourceClassPointer = SourceClass::Pointer as u32; 60*38e8c45fSAndroid Build Coastguard Worker /// SourceClass::Navigation 61*38e8c45fSAndroid Build Coastguard Worker const SourceClassNavigation = SourceClass::Navigation as u32; 62*38e8c45fSAndroid Build Coastguard Worker /// SourceClass::Position 63*38e8c45fSAndroid Build Coastguard Worker const SourceClassPosition = SourceClass::Position as u32; 64*38e8c45fSAndroid Build Coastguard Worker /// SourceClass::Joystick 65*38e8c45fSAndroid Build Coastguard Worker const SourceClassJoystick = SourceClass::Joystick as u32; 66*38e8c45fSAndroid Build Coastguard Worker 67*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_UNKNOWN 68*38e8c45fSAndroid Build Coastguard Worker const Unknown = input_bindgen::AINPUT_SOURCE_UNKNOWN; 69*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_KEYBOARD 70*38e8c45fSAndroid Build Coastguard Worker const Keyboard = input_bindgen::AINPUT_SOURCE_KEYBOARD; 71*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_DPAD 72*38e8c45fSAndroid Build Coastguard Worker const Dpad = input_bindgen::AINPUT_SOURCE_DPAD; 73*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_GAMEPAD 74*38e8c45fSAndroid Build Coastguard Worker const Gamepad = input_bindgen::AINPUT_SOURCE_GAMEPAD; 75*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_TOUCHSCREEN 76*38e8c45fSAndroid Build Coastguard Worker const Touchscreen = input_bindgen::AINPUT_SOURCE_TOUCHSCREEN; 77*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_MOUSE 78*38e8c45fSAndroid Build Coastguard Worker const Mouse = input_bindgen::AINPUT_SOURCE_MOUSE; 79*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_STYLUS 80*38e8c45fSAndroid Build Coastguard Worker const Stylus = input_bindgen::AINPUT_SOURCE_STYLUS; 81*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_BLUETOOTH_STYLUS 82*38e8c45fSAndroid Build Coastguard Worker const BluetoothStylus = input_bindgen::AINPUT_SOURCE_BLUETOOTH_STYLUS; 83*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_TRACKBALL 84*38e8c45fSAndroid Build Coastguard Worker const Trackball = input_bindgen::AINPUT_SOURCE_TRACKBALL; 85*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_MOUSE_RELATIVE 86*38e8c45fSAndroid Build Coastguard Worker const MouseRelative = input_bindgen::AINPUT_SOURCE_MOUSE_RELATIVE; 87*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_TOUCHPAD 88*38e8c45fSAndroid Build Coastguard Worker const Touchpad = input_bindgen::AINPUT_SOURCE_TOUCHPAD; 89*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_TOUCH_NAVIGATION 90*38e8c45fSAndroid Build Coastguard Worker const TouchNavigation = input_bindgen::AINPUT_SOURCE_TOUCH_NAVIGATION; 91*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_JOYSTICK 92*38e8c45fSAndroid Build Coastguard Worker const Joystick = input_bindgen::AINPUT_SOURCE_JOYSTICK; 93*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_HDMI 94*38e8c45fSAndroid Build Coastguard Worker const HDMI = input_bindgen::AINPUT_SOURCE_HDMI; 95*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_SENSOR 96*38e8c45fSAndroid Build Coastguard Worker const Sensor = input_bindgen::AINPUT_SOURCE_SENSOR; 97*38e8c45fSAndroid Build Coastguard Worker /// SOURCE_ROTARY_ENCODER 98*38e8c45fSAndroid Build Coastguard Worker const RotaryEncoder = input_bindgen::AINPUT_SOURCE_ROTARY_ENCODER; 99*38e8c45fSAndroid Build Coastguard Worker } 100*38e8c45fSAndroid Build Coastguard Worker } 101*38e8c45fSAndroid Build Coastguard Worker 102*38e8c45fSAndroid Build Coastguard Worker /// A rust enum representation of a MotionEvent action. 103*38e8c45fSAndroid Build Coastguard Worker #[repr(u32)] 104*38e8c45fSAndroid Build Coastguard Worker pub enum MotionAction { 105*38e8c45fSAndroid Build Coastguard Worker /// ACTION_DOWN 106*38e8c45fSAndroid Build Coastguard Worker Down = input_bindgen::AMOTION_EVENT_ACTION_DOWN, 107*38e8c45fSAndroid Build Coastguard Worker /// ACTION_UP 108*38e8c45fSAndroid Build Coastguard Worker Up = input_bindgen::AMOTION_EVENT_ACTION_UP, 109*38e8c45fSAndroid Build Coastguard Worker /// ACTION_MOVE 110*38e8c45fSAndroid Build Coastguard Worker Move = input_bindgen::AMOTION_EVENT_ACTION_MOVE, 111*38e8c45fSAndroid Build Coastguard Worker /// ACTION_CANCEL 112*38e8c45fSAndroid Build Coastguard Worker Cancel = input_bindgen::AMOTION_EVENT_ACTION_CANCEL, 113*38e8c45fSAndroid Build Coastguard Worker /// ACTION_OUTSIDE 114*38e8c45fSAndroid Build Coastguard Worker Outside = input_bindgen::AMOTION_EVENT_ACTION_OUTSIDE, 115*38e8c45fSAndroid Build Coastguard Worker /// ACTION_POINTER_DOWN 116*38e8c45fSAndroid Build Coastguard Worker PointerDown { 117*38e8c45fSAndroid Build Coastguard Worker /// The index of the affected pointer. 118*38e8c45fSAndroid Build Coastguard Worker action_index: usize, 119*38e8c45fSAndroid Build Coastguard Worker } = input_bindgen::AMOTION_EVENT_ACTION_POINTER_DOWN, 120*38e8c45fSAndroid Build Coastguard Worker /// ACTION_POINTER_UP 121*38e8c45fSAndroid Build Coastguard Worker PointerUp { 122*38e8c45fSAndroid Build Coastguard Worker /// The index of the affected pointer. 123*38e8c45fSAndroid Build Coastguard Worker action_index: usize, 124*38e8c45fSAndroid Build Coastguard Worker } = input_bindgen::AMOTION_EVENT_ACTION_POINTER_UP, 125*38e8c45fSAndroid Build Coastguard Worker /// ACTION_HOVER_ENTER 126*38e8c45fSAndroid Build Coastguard Worker HoverEnter = input_bindgen::AMOTION_EVENT_ACTION_HOVER_ENTER, 127*38e8c45fSAndroid Build Coastguard Worker /// ACTION_HOVER_MOVE 128*38e8c45fSAndroid Build Coastguard Worker HoverMove = input_bindgen::AMOTION_EVENT_ACTION_HOVER_MOVE, 129*38e8c45fSAndroid Build Coastguard Worker /// ACTION_HOVER_EXIT 130*38e8c45fSAndroid Build Coastguard Worker HoverExit = input_bindgen::AMOTION_EVENT_ACTION_HOVER_EXIT, 131*38e8c45fSAndroid Build Coastguard Worker /// ACTION_SCROLL 132*38e8c45fSAndroid Build Coastguard Worker Scroll = input_bindgen::AMOTION_EVENT_ACTION_SCROLL, 133*38e8c45fSAndroid Build Coastguard Worker /// ACTION_BUTTON_PRESS 134*38e8c45fSAndroid Build Coastguard Worker ButtonPress = input_bindgen::AMOTION_EVENT_ACTION_BUTTON_PRESS, 135*38e8c45fSAndroid Build Coastguard Worker /// ACTION_BUTTON_RELEASE 136*38e8c45fSAndroid Build Coastguard Worker ButtonRelease = input_bindgen::AMOTION_EVENT_ACTION_BUTTON_RELEASE, 137*38e8c45fSAndroid Build Coastguard Worker } 138*38e8c45fSAndroid Build Coastguard Worker 139*38e8c45fSAndroid Build Coastguard Worker impl fmt::Display for MotionAction { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result140*38e8c45fSAndroid Build Coastguard Worker fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 141*38e8c45fSAndroid Build Coastguard Worker match self { 142*38e8c45fSAndroid Build Coastguard Worker MotionAction::Down => write!(f, "DOWN"), 143*38e8c45fSAndroid Build Coastguard Worker MotionAction::Up => write!(f, "UP"), 144*38e8c45fSAndroid Build Coastguard Worker MotionAction::Move => write!(f, "MOVE"), 145*38e8c45fSAndroid Build Coastguard Worker MotionAction::Cancel => write!(f, "CANCEL"), 146*38e8c45fSAndroid Build Coastguard Worker MotionAction::Outside => write!(f, "OUTSIDE"), 147*38e8c45fSAndroid Build Coastguard Worker MotionAction::PointerDown { action_index } => { 148*38e8c45fSAndroid Build Coastguard Worker write!(f, "POINTER_DOWN({})", action_index) 149*38e8c45fSAndroid Build Coastguard Worker } 150*38e8c45fSAndroid Build Coastguard Worker MotionAction::PointerUp { action_index } => write!(f, "POINTER_UP({})", action_index), 151*38e8c45fSAndroid Build Coastguard Worker MotionAction::HoverMove => write!(f, "HOVER_MOVE"), 152*38e8c45fSAndroid Build Coastguard Worker MotionAction::Scroll => write!(f, "SCROLL"), 153*38e8c45fSAndroid Build Coastguard Worker MotionAction::HoverEnter => write!(f, "HOVER_ENTER"), 154*38e8c45fSAndroid Build Coastguard Worker MotionAction::HoverExit => write!(f, "HOVER_EXIT"), 155*38e8c45fSAndroid Build Coastguard Worker MotionAction::ButtonPress => write!(f, "BUTTON_PRESS"), 156*38e8c45fSAndroid Build Coastguard Worker MotionAction::ButtonRelease => write!(f, "BUTTON_RELEASE"), 157*38e8c45fSAndroid Build Coastguard Worker } 158*38e8c45fSAndroid Build Coastguard Worker } 159*38e8c45fSAndroid Build Coastguard Worker } 160*38e8c45fSAndroid Build Coastguard Worker 161*38e8c45fSAndroid Build Coastguard Worker impl From<u32> for MotionAction { from(action: u32) -> Self162*38e8c45fSAndroid Build Coastguard Worker fn from(action: u32) -> Self { 163*38e8c45fSAndroid Build Coastguard Worker let (action_masked, action_index) = MotionAction::breakdown_action(action); 164*38e8c45fSAndroid Build Coastguard Worker match action_masked { 165*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_DOWN => MotionAction::Down, 166*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_UP => MotionAction::Up, 167*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_MOVE => MotionAction::Move, 168*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_CANCEL => MotionAction::Cancel, 169*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_OUTSIDE => MotionAction::Outside, 170*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_POINTER_DOWN => { 171*38e8c45fSAndroid Build Coastguard Worker MotionAction::PointerDown { action_index } 172*38e8c45fSAndroid Build Coastguard Worker } 173*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_POINTER_UP => { 174*38e8c45fSAndroid Build Coastguard Worker MotionAction::PointerUp { action_index } 175*38e8c45fSAndroid Build Coastguard Worker } 176*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_HOVER_ENTER => MotionAction::HoverEnter, 177*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_HOVER_MOVE => MotionAction::HoverMove, 178*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_HOVER_EXIT => MotionAction::HoverExit, 179*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_SCROLL => MotionAction::Scroll, 180*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_BUTTON_PRESS => MotionAction::ButtonPress, 181*38e8c45fSAndroid Build Coastguard Worker input_bindgen::AMOTION_EVENT_ACTION_BUTTON_RELEASE => MotionAction::ButtonRelease, 182*38e8c45fSAndroid Build Coastguard Worker _ => panic!("Unknown action: {}", action), 183*38e8c45fSAndroid Build Coastguard Worker } 184*38e8c45fSAndroid Build Coastguard Worker } 185*38e8c45fSAndroid Build Coastguard Worker } 186*38e8c45fSAndroid Build Coastguard Worker 187*38e8c45fSAndroid Build Coastguard Worker impl MotionAction { breakdown_action(action: u32) -> (u32, usize)188*38e8c45fSAndroid Build Coastguard Worker fn breakdown_action(action: u32) -> (u32, usize) { 189*38e8c45fSAndroid Build Coastguard Worker let action_masked = action & input_bindgen::AMOTION_EVENT_ACTION_MASK; 190*38e8c45fSAndroid Build Coastguard Worker let index = (action & input_bindgen::AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) 191*38e8c45fSAndroid Build Coastguard Worker >> input_bindgen::AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; 192*38e8c45fSAndroid Build Coastguard Worker (action_masked, index.try_into().unwrap()) 193*38e8c45fSAndroid Build Coastguard Worker } 194*38e8c45fSAndroid Build Coastguard Worker } 195*38e8c45fSAndroid Build Coastguard Worker 196*38e8c45fSAndroid Build Coastguard Worker bitflags! { 197*38e8c45fSAndroid Build Coastguard Worker /// MotionEvent flags. 198*38e8c45fSAndroid Build Coastguard Worker /// The source of truth for the flag definitions are the MotionEventFlag AIDL enum. 199*38e8c45fSAndroid Build Coastguard Worker /// The flag values are redefined here as a bitflags API. 200*38e8c45fSAndroid Build Coastguard Worker #[derive(Debug)] 201*38e8c45fSAndroid Build Coastguard Worker pub struct MotionFlags: u32 { 202*38e8c45fSAndroid Build Coastguard Worker /// FLAG_WINDOW_IS_OBSCURED 203*38e8c45fSAndroid Build Coastguard Worker const WINDOW_IS_OBSCURED = MotionEventFlag::WINDOW_IS_OBSCURED.0 as u32; 204*38e8c45fSAndroid Build Coastguard Worker /// FLAG_WINDOW_IS_PARTIALLY_OBSCURED 205*38e8c45fSAndroid Build Coastguard Worker const WINDOW_IS_PARTIALLY_OBSCURED = MotionEventFlag::WINDOW_IS_PARTIALLY_OBSCURED.0 as u32; 206*38e8c45fSAndroid Build Coastguard Worker /// FLAG_HOVER_EXIT_PENDING 207*38e8c45fSAndroid Build Coastguard Worker const HOVER_EXIT_PENDING = MotionEventFlag::HOVER_EXIT_PENDING.0 as u32; 208*38e8c45fSAndroid Build Coastguard Worker /// FLAG_IS_GENERATED_GESTURE 209*38e8c45fSAndroid Build Coastguard Worker const IS_GENERATED_GESTURE = MotionEventFlag::IS_GENERATED_GESTURE.0 as u32; 210*38e8c45fSAndroid Build Coastguard Worker /// FLAG_CANCELED 211*38e8c45fSAndroid Build Coastguard Worker const CANCELED = MotionEventFlag::CANCELED.0 as u32; 212*38e8c45fSAndroid Build Coastguard Worker /// FLAG_NO_FOCUS_CHANGE 213*38e8c45fSAndroid Build Coastguard Worker const NO_FOCUS_CHANGE = MotionEventFlag::NO_FOCUS_CHANGE.0 as u32; 214*38e8c45fSAndroid Build Coastguard Worker /// PRIVATE_FLAG_SUPPORTS_ORIENTATION 215*38e8c45fSAndroid Build Coastguard Worker const PRIVATE_FLAG_SUPPORTS_ORIENTATION = 216*38e8c45fSAndroid Build Coastguard Worker MotionEventFlag::PRIVATE_FLAG_SUPPORTS_ORIENTATION.0 as u32; 217*38e8c45fSAndroid Build Coastguard Worker /// PRIVATE_FLAG_SUPPORTS_DIRECTIONAL_ORIENTATION 218*38e8c45fSAndroid Build Coastguard Worker const PRIVATE_FLAG_SUPPORTS_DIRECTIONAL_ORIENTATION = 219*38e8c45fSAndroid Build Coastguard Worker MotionEventFlag::PRIVATE_FLAG_SUPPORTS_DIRECTIONAL_ORIENTATION.0 as u32; 220*38e8c45fSAndroid Build Coastguard Worker /// FLAG_IS_ACCESSIBILITY_EVENT 221*38e8c45fSAndroid Build Coastguard Worker const IS_ACCESSIBILITY_EVENT = MotionEventFlag::IS_ACCESSIBILITY_EVENT.0 as u32; 222*38e8c45fSAndroid Build Coastguard Worker /// FLAG_TAINTED 223*38e8c45fSAndroid Build Coastguard Worker const TAINTED = MotionEventFlag::TAINTED.0 as u32; 224*38e8c45fSAndroid Build Coastguard Worker /// FLAG_TARGET_ACCESSIBILITY_FOCUS 225*38e8c45fSAndroid Build Coastguard Worker const TARGET_ACCESSIBILITY_FOCUS = MotionEventFlag::TARGET_ACCESSIBILITY_FOCUS.0 as u32; 226*38e8c45fSAndroid Build Coastguard Worker } 227*38e8c45fSAndroid Build Coastguard Worker } 228*38e8c45fSAndroid Build Coastguard Worker 229*38e8c45fSAndroid Build Coastguard Worker impl Source { 230*38e8c45fSAndroid Build Coastguard Worker /// Return true if this source is from the provided class is_from_class(&self, source_class: SourceClass) -> bool231*38e8c45fSAndroid Build Coastguard Worker pub fn is_from_class(&self, source_class: SourceClass) -> bool { 232*38e8c45fSAndroid Build Coastguard Worker let class_bits = source_class as u32; 233*38e8c45fSAndroid Build Coastguard Worker self.bits() & class_bits == class_bits 234*38e8c45fSAndroid Build Coastguard Worker } 235*38e8c45fSAndroid Build Coastguard Worker } 236*38e8c45fSAndroid Build Coastguard Worker 237*38e8c45fSAndroid Build Coastguard Worker bitflags! { 238*38e8c45fSAndroid Build Coastguard Worker /// Device class of the input device. These are duplicated from Eventhub.h 239*38e8c45fSAndroid Build Coastguard Worker /// We need to make sure the two version remain in sync when adding new classes. 240*38e8c45fSAndroid Build Coastguard Worker #[derive(Debug, PartialEq)] 241*38e8c45fSAndroid Build Coastguard Worker pub struct DeviceClass: u32 { 242*38e8c45fSAndroid Build Coastguard Worker /// The input device is a keyboard or has buttons 243*38e8c45fSAndroid Build Coastguard Worker const Keyboard = IInputConstants::DEVICE_CLASS_KEYBOARD as u32; 244*38e8c45fSAndroid Build Coastguard Worker /// The input device is an alpha-numeric keyboard (not just a dial pad) 245*38e8c45fSAndroid Build Coastguard Worker const AlphabeticKey = IInputConstants::DEVICE_CLASS_ALPHAKEY as u32; 246*38e8c45fSAndroid Build Coastguard Worker /// The input device is a touchscreen or a touchpad (either single-touch or multi-touch) 247*38e8c45fSAndroid Build Coastguard Worker const Touch = IInputConstants::DEVICE_CLASS_TOUCH as u32; 248*38e8c45fSAndroid Build Coastguard Worker /// The input device is a cursor device such as a trackball or mouse. 249*38e8c45fSAndroid Build Coastguard Worker const Cursor = IInputConstants::DEVICE_CLASS_CURSOR as u32; 250*38e8c45fSAndroid Build Coastguard Worker /// The input device is a multi-touch touchscreen or touchpad. 251*38e8c45fSAndroid Build Coastguard Worker const MultiTouch = IInputConstants::DEVICE_CLASS_TOUCH_MT as u32; 252*38e8c45fSAndroid Build Coastguard Worker /// The input device is a directional pad (implies keyboard, has DPAD keys). 253*38e8c45fSAndroid Build Coastguard Worker const Dpad = IInputConstants::DEVICE_CLASS_DPAD as u32; 254*38e8c45fSAndroid Build Coastguard Worker /// The input device is a gamepad (implies keyboard, has BUTTON keys). 255*38e8c45fSAndroid Build Coastguard Worker const Gamepad = IInputConstants::DEVICE_CLASS_GAMEPAD as u32; 256*38e8c45fSAndroid Build Coastguard Worker /// The input device has switches. 257*38e8c45fSAndroid Build Coastguard Worker const Switch = IInputConstants::DEVICE_CLASS_SWITCH as u32; 258*38e8c45fSAndroid Build Coastguard Worker /// The input device is a joystick (implies gamepad, has joystick absolute axes). 259*38e8c45fSAndroid Build Coastguard Worker const Joystick = IInputConstants::DEVICE_CLASS_JOYSTICK as u32; 260*38e8c45fSAndroid Build Coastguard Worker /// The input device has a vibrator (supports FF_RUMBLE). 261*38e8c45fSAndroid Build Coastguard Worker const Vibrator = IInputConstants::DEVICE_CLASS_VIBRATOR as u32; 262*38e8c45fSAndroid Build Coastguard Worker /// The input device has a microphone. 263*38e8c45fSAndroid Build Coastguard Worker const Mic = IInputConstants::DEVICE_CLASS_MIC as u32; 264*38e8c45fSAndroid Build Coastguard Worker /// The input device is an external stylus (has data we want to fuse with touch data). 265*38e8c45fSAndroid Build Coastguard Worker const ExternalStylus = IInputConstants::DEVICE_CLASS_EXTERNAL_STYLUS as u32; 266*38e8c45fSAndroid Build Coastguard Worker /// The input device has a rotary encoder 267*38e8c45fSAndroid Build Coastguard Worker const RotaryEncoder = IInputConstants::DEVICE_CLASS_ROTARY_ENCODER as u32; 268*38e8c45fSAndroid Build Coastguard Worker /// The input device has a sensor like accelerometer, gyro, etc 269*38e8c45fSAndroid Build Coastguard Worker const Sensor = IInputConstants::DEVICE_CLASS_SENSOR as u32; 270*38e8c45fSAndroid Build Coastguard Worker /// The input device has a battery 271*38e8c45fSAndroid Build Coastguard Worker const Battery = IInputConstants::DEVICE_CLASS_BATTERY as u32; 272*38e8c45fSAndroid Build Coastguard Worker /// The input device has sysfs controllable lights 273*38e8c45fSAndroid Build Coastguard Worker const Light = IInputConstants::DEVICE_CLASS_LIGHT as u32; 274*38e8c45fSAndroid Build Coastguard Worker /// The input device is a touchpad, requiring an on-screen cursor. 275*38e8c45fSAndroid Build Coastguard Worker const Touchpad = IInputConstants::DEVICE_CLASS_TOUCHPAD as u32; 276*38e8c45fSAndroid Build Coastguard Worker /// The input device is virtual (not a real device, not part of UI configuration). 277*38e8c45fSAndroid Build Coastguard Worker const Virtual = IInputConstants::DEVICE_CLASS_VIRTUAL as u32; 278*38e8c45fSAndroid Build Coastguard Worker /// The input device is external (not built-in). 279*38e8c45fSAndroid Build Coastguard Worker const External = IInputConstants::DEVICE_CLASS_EXTERNAL as u32; 280*38e8c45fSAndroid Build Coastguard Worker } 281*38e8c45fSAndroid Build Coastguard Worker } 282*38e8c45fSAndroid Build Coastguard Worker 283*38e8c45fSAndroid Build Coastguard Worker bitflags! { 284*38e8c45fSAndroid Build Coastguard Worker /// Modifier state flags 285*38e8c45fSAndroid Build Coastguard Worker #[derive(Default, Debug, Copy, Clone, Eq, PartialEq)] 286*38e8c45fSAndroid Build Coastguard Worker pub struct ModifierState: u32 { 287*38e8c45fSAndroid Build Coastguard Worker /// No meta keys are pressed 288*38e8c45fSAndroid Build Coastguard Worker const None = input_bindgen::AMETA_NONE; 289*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether one of the ALT meta keys is pressed 290*38e8c45fSAndroid Build Coastguard Worker const AltOn = input_bindgen::AMETA_ALT_ON; 291*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the left ALT meta key is pressed 292*38e8c45fSAndroid Build Coastguard Worker const AltLeftOn = input_bindgen::AMETA_ALT_LEFT_ON; 293*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the right ALT meta key is pressed 294*38e8c45fSAndroid Build Coastguard Worker const AltRightOn = input_bindgen::AMETA_ALT_RIGHT_ON; 295*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether one of the SHIFT meta keys is pressed 296*38e8c45fSAndroid Build Coastguard Worker const ShiftOn = input_bindgen::AMETA_SHIFT_ON; 297*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the left SHIFT meta key is pressed 298*38e8c45fSAndroid Build Coastguard Worker const ShiftLeftOn = input_bindgen::AMETA_SHIFT_LEFT_ON; 299*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the right SHIFT meta key is pressed 300*38e8c45fSAndroid Build Coastguard Worker const ShiftRightOn = input_bindgen::AMETA_SHIFT_RIGHT_ON; 301*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the SYM meta key is pressed 302*38e8c45fSAndroid Build Coastguard Worker const SymOn = input_bindgen::AMETA_SYM_ON; 303*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the FUNCTION meta key is pressed 304*38e8c45fSAndroid Build Coastguard Worker const FunctionOn = input_bindgen::AMETA_FUNCTION_ON; 305*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether one of the CTRL meta keys is pressed 306*38e8c45fSAndroid Build Coastguard Worker const CtrlOn = input_bindgen::AMETA_CTRL_ON; 307*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the left CTRL meta key is pressed 308*38e8c45fSAndroid Build Coastguard Worker const CtrlLeftOn = input_bindgen::AMETA_CTRL_LEFT_ON; 309*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the right CTRL meta key is pressed 310*38e8c45fSAndroid Build Coastguard Worker const CtrlRightOn = input_bindgen::AMETA_CTRL_RIGHT_ON; 311*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether one of the META meta keys is pressed 312*38e8c45fSAndroid Build Coastguard Worker const MetaOn = input_bindgen::AMETA_META_ON; 313*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the left META meta key is pressed 314*38e8c45fSAndroid Build Coastguard Worker const MetaLeftOn = input_bindgen::AMETA_META_LEFT_ON; 315*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the right META meta key is pressed 316*38e8c45fSAndroid Build Coastguard Worker const MetaRightOn = input_bindgen::AMETA_META_RIGHT_ON; 317*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the CAPS LOCK meta key is on 318*38e8c45fSAndroid Build Coastguard Worker const CapsLockOn = input_bindgen::AMETA_CAPS_LOCK_ON; 319*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the NUM LOCK meta key is on 320*38e8c45fSAndroid Build Coastguard Worker const NumLockOn = input_bindgen::AMETA_NUM_LOCK_ON; 321*38e8c45fSAndroid Build Coastguard Worker /// This mask is used to check whether the SCROLL LOCK meta key is on 322*38e8c45fSAndroid Build Coastguard Worker const ScrollLockOn = input_bindgen::AMETA_SCROLL_LOCK_ON; 323*38e8c45fSAndroid Build Coastguard Worker } 324*38e8c45fSAndroid Build Coastguard Worker } 325*38e8c45fSAndroid Build Coastguard Worker 326*38e8c45fSAndroid Build Coastguard Worker /// A rust enum representation of a Keyboard type. 327*38e8c45fSAndroid Build Coastguard Worker #[repr(u32)] 328*38e8c45fSAndroid Build Coastguard Worker #[derive(Debug, Default, Copy, Clone, Eq, PartialEq, Serialize, Deserialize)] 329*38e8c45fSAndroid Build Coastguard Worker #[serde(tag = "type")] 330*38e8c45fSAndroid Build Coastguard Worker pub enum KeyboardType { 331*38e8c45fSAndroid Build Coastguard Worker /// KEYBOARD_TYPE_NONE 332*38e8c45fSAndroid Build Coastguard Worker #[default] 333*38e8c45fSAndroid Build Coastguard Worker None = input_bindgen::AINPUT_KEYBOARD_TYPE_NONE, 334*38e8c45fSAndroid Build Coastguard Worker /// KEYBOARD_TYPE_NON_ALPHABETIC 335*38e8c45fSAndroid Build Coastguard Worker NonAlphabetic = input_bindgen::AINPUT_KEYBOARD_TYPE_NON_ALPHABETIC, 336*38e8c45fSAndroid Build Coastguard Worker /// KEYBOARD_TYPE_ALPHABETIC 337*38e8c45fSAndroid Build Coastguard Worker Alphabetic = input_bindgen::AINPUT_KEYBOARD_TYPE_ALPHABETIC, 338*38e8c45fSAndroid Build Coastguard Worker } 339*38e8c45fSAndroid Build Coastguard Worker 340*38e8c45fSAndroid Build Coastguard Worker #[cfg(test)] 341*38e8c45fSAndroid Build Coastguard Worker mod tests { 342*38e8c45fSAndroid Build Coastguard Worker use crate::input::SourceClass; 343*38e8c45fSAndroid Build Coastguard Worker use crate::MotionFlags; 344*38e8c45fSAndroid Build Coastguard Worker use crate::Source; 345*38e8c45fSAndroid Build Coastguard Worker use inputconstants::aidl::android::os::MotionEventFlag::MotionEventFlag; 346*38e8c45fSAndroid Build Coastguard Worker 347*38e8c45fSAndroid Build Coastguard Worker #[test] convert_source_class_pointer()348*38e8c45fSAndroid Build Coastguard Worker fn convert_source_class_pointer() { 349*38e8c45fSAndroid Build Coastguard Worker let source = Source::from_bits(input_bindgen::AINPUT_SOURCE_CLASS_POINTER).unwrap(); 350*38e8c45fSAndroid Build Coastguard Worker assert!(source.is_from_class(SourceClass::Pointer)); 351*38e8c45fSAndroid Build Coastguard Worker } 352*38e8c45fSAndroid Build Coastguard Worker 353*38e8c45fSAndroid Build Coastguard Worker /// Ensure all MotionEventFlag constants are re-defined in rust. 354*38e8c45fSAndroid Build Coastguard Worker #[test] all_motion_event_flags_defined()355*38e8c45fSAndroid Build Coastguard Worker fn all_motion_event_flags_defined() { 356*38e8c45fSAndroid Build Coastguard Worker for flag in MotionEventFlag::enum_values() { 357*38e8c45fSAndroid Build Coastguard Worker assert!( 358*38e8c45fSAndroid Build Coastguard Worker MotionFlags::from_bits(flag.0 as u32).is_some(), 359*38e8c45fSAndroid Build Coastguard Worker "MotionEventFlag value {flag:?} is not redefined as a rust MotionFlags" 360*38e8c45fSAndroid Build Coastguard Worker ); 361*38e8c45fSAndroid Build Coastguard Worker } 362*38e8c45fSAndroid Build Coastguard Worker } 363*38e8c45fSAndroid Build Coastguard Worker } 364