Advertisement
swierzbicki

Up to Delphi Berlin : Android special key handler

Mar 27th, 2017
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.85 KB | None | 0 0
  1. unit Androidapi.Handheld;
  2.  
  3. interface
  4.  
  5. uses
  6.   System.SysUtils,
  7.   FMX.Types,
  8.   FMX.Dialogs,
  9.   FMX.Platform.Android,
  10.   FMX.KeyMapping,
  11.   Androidapi.Appglue,
  12.   Androidapi.Input;
  13.  
  14. type
  15.   TOnScannerCompleted = procedure(ScanFormat, ScanContent: string) of object;
  16.   TOnScannerError = procedure(ResultCode: Integer) of object;
  17.  
  18. type
  19.   TOnKeyUpHandheld = procedure (Keycode: Word) of object;
  20.   TOnKeyDownHandheld = procedure (Keycode: Word) of object;
  21.  
  22.   THandheld = class(TObject)
  23.   private
  24.  
  25.     { Private declarations }
  26.     function MyHandleAndroidKeyEvent(AEvent: PAInputEvent): Int32;
  27.     procedure SetActive(const Value: Boolean);
  28.   protected
  29.     FActive: Boolean;
  30.   public
  31.     { Public declarations }
  32.     OnKeyUp: TOnKeyUpHandheld;
  33.     OnKeyDown: TOnKeyDownHandheld;
  34.     OnScannerCompleted: TOnScannerCompleted;
  35.     OnScannerError: TOnScannerError;
  36.     procedure DoScan;virtual;abstract;
  37.     constructor Create;
  38.     destructor Destroy; override;
  39.     property Active: Boolean read FActive write SetActive;
  40.  
  41.   end;
  42.  
  43. var
  44.   LastInstance: THandheld;
  45.   OldHandleAndroidInputEvent: function(App: PAndroid_app; Event: PAInputEvent): Int32; cdecl;
  46.  
  47. implementation
  48.  
  49. function MyHandleAndroidInputEvent(var App: PAndroid_app; AEvent: PAInputEvent): Int32; cdecl;
  50. var
  51.   EventType: Int64;
  52. begin
  53.   Result := OldHandleAndroidInputEvent(App, AEvent);
  54.  
  55.   EventType := AInputEvent_getType(AEvent);
  56.   if EventType = AINPUT_EVENT_TYPE_KEY then
  57.     if Assigned(LastInstance) then
  58.       LastInstance.MyHandleAndroidKeyEvent(AEvent); // Keyboard input
  59. end;
  60.  
  61. constructor THandheld.Create;
  62. begin
  63.   inherited;
  64.  
  65.   LastInstance:=Self;
  66.   OnKeyUp:=nil;
  67.   OnKeyDown:=nil;
  68.  
  69.   Factive := false;
  70.   OldHandleAndroidInputEvent := GetAndroidApp^.onInputEvent;
  71.   GetAndroidApp^.onInputEvent := @MyHandleAndroidInputEvent;
  72. end;
  73.  
  74. destructor THandheld.Destroy;
  75. begin
  76.   GetAndroidApp^.onInputEvent := OldHandleAndroidInputEvent;
  77.   LastInstance := nil;
  78.   inherited;
  79. end;
  80.  
  81. function THandheld.MyHandleAndroidKeyEvent(AEvent: PAInputEvent): Int32;
  82. var
  83.   KeyCode, vkKeyCode, ScanCode: Word;
  84.   KeyKind: TKeyKind;
  85. begin
  86.   Result := 0;
  87.  
  88.   KeyCode := AKeyEvent_getKeyCode(AEvent);
  89.   vkKeyCode := PlatformKeyToVirtualKey(KeyCode, KeyKind);
  90.   //Read special (unknown keys)
  91.  
  92.   if (vkKeyCode = 0) and (KeyKind = TKeyKind.Unknown) then
  93.   begin
  94.     case AKeyEvent_getAction(AEvent) of
  95.       AKEY_EVENT_ACTION_DOWN:
  96.         begin
  97.           ScanCode := AKeyEvent_getScanCode(AEvent);
  98.           if Assigned(OnKeyDown) then OnKeyDown(Scancode);
  99.         end;
  100.       AKEY_EVENT_ACTION_UP:
  101.         begin
  102.           ScanCode := AKeyEvent_getScanCode(AEvent);
  103.           if Assigned(OnKeyUp) then OnKeyUp(Scancode);
  104.         end;
  105.     end;
  106.   end;
  107. end;
  108.  
  109. procedure THandheld.SetActive(const Value: Boolean);
  110. begin
  111.   FActive := Value;
  112. end;
  113.  
  114. initialization
  115.   LastInstance:=nil;
  116.  
  117. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement