ui_puppet_lib/
lib.rs

1// Copyright 2022 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use fidl_fuchsia_ui_test_conformance::{
6    PuppetEmbedRemoteViewResponse, PuppetFactoryCreateResponse, PuppetFactoryRequest,
7    PuppetFactoryRequestStream, PuppetRequest, PuppetRequestStream,
8    PuppetSetEmbeddedViewPropertiesResponse, Result_,
9};
10use futures::TryStreamExt;
11use log::info;
12use std::cell::RefCell;
13use std::rc::Rc;
14
15mod presentation_loop;
16mod view;
17
18async fn run_puppet(request_stream: PuppetRequestStream, puppet_view: Rc<RefCell<view::View>>) {
19    info!("Starting puppet instance");
20
21    request_stream
22        .try_for_each(|request| async {
23            match request {
24                PuppetRequest::EmbedRemoteView { payload, responder, .. } => {
25                    let viewport_id = payload.id.expect("missing viewport id");
26                    let properties = payload.properties.expect("missing embedded view properties");
27
28                    let view_creation_token =
29                        puppet_view.borrow_mut().embed_remote_view(viewport_id, properties).await;
30
31                    responder
32                        .send(PuppetEmbedRemoteViewResponse {
33                            result: Some(Result_::Success),
34                            view_creation_token: Some(view_creation_token),
35                            ..Default::default()
36                        })
37                        .expect("failed to respond to EmbedRemoteView request");
38                }
39                PuppetRequest::SetEmbeddedViewProperties { payload, responder, .. } => {
40                    let viewport_id = payload.id.expect("missing viewport id");
41                    let properties = payload.properties.expect("missing embedded view properties");
42
43                    puppet_view
44                        .borrow_mut()
45                        .set_embedded_view_properties(viewport_id, properties)
46                        .await;
47
48                    responder
49                        .send(&PuppetSetEmbeddedViewPropertiesResponse {
50                            result: Some(Result_::Success),
51                            ..Default::default()
52                        })
53                        .expect("failed to respond to SetEmbeddedViewProperties request");
54                }
55                _ => {
56                    panic!("unsupported operation");
57                }
58            }
59
60            Ok(())
61        })
62        .await
63        .expect("failed to serve puppet stream");
64
65    info!("reached end of puppet request stream; closing connection");
66}
67
68pub async fn run_puppet_factory(request_stream: PuppetFactoryRequestStream) {
69    info!("handling client connection to puppet factory service");
70
71    request_stream
72        .try_for_each_concurrent(None, |request| async {
73            match request {
74                PuppetFactoryRequest::Create { payload, responder, .. } => {
75                    info!("create puppet");
76                    let flatland =
77                        payload.flatland_client.expect("missing flatland client").into_proxy();
78                    let keyboard =
79                        payload.keyboard_client.expect("missing keyboard client").into_proxy();
80                    let view_token =
81                        payload.view_token.expect("missing puppet viewport creation token");
82                    let puppet_server = payload.server_end.expect("missing puppet server endpoint");
83                    let touch_listener = match payload.touch_listener {
84                        None => None,
85                        Some(touch_listener) => Some(touch_listener.into_proxy()),
86                    };
87                    let mouse_listener = match payload.mouse_listener {
88                        None => None,
89                        Some(mouse_listener) => Some(mouse_listener.into_proxy()),
90                    };
91                    let keyboard_listener = match payload.keyboard_listener {
92                        None => None,
93                        Some(keyboard_listener) => Some(keyboard_listener.into_proxy()),
94                    };
95                    let device_pixel_ratio =
96                        payload.device_pixel_ratio.expect("missing device_pixel_ratio");
97
98                    let (view, view_ref) = view::View::new(
99                        flatland,
100                        keyboard,
101                        view_token,
102                        touch_listener,
103                        mouse_listener,
104                        keyboard_listener,
105                        device_pixel_ratio,
106                        payload.focuser,
107                    )
108                    .await;
109
110                    responder
111                        .send(PuppetFactoryCreateResponse {
112                            result: Some(Result_::Success),
113                            view_ref: Some(view_ref),
114                            ..Default::default()
115                        })
116                        .expect("failed to respond to PuppetFactoryRequest::Create");
117
118                    run_puppet(puppet_server.into_stream(), view).await;
119                }
120            }
121
122            Ok(())
123        })
124        .await
125        .expect("failed to serve puppet factory stream");
126
127    info!("reached end of puppet factory request stream; closing connection");
128}