Initial InputMappers for evdev input HAL.
The previous design of the InputHost wrapper classes made it very
painful to do testing, so this change also reverts to a more classical
C++ pattern for non-copyable objects. The InputHost classes still simply
call through to the input_host_t and callbacks as before.
Updated unittests to use gmock for mocking the InputHost interactions.
Change-Id: I4b70df2c89ed48af77446b8f5b87a4bde94510bf
diff --git a/modules/input/evdev/InputMapper.h b/modules/input/evdev/InputMapper.h
new file mode 100644
index 0000000..b33cb63
--- /dev/null
+++ b/modules/input/evdev/InputMapper.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2015 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_INPUT_MAPPER_H_
+#define ANDROID_INPUT_MAPPER_H_
+
+#include "InputHost.h"
+#include "InputHub.h"
+
+namespace android {
+
+/**
+ * An InputMapper processes raw evdev input events and combines them into
+ * Android input HAL reports. A given InputMapper will focus on a particular
+ * type of input, like key presses or touch events. A single InputDevice may
+ * have multiple InputMappers, corresponding to the different types of inputs it
+ * supports.
+ */
+class InputMapper {
+public:
+ virtual ~InputMapper() = default;
+
+ /**
+ * If the mapper supports input events from the InputDevice,
+ * configureInputReport will populate the InputReportDefinition and return
+ * true. If input is not supported, false is returned, and the InputDevice
+ * may free or re-use the InputReportDefinition.
+ */
+ virtual bool configureInputReport(InputDeviceNode* devNode, InputReportDefinition* report) {
+ return false;
+ }
+
+ /**
+ * If the mapper supports output events from the InputDevice,
+ * configureOutputReport will populate the InputReportDefinition and return
+ * true. If output is not supported, false is returned, and the InputDevice
+ * may free or re-use the InputReportDefinition.
+ */
+ virtual bool configureOutputReport(InputDeviceNode* devNode, InputReportDefinition* report) {
+ return false;
+ }
+
+ // Set the InputDeviceHandle after registering the device with the host.
+ virtual void setDeviceHandle(InputDeviceHandle* handle) { mDeviceHandle = handle; }
+ // Process the InputEvent.
+ virtual void process(const InputEvent& event) = 0;
+
+protected:
+ virtual void setInputReportDefinition(InputReportDefinition* reportDef) final {
+ mInputReportDef = reportDef;
+ }
+ virtual void setOutputReportDefinition(InputReportDefinition* reportDef) final {
+ mOutputReportDef = reportDef;
+ }
+ virtual InputReportDefinition* getInputReportDefinition() final { return mInputReportDef; }
+ virtual InputReportDefinition* getOutputReportDefinition() final { return mOutputReportDef; }
+ virtual InputDeviceHandle* getDeviceHandle() final { return mDeviceHandle; }
+ virtual InputReport* getInputReport() final;
+
+private:
+ InputReportDefinition* mInputReportDef = nullptr;
+ InputReportDefinition* mOutputReportDef = nullptr;
+ InputDeviceHandle* mDeviceHandle = nullptr;
+ InputReport* mReport = nullptr;
+};
+
+} // namespace android
+
+#endif // ANDROID_INPUT_MAPPER_H_