/* * Copyright (C) 2021 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 "InputEventTimeline.h" #include "../InputDeviceMetricsSource.h" namespace android::inputdispatcher { ConnectionTimeline::ConnectionTimeline(nsecs_t deliveryTime, nsecs_t consumeTime, nsecs_t finishTime) : deliveryTime(deliveryTime), consumeTime(consumeTime), finishTime(finishTime), mHasDispatchTimeline(true) {} ConnectionTimeline::ConnectionTimeline(std::array graphicsTimeline) : graphicsTimeline(std::move(graphicsTimeline)), mHasGraphicsTimeline(true) {} bool ConnectionTimeline::isComplete() const { return mHasDispatchTimeline && mHasGraphicsTimeline; } bool ConnectionTimeline::setDispatchTimeline(nsecs_t inDeliveryTime, nsecs_t inConsumeTime, nsecs_t inFinishTime) { if (mHasDispatchTimeline) { return false; } deliveryTime = inDeliveryTime; consumeTime = inConsumeTime; finishTime = inFinishTime; mHasDispatchTimeline = true; return true; } bool ConnectionTimeline::setGraphicsTimeline(std::array timeline) { if (mHasGraphicsTimeline) { return false; } graphicsTimeline = std::move(timeline); mHasGraphicsTimeline = true; return true; } bool ConnectionTimeline::operator==(const ConnectionTimeline& rhs) const { return deliveryTime == rhs.deliveryTime && consumeTime == rhs.consumeTime && finishTime == rhs.finishTime && graphicsTimeline == rhs.graphicsTimeline && mHasDispatchTimeline == rhs.mHasDispatchTimeline && mHasGraphicsTimeline == rhs.mHasGraphicsTimeline; } bool ConnectionTimeline::operator!=(const ConnectionTimeline& rhs) const { return !operator==(rhs); } InputEventTimeline::InputEventTimeline(nsecs_t eventTime, nsecs_t readTime, uint16_t vendorId, uint16_t productId, const std::set& sources, InputEventActionType inputEventActionType) : eventTime(eventTime), readTime(readTime), vendorId(vendorId), productId(productId), sources(sources), inputEventActionType(inputEventActionType) {} bool InputEventTimeline::operator==(const InputEventTimeline& rhs) const { if (connectionTimelines.size() != rhs.connectionTimelines.size()) { return false; } for (const auto& [connectionToken, connectionTimeline] : connectionTimelines) { auto it = rhs.connectionTimelines.find(connectionToken); if (it == rhs.connectionTimelines.end()) { return false; } if (connectionTimeline != it->second) { return false; } } return eventTime == rhs.eventTime && readTime == rhs.readTime && vendorId == rhs.vendorId && productId == rhs.productId && sources == rhs.sources && inputEventActionType == rhs.inputEventActionType; } } // namespace android::inputdispatcher