Skip to content

Commit 61511eb

Browse files
caroqliuCQ Bot
authored andcommitted
[activity][input-pipeline] Report activity from TouchInjectorHandler
Test: fx test input_pipeline_lib_tests Test: fx test touch-input-test-ip Multiply: touch-input-test-ip Bug: 103837 Change-Id: I5213d930c2a5c97f86aa0d76249e18d815829676 Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/706318 Reviewed-by: Mukesh Agrawal <[email protected]> Commit-Queue: Caroline Liu <[email protected]>
1 parent e6b2fff commit 61511eb

File tree

1 file changed

+76
-4
lines changed

1 file changed

+76
-4
lines changed

src/ui/lib/input_pipeline/src/touch_injector_handler.rs

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use {
1212
async_trait::async_trait,
1313
async_utils::hanging_get::client::HangingGetStream,
1414
fidl::endpoints::create_proxy,
15+
fidl_fuchsia_input_interaction_observation as interaction_observation,
1516
fidl_fuchsia_ui_pointerinjector as pointerinjector,
1617
fidl_fuchsia_ui_pointerinjector_configuration as pointerinjector_config,
1718
fuchsia_component::client::connect_to_protocol,
@@ -46,6 +47,9 @@ pub struct TouchInjectorHandler {
4647

4748
/// The FIDL proxy used to get configuration details for pointer injection.
4849
configuration_proxy: pointerinjector_config::SetupProxy,
50+
51+
/// The FIDL proxy used to report touch activity to the activity service.
52+
aggregator_proxy: interaction_observation::AggregatorProxy,
4953
}
5054

5155
#[derive(Debug)]
@@ -88,6 +92,11 @@ impl UnhandledInputHandler for TouchInjectorHandler {
8892
fx_log_err!("{}", e);
8993
}
9094

95+
// Report the event to the Activity Service.
96+
if let Err(e) = self.report_touch_activity(event_time).await {
97+
fx_log_err!("report_touch_activity failed: {}", e);
98+
}
99+
91100
// Consume the input event.
92101
vec![input_device::InputEvent::from(unhandled_input_event).into_handled()]
93102
}
@@ -111,8 +120,15 @@ impl TouchInjectorHandler {
111120
pub async fn new(display_size: Size) -> Result<Rc<Self>, Error> {
112121
let configuration_proxy = connect_to_protocol::<pointerinjector_config::SetupMarker>()?;
113122
let injector_registry_proxy = connect_to_protocol::<pointerinjector::RegistryMarker>()?;
123+
let aggregator_proxy = connect_to_protocol::<interaction_observation::AggregatorMarker>()?;
114124

115-
Self::new_handler(configuration_proxy, injector_registry_proxy, display_size).await
125+
Self::new_handler(
126+
aggregator_proxy,
127+
configuration_proxy,
128+
injector_registry_proxy,
129+
display_size,
130+
)
131+
.await
116132
}
117133

118134
/// Creates a new touch handler that holds touch pointer injectors.
@@ -133,8 +149,15 @@ impl TouchInjectorHandler {
133149
configuration_proxy: pointerinjector_config::SetupProxy,
134150
display_size: Size,
135151
) -> Result<Rc<Self>, Error> {
152+
let aggregator_proxy = connect_to_protocol::<interaction_observation::AggregatorMarker>()?;
136153
let injector_registry_proxy = connect_to_protocol::<pointerinjector::RegistryMarker>()?;
137-
Self::new_handler(configuration_proxy, injector_registry_proxy, display_size).await
154+
Self::new_handler(
155+
aggregator_proxy,
156+
configuration_proxy,
157+
injector_registry_proxy,
158+
display_size,
159+
)
160+
.await
138161
}
139162

140163
/// Creates a new touch handler that holds touch pointer injectors.
@@ -144,6 +167,7 @@ impl TouchInjectorHandler {
144167
/// fasync::Task::local(handler.clone().watch_viewport()).detach();
145168
///
146169
/// # Parameters
170+
/// - `aggregator_proxy`: A proxy used to report to the activity service
147171
/// - `configuration_proxy`: A proxy used to get configuration details for pointer
148172
/// injection.
149173
/// - `injector_registry_proxy`: A proxy used to register new pointer injectors. If
@@ -153,6 +177,7 @@ impl TouchInjectorHandler {
153177
/// # Errors
154178
/// If unable to get injection view refs from `configuration_proxy`.
155179
async fn new_handler(
180+
aggregator_proxy: interaction_observation::AggregatorProxy,
156181
configuration_proxy: pointerinjector_config::SetupProxy,
157182
injector_registry_proxy: pointerinjector::RegistryProxy,
158183
display_size: Size,
@@ -167,6 +192,7 @@ impl TouchInjectorHandler {
167192
display_size,
168193
injector_registry_proxy,
169194
configuration_proxy,
195+
aggregator_proxy,
170196
});
171197

172198
Ok(handler)
@@ -365,6 +391,11 @@ impl TouchInjectorHandler {
365391
}
366392
}
367393

394+
/// Reports the given event_time to the activity service.
395+
async fn report_touch_activity(&self, event_time: zx::Time) -> Result<(), fidl::Error> {
396+
self.aggregator_proxy.report_discrete_activity(event_time.into_nanos()).await
397+
}
398+
368399
/// Watches for viewport updates from the scene manager.
369400
pub async fn watch_viewport(self: Rc<Self>) {
370401
let configuration_proxy = self.configuration_proxy.clone();
@@ -511,6 +542,27 @@ mod tests {
511542
}
512543
}
513544

545+
/// Handles |fidl_fuchsia_interaction_observation::AggregatorRequest|s.
546+
async fn handle_aggregator_request_stream(
547+
mut stream: interaction_observation::AggregatorRequestStream,
548+
expected_time: i64,
549+
) {
550+
if let Some(request) = stream.next().await {
551+
match request {
552+
Ok(interaction_observation::AggregatorRequest::ReportDiscreteActivity {
553+
event_time,
554+
responder,
555+
}) => {
556+
assert_eq!(event_time, expected_time);
557+
responder.send().expect("failed to respond");
558+
}
559+
other => panic!("expected aggregator report request, but got {:?}", other),
560+
};
561+
} else {
562+
panic!("AggregatorRequestStream failed.");
563+
}
564+
}
565+
514566
// Creates a |pointerinjector::Viewport|.
515567
fn create_viewport(min: f32, max: f32) -> pointerinjector::Viewport {
516568
pointerinjector::Viewport {
@@ -527,13 +579,17 @@ mod tests {
527579
let mut exec = fasync::TestExecutor::new().expect("executor needed");
528580

529581
// Create touch handler.
582+
let (aggregator_proxy, _) =
583+
fidl::endpoints::create_proxy_and_stream::<interaction_observation::AggregatorMarker>()
584+
.expect("Failed to create interaction observation Aggregator proxy and stream.");
530585
let (configuration_proxy, mut configuration_request_stream) =
531586
fidl::endpoints::create_proxy_and_stream::<pointerinjector_config::SetupMarker>()
532587
.expect("Failed to create pointerinjector Setup proxy and stream.");
533588
let (injector_registry_proxy, _injector_registry_request_stream) =
534589
fidl::endpoints::create_proxy_and_stream::<pointerinjector::RegistryMarker>()
535590
.expect("Failed to create pointerinjector Registry proxy and stream.");
536591
let touch_handler_fut = TouchInjectorHandler::new_handler(
592+
aggregator_proxy,
537593
configuration_proxy,
538594
injector_registry_proxy,
539595
Size { width: DISPLAY_WIDTH, height: DISPLAY_HEIGHT },
@@ -632,6 +688,9 @@ mod tests {
632688
let mut exec = fasync::TestExecutor::new().expect("executor needed");
633689

634690
// Set up fidl streams.
691+
let (aggregator_proxy, _) =
692+
fidl::endpoints::create_proxy_and_stream::<interaction_observation::AggregatorMarker>()
693+
.expect("Failed to create interaction observation Aggregator proxy and stream.");
635694
let (configuration_proxy, mut configuration_request_stream) =
636695
fidl::endpoints::create_proxy_and_stream::<pointerinjector_config::SetupMarker>()
637696
.expect("Failed to create pointerinjector Setup proxy and stream.");
@@ -643,6 +702,7 @@ mod tests {
643702

644703
// Create TouchInjectorHandler.
645704
let touch_handler_fut = TouchInjectorHandler::new_handler(
705+
aggregator_proxy,
646706
configuration_proxy,
647707
injector_registry_proxy,
648708
Size { width: DISPLAY_WIDTH, height: DISPLAY_HEIGHT },
@@ -685,13 +745,17 @@ mod tests {
685745
let mut exec = fasync::TestExecutor::new().expect("executor needed");
686746

687747
// Create touch handler.
748+
let (aggregator_proxy, aggregator_request_stream) =
749+
fidl::endpoints::create_proxy_and_stream::<interaction_observation::AggregatorMarker>()
750+
.expect("Failed to create interaction observation Aggregator proxy and stream.");
688751
let (configuration_proxy, mut configuration_request_stream) =
689752
fidl::endpoints::create_proxy_and_stream::<pointerinjector_config::SetupMarker>()
690753
.expect("Failed to create pointerinjector Setup proxy and stream.");
691754
let (injector_registry_proxy, _injector_registry_request_stream) =
692755
fidl::endpoints::create_proxy_and_stream::<pointerinjector::RegistryMarker>()
693756
.expect("Failed to create pointerinjector Registry proxy and stream.");
694757
let touch_handler_fut = TouchInjectorHandler::new_handler(
758+
aggregator_proxy,
695759
configuration_proxy,
696760
injector_registry_proxy,
697761
Size { width: DISPLAY_WIDTH, height: DISPLAY_HEIGHT },
@@ -769,8 +833,12 @@ mod tests {
769833
// matches `expected_event`.
770834
let device_fut =
771835
handle_device_request_stream(injector_device_request_stream, expected_event);
772-
let (handle_result, _) =
773-
exec.run_singlethreaded(futures::future::join(handle_event_fut, device_fut));
836+
let aggregator_fut =
837+
handle_aggregator_request_stream(aggregator_request_stream, event_time.into_nanos());
838+
let (handle_result, _) = exec.run_singlethreaded(futures::future::join(
839+
handle_event_fut,
840+
futures::future::join(device_fut, aggregator_fut),
841+
));
774842

775843
// No unhandled events.
776844
assert_matches!(
@@ -785,13 +853,17 @@ mod tests {
785853
let mut exec = fasync::TestExecutor::new().expect("executor needed");
786854

787855
// Create touch handler.
856+
let (aggregator_proxy, _) =
857+
fidl::endpoints::create_proxy_and_stream::<interaction_observation::AggregatorMarker>()
858+
.expect("Failed to create interaction observation Aggregator proxy and stream.");
788859
let (configuration_proxy, mut configuration_request_stream) =
789860
fidl::endpoints::create_proxy_and_stream::<pointerinjector_config::SetupMarker>()
790861
.expect("Failed to create pointerinjector Setup proxy and stream.");
791862
let (injector_registry_proxy, mut injector_registry_request_stream) =
792863
fidl::endpoints::create_proxy_and_stream::<pointerinjector::RegistryMarker>()
793864
.expect("Failed to create pointerinjector Registry proxy and stream.");
794865
let touch_handler_fut = TouchInjectorHandler::new_handler(
866+
aggregator_proxy,
795867
configuration_proxy,
796868
injector_registry_proxy,
797869
Size { width: DISPLAY_WIDTH, height: DISPLAY_HEIGHT },

0 commit comments

Comments
 (0)