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