android_app_NativeActivity.h revision b93a03f841d93498bfea6cc92a22faa34bce1337
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 */
682c6081ce3593712f30dacd990a97209c791d6cedDianne Hackbornstruct AInputQueue : public android::InputEventFactoryInterface {
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
992c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    virtual android::KeyEvent* createKeyEvent();
1002c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    virtual android::MotionEvent* createMotionEvent();
101d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
102d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    int mWorkWrite;
103d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
104d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornprivate:
1052c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    void doUnhandledKey(android::KeyEvent* keyEvent);
1062c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    bool preDispatchKey(android::KeyEvent* keyEvent);
1072c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    void wakeupDispatch();
108d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
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    // Cache of previously allocated key events.
1312c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    android::Vector<android::KeyEvent*> mAvailKeyEvents;
1322c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    // Cache of previously allocated motion events.
1332c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    android::Vector<android::MotionEvent*> mAvailMotionEvents;
1342c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn
1352c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    // All input events that are actively being processed.
1362c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    android::Vector<in_flight_event> mInFlightEvents;
1372c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn
1382c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    // Key events that the app didn't handle, and are pending for
1392c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    // delivery to the activity's default key handling.
1402c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    android::Vector<android::KeyEvent*> mUnhandledKeys;
1412c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn
1422c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    // Keys that arrived in the Java framework and need to be
1432c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    // dispatched to the app.
144d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    android::Vector<android::KeyEvent*> mDispatchingKeys;
1452c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn
1462c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    // Key events that are pending to be pre-dispatched to the IME.
1472c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    android::Vector<in_flight_event> mPreDispatchingKeys;
1482c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn
1492c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    // Event sequence numbers that we have finished pre-dispatching.
1502c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    android::Vector<finish_pre_dispatch> mFinishPreDispatches;
151d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn};
152d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn
153289b9b62372ef52a06113b83dfb870e2c2fb325aDianne Hackborn#endif // _ANDROID_APP_NATIVEACTIVITY_H
154