Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2024 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | #define LOG_TAG "InputTracer" |
| 18 | |
| 19 | #include "InputTracingPerfettoBackend.h" |
| 20 | |
| 21 | #include "AndroidInputEventProtoConverter.h" |
| 22 | |
| 23 | #include <android-base/logging.h> |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 24 | #include <binder/IServiceManager.h> |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 25 | #include <perfetto/trace/android/android_input_event.pbzero.h> |
Prabir Pradhan | 6ef947a | 2024-06-10 20:00:51 +0000 | [diff] [blame] | 26 | #include <perfetto/trace/android/winscope_extensions.pbzero.h> |
| 27 | #include <perfetto/trace/android/winscope_extensions_impl.pbzero.h> |
Prabir Pradhan | bf3c832 | 2024-02-23 02:38:36 +0000 | [diff] [blame] | 28 | #include <private/android_filesystem_config.h> |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 29 | #include <utils/String16.h> |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 30 | |
| 31 | namespace android::inputdispatcher::trace::impl { |
| 32 | |
| 33 | namespace { |
| 34 | |
| 35 | constexpr auto INPUT_EVENT_TRACE_DATA_SOURCE_NAME = "android.input.inputevent"; |
| 36 | |
Prabir Pradhan | bf3c832 | 2024-02-23 02:38:36 +0000 | [diff] [blame] | 37 | bool isPermanentlyAllowed(gui::Uid uid) { |
| 38 | switch (uid.val()) { |
| 39 | case AID_SYSTEM: |
| 40 | case AID_SHELL: |
| 41 | case AID_ROOT: |
| 42 | return true; |
| 43 | default: |
| 44 | return false; |
| 45 | } |
| 46 | } |
| 47 | |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 48 | sp<content::pm::IPackageManagerNative> getPackageManager() { |
| 49 | sp<IServiceManager> serviceManager = defaultServiceManager(); |
| 50 | if (!serviceManager) { |
| 51 | LOG(ERROR) << __func__ << ": unable to access native ServiceManager"; |
| 52 | return nullptr; |
| 53 | } |
| 54 | |
| 55 | sp<IBinder> binder = serviceManager->waitForService(String16("package_native")); |
| 56 | auto packageManager = interface_cast<content::pm::IPackageManagerNative>(binder); |
| 57 | if (!packageManager) { |
| 58 | LOG(ERROR) << ": unable to access native PackageManager"; |
| 59 | return nullptr; |
| 60 | } |
| 61 | return packageManager; |
| 62 | } |
| 63 | |
| 64 | gui::Uid getPackageUid(const sp<content::pm::IPackageManagerNative>& pm, |
| 65 | const std::string& package) { |
| 66 | int32_t outUid = -1; |
| 67 | if (auto status = pm->getPackageUid(package, /*flags=*/0, AID_SYSTEM, &outUid); |
| 68 | !status.isOk()) { |
| 69 | LOG(INFO) << "Failed to get package UID from native package manager for package '" |
| 70 | << package << "': " << status; |
| 71 | return gui::Uid::INVALID; |
| 72 | } |
| 73 | return gui::Uid{static_cast<uid_t>(outUid)}; |
| 74 | } |
| 75 | |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 76 | } // namespace |
| 77 | |
| 78 | // --- PerfettoBackend::InputEventDataSource --- |
| 79 | |
Prabir Pradhan | 58f19f6 | 2024-03-07 21:54:34 +0000 | [diff] [blame] | 80 | PerfettoBackend::InputEventDataSource::InputEventDataSource() : mInstanceId(sNextInstanceId++) {} |
| 81 | |
| 82 | void PerfettoBackend::InputEventDataSource::OnSetup(const InputEventDataSource::SetupArgs& args) { |
| 83 | LOG(INFO) << "Setting up perfetto trace for: " << INPUT_EVENT_TRACE_DATA_SOURCE_NAME |
| 84 | << ", instanceId: " << mInstanceId; |
| 85 | const auto rawConfig = args.config->android_input_event_config_raw(); |
| 86 | auto protoConfig = perfetto::protos::pbzero::AndroidInputEventConfig::Decoder{rawConfig}; |
| 87 | |
| 88 | mConfig = AndroidInputEventProtoConverter::parseConfig(protoConfig); |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 89 | } |
| 90 | |
Prabir Pradhan | 58f19f6 | 2024-03-07 21:54:34 +0000 | [diff] [blame] | 91 | void PerfettoBackend::InputEventDataSource::OnStart(const InputEventDataSource::StartArgs&) { |
| 92 | LOG(INFO) << "Starting perfetto trace for: " << INPUT_EVENT_TRACE_DATA_SOURCE_NAME |
| 93 | << ", instanceId: " << mInstanceId; |
| 94 | } |
| 95 | |
| 96 | void PerfettoBackend::InputEventDataSource::OnStop(const InputEventDataSource::StopArgs&) { |
| 97 | LOG(INFO) << "Stopping perfetto trace for: " << INPUT_EVENT_TRACE_DATA_SOURCE_NAME |
| 98 | << ", instanceId: " << mInstanceId; |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 99 | InputEventDataSource::Trace([&](InputEventDataSource::TraceContext ctx) { ctx.Flush(); }); |
| 100 | } |
| 101 | |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 102 | void PerfettoBackend::InputEventDataSource::initializeUidMap() { |
Prabir Pradhan | bf3c832 | 2024-02-23 02:38:36 +0000 | [diff] [blame] | 103 | if (mUidMap.has_value()) { |
| 104 | return; |
| 105 | } |
| 106 | |
| 107 | mUidMap = {{}}; |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 108 | auto packageManager = PerfettoBackend::sPackageManagerProvider(); |
| 109 | if (!packageManager) { |
| 110 | LOG(ERROR) << "Failed to initialize UID map: Could not get native package manager"; |
| 111 | return; |
| 112 | } |
| 113 | |
Prabir Pradhan | bf3c832 | 2024-02-23 02:38:36 +0000 | [diff] [blame] | 114 | for (const auto& rule : mConfig.rules) { |
| 115 | for (const auto& package : rule.matchAllPackages) { |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 116 | mUidMap->emplace(package, getPackageUid(packageManager, package)); |
Prabir Pradhan | bf3c832 | 2024-02-23 02:38:36 +0000 | [diff] [blame] | 117 | } |
| 118 | for (const auto& package : rule.matchAnyPackages) { |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 119 | mUidMap->emplace(package, getPackageUid(packageManager, package)); |
Prabir Pradhan | bf3c832 | 2024-02-23 02:38:36 +0000 | [diff] [blame] | 120 | } |
| 121 | } |
| 122 | } |
| 123 | |
Prabir Pradhan | 4c49aad | 2024-02-08 20:42:35 +0000 | [diff] [blame] | 124 | bool PerfettoBackend::InputEventDataSource::shouldIgnoreTracedInputEvent( |
| 125 | const EventType& type) const { |
| 126 | if (!getFlags().test(TraceFlag::TRACE_DISPATCHER_INPUT_EVENTS)) { |
| 127 | // Ignore all input events. |
| 128 | return true; |
| 129 | } |
| 130 | if (!getFlags().test(TraceFlag::TRACE_DISPATCHER_WINDOW_DISPATCH) && |
| 131 | type != EventType::INBOUND) { |
| 132 | // When window dispatch tracing is disabled, ignore any events that are not inbound events. |
| 133 | return true; |
| 134 | } |
| 135 | return false; |
| 136 | } |
| 137 | |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 138 | TraceLevel PerfettoBackend::InputEventDataSource::resolveTraceLevel( |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 139 | const TracedEventMetadata& metadata) const { |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 140 | // Check for matches with the rules in the order that they are defined. |
| 141 | for (const auto& rule : mConfig.rules) { |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 142 | if (ruleMatches(rule, metadata)) { |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 143 | return rule.level; |
| 144 | } |
| 145 | } |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 146 | // The event is not traced if it matched zero rules. |
| 147 | return TraceLevel::TRACE_LEVEL_NONE; |
| 148 | } |
| 149 | |
| 150 | bool PerfettoBackend::InputEventDataSource::ruleMatches(const TraceRule& rule, |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 151 | const TracedEventMetadata& metadata) const { |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 152 | // By default, a rule will match all events. Return early if the rule does not match. |
| 153 | |
Prabir Pradhan | bf3c832 | 2024-02-23 02:38:36 +0000 | [diff] [blame] | 154 | // Match the event if it is directed to a secure window. |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 155 | if (rule.matchSecure.has_value() && *rule.matchSecure != metadata.isSecure) { |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 156 | return false; |
| 157 | } |
| 158 | |
Prabir Pradhan | 04a6642 | 2024-03-15 22:45:27 +0000 | [diff] [blame] | 159 | // Match the event if it was processed while there was an active InputMethod connection. |
| 160 | if (rule.matchImeConnectionActive.has_value() && |
| 161 | *rule.matchImeConnectionActive != metadata.isImeConnectionActive) { |
| 162 | return false; |
| 163 | } |
| 164 | |
Prabir Pradhan | bf3c832 | 2024-02-23 02:38:36 +0000 | [diff] [blame] | 165 | // Match the event if all of its target packages are explicitly allowed in the "match all" list. |
| 166 | if (!rule.matchAllPackages.empty() && |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 167 | !std::all_of(metadata.targets.begin(), metadata.targets.end(), [&](const auto& uid) { |
Prabir Pradhan | bf3c832 | 2024-02-23 02:38:36 +0000 | [diff] [blame] | 168 | return isPermanentlyAllowed(uid) || |
| 169 | std::any_of(rule.matchAllPackages.begin(), rule.matchAllPackages.end(), |
| 170 | [&](const auto& pkg) { return uid == mUidMap->at(pkg); }); |
| 171 | })) { |
| 172 | return false; |
| 173 | } |
| 174 | |
| 175 | // Match the event if any of its target packages are allowed in the "match any" list. |
| 176 | if (!rule.matchAnyPackages.empty() && |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 177 | !std::any_of(metadata.targets.begin(), metadata.targets.end(), [&](const auto& uid) { |
Prabir Pradhan | bf3c832 | 2024-02-23 02:38:36 +0000 | [diff] [blame] | 178 | return std::any_of(rule.matchAnyPackages.begin(), rule.matchAnyPackages.end(), |
| 179 | [&](const auto& pkg) { return uid == mUidMap->at(pkg); }); |
| 180 | })) { |
| 181 | return false; |
| 182 | } |
| 183 | |
| 184 | // The event matches all matchers specified in the rule. |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 185 | return true; |
| 186 | } |
| 187 | |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 188 | // --- PerfettoBackend --- |
| 189 | |
Prabir Pradhan | 9a9897d | 2024-03-21 21:52:57 +0000 | [diff] [blame] | 190 | bool PerfettoBackend::sUseInProcessBackendForTest{false}; |
| 191 | |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 192 | std::function<sp<content::pm::IPackageManagerNative>()> PerfettoBackend::sPackageManagerProvider{ |
| 193 | &getPackageManager}; |
| 194 | |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 195 | std::once_flag PerfettoBackend::sDataSourceRegistrationFlag{}; |
| 196 | |
Prabir Pradhan | 58f19f6 | 2024-03-07 21:54:34 +0000 | [diff] [blame] | 197 | std::atomic<int32_t> PerfettoBackend::sNextInstanceId{1}; |
| 198 | |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 199 | PerfettoBackend::PerfettoBackend() { |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 200 | // Use a once-flag to ensure that the data source is only registered once per boot, since |
| 201 | // we never unregister the InputEventDataSource. |
| 202 | std::call_once(sDataSourceRegistrationFlag, []() { |
| 203 | perfetto::TracingInitArgs args; |
Prabir Pradhan | 9a9897d | 2024-03-21 21:52:57 +0000 | [diff] [blame] | 204 | args.backends = sUseInProcessBackendForTest ? perfetto::kInProcessBackend |
| 205 | : perfetto::kSystemBackend; |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 206 | perfetto::Tracing::Initialize(args); |
| 207 | |
| 208 | // Register our custom data source for input event tracing. |
| 209 | perfetto::DataSourceDescriptor dsd; |
| 210 | dsd.set_name(INPUT_EVENT_TRACE_DATA_SOURCE_NAME); |
| 211 | InputEventDataSource::Register(dsd); |
| 212 | LOG(INFO) << "InputTracer initialized for data source: " |
| 213 | << INPUT_EVENT_TRACE_DATA_SOURCE_NAME; |
| 214 | }); |
| 215 | } |
| 216 | |
Prabir Pradhan | 8c3b143 | 2024-02-09 23:34:16 +0000 | [diff] [blame] | 217 | void PerfettoBackend::traceMotionEvent(const TracedMotionEvent& event, |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 218 | const TracedEventMetadata& metadata) { |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 219 | InputEventDataSource::Trace([&](InputEventDataSource::TraceContext ctx) { |
Prabir Pradhan | 4c49aad | 2024-02-08 20:42:35 +0000 | [diff] [blame] | 220 | auto dataSource = ctx.GetDataSourceLocked(); |
Prabir Pradhan | 9a9897d | 2024-03-21 21:52:57 +0000 | [diff] [blame] | 221 | if (!dataSource.valid()) { |
| 222 | return; |
| 223 | } |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 224 | dataSource->initializeUidMap(); |
Prabir Pradhan | 4c49aad | 2024-02-08 20:42:35 +0000 | [diff] [blame] | 225 | if (dataSource->shouldIgnoreTracedInputEvent(event.eventType)) { |
| 226 | return; |
| 227 | } |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 228 | const TraceLevel traceLevel = dataSource->resolveTraceLevel(metadata); |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 229 | if (traceLevel == TraceLevel::TRACE_LEVEL_NONE) { |
| 230 | return; |
| 231 | } |
| 232 | const bool isRedacted = traceLevel == TraceLevel::TRACE_LEVEL_REDACTED; |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 233 | auto tracePacket = ctx.NewTracePacket(); |
Prabir Pradhan | 4fc32e0 | 2024-06-14 16:00:58 +0000 | [diff] [blame] | 234 | tracePacket->set_timestamp(metadata.processingTimestamp); |
| 235 | tracePacket->set_timestamp_clock_id(perfetto::protos::pbzero::BUILTIN_CLOCK_MONOTONIC); |
Prabir Pradhan | 6ef947a | 2024-06-10 20:00:51 +0000 | [diff] [blame] | 236 | auto* winscopeExtensions = static_cast<perfetto::protos::pbzero::WinscopeExtensionsImpl*>( |
| 237 | tracePacket->set_winscope_extensions()); |
| 238 | auto* inputEvent = winscopeExtensions->set_android_input_event(); |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 239 | auto* dispatchMotion = isRedacted ? inputEvent->set_dispatcher_motion_event_redacted() |
| 240 | : inputEvent->set_dispatcher_motion_event(); |
| 241 | AndroidInputEventProtoConverter::toProtoMotionEvent(event, *dispatchMotion, isRedacted); |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 242 | }); |
| 243 | } |
| 244 | |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 245 | void PerfettoBackend::traceKeyEvent(const TracedKeyEvent& event, |
| 246 | const TracedEventMetadata& metadata) { |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 247 | InputEventDataSource::Trace([&](InputEventDataSource::TraceContext ctx) { |
Prabir Pradhan | 4c49aad | 2024-02-08 20:42:35 +0000 | [diff] [blame] | 248 | auto dataSource = ctx.GetDataSourceLocked(); |
Prabir Pradhan | 9a9897d | 2024-03-21 21:52:57 +0000 | [diff] [blame] | 249 | if (!dataSource.valid()) { |
| 250 | return; |
| 251 | } |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 252 | dataSource->initializeUidMap(); |
Prabir Pradhan | 4c49aad | 2024-02-08 20:42:35 +0000 | [diff] [blame] | 253 | if (dataSource->shouldIgnoreTracedInputEvent(event.eventType)) { |
| 254 | return; |
| 255 | } |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 256 | const TraceLevel traceLevel = dataSource->resolveTraceLevel(metadata); |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 257 | if (traceLevel == TraceLevel::TRACE_LEVEL_NONE) { |
| 258 | return; |
| 259 | } |
| 260 | const bool isRedacted = traceLevel == TraceLevel::TRACE_LEVEL_REDACTED; |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 261 | auto tracePacket = ctx.NewTracePacket(); |
Prabir Pradhan | 4fc32e0 | 2024-06-14 16:00:58 +0000 | [diff] [blame] | 262 | tracePacket->set_timestamp(metadata.processingTimestamp); |
| 263 | tracePacket->set_timestamp_clock_id(perfetto::protos::pbzero::BUILTIN_CLOCK_MONOTONIC); |
Prabir Pradhan | 6ef947a | 2024-06-10 20:00:51 +0000 | [diff] [blame] | 264 | auto* winscopeExtensions = static_cast<perfetto::protos::pbzero::WinscopeExtensionsImpl*>( |
| 265 | tracePacket->set_winscope_extensions()); |
| 266 | auto* inputEvent = winscopeExtensions->set_android_input_event(); |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 267 | auto* dispatchKey = isRedacted ? inputEvent->set_dispatcher_key_event_redacted() |
| 268 | : inputEvent->set_dispatcher_key_event(); |
| 269 | AndroidInputEventProtoConverter::toProtoKeyEvent(event, *dispatchKey, isRedacted); |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 270 | }); |
| 271 | } |
| 272 | |
Prabir Pradhan | 8c3b143 | 2024-02-09 23:34:16 +0000 | [diff] [blame] | 273 | void PerfettoBackend::traceWindowDispatch(const WindowDispatchArgs& dispatchArgs, |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 274 | const TracedEventMetadata& metadata) { |
Prabir Pradhan | adc59b4 | 2023-12-15 05:34:11 +0000 | [diff] [blame] | 275 | InputEventDataSource::Trace([&](InputEventDataSource::TraceContext ctx) { |
Prabir Pradhan | 4c49aad | 2024-02-08 20:42:35 +0000 | [diff] [blame] | 276 | auto dataSource = ctx.GetDataSourceLocked(); |
Prabir Pradhan | 9a9897d | 2024-03-21 21:52:57 +0000 | [diff] [blame] | 277 | if (!dataSource.valid()) { |
| 278 | return; |
| 279 | } |
Prabir Pradhan | f409945 | 2024-04-12 18:34:14 +0000 | [diff] [blame] | 280 | dataSource->initializeUidMap(); |
Prabir Pradhan | 4c49aad | 2024-02-08 20:42:35 +0000 | [diff] [blame] | 281 | if (!dataSource->getFlags().test(TraceFlag::TRACE_DISPATCHER_WINDOW_DISPATCH)) { |
| 282 | return; |
| 283 | } |
Prabir Pradhan | c7edaaa | 2024-03-15 15:31:02 +0000 | [diff] [blame] | 284 | const TraceLevel traceLevel = dataSource->resolveTraceLevel(metadata); |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 285 | if (traceLevel == TraceLevel::TRACE_LEVEL_NONE) { |
| 286 | return; |
| 287 | } |
| 288 | const bool isRedacted = traceLevel == TraceLevel::TRACE_LEVEL_REDACTED; |
Prabir Pradhan | adc59b4 | 2023-12-15 05:34:11 +0000 | [diff] [blame] | 289 | auto tracePacket = ctx.NewTracePacket(); |
Prabir Pradhan | 4fc32e0 | 2024-06-14 16:00:58 +0000 | [diff] [blame] | 290 | tracePacket->set_timestamp(dispatchArgs.deliveryTime); |
| 291 | tracePacket->set_timestamp_clock_id(perfetto::protos::pbzero::BUILTIN_CLOCK_MONOTONIC); |
Prabir Pradhan | 6ef947a | 2024-06-10 20:00:51 +0000 | [diff] [blame] | 292 | auto* winscopeExtensions = static_cast<perfetto::protos::pbzero::WinscopeExtensionsImpl*>( |
| 293 | tracePacket->set_winscope_extensions()); |
| 294 | auto* inputEvent = winscopeExtensions->set_android_input_event(); |
Prabir Pradhan | b568238 | 2024-02-23 22:52:31 +0000 | [diff] [blame] | 295 | auto* dispatchEvent = isRedacted |
| 296 | ? inputEvent->set_dispatcher_window_dispatch_event_redacted() |
| 297 | : inputEvent->set_dispatcher_window_dispatch_event(); |
| 298 | AndroidInputEventProtoConverter::toProtoWindowDispatchEvent(dispatchArgs, *dispatchEvent, |
| 299 | isRedacted); |
Prabir Pradhan | adc59b4 | 2023-12-15 05:34:11 +0000 | [diff] [blame] | 300 | }); |
Prabir Pradhan | dae5279 | 2023-12-15 07:36:40 +0000 | [diff] [blame] | 301 | } |
| 302 | |
| 303 | } // namespace android::inputdispatcher::trace::impl |