diff --git a/examples/fitness/.gitignore b/examples/fitness/.gitignore deleted file mode 100644 index 14c7d4c3f73..00000000000 --- a/examples/fitness/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -.DS_Store -.atom/ -.idea -.packages -.pub/ -build/ -ios/.generated/ -packages -pubspec.lock diff --git a/examples/fitness/README.md b/examples/fitness/README.md deleted file mode 100644 index 624e5764ac8..00000000000 --- a/examples/fitness/README.md +++ /dev/null @@ -1 +0,0 @@ -# fitness diff --git a/examples/fitness/android/AndroidManifest.xml b/examples/fitness/android/AndroidManifest.xml deleted file mode 100644 index 69323d58179..00000000000 --- a/examples/fitness/android/AndroidManifest.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/fitness/android/README.md b/examples/fitness/android/README.md deleted file mode 100644 index f2443e9507a..00000000000 --- a/examples/fitness/android/README.md +++ /dev/null @@ -1,10 +0,0 @@ -Icon image comes from: -https://openclipart.org/detail/22309/apple-icon -and is public domain. - -Icon resources were generated using: -http://romannurik.github.io/AndroidAssetStudio/icons-launcher.html -with settings: -http://romannurik.github.io/AndroidAssetStudio/icons-launcher.html#foreground.type=image&foreground.space.trim=1&foreground.space.pad=0&foreColor=607d8b%2C0&crop=0&backgroundShape=none&backColor=ffffff%2C100&effects=none -which produces art under CC 3.0: -http://creativecommons.org/licenses/by/3.0/ diff --git a/examples/fitness/android/apk/AndroidManifest.xml b/examples/fitness/android/apk/AndroidManifest.xml deleted file mode 100644 index dbd3bc2c76a..00000000000 --- a/examples/fitness/android/apk/AndroidManifest.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/examples/fitness/android/release_notes/0.0.2.txt b/examples/fitness/android/release_notes/0.0.2.txt deleted file mode 100644 index fc4b001688e..00000000000 --- a/examples/fitness/android/release_notes/0.0.2.txt +++ /dev/null @@ -1,3 +0,0 @@ -Still barely works -Fixed crash when entering an invalid number -Made date list look less-awful. diff --git a/examples/fitness/android/release_notes/0.0.3.txt b/examples/fitness/android/release_notes/0.0.3.txt deleted file mode 100644 index 5934f86e1fd..00000000000 --- a/examples/fitness/android/release_notes/0.0.3.txt +++ /dev/null @@ -1 +0,0 @@ -Adds very basic charting support diff --git a/examples/fitness/android/release_notes/0.0.4.txt b/examples/fitness/android/release_notes/0.0.4.txt deleted file mode 100644 index 5e8ff768a7b..00000000000 --- a/examples/fitness/android/release_notes/0.0.4.txt +++ /dev/null @@ -1 +0,0 @@ -Now supports setting goal weight. diff --git a/examples/fitness/android/res/mipmap-hdpi/ic_launcher.png b/examples/fitness/android/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index bf78cc1880a..00000000000 Binary files a/examples/fitness/android/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/examples/fitness/android/res/mipmap-mdpi/ic_launcher.png b/examples/fitness/android/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 8d4fed685df..00000000000 Binary files a/examples/fitness/android/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/examples/fitness/android/res/mipmap-xhdpi/ic_launcher.png b/examples/fitness/android/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 3771235d40f..00000000000 Binary files a/examples/fitness/android/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/examples/fitness/android/res/mipmap-xxhdpi/ic_launcher.png b/examples/fitness/android/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 509d51d9953..00000000000 Binary files a/examples/fitness/android/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/examples/fitness/android/res/mipmap-xxxhdpi/ic_launcher.png b/examples/fitness/android/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 2c7aff71137..00000000000 Binary files a/examples/fitness/android/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/examples/fitness/flutter.yaml b/examples/fitness/flutter.yaml deleted file mode 100644 index 942a5de5ed9..00000000000 --- a/examples/fitness/flutter.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: fitness -version: 0.0.1 -update-url: http://localhost:9888/ -material-design-icons: - - name: action/assessment - - name: action/help - - name: action/settings - - name: action/view_list - - name: av/stop - - name: content/add - - name: maps/directions_run - - name: navigation/arrow_back - - name: navigation/close - - name: navigation/menu - - name: navigation/more_vert diff --git a/examples/fitness/ios/.gitignore b/examples/fitness/ios/.gitignore deleted file mode 100644 index ecb842d7051..00000000000 --- a/examples/fitness/ios/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.generated/ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 363d1c4ce4f..00000000000 --- a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "images" : [ - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-Small@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-Small@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-Small-40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-Small-40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-60@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-Small.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-Small@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-Small-40.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-Small-40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-76.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "icon_16x16.png", - "scale" : "1x" - }, - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "icon_16x16@2x.png", - "scale" : "2x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "icon_32x32.png", - "scale" : "1x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "icon_32x32@2x.png", - "scale" : "2x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "icon_128x128.png", - "scale" : "1x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "icon_128x128@2x.png", - "scale" : "2x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "icon_256x256.png", - "scale" : "1x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "icon_256x256@2x.png", - "scale" : "2x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "icon_512x512.png", - "scale" : "1x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "icon_512x512@2x.png", - "scale" : "2x" - } - ] -} \ No newline at end of file diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png deleted file mode 100644 index 9996f5e598a..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png deleted file mode 100644 index 7a543edbdd4..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-76.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-76.png deleted file mode 100644 index 05a82681049..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-76.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png deleted file mode 100644 index bfbca28f5d5..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png deleted file mode 100644 index c924b8e497d..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png deleted file mode 100644 index 3006f1d348c..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small-40.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png deleted file mode 100644 index 5f7d22d364d..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png deleted file mode 100644 index 9996f5e598a..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small.png deleted file mode 100644 index 3433da11966..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png deleted file mode 100644 index f7f9f16d1b4..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png deleted file mode 100644 index e9c23601cf4..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_128x128.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_128x128.png deleted file mode 100644 index dd5fccb0a99..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_128x128.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png deleted file mode 100644 index 1909e275118..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_16x16.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_16x16.png deleted file mode 100644 index 40a701b5146..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_16x16.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png deleted file mode 100644 index 06c1a805609..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_256x256.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_256x256.png deleted file mode 100644 index 1909e275118..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_256x256.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png deleted file mode 100644 index 69c96ef1e27..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_32x32.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_32x32.png deleted file mode 100644 index 06c1a805609..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_32x32.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png deleted file mode 100644 index 0f943714603..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_512x512.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_512x512.png deleted file mode 100644 index 69c96ef1e27..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_512x512.png and /dev/null differ diff --git a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png b/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png deleted file mode 100644 index 1d6355f58c8..00000000000 Binary files a/examples/fitness/ios/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png and /dev/null differ diff --git a/examples/fitness/ios/Info.plist b/examples/fitness/ios/Info.plist deleted file mode 100644 index 1d8367d23d5..00000000000 --- a/examples/fitness/ios/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - Runner - CFBundleIdentifier - io.flutter.example.fitness - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Fitness - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/examples/fitness/ios/LaunchScreen.storyboard b/examples/fitness/ios/LaunchScreen.storyboard deleted file mode 100644 index 78686cd0750..00000000000 --- a/examples/fitness/ios/LaunchScreen.storyboard +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/fitness/lib/date_utils.dart b/examples/fitness/lib/date_utils.dart deleted file mode 100644 index ccaaf5d44ba..00000000000 --- a/examples/fitness/lib/date_utils.dart +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2015 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. - -// Forked from https://github.com/dart-lang/sdk/blob/master/samples-dev/swarm/swarm_ui_lib/util/DateUtils.dart -class DateUtils { - - static const WEEKDAYS = const ['Monday', 'Tuesday', 'Wednesday', 'Thursday', - 'Friday', 'Saturday', 'Sunday']; - - static const YESTERDAY = 'Yesterday'; - - static const MS_IN_WEEK = DateTime.DAYS_PER_WEEK * Duration.MILLISECONDS_PER_DAY; - - // TODO(jmesserly): locale specific date format - static String _twoDigits(int n) { - if (n >= 10) - return '$n'; - return '0$n'; - } - - /// Formats a time in H:MM A format - static String toHourMinutesString(Duration duration) { - assert(duration.inDays == 0); - int hours = duration.inHours; - String a; - if (hours >= 12) { - a = 'pm'; - if (hours != 12) - hours -= 12; - } else { - a = 'am'; - if (hours == 0) - hours += 12; - } - String twoDigits(int n) { - if (n >= 10) - return '$n'; - return '0$n'; - } - String mm = twoDigits(duration.inMinutes.remainder(Duration.MINUTES_PER_HOUR)); - return '$hours:$mm $a'; - } - - /// A date/time formatter that takes into account the current date/time: - /// - if it's from today, just show the time - /// - if it's from yesterday, just show 'Yesterday' - /// - if it's from the same week, just show the weekday - /// - otherwise, show just the date - static String toRecentTimeString(DateTime then) { - bool datesAreEqual(DateTime d1, DateTime d2) { - return (d1.year == d2.year) && - (d1.month == d2.month) && - (d1.day == d2.day); - } - - final now = new DateTime.now(); - if (datesAreEqual(then, now)) { - return toHourMinutesString(new Duration( - days: 0, - hours: then.hour, - minutes: then.minute, - seconds: then.second, - milliseconds: then.millisecond) - ); - } - - final today = new DateTime(now.year, now.month, now.day, 0, 0, 0, 0); - Duration delta = today.difference(then); - if (delta.inMilliseconds < Duration.MILLISECONDS_PER_DAY) { - return YESTERDAY; - } else if (delta.inMilliseconds < MS_IN_WEEK) { - return WEEKDAYS[then.weekday]; - } else { - String twoDigitMonth = _twoDigits(then.month); - String twoDigitDay = _twoDigits(then.day); - return '${then.year}-$twoDigitMonth-$twoDigitDay'; - } - } - - static String toDateString(DateTime then) { - // TODO(jmesserly): locale specific date format - String twoDigitMonth = _twoDigits(then.month); - String twoDigitDay = _twoDigits(then.day); - return '${then.year}-$twoDigitMonth-$twoDigitDay'; - } -} diff --git a/examples/fitness/lib/feed.dart b/examples/fitness/lib/feed.dart deleted file mode 100644 index 2af97fe7957..00000000000 --- a/examples/fitness/lib/feed.dart +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright 2015 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. - -part of fitness; - -class FitnessItemList extends StatelessComponent { - FitnessItemList({ Key key, this.items, this.onDismissed }) : super(key: key) { - assert(items != null); - assert(onDismissed != null); - } - - final List items; - final FitnessItemHandler onDismissed; - - Widget build(BuildContext context) { - return new ScrollableList( - padding: const EdgeDims.all(4.0), - itemExtent: kFitnessItemHeight, - children: items.map((FitnessItem item) => item.toRow(onDismissed: onDismissed)) - ); - } -} - -class DialogMenuItem extends StatelessComponent { - DialogMenuItem(this.children, { Key key, this.onPressed }) : super(key: key); - - List children; - Function onPressed; - - Widget build(BuildContext context) { - return new Container( - height: 48.0, - child: new InkWell( - onTap: onPressed, - child: new Padding( - padding: const EdgeDims.symmetric(horizontal: 16.0), - child: new Row(children: children) - ) - ) - ); - } -} - -class FeedFragment extends StatefulComponent { - FeedFragment({ this.userData, this.onItemCreated, this.onItemDeleted }); - - final UserData userData; - final FitnessItemHandler onItemCreated; - final FitnessItemHandler onItemDeleted; - - FeedFragmentState createState() => new FeedFragmentState(); -} - -class FeedFragmentState extends State { - FitnessMode _fitnessMode = FitnessMode.feed; - - void _handleFitnessModeChange(FitnessMode value) { - setState(() { - _fitnessMode = value; - }); - Navigator.pop(context); - } - - Widget _buildDrawer() { - return new Drawer( - child: new Block(children: [ - new DrawerHeader(child: new Text('Fitness')), - new DrawerItem( - icon: 'action/view_list', - onPressed: () => _handleFitnessModeChange(FitnessMode.feed), - selected: _fitnessMode == FitnessMode.feed, - child: new Text('Feed')), - new DrawerItem( - icon: 'action/assessment', - onPressed: () => _handleFitnessModeChange(FitnessMode.chart), - selected: _fitnessMode == FitnessMode.chart, - child: new Text('Chart')), - new DrawerDivider(), - new DrawerItem( - icon: 'action/settings', - onPressed: _handleShowSettings, - child: new Text('Settings')), - new DrawerItem( - icon: 'action/help', - child: new Text('Help & Feedback')) - ]) - ); - } - - void _handleShowSettings() { - Navigator.popAndPushNamed(context, '/settings'); - } - - // TODO(jackson): We should be localizing - String get fitnessModeTitle { - switch(_fitnessMode) { - case FitnessMode.feed: return "Feed"; - case FitnessMode.chart: return "Chart"; - } - } - - Widget buildToolBar() { - return new ToolBar( - center: new Text(fitnessModeTitle) - ); - } - - void _handleItemDismissed(FitnessItem item) { - config.onItemDeleted(item); - Scaffold.of(context).showSnackBar(new SnackBar( - content: new Text("Item deleted."), - action: new SnackBarAction( - label: "UNDO", - onPressed: () { - config.onItemCreated(item); - } - ) - )); - } - - Widget buildChart() { - double startX; - double endX; - double startY; - double endY; - List dataSet = new List(); - for (FitnessItem item in config.userData.items) { - if (item is Measurement) { - double x = item.when.millisecondsSinceEpoch.toDouble(); - double y = item.weight; - if (startX == null || startX > x) - startX = x; - if (endX == null || endX < x) - endX = x; - if (startY == null || startY > y) - startY = y; - if (endY == null || endY < y) - endY = y; - dataSet.add(new Point(x, y)); - } - } - if (config.userData.goalWeight != null && config.userData.goalWeight > 0.0) { - startY = math.min(startY, config.userData.goalWeight); - endY = math.max(endY, config.userData.goalWeight); - } - playfair.ChartData data = new playfair.ChartData( - startX: startX, - startY: startY, - endX: endX, - endY: endY, - dataSet: dataSet, - numHorizontalGridlines: 5, - roundToPlaces: 1, - indicatorLine: config.userData.goalWeight, - indicatorText: "GOAL WEIGHT" - ); - return new playfair.Chart(data: data); - } - - Widget buildBody() { - TextStyle style = Theme.of(context).text.title; - if (config.userData == null) - return new Container(); - if (config.userData.items.length == 0) { - return new Row( - children: [new Text("No data yet.\nAdd some!", style: style)], - justifyContent: FlexJustifyContent.center - ); - } - switch (_fitnessMode) { - case FitnessMode.feed: - return new FitnessItemList( - items: config.userData.items.reversed.toList(), - onDismissed: _handleItemDismissed - ); - case FitnessMode.chart: - return new Container( - padding: const EdgeDims.all(20.0), - child: buildChart() - ); - } - } - - void _handleActionButtonPressed() { - showDialog(context: context, child: new AddItemDialog()).then((routeName) { - if (routeName != null) - Navigator.pushNamed(context, routeName); - }); - } - - Widget buildFloatingActionButton() { - switch (_fitnessMode) { - case FitnessMode.feed: - return new FloatingActionButton( - child: new Icon(icon: 'content/add'), - onPressed: _handleActionButtonPressed - ); - case FitnessMode.chart: - return null; - } - } - - Widget build(BuildContext context) { - return new Scaffold( - toolBar: buildToolBar(), - body: buildBody(), - floatingActionButton: buildFloatingActionButton(), - drawer: _buildDrawer() - ); - } -} - -class AddItemDialog extends StatefulComponent { - AddItemDialogState createState() => new AddItemDialogState(); -} - -class AddItemDialogState extends State { - // TODO(jackson): Internationalize - static final Map _labels = { - '/measurements/new': 'Measure', - '/meals/new': 'Eat', - }; - - String _addItemRoute = _labels.keys.first; - - void _handleAddItemRouteChanged(String routeName) { - setState(() { - _addItemRoute = routeName; - }); - } - - Widget build(BuildContext context) { - List menuItems = []; - for (String routeName in _labels.keys) { - menuItems.add(new DialogMenuItem([ - new Flexible(child: new Text(_labels[routeName])), - new Radio(value: routeName, groupValue: _addItemRoute, onChanged: _handleAddItemRouteChanged), - ], onPressed: () => _handleAddItemRouteChanged(routeName))); - } - return new Dialog( - title: new Text("What are you doing?"), - content: new Block(children: menuItems), - actions: [ - new FlatButton( - child: new Text('CANCEL'), - onPressed: () { - Navigator.pop(context); - } - ), - new FlatButton( - child: new Text('ADD'), - onPressed: () { - Navigator.pop(context, _addItemRoute); - } - ), - ] - ); - } -} diff --git a/examples/fitness/lib/fitness_item.dart b/examples/fitness/lib/fitness_item.dart deleted file mode 100644 index 8b90af3b588..00000000000 --- a/examples/fitness/lib/fitness_item.dart +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2015 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. - -part of fitness; - -typedef void FitnessItemHandler(FitnessItem item); - -// TODO(eseidel): This should be a constant on a SingleLineTile class -// https://www.google.com/design/spec/components/lists.html#lists-specs -const double kFitnessItemHeight = 48.0; - -abstract class FitnessItem { - FitnessItem.fromJson(Map json) : when = DateTime.parse(json['when']); - - FitnessItem({ this.when }) { - assert(when != null); - } - final DateTime when; - - Map toJson() => { 'when' : when.toIso8601String() }; - - // TODO(jackson): Internationalize - String get displayDate => DateUtils.toDateString(when); - - FitnessItemRow toRow({ FitnessItemHandler onDismissed }); -} - -abstract class FitnessItemRow extends StatelessComponent { - - FitnessItemRow({ FitnessItem item, this.onDismissed }) - : this.item = item, - super(key: new ValueKey(item.when)) { - assert(onDismissed != null); - } - - final FitnessItem item; - final FitnessItemHandler onDismissed; - - Widget buildContent(BuildContext context); - - Widget build(BuildContext context) { - return new Dismissable( - onDismissed: () => onDismissed(item), - child: new Container( - height: kFitnessItemHeight, - // TODO(eseidel): Padding top should be 16px for a single-line tile: - // https://www.google.com/design/spec/components/lists.html#lists-specs - padding: const EdgeDims.all(10.0), - // TODO(eseidel): This line should be drawn by the list as it should - // stay put even when the tile is dismissed! - decoration: new BoxDecoration( - border: new Border( - bottom: new BorderSide(color: Theme.of(context).dividerColor) - ) - ), - child: buildContent(context) - ) - ); - } -} diff --git a/examples/fitness/lib/fitness_types.dart b/examples/fitness/lib/fitness_types.dart deleted file mode 100644 index 42d66179dcc..00000000000 --- a/examples/fitness/lib/fitness_types.dart +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2015 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. - -part of fitness; - -enum FitnessMode { feed, chart } -enum BackupMode { enabled, disabled } diff --git a/examples/fitness/lib/main.dart b/examples/fitness/lib/main.dart deleted file mode 100644 index a1a4a87a80d..00000000000 --- a/examples/fitness/lib/main.dart +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2015 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. - -library fitness; - -import 'package:playfair/playfair.dart' as playfair; -import 'package:flutter/material.dart'; - -import 'user_data.dart'; -import 'date_utils.dart'; -import 'dart:async'; -import 'dart:math' as math; - -part 'feed.dart'; -part 'fitness_item.dart'; -part 'fitness_types.dart'; -part 'meal.dart'; -part 'measurement.dart'; -part 'settings.dart'; - -abstract class UserData { - BackupMode get backupMode; - double get goalWeight; - List get items; -} - -class UserDataImpl extends UserData { - UserDataImpl(); - - List _items = []; - - BackupMode _backupMode; - BackupMode get backupMode => _backupMode; - void set backupMode(BackupMode value) { - _backupMode = value; - } - - double _goalWeight; - double get goalWeight => _goalWeight; - void set goalWeight(double value) { - _goalWeight = value; - } - - List get items => _items; - - void sort() { - _items.sort((FitnessItem a, FitnessItem b) => a.when.compareTo(b.when)); - } - - void add(FitnessItem item) { - _items.add(item); - sort(); - } - - void remove(FitnessItem item) { - _items.remove(item); - } - - Future save() => saveFitnessData(this); - - UserDataImpl.fromJson(Map json) { - json['items'].forEach((item) { - _items.add(new Measurement.fromJson(item)); - }); - try { - _backupMode = BackupMode.values.firstWhere((BackupMode mode) { - return mode.toString() == json['backupMode']; - }); - } catch(e) { - print("Failed to load backup mode: $e"); - } - _goalWeight = json['goalWeight']; - } - - Map toJson() { - Map json = new Map(); - json['items'] = _items.map((FitnessItem item) => item.toJson()).toList(); - json['backupMode'] = _backupMode.toString(); - json['goalWeight'] = _goalWeight; - return json; - } -} - -class FitnessApp extends StatefulComponent { - FitnessAppState createState() => new FitnessAppState(); -} - -class FitnessAppState extends State { - UserDataImpl _userData; - - void initState() { - super.initState(); - loadFitnessData().then((UserData data) { - setState(() => _userData = data); - }).catchError((e) { - print("Failed to load data: $e"); - setState(() => _userData = new UserDataImpl()); - }); - } - - void _handleItemCreated(FitnessItem item) { - setState(() { - _userData.add(item); - _userData.save(); - }); - } - - void _handleItemDeleted(FitnessItem item) { - setState(() { - _userData.remove(item); - _userData.save(); - }); - } - - void settingsUpdater({ BackupMode backup, double goalWeight }) { - setState(() { - if (backup != null) - _userData.backupMode = backup; - if (goalWeight != null) - _userData.goalWeight = goalWeight; - _userData.save(); - }); - } - - Widget build(BuildContext context) { - return new MaterialApp( - theme: new ThemeData( - brightness: ThemeBrightness.light, - primarySwatch: Colors.indigo, - accentColor: Colors.pinkAccent[200] - ), - title: 'Fitness', - routes: { - '/': (RouteArguments args) { - return new FeedFragment( - userData: _userData, - onItemCreated: _handleItemCreated, - onItemDeleted: _handleItemDeleted - ); - }, - '/meals/new': (RouteArguments args) { - return new MealFragment( - onCreated: _handleItemCreated - ); - }, - '/measurements/new': (RouteArguments args) { - return new MeasurementFragment( - onCreated: _handleItemCreated - ); - }, - '/settings': (RouteArguments args) { - return new SettingsFragment( - userData: _userData, - updater: settingsUpdater - ); - } - } - ); - } -} - -main() { - runApp(new FitnessApp()); -} diff --git a/examples/fitness/lib/meal.dart b/examples/fitness/lib/meal.dart deleted file mode 100644 index 87f9b03974c..00000000000 --- a/examples/fitness/lib/meal.dart +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2014 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. - -part of fitness; - -class Meal extends FitnessItem { - Meal({ DateTime when, this.description }) : super(when: when); - - final String description; - - FitnessItemRow toRow({ FitnessItemHandler onDismissed }) { - return new MealRow(meal: this, onDismissed: onDismissed); - } -} - -class MealRow extends FitnessItemRow { - MealRow({ Meal meal, FitnessItemHandler onDismissed }) - : super(item: meal, onDismissed: onDismissed); - - Widget buildContent(BuildContext context) { - Meal meal = item; - List children = [ - new Flexible( - child: new Text( - meal.description, - style: const TextStyle(textAlign: TextAlign.right) - ) - ), - new Flexible( - child: new Text( - meal.displayDate, - style: Theme.of(context).text.caption.copyWith(textAlign: TextAlign.right) - ) - ) - ]; - return new Row( - children: children, - alignItems: FlexAlignItems.baseline, - textBaseline: DefaultTextStyle.of(context).textBaseline - ); - } -} - -class MealFragment extends StatefulComponent { - MealFragment({ this.onCreated }); - - FitnessItemHandler onCreated; - - MealFragmentState createState() => new MealFragmentState(); -} - -class MealFragmentState extends State { - InputValue _description = InputValue.empty; - - void _handleSave() { - config.onCreated(new Meal(when: new DateTime.now(), description: _description.text)); - Navigator.pop(context); - } - - Widget buildToolBar() { - return new ToolBar( - left: new IconButton( - icon: "navigation/close", - onPressed: () => Navigator.pop(context) - ), - center: new Text('New Meal'), - right: [ - // TODO(abarth): Should this be a FlatButton? - new InkWell( - onTap: _handleSave, - child: new Text('SAVE') - ) - ] - ); - } - - void _handleDescriptionChanged(InputValue description) { - setState(() { - _description = description; - }); - } - - static final GlobalKey descriptionKey = new GlobalKey(); - - Widget buildBody() { - Meal meal = new Meal(when: new DateTime.now()); - return new Block(children: [ - new Text(meal.displayDate), - new Input( - key: descriptionKey, - autofocus: true, - hintText: 'Describe meal', - onChanged: _handleDescriptionChanged - ), - ], - padding: const EdgeDims.all(20.0) - ); - } - - Widget build(BuildContext context) { - return new Scaffold( - toolBar: buildToolBar(), - body: buildBody() - ); - } -} diff --git a/examples/fitness/lib/measurement.dart b/examples/fitness/lib/measurement.dart deleted file mode 100644 index ba3f5f58d58..00000000000 --- a/examples/fitness/lib/measurement.dart +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2014 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. - -part of fitness; - -class Measurement extends FitnessItem { - Measurement({ DateTime when, this.weight }) : super(when: when); - Measurement.fromJson(Map json) : weight = json['weight'], super.fromJson(json); - - final double weight; - - // TODO(jackson): Internationalize - String get displayWeight => "${weight.toStringAsFixed(1)} lbs"; - - @override - Map toJson() { - Map json = super.toJson(); - json['weight'] = weight; - json['type'] = runtimeType.toString(); - return json; - } - - FitnessItemRow toRow({ FitnessItemHandler onDismissed }) { - return new MeasurementRow(measurement: this, onDismissed: onDismissed); - } -} - -class MeasurementRow extends FitnessItemRow { - MeasurementRow({ Measurement measurement, FitnessItemHandler onDismissed }) - : super(item: measurement, onDismissed: onDismissed); - - Widget buildContent(BuildContext context) { - Measurement measurement = item; - List children = [ - new Flexible( - child: new Text( - measurement.displayWeight, - style: Theme.of(context).text.subhead - ) - ), - new Flexible( - child: new Text( - measurement.displayDate, - style: Theme.of(context).text.caption.copyWith(textAlign: TextAlign.right) - ) - ) - ]; - return new Row( - children: children, - alignItems: FlexAlignItems.baseline, - textBaseline: DefaultTextStyle.of(context).textBaseline - ); - } -} - -class MeasurementFragment extends StatefulComponent { - MeasurementFragment({ this.onCreated }); - - final FitnessItemHandler onCreated; - - MeasurementFragmentState createState() => new MeasurementFragmentState(); -} - -class MeasurementFragmentState extends State { - InputValue _weight = InputValue.empty; - DateTime _when = new DateTime.now(); - - void _handleSave() { - double parsedWeight; - try { - parsedWeight = double.parse(_weight.text); - } on FormatException catch(e) { - print("Exception $e"); - Scaffold.of(context).showSnackBar(new SnackBar( - content: new Text('Save failed') - )); - } - config.onCreated(new Measurement(when: _when, weight: parsedWeight)); - Navigator.pop(context); - } - - Widget buildToolBar() { - return new ToolBar( - left: new IconButton( - icon: "navigation/close", - onPressed: () => Navigator.pop(context) - ), - center: new Text('New Measurement'), - right: [ - // TODO(abarth): Should this be a FlatButton? - new InkWell( - onTap: _handleSave, - child: new Text('SAVE') - ) - ] - ); - } - - void _handleWeightChanged(InputValue weight) { - setState(() { - _weight = weight; - }); - } - - static final GlobalKey weightKey = new GlobalKey(); - - Future _handleDatePressed() async { - DateTime value = await showDatePicker( - context: context, - initialDate: _when, - firstDate: new DateTime(2015, 8), - lastDate: new DateTime(2101) - ); - if (value != _when) { - setState(() { - _when = value; - }); - } - } - - Widget buildBody(BuildContext context) { - Measurement measurement = new Measurement(when: _when); - // TODO(jackson): Revisit the layout of this pane to be more maintainable - return new Container( - padding: const EdgeDims.all(20.0), - child: new Column( - children: [ - new GestureDetector( - onTap: _handleDatePressed, - child: new Container( - height: 50.0, - child: new Column( - children: [ - new Text('Measurement Date'), - new Text(measurement.displayDate, style: Theme.of(context).text.caption), - ], - alignItems: FlexAlignItems.start - ) - ) - ), - new Input( - key: weightKey, - autofocus: true, - hintText: 'Enter weight', - keyboardType: KeyboardType.number, - onChanged: _handleWeightChanged - ), - ], - alignItems: FlexAlignItems.stretch - ) - ); - } - - Widget build(BuildContext context) { - return new Scaffold( - toolBar: buildToolBar(), - body: buildBody(context) - ); - } -} diff --git a/examples/fitness/lib/settings.dart b/examples/fitness/lib/settings.dart deleted file mode 100644 index ad12956e28e..00000000000 --- a/examples/fitness/lib/settings.dart +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2015 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. - -part of fitness; - -class _SettingsDialog extends StatefulComponent { - _SettingsDialogState createState() => new _SettingsDialogState(); -} - -class _SettingsDialogState extends State<_SettingsDialog> { - final GlobalKey weightGoalKey = new GlobalKey(); - - InputValue _goalWeight = InputValue.empty; - - void _handleGoalWeightChanged(InputValue goalWeight) { - setState(() { - _goalWeight = goalWeight; - }); - } - - void _handleGoalWeightSubmitted(InputValue goalWeight) { - _goalWeight = goalWeight; - _handleSavePressed(); - } - - void _handleSavePressed() { - double goalWeight; - try { - goalWeight = double.parse(_goalWeight.text); - } on FormatException { - goalWeight = 0.0; - } - Navigator.pop(context, goalWeight); - } - - Widget build(BuildContext context) { - return new Dialog( - title: new Text("Goal Weight"), - content: new Input( - key: weightGoalKey, - value: _goalWeight, - autofocus: true, - hintText: 'Goal weight in lbs', - keyboardType: KeyboardType.number, - onChanged: _handleGoalWeightChanged, - onSubmitted: _handleGoalWeightSubmitted - ), - actions: [ - new FlatButton( - child: new Text('CANCEL'), - onPressed: () { - Navigator.pop(context); - } - ), - new FlatButton( - child: new Text('SAVE'), - onPressed: _handleSavePressed - ), - ] - ); - } -} - -typedef void SettingsUpdater({ - BackupMode backup, - double goalWeight -}); - -class SettingsFragment extends StatefulComponent { - SettingsFragment({ this.userData, this.updater }); - - final UserData userData; - final SettingsUpdater updater; - - SettingsFragmentState createState() => new SettingsFragmentState(); -} - -class SettingsFragmentState extends State { - void _handleBackupChanged(bool value) { - assert(config.updater != null); - config.updater(backup: value ? BackupMode.enabled : BackupMode.disabled); - } - - Widget buildToolBar() { - return new ToolBar( - center: new Text('Settings') - ); - } - - String get goalWeightText { - if (config.userData.goalWeight == null || config.userData.goalWeight == 0.0) - return "None"; - return "${config.userData.goalWeight}"; - } - - Future _handleGoalWeightPressed() async { - double goalWeight = await showDialog( - context: context, - child: new _SettingsDialog() - ); - config.updater(goalWeight: goalWeight); - } - - Widget buildSettingsPane(BuildContext context) { - return new Block(children: [ - new DrawerItem( - onPressed: () { _handleBackupChanged(!(config.userData.backupMode == BackupMode.enabled)); }, - child: new Row( - children: [ - new Flexible(child: new Text('Back up data to the cloud')), - new Switch(value: config.userData.backupMode == BackupMode.enabled, onChanged: _handleBackupChanged), - ] - ) - ), - new DrawerItem( - onPressed: () => _handleGoalWeightPressed(), - child: new Column( - children: [ - new Text('Goal Weight'), - new Text(goalWeightText, style: Theme.of(context).text.caption), - ], - alignItems: FlexAlignItems.start - ) - ), - ], - padding: const EdgeDims.symmetric(vertical: 20.0) - ); - } - - Widget build(BuildContext context) { - return new Scaffold( - toolBar: buildToolBar(), - body: buildSettingsPane(context) - ); - } -} diff --git a/examples/fitness/lib/user_data.dart b/examples/fitness/lib/user_data.dart deleted file mode 100644 index ef6eabb1531..00000000000 --- a/examples/fitness/lib/user_data.dart +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2015 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 'dart:convert'; -import 'dart:io'; -import 'dart:async'; - -import 'package:path/path.dart' as path; - -import 'main.dart'; -import 'package:flutter/services.dart'; - -String cachedDataFilePath = null; - -Future dataFilePath() async { - if (cachedDataFilePath == null) { - String dataDir = await getFilesDir(); - cachedDataFilePath = path.join(dataDir, 'data.json'); - } - return cachedDataFilePath; -} - -Future loadFitnessData() async { - String dataPath = await dataFilePath(); - print("Loading from $dataPath"); - JsonDecoder decoder = new JsonDecoder(); - Map data = await decoder.convert(await new File(dataPath).readAsString()); - return new UserDataImpl.fromJson(data); -} - -// Intentionally synchronous for execution just before shutdown. -Future saveFitnessData(UserDataImpl data) async { - String dataPath = await dataFilePath(); - print("Saving to $dataPath"); - JsonEncoder encoder = new JsonEncoder(); - String contents = await encoder.convert(data); - File dataFile = await new File(dataPath).writeAsString(contents); - print("Success! $dataFile"); -} diff --git a/examples/fitness/pubspec.yaml b/examples/fitness/pubspec.yaml deleted file mode 100644 index 75c66e94151..00000000000 --- a/examples/fitness/pubspec.yaml +++ /dev/null @@ -1,7 +0,0 @@ -name: fitness -dependencies: - path: ^1.3.6 - flutter: - path: ../../packages/flutter - playfair: - path: ../../packages/playfair