| /* | |
| * Copyright 2023 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. | |
| */ | |
| #include "InputDeviceMetricsSource.h" | |
| #include "KeyCodeClassifications.h" | |
| #include <android/input.h> | |
| #include <input/Input.h> | |
| #include <linux/input.h> | |
| #include <log/log_main.h> | |
| #include <set> | |
| namespace android { | |
| InputDeviceUsageSource getUsageSourceForKeyArgs(int32_t keyboardType, | |
| const NotifyKeyArgs& keyArgs) { | |
| if (!isFromSource(keyArgs.source, AINPUT_SOURCE_KEYBOARD)) { | |
| return InputDeviceUsageSource::UNKNOWN; | |
| } | |
| if (isFromSource(keyArgs.source, AINPUT_SOURCE_DPAD) && | |
| DPAD_ALL_KEYCODES.count(keyArgs.keyCode) != 0) { | |
| return InputDeviceUsageSource::DPAD; | |
| } | |
| if (isFromSource(keyArgs.source, AINPUT_SOURCE_GAMEPAD) && | |
| GAMEPAD_KEYCODES.count(keyArgs.keyCode) != 0) { | |
| return InputDeviceUsageSource::GAMEPAD; | |
| } | |
| if (keyboardType == AINPUT_KEYBOARD_TYPE_ALPHABETIC) { | |
| return InputDeviceUsageSource::KEYBOARD; | |
| } | |
| return InputDeviceUsageSource::BUTTONS; | |
| } | |
| std::set<InputDeviceUsageSource> getUsageSourcesForKeyArgs( | |
| const NotifyKeyArgs& args, const std::vector<InputDeviceInfo>& inputDevices) { | |
| int32_t keyboardType = AINPUT_KEYBOARD_TYPE_NONE; | |
| for (const InputDeviceInfo& inputDevice : inputDevices) { | |
| if (args.deviceId == inputDevice.getId()) { | |
| keyboardType = inputDevice.getKeyboardType(); | |
| break; | |
| } | |
| } | |
| return std::set{getUsageSourceForKeyArgs(keyboardType, args)}; | |
| } | |
| std::set<InputDeviceUsageSource> getUsageSourcesForMotionArgs(const NotifyMotionArgs& motionArgs) { | |
| LOG_ALWAYS_FATAL_IF(motionArgs.getPointerCount() < 1, "Received motion args without pointers"); | |
| std::set<InputDeviceUsageSource> sources; | |
| for (uint32_t i = 0; i < motionArgs.getPointerCount(); i++) { | |
| const auto toolType = motionArgs.pointerProperties[i].toolType; | |
| if (isFromSource(motionArgs.source, AINPUT_SOURCE_MOUSE)) { | |
| if (toolType == ToolType::MOUSE) { | |
| sources.emplace(InputDeviceUsageSource::MOUSE); | |
| continue; | |
| } | |
| if (toolType == ToolType::FINGER) { | |
| sources.emplace(InputDeviceUsageSource::TOUCHPAD); | |
| continue; | |
| } | |
| if (isStylusToolType(toolType)) { | |
| sources.emplace(InputDeviceUsageSource::STYLUS_INDIRECT); | |
| continue; | |
| } | |
| } | |
| if (isFromSource(motionArgs.source, AINPUT_SOURCE_MOUSE_RELATIVE) && | |
| toolType == ToolType::MOUSE) { | |
| sources.emplace(InputDeviceUsageSource::MOUSE_CAPTURED); | |
| continue; | |
| } | |
| if (isFromSource(motionArgs.source, AINPUT_SOURCE_TOUCHPAD) && | |
| toolType == ToolType::FINGER) { | |
| sources.emplace(InputDeviceUsageSource::TOUCHPAD_CAPTURED); | |
| continue; | |
| } | |
| if (isFromSource(motionArgs.source, AINPUT_SOURCE_BLUETOOTH_STYLUS) && | |
| isStylusToolType(toolType)) { | |
| sources.emplace(InputDeviceUsageSource::STYLUS_FUSED); | |
| continue; | |
| } | |
| if (isFromSource(motionArgs.source, AINPUT_SOURCE_STYLUS) && isStylusToolType(toolType)) { | |
| sources.emplace(InputDeviceUsageSource::STYLUS_DIRECT); | |
| continue; | |
| } | |
| if (isFromSource(motionArgs.source, AINPUT_SOURCE_TOUCH_NAVIGATION)) { | |
| sources.emplace(InputDeviceUsageSource::TOUCH_NAVIGATION); | |
| continue; | |
| } | |
| if (isFromSource(motionArgs.source, AINPUT_SOURCE_JOYSTICK)) { | |
| sources.emplace(InputDeviceUsageSource::JOYSTICK); | |
| continue; | |
| } | |
| if (isFromSource(motionArgs.source, AINPUT_SOURCE_ROTARY_ENCODER)) { | |
| sources.emplace(InputDeviceUsageSource::ROTARY_ENCODER); | |
| continue; | |
| } | |
| if (isFromSource(motionArgs.source, AINPUT_SOURCE_TRACKBALL)) { | |
| sources.emplace(InputDeviceUsageSource::TRACKBALL); | |
| continue; | |
| } | |
| if (isFromSource(motionArgs.source, AINPUT_SOURCE_TOUCHSCREEN)) { | |
| sources.emplace(InputDeviceUsageSource::TOUCHSCREEN); | |
| continue; | |
| } | |
| sources.emplace(InputDeviceUsageSource::UNKNOWN); | |
| } | |
| return sources; | |
| } | |
| } // namespace android |