Loading services/inputflinger/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -182,6 +182,7 @@ cc_library_headers { filegroup { name: "libinputflinger_base_sources", srcs: [ "InputDeviceMetricsSource.cpp", "InputListener.cpp", "InputReaderBase.cpp", "InputThread.cpp", Loading @@ -199,6 +200,7 @@ cc_defaults { "libcutils", "libinput", "liblog", "libstatslog", "libutils", ], header_libs: [ Loading services/inputflinger/InputDeviceMetricsCollector.cpp +1 −92 Original line number Diff line number Diff line Loading @@ -17,11 +17,10 @@ #define LOG_TAG "InputDeviceMetricsCollector" #include "InputDeviceMetricsCollector.h" #include "KeyCodeClassifications.h" #include "InputDeviceMetricsSource.h" #include <android-base/stringprintf.h> #include <input/PrintTools.h> #include <linux/input.h> namespace android { Loading Loading @@ -113,96 +112,6 @@ bool isIgnoredInputDeviceId(int32_t deviceId) { } // namespace 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> 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; } // --- InputDeviceMetricsCollector --- InputDeviceMetricsCollector::InputDeviceMetricsCollector(InputListenerInterface& listener) : InputDeviceMetricsCollector(listener, sStatsdLogger, DEFAULT_USAGE_SESSION_TIMEOUT) {} Loading services/inputflinger/InputDeviceMetricsCollector.h +1 −33 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #include "InputDeviceMetricsSource.h" #include "InputListener.h" #include "NotifyArgs.h" #include "SyncQueue.h" Loading @@ -23,7 +24,6 @@ #include <ftl/mixins.h> #include <gui/WindowInfo.h> #include <input/InputDevice.h> #include <statslog.h> #include <chrono> #include <functional> #include <map> Loading Loading @@ -52,38 +52,6 @@ public: virtual void dump(std::string& dump) = 0; }; /** * Enum representation of the InputDeviceUsageSource. */ enum class InputDeviceUsageSource : int32_t { UNKNOWN = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__UNKNOWN, BUTTONS = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__BUTTONS, KEYBOARD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__KEYBOARD, DPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__DPAD, GAMEPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__GAMEPAD, JOYSTICK = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__JOYSTICK, MOUSE = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__MOUSE, MOUSE_CAPTURED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__MOUSE_CAPTURED, TOUCHPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHPAD, TOUCHPAD_CAPTURED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHPAD_CAPTURED, ROTARY_ENCODER = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__ROTARY_ENCODER, STYLUS_DIRECT = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_DIRECT, STYLUS_INDIRECT = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_INDIRECT, STYLUS_FUSED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_FUSED, TOUCH_NAVIGATION = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCH_NAVIGATION, TOUCHSCREEN = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHSCREEN, TRACKBALL = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TRACKBALL, ftl_first = UNKNOWN, ftl_last = TRACKBALL, }; /** Returns the InputDeviceUsageSource that corresponds to the key event. */ InputDeviceUsageSource getUsageSourceForKeyArgs(int32_t keyboardType, const NotifyKeyArgs&); /** Returns the InputDeviceUsageSources that correspond to the motion event. */ std::set<InputDeviceUsageSource> getUsageSourcesForMotionArgs(const NotifyMotionArgs&); /** The logging interface for the metrics collector, injected for testing. */ class InputDeviceMetricsLogger { public: Loading services/inputflinger/InputDeviceMetricsSource.cpp 0 → 100644 +118 −0 Original line number Diff line number Diff line /* * 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> 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 services/inputflinger/InputDeviceMetricsSource.h 0 → 100644 +58 −0 Original line number Diff line number Diff line /* * 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. */ #pragma once #include "NotifyArgs.h" #include <linux/input.h> #include <statslog.h> namespace android { /** * Enum representation of the InputDeviceUsageSource. */ enum class InputDeviceUsageSource : int32_t { UNKNOWN = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__UNKNOWN, BUTTONS = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__BUTTONS, KEYBOARD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__KEYBOARD, DPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__DPAD, GAMEPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__GAMEPAD, JOYSTICK = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__JOYSTICK, MOUSE = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__MOUSE, MOUSE_CAPTURED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__MOUSE_CAPTURED, TOUCHPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHPAD, TOUCHPAD_CAPTURED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHPAD_CAPTURED, ROTARY_ENCODER = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__ROTARY_ENCODER, STYLUS_DIRECT = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_DIRECT, STYLUS_INDIRECT = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_INDIRECT, STYLUS_FUSED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_FUSED, TOUCH_NAVIGATION = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCH_NAVIGATION, TOUCHSCREEN = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHSCREEN, TRACKBALL = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TRACKBALL, ftl_first = UNKNOWN, ftl_last = TRACKBALL, }; /** Returns the InputDeviceUsageSource that corresponds to the key event. */ InputDeviceUsageSource getUsageSourceForKeyArgs(int32_t keyboardType, const NotifyKeyArgs&); /** Returns the InputDeviceUsageSources that correspond to the motion event. */ std::set<InputDeviceUsageSource> getUsageSourcesForMotionArgs(const NotifyMotionArgs&); } // namespace android Loading
services/inputflinger/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -182,6 +182,7 @@ cc_library_headers { filegroup { name: "libinputflinger_base_sources", srcs: [ "InputDeviceMetricsSource.cpp", "InputListener.cpp", "InputReaderBase.cpp", "InputThread.cpp", Loading @@ -199,6 +200,7 @@ cc_defaults { "libcutils", "libinput", "liblog", "libstatslog", "libutils", ], header_libs: [ Loading
services/inputflinger/InputDeviceMetricsCollector.cpp +1 −92 Original line number Diff line number Diff line Loading @@ -17,11 +17,10 @@ #define LOG_TAG "InputDeviceMetricsCollector" #include "InputDeviceMetricsCollector.h" #include "KeyCodeClassifications.h" #include "InputDeviceMetricsSource.h" #include <android-base/stringprintf.h> #include <input/PrintTools.h> #include <linux/input.h> namespace android { Loading Loading @@ -113,96 +112,6 @@ bool isIgnoredInputDeviceId(int32_t deviceId) { } // namespace 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> 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; } // --- InputDeviceMetricsCollector --- InputDeviceMetricsCollector::InputDeviceMetricsCollector(InputListenerInterface& listener) : InputDeviceMetricsCollector(listener, sStatsdLogger, DEFAULT_USAGE_SESSION_TIMEOUT) {} Loading
services/inputflinger/InputDeviceMetricsCollector.h +1 −33 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #include "InputDeviceMetricsSource.h" #include "InputListener.h" #include "NotifyArgs.h" #include "SyncQueue.h" Loading @@ -23,7 +24,6 @@ #include <ftl/mixins.h> #include <gui/WindowInfo.h> #include <input/InputDevice.h> #include <statslog.h> #include <chrono> #include <functional> #include <map> Loading Loading @@ -52,38 +52,6 @@ public: virtual void dump(std::string& dump) = 0; }; /** * Enum representation of the InputDeviceUsageSource. */ enum class InputDeviceUsageSource : int32_t { UNKNOWN = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__UNKNOWN, BUTTONS = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__BUTTONS, KEYBOARD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__KEYBOARD, DPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__DPAD, GAMEPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__GAMEPAD, JOYSTICK = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__JOYSTICK, MOUSE = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__MOUSE, MOUSE_CAPTURED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__MOUSE_CAPTURED, TOUCHPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHPAD, TOUCHPAD_CAPTURED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHPAD_CAPTURED, ROTARY_ENCODER = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__ROTARY_ENCODER, STYLUS_DIRECT = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_DIRECT, STYLUS_INDIRECT = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_INDIRECT, STYLUS_FUSED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_FUSED, TOUCH_NAVIGATION = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCH_NAVIGATION, TOUCHSCREEN = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHSCREEN, TRACKBALL = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TRACKBALL, ftl_first = UNKNOWN, ftl_last = TRACKBALL, }; /** Returns the InputDeviceUsageSource that corresponds to the key event. */ InputDeviceUsageSource getUsageSourceForKeyArgs(int32_t keyboardType, const NotifyKeyArgs&); /** Returns the InputDeviceUsageSources that correspond to the motion event. */ std::set<InputDeviceUsageSource> getUsageSourcesForMotionArgs(const NotifyMotionArgs&); /** The logging interface for the metrics collector, injected for testing. */ class InputDeviceMetricsLogger { public: Loading
services/inputflinger/InputDeviceMetricsSource.cpp 0 → 100644 +118 −0 Original line number Diff line number Diff line /* * 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> 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
services/inputflinger/InputDeviceMetricsSource.h 0 → 100644 +58 −0 Original line number Diff line number Diff line /* * 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. */ #pragma once #include "NotifyArgs.h" #include <linux/input.h> #include <statslog.h> namespace android { /** * Enum representation of the InputDeviceUsageSource. */ enum class InputDeviceUsageSource : int32_t { UNKNOWN = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__UNKNOWN, BUTTONS = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__BUTTONS, KEYBOARD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__KEYBOARD, DPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__DPAD, GAMEPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__GAMEPAD, JOYSTICK = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__JOYSTICK, MOUSE = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__MOUSE, MOUSE_CAPTURED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__MOUSE_CAPTURED, TOUCHPAD = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHPAD, TOUCHPAD_CAPTURED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHPAD_CAPTURED, ROTARY_ENCODER = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__ROTARY_ENCODER, STYLUS_DIRECT = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_DIRECT, STYLUS_INDIRECT = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_INDIRECT, STYLUS_FUSED = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__STYLUS_FUSED, TOUCH_NAVIGATION = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCH_NAVIGATION, TOUCHSCREEN = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TOUCHSCREEN, TRACKBALL = util::INPUT_DEVICE_USAGE_REPORTED__USAGE_SOURCES__TRACKBALL, ftl_first = UNKNOWN, ftl_last = TRACKBALL, }; /** Returns the InputDeviceUsageSource that corresponds to the key event. */ InputDeviceUsageSource getUsageSourceForKeyArgs(int32_t keyboardType, const NotifyKeyArgs&); /** Returns the InputDeviceUsageSources that correspond to the motion event. */ std::set<InputDeviceUsageSource> getUsageSourcesForMotionArgs(const NotifyMotionArgs&); } // namespace android