1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "NotifyArgs"
18*38e8c45fSAndroid Build Coastguard Worker
19*38e8c45fSAndroid Build Coastguard Worker #define ATRACE_TAG ATRACE_TAG_INPUT
20*38e8c45fSAndroid Build Coastguard Worker
21*38e8c45fSAndroid Build Coastguard Worker #include "NotifyArgs.h"
22*38e8c45fSAndroid Build Coastguard Worker
23*38e8c45fSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <android/log.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <math.h>
26*38e8c45fSAndroid Build Coastguard Worker #include <utils/Trace.h>
27*38e8c45fSAndroid Build Coastguard Worker
28*38e8c45fSAndroid Build Coastguard Worker using android::base::StringPrintf;
29*38e8c45fSAndroid Build Coastguard Worker
30*38e8c45fSAndroid Build Coastguard Worker namespace android {
31*38e8c45fSAndroid Build Coastguard Worker
32*38e8c45fSAndroid Build Coastguard Worker // --- NotifyInputDevicesChangedArgs ---
33*38e8c45fSAndroid Build Coastguard Worker
NotifyInputDevicesChangedArgs(int32_t id,std::vector<InputDeviceInfo> infos)34*38e8c45fSAndroid Build Coastguard Worker NotifyInputDevicesChangedArgs::NotifyInputDevicesChangedArgs(int32_t id,
35*38e8c45fSAndroid Build Coastguard Worker std::vector<InputDeviceInfo> infos)
36*38e8c45fSAndroid Build Coastguard Worker : id(id), inputDeviceInfos(std::move(infos)) {}
37*38e8c45fSAndroid Build Coastguard Worker
38*38e8c45fSAndroid Build Coastguard Worker // --- NotifyKeyArgs ---
39*38e8c45fSAndroid Build Coastguard Worker
NotifyKeyArgs(int32_t id,nsecs_t eventTime,nsecs_t readTime,int32_t deviceId,uint32_t source,ui::LogicalDisplayId displayId,uint32_t policyFlags,int32_t action,int32_t flags,int32_t keyCode,int32_t scanCode,int32_t metaState,nsecs_t downTime)40*38e8c45fSAndroid Build Coastguard Worker NotifyKeyArgs::NotifyKeyArgs(int32_t id, nsecs_t eventTime, nsecs_t readTime, int32_t deviceId,
41*38e8c45fSAndroid Build Coastguard Worker uint32_t source, ui::LogicalDisplayId displayId, uint32_t policyFlags,
42*38e8c45fSAndroid Build Coastguard Worker int32_t action, int32_t flags, int32_t keyCode, int32_t scanCode,
43*38e8c45fSAndroid Build Coastguard Worker int32_t metaState, nsecs_t downTime)
44*38e8c45fSAndroid Build Coastguard Worker : id(id),
45*38e8c45fSAndroid Build Coastguard Worker eventTime(eventTime),
46*38e8c45fSAndroid Build Coastguard Worker deviceId(deviceId),
47*38e8c45fSAndroid Build Coastguard Worker source(source),
48*38e8c45fSAndroid Build Coastguard Worker displayId(displayId),
49*38e8c45fSAndroid Build Coastguard Worker policyFlags(policyFlags),
50*38e8c45fSAndroid Build Coastguard Worker action(action),
51*38e8c45fSAndroid Build Coastguard Worker flags(flags),
52*38e8c45fSAndroid Build Coastguard Worker keyCode(keyCode),
53*38e8c45fSAndroid Build Coastguard Worker scanCode(scanCode),
54*38e8c45fSAndroid Build Coastguard Worker metaState(metaState),
55*38e8c45fSAndroid Build Coastguard Worker downTime(downTime),
56*38e8c45fSAndroid Build Coastguard Worker readTime(readTime) {}
57*38e8c45fSAndroid Build Coastguard Worker
58*38e8c45fSAndroid Build Coastguard Worker // --- NotifyMotionArgs ---
59*38e8c45fSAndroid Build Coastguard Worker
NotifyMotionArgs(int32_t id,nsecs_t eventTime,nsecs_t readTime,int32_t deviceId,uint32_t source,ui::LogicalDisplayId displayId,uint32_t policyFlags,int32_t action,int32_t actionButton,int32_t flags,int32_t metaState,int32_t buttonState,MotionClassification classification,int32_t edgeFlags,uint32_t pointerCount,const PointerProperties * pointerProperties,const PointerCoords * pointerCoords,float xPrecision,float yPrecision,float xCursorPosition,float yCursorPosition,nsecs_t downTime,const std::vector<TouchVideoFrame> & videoFrames)60*38e8c45fSAndroid Build Coastguard Worker NotifyMotionArgs::NotifyMotionArgs(
61*38e8c45fSAndroid Build Coastguard Worker int32_t id, nsecs_t eventTime, nsecs_t readTime, int32_t deviceId, uint32_t source,
62*38e8c45fSAndroid Build Coastguard Worker ui::LogicalDisplayId displayId, uint32_t policyFlags, int32_t action, int32_t actionButton,
63*38e8c45fSAndroid Build Coastguard Worker int32_t flags, int32_t metaState, int32_t buttonState, MotionClassification classification,
64*38e8c45fSAndroid Build Coastguard Worker int32_t edgeFlags, uint32_t pointerCount, const PointerProperties* pointerProperties,
65*38e8c45fSAndroid Build Coastguard Worker const PointerCoords* pointerCoords, float xPrecision, float yPrecision,
66*38e8c45fSAndroid Build Coastguard Worker float xCursorPosition, float yCursorPosition, nsecs_t downTime,
67*38e8c45fSAndroid Build Coastguard Worker const std::vector<TouchVideoFrame>& videoFrames)
68*38e8c45fSAndroid Build Coastguard Worker : id(id),
69*38e8c45fSAndroid Build Coastguard Worker eventTime(eventTime),
70*38e8c45fSAndroid Build Coastguard Worker deviceId(deviceId),
71*38e8c45fSAndroid Build Coastguard Worker source(source),
72*38e8c45fSAndroid Build Coastguard Worker displayId(displayId),
73*38e8c45fSAndroid Build Coastguard Worker policyFlags(policyFlags),
74*38e8c45fSAndroid Build Coastguard Worker action(action),
75*38e8c45fSAndroid Build Coastguard Worker actionButton(actionButton),
76*38e8c45fSAndroid Build Coastguard Worker flags(flags),
77*38e8c45fSAndroid Build Coastguard Worker metaState(metaState),
78*38e8c45fSAndroid Build Coastguard Worker buttonState(buttonState),
79*38e8c45fSAndroid Build Coastguard Worker classification(classification),
80*38e8c45fSAndroid Build Coastguard Worker edgeFlags(edgeFlags),
81*38e8c45fSAndroid Build Coastguard Worker xPrecision(xPrecision),
82*38e8c45fSAndroid Build Coastguard Worker yPrecision(yPrecision),
83*38e8c45fSAndroid Build Coastguard Worker xCursorPosition(xCursorPosition),
84*38e8c45fSAndroid Build Coastguard Worker yCursorPosition(yCursorPosition),
85*38e8c45fSAndroid Build Coastguard Worker downTime(downTime),
86*38e8c45fSAndroid Build Coastguard Worker readTime(readTime),
87*38e8c45fSAndroid Build Coastguard Worker videoFrames(videoFrames) {
88*38e8c45fSAndroid Build Coastguard Worker for (uint32_t i = 0; i < pointerCount; i++) {
89*38e8c45fSAndroid Build Coastguard Worker this->pointerProperties.emplace_back(pointerProperties[i]);
90*38e8c45fSAndroid Build Coastguard Worker this->pointerCoords.emplace_back(pointerCoords[i]);
91*38e8c45fSAndroid Build Coastguard Worker }
92*38e8c45fSAndroid Build Coastguard Worker }
93*38e8c45fSAndroid Build Coastguard Worker
isCursorPositionEqual(float lhs,float rhs)94*38e8c45fSAndroid Build Coastguard Worker static inline bool isCursorPositionEqual(float lhs, float rhs) {
95*38e8c45fSAndroid Build Coastguard Worker return (isnan(lhs) && isnan(rhs)) || lhs == rhs;
96*38e8c45fSAndroid Build Coastguard Worker }
97*38e8c45fSAndroid Build Coastguard Worker
operator ==(const NotifyMotionArgs & rhs) const98*38e8c45fSAndroid Build Coastguard Worker bool NotifyMotionArgs::operator==(const NotifyMotionArgs& rhs) const {
99*38e8c45fSAndroid Build Coastguard Worker return id == rhs.id && eventTime == rhs.eventTime && readTime == rhs.readTime &&
100*38e8c45fSAndroid Build Coastguard Worker deviceId == rhs.deviceId && source == rhs.source && displayId == rhs.displayId &&
101*38e8c45fSAndroid Build Coastguard Worker policyFlags == rhs.policyFlags && action == rhs.action &&
102*38e8c45fSAndroid Build Coastguard Worker actionButton == rhs.actionButton && flags == rhs.flags && metaState == rhs.metaState &&
103*38e8c45fSAndroid Build Coastguard Worker buttonState == rhs.buttonState && classification == rhs.classification &&
104*38e8c45fSAndroid Build Coastguard Worker edgeFlags == rhs.edgeFlags && pointerProperties == rhs.pointerProperties &&
105*38e8c45fSAndroid Build Coastguard Worker pointerCoords == rhs.pointerCoords && xPrecision == rhs.xPrecision &&
106*38e8c45fSAndroid Build Coastguard Worker yPrecision == rhs.yPrecision &&
107*38e8c45fSAndroid Build Coastguard Worker isCursorPositionEqual(xCursorPosition, rhs.xCursorPosition) &&
108*38e8c45fSAndroid Build Coastguard Worker isCursorPositionEqual(yCursorPosition, rhs.yCursorPosition) &&
109*38e8c45fSAndroid Build Coastguard Worker downTime == rhs.downTime && videoFrames == rhs.videoFrames;
110*38e8c45fSAndroid Build Coastguard Worker }
111*38e8c45fSAndroid Build Coastguard Worker
dump() const112*38e8c45fSAndroid Build Coastguard Worker std::string NotifyMotionArgs::dump() const {
113*38e8c45fSAndroid Build Coastguard Worker std::string coords;
114*38e8c45fSAndroid Build Coastguard Worker for (uint32_t i = 0; i < getPointerCount(); i++) {
115*38e8c45fSAndroid Build Coastguard Worker if (!coords.empty()) {
116*38e8c45fSAndroid Build Coastguard Worker coords += ", ";
117*38e8c45fSAndroid Build Coastguard Worker }
118*38e8c45fSAndroid Build Coastguard Worker coords += StringPrintf("{%" PRIu32 ": ", i);
119*38e8c45fSAndroid Build Coastguard Worker coords +=
120*38e8c45fSAndroid Build Coastguard Worker StringPrintf("id=%" PRIu32 " x=%.1f y=%.1f pressure=%.1f", pointerProperties[i].id,
121*38e8c45fSAndroid Build Coastguard Worker pointerCoords[i].getX(), pointerCoords[i].getY(),
122*38e8c45fSAndroid Build Coastguard Worker pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_PRESSURE));
123*38e8c45fSAndroid Build Coastguard Worker const ToolType toolType = pointerProperties[i].toolType;
124*38e8c45fSAndroid Build Coastguard Worker if (toolType != ToolType::FINGER) {
125*38e8c45fSAndroid Build Coastguard Worker coords += StringPrintf(" toolType=%s", ftl::enum_string(toolType).c_str());
126*38e8c45fSAndroid Build Coastguard Worker }
127*38e8c45fSAndroid Build Coastguard Worker const float major = pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR);
128*38e8c45fSAndroid Build Coastguard Worker const float minor = pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR);
129*38e8c45fSAndroid Build Coastguard Worker const float orientation = pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION);
130*38e8c45fSAndroid Build Coastguard Worker if (major != 0 || minor != 0) {
131*38e8c45fSAndroid Build Coastguard Worker coords += StringPrintf(" major=%.1f minor=%.1f orientation=%.1f", major, minor,
132*38e8c45fSAndroid Build Coastguard Worker orientation);
133*38e8c45fSAndroid Build Coastguard Worker }
134*38e8c45fSAndroid Build Coastguard Worker coords += "}";
135*38e8c45fSAndroid Build Coastguard Worker }
136*38e8c45fSAndroid Build Coastguard Worker return StringPrintf("NotifyMotionArgs(id=%" PRId32 ", eventTime=%" PRId64 ", deviceId=%" PRId32
137*38e8c45fSAndroid Build Coastguard Worker ", source=%s, action=%s, pointerCount=%zu pointers=%s, flags=0x%08x)",
138*38e8c45fSAndroid Build Coastguard Worker id, eventTime, deviceId, inputEventSourceToString(source).c_str(),
139*38e8c45fSAndroid Build Coastguard Worker MotionEvent::actionToString(action).c_str(), getPointerCount(),
140*38e8c45fSAndroid Build Coastguard Worker coords.c_str(), flags);
141*38e8c45fSAndroid Build Coastguard Worker }
142*38e8c45fSAndroid Build Coastguard Worker
143*38e8c45fSAndroid Build Coastguard Worker // --- NotifySwitchArgs ---
144*38e8c45fSAndroid Build Coastguard Worker
NotifySwitchArgs(int32_t id,nsecs_t eventTime,uint32_t policyFlags,uint32_t switchValues,uint32_t switchMask)145*38e8c45fSAndroid Build Coastguard Worker NotifySwitchArgs::NotifySwitchArgs(int32_t id, nsecs_t eventTime, uint32_t policyFlags,
146*38e8c45fSAndroid Build Coastguard Worker uint32_t switchValues, uint32_t switchMask)
147*38e8c45fSAndroid Build Coastguard Worker : id(id),
148*38e8c45fSAndroid Build Coastguard Worker eventTime(eventTime),
149*38e8c45fSAndroid Build Coastguard Worker policyFlags(policyFlags),
150*38e8c45fSAndroid Build Coastguard Worker switchValues(switchValues),
151*38e8c45fSAndroid Build Coastguard Worker switchMask(switchMask) {}
152*38e8c45fSAndroid Build Coastguard Worker
153*38e8c45fSAndroid Build Coastguard Worker // --- NotifySensorArgs ---
154*38e8c45fSAndroid Build Coastguard Worker
NotifySensorArgs(int32_t id,nsecs_t eventTime,int32_t deviceId,uint32_t source,InputDeviceSensorType sensorType,InputDeviceSensorAccuracy accuracy,bool accuracyChanged,nsecs_t hwTimestamp,std::vector<float> values)155*38e8c45fSAndroid Build Coastguard Worker NotifySensorArgs::NotifySensorArgs(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
156*38e8c45fSAndroid Build Coastguard Worker InputDeviceSensorType sensorType,
157*38e8c45fSAndroid Build Coastguard Worker InputDeviceSensorAccuracy accuracy, bool accuracyChanged,
158*38e8c45fSAndroid Build Coastguard Worker nsecs_t hwTimestamp, std::vector<float> values)
159*38e8c45fSAndroid Build Coastguard Worker : id(id),
160*38e8c45fSAndroid Build Coastguard Worker eventTime(eventTime),
161*38e8c45fSAndroid Build Coastguard Worker deviceId(deviceId),
162*38e8c45fSAndroid Build Coastguard Worker source(source),
163*38e8c45fSAndroid Build Coastguard Worker sensorType(sensorType),
164*38e8c45fSAndroid Build Coastguard Worker accuracy(accuracy),
165*38e8c45fSAndroid Build Coastguard Worker accuracyChanged(accuracyChanged),
166*38e8c45fSAndroid Build Coastguard Worker hwTimestamp(hwTimestamp),
167*38e8c45fSAndroid Build Coastguard Worker values(std::move(values)) {}
168*38e8c45fSAndroid Build Coastguard Worker
169*38e8c45fSAndroid Build Coastguard Worker // --- NotifyVibratorStateArgs ---
170*38e8c45fSAndroid Build Coastguard Worker
NotifyVibratorStateArgs(int32_t id,nsecs_t eventTime,int32_t deviceId,bool isOn)171*38e8c45fSAndroid Build Coastguard Worker NotifyVibratorStateArgs::NotifyVibratorStateArgs(int32_t id, nsecs_t eventTime, int32_t deviceId,
172*38e8c45fSAndroid Build Coastguard Worker bool isOn)
173*38e8c45fSAndroid Build Coastguard Worker : id(id), eventTime(eventTime), deviceId(deviceId), isOn(isOn) {}
174*38e8c45fSAndroid Build Coastguard Worker
175*38e8c45fSAndroid Build Coastguard Worker // --- NotifyDeviceResetArgs ---
176*38e8c45fSAndroid Build Coastguard Worker
NotifyDeviceResetArgs(int32_t id,nsecs_t eventTime,int32_t deviceId)177*38e8c45fSAndroid Build Coastguard Worker NotifyDeviceResetArgs::NotifyDeviceResetArgs(int32_t id, nsecs_t eventTime, int32_t deviceId)
178*38e8c45fSAndroid Build Coastguard Worker : id(id), eventTime(eventTime), deviceId(deviceId) {}
179*38e8c45fSAndroid Build Coastguard Worker
180*38e8c45fSAndroid Build Coastguard Worker // --- NotifyPointerCaptureChangedArgs ---
181*38e8c45fSAndroid Build Coastguard Worker
NotifyPointerCaptureChangedArgs(int32_t id,nsecs_t eventTime,const PointerCaptureRequest & request)182*38e8c45fSAndroid Build Coastguard Worker NotifyPointerCaptureChangedArgs::NotifyPointerCaptureChangedArgs(
183*38e8c45fSAndroid Build Coastguard Worker int32_t id, nsecs_t eventTime, const PointerCaptureRequest& request)
184*38e8c45fSAndroid Build Coastguard Worker : id(id), eventTime(eventTime), request(request) {}
185*38e8c45fSAndroid Build Coastguard Worker
186*38e8c45fSAndroid Build Coastguard Worker // Helper to std::visit with lambdas.
187*38e8c45fSAndroid Build Coastguard Worker template <typename... V>
188*38e8c45fSAndroid Build Coastguard Worker struct Visitor : V... { using V::operator()...; };
189*38e8c45fSAndroid Build Coastguard Worker // explicit deduction guide (not needed as of C++20)
190*38e8c45fSAndroid Build Coastguard Worker template <typename... V>
191*38e8c45fSAndroid Build Coastguard Worker Visitor(V...) -> Visitor<V...>;
192*38e8c45fSAndroid Build Coastguard Worker
toString(const NotifyArgs & args)193*38e8c45fSAndroid Build Coastguard Worker const char* toString(const NotifyArgs& args) {
194*38e8c45fSAndroid Build Coastguard Worker Visitor toStringVisitor{
195*38e8c45fSAndroid Build Coastguard Worker [&](const NotifyInputDevicesChangedArgs&) { return "NotifyInputDevicesChangedArgs"; },
196*38e8c45fSAndroid Build Coastguard Worker [&](const NotifyKeyArgs&) { return "NotifyKeyArgs"; },
197*38e8c45fSAndroid Build Coastguard Worker [&](const NotifyMotionArgs&) { return "NotifyMotionArgs"; },
198*38e8c45fSAndroid Build Coastguard Worker [&](const NotifySensorArgs&) { return "NotifySensorArgs"; },
199*38e8c45fSAndroid Build Coastguard Worker [&](const NotifySwitchArgs&) { return "NotifySwitchArgs"; },
200*38e8c45fSAndroid Build Coastguard Worker [&](const NotifyDeviceResetArgs&) { return "NotifyDeviceResetArgs"; },
201*38e8c45fSAndroid Build Coastguard Worker [&](const NotifyPointerCaptureChangedArgs&) {
202*38e8c45fSAndroid Build Coastguard Worker return "NotifyPointerCaptureChangedArgs";
203*38e8c45fSAndroid Build Coastguard Worker },
204*38e8c45fSAndroid Build Coastguard Worker [&](const NotifyVibratorStateArgs&) { return "NotifyVibratorStateArgs"; },
205*38e8c45fSAndroid Build Coastguard Worker };
206*38e8c45fSAndroid Build Coastguard Worker return std::visit(toStringVisitor, args);
207*38e8c45fSAndroid Build Coastguard Worker }
208*38e8c45fSAndroid Build Coastguard Worker
209*38e8c45fSAndroid Build Coastguard Worker } // namespace android
210