[session] Add keyboard shortcuts to input pipeline

Change-Id: I1cde0b3cc0896123fa0e2879b15f874fbc5bf088
diff --git a/session_shells/ermine/session/meta/workstation_session.cml b/session_shells/ermine/session/meta/workstation_session.cml
index 7b8206c..5c46ade 100644
--- a/session_shells/ermine/session/meta/workstation_session.cml
+++ b/session_shells/ermine/session/meta/workstation_session.cml
@@ -22,6 +22,9 @@
         },
         {
             "protocol": "/svc/fuchsia.logger.LogSink",
-        }
+        },
+        {
+            "protocol": "/svc/fuchsia.ui.shortcut.Manager",
+        },
     ],
 }
\ No newline at end of file
diff --git a/session_shells/ermine/session/src/workstation_input_pipeline.rs b/session_shells/ermine/session/src/workstation_input_pipeline.rs
index 3c0db40..5d5f9d0 100644
--- a/session_shells/ermine/session/src/workstation_input_pipeline.rs
+++ b/session_shells/ermine/session/src/workstation_input_pipeline.rs
@@ -6,12 +6,13 @@
     crate::mouse_pointer_hack::*,
     crate::pointer_hack_server::PointerHackServer,
     crate::touch_pointer_hack::*,
-    fuchsia_async as fasync,
+    fidl_fuchsia_ui_shortcut as ui_shortcut, fuchsia_async as fasync,
+    fuchsia_component::client::connect_to_service,
     futures::StreamExt,
     input::{
         ime_handler::ImeHandler, input_device::InputDeviceBinding, input_handler::InputHandler,
         input_pipeline::InputPipeline, keyboard, mouse, mouse_handler, mouse_handler::MouseHandler,
-        touch, touch_handler::TouchHandler,
+        shortcut_handler::ShortcutHandler, touch, touch_handler::TouchHandler,
     },
     scene_management::{self, FlatSceneManager, SceneManager},
 };
@@ -73,6 +74,8 @@
     // Touch and mouse hack handlers are inserted first.
     add_touch_hack(&scene_manager, &pointer_hack_server, &mut handlers).await;
     add_mouse_hack(&scene_manager, &pointer_hack_server, &mut handlers).await;
+    // Shortcut needs to go before IME.
+    add_shortcut_handler(&mut handlers).await;
     add_ime(&scene_manager, &mut handlers).await;
     add_touch_handler(&scene_manager, &mut handlers).await;
     add_mouse_handler(scene_manager, &mut handlers).await;
@@ -80,6 +83,14 @@
     handlers
 }
 
+async fn add_shortcut_handler(handlers: &mut Vec<Box<dyn InputHandler>>) {
+    if let Ok(manager) = connect_to_service::<ui_shortcut::ManagerMarker>() {
+        if let Ok(shortcut_handler) = ShortcutHandler::new(manager) {
+            handlers.push(Box::new(shortcut_handler));
+        }
+    }
+}
+
 async fn add_ime(scene_manager: &FlatSceneManager, handlers: &mut Vec<Box<dyn InputHandler>>) {
     if let Ok(ime_handler) =
         ImeHandler::new(scene_manager.session.clone(), scene_manager.compositor_id).await