/* * 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 #include #include #include #include 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 getUsageSourcesForMotionArgs(const NotifyMotionArgs& motionArgs) { LOG_ALWAYS_FATAL_IF(motionArgs.getPointerCount() < 1, "Received motion args without pointers"); std::set 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