android_app_NativeActivity.h revision 2c6081ce3593712f30dacd990a97209c791d6ced
154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn/* 254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Copyright (C) 2010 The Android Open Source Project 354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * 454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * you may not use this file except in compliance with the License. 654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * You may obtain a copy of the License at 754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * 854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * 1054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * Unless required by applicable law or agreed to in writing, software 1154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1254a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * See the License for the specific language governing permissions and 1454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn * limitations under the License. 1554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn */ 1654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 17289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#ifndef _ANDROID_APP_NATIVEACTIVITY_H 18289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#define _ANDROID_APP_NATIVEACTIVITY_H 1954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 20d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn#include <ui/InputTransport.h> 21d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 22289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android/native_activity.h> 2354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 2454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn#include "jni.h" 2554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 2654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackbornnamespace android { 2754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 28289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornextern void android_NativeActivity_setWindowFormat( 29289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t format); 30289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 31289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornextern void android_NativeActivity_setWindowFlags( 32289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t values, int32_t mask); 33289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 34d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornextern void android_NativeActivity_showSoftInput( 35d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags); 36d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 37d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornextern void android_NativeActivity_hideSoftInput( 38d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags); 3954a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 4054a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn} // namespace android 4154a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 42d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 43d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn/* 44d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn * NDK input queue API. 452c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * 462c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * Here is the event flow: 472c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * 1. Event arrives in input consumer, and is returned by getEvent(). 482c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * 2. Application calls preDispatchEvent(): 492c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * a. Event is assigned a sequence ID and enqueued in mPreDispatchingKeys. 502c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * b. Main thread picks up event, hands to input method. 512c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * c. Input method eventually returns sequence # and whether it was handled. 522c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * d. finishPreDispatch() is called to enqueue the information. 532c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * e. next getEvent() call will: 542c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * - finish any pre-dispatch events that the input method handled 552c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * - return the next pre-dispatched event that the input method didn't handle. 562c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * f. (A preDispatchEvent() call on this event will now return false). 572c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * 3. Application calls finishEvent() with whether it was handled. 582c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * - If handled is true, the event is finished. 592c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * - If handled is false, the event is put on mUnhandledKeys, and: 602c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * a. Main thread receives event from consumeUnhandledEvent(). 612c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * b. Java sends event through default key handler. 622c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * c. event is finished. 63d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn */ 642c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornstruct AInputQueue : public android::InputEventFactoryInterface { 65d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornpublic: 66d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn /* Creates a consumer associated with an input channel. */ 67d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn explicit AInputQueue(const android::sp<android::InputChannel>& channel, int workWrite); 68d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 69d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn /* Destroys the consumer and releases its input channel. */ 70d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ~AInputQueue(); 71d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 72d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn void attachLooper(ALooper* looper, ALooper_callbackFunc* callback, void* data); 73d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 74d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn void detachLooper(); 75d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 76d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t hasEvents(); 77d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 78d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t getEvent(AInputEvent** outEvent); 79d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 802c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn bool preDispatchEvent(AInputEvent* event); 81d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 822c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn void finishEvent(AInputEvent* event, bool handled); 83d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 84d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // ---------------------------------------------------------- 85d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 86d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn inline android::InputConsumer& getConsumer() { return mConsumer; } 87d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 88d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn void dispatchEvent(android::KeyEvent* event); 89d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 902c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn void finishPreDispatch(int seq, bool handled); 912c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 92d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn android::KeyEvent* consumeUnhandledEvent(); 932c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::KeyEvent* consumePreDispatchingEvent(int* outSeq); 942c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 952c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn virtual android::KeyEvent* createKeyEvent(); 962c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn virtual android::MotionEvent* createMotionEvent(); 97d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 98d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mWorkWrite; 99d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 100d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornprivate: 1012c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn void doUnhandledKey(android::KeyEvent* keyEvent); 1022c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn bool preDispatchKey(android::KeyEvent* keyEvent); 1032c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn void wakeupDispatch(); 104d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 105d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn android::InputConsumer mConsumer; 106d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn android::sp<android::PollLoop> mPollLoop; 107d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 108d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mDispatchKeyRead; 109d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mDispatchKeyWrite; 110d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 1112c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn struct in_flight_event { 1122c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::InputEvent* event; 1132c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn int seq; 1142c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn bool doFinish; 1152c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn }; 1162c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1172c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn struct finish_pre_dispatch { 1182c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn int seq; 1192c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn bool handled; 1202c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn }; 121d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 122d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn android::Mutex mLock; 1232c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1242c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn int mSeq; 1252c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1262c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // Cache of previously allocated key events. 1272c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::Vector<android::KeyEvent*> mAvailKeyEvents; 1282c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // Cache of previously allocated motion events. 1292c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::Vector<android::MotionEvent*> mAvailMotionEvents; 1302c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1312c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // All input events that are actively being processed. 1322c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::Vector<in_flight_event> mInFlightEvents; 1332c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1342c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // Key events that the app didn't handle, and are pending for 1352c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // delivery to the activity's default key handling. 1362c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::Vector<android::KeyEvent*> mUnhandledKeys; 1372c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1382c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // Keys that arrived in the Java framework and need to be 1392c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // dispatched to the app. 140d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn android::Vector<android::KeyEvent*> mDispatchingKeys; 1412c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1422c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // Key events that are pending to be pre-dispatched to the IME. 1432c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::Vector<in_flight_event> mPreDispatchingKeys; 1442c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1452c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // Event sequence numbers that we have finished pre-dispatching. 1462c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::Vector<finish_pre_dispatch> mFinishPreDispatches; 147d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}; 148d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 149289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#endif // _ANDROID_APP_NATIVEACTIVITY_H 150