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 20b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#include <androidfw/InputTransport.h> 214fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <utils/Looper.h> 22d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 23289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#include <android/native_activity.h> 2454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 2554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn#include "jni.h" 2654a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 2754a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackbornnamespace android { 2854a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 29db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackbornextern void android_NativeActivity_finish( 30db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn ANativeActivity* activity); 31db28a94d499f995b467b07cee5c9b9119f538b1cDianne Hackborn 32289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornextern void android_NativeActivity_setWindowFormat( 33289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t format); 34289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 35289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackbornextern void android_NativeActivity_setWindowFlags( 36289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn ANativeActivity* activity, int32_t values, int32_t mask); 37289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn 38d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornextern void android_NativeActivity_showSoftInput( 39d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags); 40d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 41d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornextern void android_NativeActivity_hideSoftInput( 42d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ANativeActivity* activity, int32_t flags); 4354a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 4454a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn} // namespace android 4554a181b1a2b1517a9479b21fbf7705a688232fafDianne Hackborn 46d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 47d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn/* 48d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn * NDK input queue API. 492c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * 502c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * Here is the event flow: 512c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * 1. Event arrives in input consumer, and is returned by getEvent(). 522c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * 2. Application calls preDispatchEvent(): 532c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * a. Event is assigned a sequence ID and enqueued in mPreDispatchingKeys. 542c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * b. Main thread picks up event, hands to input method. 552c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * c. Input method eventually returns sequence # and whether it was handled. 562c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * d. finishPreDispatch() is called to enqueue the information. 572c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * e. next getEvent() call will: 582c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * - finish any pre-dispatch events that the input method handled 592c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * - return the next pre-dispatched event that the input method didn't handle. 602c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * f. (A preDispatchEvent() call on this event will now return false). 612c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * 3. Application calls finishEvent() with whether it was handled. 622c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * - If handled is true, the event is finished. 632c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * - If handled is false, the event is put on mUnhandledKeys, and: 642c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * a. Main thread receives event from consumeUnhandledEvent(). 652c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * b. Java sends event through default key handler. 662c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn * c. event is finished. 67d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn */ 682b6c32ca4177f1a97307f9cbd81ca485df28762cJeff Brownstruct AInputQueue { 69d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornpublic: 70d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn /* Creates a consumer associated with an input channel. */ 71d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn explicit AInputQueue(const android::sp<android::InputChannel>& channel, int workWrite); 72d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 73d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn /* Destroys the consumer and releases its input channel. */ 74d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ~AInputQueue(); 75d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 764fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown void attachLooper(ALooper* looper, int ident, ALooper_callbackFunc callback, void* data); 77d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 78d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn void detachLooper(); 79d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 80d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t hasEvents(); 81d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 82d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int32_t getEvent(AInputEvent** outEvent); 83d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 842c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn bool preDispatchEvent(AInputEvent* event); 85d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 863915bb845b032dc184dba5e60970b803390ca3edJeff Brown void finishEvent(AInputEvent* event, bool handled, bool didDefaultHandling); 87d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 88d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn // ---------------------------------------------------------- 89d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 90d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn inline android::InputConsumer& getConsumer() { return mConsumer; } 91d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 92d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn void dispatchEvent(android::KeyEvent* event); 93d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 942c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn void finishPreDispatch(int seq, bool handled); 952c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 96d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn android::KeyEvent* consumeUnhandledEvent(); 972c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::KeyEvent* consumePreDispatchingEvent(int* outSeq); 982c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 992b6c32ca4177f1a97307f9cbd81ca485df28762cJeff Brown android::KeyEvent* createKeyEvent(); 100d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 101d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mWorkWrite; 102d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 103d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornprivate: 1042c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn void doUnhandledKey(android::KeyEvent* keyEvent); 1052c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn bool preDispatchKey(android::KeyEvent* keyEvent); 1062b6c32ca4177f1a97307f9cbd81ca485df28762cJeff Brown void wakeupDispatchLocked(); 107d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 1082b6c32ca4177f1a97307f9cbd81ca485df28762cJeff Brown android::PooledInputEventFactory mPooledInputEventFactory; 109d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn android::InputConsumer mConsumer; 1104fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown android::sp<android::Looper> mLooper; 111d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 112d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mDispatchKeyRead; 113d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn int mDispatchKeyWrite; 114d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 1152c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn struct in_flight_event { 1162c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::InputEvent* event; 117072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown int seq; // internal sequence number for synthetic pre-dispatch events 118072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown uint32_t finishSeq; // sequence number for sendFinishedSignal, or 0 if finish not required 1192c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn }; 1202c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1212c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn struct finish_pre_dispatch { 1222c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn int seq; 1232c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn bool handled; 1242c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn }; 125d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 126d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn android::Mutex mLock; 1272c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1282c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn int mSeq; 1292c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1302c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // All input events that are actively being processed. 1312c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::Vector<in_flight_event> mInFlightEvents; 1322c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1332c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // Key events that the app didn't handle, and are pending for 1342c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // delivery to the activity's default key handling. 1352c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::Vector<android::KeyEvent*> mUnhandledKeys; 1362c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1372c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // Keys that arrived in the Java framework and need to be 1382c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // dispatched to the app. 139d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn android::Vector<android::KeyEvent*> mDispatchingKeys; 1402c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1412c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // Key events that are pending to be pre-dispatched to the IME. 1422c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::Vector<in_flight_event> mPreDispatchingKeys; 1432c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn 1442c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn // Event sequence numbers that we have finished pre-dispatching. 1452c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn android::Vector<finish_pre_dispatch> mFinishPreDispatches; 146d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn}; 147d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 148289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#endif // _ANDROID_APP_NATIVEACTIVITY_H 149