// 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 'package:sky/mojo/activity.dart' as activity; import 'package:sky/mojo/asset_bundle.dart'; import 'package:sky/painting/box_painter.dart'; import 'package:sky/theme/colors.dart' as colors; import 'package:sky/theme/typography.dart' as typography; import 'package:sky/widgets.dart'; AssetBundle _initBundle() { if (rootBundle != null) return rootBundle; const String _kAssetBase = '..'; return new NetworkAssetBundle(Uri.base.resolve(_kAssetBase)); } final AssetBundle _bundle = _initBundle(); EventDisposition launch(String relativeUrl, String bundle) { // TODO(eseidel): This is a hack to keep non-skyx examples working for now: Uri productionBase = Uri.parse( 'https://domokit.github.io/example/demo_launcher/lib/main.dart'); Uri base = rootBundle == null ? Uri.base : productionBase; Uri url = base.resolve(relativeUrl); activity.ComponentName component = new activity.ComponentName() ..packageName = 'org.domokit.sky.demo' ..className = 'org.domokit.sky.demo.SkyDemoActivity'; activity.Intent intent = new activity.Intent() ..action = 'android.intent.action.VIEW' ..component = component ..flags = activity.MULTIPLE_TASK | activity.NEW_DOCUMENT ..url = url.toString(); if (bundle != null) { activity.StringExtra extra = new activity.StringExtra() ..name = 'bundleName' ..value = bundle; intent.stringExtras = [extra]; } activity.startActivity(intent); return EventDisposition.processed; } class SkyDemo { SkyDemo({ name, this.href, this.bundle, this.description, this.textTheme, this.decoration }) : name = name, key = new Key(name); final String name; final Key key; final String href; final String bundle; final String description; final typography.TextTheme textTheme; final BoxDecoration decoration; } List demos = [ new SkyDemo( name: 'Stocks', href: '../../stocks/lib/main.dart', bundle: 'stocks.skyx', description: 'Multi-screen app with scrolling list', textTheme: typography.black, decoration: new BoxDecoration( backgroundImage: new BackgroundImage( image: _bundle.loadImage('assets/stocks_thumbnail.png'), fit: ImageFit.cover ) ) ), new SkyDemo( name: 'Asteroids', href: '../../game/lib/main.dart', bundle: 'game.skyx', description: '2D game using sprite sheets', textTheme: typography.white, decoration: new BoxDecoration( backgroundImage: new BackgroundImage( image: _bundle.loadImage('assets/game_thumbnail.png'), fit: ImageFit.cover ) ) ), new SkyDemo( name: 'Fitness', href: '../../fitness/lib/main.dart', bundle: 'fitness.skyx', description: 'Track progress towards healthy goals', textTheme: typography.white, decoration: new BoxDecoration( backgroundColor: colors.Indigo[500] ) ), new SkyDemo( name: 'Swipe Away', href: '../../widgets/card_collection.dart', bundle: 'cards.skyx', description: 'Infinite list of swipeable cards', textTheme: typography.white, decoration: new BoxDecoration( backgroundColor: colors.RedAccent[200] ) ), new SkyDemo( name: 'Interactive Text', href: '../../rendering/interactive_flex.dart', bundle: 'interactive_flex.skyx', description: 'Swipe to reflow the app', textTheme: typography.white, decoration: new BoxDecoration( backgroundColor: const Color(0xFF0081C6) ) ), // new SkyDemo( // 'Touch Demo', '../../rendering/touch_demo.dart', 'Simple example showing handling of touch events at a low level'), new SkyDemo( name: 'Minedigger Game', href: '../../mine_digger/lib/main.dart', bundle: 'mine_digger.skyx', description: 'Clone of the classic Minesweeper game', textTheme: typography.white, decoration: new BoxDecoration( backgroundColor: colors.black ) ), // TODO(jackson): This doesn't seem to be working // new SkyDemo('Licenses', 'LICENSES.sky'), ]; const double kCardHeight = 120.0; const EdgeDims kListPadding = const EdgeDims.all(4.0); class DemoList extends Component { Widget buildCardContents(SkyDemo demo) { return new Container( decoration: demo.decoration, child: new InkWell( child: new Container( margin: const EdgeDims.only(top: 24.0, left: 24.0), child: new Flex([ new Text(demo.name, style: demo.textTheme.title), new Flexible( child: new Text(demo.description, style: demo.textTheme.subhead) ) ], direction: FlexDirection.vertical, alignItems: FlexAlignItems.start) ) ) ); } Widget buildDemo(SkyDemo demo) { return new Listener( key: demo.key, onGestureTap: (_) => launch(demo.href, demo.bundle), child: new Container( height: kCardHeight, child: new Card( child: buildCardContents(demo) ) ) ); } Widget build() { return new ScrollableList( items: demos, itemExtent: kCardHeight, itemBuilder: buildDemo, padding: kListPadding ); } } class SkyHome extends App { Widget build() { return new Theme( data: new ThemeData( brightness: ThemeBrightness.light, primarySwatch: colors.Teal ), child: new TaskDescription( label: 'Sky Demos', child: new Scaffold( toolbar: new ToolBar(center: new Text('Sky Demos')), body: new Material( type: MaterialType.canvas, child: new DemoList() ) ) ) ); } } void main() { runApp(new SkyHome()); }