[ermine] Basic fullscreen support

Change-Id: I2829e2e7d1d379ad4e811339bb80c003c2fb650a
diff --git a/shell/ermine/lib/src/models/app_model.dart b/shell/ermine/lib/src/models/app_model.dart
index dccba99..78c659f 100644
--- a/shell/ermine/lib/src/models/app_model.dart
+++ b/shell/ermine/lib/src/models/app_model.dart
@@ -111,6 +111,7 @@
 
     KeyChordListener(
       onMeta: onMeta,
+      onFullscreen: storyManager.toggleFullscreen,
       onLogout: onLogout,
       onCancel: onCancel,
     ).listen(_presentation);
diff --git a/shell/ermine/lib/src/models/story_manager.dart b/shell/ermine/lib/src/models/story_manager.dart
index 503a5db..395c9f3 100644
--- a/shell/ermine/lib/src/models/story_manager.dart
+++ b/shell/ermine/lib/src/models/story_manager.dart
@@ -51,6 +51,9 @@
   /// Holds the id of the story that has focus.
   String focusedStoryId;
 
+  bool _isFullscreen = false;
+  bool get isFullscreen => _isFullscreen;
+
   final _focusProvider = FocusProviderProxy();
   final _focusController = FocusControllerProxy();
   final _storyProvider = StoryProviderProxy();
@@ -156,6 +159,12 @@
     }
   }
 
+  /// toggles fullscreen mode
+  void toggleFullscreen() {
+    _isFullscreen = !_isFullscreen;
+    notifyListeners();
+  }
+
   /// Requests focus to be set on the story.
   void setFocus(String storyId) {
     _focusProvider.request(storyId);
diff --git a/shell/ermine/lib/src/utils/key_chord_listener.dart b/shell/ermine/lib/src/utils/key_chord_listener.dart
index 77d875a..7f51b83 100644
--- a/shell/ermine/lib/src/utils/key_chord_listener.dart
+++ b/shell/ermine/lib/src/utils/key_chord_listener.dart
@@ -15,6 +15,7 @@
 /// Listens for key chords and triggers its callbacks when they occur.
 class KeyChordListener extends KeyboardCaptureListenerHack {
   final VoidCallback onMeta;
+  final VoidCallback onFullscreen;
   final VoidCallback onCancel;
   final VoidCallback onLogout;
 
@@ -32,6 +33,17 @@
     ): (listener) {
       listener.onMeta?.call();
     },
+    // Right Alt + Lower case f.
+    KeyboardEvent(
+      deviceId: 0,
+      eventTime: 0,
+      hidUsage: 0,
+      codePoint: ascii.encode('f')[0],
+      modifiers: kModifierRightAlt,
+      phase: KeyboardEventPhase.pressed,
+    ): (listener) {
+      listener.onFullscreen?.call();
+    },
     // Lower case o + Right Alt.
     KeyboardEvent(
       deviceId: 0,
@@ -58,7 +70,12 @@
 
   final _keyListenerBindings = <KeyboardCaptureListenerHackBinding>[];
 
-  KeyChordListener({this.onMeta, this.onLogout, this.onCancel});
+  KeyChordListener({
+    this.onMeta,
+    this.onFullscreen,
+    this.onLogout,
+    this.onCancel,
+  });
 
   /// Starts listening to key chords.
   void listen(Presentation presentation) {
diff --git a/shell/ermine/lib/src/widgets/stories.dart b/shell/ermine/lib/src/widgets/stories.dart
index 9988af4..2385076 100644
--- a/shell/ermine/lib/src/widgets/stories.dart
+++ b/shell/ermine/lib/src/widgets/stories.dart
@@ -48,8 +48,10 @@
           },
           itemBuilder: (context, index) {
             final story = index == 0 ? null : stories.elementAt(index - 1);
-            return Container(
-              padding: EdgeInsets.all(32),
+            return AnimatedPadding(
+              duration: Duration(milliseconds: 200),
+              curve: Curves.ease,
+              padding: EdgeInsets.all(storyManager.isFullscreen ? 0 : 32),
               child: index == 0
                   ? null
                   : Material(
@@ -89,11 +91,13 @@
                               ),
                             ),
                           ),
-                          Positioned(
-                            top: 18,
-                            left: 2,
-                            right: 2,
-                            bottom: 2,
+                          AnimatedPositioned(
+                            duration: Duration(milliseconds: 200),
+                            curve: Curves.ease,
+                            top: storyManager.isFullscreen ? 0 : 18,
+                            left: storyManager.isFullscreen ? 0 : 2,
+                            right: storyManager.isFullscreen ? 0 : 2,
+                            bottom: storyManager.isFullscreen ? 0 : 2,
                             child: GestureDetector(
                               // Disable listview scrolling on top of story.
                               onHorizontalDragStart: (_) {},