blob: 8b6accf0f87ec258b0cb798610b2f82741f3ed46 [file]
/*
* Copyright (C) 2011 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.
*/
#define LOG_TAG "InputListener"
#define ATRACE_TAG ATRACE_TAG_INPUT
//#define LOG_NDEBUG 0
#include "InputListener.h"
#include <android-base/stringprintf.h>
#include <android/log.h>
#include <input/TraceTools.h>
using android::base::StringPrintf;
namespace android {
std::list<NotifyArgs>& operator+=(std::list<NotifyArgs>& keep, std::list<NotifyArgs>&& consume) {
keep.splice(keep.end(), consume);
return keep;
}
// --- InputListenerInterface ---
// Helper to std::visit with lambdas.
template <typename... V>
struct Visitor : V... { using V::operator()...; };
// explicit deduction guide (not needed as of C++20)
template <typename... V>
Visitor(V...) -> Visitor<V...>;
void InputListenerInterface::notify(const NotifyArgs& generalArgs) {
Visitor v{
[&](const NotifyInputDevicesChangedArgs& args) { notifyInputDevicesChanged(args); },
[&](const NotifyKeyArgs& args) { notifyKey(args); },
[&](const NotifyMotionArgs& args) { notifyMotion(args); },
[&](const NotifySwitchArgs& args) { notifySwitch(args); },
[&](const NotifySensorArgs& args) { notifySensor(args); },
[&](const NotifyVibratorStateArgs& args) { notifyVibratorState(args); },
[&](const NotifyDeviceResetArgs& args) { notifyDeviceReset(args); },
[&](const NotifyPointerCaptureChangedArgs& args) { notifyPointerCaptureChanged(args); },
};
std::visit(v, generalArgs);
}
// --- QueuedInputListener ---
QueuedInputListener::QueuedInputListener(InputListenerInterface& innerListener)
: mInnerListener(innerListener) {}
void QueuedInputListener::notifyInputDevicesChanged(const NotifyInputDevicesChangedArgs& args) {
mArgsQueue.emplace_back(args);
}
void QueuedInputListener::notifyKey(const NotifyKeyArgs& args) {
mArgsQueue.emplace_back(args);
}
void QueuedInputListener::notifyMotion(const NotifyMotionArgs& args) {
mArgsQueue.emplace_back(args);
}
void QueuedInputListener::notifySwitch(const NotifySwitchArgs& args) {
mArgsQueue.emplace_back(args);
}
void QueuedInputListener::notifySensor(const NotifySensorArgs& args) {
mArgsQueue.emplace_back(args);
}
void QueuedInputListener::notifyVibratorState(const NotifyVibratorStateArgs& args) {
mArgsQueue.emplace_back(args);
}
void QueuedInputListener::notifyDeviceReset(const NotifyDeviceResetArgs& args) {
mArgsQueue.emplace_back(args);
}
void QueuedInputListener::notifyPointerCaptureChanged(const NotifyPointerCaptureChangedArgs& args) {
mArgsQueue.emplace_back(args);
}
void QueuedInputListener::flush() {
for (const NotifyArgs& args : mArgsQueue) {
mInnerListener.notify(args);
}
mArgsQueue.clear();
}
// --- TracedInputListener ---
TracedInputListener::TracedInputListener(const char* name, InputListenerInterface& innerListener)
: mInnerListener(innerListener), mName(name) {}
void TracedInputListener::notifyInputDevicesChanged(const NotifyInputDevicesChangedArgs& args) {
constexpr static auto& fnName = __func__;
ATRACE_NAME_IF(ATRACE_ENABLED(),
StringPrintf("%s::%s(id=0x%" PRIx32 ")", mName, fnName, args.id));
mInnerListener.notify(args);
}
void TracedInputListener::notifyKey(const NotifyKeyArgs& args) {
constexpr static auto& fnName = __func__;
ATRACE_NAME_IF(ATRACE_ENABLED(),
StringPrintf("%s::%s(id=0x%" PRIx32 ")", mName, fnName, args.id));
mInnerListener.notify(args);
}
void TracedInputListener::notifyMotion(const NotifyMotionArgs& args) {
constexpr static auto& fnName = __func__;
ATRACE_NAME_IF(ATRACE_ENABLED(),
StringPrintf("%s::%s(id=0x%" PRIx32 ")", mName, fnName, args.id));
mInnerListener.notify(args);
}
void TracedInputListener::notifySwitch(const NotifySwitchArgs& args) {
constexpr static auto& fnName = __func__;
ATRACE_NAME_IF(ATRACE_ENABLED(),
StringPrintf("%s::%s(id=0x%" PRIx32 ")", mName, fnName, args.id));
mInnerListener.notify(args);
}
void TracedInputListener::notifySensor(const NotifySensorArgs& args) {
constexpr static auto& fnName = __func__;
ATRACE_NAME_IF(ATRACE_ENABLED(),
StringPrintf("%s::%s(id=0x%" PRIx32 ")", mName, fnName, args.id));
mInnerListener.notify(args);
}
void TracedInputListener::notifyVibratorState(const NotifyVibratorStateArgs& args) {
constexpr static auto& fnName = __func__;
ATRACE_NAME_IF(ATRACE_ENABLED(),
StringPrintf("%s::%s(id=0x%" PRIx32 ")", mName, fnName, args.id));
mInnerListener.notify(args);
}
void TracedInputListener::notifyDeviceReset(const NotifyDeviceResetArgs& args) {
constexpr static auto& fnName = __func__;
ATRACE_NAME_IF(ATRACE_ENABLED(),
StringPrintf("%s::%s(id=0x%" PRIx32 ")", mName, fnName, args.id));
mInnerListener.notify(args);
}
void TracedInputListener::notifyPointerCaptureChanged(const NotifyPointerCaptureChangedArgs& args) {
constexpr static auto& fnName = __func__;
ATRACE_NAME_IF(ATRACE_ENABLED(),
StringPrintf("%s::%s(id=0x%" PRIx32 ")", mName, fnName, args.id));
mInnerListener.notify(args);
}
} // namespace android