会话组件封装了组件拓扑中的产品体验。它会启动所有特定于产品的组件(直接或间接),管理这些组件的生命周期,并管理特定于产品的组件(例如面向用户的应用)与特定于设备的组件(例如输入设备、音频和显示屏,如果有)之间的控制流和信息流。
以下部分演示了会话作者如何履行其中的一些职责。
呈现元素视图
在以下示例中,会话通过调用 PresentView() 并使用 Element 的视图,将该视图转发到 `ViewSpec`。ViewSpec 包含复制的 ViewRef(Element 的 View 的可共享句柄)和一组可选的初始产品专用 Annotations。
实现图形演示者角色的组件知道如何在已连接的显示屏上打开视图。
fn present_view_for_element(
graphical_presenter: &GraphicalPresenterProxy,
element: &Element
) -> Result<ViewControllerProxy, Error> {
let view_provider = element.connect_to_service::<ViewProviderMarker>()?;
let token_pair = scenic::ViewTokenPair::new()?;
let scenic::ViewRefPair {
mut control_ref,
mut view_ref
} = scenic::ViewRefPair::new()?;
let view_ref_dup = fuchsia_scenic::duplicate_view_ref(&view_ref)?;
view_provider.create_view_with_view_ref(
token_pair.view_token.value,
&mut control_ref,
&mut view_ref,
)?;
let annotations = element.get_annotations()?;
let view_spec = ViewSpec {
view_holder_token: Some(token_pair.view_holder_token),
view_ref: Some(view_ref_dup),
annotations: Some(annotations),
..Default::default()
};
let (view_controller_proxy, server_end) = create_proxy::<ViewControllerMarker>();
graphical_presenter.present_view(view_spec, Some(server_end))?;
Ok(view_controller_proxy)
}
处理输入
在以下示例中,如果 MouseHandler 检测到鼠标类型的输入事件,处理程序会将该事件发送到 Scenic 并返回一个空向量。对于所有其他类型的输入事件,MouseHandler 返回一个向量,其中包含要由下一个 `InputHandler` 处理的 `InputEvent`。
#[async_trait]
impl InputHandler for MouseHandler {
async fn handle_input_event(
&mut self,
input_event: InputEvent,
) -> Vec<InputEvent> {
match input_event {
InputEvent {
device_event: InputDeviceEvent::Mouse(mouse_event),
device_descriptor: InputDeviceDescriptor::Mouse(mouse_descriptor),
} => {
// ... Handler specific details
self.send_events_to_scenic(...)).await;
vec![] // InputEvent is consumed because it was sent to Scenic
}
_ => vec![input_event], // InputEvent is returned for the next InputHandler
}
}
}