Rewrite input handling for native applications

Bug: 8473020
Change-Id: Ic4353d8924ab877bec21aff8c2dba9fe725bf906
diff --git a/native/android/input.cpp b/native/android/input.cpp
index accec64..7ac73c7 100644
--- a/native/android/input.cpp
+++ b/native/android/input.cpp
@@ -25,12 +25,15 @@
 #include <utils/Vector.h>
 
 #include <android_runtime/android_app_NativeActivity.h>
+#include <android_runtime/android_view_InputQueue.h>
 
 #include <poll.h>
 #include <errno.h>
 
 using android::InputEvent;
+using android::InputQueue;
 using android::KeyEvent;
+using android::Looper;
 using android::MotionEvent;
 using android::sp;
 using android::Vector;
@@ -269,25 +272,37 @@
 
 void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
         int ident, ALooper_callbackFunc callback, void* data) {
-    queue->attachLooper(looper, ident, callback, data);
+    InputQueue* iq = static_cast<InputQueue*>(queue);
+    Looper* l = static_cast<Looper*>(looper);
+    iq->attachLooper(l, ident, callback, data);
 }
 
 void AInputQueue_detachLooper(AInputQueue* queue) {
-    queue->detachLooper();
+    InputQueue* iq = static_cast<InputQueue*>(queue);
+    iq->detachLooper();
 }
 
 int32_t AInputQueue_hasEvents(AInputQueue* queue) {
-    return queue->hasEvents();
+    InputQueue* iq = static_cast<InputQueue*>(queue);
+    return iq->hasEvents();
 }
 
 int32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent) {
-    return queue->getEvent(outEvent);
+    InputQueue* iq = static_cast<InputQueue*>(queue);
+    InputEvent* event;
+    int32_t res = iq->getEvent(&event);
+    *outEvent = event;
+    return res;
 }
 
 int32_t AInputQueue_preDispatchEvent(AInputQueue* queue, AInputEvent* event) {
-    return queue->preDispatchEvent(event) ? 1 : 0;
+    InputQueue* iq = static_cast<InputQueue*>(queue);
+    InputEvent* e = static_cast<InputEvent*>(event);
+    return iq->preDispatchEvent(e) ? 1 : 0;
 }
 
 void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled) {
-    queue->finishEvent(event, handled != 0, false);
+    InputQueue* iq = static_cast<InputQueue*>(queue);
+    InputEvent* e = static_cast<InputEvent*>(event);
+    iq->finishEvent(e, handled != 0);
 }