UserAccountsDrawerHeader gallery demo, etc (#7297)

diff --git a/examples/flutter_gallery/lib/demo/drawer_demo.dart b/examples/flutter_gallery/lib/demo/drawer_demo.dart
new file mode 100644
index 0000000..caae261
--- /dev/null
+++ b/examples/flutter_gallery/lib/demo/drawer_demo.dart
@@ -0,0 +1,186 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+
+const String _kAsset0 = 'packages/flutter_gallery_assets/shrine/vendors/zach.jpg';
+const String _kAsset1 = 'packages/flutter_gallery_assets/shrine/vendors/16c477b.jpg';
+const String _kAsset2 = 'packages/flutter_gallery_assets/shrine/vendors/sandra-adams.jpg';
+
+class DrawerDemo extends StatefulWidget {
+  static const String routeName = '/drawer';
+
+  @override
+  _DrawerDemoState createState() => new _DrawerDemoState();
+}
+
+class _DrawerDemoState extends State<DrawerDemo> with TickerProviderStateMixin {
+  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
+
+  static const List<String> _drawerContents = const <String>[
+    'A', 'B', 'C', 'D', 'E',
+  ];
+
+  AnimationController _controller;
+  Animation<double> _drawerContentsOpacity;
+  Animation<FractionalOffset> _drawerDetailsPosition;
+  bool _showDrawerContents = true;
+
+  @override
+  void initState() {
+    super.initState();
+    _controller = new AnimationController(
+      vsync: this,
+      duration: const Duration(milliseconds: 200),
+    );
+    _drawerContentsOpacity = new CurvedAnimation(
+      parent: new ReverseAnimation(_controller),
+      curve: Curves.fastOutSlowIn,
+    );
+    _drawerDetailsPosition = new Tween<FractionalOffset>(
+      begin: const FractionalOffset(0.0, -1.0),
+      end: const FractionalOffset(0.0, 0.0),
+    ).animate(new CurvedAnimation(
+      parent: _controller,
+      curve: Curves.fastOutSlowIn,
+    ));
+  }
+
+  @override
+  void dispose() {
+    _controller.dispose();
+    super.dispose();
+  }
+
+  IconData _backIcon() {
+    switch (Theme.of(context).platform) {
+      case TargetPlatform.android:
+      case TargetPlatform.fuchsia:
+        return Icons.arrow_back;
+      case TargetPlatform.iOS:
+        return Icons.arrow_back_ios;
+    }
+    assert(false);
+    return null;
+  }
+
+  void _showNotImplementedMessage() {
+    Navigator.of(context).pop(); // Dismiss the drawer.
+    _scaffoldKey.currentState.showSnackBar(new SnackBar(
+      content: new Text("The drawer's items don't do anything")
+    ));
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return new Scaffold(
+      key: _scaffoldKey,
+      appBar: new AppBar(
+        leading: new IconButton(
+          icon: new Icon(_backIcon()),
+          alignment: FractionalOffset.centerLeft,
+          tooltip: 'Back',
+          onPressed: () {
+            Navigator.pop(context);
+          },
+        ),
+        title: new Text('Navigation drawer'),
+      ),
+      drawer: new Drawer(
+        child: new Block(
+          children: <Widget>[
+            new UserAccountsDrawerHeader(
+              accountName: new Text('Zach Widget'),
+              accountEmail: new Text('zach.widget@example.com'),
+              currentAccountPicture: new CircleAvatar(backgroundImage: new AssetImage(_kAsset0)),
+              otherAccountsPictures: <Widget>[
+                new CircleAvatar(backgroundImage: new AssetImage(_kAsset1)),
+                new CircleAvatar(backgroundImage: new AssetImage(_kAsset2)),
+              ],
+              onDetailsPressed: () {
+                _showDrawerContents = !_showDrawerContents;
+                if (_showDrawerContents)
+                  _controller.reverse();
+                else
+                  _controller.forward();
+              },
+            ),
+            new ClipRect(
+              child: new Stack(
+                children: <Widget>[
+                  // The initial contents of the drawer.
+                  new FadeTransition(
+                    opacity: _drawerContentsOpacity,
+                    child: new Column(
+                      mainAxisSize: MainAxisSize.min,
+                      crossAxisAlignment: CrossAxisAlignment.stretch,
+                      children: _drawerContents.map((String id) {
+                        return new DrawerItem(
+                          icon: new CircleAvatar(child: new Text(id)),
+                          child: new Text('Drawer item $id'),
+                          onPressed: _showNotImplementedMessage,
+                        );
+                      }).toList(),
+                    ),
+                  ),
+                  // The drawer's "details" view.
+                  new SlideTransition(
+                    position: _drawerDetailsPosition,
+                    child: new FadeTransition(
+                      opacity: new ReverseAnimation(_drawerContentsOpacity),
+                      child: new Column(
+                        mainAxisSize: MainAxisSize.min,
+                        crossAxisAlignment: CrossAxisAlignment.stretch,
+                        children: <Widget>[
+                          new DrawerItem(
+                            icon: new Icon(Icons.add),
+                            child: new Text('Add account'),
+                            onPressed: _showNotImplementedMessage,
+                          ),
+                          new DrawerItem(
+                            icon: new Icon(Icons.settings),
+                            child: new Text('Manage accounts'),
+                            onPressed: _showNotImplementedMessage,
+                          ),
+                        ],
+                      ),
+                    ),
+                  ),
+                ],
+              ),
+            ),
+          ],
+        ),
+      ),
+      body: new Center(
+        child: new InkWell(
+          onTap: () {
+            _scaffoldKey.currentState.openDrawer();
+          },
+          child: new Column(
+            mainAxisSize: MainAxisSize.min,
+            children: <Widget>[
+              new Container(
+                width: 100.0,
+                height: 100.0,
+                decoration: new BoxDecoration(
+                  shape: BoxShape.circle,
+                  backgroundImage: new BackgroundImage(
+                    image: new AssetImage(_kAsset0),
+                  ),
+                ),
+              ),
+              new Padding(
+                padding: const EdgeInsets.only(top: 8.0),
+                child: new Text('Tap here to open the drawer',
+                  style: Theme.of(context).textTheme.subhead,
+                ),
+              ),
+            ],
+          ),
+        ),
+      ),
+    );
+  }
+}