UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AndroidInputInterface.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
4
5#include <android/input.h>
6#include <android/keycodes.h>
7#include <android/api-level.h>
11#include "Math/Vector.h"
12#include "Math/Vector2D.h"
13#include "Math/Color.h"
14
15#if __ANDROID_API__ < 13
16
17// Joystick functions and constants only available API level 13 and above
18// Definitions are provided to allow compiling against lower API levels, but
19// still using the features when available.
20
21enum
22{
65};
66enum
67{
69};
70enum
71{
74};
75#endif // __ANDROID_API__ < 13
76
83
90
92{
93 Added = 0,
94 Removed,
96};
97
105
113
122
143
152
153#define MAX_NUM_CONTROLLERS 8 // reasonable limit for now
154#define MAX_NUM_PHYSICAL_CONTROLLER_BUTTONS 18
155#define MAX_NUM_VIRTUAL_CONTROLLER_BUTTONS 8
156#define MAX_NUM_CONTROLLER_BUTTONS MAX_NUM_PHYSICAL_CONTROLLER_BUTTONS + MAX_NUM_VIRTUAL_CONTROLLER_BUTTONS
157#define MAX_DEFERRED_MESSAGE_QUEUE_SIZE 128
158
160{
161 // ID of the controller
163
164 // Current button states and the next time a repeat event should be generated for each button
167
168 // Raw analog values for various axes (sticks and triggers)
169 float LXAnalog;
170 float LYAnalog;
171 float RXAnalog;
172 float RYAnalog;
173 float LTAnalog;
174 float RTAnalog;
175};
176
184
186{
191
193 {
194 Init(DeviceName);
195 }
196
197 void Init(const FName DeviceName);
198
205
206 // Type of controller
208
209 // Type of button remapping to use
211
212 // Sets the analog range of the trigger minimum (normally 0). Final value is mapped as (input - Minimum) / (1 - Minimum) to [0,1] output.
215
216 // Device supports hat as dpad
217 bool SupportsHat = true;
218
219 // Device uses threshold to send button pressed events.
221
222 // Map L1 and R1 to LTRIGGER and RTRIGGER
223 bool MapL1R1ToTriggers = false;
224
225 // Map Z and RZ to LTAnalog and RTAnalog
226 bool MapZRZToTriggers = false;
227
228 // Right stick on Z/RZ
229 bool RightStickZRZ = true;
230
231 // Right stick on RX/RY
232 bool RightStickRXRY = false;
233
234 // Map RX and RY to LTAnalog and RTAnalog
235 bool MapRXRYToTriggers = false;
236
240};
241
247
249{
251
253 union
254 {
255 struct
256 {
260 bool isRepeat{};
261 }
263
264 };
265};
266
271{
272public:
273
275
276
277public:
278
280
282
284 void Tick( float DeltaTime );
285
290
292
294 static void ResetGamepadAssignmentToController(int32 ControllerId);
295 static bool IsControllerAssignedToGamepad(int32 ControllerId);
296 static const FInputDeviceId GetMappedInputDeviceId(int32 ControllerId);
297 static const FName GetGamepadControllerName(int32 ControllerId);
298
300
303
305 static void MouseMoveEvent(int32 deviceId, float absoluteX, float absoluteY, float deltaX, float deltaY);
308
310
311 static void QueueMotionData(const FVector& Tilt, const FVector& RotationRate, const FVector& Gravity, const FVector& Acceleration);
312
316 virtual void SetForceFeedbackChannelValue(int32 ControllerId, FForceFeedbackChannelType ChannelType, float Value) override;
317 virtual void SetForceFeedbackChannelValues(int32 ControllerId, const FForceFeedbackValues &values) override;
318 virtual void SetHapticFeedbackValues(int32 ControllerId, int32 Hand, const FHapticFeedbackValues& Values) override;
319 virtual void SetLightColor(int32 ControllerId, FColor Color) override;
320 virtual void ResetLightColor(int32 ControllerId) override;
321
322 void SetGamepadsAllowed(bool bAllowed) { bAllowControllers = bAllowed; }
323 void SetGamepadsBlockDeviceFeedback(bool bBlock) { bControllersBlockDeviceFeedback = bBlock; }
324
325 virtual bool IsGamepadAttached() const;
326
327
329
330 const TSharedPtr< ICursor > GetCursor() const { return Cursor; }
331
332private:
333
335
336 static bool GetInputDeviceByDeviceId(int32 DeviceId, FAndroidInputDeviceInfo** OutDeviceInfo, FAndroidGamepadDeviceMapping** OutDeviceData = nullptr);
337 static bool GetInputDeviceByControllerId(int32 ControllerId, FAndroidInputDeviceInfo** OutDeviceInfo, FAndroidGamepadDeviceMapping** OutDeviceData = nullptr);
338
339 static void MapControllerToPlayer(const FString& ControllerDesciptor, EInputDeviceConnectionState State);
340 static void AddPendingInputDevice(int32 DeviceId, InputDeviceType DeviceType);
341 static void RemoveInputDevice(int32 DeviceId);
342 static void DumpInputDevices();
343
344public:
345
347
348private:
349
351 static int32 FindControllerId(int32 DeviceId);
352
354 void UpdateVibeMotors();
355
357 void UpdateControllerVibeMotors(int32 DeviceId, ControllerClassType ControllerClass, FAndroidControllerVibeState& State);
358
359 struct MotionData
360 {
361 FVector Tilt;
362 FVector RotationRate;
364 FVector Acceleration;
365 };
366
367 enum MouseEventType
368 {
369 MouseMove,
370 MouseWheel,
371 MouseButtonDown,
372 MouseButtonUp
373 };
374
375 struct MouseData
376 {
377 MouseEventType EventType;
379 int32 AbsoluteX;
380 int32 AbsoluteY;
381 int32 DeltaX;
382 int32 DeltaY;
383 float WheelDelta;
384 };
385
386 // protects the input stack
387 static FCriticalSection TouchInputCriticalSection;
388
389 static TArray<TouchInput> TouchInputStack;
390
392 static int32 CurrentVibeIntensity;
393 // Maximum time vibration will be triggered without an update
394 static int32 MaxVibeTime;
395 static double LastVibeUpdateTime;
396 static FForceFeedbackValues VibeValues;
397
398 // should we allow controllers to send input
399 static bool bAllowControllers;
400
401 // bluetooth connected controllers will block force feedback.
402 static bool bControllersBlockDeviceFeedback;
403
404 // should we allow controllers to send Android_Back and Android_Menu events
405 static bool bBlockAndroidKeysOnControllers;
406
407 static TInputDeviceMap<FString> InternalDeviceIdMappings;
408 static TArray<int32/*Android DeviceId*/> GameControllerIdMapping;
409 static TMap<int32/*Android deviceId*/, FAndroidInputDeviceInfo> InputDeviceInfoMap;
410 static TMap<FInputDeviceId, FAndroidGamepadDeviceMapping> GameControllerDataMap;
411
412 static FName InputClassName_DefaultMobileTouch;
413 static FName InputClassName_DefaultGamepad;
414 // The following two vars should be FName. Waiting for a refactoring of the FInputDeviceScope's ctor
415 static FString HardwareDeviceIdentifier_DefaultMobileTouch;
416 static FString HardwareDeviceIdentifier_DefaultGamepad;
417
419
420 static float InitialButtonRepeatDelay;
421 static float ButtonRepeatDelay;
422
424 static int32 DeferredMessageQueueLastEntryIndex;
425 static int32 DeferredMessageQueueDroppedCount;
426
427 static TArray<MotionData> MotionDataStack;
428 static TArray<MouseData> MouseDataStack;
429
431 const TSharedPtr< ICursor > Cursor;
432
434 TArray<TSharedPtr<class IInputDevice>> ExternalInputDevices;
435};
#define MAX_NUM_CONTROLLER_BUTTONS
Definition AndroidInputInterface.h:156
@ AMOTION_EVENT_AXIS_HAT_X
Definition AndroidInputInterface.h:38
@ AMOTION_EVENT_AXIS_ORIENTATION
Definition AndroidInputInterface.h:31
@ AMOTION_EVENT_AXIS_RTRIGGER
Definition AndroidInputInterface.h:41
@ AMOTION_EVENT_AXIS_GENERIC_7
Definition AndroidInputInterface.h:55
@ AMOTION_EVENT_AXIS_GENERIC_10
Definition AndroidInputInterface.h:58
@ AMOTION_EVENT_AXIS_RUDDER
Definition AndroidInputInterface.h:43
@ AMOTION_EVENT_AXIS_GENERIC_4
Definition AndroidInputInterface.h:52
@ AMOTION_EVENT_AXIS_RZ
Definition AndroidInputInterface.h:37
@ AMOTION_EVENT_AXIS_PRESSURE
Definition AndroidInputInterface.h:25
@ AMOTION_EVENT_AXIS_SIZE
Definition AndroidInputInterface.h:26
@ AMOTION_EVENT_AXIS_Z
Definition AndroidInputInterface.h:34
@ AMOTION_EVENT_AXIS_GENERIC_13
Definition AndroidInputInterface.h:61
@ AMOTION_EVENT_AXIS_X
Definition AndroidInputInterface.h:23
@ AMOTION_EVENT_AXIS_Y
Definition AndroidInputInterface.h:24
@ AMOTION_EVENT_AXIS_RX
Definition AndroidInputInterface.h:35
@ AMOTION_EVENT_AXIS_THROTTLE
Definition AndroidInputInterface.h:42
@ AMOTION_EVENT_AXIS_GENERIC_9
Definition AndroidInputInterface.h:57
@ AMOTION_EVENT_AXIS_TOUCH_MAJOR
Definition AndroidInputInterface.h:27
@ AMOTION_EVENT_AXIS_GENERIC_15
Definition AndroidInputInterface.h:63
@ AMOTION_EVENT_AXIS_HSCROLL
Definition AndroidInputInterface.h:33
@ AMOTION_EVENT_AXIS_HAT_Y
Definition AndroidInputInterface.h:39
@ AMOTION_EVENT_AXIS_GENERIC_5
Definition AndroidInputInterface.h:53
@ AMOTION_EVENT_AXIS_RY
Definition AndroidInputInterface.h:36
@ AMOTION_EVENT_AXIS_TOOL_MAJOR
Definition AndroidInputInterface.h:29
@ AMOTION_EVENT_AXIS_TOUCH_MINOR
Definition AndroidInputInterface.h:28
@ AMOTION_EVENT_AXIS_GENERIC_16
Definition AndroidInputInterface.h:64
@ AMOTION_EVENT_AXIS_GENERIC_6
Definition AndroidInputInterface.h:54
@ AMOTION_EVENT_AXIS_GAS
Definition AndroidInputInterface.h:45
@ AMOTION_EVENT_AXIS_WHEEL
Definition AndroidInputInterface.h:44
@ AMOTION_EVENT_AXIS_GENERIC_8
Definition AndroidInputInterface.h:56
@ AMOTION_EVENT_AXIS_GENERIC_2
Definition AndroidInputInterface.h:50
@ AMOTION_EVENT_AXIS_GENERIC_3
Definition AndroidInputInterface.h:51
@ AMOTION_EVENT_AXIS_VSCROLL
Definition AndroidInputInterface.h:32
@ AMOTION_EVENT_AXIS_GENERIC_14
Definition AndroidInputInterface.h:62
@ AMOTION_EVENT_AXIS_GENERIC_1
Definition AndroidInputInterface.h:49
@ AMOTION_EVENT_AXIS_TOOL_MINOR
Definition AndroidInputInterface.h:30
@ AMOTION_EVENT_AXIS_BRAKE
Definition AndroidInputInterface.h:46
@ AMOTION_EVENT_AXIS_LTRIGGER
Definition AndroidInputInterface.h:40
@ AMOTION_EVENT_AXIS_GENERIC_12
Definition AndroidInputInterface.h:60
@ AMOTION_EVENT_AXIS_DISTANCE
Definition AndroidInputInterface.h:47
@ AMOTION_EVENT_AXIS_GENERIC_11
Definition AndroidInputInterface.h:59
@ AMOTION_EVENT_AXIS_TILT
Definition AndroidInputInterface.h:48
@ AINPUT_SOURCE_CLASS_JOYSTICK
Definition AndroidInputInterface.h:68
ButtonRemapType
Definition AndroidInputInterface.h:115
@ PS4
Definition AndroidInputInterface.h:118
@ PS5New
Definition AndroidInputInterface.h:120
@ PS5
Definition AndroidInputInterface.h:119
@ Normal
Definition AndroidInputInterface.h:116
@ XBox
Definition AndroidInputInterface.h:117
#define MAX_DEFERRED_MESSAGE_QUEUE_SIZE
Definition AndroidInputInterface.h:157
MappingState
Definition AndroidInputInterface.h:99
@ ToActivate
Definition AndroidInputInterface.h:101
@ Valid
Definition AndroidInputInterface.h:103
@ ToValidate
Definition AndroidInputInterface.h:102
@ Unassigned
Definition AndroidInputInterface.h:100
InputDeviceStateEvent
Definition AndroidInputInterface.h:92
FAndroidMessageType
Definition AndroidInputInterface.h:243
@ MessageType_KeyDown
Definition AndroidInputInterface.h:244
@ MessageType_KeyUp
Definition AndroidInputInterface.h:245
InputDeviceType
Definition AndroidInputInterface.h:78
@ GameController
Definition AndroidInputInterface.h:81
@ UnknownInputDeviceType
Definition AndroidInputInterface.h:79
@ TouchScreen
Definition AndroidInputInterface.h:80
ControllerClassType
Definition AndroidInputInterface.h:107
@ XBoxWired
Definition AndroidInputInterface.h:109
@ XBoxWireless
Definition AndroidInputInterface.h:110
@ PlaystationWireless
Definition AndroidInputInterface.h:111
@ Generic
Definition AndroidInputInterface.h:108
TouchType
Definition AndroidInputInterface.h:85
@ TouchBegan
Definition AndroidInputInterface.h:86
@ TouchMoved
Definition AndroidInputInterface.h:87
@ TouchEnded
Definition AndroidInputInterface.h:88
@ AINPUT_SOURCE_GAMEPAD
Definition AndroidInputInterface.h:72
@ AINPUT_SOURCE_JOYSTICK
Definition AndroidInputInterface.h:73
EGLSurface EGLint const EGLint EGLnsecsANDROID * values
Definition AndroidOpenGLFunctions.h:11
EInputDeviceConnectionState
Definition CoreMiscDefines.h:594
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
FForceFeedbackChannelType
Definition IInputInterface.h:17
TouchType
Definition IOSInputInterface.h:58
void Init()
Definition LockFreeList.h:4
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition AndroidInputInterface.h:271
virtual void SetLightColor(int32 ControllerId, FColor Color) override
void SetMessageHandler(const TSharedRef< FGenericApplicationMessageHandler > &InMessageHandler)
static void ResetGamepadAssignmentToController(int32 ControllerId)
static const FInputDeviceId GetMappedInputDeviceId(int32 ControllerId)
static void DeferMessage(const FDeferredAndroidMessage &DeferredMessage)
static void MouseButtonEvent(int32 deviceId, int32 buttonId, bool buttonDown)
virtual void SetForceFeedbackChannelValue(int32 ControllerId, FForceFeedbackChannelType ChannelType, float Value) override
static void MouseWheelEvent(int32 deviceId, float wheelDelta)
static void QueueMotionData(const FVector &Tilt, const FVector &RotationRate, const FVector &Gravity, const FVector &Acceleration)
virtual void ResetLightColor(int32 ControllerId) override
ControllerClassType GetControllerClass(int32 ControllerId) const
virtual void SetHapticFeedbackValues(int32 ControllerId, int32 Hand, const FHapticFeedbackValues &Values) override
static void JoystickButtonEvent(int32 deviceId, int32 buttonId, bool buttonDown)
static const FName GetGamepadControllerName(int32 ControllerId)
virtual bool IsGamepadAttached() const
static int32 GetAlternateKeyEventForMouse(int32 deviceId, int32 buttonId)
static void QueueTouchInput(const TArray< TouchInput > &InTouchEvents)
const TSharedPtr< ICursor > GetCursor() const
Definition AndroidInputInterface.h:330
static void JoystickAxisEvent(int32 deviceId, int32 axisId, float axisValue)
static bool IsControllerAssignedToGamepad(int32 ControllerId)
void SetGamepadsBlockDeviceFeedback(bool bBlock)
Definition AndroidInputInterface.h:323
void Tick(float DeltaTime)
static void ResetGamepadAssignments()
void SetGamepadsAllowed(bool bAllowed)
Definition AndroidInputInterface.h:322
static void HandleInputDeviceStateEvent(int32 DeviceId, InputDeviceStateEvent StateEvent, InputDeviceType DeviceType)
virtual void AddExternalInputDevice(TSharedPtr< class IInputDevice > InputDevice)
static TSharedRef< FAndroidInputInterface > Create(const TSharedRef< FGenericApplicationMessageHandler > &InMessageHandler, const TSharedPtr< ICursor > &InCursor)
virtual void SetForceFeedbackChannelValues(int32 ControllerId, const FForceFeedbackValues &values) override
static void MouseMoveEvent(int32 deviceId, float absoluteX, float absoluteY, float deltaX, float deltaY)
Definition NameTypes.h:617
Definition IInputInterface.h:309
Definition InputDevice.Build.cs:6
Definition Array.h:670
Definition GenericInputDeviceMap.h:20
Definition UnrealString.h.inl:34
Definition SharedPointer.h:153
Type
Definition GenericApplicationMessageHandler.h:18
Definition AndroidInputInterface.h:160
double NextRepeatTime[MAX_NUM_CONTROLLER_BUTTONS]
Definition AndroidInputInterface.h:166
float LXAnalog
Definition AndroidInputInterface.h:169
float RYAnalog
Definition AndroidInputInterface.h:172
bool ButtonStates[MAX_NUM_CONTROLLER_BUTTONS]
Definition AndroidInputInterface.h:165
float RXAnalog
Definition AndroidInputInterface.h:171
float RTAnalog
Definition AndroidInputInterface.h:174
int32 DeviceId
Definition AndroidInputInterface.h:162
float LTAnalog
Definition AndroidInputInterface.h:173
float LYAnalog
Definition AndroidInputInterface.h:170
Definition AndroidInputInterface.h:178
FForceFeedbackValues VibeValues
Definition AndroidInputInterface.h:179
double LastVibeUpdateTime
Definition AndroidInputInterface.h:182
int32 RightIntensity
Definition AndroidInputInterface.h:181
int32 LeftIntensity
Definition AndroidInputInterface.h:180
Definition AndroidInputInterface.h:186
bool TriggersUseThresholdForClick
Definition AndroidInputInterface.h:220
float RTAnalogRangeMinimum
Definition AndroidInputInterface.h:214
FAndroidGamepadDeviceMapping()
Definition AndroidInputInterface.h:187
bool RightStickZRZ
Definition AndroidInputInterface.h:229
FAndroidControllerVibeState ControllerVibeState
Definition AndroidInputInterface.h:239
ButtonRemapType ButtonRemapping
Definition AndroidInputInterface.h:210
bool RightStickRXRY
Definition AndroidInputInterface.h:232
FAndroidGamepadDeviceMapping(const FName DeviceName)
Definition AndroidInputInterface.h:192
bool MapRXRYToTriggers
Definition AndroidInputInterface.h:235
bool MapL1R1ToTriggers
Definition AndroidInputInterface.h:223
float LTAnalogRangeMinimum
Definition AndroidInputInterface.h:213
FAndroidControllerData OldControllerData
Definition AndroidInputInterface.h:237
bool SupportsHat
Definition AndroidInputInterface.h:217
void Init(const FName DeviceName)
void ResetRuntimeData()
Definition AndroidInputInterface.h:199
FAndroidControllerData NewControllerData
Definition AndroidInputInterface.h:238
ControllerClassType ControllerClass
Definition AndroidInputInterface.h:207
bool MapZRZToTriggers
Definition AndroidInputInterface.h:226
Definition AndroidInputInterface.h:124
MappingState DeviceState
Definition AndroidInputInterface.h:140
FString Descriptor
Definition AndroidInputInterface.h:135
int32 DataIndex
Definition AndroidInputInterface.h:141
int32 DeviceId
Definition AndroidInputInterface.h:130
int32 FeedbackMotorCount
Definition AndroidInputInterface.h:136
FAndroidInputDeviceInfo()
Definition AndroidInputInterface.h:125
bool IsExternal
Definition AndroidInputInterface.h:137
int32 ProductId
Definition AndroidInputInterface.h:132
int32 VendorId
Definition AndroidInputInterface.h:131
int32 ControllerId
Definition AndroidInputInterface.h:133
FName Name
Definition AndroidInputInterface.h:134
InputDeviceType DeviceType
Definition AndroidInputInterface.h:139
Definition Color.h:486
Definition AndroidInputInterface.h:249
FAndroidMessageType messageType
Definition AndroidInputInterface.h:252
FDeferredAndroidMessage()
Definition AndroidInputInterface.h:250
bool isRepeat
Definition AndroidInputInterface.h:260
int32 keyId
Definition AndroidInputInterface.h:257
int32 unichar
Definition AndroidInputInterface.h:258
uint32 modifier
Definition AndroidInputInterface.h:259
struct FDeferredAndroidMessage::@42::@44 KeyEventData
Definition IInputInterface.h:26
Definition IInputInterface.h:70
Definition CoreMiscDefines.h:524
static UE_FORCEINLINE_HINT void * Memset(void *Dest, uint8 Char, SIZE_T Count)
Definition UnrealMemory.h:119
Definition AndroidInputInterface.h:145
int32 Handle
Definition AndroidInputInterface.h:147
FVector2D LastPosition
Definition AndroidInputInterface.h:149
int32 DeviceId
Definition AndroidInputInterface.h:146
TouchType Type
Definition AndroidInputInterface.h:148
FVector2D Position
Definition AndroidInputInterface.h:150