/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _ANDROID_VIEW_INPUTQUEUE_H
#define _ANDROID_VIEW_INPUTQUEUE_H

#include <androidfw/Input.h>
#include <utils/Looper.h>
#include <utils/TypeHelpers.h>
#include <utils/Vector.h>

#include "JNIHelp.h"

/*
 * Declare a concrete type for the NDK's AInputQueue forward declaration
 */
struct AInputQueue{
};

namespace android {

class InputQueue : public AInputQueue, public MessageHandler {
public:
    virtual ~InputQueue();

    void attachLooper(Looper* looper, int ident, ALooper_callbackFunc callback, void* data);

    void detachLooper();

    bool hasEvents();

    status_t getEvent(InputEvent** outEvent);

    bool preDispatchEvent(InputEvent* event);

    void finishEvent(InputEvent* event, bool handled);

    KeyEvent* createKeyEvent();

    MotionEvent* createMotionEvent();

    void recycleInputEvent(InputEvent* event);

    void enqueueEvent(InputEvent* event);

    static InputQueue* createQueue(jobject inputQueueObj, const sp<Looper>& looper);

protected:
    virtual void handleMessage(const Message& message);

private:
    InputQueue(jobject inputQueueObj, const sp<Looper>& looper,
            int readDispatchFd, int writeDispatchFd);

    void detachLooperLocked();

    jobject mInputQueueWeakGlobal;
    int mDispatchReadFd;
    int mDispatchWriteFd;
    Vector<Looper*> mAppLoopers;
    sp<Looper> mDispatchLooper;
    sp<WeakMessageHandler> mHandler;
    PooledInputEventFactory mPooledInputEventFactory;
    // Guards the pending and finished event vectors
    mutable Mutex mLock;
    Vector<InputEvent*> mPendingEvents;
    Vector<key_value_pair_t<InputEvent*, bool> > mFinishedEvents;
};

} // namespace android

#endif
