Advertisement
swierzbicki

Delphi Tokyo - Android special key handler

Mar 27th, 2017
597
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.99 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.     function MyHandleAndroidInputEvent(const App: TAndroidApplicationGlue; const AEvent: PAInputEvent): Int32 ;
  38.     constructor Create;
  39.     destructor Destroy; override;
  40.     property Active: Boolean read FActive write SetActive;
  41.  
  42.   end;
  43.  
  44. var
  45.   LastInstance: THandheld;
  46.   OldHandledAndroidInputEvent : TOnInputEvent;
  47. implementation
  48.  
  49.  
  50. constructor THandheld.Create;
  51. begin
  52.   inherited;
  53.  
  54.   LastInstance:=Self;
  55.   OnKeyUp:=nil;
  56.   OnKeyDown:=nil;
  57.  
  58.   Factive := false;
  59.   OldHandledAndroidInputEvent := TAndroidApplicationGlue.Current.OnInputEvent;
  60.   TAndroidApplicationGlue.Current.OnInputEvent := MyHandleAndroidInputEvent;
  61. end;
  62.  
  63. destructor THandheld.Destroy;
  64. begin
  65.   TAndroidApplicationGlue.Current.OnInputEvent := OldHandledAndroidInputEvent;
  66.   LastInstance := nil;
  67.   inherited;
  68. end;
  69.  
  70. function THandheld.MyHandleAndroidInputEvent(const App: TAndroidApplicationGlue;
  71.   const AEvent: PAInputEvent): Int32;
  72. var
  73.   EventType: Int64;
  74. begin
  75.   Result := OldHandledAndroidInputEvent(App, AEvent);
  76.  
  77.   EventType := AInputEvent_getType(AEvent);
  78.   if EventType = AINPUT_EVENT_TYPE_KEY then
  79.     if Assigned(LastInstance) then
  80.       LastInstance.MyHandleAndroidKeyEvent(AEvent); // Keyboard input
  81. end;
  82.  
  83. function THandheld.MyHandleAndroidKeyEvent(AEvent: PAInputEvent): Int32;
  84. var
  85.   KeyCode, vkKeyCode, ScanCode: Word;
  86.   KeyKind: TKeyKind;
  87. begin
  88.   Result := 0;
  89.  
  90.   KeyCode := AKeyEvent_getKeyCode(AEvent);
  91.   vkKeyCode := PlatformKeyToVirtualKey(KeyCode, KeyKind);
  92.   //Read special (unknown keys)
  93.  
  94.   if (vkKeyCode = 0) and (KeyKind = TKeyKind.Unknown) then
  95.   begin
  96.     case AKeyEvent_getAction(AEvent) of
  97.       AKEY_EVENT_ACTION_DOWN:
  98.         begin
  99.           ScanCode := AKeyEvent_getScanCode(AEvent);
  100.           if Assigned(OnKeyDown) then OnKeyDown(Scancode);
  101.         end;
  102.       AKEY_EVENT_ACTION_UP:
  103.         begin
  104.           ScanCode := AKeyEvent_getScanCode(AEvent);
  105.           if Assigned(OnKeyUp) then OnKeyUp(Scancode);
  106.         end;
  107.     end;
  108.   end;
  109. end;
  110.  
  111. procedure THandheld.SetActive(const Value: Boolean);
  112. begin
  113.   FActive := Value;
  114. end;
  115.  
  116. initialization
  117.   LastInstance:=nil;
  118.  
  119. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement