/*
 * Copyright (C) 2020 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.
 */

package android.input.cts

import android.app.Activity
import android.view.InputEvent
import android.view.KeyEvent
import android.view.MotionEvent
import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.TimeUnit

class CaptureEventActivity : Activity() {
    private val mEvents = LinkedBlockingQueue<InputEvent>()

    override fun dispatchGenericMotionEvent(ev: MotionEvent?): Boolean {
        mEvents.add(MotionEvent.obtain(ev))
        return true
    }

    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        mEvents.add(MotionEvent.obtain(ev))
        return true
    }

    override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
        mEvents.add(KeyEvent(event))
        return true
    }

    override fun dispatchTrackballEvent(ev: MotionEvent?): Boolean {
        mEvents.add(MotionEvent.obtain(ev))
        return true
    }

    fun getLastInputEvent(): InputEvent? {
        return mEvents.poll(5, TimeUnit.SECONDS)
    }
}
