From 1fab64209ce632cd9c7961cdb9b9493629001ac5 Mon Sep 17 00:00:00 2001 From: WieFel Date: Sat, 13 Jun 2020 20:39:13 +0200 Subject: [PATCH 01/47] Created empty flutter demo project --- demo/.gitignore | 48 ++++++++++++++++ demo/.metadata | 10 ++++ demo/README.md | 8 +++ demo/lib/main.dart | 110 +++++++++++++++++++++++++++++++++++++ demo/pubspec.yaml | 89 ++++++++++++++++++++++++++++++ demo/settings.gradle | 3 + demo/test/widget_test.dart | 30 ++++++++++ 7 files changed, 298 insertions(+) create mode 100644 demo/.gitignore create mode 100644 demo/.metadata create mode 100644 demo/README.md create mode 100644 demo/lib/main.dart create mode 100644 demo/pubspec.yaml create mode 100644 demo/settings.gradle create mode 100644 demo/test/widget_test.dart diff --git a/demo/.gitignore b/demo/.gitignore new file mode 100644 index 0000000..ff612b3 --- /dev/null +++ b/demo/.gitignore @@ -0,0 +1,48 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +*.swp +profile + +DerivedData/ + +.generated/ + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + +build/ +.android/ +.ios/ +.flutter-plugins +.flutter-plugins-dependencies + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json diff --git a/demo/.metadata b/demo/.metadata new file mode 100644 index 0000000..26d3615 --- /dev/null +++ b/demo/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: f7a6a7906be96d2288f5d63a5a54c515a6e987fe + channel: stable + +project_type: module diff --git a/demo/README.md b/demo/README.md new file mode 100644 index 0000000..67c26a6 --- /dev/null +++ b/demo/README.md @@ -0,0 +1,8 @@ +# demo + +Demo application showing the use cases of backdrop. + +## Getting Started + +For help getting started with Flutter, view our online +[documentation](https://flutter.dev/). diff --git a/demo/lib/main.dart b/demo/lib/main.dart new file mode 100644 index 0000000..f0263ee --- /dev/null +++ b/demo/lib/main.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatelessWidget { + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + // This is the theme of your application. + // + // Try running your application with "flutter run". You'll see the + // application has a blue toolbar. Then, without quitting the app, try + // changing the primarySwatch below to Colors.green and then invoke + // "hot reload" (press "r" in the console where you ran "flutter run", + // or press Run > Flutter Hot Reload in a Flutter IDE). Notice that the + // counter didn't reset back to zero; the application is not restarted. + primarySwatch: Colors.blue, + ), + home: MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatefulWidget { + MyHomePage({Key key, this.title}) : super(key: key); + + // This widget is the home page of your application. It is stateful, meaning + // that it has a State object (defined below) that contains fields that affect + // how it looks. + + // This class is the configuration for the state. It holds the values (in this + // case the title) provided by the parent (in this case the App widget) and + // used by the build method of the State. Fields in a Widget subclass are + // always marked "final". + + final String title; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + int _counter = 0; + + void _incrementCounter() { + setState(() { + // This call to setState tells the Flutter framework that something has + // changed in this State, which causes it to rerun the build method below + // so that the display can reflect the updated values. If we changed + // _counter without calling setState(), then the build method would not be + // called again, and so nothing would appear to happen. + _counter++; + }); + } + + @override + Widget build(BuildContext context) { + // This method is rerun every time setState is called, for instance as done + // by the _incrementCounter method above. + // + // The Flutter framework has been optimized to make rerunning build methods + // fast, so that you can just rebuild anything that needs updating rather + // than having to individually change instances of widgets. + return Scaffold( + appBar: AppBar( + // Here we take the value from the MyHomePage object that was created by + // the App.build method, and use it to set our appbar title. + title: Text(widget.title), + ), + body: Center( + // Center is a layout widget. It takes a single child and positions it + // in the middle of the parent. + child: Column( + // Column is also a layout widget. It takes a list of children and + // arranges them vertically. By default, it sizes itself to fit its + // children horizontally, and tries to be as tall as its parent. + // + // Invoke "debug painting" (press "p" in the console, choose the + // "Toggle Debug Paint" action from the Flutter Inspector in Android + // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) + // to see the wireframe for each widget. + // + // Column has various properties to control how it sizes itself and + // how it positions its children. Here we use mainAxisAlignment to + // center the children vertically; the main axis here is the vertical + // axis because Columns are vertical (the cross axis would be + // horizontal). + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'You have pushed the button this many times:', + ), + Text( + '$_counter', + style: Theme.of(context).textTheme.headline4, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Increment', + child: Icon(Icons.add), + ), // This trailing comma makes auto-formatting nicer for build methods. + ); + } +} diff --git a/demo/pubspec.yaml b/demo/pubspec.yaml new file mode 100644 index 0000000..b5def28 --- /dev/null +++ b/demo/pubspec.yaml @@ -0,0 +1,89 @@ +name: demo +description: Demo application showing the use cases of backdrop. + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# +# This version is used _only_ for the Runner app, which is used if you just do +# a `flutter run` or a `flutter make-host-app-editable`. It has no impact +# on any other native host app that you embed your Flutter project into. +version: 1.0.0+1 + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^0.1.3 + # Add backdrop dependency here + backdrop: + path: "../" + +dev_dependencies: + flutter_test: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +flutter: + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add Flutter specific assets to your application, add an assets section, + # like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add Flutter specific custom fonts to your application, add a fonts + # section here, in this "flutter" section. Each entry in this list should + # have a "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages + + + # This section identifies your Flutter project as a module meant for + # embedding in a native host app. These identifiers should _not_ ordinarily + # be changed after generation - they are used to ensure that the tooling can + # maintain consistency when adding or modifying assets and plugins. + # They also do not have any bearing on your native host application's + # identifiers, which may be completely independent or the same as these. + module: + androidX: true + androidPackage: com.example.demo + iosBundleIdentifier: com.example.demo diff --git a/demo/settings.gradle b/demo/settings.gradle new file mode 100644 index 0000000..c77f617 --- /dev/null +++ b/demo/settings.gradle @@ -0,0 +1,3 @@ + +// Generated file. Do not edit. +include ':.android' diff --git a/demo/test/widget_test.dart b/demo/test/widget_test.dart new file mode 100644 index 0000000..64db941 --- /dev/null +++ b/demo/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:demo/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} From 65b5c2e0af4a424f55b1258a9e4210eb077f4b0b Mon Sep 17 00:00:00 2001 From: WieFel Date: Tue, 16 Jun 2020 16:17:26 +0200 Subject: [PATCH 02/47] Removed unnecessary flutter example code --- demo/lib/main.dart | 90 +++------------------------------------------- 1 file changed, 5 insertions(+), 85 deletions(-) diff --git a/demo/lib/main.dart b/demo/lib/main.dart index f0263ee..7a8087b 100644 --- a/demo/lib/main.dart +++ b/demo/lib/main.dart @@ -3,108 +3,28 @@ import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { - // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( - title: 'Flutter Demo', + title: "Backdrop Gallery", theme: ThemeData( - // This is the theme of your application. - // - // Try running your application with "flutter run". You'll see the - // application has a blue toolbar. Then, without quitting the app, try - // changing the primarySwatch below to Colors.green and then invoke - // "hot reload" (press "r" in the console where you ran "flutter run", - // or press Run > Flutter Hot Reload in a Flutter IDE). Notice that the - // counter didn't reset back to zero; the application is not restarted. primarySwatch: Colors.blue, ), - home: MyHomePage(title: 'Flutter Demo Home Page'), + home: MyHomePage(), ); } } -class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - +class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. return Scaffold( appBar: AppBar( - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), + title: Text("Backdrop Gallery"), ), body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Invoke "debug painting" (press "p" in the console, choose the - // "Toggle Debug Paint" action from the Flutter Inspector in Android - // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) - // to see the wireframe for each widget. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headline4, - ), - ], - ), + child: Text("Backdrop Gallery content"), ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. ); } } From ec4c3e31bee6c4d1c431d86442070379906afe77 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Mon, 22 Jun 2020 18:47:30 +0200 Subject: [PATCH 03/47] Applied dark theme from flutter gallery app --- demo/lib/main.dart | 5 +- demo/lib/theme_data.dart | 100 +++++++++++++++++++++++++++++++++++++++ demo/pubspec.yaml | 1 + 3 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 demo/lib/theme_data.dart diff --git a/demo/lib/main.dart b/demo/lib/main.dart index 7a8087b..b0f7569 100644 --- a/demo/lib/main.dart +++ b/demo/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:demo/theme_data.dart'; import 'package:flutter/material.dart'; void main() => runApp(MyApp()); @@ -7,9 +8,7 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( title: "Backdrop Gallery", - theme: ThemeData( - primarySwatch: Colors.blue, - ), + theme: GalleryThemeData.darkThemeData, home: MyHomePage(), ); } diff --git a/demo/lib/theme_data.dart b/demo/lib/theme_data.dart new file mode 100644 index 0000000..0f00bc6 --- /dev/null +++ b/demo/lib/theme_data.dart @@ -0,0 +1,100 @@ +// Taken from flutter gallery app +// +// Copyright 2019 The Flutter team. 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'; +import 'package:google_fonts/google_fonts.dart'; + +class GalleryThemeData { + static const _lightFillColor = Colors.black; + static const _darkFillColor = Colors.white; + + static final Color _lightFocusColor = Colors.black.withOpacity(0.12); + static final Color _darkFocusColor = Colors.white.withOpacity(0.12); + + static ThemeData lightThemeData = + themeData(lightColorScheme, _lightFocusColor); + static ThemeData darkThemeData = themeData(darkColorScheme, _darkFocusColor); + + static ThemeData themeData(ColorScheme colorScheme, Color focusColor) { + return ThemeData( + colorScheme: colorScheme, + textTheme: _textTheme, + // Matches manifest.json colors and background color. + primaryColor: const Color(0xFF030303), + appBarTheme: AppBarTheme( + textTheme: _textTheme.apply(bodyColor: colorScheme.onPrimary), + color: colorScheme.background, + elevation: 0, + iconTheme: IconThemeData(color: colorScheme.primary), + brightness: colorScheme.brightness, + ), + iconTheme: IconThemeData(color: colorScheme.onPrimary), + canvasColor: colorScheme.background, + scaffoldBackgroundColor: colorScheme.background, + highlightColor: Colors.transparent, + accentColor: colorScheme.primary, + focusColor: focusColor, + snackBarTheme: SnackBarThemeData( + behavior: SnackBarBehavior.floating, + backgroundColor: Color.alphaBlend( + _lightFillColor.withOpacity(0.80), + _darkFillColor, + ), + contentTextStyle: _textTheme.subtitle1.apply(color: _darkFillColor), + ), + ); + } + + static const ColorScheme lightColorScheme = ColorScheme( + primary: Color(0xFFB93C5D), + primaryVariant: Color(0xFF117378), + secondary: Color(0xFFEFF3F3), + secondaryVariant: Color(0xFFFAFBFB), + background: Color(0xFFE6EBEB), + surface: Color(0xFFFAFBFB), + onBackground: Colors.white, + error: _lightFillColor, + onError: _lightFillColor, + onPrimary: _lightFillColor, + onSecondary: Color(0xFF322942), + onSurface: Color(0xFF241E30), + brightness: Brightness.light, + ); + + static const ColorScheme darkColorScheme = ColorScheme( + primary: Color(0xFFFF8383), + primaryVariant: Color(0xFF1CDEC9), + secondary: Color(0xFF4D1F7C), + secondaryVariant: Color(0xFF451B6F), + background: Color(0xFF241E30), + surface: Color(0xFF1F1929), + onBackground: Color(0x0DFFFFFF), // White with 0.05 opacity + error: _darkFillColor, + onError: _darkFillColor, + onPrimary: _darkFillColor, + onSecondary: _darkFillColor, + onSurface: _darkFillColor, + brightness: Brightness.dark, + ); + + static const _regular = FontWeight.w400; + static const _medium = FontWeight.w500; + static const _semiBold = FontWeight.w600; + static const _bold = FontWeight.w700; + + static final TextTheme _textTheme = TextTheme( + headline4: GoogleFonts.montserrat(fontWeight: _bold, fontSize: 20.0), + caption: GoogleFonts.oswald(fontWeight: _semiBold, fontSize: 16.0), + headline5: GoogleFonts.oswald(fontWeight: _medium, fontSize: 16.0), + subtitle1: GoogleFonts.montserrat(fontWeight: _medium, fontSize: 16.0), + overline: GoogleFonts.montserrat(fontWeight: _medium, fontSize: 12.0), + bodyText1: GoogleFonts.montserrat(fontWeight: _regular, fontSize: 14.0), + subtitle2: GoogleFonts.montserrat(fontWeight: _medium, fontSize: 14.0), + bodyText2: GoogleFonts.montserrat(fontWeight: _regular, fontSize: 16.0), + headline6: GoogleFonts.montserrat(fontWeight: _bold, fontSize: 16.0), + button: GoogleFonts.montserrat(fontWeight: _semiBold, fontSize: 14.0), + ); +} diff --git a/demo/pubspec.yaml b/demo/pubspec.yaml index b5def28..44459a1 100644 --- a/demo/pubspec.yaml +++ b/demo/pubspec.yaml @@ -27,6 +27,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.3 + google_fonts: ^1.1.0 # Add backdrop dependency here backdrop: path: "../" From ce3fd41db851dd0d94e609de4ebb3ba5de00e248 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Thu, 25 Jun 2020 21:02:45 +0200 Subject: [PATCH 04/47] Added basic layout of main page --- demo/lib/main.dart | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/demo/lib/main.dart b/demo/lib/main.dart index b0f7569..124d82f 100644 --- a/demo/lib/main.dart +++ b/demo/lib/main.dart @@ -21,8 +21,20 @@ class MyHomePage extends StatelessWidget { appBar: AppBar( title: Text("Backdrop Gallery"), ), - body: Center( - child: Text("Backdrop Gallery content"), + body: Column( + children: [ + Container( + margin: EdgeInsets.symmetric(vertical: 16.0), + child: Text( + "This app shows some use cases for the backdrop widget."), + ), + ListView( + shrinkWrap: true, + children: [ + ListTile(title: Text("Use case 1"), onTap: () {},), + ListTile(title: Text("Use case 2"), onTap: () {},) + ],), + ], ), ); } From 07119c35ff481dedcd2518bb115fe6a688b44de1 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Thu, 25 Jun 2020 21:27:05 +0200 Subject: [PATCH 05/47] Created demo page + generic demo page content widgets --- demo/lib/demo/code.dart | 10 ++++++ demo/lib/demo/demo_page.dart | 60 ++++++++++++++++++++++++++++++++++++ demo/lib/demo/info.dart | 10 ++++++ demo/lib/demo/preview.dart | 10 ++++++ demo/lib/main.dart | 23 +++++++++++--- 5 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 demo/lib/demo/code.dart create mode 100644 demo/lib/demo/demo_page.dart create mode 100644 demo/lib/demo/info.dart create mode 100644 demo/lib/demo/preview.dart diff --git a/demo/lib/demo/code.dart b/demo/lib/demo/code.dart new file mode 100644 index 0000000..c0c05c8 --- /dev/null +++ b/demo/lib/demo/code.dart @@ -0,0 +1,10 @@ +import 'package:flutter/cupertino.dart'; + +class Code extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Center( + child: Text("Code"), + ); + } +} diff --git a/demo/lib/demo/demo_page.dart b/demo/lib/demo/demo_page.dart new file mode 100644 index 0000000..204b7a7 --- /dev/null +++ b/demo/lib/demo/demo_page.dart @@ -0,0 +1,60 @@ +import 'package:demo/demo/code.dart'; +import 'package:demo/demo/info.dart'; +import 'package:demo/demo/preview.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class DemoPage extends StatefulWidget { + String name; + + DemoPage(this.name); + + @override + _DemoPageState createState() => _DemoPageState(); +} + +class _DemoPageState extends State { + Widget _current; + + @override + void initState() { + _current = Info(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Demo " + widget.name), + actions: [ + IconButton( + icon: Icon(Icons.info), + onPressed: () { + setState(() { + _current = Info(); + }); + }, + ), + IconButton( + icon: Icon(Icons.visibility), + onPressed: () { + setState(() { + _current = Preview(); + }); + }, + ), + IconButton( + icon: Icon(Icons.code), + onPressed: () { + setState(() { + _current = Code(); + }); + }, + ), + ], + ), + body: _current, + ); + } +} diff --git a/demo/lib/demo/info.dart b/demo/lib/demo/info.dart new file mode 100644 index 0000000..d5fb81d --- /dev/null +++ b/demo/lib/demo/info.dart @@ -0,0 +1,10 @@ +import 'package:flutter/cupertino.dart'; + +class Info extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Center( + child: Text("Info"), + ); + } +} diff --git a/demo/lib/demo/preview.dart b/demo/lib/demo/preview.dart new file mode 100644 index 0000000..4dc537e --- /dev/null +++ b/demo/lib/demo/preview.dart @@ -0,0 +1,10 @@ +import 'package:flutter/cupertino.dart'; + +class Preview extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Center( + child: Text("Preview"), + ); + } +} diff --git a/demo/lib/main.dart b/demo/lib/main.dart index 124d82f..ed187f0 100644 --- a/demo/lib/main.dart +++ b/demo/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:demo/demo/demo_page.dart'; import 'package:demo/theme_data.dart'; import 'package:flutter/material.dart'; @@ -25,17 +26,29 @@ class MyHomePage extends StatelessWidget { children: [ Container( margin: EdgeInsets.symmetric(vertical: 16.0), - child: Text( - "This app shows some use cases for the backdrop widget."), + child: + Text("This app shows some use cases for the backdrop widget."), ), ListView( shrinkWrap: true, children: [ - ListTile(title: Text("Use case 1"), onTap: () {},), - ListTile(title: Text("Use case 2"), onTap: () {},) - ],), + ListTile( + title: Text("Use case 1"), + onTap: () => _openDemoPage(context, "Use case 1"), + ), + ListTile( + title: Text("Use case 2"), + onTap: () => _openDemoPage(context, "Use case 2"), + ) + ], + ), ], ), ); } + + _openDemoPage(BuildContext context, String name) { + Navigator.push( + context, MaterialPageRoute(builder: (context) => DemoPage(name))); + } } From 18127a99a9674e81d584a4f2578aee61a2ba48b8 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Thu, 25 Jun 2020 21:31:12 +0200 Subject: [PATCH 06/47] Highlighting selected IconButton in demo page --- demo/lib/demo/demo_page.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/demo/lib/demo/demo_page.dart b/demo/lib/demo/demo_page.dart index 204b7a7..bbada1a 100644 --- a/demo/lib/demo/demo_page.dart +++ b/demo/lib/demo/demo_page.dart @@ -30,6 +30,7 @@ class _DemoPageState extends State { actions: [ IconButton( icon: Icon(Icons.info), + color: _current is Info ? null : Colors.white, onPressed: () { setState(() { _current = Info(); @@ -38,6 +39,7 @@ class _DemoPageState extends State { ), IconButton( icon: Icon(Icons.visibility), + color: _current is Preview ? null : Colors.white, onPressed: () { setState(() { _current = Preview(); @@ -46,6 +48,7 @@ class _DemoPageState extends State { ), IconButton( icon: Icon(Icons.code), + color: _current is Code ? null : Colors.white, onPressed: () { setState(() { _current = Code(); From c75899016b66447436c230941b12d3663f2f45f2 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Thu, 25 Jun 2020 22:11:03 +0200 Subject: [PATCH 07/47] Created model for use case + added test use case data --- demo/lib/data/test_use_case_1.dart | 14 ++++++++++++++ demo/lib/data/use_case.dart | 9 +++++++++ 2 files changed, 23 insertions(+) create mode 100644 demo/lib/data/test_use_case_1.dart create mode 100644 demo/lib/data/use_case.dart diff --git a/demo/lib/data/test_use_case_1.dart b/demo/lib/data/test_use_case_1.dart new file mode 100644 index 0000000..f4509d9 --- /dev/null +++ b/demo/lib/data/test_use_case_1.dart @@ -0,0 +1,14 @@ +import 'package:demo/data/use_case.dart'; +import 'package:flutter/material.dart'; + +class UseCase1 extends UseCase { + UseCase1() { + name = "Test Use Case 1"; + description = "This is the description of test use case 1"; + code = "void helloWorld() {\n}"; + preview = Container( + child: Center(child: Text("Preview!!!")), + color: Colors.orange, + ); + } +} diff --git a/demo/lib/data/use_case.dart b/demo/lib/data/use_case.dart new file mode 100644 index 0000000..f7b3dfc --- /dev/null +++ b/demo/lib/data/use_case.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; + +abstract class UseCase { + String name; + String description; + String code; + + Widget preview; +} From 8ab031dba34a20ba7beba9bf8ca6168e2f7d22d9 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Thu, 25 Jun 2020 22:11:17 +0200 Subject: [PATCH 08/47] Basic displaying of use case works --- demo/lib/demo/code.dart | 6 +++++- demo/lib/demo/demo_page.dart | 16 +++++++++------- demo/lib/demo/info.dart | 18 ++++++++++++++++-- demo/lib/demo/preview.dart | 12 ++++++++++-- demo/lib/main.dart | 25 ++++++++++++------------- 5 files changed, 52 insertions(+), 25 deletions(-) diff --git a/demo/lib/demo/code.dart b/demo/lib/demo/code.dart index c0c05c8..daef375 100644 --- a/demo/lib/demo/code.dart +++ b/demo/lib/demo/code.dart @@ -1,10 +1,14 @@ import 'package:flutter/cupertino.dart'; class Code extends StatelessWidget { + String code; + + Code(this.code); + @override Widget build(BuildContext context) { return Center( - child: Text("Code"), + child: Text(code), ); } } diff --git a/demo/lib/demo/demo_page.dart b/demo/lib/demo/demo_page.dart index bbada1a..40196e7 100644 --- a/demo/lib/demo/demo_page.dart +++ b/demo/lib/demo/demo_page.dart @@ -1,3 +1,4 @@ +import 'package:demo/data/use_case.dart'; import 'package:demo/demo/code.dart'; import 'package:demo/demo/info.dart'; import 'package:demo/demo/preview.dart'; @@ -5,9 +6,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class DemoPage extends StatefulWidget { - String name; + UseCase useCase; - DemoPage(this.name); + DemoPage(this.useCase); @override _DemoPageState createState() => _DemoPageState(); @@ -18,7 +19,7 @@ class _DemoPageState extends State { @override void initState() { - _current = Info(); + _current = Info(widget.useCase.name, widget.useCase.description); super.initState(); } @@ -26,14 +27,15 @@ class _DemoPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text("Demo " + widget.name), + title: Text(widget.useCase.name), actions: [ IconButton( icon: Icon(Icons.info), color: _current is Info ? null : Colors.white, onPressed: () { setState(() { - _current = Info(); + _current = + Info(widget.useCase.name, widget.useCase.description); }); }, ), @@ -42,7 +44,7 @@ class _DemoPageState extends State { color: _current is Preview ? null : Colors.white, onPressed: () { setState(() { - _current = Preview(); + _current = Preview(widget.useCase.preview); }); }, ), @@ -51,7 +53,7 @@ class _DemoPageState extends State { color: _current is Code ? null : Colors.white, onPressed: () { setState(() { - _current = Code(); + _current = Code(widget.useCase.code); }); }, ), diff --git a/demo/lib/demo/info.dart b/demo/lib/demo/info.dart index d5fb81d..86b0af5 100644 --- a/demo/lib/demo/info.dart +++ b/demo/lib/demo/info.dart @@ -1,10 +1,24 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; class Info extends StatelessWidget { + String title; + String description; + + Info(this.title, this.description); + @override Widget build(BuildContext context) { - return Center( - child: Text("Info"), + return Column( + children: [ + Center( + child: Text( + title, + style: Theme.of(context).textTheme.headline3, + ), + ), + Text(description), + ], ); } } diff --git a/demo/lib/demo/preview.dart b/demo/lib/demo/preview.dart index 4dc537e..171b5a5 100644 --- a/demo/lib/demo/preview.dart +++ b/demo/lib/demo/preview.dart @@ -1,10 +1,18 @@ import 'package:flutter/cupertino.dart'; class Preview extends StatelessWidget { + Widget preview; + + Preview(this.preview); + @override Widget build(BuildContext context) { - return Center( - child: Text("Preview"), + return Container( + margin: EdgeInsets.all(16.0), + child: ClipRRect( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8.0), topRight: Radius.circular(8.0)), + child: preview), ); } } diff --git a/demo/lib/main.dart b/demo/lib/main.dart index ed187f0..ad9a054 100644 --- a/demo/lib/main.dart +++ b/demo/lib/main.dart @@ -1,3 +1,5 @@ +import 'package:demo/data/test_use_case_1.dart'; +import 'package:demo/data/use_case.dart'; import 'package:demo/demo/demo_page.dart'; import 'package:demo/theme_data.dart'; import 'package:flutter/material.dart'; @@ -16,6 +18,8 @@ class MyApp extends StatelessWidget { } class MyHomePage extends StatelessWidget { + List _useCases = [UseCase1()]; + @override Widget build(BuildContext context) { return Scaffold( @@ -29,26 +33,21 @@ class MyHomePage extends StatelessWidget { child: Text("This app shows some use cases for the backdrop widget."), ), - ListView( + ListView.builder( + itemCount: _useCases.length, + itemBuilder: (BuildContext context, int index) => ListTile( + title: Text(_useCases[index].name), + onTap: () => _openDemoPage(context, _useCases[index]), + ), shrinkWrap: true, - children: [ - ListTile( - title: Text("Use case 1"), - onTap: () => _openDemoPage(context, "Use case 1"), - ), - ListTile( - title: Text("Use case 2"), - onTap: () => _openDemoPage(context, "Use case 2"), - ) - ], ), ], ), ); } - _openDemoPage(BuildContext context, String name) { + _openDemoPage(BuildContext context, UseCase useCase) { Navigator.push( - context, MaterialPageRoute(builder: (context) => DemoPage(name))); + context, MaterialPageRoute(builder: (context) => DemoPage(useCase))); } } From d42b0ab981f2c0c407415ba4095dee9b21623ed5 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Fri, 26 Jun 2020 19:00:08 +0200 Subject: [PATCH 09/47] Improved display of use cases + added navigation use case --- demo/lib/data/test_use_case_1.dart | 14 ----- demo/lib/data/use_case.dart | 2 +- .../data/use_cases/navigation/navigation.dart | 52 +++++++++++++++++++ .../navigation/navigation_use_case.dart | 15 ++++++ demo/lib/demo/code.dart | 27 ++++++++-- demo/lib/demo/demo_page.dart | 2 +- demo/lib/demo/info.dart | 6 ++- demo/lib/main.dart | 4 +- demo/pubspec.yaml | 5 +- 9 files changed, 101 insertions(+), 26 deletions(-) delete mode 100644 demo/lib/data/test_use_case_1.dart create mode 100644 demo/lib/data/use_cases/navigation/navigation.dart create mode 100644 demo/lib/data/use_cases/navigation/navigation_use_case.dart diff --git a/demo/lib/data/test_use_case_1.dart b/demo/lib/data/test_use_case_1.dart deleted file mode 100644 index f4509d9..0000000 --- a/demo/lib/data/test_use_case_1.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:demo/data/use_case.dart'; -import 'package:flutter/material.dart'; - -class UseCase1 extends UseCase { - UseCase1() { - name = "Test Use Case 1"; - description = "This is the description of test use case 1"; - code = "void helloWorld() {\n}"; - preview = Container( - child: Center(child: Text("Preview!!!")), - color: Colors.orange, - ); - } -} diff --git a/demo/lib/data/use_case.dart b/demo/lib/data/use_case.dart index f7b3dfc..f3ae61e 100644 --- a/demo/lib/data/use_case.dart +++ b/demo/lib/data/use_case.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; abstract class UseCase { String name; String description; - String code; + String codeFile; Widget preview; } diff --git a/demo/lib/data/use_cases/navigation/navigation.dart b/demo/lib/data/use_cases/navigation/navigation.dart new file mode 100644 index 0000000..6039036 --- /dev/null +++ b/demo/lib/data/use_cases/navigation/navigation.dart @@ -0,0 +1,52 @@ +import 'package:backdrop/backdrop.dart'; +import 'package:flutter/material.dart'; + +class Navigation extends StatefulWidget { + @override + _NavigationState createState() => _NavigationState(); +} + +class _NavigationState extends State { + int _currentIndex = 0; + final List _pages = [Widget1(), Widget2()]; + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Backdrop Demo', + home: BackdropScaffold( + appBar: BackdropAppBar( + title: Text("Navigation Example"), + actions: [ + BackdropToggleButton( + icon: AnimatedIcons.list_view, + ) + ], + ), + stickyFrontLayer: true, + frontLayer: _pages[_currentIndex], + backLayer: BackdropNavigationBackLayer( + items: [ + ListTile(title: Text("Widget 1")), + ListTile(title: Text("Widget 2")), + ], + onTap: (int position) => {setState(() => _currentIndex = position)}, + ), + ), + ); + } +} + +class Widget1 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Center(child: Text("Widget 1")); + } +} + +class Widget2 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Center(child: Text("Widget 2")); + } +} diff --git a/demo/lib/data/use_cases/navigation/navigation_use_case.dart b/demo/lib/data/use_cases/navigation/navigation_use_case.dart new file mode 100644 index 0000000..76b7747 --- /dev/null +++ b/demo/lib/data/use_cases/navigation/navigation_use_case.dart @@ -0,0 +1,15 @@ +import 'package:demo/data/use_case.dart'; +import 'package:demo/data/use_cases/navigation/navigation.dart'; + +class NavigationUseCase extends UseCase { + /// Creates a Navigation use case instance + NavigationUseCase() { + name = "Navigation"; + description = """ + Backdrop can be used for navigating between different front layers. + The back layer shows the navigation options and upon selecting any one, + the front layer changes its content."""; + codeFile = "lib/data/use_cases/navigation/navigation.dart"; + preview = Navigation(); + } +} diff --git a/demo/lib/demo/code.dart b/demo/lib/demo/code.dart index daef375..9cda188 100644 --- a/demo/lib/demo/code.dart +++ b/demo/lib/demo/code.dart @@ -1,14 +1,33 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; -class Code extends StatelessWidget { - String code; +class Code extends StatefulWidget { + String codeFile; + + Code(this.codeFile); + + @override + _CodeState createState() => _CodeState(); +} - Code(this.code); +class _CodeState extends State { + String code; @override Widget build(BuildContext context) { return Center( - child: Text(code), + child: FutureBuilder( + future: DefaultAssetBundle.of(context).loadString(widget.codeFile), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasData) { + return SingleChildScrollView(child: Text(snapshot.data)); + } else if (snapshot.hasError) { + return Text(snapshot.error.toString()); + } else { + return CircularProgressIndicator(); + } + }, + ), ); } } diff --git a/demo/lib/demo/demo_page.dart b/demo/lib/demo/demo_page.dart index 40196e7..3c0eac0 100644 --- a/demo/lib/demo/demo_page.dart +++ b/demo/lib/demo/demo_page.dart @@ -53,7 +53,7 @@ class _DemoPageState extends State { color: _current is Code ? null : Colors.white, onPressed: () { setState(() { - _current = Code(widget.useCase.code); + _current = Code(widget.useCase.codeFile); }); }, ), diff --git a/demo/lib/demo/info.dart b/demo/lib/demo/info.dart index 86b0af5..95e3f08 100644 --- a/demo/lib/demo/info.dart +++ b/demo/lib/demo/info.dart @@ -15,9 +15,13 @@ class Info extends StatelessWidget { child: Text( title, style: Theme.of(context).textTheme.headline3, + textAlign: TextAlign.center, ), ), - Text(description), + Text( + description, + textAlign: TextAlign.center, + ), ], ); } diff --git a/demo/lib/main.dart b/demo/lib/main.dart index ad9a054..ea28768 100644 --- a/demo/lib/main.dart +++ b/demo/lib/main.dart @@ -1,5 +1,5 @@ -import 'package:demo/data/test_use_case_1.dart'; import 'package:demo/data/use_case.dart'; +import 'package:demo/data/use_cases/navigation/navigation_use_case.dart'; import 'package:demo/demo/demo_page.dart'; import 'package:demo/theme_data.dart'; import 'package:flutter/material.dart'; @@ -18,7 +18,7 @@ class MyApp extends StatelessWidget { } class MyHomePage extends StatelessWidget { - List _useCases = [UseCase1()]; + List _useCases = [NavigationUseCase()]; @override Widget build(BuildContext context) { diff --git a/demo/pubspec.yaml b/demo/pubspec.yaml index 44459a1..768fd28 100644 --- a/demo/pubspec.yaml +++ b/demo/pubspec.yaml @@ -47,9 +47,8 @@ flutter: # To add Flutter specific assets to your application, add an assets section, # like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg + assets: + - lib/data/use_cases/navigation/navigation.dart # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. From 368e461fc776e57c60eb4b4eddf579293d0a302c Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sat, 27 Jun 2020 12:03:30 +0200 Subject: [PATCH 10/47] Further improved layout of app. --- .../navigation/navigation_use_case.dart | 8 ++++---- demo/lib/demo/info.dart | 19 ++++++++++++------- demo/lib/main.dart | 9 ++++++--- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/demo/lib/data/use_cases/navigation/navigation_use_case.dart b/demo/lib/data/use_cases/navigation/navigation_use_case.dart index 76b7747..24340ea 100644 --- a/demo/lib/data/use_cases/navigation/navigation_use_case.dart +++ b/demo/lib/data/use_cases/navigation/navigation_use_case.dart @@ -5,10 +5,10 @@ class NavigationUseCase extends UseCase { /// Creates a Navigation use case instance NavigationUseCase() { name = "Navigation"; - description = """ - Backdrop can be used for navigating between different front layers. - The back layer shows the navigation options and upon selecting any one, - the front layer changes its content."""; + description = + "Backdrop can be used for navigating between different front layers. " + "The back layer shows the navigation options and upon selecting any " + "one, the front layer changes its content."; codeFile = "lib/data/use_cases/navigation/navigation.dart"; preview = Navigation(); } diff --git a/demo/lib/demo/info.dart b/demo/lib/demo/info.dart index 95e3f08..132231f 100644 --- a/demo/lib/demo/info.dart +++ b/demo/lib/demo/info.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class Info extends StatelessWidget { @@ -12,16 +11,22 @@ class Info extends StatelessWidget { return Column( children: [ Center( + child: Container( + margin: EdgeInsets.all(16.0), + child: Text( + title, + style: Theme.of(context).textTheme.headline3, + textAlign: TextAlign.center, + ), + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 16.0), child: Text( - title, - style: Theme.of(context).textTheme.headline3, + description, textAlign: TextAlign.center, ), ), - Text( - description, - textAlign: TextAlign.center, - ), ], ); } diff --git a/demo/lib/main.dart b/demo/lib/main.dart index ea28768..4ff49a3 100644 --- a/demo/lib/main.dart +++ b/demo/lib/main.dart @@ -29,17 +29,20 @@ class MyHomePage extends StatelessWidget { body: Column( children: [ Container( - margin: EdgeInsets.symmetric(vertical: 16.0), + margin: EdgeInsets.all(16.0), child: - Text("This app shows some use cases for the backdrop widget."), + Text("This app shows some use cases for the backdrop widget. " + "Open any one to show information about it, preview it and " + "look at its code."), ), - ListView.builder( + ListView.separated( itemCount: _useCases.length, itemBuilder: (BuildContext context, int index) => ListTile( title: Text(_useCases[index].name), onTap: () => _openDemoPage(context, _useCases[index]), ), shrinkWrap: true, + separatorBuilder: (context, index) => Divider(), ), ], ), From 384a3ccfc6502fcc09a96f43804d86880f17746f Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sat, 27 Jun 2020 12:16:53 +0200 Subject: [PATCH 11/47] Added syntax highlighting for code using flutter_highlight --- demo/lib/demo/code.dart | 14 +++++++++++++- demo/pubspec.yaml | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/demo/lib/demo/code.dart b/demo/lib/demo/code.dart index 9cda188..1ebbe9f 100644 --- a/demo/lib/demo/code.dart +++ b/demo/lib/demo/code.dart @@ -1,5 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_highlight/flutter_highlight.dart'; +import 'package:flutter_highlight/themes/dracula.dart'; class Code extends StatefulWidget { String codeFile; @@ -20,7 +22,17 @@ class _CodeState extends State { future: DefaultAssetBundle.of(context).loadString(widget.codeFile), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { - return SingleChildScrollView(child: Text(snapshot.data)); + return SingleChildScrollView( + child: HighlightView( + snapshot.data, + language: "dart", + theme: draculaTheme, + padding: EdgeInsets.all(8.0), + textStyle: TextStyle( + fontSize: 11, + ), + ), + ); } else if (snapshot.hasError) { return Text(snapshot.error.toString()); } else { diff --git a/demo/pubspec.yaml b/demo/pubspec.yaml index 768fd28..4295881 100644 --- a/demo/pubspec.yaml +++ b/demo/pubspec.yaml @@ -28,6 +28,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.3 google_fonts: ^1.1.0 + flutter_highlight: ^0.6.0 # Add backdrop dependency here backdrop: path: "../" From af9d36eeded45972dfd131a16214d454e338933a Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sat, 27 Jun 2020 12:44:55 +0200 Subject: [PATCH 12/47] Extended navigation use case --- .../data/use_cases/navigation/navigation.dart | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/demo/lib/data/use_cases/navigation/navigation.dart b/demo/lib/data/use_cases/navigation/navigation.dart index 6039036..349f5b3 100644 --- a/demo/lib/data/use_cases/navigation/navigation.dart +++ b/demo/lib/data/use_cases/navigation/navigation.dart @@ -8,12 +8,13 @@ class Navigation extends StatefulWidget { class _NavigationState extends State { int _currentIndex = 0; - final List _pages = [Widget1(), Widget2()]; + final List _pages = [HomePage(), ArticlesPage()]; @override Widget build(BuildContext context) { return MaterialApp( - title: 'Backdrop Demo', + title: 'Navigation', + debugShowCheckedModeBanner: false, home: BackdropScaffold( appBar: BackdropAppBar( title: Text("Navigation Example"), @@ -27,26 +28,56 @@ class _NavigationState extends State { frontLayer: _pages[_currentIndex], backLayer: BackdropNavigationBackLayer( items: [ - ListTile(title: Text("Widget 1")), - ListTile(title: Text("Widget 2")), + ListTile(title: Text("Home")), + ListTile(title: Text("Articles")), ], onTap: (int position) => {setState(() => _currentIndex = position)}, + separator: Divider(), ), + subHeader: _currentIndex == 0 + ? null // no subHeader for home-page + : BackdropSubHeader( + title: Text("Our articles"), + ), ), ); } } -class Widget1 extends StatelessWidget { +class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { - return Center(child: Text("Widget 1")); + return Center( + child: Text( + "Welcome to the online shop!", + style: Theme.of(context).textTheme.headline6, + )); } } -class Widget2 extends StatelessWidget { +class ArticlesPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Center(child: Text("Widget 2")); + return ListView( + children: [ + ListTile( + leading: Icon(Icons.computer), + title: Text("Laptop"), + ), + ListTile( + leading: Icon(Icons.child_friendly), + title: Text("Stroller"), + ), + ListTile( + leading: Icon(Icons.tv), + title: Text("TV"), + ), + ListTile( + leading: Icon(Icons.directions_car), + title: Text("Car"), + ), + ], + shrinkWrap: true, + ); } } From 500d420d036cfadaba679232ee17f265a6e4bc7d Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sat, 27 Jun 2020 16:46:02 +0200 Subject: [PATCH 13/47] Improved navigation use case --- .../data/use_cases/navigation/navigation.dart | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/demo/lib/data/use_cases/navigation/navigation.dart b/demo/lib/data/use_cases/navigation/navigation.dart index 349f5b3..439cca3 100644 --- a/demo/lib/data/use_cases/navigation/navigation.dart +++ b/demo/lib/data/use_cases/navigation/navigation.dart @@ -28,8 +28,16 @@ class _NavigationState extends State { frontLayer: _pages[_currentIndex], backLayer: BackdropNavigationBackLayer( items: [ - ListTile(title: Text("Home")), - ListTile(title: Text("Articles")), + ListTile( + title: Text( + "Home", + style: TextStyle(color: Colors.white), + )), + ListTile( + title: Text( + "Articles", + style: TextStyle(color: Colors.white), + )), ], onTap: (int position) => {setState(() => _currentIndex = position)}, separator: Divider(), @@ -44,17 +52,27 @@ class _NavigationState extends State { } } +/// Home page of the online shop. class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { - return Center( - child: Text( - "Welcome to the online shop!", - style: Theme.of(context).textTheme.headline6, - )); + return Container( + margin: EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Welcome to the online shop!", + style: Theme.of(context).textTheme.headline6, + ), + Text("Please navigate to the articles page to choose your product.") + ], + ), + ); } } +/// Articles page showing the online shop's products. class ArticlesPage extends StatelessWidget { @override Widget build(BuildContext context) { From 06d67796639ebfea29e556f22f36b6a5a6767537 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sat, 27 Jun 2020 16:46:13 +0200 Subject: [PATCH 14/47] Documented UseCase class --- demo/lib/data/use_case.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/demo/lib/data/use_case.dart b/demo/lib/data/use_case.dart index f3ae61e..c6c60fd 100644 --- a/demo/lib/data/use_case.dart +++ b/demo/lib/data/use_case.dart @@ -1,9 +1,16 @@ import 'package:flutter/material.dart'; +/// Abstract class for defining a use case that is presented within the demo app. abstract class UseCase { + /// The name of the use case. String name; + + /// Description of the use case. String description; + + /// Path to the file containing the sample code of the use case. String codeFile; + /// The `Widget` representing a preview of the given use case. Widget preview; } From 756c28d8b0b73b485e596345393bd0b798379d27 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sat, 27 Jun 2020 16:46:33 +0200 Subject: [PATCH 15/47] Upgraded dart sdk version --- demo/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/pubspec.yaml b/demo/pubspec.yaml index 4295881..ca903fb 100644 --- a/demo/pubspec.yaml +++ b/demo/pubspec.yaml @@ -18,7 +18,7 @@ description: Demo application showing the use cases of backdrop. version: 1.0.0+1 environment: - sdk: ">=2.1.0 <3.0.0" + sdk: ">=2.2.0 <3.0.0" dependencies: flutter: From 2a0809987c7cc97157546ff72ac020cd399e34e8 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sat, 27 Jun 2020 16:54:03 +0200 Subject: [PATCH 16/47] Documentation --- demo/lib/demo/code.dart | 3 +++ demo/lib/demo/demo_page.dart | 4 ++++ demo/lib/demo/info.dart | 5 +++++ demo/lib/demo/preview.dart | 3 +++ 4 files changed, 15 insertions(+) diff --git a/demo/lib/demo/code.dart b/demo/lib/demo/code.dart index 1ebbe9f..b5c76b2 100644 --- a/demo/lib/demo/code.dart +++ b/demo/lib/demo/code.dart @@ -3,9 +3,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_highlight/flutter_highlight.dart'; import 'package:flutter_highlight/themes/dracula.dart'; +/// Class for presenting the source code of a given use case. class Code extends StatefulWidget { + /// The path to the file to be read. String codeFile; + /// Creates an instance of [Code]. Code(this.codeFile); @override diff --git a/demo/lib/demo/demo_page.dart b/demo/lib/demo/demo_page.dart index 3c0eac0..1abcdcf 100644 --- a/demo/lib/demo/demo_page.dart +++ b/demo/lib/demo/demo_page.dart @@ -5,9 +5,13 @@ import 'package:demo/demo/preview.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +/// Class for presenting a entire use case to the user. The user can switch bet- +/// ween info, preview and source code pages concerning the given use case. class DemoPage extends StatefulWidget { + /// The use case to be presented to the user. UseCase useCase; + /// Creates an instance of [DemoPage]. DemoPage(this.useCase); @override diff --git a/demo/lib/demo/info.dart b/demo/lib/demo/info.dart index 132231f..9e3c822 100644 --- a/demo/lib/demo/info.dart +++ b/demo/lib/demo/info.dart @@ -1,9 +1,14 @@ import 'package:flutter/material.dart'; +/// Class for presenting information about a use case to the user. class Info extends StatelessWidget { + /// The title of the use case. String title; + + /// The description of the use case. String description; + /// Creates an instance of [Info]. Info(this.title, this.description); @override diff --git a/demo/lib/demo/preview.dart b/demo/lib/demo/preview.dart index 171b5a5..1e03f17 100644 --- a/demo/lib/demo/preview.dart +++ b/demo/lib/demo/preview.dart @@ -1,8 +1,11 @@ import 'package:flutter/cupertino.dart'; +/// Class for showing a preview of the given use case as an actual widget. class Preview extends StatelessWidget { + /// The preview widget that is shown within the preview area. Widget preview; + /// Creates an instance of [Preview]. Preview(this.preview); @override From fab586023deac1d220bfa16aa9746dd89775fa3d Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sat, 27 Jun 2020 16:54:16 +0200 Subject: [PATCH 17/47] Documentation of main + name refactoring --- demo/lib/main.dart | 10 ++++++---- demo/test/widget_test.dart | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/demo/lib/main.dart b/demo/lib/main.dart index 4ff49a3..02deac9 100644 --- a/demo/lib/main.dart +++ b/demo/lib/main.dart @@ -4,20 +4,22 @@ import 'package:demo/demo/demo_page.dart'; import 'package:demo/theme_data.dart'; import 'package:flutter/material.dart'; -void main() => runApp(MyApp()); +void main() => runApp(DemoApp()); -class MyApp extends StatelessWidget { +/// Demo app that provides a show-case of different backdrop use cases. +class DemoApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: "Backdrop Gallery", theme: GalleryThemeData.darkThemeData, - home: MyHomePage(), + home: HomePage(), ); } } -class MyHomePage extends StatelessWidget { +/// The home page of the demo app showing a selection of use cases. +class HomePage extends StatelessWidget { List _useCases = [NavigationUseCase()]; @override diff --git a/demo/test/widget_test.dart b/demo/test/widget_test.dart index 64db941..ba39bc6 100644 --- a/demo/test/widget_test.dart +++ b/demo/test/widget_test.dart @@ -13,7 +13,7 @@ import 'package:demo/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); + await tester.pumpWidget(DemoApp()); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget); From f31659639306ba0fc3f40ef1dace34f73b3d55b1 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sun, 28 Jun 2020 11:18:11 +0200 Subject: [PATCH 18/47] Documented + adapted navigation use case --- demo/lib/data/use_cases/navigation/navigation.dart | 6 +----- demo/lib/data/use_cases/navigation/navigation_use_case.dart | 1 + 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/demo/lib/data/use_cases/navigation/navigation.dart b/demo/lib/data/use_cases/navigation/navigation.dart index 439cca3..79bf844 100644 --- a/demo/lib/data/use_cases/navigation/navigation.dart +++ b/demo/lib/data/use_cases/navigation/navigation.dart @@ -1,6 +1,7 @@ import 'package:backdrop/backdrop.dart'; import 'package:flutter/material.dart'; +/// Navigation preview app. class Navigation extends StatefulWidget { @override _NavigationState createState() => _NavigationState(); @@ -18,11 +19,6 @@ class _NavigationState extends State { home: BackdropScaffold( appBar: BackdropAppBar( title: Text("Navigation Example"), - actions: [ - BackdropToggleButton( - icon: AnimatedIcons.list_view, - ) - ], ), stickyFrontLayer: true, frontLayer: _pages[_currentIndex], diff --git a/demo/lib/data/use_cases/navigation/navigation_use_case.dart b/demo/lib/data/use_cases/navigation/navigation_use_case.dart index 24340ea..ee01809 100644 --- a/demo/lib/data/use_cases/navigation/navigation_use_case.dart +++ b/demo/lib/data/use_cases/navigation/navigation_use_case.dart @@ -1,6 +1,7 @@ import 'package:demo/data/use_case.dart'; import 'package:demo/data/use_cases/navigation/navigation.dart'; +/// Navigation use case description. class NavigationUseCase extends UseCase { /// Creates a Navigation use case instance NavigationUseCase() { From 34a9375e4789023d9c4168117cadf76db318ed4b Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sun, 28 Jun 2020 11:18:31 +0200 Subject: [PATCH 19/47] Added contextual info + contextual controls use cases --- .../contextual_controls.dart | 27 +++++++++++++++++++ .../contextual_controls_use_case.dart | 15 +++++++++++ .../contextual_info/contextual_info.dart | 27 +++++++++++++++++++ .../contextual_info_use_case.dart | 15 +++++++++++ demo/lib/main.dart | 9 ++++++- demo/pubspec.yaml | 2 ++ 6 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 demo/lib/data/use_cases/contextual_controls/contextual_controls.dart create mode 100644 demo/lib/data/use_cases/contextual_controls/contextual_controls_use_case.dart create mode 100644 demo/lib/data/use_cases/contextual_info/contextual_info.dart create mode 100644 demo/lib/data/use_cases/contextual_info/contextual_info_use_case.dart diff --git a/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart b/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart new file mode 100644 index 0000000..391acab --- /dev/null +++ b/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart @@ -0,0 +1,27 @@ +import 'package:backdrop/backdrop.dart'; +import 'package:flutter/material.dart'; + +/// Contextual controls preview app. +class ContextualControls extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Contextual Controls', + debugShowCheckedModeBanner: false, + home: BackdropScaffold( + appBar: BackdropAppBar( + title: Text("Contextual Controls Example"), + ), + backLayer: Center( + child: Text("Back Layer"), + ), + subHeader: BackdropSubHeader( + title: Text("Sub Header"), + ), + frontLayer: Center( + child: Text("Contextual Controls"), + ), + ), + ); + } +} diff --git a/demo/lib/data/use_cases/contextual_controls/contextual_controls_use_case.dart b/demo/lib/data/use_cases/contextual_controls/contextual_controls_use_case.dart new file mode 100644 index 0000000..03e8e06 --- /dev/null +++ b/demo/lib/data/use_cases/contextual_controls/contextual_controls_use_case.dart @@ -0,0 +1,15 @@ +import 'package:demo/data/use_case.dart'; +import 'package:demo/data/use_cases/contextual_controls/contextual_controls.dart'; + +/// Contextual controls use case description. +class ContextualControlsUseCase extends UseCase { + /// Creates a ContextualControls use case instance + ContextualControlsUseCase() { + name = "Contextual Controls"; + description = + "The backdrop's back layer can be used to control the content that is being " + "shown on the front layer"; + codeFile = "lib/data/use_cases/contextual_controls/contextual_controls.dart"; + preview = ContextualControls(); + } +} diff --git a/demo/lib/data/use_cases/contextual_info/contextual_info.dart b/demo/lib/data/use_cases/contextual_info/contextual_info.dart new file mode 100644 index 0000000..2960bc0 --- /dev/null +++ b/demo/lib/data/use_cases/contextual_info/contextual_info.dart @@ -0,0 +1,27 @@ +import 'package:backdrop/backdrop.dart'; +import 'package:flutter/material.dart'; + +/// Contextual info preview app. +class ContextualInfo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Contextual Info', + debugShowCheckedModeBanner: false, + home: BackdropScaffold( + appBar: BackdropAppBar( + title: Text("Contextual Info Example"), + ), + backLayer: Center( + child: Text("Back Layer"), + ), + subHeader: BackdropSubHeader( + title: Text("Sub Header"), + ), + frontLayer: Center( + child: Text("Contextual Info"), + ), + ), + ); + } +} diff --git a/demo/lib/data/use_cases/contextual_info/contextual_info_use_case.dart b/demo/lib/data/use_cases/contextual_info/contextual_info_use_case.dart new file mode 100644 index 0000000..93c549a --- /dev/null +++ b/demo/lib/data/use_cases/contextual_info/contextual_info_use_case.dart @@ -0,0 +1,15 @@ +import 'package:demo/data/use_case.dart'; +import 'package:demo/data/use_cases/contextual_info/contextual_info.dart'; + +/// Contextual info use case description. +class ContextualInfoUseCase extends UseCase { + /// Creates a ContextualInfo use case instance + ContextualInfoUseCase() { + name = "Contextual Info"; + description = + "The backdrop's back layer can be used to show contextual information " + "in addition to the content shown on the front layer."; + codeFile = "lib/data/use_cases/contextual_info/contextual_info.dart"; + preview = ContextualInfo(); + } +} diff --git a/demo/lib/main.dart b/demo/lib/main.dart index 02deac9..c3676b1 100644 --- a/demo/lib/main.dart +++ b/demo/lib/main.dart @@ -1,9 +1,12 @@ import 'package:demo/data/use_case.dart'; +import 'package:demo/data/use_cases/contextual_controls/contextual_controls_use_case.dart'; import 'package:demo/data/use_cases/navigation/navigation_use_case.dart'; import 'package:demo/demo/demo_page.dart'; import 'package:demo/theme_data.dart'; import 'package:flutter/material.dart'; +import 'data/use_cases/contextual_info/contextual_info_use_case.dart'; + void main() => runApp(DemoApp()); /// Demo app that provides a show-case of different backdrop use cases. @@ -20,7 +23,11 @@ class DemoApp extends StatelessWidget { /// The home page of the demo app showing a selection of use cases. class HomePage extends StatelessWidget { - List _useCases = [NavigationUseCase()]; + List _useCases = [ + ContextualInfoUseCase(), + ContextualControlsUseCase(), + NavigationUseCase() + ]; @override Widget build(BuildContext context) { diff --git a/demo/pubspec.yaml b/demo/pubspec.yaml index ca903fb..d291437 100644 --- a/demo/pubspec.yaml +++ b/demo/pubspec.yaml @@ -50,6 +50,8 @@ flutter: # like this: assets: - lib/data/use_cases/navigation/navigation.dart + - lib/data/use_cases/contextual_info/contextual_info.dart + - lib/data/use_cases/contextual_controls/contextual_controls.dart # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. From 7640e63d459b86120aa11ab73c7df4acbbf7928c Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sun, 28 Jun 2020 11:26:15 +0200 Subject: [PATCH 20/47] Adapted code page --- demo/lib/demo/code.dart | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/demo/lib/demo/code.dart b/demo/lib/demo/code.dart index b5c76b2..3085aba 100644 --- a/demo/lib/demo/code.dart +++ b/demo/lib/demo/code.dart @@ -25,14 +25,16 @@ class _CodeState extends State { future: DefaultAssetBundle.of(context).loadString(widget.codeFile), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { - return SingleChildScrollView( - child: HighlightView( - snapshot.data, - language: "dart", - theme: draculaTheme, - padding: EdgeInsets.all(8.0), - textStyle: TextStyle( - fontSize: 11, + return SizedBox.expand( + child: SingleChildScrollView( + child: HighlightView( + snapshot.data, + language: "dart", + theme: draculaTheme, + padding: EdgeInsets.all(8.0), + textStyle: TextStyle( + fontSize: 11, + ), ), ), ); From 430113ada9c11388d605131b25e4e4a291a6e7e1 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sun, 28 Jun 2020 11:26:25 +0200 Subject: [PATCH 21/47] Added filter use case --- demo/lib/data/use_cases/filter/filter.dart | 27 +++++++++++++++++++ .../use_cases/filter/filter_use_case.dart | 15 +++++++++++ demo/lib/main.dart | 4 ++- demo/pubspec.yaml | 1 + 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 demo/lib/data/use_cases/filter/filter.dart create mode 100644 demo/lib/data/use_cases/filter/filter_use_case.dart diff --git a/demo/lib/data/use_cases/filter/filter.dart b/demo/lib/data/use_cases/filter/filter.dart new file mode 100644 index 0000000..2c1662c --- /dev/null +++ b/demo/lib/data/use_cases/filter/filter.dart @@ -0,0 +1,27 @@ +import 'package:backdrop/backdrop.dart'; +import 'package:flutter/material.dart'; + +/// Filter preview app. +class Filter extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Filter', + debugShowCheckedModeBanner: false, + home: BackdropScaffold( + appBar: BackdropAppBar( + title: Text("Filter Example"), + ), + backLayer: Center( + child: Text("Back Layer"), + ), + subHeader: BackdropSubHeader( + title: Text("Sub Header"), + ), + frontLayer: Center( + child: Text("Filter"), + ), + ), + ); + } +} diff --git a/demo/lib/data/use_cases/filter/filter_use_case.dart b/demo/lib/data/use_cases/filter/filter_use_case.dart new file mode 100644 index 0000000..104a426 --- /dev/null +++ b/demo/lib/data/use_cases/filter/filter_use_case.dart @@ -0,0 +1,15 @@ +import 'package:demo/data/use_case.dart'; +import 'package:demo/data/use_cases/filter/filter.dart'; + +/// Filter use case description. +class FilterUseCase extends UseCase { + /// Creates a Filter use case instance + FilterUseCase() { + name = "Filter"; + description = + "The backdrop's back layer can be used to filter the content displayed " + "on the front layer."; + codeFile = "lib/data/use_cases/filter/filter.dart"; + preview = Filter(); + } +} diff --git a/demo/lib/main.dart b/demo/lib/main.dart index c3676b1..ed6e973 100644 --- a/demo/lib/main.dart +++ b/demo/lib/main.dart @@ -1,5 +1,6 @@ import 'package:demo/data/use_case.dart'; import 'package:demo/data/use_cases/contextual_controls/contextual_controls_use_case.dart'; +import 'package:demo/data/use_cases/filter/filter_use_case.dart'; import 'package:demo/data/use_cases/navigation/navigation_use_case.dart'; import 'package:demo/demo/demo_page.dart'; import 'package:demo/theme_data.dart'; @@ -26,7 +27,8 @@ class HomePage extends StatelessWidget { List _useCases = [ ContextualInfoUseCase(), ContextualControlsUseCase(), - NavigationUseCase() + NavigationUseCase(), + FilterUseCase(), ]; @override diff --git a/demo/pubspec.yaml b/demo/pubspec.yaml index d291437..6f77dd5 100644 --- a/demo/pubspec.yaml +++ b/demo/pubspec.yaml @@ -52,6 +52,7 @@ flutter: - lib/data/use_cases/navigation/navigation.dart - lib/data/use_cases/contextual_info/contextual_info.dart - lib/data/use_cases/contextual_controls/contextual_controls.dart + - lib/data/use_cases/filter/filter.dart # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. From a07e41a91e9735ed3618998ca8fbb984fad1abee Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 30 Jun 2020 17:28:42 +0200 Subject: [PATCH 22/47] Finished contextual info use case --- .../contextual_info/contextual_info.dart | 184 +++++++++++++++++- 1 file changed, 174 insertions(+), 10 deletions(-) diff --git a/demo/lib/data/use_cases/contextual_info/contextual_info.dart b/demo/lib/data/use_cases/contextual_info/contextual_info.dart index 2960bc0..dcbe1fd 100644 --- a/demo/lib/data/use_cases/contextual_info/contextual_info.dart +++ b/demo/lib/data/use_cases/contextual_info/contextual_info.dart @@ -1,8 +1,23 @@ import 'package:backdrop/backdrop.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/painting.dart'; +import 'package:flutter/rendering.dart'; /// Contextual info preview app. -class ContextualInfo extends StatelessWidget { +class ContextualInfo extends StatefulWidget { + @override + _ContextualInfoState createState() => _ContextualInfoState(); +} + +class _ContextualInfoState extends State { + Widget _selectedProduct; + + @override + void initState() { + _selectedProduct = null; + super.initState(); + } + @override Widget build(BuildContext context) { return MaterialApp( @@ -11,17 +26,166 @@ class ContextualInfo extends StatelessWidget { home: BackdropScaffold( appBar: BackdropAppBar( title: Text("Contextual Info Example"), + automaticallyImplyLeading: false, ), - backLayer: Center( - child: Text("Back Layer"), - ), - subHeader: BackdropSubHeader( - title: Text("Sub Header"), - ), - frontLayer: Center( - child: Text("Contextual Info"), - ), + backLayer: _createBackLayer(), + frontLayer: _createFrontLayer(), + stickyFrontLayer: true, ), ); } + + Widget _createBackLayer() => ListView( + children: [ + ListTile( + leading: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Name", + ), + ], + ), + title: Text( + "Laptop Model X", + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + ListTile( + leading: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("Year of production"), + ], + ), + title: Text( + "2019", + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + ListTile( + leading: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("Place of Manufacture"), + ], + ), + title: Text( + "USA", + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + ListTile( + leading: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("Price"), + ], + ), + title: Text( + "\$999", + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + ], + shrinkWrap: true, + ); + + Widget _createFrontLayer() => Container( + margin: EdgeInsets.all(16.0), + child: Column( + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Icon( + Icons.computer, + size: 64.0, + ), + Text( + "Laptop", + style: Theme.of(context) + .textTheme + .headline3 + .apply(color: Colors.black), + ), + ], + ), + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Price", + style: TextStyle(color: Colors.grey), + ), + Container( + margin: EdgeInsets.all(8.0), + child: Text( + "\$999", + style: TextStyle(fontSize: 18), + ), + ), + ], + ), + Container( + margin: EdgeInsets.all(8.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Icon(Icons.star, color: Colors.grey), + Icon(Icons.star, color: Colors.grey), + Icon(Icons.star, color: Colors.grey), + Icon(Icons.star, color: Colors.grey), + Icon(Icons.star_half, color: Colors.grey), + ], + ), + Text( + "73 Reviews", + style: TextStyle(color: Colors.grey), + ) + ], + ), + ), + Container( + margin: EdgeInsets.all(16.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Builder( + builder: (context) => RaisedButton( + child: Text("More about this product"), + onPressed: () => Backdrop.of(context).fling(), + ), + ) + ], + ), + ), + ListTile( + title: Text("Reviews", + style: Theme.of(context) + .textTheme + .headline6 + .apply(color: Colors.black)), + ), + ListTile( + leading: Icon(Icons.account_box), + title: Text("Really satisfied!"), + subtitle: Text("John Doe"), + trailing: Text("5/5"), + ), + ListTile( + leading: Icon(Icons.account_box), + title: Text("Good price!"), + subtitle: Text("Jane Doe"), + trailing: Text("4.5/5"), + ) + ], + ), + ); } From b33071ade53eaa75a2fb3c07a2ba8743086bb780 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 30 Jun 2020 17:30:26 +0200 Subject: [PATCH 23/47] Removed not-needed variable from contextual info use case --- demo/lib/data/use_cases/contextual_info/contextual_info.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/demo/lib/data/use_cases/contextual_info/contextual_info.dart b/demo/lib/data/use_cases/contextual_info/contextual_info.dart index dcbe1fd..581d1e2 100644 --- a/demo/lib/data/use_cases/contextual_info/contextual_info.dart +++ b/demo/lib/data/use_cases/contextual_info/contextual_info.dart @@ -10,11 +10,9 @@ class ContextualInfo extends StatefulWidget { } class _ContextualInfoState extends State { - Widget _selectedProduct; @override void initState() { - _selectedProduct = null; super.initState(); } From 2267e98482cc8eac62c3c497e38a9d5da2fb3af4 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 30 Jun 2020 17:31:51 +0200 Subject: [PATCH 24/47] Changed contextual info widget back to stateless --- .../contextual_info/contextual_info.dart | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/demo/lib/data/use_cases/contextual_info/contextual_info.dart b/demo/lib/data/use_cases/contextual_info/contextual_info.dart index 581d1e2..9a35030 100644 --- a/demo/lib/data/use_cases/contextual_info/contextual_info.dart +++ b/demo/lib/data/use_cases/contextual_info/contextual_info.dart @@ -4,18 +4,7 @@ import 'package:flutter/painting.dart'; import 'package:flutter/rendering.dart'; /// Contextual info preview app. -class ContextualInfo extends StatefulWidget { - @override - _ContextualInfoState createState() => _ContextualInfoState(); -} - -class _ContextualInfoState extends State { - - @override - void initState() { - super.initState(); - } - +class ContextualInfo extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( @@ -26,14 +15,14 @@ class _ContextualInfoState extends State { title: Text("Contextual Info Example"), automaticallyImplyLeading: false, ), - backLayer: _createBackLayer(), - frontLayer: _createFrontLayer(), + backLayer: _createBackLayer(context), + frontLayer: _createFrontLayer(context), stickyFrontLayer: true, ), ); } - Widget _createBackLayer() => ListView( + Widget _createBackLayer(BuildContext context) => ListView( children: [ ListTile( leading: Column( @@ -89,7 +78,7 @@ class _ContextualInfoState extends State { shrinkWrap: true, ); - Widget _createFrontLayer() => Container( + Widget _createFrontLayer(BuildContext context) => Container( margin: EdgeInsets.all(16.0), child: Column( children: [ From 6bbc3c086cbc741aaf237d6c8ba2255818d4d148 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 30 Jun 2020 18:01:43 +0200 Subject: [PATCH 25/47] Created basic layout of contextual controls use case --- .../contextual_controls.dart | 197 +++++++++++++++++- 1 file changed, 187 insertions(+), 10 deletions(-) diff --git a/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart b/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart index 391acab..c73f014 100644 --- a/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart +++ b/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart @@ -2,7 +2,25 @@ import 'package:backdrop/backdrop.dart'; import 'package:flutter/material.dart'; /// Contextual controls preview app. -class ContextualControls extends StatelessWidget { +class ContextualControls extends StatefulWidget { + @override + _ContextualControlsState createState() => _ContextualControlsState(); +} + +class _ContextualControlsState extends State { + static const _COLOR_CHOICES = [ + Colors.black, + Colors.red, + Colors.green, + Colors.blue + ]; + static const _RESOLUTION_CHOICES = [13, 14, 15, 17]; + static const _RAM_CHOICES = [4, 8, 16]; + + Color _color = _COLOR_CHOICES.first; + int _resolution = _RESOLUTION_CHOICES.first; + int _ram = _RAM_CHOICES.first; + @override Widget build(BuildContext context) { return MaterialApp( @@ -11,17 +29,176 @@ class ContextualControls extends StatelessWidget { home: BackdropScaffold( appBar: BackdropAppBar( title: Text("Contextual Controls Example"), + automaticallyImplyLeading: false, ), - backLayer: Center( - child: Text("Back Layer"), - ), - subHeader: BackdropSubHeader( - title: Text("Sub Header"), - ), - frontLayer: Center( - child: Text("Contextual Controls"), - ), + backLayer: _createBackLayer(context), + frontLayer: _createFrontLayer(context), + stickyFrontLayer: true, ), ); } + + Widget _createBackLayer(BuildContext context) => ListView( + children: [ + ListTile( + leading: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Color", + ), + ], + ), + title: Text( + "Laptop Model X", + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + ListTile( + leading: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("Resolution"), + ], + ), + title: Text( + "2019", + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + ListTile( + leading: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("RAM"), + ], + ), + title: Text( + "USA", + style: TextStyle(fontWeight: FontWeight.bold), + ), + ), + Builder( + builder: (context) => MaterialButton( + child: Text("Return to product page"), + onPressed: () => Backdrop.of(context).fling(), + )) + ], + shrinkWrap: true, + ); + + Widget _createFrontLayer(BuildContext context) => Container( + margin: EdgeInsets.all(16.0), + child: Column( + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Icon( + Icons.computer, + size: 64.0, + ), + Text( + "Laptop", + style: Theme.of(context) + .textTheme + .headline3 + .apply(color: Colors.black), + ), + ], + ), + Container( + margin: EdgeInsets.all(8.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Icon(Icons.star, color: Colors.grey), + Icon(Icons.star, color: Colors.grey), + Icon(Icons.star, color: Colors.grey), + Icon(Icons.star, color: Colors.grey), + Icon(Icons.star_half, color: Colors.grey), + ], + ), + Text( + "73 Reviews", + style: TextStyle(color: Colors.grey), + ) + ], + ), + ), + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Price", + style: TextStyle(color: Colors.grey), + ), + Container( + margin: EdgeInsets.all(8.0), + child: Text( + "\$999", + style: TextStyle(fontSize: 18), + ), + ), + ], + ), + Container( + margin: EdgeInsets.only( + top: 32.0, left: 8.0, right: 8.0, bottom: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisSize: MainAxisSize.max, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [Text("Resolution")], + ), + Text( + "${_resolution.toString()}\"", + style: TextStyle(fontWeight: FontWeight.bold), + ), + ], + ), + ), + Container( + margin: EdgeInsets.only( + top: 8.0, left: 8.0, right: 8.0, bottom: 32.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisSize: MainAxisSize.max, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [Text("RAM")], + ), + Text( + "${_ram.toString()} GB", + style: TextStyle(fontWeight: FontWeight.bold), + ), + ], + ), + ), + Container( + margin: EdgeInsets.all(16.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Builder( + builder: (context) => RaisedButton( + child: Text("Configure"), + onPressed: () => Backdrop.of(context).fling(), + ), + ) + ], + ), + ), + ], + ), + ); } From ffb1108572d3889a102a9e730a2c354b5f5b6945 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sat, 4 Jul 2020 14:58:49 +0200 Subject: [PATCH 26/47] Slider contextual control works --- .../contextual_controls.dart | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart b/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart index c73f014..f130bb1 100644 --- a/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart +++ b/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart @@ -14,11 +14,10 @@ class _ContextualControlsState extends State { Colors.green, Colors.blue ]; - static const _RESOLUTION_CHOICES = [13, 14, 15, 17]; static const _RAM_CHOICES = [4, 8, 16]; Color _color = _COLOR_CHOICES.first; - int _resolution = _RESOLUTION_CHOICES.first; + double _resolution = 15.0; int _ram = _RAM_CHOICES.first; @override @@ -55,17 +54,25 @@ class _ContextualControlsState extends State { ), ), ListTile( - leading: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text("Resolution"), - ], - ), - title: Text( - "2019", - style: TextStyle(fontWeight: FontWeight.bold), - ), - ), + leading: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("Resolution"), + ], + ), + title: Slider( + activeColor: Colors.white, + inactiveColor: Colors.lightBlue, + value: _resolution, + min: 14, + max: 17, + label: "$_resolution\"", + divisions: 3, + onChanged: (value) { + setState(() { + _resolution = value; + }); + })), ListTile( leading: Column( mainAxisAlignment: MainAxisAlignment.center, From 550893ff4327285e617d5898366cbfbaab9cfdf0 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sat, 4 Jul 2020 15:28:41 +0200 Subject: [PATCH 27/47] Color dropdown contextual control works --- .../contextual_controls.dart | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart b/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart index f130bb1..bef6a85 100644 --- a/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart +++ b/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart @@ -8,15 +8,15 @@ class ContextualControls extends StatefulWidget { } class _ContextualControlsState extends State { - static const _COLOR_CHOICES = [ - Colors.black, - Colors.red, - Colors.green, - Colors.blue - ]; + static final _COLOR_MAP = { + Colors.black: "Black", + Colors.red: "Red", + Colors.green: "Green", + Colors.blue: "Blue" + }; static const _RAM_CHOICES = [4, 8, 16]; - Color _color = _COLOR_CHOICES.first; + Color _color = _COLOR_MAP.keys.first; double _resolution = 15.0; int _ram = _RAM_CHOICES.first; @@ -48,9 +48,20 @@ class _ContextualControlsState extends State { ), ], ), - title: Text( - "Laptop Model X", - style: TextStyle(fontWeight: FontWeight.bold), + title: DropdownButton( + isExpanded: true, + value: _color, + items: _COLOR_MAP.keys.map>((Color c) { + return DropdownMenuItem( + value: c, + child: Text(_COLOR_MAP[c]), + ); + }).toList(), + onChanged: (Color newValue) { + setState(() { + _color = newValue; + }); + }, ), ), ListTile( @@ -105,6 +116,7 @@ class _ContextualControlsState extends State { Icon( Icons.computer, size: 64.0, + color: _color, ), Text( "Laptop", From 61f16764258a5fd321a4670272f2241e2c3b25b5 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Sat, 4 Jul 2020 15:31:17 +0200 Subject: [PATCH 28/47] RAM dropdown contextual control works + contextual controls finished --- .../contextual_controls.dart | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart b/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart index bef6a85..a0261e7 100644 --- a/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart +++ b/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart @@ -91,9 +91,20 @@ class _ContextualControlsState extends State { Text("RAM"), ], ), - title: Text( - "USA", - style: TextStyle(fontWeight: FontWeight.bold), + title: DropdownButton( + isExpanded: true, + value: _ram, + items: _RAM_CHOICES.map>((int r) { + return DropdownMenuItem( + value: r, + child: Text("${r.toString()} GB"), + ); + }).toList(), + onChanged: (int newValue) { + setState(() { + _ram = newValue; + }); + }, ), ), Builder( From cf7e0bce3f9227f5893f5314674a63ad9668f705 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Mon, 6 Jul 2020 16:20:29 +0200 Subject: [PATCH 29/47] Refactoring: own folder for use cases --- demo/lib/{ => data}/theme_data.dart | 0 demo/lib/main.dart | 11 +++++------ .../contextual_controls/contextual_controls.dart | 0 .../contextual_controls_use_case.dart | 5 +++-- .../use_cases/contextual_info/contextual_info.dart | 0 .../contextual_info/contextual_info_use_case.dart | 2 +- demo/lib/{data => }/use_cases/filter/filter.dart | 0 .../{data => }/use_cases/filter/filter_use_case.dart | 2 +- .../{data => }/use_cases/navigation/navigation.dart | 0 .../use_cases/navigation/navigation_use_case.dart | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) rename demo/lib/{ => data}/theme_data.dart (100%) rename demo/lib/{data => }/use_cases/contextual_controls/contextual_controls.dart (100%) rename demo/lib/{data => }/use_cases/contextual_controls/contextual_controls_use_case.dart (72%) rename demo/lib/{data => }/use_cases/contextual_info/contextual_info.dart (100%) rename demo/lib/{data => }/use_cases/contextual_info/contextual_info_use_case.dart (87%) rename demo/lib/{data => }/use_cases/filter/filter.dart (100%) rename demo/lib/{data => }/use_cases/filter/filter_use_case.dart (87%) rename demo/lib/{data => }/use_cases/navigation/navigation.dart (100%) rename demo/lib/{data => }/use_cases/navigation/navigation_use_case.dart (89%) diff --git a/demo/lib/theme_data.dart b/demo/lib/data/theme_data.dart similarity index 100% rename from demo/lib/theme_data.dart rename to demo/lib/data/theme_data.dart diff --git a/demo/lib/main.dart b/demo/lib/main.dart index ed6e973..326f0c8 100644 --- a/demo/lib/main.dart +++ b/demo/lib/main.dart @@ -1,13 +1,12 @@ +import 'package:demo/data/theme_data.dart'; import 'package:demo/data/use_case.dart'; -import 'package:demo/data/use_cases/contextual_controls/contextual_controls_use_case.dart'; -import 'package:demo/data/use_cases/filter/filter_use_case.dart'; -import 'package:demo/data/use_cases/navigation/navigation_use_case.dart'; import 'package:demo/demo/demo_page.dart'; -import 'package:demo/theme_data.dart'; +import 'package:demo/use_cases/contextual_controls/contextual_controls_use_case.dart'; +import 'package:demo/use_cases/contextual_info/contextual_info_use_case.dart'; +import 'package:demo/use_cases/filter/filter_use_case.dart'; +import 'package:demo/use_cases/navigation/navigation_use_case.dart'; import 'package:flutter/material.dart'; -import 'data/use_cases/contextual_info/contextual_info_use_case.dart'; - void main() => runApp(DemoApp()); /// Demo app that provides a show-case of different backdrop use cases. diff --git a/demo/lib/data/use_cases/contextual_controls/contextual_controls.dart b/demo/lib/use_cases/contextual_controls/contextual_controls.dart similarity index 100% rename from demo/lib/data/use_cases/contextual_controls/contextual_controls.dart rename to demo/lib/use_cases/contextual_controls/contextual_controls.dart diff --git a/demo/lib/data/use_cases/contextual_controls/contextual_controls_use_case.dart b/demo/lib/use_cases/contextual_controls/contextual_controls_use_case.dart similarity index 72% rename from demo/lib/data/use_cases/contextual_controls/contextual_controls_use_case.dart rename to demo/lib/use_cases/contextual_controls/contextual_controls_use_case.dart index 03e8e06..36f4107 100644 --- a/demo/lib/data/use_cases/contextual_controls/contextual_controls_use_case.dart +++ b/demo/lib/use_cases/contextual_controls/contextual_controls_use_case.dart @@ -1,5 +1,5 @@ import 'package:demo/data/use_case.dart'; -import 'package:demo/data/use_cases/contextual_controls/contextual_controls.dart'; +import 'package:demo/use_cases/contextual_controls/contextual_controls.dart'; /// Contextual controls use case description. class ContextualControlsUseCase extends UseCase { @@ -9,7 +9,8 @@ class ContextualControlsUseCase extends UseCase { description = "The backdrop's back layer can be used to control the content that is being " "shown on the front layer"; - codeFile = "lib/data/use_cases/contextual_controls/contextual_controls.dart"; + codeFile = + "lib/data/use_cases/contextual_controls/contextual_controls.dart"; preview = ContextualControls(); } } diff --git a/demo/lib/data/use_cases/contextual_info/contextual_info.dart b/demo/lib/use_cases/contextual_info/contextual_info.dart similarity index 100% rename from demo/lib/data/use_cases/contextual_info/contextual_info.dart rename to demo/lib/use_cases/contextual_info/contextual_info.dart diff --git a/demo/lib/data/use_cases/contextual_info/contextual_info_use_case.dart b/demo/lib/use_cases/contextual_info/contextual_info_use_case.dart similarity index 87% rename from demo/lib/data/use_cases/contextual_info/contextual_info_use_case.dart rename to demo/lib/use_cases/contextual_info/contextual_info_use_case.dart index 93c549a..8d91ad4 100644 --- a/demo/lib/data/use_cases/contextual_info/contextual_info_use_case.dart +++ b/demo/lib/use_cases/contextual_info/contextual_info_use_case.dart @@ -1,5 +1,5 @@ import 'package:demo/data/use_case.dart'; -import 'package:demo/data/use_cases/contextual_info/contextual_info.dart'; +import 'package:demo/use_cases/contextual_info/contextual_info.dart'; /// Contextual info use case description. class ContextualInfoUseCase extends UseCase { diff --git a/demo/lib/data/use_cases/filter/filter.dart b/demo/lib/use_cases/filter/filter.dart similarity index 100% rename from demo/lib/data/use_cases/filter/filter.dart rename to demo/lib/use_cases/filter/filter.dart diff --git a/demo/lib/data/use_cases/filter/filter_use_case.dart b/demo/lib/use_cases/filter/filter_use_case.dart similarity index 87% rename from demo/lib/data/use_cases/filter/filter_use_case.dart rename to demo/lib/use_cases/filter/filter_use_case.dart index 104a426..08f32f0 100644 --- a/demo/lib/data/use_cases/filter/filter_use_case.dart +++ b/demo/lib/use_cases/filter/filter_use_case.dart @@ -1,5 +1,5 @@ import 'package:demo/data/use_case.dart'; -import 'package:demo/data/use_cases/filter/filter.dart'; +import 'package:demo/use_cases/filter/filter.dart'; /// Filter use case description. class FilterUseCase extends UseCase { diff --git a/demo/lib/data/use_cases/navigation/navigation.dart b/demo/lib/use_cases/navigation/navigation.dart similarity index 100% rename from demo/lib/data/use_cases/navigation/navigation.dart rename to demo/lib/use_cases/navigation/navigation.dart diff --git a/demo/lib/data/use_cases/navigation/navigation_use_case.dart b/demo/lib/use_cases/navigation/navigation_use_case.dart similarity index 89% rename from demo/lib/data/use_cases/navigation/navigation_use_case.dart rename to demo/lib/use_cases/navigation/navigation_use_case.dart index ee01809..5c0fcf6 100644 --- a/demo/lib/data/use_cases/navigation/navigation_use_case.dart +++ b/demo/lib/use_cases/navigation/navigation_use_case.dart @@ -1,5 +1,5 @@ import 'package:demo/data/use_case.dart'; -import 'package:demo/data/use_cases/navigation/navigation.dart'; +import 'package:demo/use_cases/navigation/navigation.dart'; /// Navigation use case description. class NavigationUseCase extends UseCase { From 6d32c32a10bbcb654a92d929f773492095c60732 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Mon, 6 Jul 2020 16:21:49 +0200 Subject: [PATCH 30/47] Refactoring: own folder for use cases - part 2 --- demo/pubspec.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/pubspec.yaml b/demo/pubspec.yaml index 6f77dd5..cb2dbbe 100644 --- a/demo/pubspec.yaml +++ b/demo/pubspec.yaml @@ -49,10 +49,10 @@ flutter: # To add Flutter specific assets to your application, add an assets section, # like this: assets: - - lib/data/use_cases/navigation/navigation.dart - - lib/data/use_cases/contextual_info/contextual_info.dart - - lib/data/use_cases/contextual_controls/contextual_controls.dart - - lib/data/use_cases/filter/filter.dart + - lib/use_cases/navigation/navigation.dart + - lib/use_cases/contextual_info/contextual_info.dart + - lib/use_cases/contextual_controls/contextual_controls.dart + - lib/use_cases/filter/filter.dart # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. From 2fe3ce02a0e62fd03145f0e590a67c544cecb22a Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Mon, 6 Jul 2020 16:23:34 +0200 Subject: [PATCH 31/47] Updated use cases code path URIs --- .../contextual_controls/contextual_controls_use_case.dart | 2 +- .../lib/use_cases/contextual_info/contextual_info_use_case.dart | 2 +- demo/lib/use_cases/filter/filter_use_case.dart | 2 +- demo/lib/use_cases/navigation/navigation_use_case.dart | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/lib/use_cases/contextual_controls/contextual_controls_use_case.dart b/demo/lib/use_cases/contextual_controls/contextual_controls_use_case.dart index 36f4107..2e60c3e 100644 --- a/demo/lib/use_cases/contextual_controls/contextual_controls_use_case.dart +++ b/demo/lib/use_cases/contextual_controls/contextual_controls_use_case.dart @@ -10,7 +10,7 @@ class ContextualControlsUseCase extends UseCase { "The backdrop's back layer can be used to control the content that is being " "shown on the front layer"; codeFile = - "lib/data/use_cases/contextual_controls/contextual_controls.dart"; + "lib/use_cases/contextual_controls/contextual_controls.dart"; preview = ContextualControls(); } } diff --git a/demo/lib/use_cases/contextual_info/contextual_info_use_case.dart b/demo/lib/use_cases/contextual_info/contextual_info_use_case.dart index 8d91ad4..0bdadd2 100644 --- a/demo/lib/use_cases/contextual_info/contextual_info_use_case.dart +++ b/demo/lib/use_cases/contextual_info/contextual_info_use_case.dart @@ -9,7 +9,7 @@ class ContextualInfoUseCase extends UseCase { description = "The backdrop's back layer can be used to show contextual information " "in addition to the content shown on the front layer."; - codeFile = "lib/data/use_cases/contextual_info/contextual_info.dart"; + codeFile = "lib/use_cases/contextual_info/contextual_info.dart"; preview = ContextualInfo(); } } diff --git a/demo/lib/use_cases/filter/filter_use_case.dart b/demo/lib/use_cases/filter/filter_use_case.dart index 08f32f0..d8668ad 100644 --- a/demo/lib/use_cases/filter/filter_use_case.dart +++ b/demo/lib/use_cases/filter/filter_use_case.dart @@ -9,7 +9,7 @@ class FilterUseCase extends UseCase { description = "The backdrop's back layer can be used to filter the content displayed " "on the front layer."; - codeFile = "lib/data/use_cases/filter/filter.dart"; + codeFile = "lib/use_cases/filter/filter.dart"; preview = Filter(); } } diff --git a/demo/lib/use_cases/navigation/navigation_use_case.dart b/demo/lib/use_cases/navigation/navigation_use_case.dart index 5c0fcf6..a3f785d 100644 --- a/demo/lib/use_cases/navigation/navigation_use_case.dart +++ b/demo/lib/use_cases/navigation/navigation_use_case.dart @@ -10,7 +10,7 @@ class NavigationUseCase extends UseCase { "Backdrop can be used for navigating between different front layers. " "The back layer shows the navigation options and upon selecting any " "one, the front layer changes its content."; - codeFile = "lib/data/use_cases/navigation/navigation.dart"; + codeFile = "lib/use_cases/navigation/navigation.dart"; preview = Navigation(); } } From d597b38361d5492a8f4c872d3a7b1f955654a8eb Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Mon, 6 Jul 2020 17:14:56 +0200 Subject: [PATCH 32/47] Basic functionality of filter use case works --- demo/lib/use_cases/filter/filter.dart | 95 +++++++++++++++++++++++++-- 1 file changed, 89 insertions(+), 6 deletions(-) diff --git a/demo/lib/use_cases/filter/filter.dart b/demo/lib/use_cases/filter/filter.dart index 2c1662c..95b2830 100644 --- a/demo/lib/use_cases/filter/filter.dart +++ b/demo/lib/use_cases/filter/filter.dart @@ -2,7 +2,32 @@ import 'package:backdrop/backdrop.dart'; import 'package:flutter/material.dart'; /// Filter preview app. -class Filter extends StatelessWidget { +class Filter extends StatefulWidget { + @override + _FilterState createState() => _FilterState(); +} + +class _FilterState extends State { + static const List _CATEGORIES = [ + ItemCategory.Electronics, + ItemCategory.Transportation + ]; + static const List _ITEMS = [ + Item(Icons.computer, "Laptop", ItemCategory.Electronics), + Item(Icons.child_friendly, "Stroller", ItemCategory.Transportation), + Item(Icons.tv, "TV", ItemCategory.Electronics), + Item(Icons.directions_car, "Car", ItemCategory.Transportation), + ]; + Set _filteredCategories = + Set.from([ItemCategory.Electronics, ItemCategory.Transportation]); + List _shownItems; + + @override + void initState() { + _filterItems(); + super.initState(); + } + @override Widget build(BuildContext context) { return MaterialApp( @@ -12,16 +37,74 @@ class Filter extends StatelessWidget { appBar: BackdropAppBar( title: Text("Filter Example"), ), - backLayer: Center( - child: Text("Back Layer"), + backLayer: ListView.builder( + itemCount: _CATEGORIES.length, + itemBuilder: (context, index) => CheckboxListTile( + onChanged: (bool checked) => + _addOrRemoveFilterCategory(checked, _CATEGORIES[index]), + value: _filteredCategories.contains(_CATEGORIES[index]), + title: Text(_CATEGORIES[index].toString()), + ), + shrinkWrap: true, ), subHeader: BackdropSubHeader( - title: Text("Sub Header"), + title: Text("${_shownItems.length} Items"), ), - frontLayer: Center( - child: Text("Filter"), + frontLayer: ListView.builder( + itemCount: _shownItems.length, + itemBuilder: (context, index) => ListTile( + leading: Icon(_shownItems[index].icon), + title: Text(_shownItems[index].name), + ), + shrinkWrap: true, ), ), ); } + + void _filterItems() { + setState(() { + _shownItems = _ITEMS + .where((element) => _filteredCategories.contains(element.category)) + .toList(); + }); + } + + void _addOrRemoveFilterCategory(bool checked, ItemCategory category) { + if (checked) { + setState(() { + _filteredCategories.add(category); + }); + } else { + setState(() { + _filteredCategories.remove(category); + }); + } + + _filterItems(); + } +} + +/// Enum defining the different item categories we have. +enum ItemCategory { + /// Electronics item category. + Electronics, + + /// Transportation item category. + Transportation +} + +/// Class representing an online shop item. +class Item { + /// The icon (photo) of the item. + final IconData icon; + + /// The name of the item. + final String name; + + /// The category the item belongs to. + final ItemCategory category; + + /// Creates an instance of Item with the given attributes. + const Item(this.icon, this.name, this.category); } From d9aeb9be850b75985adaa4236ea7a7a061e84241 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Mon, 6 Jul 2020 18:39:46 +0200 Subject: [PATCH 33/47] Added more items + improved filter use case --- demo/lib/use_cases/filter/filter.dart | 33 +++++++++++++++++++-------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/demo/lib/use_cases/filter/filter.dart b/demo/lib/use_cases/filter/filter.dart index 95b2830..69cad90 100644 --- a/demo/lib/use_cases/filter/filter.dart +++ b/demo/lib/use_cases/filter/filter.dart @@ -1,4 +1,5 @@ import 'package:backdrop/backdrop.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; /// Filter preview app. @@ -16,7 +17,9 @@ class _FilterState extends State { Item(Icons.computer, "Laptop", ItemCategory.Electronics), Item(Icons.child_friendly, "Stroller", ItemCategory.Transportation), Item(Icons.tv, "TV", ItemCategory.Electronics), + Item(Icons.smartphone, "Smartphone", ItemCategory.Electronics), Item(Icons.directions_car, "Car", ItemCategory.Transportation), + Item(Icons.motorcycle, "Motorcycle", ItemCategory.Transportation), ]; Set _filteredCategories = Set.from([ItemCategory.Electronics, ItemCategory.Transportation]); @@ -37,15 +40,27 @@ class _FilterState extends State { appBar: BackdropAppBar( title: Text("Filter Example"), ), - backLayer: ListView.builder( - itemCount: _CATEGORIES.length, - itemBuilder: (context, index) => CheckboxListTile( - onChanged: (bool checked) => - _addOrRemoveFilterCategory(checked, _CATEGORIES[index]), - value: _filteredCategories.contains(_CATEGORIES[index]), - title: Text(_CATEGORIES[index].toString()), - ), - shrinkWrap: true, + backLayer: Column( + children: [ + Container( + padding: EdgeInsets.all(16.0), + child: Text( + "Check/uncheck categories to show/hide them on the front layer", + ), + ), + ListView.builder( + itemCount: _CATEGORIES.length, + itemBuilder: (context, index) => CheckboxListTile( + onChanged: (bool checked) => + _addOrRemoveFilterCategory(checked, _CATEGORIES[index]), + value: _filteredCategories.contains(_CATEGORIES[index]), + title: Text(describeEnum(_CATEGORIES[index].toString())), + activeColor: Colors.white, + checkColor: Theme.of(context).primaryColor, + ), + shrinkWrap: true, + ), + ], ), subHeader: BackdropSubHeader( title: Text("${_shownItems.length} Items"), From 4324a46840c04a31ea4c2a72922d97197117ff3f Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Mon, 6 Jul 2020 20:45:02 +0200 Subject: [PATCH 34/47] Fixed toggle from front layer bug occurring in flutter beta --- lib/scaffold.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/scaffold.dart b/lib/scaffold.dart index 42d38d5..8927eea 100644 --- a/lib/scaffold.dart +++ b/lib/scaffold.dart @@ -261,6 +261,16 @@ class BackdropScaffoldState extends State _headerHeight = _getHeaderHeight(); }); }); + + _controller.addStatusListener((status) { + setState(() { + // This is intentionally left empty. The state change itself takes + // place inside the AnimationController, so there's nothing to update. + // All we want is for the widget to rebuild and read the new animation + // state from the AnimationController. + // see https://github.com/flutter/flutter/pull/55414/commits/72d7d365be6639271a5e88ee3043b92833facb79 + }); + }); } @override From 2ab1caa213a02fe5bcf5aca309364e797be638fa Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Mon, 6 Jul 2020 21:11:19 +0200 Subject: [PATCH 35/47] Filter use case: made front layer sticky --- demo/lib/use_cases/filter/filter.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/demo/lib/use_cases/filter/filter.dart b/demo/lib/use_cases/filter/filter.dart index 69cad90..15b5096 100644 --- a/demo/lib/use_cases/filter/filter.dart +++ b/demo/lib/use_cases/filter/filter.dart @@ -41,6 +41,7 @@ class _FilterState extends State { title: Text("Filter Example"), ), backLayer: Column( + mainAxisSize: MainAxisSize.min, children: [ Container( padding: EdgeInsets.all(16.0), @@ -73,6 +74,7 @@ class _FilterState extends State { ), shrinkWrap: true, ), + stickyFrontLayer: true, ), ); } From 4196914ec0eef6618049c74f3650be6462eba7af Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Mon, 6 Jul 2020 21:19:21 +0200 Subject: [PATCH 36/47] Improved navigation use case start page --- demo/lib/use_cases/navigation/navigation.dart | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/demo/lib/use_cases/navigation/navigation.dart b/demo/lib/use_cases/navigation/navigation.dart index 79bf844..da5571b 100644 --- a/demo/lib/use_cases/navigation/navigation.dart +++ b/demo/lib/use_cases/navigation/navigation.dart @@ -52,18 +52,26 @@ class _NavigationState extends State { class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - margin: EdgeInsets.all(16.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - "Welcome to the online shop!", - style: Theme.of(context).textTheme.headline6, + return Column( + children: [ + Center( + child: Container( + margin: EdgeInsets.all(16.0), + child: Text( + "Welcome to the online shop!", + style: Theme.of(context).textTheme.headline6, + textAlign: TextAlign.center, + ), ), - Text("Please navigate to the articles page to choose your product.") - ], - ), + ), + Container( + margin: EdgeInsets.all(16.0), + child: Text( + "Please navigate to the articles page to choose your product.", + textAlign: TextAlign.center, + ), + ), + ], ); } } From be0c01dccba0680c1b6771214d7e5736e589b524 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Mon, 6 Jul 2020 21:19:45 +0200 Subject: [PATCH 37/47] Improved demo-info page text margin --- demo/lib/demo/info.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/lib/demo/info.dart b/demo/lib/demo/info.dart index 9e3c822..65b1b43 100644 --- a/demo/lib/demo/info.dart +++ b/demo/lib/demo/info.dart @@ -26,7 +26,7 @@ class Info extends StatelessWidget { ), ), Container( - margin: EdgeInsets.symmetric(horizontal: 16.0), + margin: EdgeInsets.all(16.0), child: Text( description, textAlign: TextAlign.center, From 50d668d0d9d6733cbc46a0cf2d26ea2217b77070 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 7 Jul 2020 17:42:09 +0200 Subject: [PATCH 38/47] Navigation use case: renamed articles to products --- demo/lib/use_cases/navigation/navigation.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/demo/lib/use_cases/navigation/navigation.dart b/demo/lib/use_cases/navigation/navigation.dart index da5571b..b4a2a7e 100644 --- a/demo/lib/use_cases/navigation/navigation.dart +++ b/demo/lib/use_cases/navigation/navigation.dart @@ -9,7 +9,7 @@ class Navigation extends StatefulWidget { class _NavigationState extends State { int _currentIndex = 0; - final List _pages = [HomePage(), ArticlesPage()]; + final List _pages = [HomePage(), ItemsPage()]; @override Widget build(BuildContext context) { @@ -31,7 +31,7 @@ class _NavigationState extends State { )), ListTile( title: Text( - "Articles", + "Products", style: TextStyle(color: Colors.white), )), ], @@ -41,7 +41,7 @@ class _NavigationState extends State { subHeader: _currentIndex == 0 ? null // no subHeader for home-page : BackdropSubHeader( - title: Text("Our articles"), + title: Text("Our products"), ), ), ); @@ -67,7 +67,7 @@ class HomePage extends StatelessWidget { Container( margin: EdgeInsets.all(16.0), child: Text( - "Please navigate to the articles page to choose your product.", + "Please navigate to the products page to choose your product.", textAlign: TextAlign.center, ), ), @@ -76,8 +76,8 @@ class HomePage extends StatelessWidget { } } -/// Articles page showing the online shop's products. -class ArticlesPage extends StatelessWidget { +/// Items page showing the online shop's products. +class ItemsPage extends StatelessWidget { @override Widget build(BuildContext context) { return ListView( From 78c66dfb8664fd0abe569babe08b808e603f8cf8 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 7 Jul 2020 17:48:57 +0200 Subject: [PATCH 39/47] Outsourced creation of front-/back-layer to functions --- demo/lib/use_cases/filter/filter.dart | 66 ++++++++++--------- demo/lib/use_cases/navigation/navigation.dart | 34 +++++----- 2 files changed, 53 insertions(+), 47 deletions(-) diff --git a/demo/lib/use_cases/filter/filter.dart b/demo/lib/use_cases/filter/filter.dart index 15b5096..93d1cfc 100644 --- a/demo/lib/use_cases/filter/filter.dart +++ b/demo/lib/use_cases/filter/filter.dart @@ -40,45 +40,49 @@ class _FilterState extends State { appBar: BackdropAppBar( title: Text("Filter Example"), ), - backLayer: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - padding: EdgeInsets.all(16.0), - child: Text( - "Check/uncheck categories to show/hide them on the front layer", - ), - ), - ListView.builder( - itemCount: _CATEGORIES.length, - itemBuilder: (context, index) => CheckboxListTile( - onChanged: (bool checked) => - _addOrRemoveFilterCategory(checked, _CATEGORIES[index]), - value: _filteredCategories.contains(_CATEGORIES[index]), - title: Text(describeEnum(_CATEGORIES[index].toString())), - activeColor: Colors.white, - checkColor: Theme.of(context).primaryColor, - ), - shrinkWrap: true, - ), - ], - ), + backLayer: _createBackLayer(), subHeader: BackdropSubHeader( title: Text("${_shownItems.length} Items"), ), - frontLayer: ListView.builder( - itemCount: _shownItems.length, - itemBuilder: (context, index) => ListTile( - leading: Icon(_shownItems[index].icon), - title: Text(_shownItems[index].name), - ), - shrinkWrap: true, - ), + frontLayer: _createFrontLayer(context), stickyFrontLayer: true, ), ); } + Widget _createFrontLayer(BuildContext context) => ListView.builder( + itemCount: _shownItems.length, + itemBuilder: (context, index) => ListTile( + leading: Icon(_shownItems[index].icon), + title: Text(_shownItems[index].name), + ), + shrinkWrap: true, + ); + + Widget _createBackLayer() => Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.all(16.0), + child: Text( + "Check/uncheck categories to show/hide them on the front layer", + ), + ), + ListView.builder( + itemCount: _CATEGORIES.length, + itemBuilder: (context, index) => CheckboxListTile( + onChanged: (bool checked) => + _addOrRemoveFilterCategory(checked, _CATEGORIES[index]), + value: _filteredCategories.contains(_CATEGORIES[index]), + title: Text(describeEnum(_CATEGORIES[index].toString())), + activeColor: Colors.white, + checkColor: Theme.of(context).primaryColor, + ), + shrinkWrap: true, + ), + ], + ); + void _filterItems() { setState(() { _shownItems = _ITEMS diff --git a/demo/lib/use_cases/navigation/navigation.dart b/demo/lib/use_cases/navigation/navigation.dart index b4a2a7e..8bed32f 100644 --- a/demo/lib/use_cases/navigation/navigation.dart +++ b/demo/lib/use_cases/navigation/navigation.dart @@ -22,22 +22,7 @@ class _NavigationState extends State { ), stickyFrontLayer: true, frontLayer: _pages[_currentIndex], - backLayer: BackdropNavigationBackLayer( - items: [ - ListTile( - title: Text( - "Home", - style: TextStyle(color: Colors.white), - )), - ListTile( - title: Text( - "Products", - style: TextStyle(color: Colors.white), - )), - ], - onTap: (int position) => {setState(() => _currentIndex = position)}, - separator: Divider(), - ), + backLayer: _createBackLayer(), subHeader: _currentIndex == 0 ? null // no subHeader for home-page : BackdropSubHeader( @@ -46,6 +31,23 @@ class _NavigationState extends State { ), ); } + + Widget _createBackLayer() => BackdropNavigationBackLayer( + items: [ + ListTile( + title: Text( + "Home", + style: TextStyle(color: Colors.white), + )), + ListTile( + title: Text( + "Products", + style: TextStyle(color: Colors.white), + )), + ], + onTap: (int position) => {setState(() => _currentIndex = position)}, + separator: Divider(), + ); } /// Home page of the online shop. From dafd44a9313cd002554af66d7002d2d282a78457 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 7 Jul 2020 17:52:21 +0200 Subject: [PATCH 40/47] Small text correction --- .../contextual_controls/contextual_controls_use_case.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/lib/use_cases/contextual_controls/contextual_controls_use_case.dart b/demo/lib/use_cases/contextual_controls/contextual_controls_use_case.dart index 2e60c3e..0075df2 100644 --- a/demo/lib/use_cases/contextual_controls/contextual_controls_use_case.dart +++ b/demo/lib/use_cases/contextual_controls/contextual_controls_use_case.dart @@ -8,7 +8,7 @@ class ContextualControlsUseCase extends UseCase { name = "Contextual Controls"; description = "The backdrop's back layer can be used to control the content that is being " - "shown on the front layer"; + "shown on the front layer."; codeFile = "lib/use_cases/contextual_controls/contextual_controls.dart"; preview = ContextualControls(); From fff1f3f6a024c88a71e4c241f35037d6800f01fc Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 7 Jul 2020 18:07:44 +0200 Subject: [PATCH 41/47] Made demo widget fields final --- demo/lib/demo/code.dart | 2 +- demo/lib/demo/demo_page.dart | 2 +- demo/lib/demo/info.dart | 4 ++-- demo/lib/demo/preview.dart | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/demo/lib/demo/code.dart b/demo/lib/demo/code.dart index 3085aba..17bc31b 100644 --- a/demo/lib/demo/code.dart +++ b/demo/lib/demo/code.dart @@ -6,7 +6,7 @@ import 'package:flutter_highlight/themes/dracula.dart'; /// Class for presenting the source code of a given use case. class Code extends StatefulWidget { /// The path to the file to be read. - String codeFile; + final String codeFile; /// Creates an instance of [Code]. Code(this.codeFile); diff --git a/demo/lib/demo/demo_page.dart b/demo/lib/demo/demo_page.dart index 1abcdcf..5b55495 100644 --- a/demo/lib/demo/demo_page.dart +++ b/demo/lib/demo/demo_page.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; /// ween info, preview and source code pages concerning the given use case. class DemoPage extends StatefulWidget { /// The use case to be presented to the user. - UseCase useCase; + final UseCase useCase; /// Creates an instance of [DemoPage]. DemoPage(this.useCase); diff --git a/demo/lib/demo/info.dart b/demo/lib/demo/info.dart index 65b1b43..b3b9700 100644 --- a/demo/lib/demo/info.dart +++ b/demo/lib/demo/info.dart @@ -3,10 +3,10 @@ import 'package:flutter/material.dart'; /// Class for presenting information about a use case to the user. class Info extends StatelessWidget { /// The title of the use case. - String title; + final String title; /// The description of the use case. - String description; + final String description; /// Creates an instance of [Info]. Info(this.title, this.description); diff --git a/demo/lib/demo/preview.dart b/demo/lib/demo/preview.dart index 1e03f17..6b07a34 100644 --- a/demo/lib/demo/preview.dart +++ b/demo/lib/demo/preview.dart @@ -3,7 +3,7 @@ import 'package:flutter/cupertino.dart'; /// Class for showing a preview of the given use case as an actual widget. class Preview extends StatelessWidget { /// The preview widget that is shown within the preview area. - Widget preview; + final Widget preview; /// Creates an instance of [Preview]. Preview(this.preview); From a355598b45c9c6ddd623c4d35bdc602046ddfa1d Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 7 Jul 2020 18:30:00 +0200 Subject: [PATCH 42/47] Adapted use cases to be only Scaffold instead of MaterialApp --- .../contextual_controls.dart | 7 +++-- .../contextual_info/contextual_info.dart | 7 +++-- demo/lib/use_cases/filter/filter.dart | 7 +++-- demo/lib/use_cases/navigation/navigation.dart | 27 +++++++++---------- 4 files changed, 21 insertions(+), 27 deletions(-) diff --git a/demo/lib/use_cases/contextual_controls/contextual_controls.dart b/demo/lib/use_cases/contextual_controls/contextual_controls.dart index a0261e7..f4bec5f 100644 --- a/demo/lib/use_cases/contextual_controls/contextual_controls.dart +++ b/demo/lib/use_cases/contextual_controls/contextual_controls.dart @@ -22,10 +22,9 @@ class _ContextualControlsState extends State { @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Contextual Controls', - debugShowCheckedModeBanner: false, - home: BackdropScaffold( + return Theme( + data: ThemeData.light(), + child: BackdropScaffold( appBar: BackdropAppBar( title: Text("Contextual Controls Example"), automaticallyImplyLeading: false, diff --git a/demo/lib/use_cases/contextual_info/contextual_info.dart b/demo/lib/use_cases/contextual_info/contextual_info.dart index 9a35030..339e391 100644 --- a/demo/lib/use_cases/contextual_info/contextual_info.dart +++ b/demo/lib/use_cases/contextual_info/contextual_info.dart @@ -7,10 +7,9 @@ import 'package:flutter/rendering.dart'; class ContextualInfo extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Contextual Info', - debugShowCheckedModeBanner: false, - home: BackdropScaffold( + return Theme( + data: ThemeData.light(), + child: BackdropScaffold( appBar: BackdropAppBar( title: Text("Contextual Info Example"), automaticallyImplyLeading: false, diff --git a/demo/lib/use_cases/filter/filter.dart b/demo/lib/use_cases/filter/filter.dart index 93d1cfc..053f988 100644 --- a/demo/lib/use_cases/filter/filter.dart +++ b/demo/lib/use_cases/filter/filter.dart @@ -33,10 +33,9 @@ class _FilterState extends State { @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Filter', - debugShowCheckedModeBanner: false, - home: BackdropScaffold( + return Theme( + data: ThemeData.light(), + child: BackdropScaffold( appBar: BackdropAppBar( title: Text("Filter Example"), ), diff --git a/demo/lib/use_cases/navigation/navigation.dart b/demo/lib/use_cases/navigation/navigation.dart index 8bed32f..3e913df 100644 --- a/demo/lib/use_cases/navigation/navigation.dart +++ b/demo/lib/use_cases/navigation/navigation.dart @@ -13,10 +13,9 @@ class _NavigationState extends State { @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Navigation', - debugShowCheckedModeBanner: false, - home: BackdropScaffold( + return Theme( + data: ThemeData.light(), + child: BackdropScaffold( appBar: BackdropAppBar( title: Text("Navigation Example"), ), @@ -33,21 +32,19 @@ class _NavigationState extends State { } Widget _createBackLayer() => BackdropNavigationBackLayer( - items: [ - ListTile( - title: Text( + items: [ + ListTile( + title: Text( "Home", - style: TextStyle(color: Colors.white), )), - ListTile( - title: Text( + ListTile( + title: Text( "Products", - style: TextStyle(color: Colors.white), )), - ], - onTap: (int position) => {setState(() => _currentIndex = position)}, - separator: Divider(), - ); + ], + onTap: (int position) => {setState(() => _currentIndex = position)}, + separator: Divider(), + ); } /// Home page of the online shop. From 99fa952cf353a161a78564796afd7f179949a429 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 7 Jul 2020 18:35:34 +0200 Subject: [PATCH 43/47] Forward automaticallyImplyLeading property in BackdropAppBar --- lib/app_bar.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/app_bar.dart b/lib/app_bar.dart index b4e8fd3..9aba031 100644 --- a/lib/app_bar.dart +++ b/lib/app_bar.dart @@ -162,6 +162,7 @@ class BackdropAppBar extends StatelessWidget implements PreferredSizeWidget { return AppBar( leading: leading ?? (automaticallyImplyLeading ? BackdropToggleButton() : null), + automaticallyImplyLeading: automaticallyImplyLeading, title: title, actions: actions, flexibleSpace: flexibleSpace, From 7895996c460b420899eaa68cddf5a3228849af24 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 7 Jul 2020 18:45:47 +0200 Subject: [PATCH 44/47] Increased code font size + line height --- demo/lib/demo/code.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/demo/lib/demo/code.dart b/demo/lib/demo/code.dart index 17bc31b..9066299 100644 --- a/demo/lib/demo/code.dart +++ b/demo/lib/demo/code.dart @@ -32,9 +32,7 @@ class _CodeState extends State { language: "dart", theme: draculaTheme, padding: EdgeInsets.all(8.0), - textStyle: TextStyle( - fontSize: 11, - ), + textStyle: TextStyle(fontSize: 12, height: 1.3), ), ), ); From 087869ec8d950fd725e11d61cfc0dddba491bbab Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Tue, 7 Jul 2020 23:24:38 +0200 Subject: [PATCH 45/47] Refactored project structure from flutter module to app + added icons --- demo/.gitignore | 66 ++- demo/.metadata | 6 +- demo/README.md | 12 +- demo/android/.gitignore | 11 + demo/android/app/build.gradle | 63 +++ .../android/app/src/debug/AndroidManifest.xml | 7 + demo/android/app/src/main/AndroidManifest.xml | 47 ++ .../kotlin/com/example/demo/MainActivity.kt | 6 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 719 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 524 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 830 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1184 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1430 bytes .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + demo/android/build.gradle | 31 ++ demo/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + demo/android/settings.gradle | 15 + demo/assets/icon.png | Bin 0 -> 4958 bytes demo/ios/.gitignore | 32 ++ demo/ios/Flutter/AppFrameworkInfo.plist | 26 + demo/ios/Flutter/Debug.xcconfig | 1 + demo/ios/Flutter/Release.xcconfig | 1 + demo/ios/Runner.xcodeproj/project.pbxproj | 495 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 ++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + demo/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 14311 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 311 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 469 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 554 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 381 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 570 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 788 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 469 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 748 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 984 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 501 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 899 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 525 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 917 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 984 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1396 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 719 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 1184 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 695 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1243 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1351 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ demo/ios/Runner/Base.lproj/Main.storyboard | 26 + demo/ios/Runner/Info.plist | 45 ++ demo/ios/Runner/Runner-Bridging-Header.h | 1 + demo/pubspec.yaml | 39 +- demo/settings.gradle | 3 - demo/web/icons/Icon-192.png | Bin 0 -> 1279 bytes demo/web/icons/Icon-512.png | Bin 0 -> 4492 bytes demo/web/icons/favicon.png | Bin 0 -> 228 bytes demo/web/index.html | 33 ++ demo/web/manifest.json | 23 + 72 files changed, 1308 insertions(+), 65 deletions(-) create mode 100644 demo/android/.gitignore create mode 100644 demo/android/app/build.gradle create mode 100644 demo/android/app/src/debug/AndroidManifest.xml create mode 100644 demo/android/app/src/main/AndroidManifest.xml create mode 100644 demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt create mode 100644 demo/android/app/src/main/res/drawable/launch_background.xml create mode 100644 demo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 demo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 demo/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 demo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 demo/android/app/src/main/res/values/styles.xml create mode 100644 demo/android/app/src/profile/AndroidManifest.xml create mode 100644 demo/android/build.gradle create mode 100644 demo/android/gradle.properties create mode 100644 demo/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 demo/android/settings.gradle create mode 100644 demo/assets/icon.png create mode 100644 demo/ios/.gitignore create mode 100644 demo/ios/Flutter/AppFrameworkInfo.plist create mode 100644 demo/ios/Flutter/Debug.xcconfig create mode 100644 demo/ios/Flutter/Release.xcconfig create mode 100644 demo/ios/Runner.xcodeproj/project.pbxproj create mode 100644 demo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 demo/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 demo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 demo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 demo/ios/Runner/AppDelegate.swift create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 demo/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 demo/ios/Runner/Base.lproj/Main.storyboard create mode 100644 demo/ios/Runner/Info.plist create mode 100644 demo/ios/Runner/Runner-Bridging-Header.h delete mode 100644 demo/settings.gradle create mode 100644 demo/web/icons/Icon-192.png create mode 100644 demo/web/icons/Icon-512.png create mode 100644 demo/web/icons/favicon.png create mode 100644 demo/web/index.html create mode 100644 demo/web/manifest.json diff --git a/demo/.gitignore b/demo/.gitignore index ff612b3..f3c2053 100644 --- a/demo/.gitignore +++ b/demo/.gitignore @@ -1,48 +1,44 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp .DS_Store -.dart_tool/ - -.packages -.pub/ - -.idea/ -.vagrant/ -.sconsign.dblite +.atom/ +.buildlog/ +.history .svn/ -*.swp -profile - -DerivedData/ - -.generated/ - -*.pbxuser -*.mode1v3 -*.mode2v3 -*.perspectivev3 - -!default.pbxuser -!default.mode1v3 -!default.mode2v3 -!default.perspectivev3 - -xcuserdata - -*.moved-aside +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ -*.pyc -*sync/ -Icon? -.tags* +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ -build/ -.android/ -.ios/ +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ .flutter-plugins .flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart # Symbolication related app.*.symbols # Obfuscation related app.*.map.json + +# Exceptions to above rules. +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/demo/.metadata b/demo/.metadata index 26d3615..2a1a285 100644 --- a/demo/.metadata +++ b/demo/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: f7a6a7906be96d2288f5d63a5a54c515a6e987fe - channel: stable + revision: 8fe7655ed20ffd1395f68e30539a847a01a30351 + channel: beta -project_type: module +project_type: app diff --git a/demo/README.md b/demo/README.md index 67c26a6..9284156 100644 --- a/demo/README.md +++ b/demo/README.md @@ -4,5 +4,13 @@ Demo application showing the use cases of backdrop. ## Getting Started -For help getting started with Flutter, view our online -[documentation](https://flutter.dev/). +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/demo/android/.gitignore b/demo/android/.gitignore new file mode 100644 index 0000000..0a741cb --- /dev/null +++ b/demo/android/.gitignore @@ -0,0 +1,11 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties diff --git a/demo/android/app/build.gradle b/demo/android/app/build.gradle new file mode 100644 index 0000000..ce8d879 --- /dev/null +++ b/demo/android/app/build.gradle @@ -0,0 +1,63 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.demo" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/demo/android/app/src/debug/AndroidManifest.xml b/demo/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..0310cf3 --- /dev/null +++ b/demo/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/demo/android/app/src/main/AndroidManifest.xml b/demo/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..582cee0 --- /dev/null +++ b/demo/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt b/demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt new file mode 100644 index 0000000..34b9c4c --- /dev/null +++ b/demo/android/app/src/main/kotlin/com/example/demo/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.demo + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/demo/android/app/src/main/res/drawable/launch_background.xml b/demo/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/demo/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/demo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/demo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..76a145817449cfed6ae83c687c573a0213d3ab0a GIT binary patch literal 719 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2V4CLX;uuoF`1Y24hH#?Hv5(J- zE^avzwPJ0;f7jblj!UnV1&C-Rbx*die7&f-RAZf%h{$fMoh6~){j@lgf&^T2CoRg* zl~^RyY!<<(np;%G+B)M@u~}tpeuZ7~zdOGl&))4_?dv*cGq9NO0DY4QIdx6i_@tS?_DyInUZ z>iAhGBP_km;W@;V9u_INT<7~A)r4p3eST0Un0Yu`g7eB1Ip_5IAfd}2Z1QV(Ws_Vo zm~3aCO8St}{nk*cMeV|;pp)M?vblU0YzTt6#z1Vvjz+hiwJ-z2iRTo)JwD;)AzaQyP+h%>YQi~l*D zBJ{#Gr=)il`=?jQJ1S4Txv>B1jCl8U2^{{jXQ-ZE!@c-lnG-OfGI+ZBxvX77G7v)aJUhZZK$x_30dVR+Z9930)xVW@(1P?D<}I{Xe#ST1$r7V)qM!e zT0QXy$E-V-s}%2~XU^XCe6N31{<*b1mv{7;xjnOG&~j=p2O?RmfYpf=>GG2bmjv+s zns75t{c3{ng;I@~Ix0aX3ZYs@xMZzcd72W%W8UcnRm6pPyq|5rt@FMwvF4ULm;an8 z1&*r{9*b!0&w5ehF+ucJ_%H6;EOPm$19r=PXn%3}iMds|;C8OLx&dcG19VN_9c#^z ze45^V@w3!_eN8!b)m?m>9iHuw|9na<Maer4M84y@I4|L^)#q<82eAJpDLRUh}2tI<0PN z`c@|IY*6uxkd!)l@2YB5@85q>6^CAR><4WHp`wh8*vxWXMZgw!L?5kPm zz~#R*$RTG!NVBIy_?#OZY(1NGH0M}V2w!A}I^^;U}p7naSW+oe0%%6_vJ#F;~%eo zx4!;n_2PK5%RPxVRkYrOh=_6su5oVvaw-18LT6d4P=UFx#bTFacN}Tq(GM)?T%e($ z+!1g(Yo>KX$F7&3c7I#jA|(1NuO{yItJjRuJm2mr%GGj5_6frsvrbLQjZ4C^Or>i>YFb zz4=ey`HU%C4$ByTM4HWkX)VpijznEPt(T=BoYtRU=Wx5z*JEC`(cU+U*2T{|VEu`w zid!j|VUq)!g!Cz;M>itw3ncaj0l6ncm|b2U;!;=|%wWW-fI>tybe_>UcG-Ae-&vk? zL(_TRzusOJYO`$LQODBU6W4D&O|x;Zd%o!XDTy-I$r*X~-n}-x^pI!KWYwM^~;tYCq8bivy|lju;;mS)voG^8M$BoN^O4WXyTStuw>oA>mOz3&VAv# zbi%G`W{YRlJ(~>V7W{qjagy2o7{Ahz2T}1{%1Exa6n?rbz)5aw>`;{Tv(-RZwGQ|88oKdoE7@9R^LyxpdC+sq`gGNh&<;>f|P z2d5Wsv&!6w*#Dw9uePT9yL9QpUMCC^O2`-^UhfywV%xD}aj$LA zNhZ+)k6mBfs+QQ6dN7KyemiFjgTF>Yy0tfFO2bqaP|7)z)9@($*ybTRd#fAUu`7jV+RPka-uo7;1Be&CdIzFVdQ I&MBb@0N)j2F#rGn literal 0 HcmV?d00001 diff --git a/demo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/demo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1717f570adfe46411eede1d9081742d808a5dc82 GIT binary patch literal 1184 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q4M;wBd$farfhFD3#WAFU@$KFF+0msE$3H&b z;(2RU$=hc!NzyB47yDV=+@c-S{vcqEc+LkG?-kVKsgF4+ zqAxP_1XtBV5o=j#F22b0m1~W{qfP9q&PcL(tyuTD_)`A!P92VDz)`o^X%K*%%ii5)*YWv zAs7&#bMx6o;dRG5Vo$#>Hv9Yq$OH-dp0@hMbg8ORGmf=oYkPx&qJjqphY(X!3yhi1 z^lIP6v+u0me4qb!`mEWyH>;P&`Y-&fw&2`Z&)fA&j(?TdIP+IxV*>+R&x&);^L?Y= zUE{lLw&UPejW~q`R@3V>qssN3R`KK$*?KN&+u>Gww_uP?xGW&JUMZ9v_efE6WvASI&fd~!tC?6Z+v`g_UFXn zwAnHKi-BRG!1Jbcv3`}Tzi)N*Zdt28Q)){e}{t?G%`8d~4Rt@ZK0*v?yfI5@J!Nse}6!W2&$x-^B+_g~@7 zPcwP1*Tim&+2*};QSQqf>llN7u6)U)r62a@;ClOQ&wu}V8*u-eXngppkT)MY&*zly zI_*}@XI9{}-z3(db6S`-k6p^)`yy*H7RtWd{dd)Mmyb4;zm~i`m$PMh`JJs?!M_&2 zWa>(>zVz+n1IFqHr~7qM57yu7T(q_H>AB$E^e@{QL+4!L_mvD-qC9a+`S&;5tNm*$ zo_;J6yn5~0v=r&`dG!~!FuE?XzWC$b)9aCcZ$Bwf8R`_8rQxX>%zRadWd2W~NY<(lBKcZHb9 z-W7WzO};5{$t3r*%?>=b)nwBq)9F=J*Gkhl)plmhJOBUX&suwh@9*9{|M-8EzRTpY zA8Yq8E}C?YnZcihA(M(|BfrAc+xb(|_kW!y=&39nts5`*TX@Hci284xAJ?p{cHf}FA#stkfySSU15_76T>rS zh6!%Ck(!`Gdidn;Ehj9?5^nH)_TD7LcxOjuCs07r!ZfYyQgy3+Cqu(e0fr@l$jG7N zUfm<@=&LcQ(%WL6+OpOwF?cAGg(h<+e2F>tt3PhT!~8@456^Ip?~5!;(fU#!6B9Rc z!&UQ;=-Opgcf|k6PvA^=^Jhx!j^EkVpWc1nR`fJ$_3HKdcM^9@w~z^mez$zdRhd;> zUrUR3dj3wh{yc2!oj326uiG~JeU#Lz*X}c280_bry`>%Pcgu9O(YJfQW6Ofo9&dVl zPnmt~(@&}2N-p2J5MNzWbLZa8{rA7w{#?X6=f}}gL8%M#I~M(5pI}~{TfKg5^zFRr zZ*R9MaO@G^>9PFsw}ABJTeoh#**yFG_Ac$>wCq=V(sy>(Gqf^ksZYE8?)m)5w*PLf z%g)=DKJRX7zx}TnH@Du){&Uo>!R4X#fo<*O5n59}%@dORUQ%-7p7^&LmG2b=1^zQ| z$**0z_MWlQ^KD;WuYJDT?!Dx@Bw2@>CtiF>c1~XWdD4rOYhx1+&J4b1eCMcDgXEt# z{Xace7|ygaDD(~i$=JyZBbG^qHEW2u#AN9~|z^ddYCBzi!I{j;`bN@$b{W6+PCKsrTSmz|zGY zZ}TUKVY<}8H;?aMEcmOWdo+e6K#9Av;qiB%))Gy@f799EK%`*Rw!HJL7$_=g` z@|9jlTc*#hwtMf!QJ0oDp@w1NOL!sF?++~$&1ULi*Ehqme$PL+49|{l0~5Drr?$(tN&a4Q}{5C zRk`7Ui1LpeOYdGfsd8Likwsw9sxGegoHLqnM3k>m!@GBR?>Q$L8yLK>RTKio`#zlw zHIbyhCQ7eWA^U-rBa!#d;{g+RC4R7rH TTRk^`A!tDnm{r-UW|>WN5q literal 0 HcmV?d00001 diff --git a/demo/android/app/src/main/res/values/styles.xml b/demo/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..1f83a33 --- /dev/null +++ b/demo/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/demo/android/app/src/profile/AndroidManifest.xml b/demo/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..0310cf3 --- /dev/null +++ b/demo/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/demo/android/build.gradle b/demo/android/build.gradle new file mode 100644 index 0000000..3100ad2 --- /dev/null +++ b/demo/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.5.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/demo/android/gradle.properties b/demo/android/gradle.properties new file mode 100644 index 0000000..38c8d45 --- /dev/null +++ b/demo/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/demo/android/gradle/wrapper/gradle-wrapper.properties b/demo/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..296b146 --- /dev/null +++ b/demo/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/demo/android/settings.gradle b/demo/android/settings.gradle new file mode 100644 index 0000000..d3b6a40 --- /dev/null +++ b/demo/android/settings.gradle @@ -0,0 +1,15 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/demo/assets/icon.png b/demo/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e218c7ce646a5bef8c5f0502ed364f761459031f GIT binary patch literal 4958 zcmd5=dpMNa8ed}uL!+i>lUw5wU1?;RNnl zkmCqZxr~xqMB63XC7VQp;kchQ$9Z~=)85bSIrcgHv7T?u_pR?;zxOxqdf(ssT`@J* z6%rH|1ON!>>yfDdAW?82(R}cZ{H`4jQveZlzFaw}b=RQ~MdCV5dMIU zHA2+yqx}3t??+kT@=vqJ+ttnT=BGk{CjCtOG2M5~H6id1?u#`WovdohP{bfQVtR#` zIHuq9hPK8n!l&HB(`^d2nc3`9yqS8yb}F>6JUQs)vtwmxTgyFGmzjs!|o- zNqbwHSxVl!P^*Fg#EQ)@6)YoSttAN(HgQ#R({G2%GM2uAzwIK26`0Q+Ehb$|FYfg# z;aC;o1#90H&MNu(4@G#go0}Y;izJ$Ks>>)`kBs!$r67UCqRI;h`@JfdhleM!Cc?5I1H6KcZYNHmWg9sNjp_-X?pdb{Xs zeq)!P(vbAot4(8uyW0;O5`(8drY}j?s)wU>L&^*7ppqn};TZmlpk8YmzEPdcP-G6K zKG{Av7iA~Nnx5(k>+0%qStyNUOi(%#lGD?(4jgT%SCPb_e~Lc;*Qv_hu=O_M3rzi3 zg~~IdDN=+Dnqn;kLdY&s*bqayc(lZ=n*P)?0oJLbiOkDW3DOR@ zd&7K7oaavdQw+w(Df_8x>&DJFU*YNLuCUzGoLr~r@iLmTTQHlcJub<^^5nRjpuNnx zSIxC^S^CleE32sL$3JuIfnW!`Gq$t~R-u73Rj_ zPy&Bwf8^si=QvQua!^T!$I(o)<_2@PRe{9Tt<7v+NWrN}(ui+=e?PnJM?w`M z+u*#Bk;SVAn|NWNxwaXVz{oJZP0c+$yZ<>LI-KzLzx8@>SLD762w0e$F?~-i+O+tO zNC5X2J=+ZU&X>U3dxz;c>s`Hj1o8p#wDrfCdndP-eU zqr(D1Ll3vusABfYKbifN7Ibg~My}ZYqOGE1$-&Gts@ffufg+Szlny_%>z6&JZ|&^- z7c-^|q11lnvh+pBP9K}-&P?V^`;3P}i6pk;z4CEel&xN;f4zp{+HJ%e;(GUT4O}HHX#^}@{L&`DY<`lHSlwENx={E!Jv$} zK%LEJi^|HTJ0H0cd!iVD=3(Ayn@I3SDi(}-(tZ8$pB9VvFxb;-}73r zzOO`CFk6{VR`#mNMaoCfEFl!MMTu`M%d--}Xk%1g*@&Af#ES{QO+$I`0Csg)UZ~Br z0Zy=j+w74PBql`o_FP*8ZSq&@=cZ z^SI9||<>6&VQd$?srGrGx=$=qKvh=KGIVmw;;(eO8PZX{t zKH!S#*OSWrEoji8dJOi~%Tf;{e>Gd`FR^Ib{-@NBMnh3LM{f<^Lg7M{w_FUqBnLoY zcoYV~4IThuSh^v$Vw?_*J?`p$&DipXk_;d#OU*rZ;td9XXhTgE)SCH-@TJGx+<@j0 yUiHr#zm4p3Z3=`$uP9Cbf&CThh(FQ(bWhp3rUz4!s`Mu4HPAn7OwQJ^4g3dfLEvQo literal 0 HcmV?d00001 diff --git a/demo/ios/.gitignore b/demo/ios/.gitignore new file mode 100644 index 0000000..e96ef60 --- /dev/null +++ b/demo/ios/.gitignore @@ -0,0 +1,32 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/demo/ios/Flutter/AppFrameworkInfo.plist b/demo/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..6b4c0f7 --- /dev/null +++ b/demo/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/demo/ios/Flutter/Debug.xcconfig b/demo/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/demo/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/demo/ios/Flutter/Release.xcconfig b/demo/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/demo/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/demo/ios/Runner.xcodeproj/project.pbxproj b/demo/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f2e5a21 --- /dev/null +++ b/demo/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,495 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.demo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/demo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/demo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/demo/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/demo/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..a28140c --- /dev/null +++ b/demo/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/ios/Runner.xcworkspace/contents.xcworkspacedata b/demo/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/demo/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/demo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/demo/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/demo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/demo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/demo/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/demo/ios/Runner/AppDelegate.swift b/demo/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..70693e4 --- /dev/null +++ b/demo/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..d9df67593c78d8d0abb299d9014232eafcf7eaa6 GIT binary patch literal 14311 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 Gi~j=aXb?{T literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4970cbff34377b3cfb3fd9ef2b3373597e2d49 GIT binary patch literal 311 zcmV-70m%M|P)Nt8~EzycZSb@eltA%@s&ZEgPU>##n?F+KK%Yglwmjx{K?GB z(0A@APED`>{RWb(Smm%9_>Gs7q4?87+|J;_ZWvAjDFIYB5CE&AL0*H{fgk_?002ov JPDHLkV1hg|i$DMX literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..36085b830b59c6dde9fa27b9b2e40b9a771f9260 GIT binary patch literal 469 zcmV;`0V@89P)S2UQ3|n9ju^=xI6Leh&md#YiOGtnu zk@HA`^8EvHM`z?B9je8Z@{_rMNFIyDN8D2F zKopcj_Ew2PCzt*;iQXppZ(>1SVnJSFL0)1(UbqF__RmnMS;xGr_}4Ytgz31@Qsdlm z9k>O>_F2AcHeq=#4C@=$dKo*}*)ZIELTT}uI)%IH2j0vU_U9JDc;qjk&ETq<^;g(L zYm*dJ8Pg{ROoi%-3{3Q%wg*8Hv{eP~szNTpL$q2v3}QiEMqcm-yuDvOsM;b#00000 LNkvXXu0mjf^6A>+ literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..12af534d17ec96db882892eacc681f6222bd46f8 GIT binary patch literal 554 zcmV+_0@eMAP)oEkQN=p zOY|kGFM2zan}{NhBY8Z(?Vg-8sS6| zdi;eX>OE}sDZB8KAm@Urla(^Ja1l93uUe_`Uh1K;fI?zy0ry(MmqD( z^#)EcQP+@nUMw2L`1~v|O0mK>NQ7NZ7d)Q)vfrV|;XrS9AJ$1ziG=O8-)RMg%{(5o z+gh3ycSM*wBFr5T=8gz+M})Z}!rT#I?kEwCBwkQ#*uOmfn9#S(HT5pFN5%0ASrg)Xw+C*eoz-i0t(*Qlbr1!ZTrBO`6He0_kF228ru z%bF-{TBh_;a~EogidB}ipu9`}rL2iuOF!W$`~;uRM-gS=;P4RWZz0Vj5kBc@#Te-S s#G{rqkuA*~5$28vb4P@^^Y4UT0i}Uy20kKdH2?qr07*qoM6N<$g5pT?^8f$< literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b23846f7f853a8ef0159127a6590019204a222 GIT binary patch literal 381 zcmV-@0fPRCP)Sy+)L!pPbAYeiNaN zprw);TnyH7Qbbw0iieruJ2fno(dJ?Bags+7`|;&30|(Fobg*e1rWje4VgnzZ|74I* zd5H^JqAX>3smKs-+s?qs$_f{| zB=MF(k6#!?-P^aX8A`t`Vqg%Wf~8WT(kK?<0>Z+g4BYHIgl#0oQd)pfOGhmoL6*M% z{S(3d^^-x6jh*(Ee*61};nvrW4B!9#WzgdzqWGbPrP3VS45k9245I9u44lm5#STGT zfB*hv`2HQWY8GPzYWwvYSYe~K6F`*%RV-cj>m9?AjkAd|?2jNHbu9hI%MHfV1Vbas b3|UJ7Uu;uf_cw>l00000NkvXXu0mjfBRs5y literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..452ab681e64fac166059f31ce1635efee86cfa76 GIT binary patch literal 570 zcmV-A0>%A_P)f|b}uI*4)p@nwKBn~d3i*|Mr z3r$L^5Ti>6FW{+!no2SGTM`|b&!-w$p%9{>0K;JxqOI}O_z2af>lp$kxjh;l;-Bidq^l$KS!6d{34~wsb>OK>;Cq zlp7?Xv)|K54aF&sj-<`CGSck62bU~kNC8oL!Kn@8iM<% zgLs_w_*bVT8YRt>X2cB<<%WoILqxeDqTCQsZipy1M3ftWi)K$v=votAv^4&>-uz#{ zsF4hMdY8aO2lS`-md|10dCGnFqwohK&pLyix&b9iceeW_mh-<+wrymN|6NJ;#_0d_ zd7(r!913ABHHf8yJ-mI=p)r>;vQR7*DWY5|6`M5Aw`f(5 zVQhB`s6T|1jRa|)Z&9bY3FoiV6tx73>``urC^tlu8zRb$OKO>F+D_YhKL7v#07*qo IM6N<$g0xTrdH?_b literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..69b2d20d7cf943e5b0fe9f3532d6d7f33d832ffc GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0vp^;ULVx1|$nl+{|HMV7l$;;uuoF`1aOm?~p=dj@4~pt)cE+^L?0oR=Eh~rXk#CIuQoFpD z>~O(GxIGek`dMSvOjESgvXsnn+(d9z4r0hd1{aD!IoB_es68%8|8^}J2k^6 zhcBP7al`84OcNgou`0bg9Q}Ud>kC=8kAKh+C`@0@y{-R4G?SqD3aDXV6M;m}(YdG3 zCx3b8UL$e(;Ol;&$I8Lo^Gl!G=7(K#y?Al!sn4bL-4l2C-8lG}RmQSFcIDo;^VYww zwCm|!J9pmt*%juEvzfy`y!@_0 zDes)P!*pusvBP?uN0VM;ct7lH%~dW;ez>7?=6o*E)-`WlT?V;ZQ;%HY{iAbdo?iT2 z#WLM2$I;@+KmVDhlO>m2H&F}>%llDs?}uJqrb<_Hr;6WR8Mk`x=lqSokGX9$jeGrj z1K<6lrCZjoaVxJi?z5|Ik(S=ByMMn(S-J0_M=$H<>OZ!cb3pz2vVuQHlSA4UNmP6m zS=sgKKuhTlvvrGi+Vmy&uJ!1*JMi*}TFF(@8+Mb__w~Ilc=ur8+v)(h-kWw^>HGR$ zb0kH$D?DPG`bbE!Gg?Dr!r3%mU<^Jj3M=b9BAdU$HTu7$aPT@VQSCKvq&k167N7op l{lDA!7^S1CLAZ%U`Sl*PmvkCr%Ymt#!PC{xWt~$(697qhc;5g3 literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..36085b830b59c6dde9fa27b9b2e40b9a771f9260 GIT binary patch literal 469 zcmV;`0V@89P)S2UQ3|n9ju^=xI6Leh&md#YiOGtnu zk@HA`^8EvHM`z?B9je8Z@{_rMNFIyDN8D2F zKopcj_Ew2PCzt*;iQXppZ(>1SVnJSFL0)1(UbqF__RmnMS;xGr_}4Ytgz31@Qsdlm z9k>O>_F2AcHeq=#4C@=$dKo*}*)ZIELTT}uI)%IH2j0vU_U9JDc;qjk&ETq<^;g(L zYm*dJ8Pg{ROoi%-3{3Q%wg*8Hv{eP~szNTpL$q2v3}QiEMqcm-yuDvOsM;b#00000 LNkvXXu0mjf^6A>+ literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cca3751fcd38753531176946b6eef604f5850437 GIT binary patch literal 748 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdoh8VA|~I;uuoF`1ZDahH#<8v5(*N z(pPLzb$NBk#6>E3O7j`!_cR3sH$gsBPeDFfWqGK}$pVg70OPkg< z3-oY^trZZ?xOGcy?~_NdV(mxFrnld}>pG7=g|oaee&3TKNg-#W^RJv_jsL_gxNWG= z!RW}tk>nu2+$14zq(Om=#ZbW`(;@e^$l91d%SA^6eAoPoJAX`*cgOpm+MOw4A$=J^ z*GnVoEVQ>~9GP6{#r!HQ)MP4i)JC0)S<})V|B!^4wZtSLXHED!JIjSdE|dLdhR%%t zo;UB-`^Im&H#lBvxtnlG-n;j`lCzmfy5M7~W1m0&kG;p%0Xd5^e(iONW|H0zZGhx9 z8_peZ2GacIUO#gqPv&i_t;y(DWA2pOzWU%5wl&=;a#K^*yq~1Pmb}g{_RfD_p?Kk3 z`TSYS_Ei6hy0+-P>!UpJw{tEv*l&(5GX3k|*59+s?t5~c=eZ?nF>{S;KQ`UjRr&Zo zr-h9Dg+QAlJ2yXn`Z4Ot4^L-Ze89`3B?sxd@F>jSG zQm;I7ocF)30HbXC@5M&Ko0aRfDKAr#KEGFY-3>@RuDzT*?`*KthKek&E-iKz2K_|jw1MoiBMl4epUF3rEu30d Q4@|`jp00i_>zopr0H{hcT>t<8 literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..62c7e20759ac3081fddbd259774b01c0893e801f GIT binary patch literal 984 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q}r7FwggNaSW+oe0#^=V{)O)@sIB} zueH3gbIURpEyu`q$A62PW0?%k>RnVkaw1toq@Ga7H_q6-(?Hy-T_+3Mc<{ z&Rn1v6~!ids^{sMWjl8+pQj+8W&Wu0+wY$@pO@aNt9h{ZzC_L$<=WU~0y_P#7@z2{ zu^m6~Kte)>xj8wZfQP5A@t~oB1*Tx8=ndIO0cEjZTjf;koi~$yZ3;ObG1;y$xll9j ztw?xD;MYl0bls$Nk9G?7I_P;xD_JJonXr}tDKCoMwYsu2& z_E(ac)}Re>G+~oGbMxtr0~2Saa*9-jo)1t`X8K;XXZo`4 z+YnB=5t@-muHV8l$79B)kEJ1tiVLI9b=O2qTgh0xZ_fGqvs7n$)ohzHmG2hoyc)5I z_r7ho5^~McKw`_&Gdp$PryPD@7JW`?W|i{fhsQ6KoSgT0&a%)4H(#ns?wh7;d$;_^ z`|r2Q-YtIq{ppu^f49vwH#1XPo9^E+W9PQHFGbceo%hi>`F7vwZO2NTG(;v%b52j$ z@Os%RP0yFYH%yjp+T`TrKm^JpkH`LV82?B;|Wn+VcVYMBL zl_!?aLh>5n*uolxFu??-0BA55+Np)?}_Elkg{PqI#Pk+5W`;M8R%KXQti~gp^95xVHZih95ly=MFCtL8V8?#5`pYn^+w>-tjhl!Vi-X4}}wPm672vWyQ~ zS`~KdAltS-`%c=*FI&2EhtF3T)dkGaYi7?`S*ZJ=(O4Fdf`Oqe@Us4w3!jPEs<=r; zmmi1ODr)93ssFJwx>f1t7Rt}K*f*hw4WR)RG0EQ6=3pUXO@ GgeCww`n3iC literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..e598b164f981f0d6218f804cf91b80cce7c28bf6 GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2o;fFz)emaSW+od^^M2n<-G__Np$3PHJR-dOWdKcsBCSsneON8FREGLA+slJ)6Ev#vSRLP1)TyXRVUv0XDpsd zNHmI``TETDT)yd9<(+7-p4w9`TG})I(PLJ1W)M503%(^!`?CJh;^X!b6ZwBH4 zdMg~}Sn}LoI(47EvcNX;rIm+6mwa00wEF+~XR~I-ns~UV&tIoFRpYP4yxJ9J^8%&L z=4DyuP4nUKvyAY{NQ_uAC0Nk!*oM8^m?p2RT^Rm3^USUqi7mHo^{rmj^>}mhvCxYd zlDa(IKjtvHD6h^rsVkO~m!l|lKfUX6Pin=Y$RxjY%AS{=pPML{Rd!K95EV_l?-AO? z@s_| l|2pUB?G5xP2vxZ~VYXpUeiVPPiWL~044$rjF6*2UngAp>-%9`h literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..369cca6168a78e0fee13b5699460a7c9e23c0e3b GIT binary patch literal 899 zcmeAS@N?(olHy`uVBq!ia0vp^DIm=!yAr@=PGO7JVqeB4Cs|_7ivjn*W zRRnDtX7YEq=^4qJC(qg+x@bdb#On9Y)#qO?JXgE_$Fu+c{l87n^tYPUl8}<6?~rZC zA;HFYSRp}zg{Qe8QNVzQsm<|#0bH=hOCVfD%df;Sxg==go|uU|?$x|=6;#*CKB}}{ zU}&}S{Bx<)ZF$?jNm)6bx%iM_FIRF{p^}8V&U!^86Wvrj5@$y9$!T7en0w(*iI3AQ z?>~!#maI6W%R9Zx)J^?Ms)^RZ=v&c$js%MVU6WioVd1_^P2P&5b7wEy>vbzaHf2Y? zn^{hoF~?tPH1|Oqo#nXCU2N&{$CG*X&zZVZ@se-sxpEb%>fYPDT<7U8z5n0LQnTFJdg*J& z-5z0;Ui}mEv>cD!JLCPl*E%RNa;0INYvXfadk zcVpGgJ7vDry%tjye#-S9yRpP3ZoNlNAW*>WG!yPX#v1Z?1h27h_VRlg+}Cfk`7i(e zy4@}P=&-9BY zVr<$@KMlI`;eDj&5raUV9^=!?*DtuP{{1+6YL=#2I8*hOaBuF{O%l(fE``;4Nd4Y* zCY9B`fGTSW@z+h^>yiM-~M&^O4cJg|SEWgVS6fXVSjpCz<8j zkG*I)^l-yBF71$}FJbu;+wL8gT0FVy9Z$x3f#pIedErx!MQDGJLQS5y0_i7X^{;7p U&ttvM0y7tbr>mdKI;Vst0EQrXF#rGn literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..ffebe78b6ba9b23c3befa3486e69348b83a52b64 GIT binary patch literal 525 zcmV+o0`mQdP)N3Wxh8Bn0;3?JAn&SplJGw~-_37%C~f%0`Y;;O$BUmZX9Z$z-ey z=i?|WCYx&ALneoZXOC)4UP|NTxd^D2wS;ELa#6-y?;666q2C6T|^dzN2vn%Muhd#ELjTpaUKv6ML&4EQh_C@z>-v8Nh*8*@@Qv+qcHSH P00000NkvXXu0mjf`~K}* literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..10b12e99fa7aa7508ba6722f855ff77d16dd7612 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^MIg+<1|<9Mw$?H*FvobhIEGX(zP;=3F}YCY_{a6{ z`qwO#-eua;)TIy}#hL1oS<%UNQD;{R`_ZWaLCY5{SY7h+%F0FdAq!%;US7DUvPnTh zXl6)4?3$9|j@2bA|9)22l$~X5bGvST?YBzV?H?aA=g)g?Y14jl>H62(1MY2pE$1-v z-~~u?A z?WmdY@@luJtmP|vI6SWzBAZ~KwB&H=>*4(QDlz7s{RfX13Af#z0G9x^i$7{nJ7J({$h>F@9ih=T2EiHVuglsdR2^Z(EiPe z%IUIPtxvwJx{}X-7>UTBAl+tD$emLRWx$aLZp3ZousVON~wDr8c z-F*M=J*lB*-bV*NoGy6RIS3dMm($*Dejb1HXxcqP5oM=IrFa7zhmWyD4T{Q2`A_$b zC*F*fo3K^e>+-)c6H8Tnwc|@y7R7#Re;RSG{m#>`-WH#H^1|Lnnl0e=Pb z3u50rsXf7~ZObh95JJaHELd@ujp#UWF6OxqVM zIGgR)lHJP~%@#2U1_g#cd%DWX^3N{+UE8kd*DT9h{>m#v(0uBw|M#QA4zz@1?X}za z_q*Ba8FQnn)Rf{oyB9cVb)P?T?dJ@0E|o=0;z5Du&)nO^yes{QNXiMPBZw5~*3xtA z@g*_7*YhS$yOpV>?8G-eb7JCMRnVkaw1toq@Ga7H_q6-(?Hy-T_+3Mc<{ z&Rn1v6~!ids^{sMWjl8+pQj+8W&Wu0+wY$@pO@aNt9h{ZzC_L$<=WU~0y_P#7@z2{ zu^m6~Kte)>xj8wZfQP5A@t~oB1*Tx8=ndIO0cEjZTjf;koi~$yZ3;ObG1;y$xll9j ztw?xD;MYl0bls$Nk9G?7I_P;xD_JJonXr}tDKCoMwYsu2& z_E(ac)}Re>G+~oGbMxtr0~2Saa*9-jo)1t`X8K;XXZo`4 z+YnB=5t@-muHV8l$79B)kEJ1tiVLI9b=O2qTgh0xZ_fGqvs7n$)ohzHmG2hoyc)5I z_r7ho5^~McKw`_&Gdp$PryPD@7JW`?W|i{fhsQ6KoSgT0&a%)4H(#ns?wh7;d$;_^ z`|r2Q-YtIq{ppu^f49vwH#1XPo9^E+W9PQHFGbceo%hi>`F7vwZO2NTG(;v%b52j$ z@Os%RP0yFYH%yjp+T`TrKm^JpkH`LV82?B;|Wn+VcVYMBL zl_!?aLh>5n*uolxFu??-0BA55+Np)?}_Elkg{PqI#Pk+5W`;M8R%KXQti~gp^95xVHZih95ly=MFCtL8V8?#5`pYn^+w>-tjhl!Vi-X4}}wPm672vWyQ~ zS`~KdAltS-`%c=*FI&2EhtF3T)dkGaYi7?`S*ZJ=(O4Fdf`Oqe@Us4w3!jPEs<=r; zmmi1ODr)93ssFJwx>f1t7Rt}K*f*hw4WR)RG0EQ6=3pUXO@ GgeCww`n3iC literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d569659caac69498d40e42040c2ae8311fd423c1 GIT binary patch literal 1396 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD4M^IaWiw)6V72yiaSW+oe0#S(<4UQ_@sHo< z{w}H2H`PW7&fN=mz(wPWe#&t-Fh-+!{U;aXU9`|fk&xckqU`~GgNy|>%;=bOLh zzv*ti*Z+yFL*uh8Lx2wpuO?McmE-fGFvF^g-$l3&efiXWW>Mh%WD8aClF<7Nwgqp3 z?W$y}Rq+cL~3ftg(hhW}gj(KK;Kjz5mbOxR%bC3ymk7EbzJ9!I(aKZbCE{WwJZ_8Lcdk&7EOCzB`nIBS=X=9FR;3kJ*y=ynwpLGaRNliO z6@);$Sb~Hvo6S8L=^K0IyT(H23#tYszq)#PQ*+Y4bKPIu!iU3BT#kW=ca>bYzS&aR zru5{wugl+D^0@ZN()@Yc-oNIp$|p6=+3#&iiCnriZ|8ZT+wZqW#QZw`Yktc9&!-n( ze{D`&pFJ%97NzrW|szhA!X&ZWzew{P5d^XAO6XKA-T`?Sxs zsk_6szvP0{wlHh!YQ>2>zh?LANBusx{O#9wdG{AvT;Ex~e(B}lvKJSs)BM+cv+XOc za=icRuk`AUo3ry}H)NcUyA$`}&_40EH!d#zmd+v1uPa`%K{Y=sck8N(JKr_#g@lFO zT6T7=*`&R1szshZY3fVcv~5-4Twn~WUcY{O#{cX4ju-gpy*SZ3Tdez|{*FUldKoR! zWCbw(;HRGK`Jnsq$=i0Uxg)oJ-OTIPe_EPm-jAKT>$H$&brEY*&1p zd&}zi3istf+fpBR-xgc1_(DnfMP$`dyTt3CEwg`rEl=m-l!vYtia*?%^)*a<_w{*FZ?;~R-gft^uk0GhgJ)%q{3&xT?p)5J-ZXD< zdiM1j>u;`{>F_@7uf~x-E;X9w#hij)Y*@^{7O4H*A1Ge-OyQYur&+g~QlC06f786> z{IkrW-`+I-zbp9uPGjNXOu-VtJ3E8LHyH1Bzu@}m{M@SRwx(v&_8&a=hS5}!8I(xzV6hLH@$3mY1cV+u{3>Ut`jg>f)#nN+1lCVolLm| z%!I7(9VJe(&ehl7>|a%t7MD0Z-}8suLCc*B)OVGg-6P;vnBW3J=Ooj6~ VO=8&M&jU+S22WQ%mvv4FO#os=HZcGI literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..76a145817449cfed6ae83c687c573a0213d3ab0a GIT binary patch literal 719 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2V4CLX;uuoF`1Y24hH#?Hv5(J- zE^avzwPJ0;f7jblj!UnV1&C-Rbx*die7&f-RAZf%h{$fMoh6~){j@lgf&^T2CoRg* zl~^RyY!<<(np;%G+B)M@u~}tpeuZ7~zdOGl&))4_?dv*cGq9NO0DY4QIdx6i_@tS?_DyInUZ z>iAhGBP_km;W@;V9u_INT<7~A)r4p3eST0Un0Yu`g7eB1Ip_5IAfd}2Z1QV(Ws_Vo zm~3aCO8St}{nk*cMeV|;pp)M?vblU0YzTt6#z1Vvjz+hiwJ-z2iRTo)JwD;)AzaQyP+h%>YQi~l*D zBJ{#Gr=)il`=?jQJ1S4Txv>B1jCl8U2^{{jXQ-ZE!@c-lnG-OfGI+ZBxvXLkG?-kVKsgF4+ zqAxP_1XtBV5o=j#F22b0m1~W{qfP9q&PcL(tyuTD_)`A!P92VDz)`o^X%K*%%ii5)*YWv zAs7&#bMx6o;dRG5Vo$#>Hv9Yq$OH-dp0@hMbg8ORGmf=oYkPx&qJjqphY(X!3yhi1 z^lIP6v+u0me4qb!`mEWyH>;P&`Y-&fw&2`Z&)fA&j(?TdIP+IxV*>+R&x&);^L?Y= zUE{lLw&UPejW~q`R@3V>qssN3R`KK$*?KN&+u>Gww_uP?xGW&JUMZ9v_efE6WvASI&fd~!tC?6Z+v`g_UFXn zwAnHKi-BRG!1Jbcv3`}Tzi)N*Zdt28Q)){e}{t?G%`8d~4Rt@ZK0*v?yfI5@J!Nse}6!W2&$x-^B+_g~@7 zPcwP1*Tim&+2*};QSQqf>llN7u6)U)r62a@;ClOQ&wu}V8*u-eXngppkT)MY&*zly zI_*}@XI9{}-z3(db6S`-k6p^)`yy*H7RtWd{dd)Mmyb4;zm~i`m$PMh`JJs?!M_&2 zWa>(>zVz+n1IFqHr~7qM57yu7T(q_H>AB$E^e@{QL+4!L_mvD-qC9a+`S&;5tNm*$ zo_;J6yn5~0v=r&`dG!~!FuE?XzWC$b)9aCcZ$(>S*fE9g(Srx8To0Z+7<%xipVQjz zt8VIB1O6}3Tzc$Qw`ur=r$=YSKiK(QY5)0(n0enHo>p}h3ZHlHzQC&4+0~6{hZ7Xo zm<=U54m$9#B^d}bH%jmvNl@6D@RonRN72K{*D4O5`dGJ8=GOAMzNih`W`;kijkqF} zA8|T;w)KtwT@YOpqBiWiEL)VOvD);Wf!Wk4PdUy7azERunv$OGmA&U+W}%X0d%kDD zo2Iiizm#g1Tji|(7`~BvTU6Bcy@#eHiR-)r+X;2Xs)P4zw7p-ZMorSKySu*9e82Ob z+i`clhnsl?SehLOzOC-xC*R#4!C$7d*?pa8{E3L~i8trn z`S$$R=TGS~EkdKmY|i_wdyh>^5?v!{ zAmO1Kv2%~g`sdHK9FtzFPT61)BsVmT>R{v9M_}HH$Plb{$Y~O_-o$;6Ye;N_k`G*+0pp_HhNa&S{1> z6F$$q9dlko`aRR_nqNIf+1p~yPtbH(mHX)J=L@y8MF=p5PR_wn2A`kO}8cpv#HqAz&E>KNOy+~dlfNeSzw|L7#vgYTJt|6OkR z`}1_|Y3H;1{(pbUD*ZR>lwR){&pvtYu-n`28g?JsQ?HqK>UMhR!`qV9UoWknw(9k! zx!>P!Rk#o{DR0+T^V$C`Gk=KuWd zlau^9bN#%}fBpJX|4qR4=54DDRjrS|d9!BkuTR?F?p^%%$hz=p%w2;gsR_;R{cbIv zUz_(~ge*5zQj{&|m6!s>{=Hzyy~z4kPV@6Q%4 zoZ55Xnt*C(E)B4?F)`N23?8=(;uQ@du%Nq~slaaO2qUaxMvfAA%Qeg?* Qz(R|`)78&qol`;+05P2?y#N3J literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/demo/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..12c8ecd64f702a3090223cbbc2d32128f6312f1b GIT binary patch literal 1351 zcmeAS@N?(olHy`uVBq!ia0vp^%R!if4M>)V`MhCZVCD04aSW+oe0w+6V_vGv@sIyM z|9J7t`jtcRtc|lwa$ZFoE!lhET9OyOmI`gWx}ZsLVd)jm z)(2TCX9{@kPI-~)^g!j}w6o7l;*H)n8ghL8x@-OY;`hHTtNFhClC9a9zkc%ZmfFuJ zdl;L9_OUa3R`ffeL>cOGnbWy2vD?@G_dLN>FW>n5wl==|ooD$ZyK`5(nYaCW!P))S z^kKEviep;uHZ&e<-j{AM^-JNh7}?!&X>Zhi-HU$eaQhTivH zYx~zh=U4pw_1N_FuSe#~pQ~JY6t>Iq^tN}=={s99{muso&9rc5Q-5<=d9RsqLHFCL z9}S{!HH!YZemrjWFJbD<%Ch*lg_nz$Enl{F`R?2I?%qxcEq%G|_tK!{&sTQ1%sCkR z>8-o|jfKD5R_AAMyuI_RPi(cG&gQ?VyPN+b3)Pao^RqwK?A|H@vqz=c;f{^7Pr08xQO6drEXeeGRyo+H%JvGJ(7 zTJ3pIgz+3n{_}sE1~371s6A@Y8C+#lVxhwAbeT(11 zze+ylX{kB;qdD%GVSTwir?=dlyZp`W>hBS0S+^$D*>MzKZ@qkN%gSRH54})6_rGw> zuR7~Hwa31d*5%I6zq#>+gLOOm+mAPw=Lw|6eq=kYy|~*#{KL6tQMc>gO|dQ6b~NgJ zWy(Q^YWKF>^FJ?_?fH{;C`R#7Ov~g@{u{#2_s4$Vl(I2wHi*|=t#BsPVNUmic^+HO zZ+o}rU)TL>AD7l{O?_Uk=Xvn{jDxG^s6Tt9cutig?&JBAt$(XMXB9tw+HMfeU#NGn zclwekCpBM7$!)q`|5D9|y`xz2nVzTZ;`*rLKRRl6WJ)JmIm|gN5;KYKT->C2XZ4kQ z+&hYAHhBkqexu6yP5?)W2PU6q%ha;-@;=!r$3)KDCvGwQOJUsV9e02A**&jzdyy6t x1kJ0FyN{`Pb=912VD^+(U({`(NGZci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/demo/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/demo/ios/Runner/Base.lproj/LaunchScreen.storyboard b/demo/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/demo/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/ios/Runner/Base.lproj/Main.storyboard b/demo/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/demo/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/ios/Runner/Info.plist b/demo/ios/Runner/Info.plist new file mode 100644 index 0000000..07d96bc --- /dev/null +++ b/demo/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + demo + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/demo/ios/Runner/Runner-Bridging-Header.h b/demo/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/demo/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/demo/pubspec.yaml b/demo/pubspec.yaml index cb2dbbe..7d06fc8 100644 --- a/demo/pubspec.yaml +++ b/demo/pubspec.yaml @@ -1,6 +1,10 @@ name: demo description: Demo application showing the use cases of backdrop. +# The following line prevents the package from being accidentally published to +# pub.dev using `pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + # The following defines the version and build number for your application. # A version number is three numbers separated by dots, like 1.2.43 # followed by an optional build number separated by a +. @@ -11,14 +15,10 @@ description: Demo application showing the use cases of backdrop. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# -# This version is used _only_ for the Runner app, which is used if you just do -# a `flutter run` or a `flutter make-host-app-editable`. It has no impact -# on any other native host app that you embed your Flutter project into. version: 1.0.0+1 environment: - sdk: ">=2.2.0 <3.0.0" + sdk: ">=2.7.0 <3.0.0" dependencies: flutter: @@ -36,18 +36,25 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + flutter_launcher_icons: "^0.7.3" + +flutter_icons: + android: "ic_launcher" + ios: true + image_path: "assets/icon.png" # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec +# The following section is specific to Flutter. flutter: + # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. uses-material-design: true - # To add Flutter specific assets to your application, add an assets section, - # like this: + # To add assets to your application, add an assets section, like this: assets: - lib/use_cases/navigation/navigation.dart - lib/use_cases/contextual_info/contextual_info.dart @@ -60,9 +67,9 @@ flutter: # For details regarding adding assets from package dependencies, see # https://flutter.dev/assets-and-images/#from-packages - # To add Flutter specific custom fonts to your application, add a fonts - # section here, in this "flutter" section. Each entry in this list should - # have a "family" key with the font family name, and a "fonts" key with a + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a # list giving the asset and other descriptors for the font. For # example: # fonts: @@ -79,15 +86,3 @@ flutter: # # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages - - - # This section identifies your Flutter project as a module meant for - # embedding in a native host app. These identifiers should _not_ ordinarily - # be changed after generation - they are used to ensure that the tooling can - # maintain consistency when adding or modifying assets and plugins. - # They also do not have any bearing on your native host application's - # identifiers, which may be completely independent or the same as these. - module: - androidX: true - androidPackage: com.example.demo - iosBundleIdentifier: com.example.demo diff --git a/demo/settings.gradle b/demo/settings.gradle deleted file mode 100644 index c77f617..0000000 --- a/demo/settings.gradle +++ /dev/null @@ -1,3 +0,0 @@ - -// Generated file. Do not edit. -include ':.android' diff --git a/demo/web/icons/Icon-192.png b/demo/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a81bbcc727ab8c81899644dbfbbc7372035225 GIT binary patch literal 1279 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zf+;U^(XL;uunK>+PMp*;83%4t%`7 zx%kc;pWB-x&rLhMUC78srAj&f&IFC@j3lAEWyuR-r^c}~KHTayEhJo5W6|t2+6Qa6 zH;L+SP8DGH^PV%?>iM&qH!WjVOgJ2Op)lwC=bwKVpWpmxyZ^oA`OS0Zs(dS%!fdqa z6o&u<2LlTO69Z!dg9C#C17YsFIW?>1$67A>xBcA;%ge8Q`U6+Z6WQx6-&drk-mv9V ztXx;yTKSvbW_wPOm>DMiT>PAfU5b>R9rm``}$>ES4?tu={#` zgG}IyuQR7_Ec%)@p_AcN+S5m8>F0q9NF^nY9JrupU}5g zVveX57x2T~-|(^gIimi$|Jcv_>m}M4jHDcs*a&*{z}l1PZ#m=l z83?8O#q>4ab4ul(j}AEO+5YczM%5;P^LZJa%YK%c z*?Tj7`EMv=9sk?(+P1xN`Q__6j~zQ^{i(QS&u-3ldAnrx{HYA+>S?;4+; zc680N-*@Ad;i|cX^Wlp(OpK+Zq;mdBY>tjn z(&SM1dY!fNy|T(_+4gV`?2o&KaHv0 z+y6$)UA`;%YvcMw0WyXWj6OVXKa06OPpE(M!m1$pJTSKcb>qtS zE;YG8!?$v5)6eWynSNwlyUzdrp7%Jk#1EcRpVwcbmo9OS(dbte&;_U&SWE3|J*S+M zT;Jh#e)me5{aY1ztNiBmtT1a2VGlU<{Bcfj?V3A(+Kg+37w7t?*0FiMdFk=pJ9*NL uFZGi?mLJ@xefy(q9?WAJqKb6Mw<&;$UtO8cS! literal 0 HcmV?d00001 diff --git a/demo/web/icons/Icon-512.png b/demo/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..209f15b1f961b3f1ab303cfd2f06c2beb4ca52cb GIT binary patch literal 4492 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 Oz{3r5^7e_4KmHAj11(Dc literal 0 HcmV?d00001 diff --git a/demo/web/icons/favicon.png b/demo/web/icons/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..b7587dfe150fbc637c9065268df45c38e0ab2fd1 GIT binary patch literal 228 zcmV=|Nqax#K=gR0egRaV)(y*17=EO_`|@!NQ42$*jX5k eF?^$6AOZl)!z>dQ*EP2Q0000 + + + + + + + + + + + + + + + + demo + + + + + + + + diff --git a/demo/web/manifest.json b/demo/web/manifest.json new file mode 100644 index 0000000..e3b4330 --- /dev/null +++ b/demo/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "Backdrop Demo", + "short_name": "Backdrop", + "start_url": ".", + "display": "standalone", + "background_color": "#4D1F7C", + "theme_color": "#4D1F7C", + "description": "Demo application showing the use cases of backdrop.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} From 90bdf995cbde10e35b1544b6c0dca660778ed73c Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Wed, 8 Jul 2020 10:02:39 +0200 Subject: [PATCH 46/47] Improved android launcher icons by using image asset helper --- .../app/src/main/ic_launcher-playstore.png | Bin 0 -> 7181 bytes .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +++++ .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +++++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 719 -> 983 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 817 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 2834 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 524 -> 782 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 512 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 1774 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 830 -> 1367 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 1113 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 3972 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1184 -> 2142 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 1918 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 6386 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1430 -> 3059 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 2829 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 9349 bytes .../res/values/ic_launcher_background.xml | 4 ++++ demo/pubspec.yaml | 2 +- 20 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 demo/android/app/src/main/ic_launcher-playstore.png create mode 100644 demo/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 demo/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 demo/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 demo/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 demo/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 demo/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 demo/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 demo/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 demo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 demo/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 demo/android/app/src/main/res/values/ic_launcher_background.xml diff --git a/demo/android/app/src/main/ic_launcher-playstore.png b/demo/android/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..75c44d5711c0aa1cdeda046c813ece9df1cc83b0 GIT binary patch literal 7181 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 + + + + \ No newline at end of file diff --git a/demo/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/demo/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/demo/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/demo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/demo/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 76a145817449cfed6ae83c687c573a0213d3ab0a..23c0108e43949846310d013865f631dbf660eaa4 100644 GIT binary patch delta 962 zcmV;z13moD1=k0VBYy*)Nkl>@3p*(!nF%a{K|A1&TTHIOQ)2U-yh4|#G4XAnuS4NSt-rPD8!H2#?$+rRJ6kB z&X%6D=YhXR;dnUzpYJ(dy(0t%2L}g7-~%8bR;x@@VV%4(*?-wm(f;9icUyh|iz$g% zO*!;fLag<-Nx!LBP+|AX-8XJ(?XZ^^8?!Na2}g7*$mAeB)j$k|XIFGy2atqx845)U)JK7O?*XYP zD&x9(03;>tdVh_0foP{E9FT$Q>H(09wCJ>=UO^0~s-T+d>Jd<@R>v1e)~JRZipxGp zP*E00dX4;m4EZ&l1GQ)>`2uavzY0-%BYl$H35Ow|t&-;o$~SH-P@eCA^$Sgk!SE>`eo|AdW!UvMqD4}lh479q=c|94u=YRbV=>GRq1X?Y*<`W3CTC!V@ zBM<^15CS34{{%8lq(J$LQ&93W$!*e$kGMTYMPnRKf%L~B01B;8Ku$#l4A}AaTi1~{EB0-!ybJQ%jwz~yqSDTa3=YdX*2a6pzpOM!I428uQm!=&Brbs!eC zxkLCsF@Fqba?&S26$pet2!ucggg^*{KnR3D2!ucggg^*{KnR3D2;^r#U+3rG*_0g| zPUi}sFY~i7IAup524l8=0L$lba4rCS`!NstvDff%W*UJOk-F^fIVA1qODKQ)3MOW! z@ex}dr^^W)pT^+Aa|_t#X7C;KZzLDYIDXo*Xnng3o5Nl!J%n$$i?K(m(KTP;7JyS(;lXnC)oO}`zgs({A|dZZ~8{f0XAjY`jf z?%YgUx|pX+c~j!l{@#+=Sp`Iyna*|9=>pfgsW*TooHUdTaZ8b1uumkhEWCdzb8WPv zoPX=O?hhJBO=UpAbwNubx9atCE k$p<45NpNs*a0D^G00d8U>70N^lK=n!07*qoM6N<$f(%8(tpET3 literal 719 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2V4CLX;uuoF`1Y24hH#?Hv5(J- zE^avzwPJ0;f7jblj!UnV1&C-Rbx*die7&f-RAZf%h{$fMoh6~){j@lgf&^T2CoRg* zl~^RyY!<<(np;%G+B)M@u~}tpeuZ7~zdOGl&))4_?dv*cGq9NO0DY4QIdx6i_@tS?_DyInUZ z>iAhGBP_km;W@;V9u_INT<7~A)r4p3eST0Un0Yu`g7eB1Ip_5IAfd}2Z1QV(Ws_Vo zm~3aCO8St}{nk*cMeV|;pp)M?vblU0YzTt6#z1Vvjz+hiwJ-z2iRTo)JwD;)AzaQyP+h%>YQi~l*D zBJ{#Gr=)il`=?jQJ1S4Txv>B1jCl8U2^{{jXQ-ZE!@c-lnG-OfGI+ZBxvXGUqqc63QM-A4<`s;Ozth3nG(Nzn$t|5wD7z-wNt5+YUj=pXzdVa)o@W%a#7?8?BEFO*sOEp)>iMN zug{hm*G;l*o$*NEd`V8n?TyLD{5LHJDQy9&=9>74_v4YhrA{foobMEEi0a@FROAu_ z8KMM|ZvmRwAt1O2go5RgE?>_r{Bmv9jpCZhH+EshFIPtH+@W&b^PAMJ3`~A74E^?diYoXOic<%ds!|vcuOOJGPd$@JCf#M<(CKZR@P6 zs;U-Exwd`llrNRFd-n#0Z};iQoT@GN=H{_u8e4QKhB)AHTi`Sd+0|IKOLtJ=ezc9FK5a@ybPh1UmwSAj*;{JZo z)pGZH)0_YPGc~qdpTDc^*Wy)Q(`;may!gs{`M2E1+eccyclgwI1Umvl0_cxL;ACNO z+R3K&Q^=j1ta%?NztKE0Wmb6TR+Y^wit2azY+4`8j6L}=G<3bcv(NYjqYZx^NQI}X KpUXO@geCxS5@odj literal 0 HcmV?d00001 diff --git a/demo/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/demo/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..96d5318f65a6aa04e12c9bda31c1743728d84920 GIT binary patch literal 2834 zcmV+t3+?oYP)NHrLvJXEasN{OZ>#-g!W#l*$|Z5nla1+_6|Vq+jyEK`G`sJtrj z5@B}%K~Vugd8}yDj_ov=wwc8A5lJ$W_`nCcsXQ9i)AOHu58Q=C@9y4 zp7a0T{m*|Md+q`}%tVMAlh{~|RpHlrO+sUfi?vW!=gvOmCh0wo95D0*G!8$lrOL{_ zP*>ms=L??(onc#P-pnmuK@MB-0fnricgz`6WcaMti1)EV?}&hRJt|0Sr)zd?`h zQfU?CF3od;UBf&qZ^0IJFP0%qwtC}3PpGi88PpaGqX5=WDWe8nqlOcQ1j{&AP|C{0 zvZc+p^8;}@kCD3kxq|6%Ha~|Na?8?4y%}otZA^>?`l&Osb7u|rECut?Yb=kLU%1v$ z7Au?9fptlnpVN7i^vTufL#g65R5}ddMhYMt^B@iw%d~`5!|JxC(?bow+-uJ3{Apl4 zY5~UDQ&(2*iFHUoQ5{g1&ieIu`Y5AM$J5Gxn@V#hrPTz}9jJSvH?=UGtm)dLaB7MN zQiV=Qn$q_@2*tWs=%BA)I`$|eUQwNH0)0wfbtt7od{IjDW(laTpyu$zo`J*zUyW`a zbK?hijkYY4^v&6=x_BH;zu96^%d?iM<4L?gqhYRGI4DEbzD5E^`Kc}e6jI+q@!jjfb*b`%;B#gZP#E68yx~v zt3PE=H$LQz*T|Rvf7K;0NG2eu4W${Usby~V1LE#itJ`Gn7-wAEDzYhUCi!(vsH(Dh z&rjq7Vz%Ue4>frNic;UTuc`6L-s!`BH10IDk1cEj^xUEKRY|?L*fv0D z3wAb@IZcqhV~mB(HUTo~iyRptJ1-#7ChYo;A2`mMnruMry;kl_u}immPGt|El#dpY zVpD|rfP^{QJsPkH`pb)D=ReW9lmdFy zF+jYTolL(5k;{B7m{>&ak^{3G?YX4#Y{ohgSN;k~DT*QokHpH7U+vvQ_T_Dpoquof zIuJusm(Y)%Z}g9LXAZn5Ew zrhESI=L@7?wu69pcb}I~WEqD#wwP$?_~%0<0WHi*B8`oWsssA_#m`8;%w3KH!q1|V z3zUUN2NxcU{QUYsb>4rJ>f&7wkWL8H#|~TqAD<^W0yQ5Ly}N!WrFc!L9?azc@t*9& z!3KDJv1Gu=0qu(Rqk!)8dO&4aCfKk#s4JkIo5#|OO-gq2t_4V(xRz%&!G;x+x&qqq zcFDxsVQq7j;8J~H=8t~}XAUbQ*Xf3 z;3G`RG8{>|Wb1}bTL58``uxr<^2@&( z$=)yiL2k7)D<6Zn?zy|`!DnCyvn?dV!B-Mqe%X`$9R~AW410s`BwCpL7Mp12P^LB$+hJnCApQaIiPC zMWv*HY2)yh5B#-1ec=_zOQ;t|+h#Vl=maPrF_x@K-A5wRQ&g2D`*so!L!#w42Xzwm z`_yY^Pk$A47IjzsEoco)XHQ`iczRBS}1zmgmS7Y2@_;63~@xe`xW8Hr=c^>SKK1F*u;b}5ZY$?;MA{aBPL#T_e zx)Y)++$RO&3%p~QZm8o!fFn)rFpjnDkyL`UOBbwy)Zd=0D2`>3a8X*R8hf#hvfVA%f+TfM^ta=v28jqXk`59Y-Qb6F|WlDuK+n3v{UPZzxK> z3`bLM!tsN5nBXyO#?fqG;7}Ma;7PU?EPxxy#w&u16wmpxJeU{n5$^SPl%U){u%n^4q=HKh=nc3P k83m8=oUq)Yd6)tB|8XTgx#{McTmS$707*qoM6N<$g7UawKmY&$ literal 0 HcmV?d00001 diff --git a/demo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/demo/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index cc355f5b5b0678582986869998db3a243af0b0b2..c03f4fe22fdbda962d71135e8a37907e421f017c 100644 GIT binary patch delta 759 zcmV-dH)Y6_ZPxG}WjXjeTEXA`5&AnOgo9 z21p(jkFpy4j&W}CIiuirCcx(qBfd9fU|ITXpWu4q+LWv*MJJx>_SGt84*vw89}#@# zlNtJMO@irEO@B((i~ud?H$cB5q)C8tC-m6?sCWVemP=TCXfLigSf^U#BY)NajmI`F zIKYa_r%|V?z>2c(*CB?iUJBV!MF; zfrt2JB#6UldOaLO*WfeW)7R+xfq_R@%KSnBHoFuIMJ6$kNKDiBcpM*(kMf>roqSvF zTEqfuy=P-VBJ%`@aK8kQ01`j~NB{{S0VKfx1VDkGPK;qV`jrEOqu=;-EDc1{Phct* z!v|w;@qf;TAoj9O*E#nWnubp8wg{u2tUIoT+evf)5S5Qg7NKiTmM4=B5n7*G+6~(GF+599ecT(EhI|~*Xi{gJ9xz6 z)q^Jw{0j^U3(6muTdbVyW1*?6Cl%;vz*P4kFl+V1BOJ5tT&_~Qlb$(y+w;BtRr%-E z_FUf4XXf_ImO;y@!5oNWwE|WrR;0^MDqIr4`)k6@IQ6Ru^}-iQHD>Cl1eqv=Y8~N{ zwQl8UN)(TIrx#Qa7v}MPwgI=!`@Y1QTkc%`bEXtHu1a_;qP0KkMUlq@(OcoaxNoz_ z<)04NE&HMU#pNgFR^@`*x#sEyoCyukHGOxiHAnJkdi%xCQvdZe<=9ns@ojc^wnP5& zDYcNRcR$oc)is3|C)Gc=c=HeZHeu%hp9F@Fw@sAt^y5r<&6lR@w7TW2>06n+vq8l(LQ?AJy{oEKy?_5j zRUCTNk$+^I~J&KCO5xY@y|vae>L1DF5OAcvd@AXOUfnBGtOlVaP^y5=_n5O})!xvXSt?MUX?{pLCI`NAIuKd06iCnp1KfPtP#mmfc#z4xV<&1|#zmuCiP+E%X;arG-( zc9vUhMnV&(+KrBx(K9^46Gq%x^Ldf^>_PP z+ovbn?bL{f6Q2D1QrKq6zg2}7dY7}$|6RB4a^CUQlb@TOhH6f~@6K1*ocbYO?DoL?w?~4i zkDKR6)LFfIx3BZnyKH;e!$NOVpssjRKVzra?%35=zje=f<1?Eb7QPG&e$UjW*B9ho Sk^I*R67+QSb6Mw<&;$S~`r^p| literal 0 HcmV?d00001 diff --git a/demo/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/demo/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..1f14cd38df3b0041d791a45a50c5c40b0e3bd736 GIT binary patch literal 1774 zcmVF84B5J_ zE9)mLlMhEXww8A7(BMJ}`j>_+B!UqcQT9Ph7_@zTpZD&1*X`QgaigP6p7hdt@Av$E z@AL7#cUJ(dA40OAsc9U9OgZd3)kiuOuN||G!JvacAY1lapeYwFIA%hpeKs>Z#@}Se zQVhfzQ{ukHmmzrkGYB|qp~DpfzoUm*FLXHjnBg)0hUah$j>T)zE(Aj_o#miwEhXro z#O~5>qR!Yg9){tuPm=X9Y9Arbh2wy;5d5yI!$?KJXOAc{94oyRu@F?5)rYh& zJ5DU74!cC>jtKaj57@Wr2*_OPcXTlya=tZ_4>(JylW@$r&kf}*Vjz|n4fMfB!)rTE8DyywAuS%i-8ceNB0yiTfaK58Ycj-$6EJ+T+AOA+ z2t|c0^mw0Ra|}$TNFS{L-fz%}LI}9)w#0Eu+2{SXMX`dFq>a>a-A74b{Zg{8U7H~W zV#yb`T}Y)cd|$OB`8pxZd%wL)Qn0e%dF?f%;@1yJbL1mUh8T#IutNzPTFsXzGu;TT zBU8t=K}?-t3yw+w&RZW4`(N*C6M!5rmCn;tI$2#TpGtxvw`n2`+f}hQC+^)!1T{P+K6z{eps^^}2%I>)E}rmbI_XZ6JqQHY7Z6xmZNXT9z{`MSG@zE6UQyR#_yrR3QSb_2y)Kf4EILVyK&#Jax`W z0-;MJ5{V?V?twexH)_eo1S!UJiltZpexEX4q?{$KwAzph9$SwZ0n^)T!0ih16 zc9*amQ;Eog4v-gXwjBDI&rEq(epZ@~5>${cQQl?daz@_PE59sxJ`5Svq z(UbIMVLN*kgNlacT_uVGf{~L@6xIvFE z-?>fCh1ClXIM^$%P;SpNhAUT&OZHT5JZxOE0?r*9N|s8=A~1M=h2|Jr~30AK6w@rO+THZ2jYRVxg9Z zd{O~i+l)ec1A+3=3dSkrqeY=LaUpsZYRX;g9yI8R3>TrK28O~9n5nJ-^o2fg0uS$O zWL%Jw;^{yy ziNIJ?v@hqiSjb_gjd(kQnhY@zi}iZMMjz4AqHacZJQQs?LFP@l7r||8+mCu6%;(d@^H<&AA|K!h|Q4j zoQ8`?MCtRSSa0|9FZl%Gh-p0-g4OSQ!hE4m)oGKgunh(jflmVF>vk5G(>-~&L9u@^8O=y0fnko(e>*zt+0aDuma7vXI{5#G$-GVCf6HNGLTt82pF literal 0 HcmV?d00001 diff --git a/demo/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/demo/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 1730bbc37f12ac19e1deadbc3deeb081475c27ba..4bdcaba42cb20342ab50c9b135c7bc7067da873d 100644 GIT binary patch delta 1349 zcmb7=YdF&j0EdlPhE5ZjgKr*a<5%9%us zGa?P+$xs-{C7Mvmtu?F7Wt>PGr_-nN_57aq)9-mdy={;&^?Wlx)yUHgdy4W#$^^U$ zlMH%XMa*IP?~XTNjphC3U(Ha&3jId@OTyTvY+@zncB}=bpDgz=QmM%f%a5|qHJ~9e zFR#+&OI5BxK=0&;Yr_NG88-ndfqc<*{fi>q`0hC~bZy!KBK`fMlqW)enIx@UKHR== zYwlRKiP{wtHQc!!}RR(_-1AXd5t1#uJlcl@>U<(j1~%q z1~nPo?GDJvNBT=bsX#nfIrs)46MT6t^=sjkH=Sc|-gbh73Rp{)t>6S$pg;Q&H93~+DZ~FHYZxX4t7Rb$g{!& z-P@}V6uHD8qK}@zb{Kh5BRd0fSs}$%i=z!oL&~uvjiQ63=O6{lo&egGk|rJq*kzdv zQ3LecAH)siP+?$$@zLXPHD{~Fcbjw&7UN3yIDn*1&qn+W3uKaBwROR<78|%#@>U9{ z09~tIwD??SG%|wtcdyBk=7p{#6(n+(p22*OTz#wPSmgluiCin5O#qeET~>IGgp` zy+#S`LHYU<^Sz5b9Q{^U*+!t)dWJl>bCFJl8Pnlc1w?$RDc9cagM#w9NpU)+NvwLm zHu2g<4)2+0B^P4?^F7RaSMG-vC@B7On=VdofmLN>Q><=AMuw@LX3m+Rt5f(A2{5rX z(tUkaEI*_c=e7HLst0swn~M4)1QuS_8RxuJy)+e{gTa6oK$^h? z@wiK?$=A(fjXzE8C#=I@ABhaCF})*nL3XXN=U{h$2!KM5fc2Jix{B|phz9fcrKpNF z35NRg*1Z{>A8j!T9P0#y_dXvG0lF7bEi(6-eVe9lk4Ow}8{atVbLs^u^?SI$HzChP zf(%RgCRp(JSDPyrj;iYL{)U0GDUjBt%k>G$f3`%+2JDV@SgJZo&>x_A2G+$tq$L!Sl=z{z_wqhCuJ;j^To-LvGNGomv`nIzugU$Si z#Q8+5G5Igwe#hjrNZN=8yEw3aY5KxsMQgTZF;1`VY+v-me2Iy*t_!&(tJ0g*01n(xBbC4V&f4Cvq zDn@D8Ab6zf(&v-6+RhL3_0}U&k#7qJ(oJc*$0gdvB#XQoe9OV!iqIXdTJH#+o+-XK z96LRuUE($2SdhYscKaD<%W^mpHCi%n2ns!DM)@C(P7KT<@0eq v*YJnuV#ZpQE$XB$*Q==RFfbMdZgG~u-I7X+bL;fRl)lds@9kEL3%l|UQxtvn literal 830 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U}p7naSW+oe0%%6_vJ#F;~%eo zx4!;n_2PK5%RPxVRkYrOh=_6su5oVvaw-18LT6d4P=UFx#bTFacN}Tq(GM)?T%e($ z+!1g(Yo>KX$F7&3c7I#jA|(1NuO{yItJjRuJm2mr%GGj5_6frsvrbLQjZ4C^Or>i>YFb zz4=ey`HU%C4$ByTM4HWkX)VpijznEPt(T=BoYtRU=Wx5z*JEC`(cU+U*2T{|VEu`w zid!j|VUq)!g!Cz;M>itw3ncaj0l6ncm|b2U;!;=|%wWW-fI>tybe_>UcG-Ae-&vk? zL(_TRzusOJYO`$LQODBU6W4D&O|x;Zd%o!XDTy-I$r*X~-n}-x^pI!KWYwM^~;tYCq8bivy|lju;;mS)voG^8M$BoN^O4WXyTStuw>oA>mOz3&VAv# zbi%G`W{YRlJ(~>V7W{qjagy2o7{Ahz2T}1{%1Exa6n?rbz)5aw>`;{Tv(-RZwGQ|88oKdoE7@9R^LyxpdC+sq`gGNh&<;>f|P z2d5Wsv&!6w*#Dw9uePT9yL9QpUMCC^O2`-^UhfywV%xD}aj$LA zNhZ+)k6mBfs+QQ6dN7KyemiFjgTF>Yy0tfFO2bqaP|7)z)9@($*ybTRd#fAUu`7jV+RPka-uo7;1Be&CdIzFVdQ I&MBb@0N)j2F#rGn diff --git a/demo/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/demo/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..70cdf159c9f9b90f67d8884afd31002cdba997c8 GIT binary patch literal 1113 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 literal 1184 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 A)c^nh literal 0 HcmV?d00001 diff --git a/demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 7e4f51bdaa788e8162520f7a4bd852ec6f9cf7ae..f2415b91fb27931463869945469c8edd1093f263 100644 GIT binary patch literal 3059 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 Iq*u(p0n~pa<^TWy literal 1430 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zf+;V2$;3aSW+oe0w+1V-Bm#@sIy) z=T)^wZP|KuTc(Do@v7B|Gjcb$8EAH>Bwf8R`_8rQxX>%zRadWd2W~NY<(lBKcZHb9 z-W7WzO};5{$t3r*%?>=b)nwBq)9F=J*Gkhl)plmhJOBUX&suwh@9*9{|M-8EzRTpY zA8Yq8E}C?YnZcihA(M(|BfrAc+xb(|_kW!y=&39nts5`*TX@Hci284xAJ?p{cHf}FA#stkfySSU15_76T>rS zh6!%Ck(!`Gdidn;Ehj9?5^nH)_TD7LcxOjuCs07r!ZfYyQgy3+Cqu(e0fr@l$jG7N zUfm<@=&LcQ(%WL6+OpOwF?cAGg(h<+e2F>tt3PhT!~8@456^Ip?~5!;(fU#!6B9Rc z!&UQ;=-Opgcf|k6PvA^=^Jhx!j^EkVpWc1nR`fJ$_3HKdcM^9@w~z^mez$zdRhd;> zUrUR3dj3wh{yc2!oj326uiG~JeU#Lz*X}c280_bry`>%Pcgu9O(YJfQW6Ofo9&dVl zPnmt~(@&}2N-p2J5MNzWbLZa8{rA7w{#?X6=f}}gL8%M#I~M(5pI}~{TfKg5^zFRr zZ*R9MaO@G^>9PFsw}ABJTeoh#**yFG_Ac$>wCq=V(sy>(Gqf^ksZYE8?)m)5w*PLf z%g)=DKJRX7zx}TnH@Du){&Uo>!R4X#fo<*O5n59}%@dORUQ%-7p7^&LmG2b=1^zQ| z$**0z_MWlQ^KD;WuYJDT?!Dx@Bw2@>CtiF>c1~XWdD4rOYhx1+&J4b1eCMcDgXEt# z{Xace7|ygaDD(~i$=JyZBbG^qHEW2u#AN9~|z^ddYCBzi!I{j;`bN@$b{W6+PCKsrTSmz|zGY zZ}TUKVY<}8H;?aMEcmOWdo+e6K#9Av;qiB%))Gy@f799EK%`*Rw!HJL7$_=g` z@|9jlTc*#hwtMf!QJ0oDp@w1NOL!sF?++~$&1ULi*Ehqme$PL+49|{l0~5Drr?$(tN&a4Q}{5C zRk`7Ui1LpeOYdGfsd8Likwsw9sxGegoHLqnM3k>m!@GBR?>Q$L8yLK>RTKio`#zlw zHIbyhCQ7eWA^U-rBa!#d;{g+RC4R7rH TTRk^`A!tDnm{r-UW|>WN5q diff --git a/demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..20664f5657398be8d10d6532fc932cb3c84223c2 GIT binary patch literal 2829 zcmdT`c~n#963@aeiaxPG0#fu8kU)(hplsm@!m~hdfwDv(#U*N39tDC6OL%?KA`Of+1805FrU@6lDu30hFa65R5U%k|5~~`Z$$y-Z}5T9`8Bdx%17P`Q|rs zXXcx{edvJIMld4~2()_dKl~1WKwzeJ8R!9=Ry5K91TyN{>-YE2Q@vCDn0PVHil;b( z8>$XpHSJ^4wOi!Silq!*_!4$xl5?4Ie3PPS)!`q6kMqy{pp4r_*>>>zz^?H}t@MBU zVm!g<6ZPK=GK0)KSr)E2MUdfV4NeOgv}{b(3rl7zXZAFTHj>^PtbDVe%sRcOxt)FT zBmm)4dx*2W7v^g!f4YA?<@<-Yj*{A{obqn5m?L&^vpQMEFuC&dmP;^x(n!B5EH?Ie z7!?_bCL=6cy|Js)(zY?gBghj@y2fjfo3S9sF&$$c-UT8UVvB|7eUA0#fpi`lm=lSH zz_I{CmxY#z|4X{8mgp2U07KOE2J2lBAK(#xF_Z|S8F839(j!a8%Swm|z4h({q5G8w zx2jE%OQ#wXuS0^s&JaC=;*agy{t2j7$cMMR#ERS_@Wm7fa_z|cnY=^*D)UkC)NsE- zQ74TXSfEQ>wOa4J0$%UQ4+k3-6TwU5=h)>>%j939RAY~o+ST413k_e8Ri8x=vQ!gZ z$zzYiFJH!=r*W$|H&B65`D|MtHWG|Zd`n@PVs0>`MU}Lb6gFEEFxE6$+&K`@-r2R! zx&ZjcxWuE`B=%>FSNMxhQ5gXl@^c{qlBgfhjwrFVie8Twrwe7Hxy4}^v%A4hSTAPU zBDk+f=c%=Otn(@PX2Kgr8p~DgD46w$#4Tca=^Y#Id2E2EV$4N=a@R2~Ya7<*(VCN5wm@?hq78ZGO zPu1}q-EOA%*|)TMmsQ6N0xb0j4_PLgC(UgaMSD#FX@3L6~0-qflurCl~epi zFB!iQdvR^60cL@_b|0e^~h!|22d_$G; zZ$R&NIBxfKAG*)&G;_FB>L>Gu7NOy7>gJK0f>bHp_I_YxUXr^ zJP?@iPqVK|y)O?u!AVsm#MFrTlWtdG-!d8RukWg3yq5VG z>iRB7c8FfHT022#hljPmo$U*Z4MD&%)=mssrgpc){lNL3qA%#snO1tzp4gyjO+4GI+H|ykX6!Hl%?@hEZ#LuAb$z>E6_0-@6CxSFs!W GuRj1SissV* literal 0 HcmV?d00001 diff --git a/demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/demo/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..3c6062e60469eb7bf398d8876631983fd1a00d83 GIT binary patch literal 9349 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 bp|PjrHKwV;>VXf}iva3Rbd*0TT1WgJ(D0|W literal 0 HcmV?d00001 diff --git a/demo/android/app/src/main/res/values/ic_launcher_background.xml b/demo/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..4d28666 --- /dev/null +++ b/demo/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #00BFA5 + \ No newline at end of file diff --git a/demo/pubspec.yaml b/demo/pubspec.yaml index 7d06fc8..facc74b 100644 --- a/demo/pubspec.yaml +++ b/demo/pubspec.yaml @@ -39,7 +39,7 @@ dev_dependencies: flutter_launcher_icons: "^0.7.3" flutter_icons: - android: "ic_launcher" + android: false ios: true image_path: "assets/icon.png" From a81ab739597a992bf21db7cd404a2b5a05066157 Mon Sep 17 00:00:00 2001 From: Felix Wielander Date: Wed, 8 Jul 2020 10:03:31 +0200 Subject: [PATCH 47/47] Renamed android app to "Backdrop Gallery" --- demo/android/app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/android/app/src/main/AndroidManifest.xml b/demo/android/app/src/main/AndroidManifest.xml index 582cee0..31331cf 100644 --- a/demo/android/app/src/main/AndroidManifest.xml +++ b/demo/android/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ FlutterApplication and put your custom class here. -->