From 554d6ef0c78c7b30e504c134be5662aa47871efb Mon Sep 17 00:00:00 2001 From: erluxman Date: Tue, 23 Jun 2020 07:18:43 +0545 Subject: [PATCH 01/56] Add AnimatedScale Widget --- lib/utils/animation/animated_scale.dart | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 lib/utils/animation/animated_scale.dart diff --git a/lib/utils/animation/animated_scale.dart b/lib/utils/animation/animated_scale.dart new file mode 100644 index 0000000..bc065cd --- /dev/null +++ b/lib/utils/animation/animated_scale.dart @@ -0,0 +1,54 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +class AnimatedScale extends ImplicitlyAnimatedWidget { + const AnimatedScale({ + Key key, + this.child, + @required this.scale, + Curve curve = Curves.linear, + @required Duration duration, + VoidCallback onEnd, + this.alignment = Alignment.center, + }) : assert(scale != null && scale >= 0.0 && scale <= 1.0), + super(key: key, curve: curve, duration: duration, onEnd: onEnd); + + final Widget child; + + final double scale; + + final Alignment alignment; + + @override + _AnimatedScaleState createState() => _AnimatedScaleState(); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DoubleProperty('scale', scale)); + } +} + +class _AnimatedScaleState extends ImplicitlyAnimatedWidgetState { + Tween _scale; + Animation _scaleAnimation; + + @override + void forEachTween(TweenVisitor visitor) { + _scale = visitor(_scale, widget.scale, + (dynamic value) => Tween(begin: value as double)) + as Tween; + } + + @override + void didUpdateTweens() { + _scaleAnimation = animation.drive(_scale); + } + + @override + Widget build(BuildContext context) => ScaleTransition( + scale: _scaleAnimation, + alignment: widget.alignment, + child: widget.child, + ); +} \ No newline at end of file From d6ad8da4c546631ea06b14ede83651079a06866f Mon Sep 17 00:00:00 2001 From: erluxman Date: Tue, 23 Jun 2020 07:19:14 +0545 Subject: [PATCH 02/56] Improve the UI of Splash Screen --- lib/features/splash/spalash_screen.dart | 208 +++++++++++++++--------- 1 file changed, 129 insertions(+), 79 deletions(-) diff --git a/lib/features/splash/spalash_screen.dart b/lib/features/splash/spalash_screen.dart index 09b64d8..8e3e8e3 100644 --- a/lib/features/splash/spalash_screen.dart +++ b/lib/features/splash/spalash_screen.dart @@ -1,8 +1,9 @@ +import 'package:dartx/dartx.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:lottie/lottie.dart'; -import 'package:dartx/dartx.dart'; import 'package:productive/features/home/home_screen.dart'; +import 'package:productive/utils/animation/animated_scale.dart'; import 'package:productive/utils/extensions/navigation_extension.dart'; class SplashScreen extends StatefulWidget { @@ -13,12 +14,6 @@ class SplashScreen extends StatefulWidget { } class _SplashScreenState extends State { - @override - void initState() { - super.initState(); - context.navigateTo(const HomeScreen(), delay: 2.seconds); - } - @override Widget build(BuildContext context) { return const Scaffold( @@ -35,88 +30,143 @@ class SplashScreenBody extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.end, + children: const [ + Spacer(flex: 3), + PaperPlaneWidget(), + Spacer(flex: 3), + SplashLogo(), + Spacer(flex: 5), + LoginWithGoogle(), + Spacer(flex: 2) + ], + ); + } +} + +class PaperPlaneWidget extends StatelessWidget { + const PaperPlaneWidget(); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ - const Spacer( - flex: 3, + Lottie.asset( + 'assets/lottie/paper_plane.json', + height: 300, + width: 300, ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Lottie.asset( - 'assets/lottie/paper_plane.json', - height: 300, - width: 300, - ), + ], + ); + } +} + +class SplashLogo extends StatelessWidget { + const SplashLogo(); + + @override + Widget build(BuildContext context) { + return ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (Rect bound) { + return const LinearGradient( + colors: [ + Color(0xFF01A4FF), + Color(0xFF0186FF), ], + begin: Alignment(-1.0, -8.0), + end: Alignment(1.0, 4.0), + ).createShader(bound); + }, + child: Text( + "Productive", + style: TextStyle( + fontWeight: FontWeight.w700, + fontSize: 64, + color: Colors.blue, ), - const Spacer( - flex: 3, - ), - ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (Rect bound) { - return const LinearGradient( - colors: [ - Color(0xFF01A4FF), - Color(0xFF0186FF), + ), + ); + } +} + +class LoginWithGoogle extends StatefulWidget { + const LoginWithGoogle(); + + @override + _LoginWithGoogleState createState() => _LoginWithGoogleState(); +} + +class _LoginWithGoogleState extends State { + bool isPressed = false; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onLongPressStart: (details) { + setState(() { + isPressed = true; + }); + }, + onLongPressEnd: (details) { + setState(() { + isPressed = false; + }); + }, + onTapDown: (details) { + setState(() { + isPressed = true; + }); + }, + onTapUp: (details) { + setState(() { + isPressed = false; + }); + }, + onTap: () { + context.navigateTo(const HomeScreen()); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 48.0), + child: AnimatedScale( + duration: (isPressed ? 100 : 200).milliseconds, + scale: isPressed ? 0.95 : 1.0, + curve: Curves.decelerate, + child: AnimatedContainer( + duration: (isPressed ? 100 : 200).milliseconds, + curve: Curves.decelerate, + padding: + const EdgeInsets.only(top: 12, bottom: 8, left: 12, right: 12), + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: const Color(0x33CCCCCC), + blurRadius: isPressed ? 0 : 4, + offset: isPressed ? const Offset(0, 0) : const Offset(4, 4), + spreadRadius: isPressed ? 0 : 4) ], - begin: Alignment(-1.0, -8.0), - end: Alignment(1.0, 4.0), - ).createShader(bound); - }, - child: Text( - "Productive", - style: TextStyle( - fontWeight: FontWeight.w700, - fontSize: 64, - color: Colors.blue, + color: Colors.white, + borderRadius: BorderRadius.circular(200), ), - ), - ), - const Spacer( - flex: 5, - ), - InkWell( - onTap: () {}, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 48.0), - child: Container( - padding: const EdgeInsets.only( - top: 12, bottom: 8, left: 12, right: 12), - decoration: BoxDecoration( - boxShadow: const [ - BoxShadow( - color: Color(0x33CCCCCC), - blurRadius: 4, - offset: Offset(4, 4), - spreadRadius: 4) - ], - color: Colors.white, - borderRadius: BorderRadius.circular(200), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset("assets/images/google.svg"), - const SizedBox( - width: 16, - ), - Text( - "Continue with google", - style: TextStyle( - fontSize: 17, - fontWeight: FontWeight.w700, - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset("assets/images/google.svg"), + const SizedBox( + width: 16, + ), + Text( + "Continue with google", + style: TextStyle( + fontSize: 17, + fontWeight: FontWeight.w700, ), - ], - ), + ), + ], ), ), ), - const Spacer( - flex: 2, - ) - ], + ), ); } } From 24f48c571df6b01de62ebe5710f7b46470e9186a Mon Sep 17 00:00:00 2001 From: erluxman Date: Wed, 24 Jun 2020 06:47:19 +0545 Subject: [PATCH 03/56] added tests --- assets/images/stats.svg | 13 +++ assets/images/success.svg | 11 ++ lib/common/resources/strings.dart | 8 ++ lib/features/home/home_screen.dart | 132 +++++++++++++++++++++++- lib/features/splash/spalash_screen.dart | 10 +- lib/main.dart | 5 +- lib/utils/design/colors.dart | 17 +++ test/test_utils.dart | 6 ++ test/widget_test.dart | 37 ++++++- 9 files changed, 224 insertions(+), 15 deletions(-) create mode 100644 assets/images/stats.svg create mode 100644 assets/images/success.svg create mode 100644 lib/common/resources/strings.dart create mode 100644 lib/utils/design/colors.dart create mode 100644 test/test_utils.dart diff --git a/assets/images/stats.svg b/assets/images/stats.svg new file mode 100644 index 0000000..c5fc5aa --- /dev/null +++ b/assets/images/stats.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/assets/images/success.svg b/assets/images/success.svg new file mode 100644 index 0000000..07c6cc4 --- /dev/null +++ b/assets/images/success.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/lib/common/resources/strings.dart b/lib/common/resources/strings.dart new file mode 100644 index 0000000..8ce673d --- /dev/null +++ b/lib/common/resources/strings.dart @@ -0,0 +1,8 @@ + +class R{ + static Strings strings = Strings(); +} + +class Strings{ + String appName = "Productive"; +} \ No newline at end of file diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index d0d708b..e5d175d 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; class HomeScreen extends StatelessWidget { const HomeScreen(); @@ -6,15 +7,136 @@ class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - body: Center( - child: Text(Name(abc: "Laxman").abc), + body: const Center( + child: Text("Hello world"), + ), + appBar: AppBar( + title: const AppbarContent(), + leading: null, + ), + floatingActionButton: Padding( + padding: const EdgeInsets.symmetric(horizontal: 6), + child: RaisedButton( + onPressed: () {}, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(80.0)), + padding: const EdgeInsets.all(0.0), + child: Ink( + decoration: const BoxDecoration( + gradient: LinearGradient( + colors: [ + Color(0xFF00C2FF), + Color(0xFF0186FF), + ], + begin: Alignment(-1.0, -1.0), + end: Alignment(0.7, 0.7), + transform: GradientRotation(-3.14 / 4), + ), + borderRadius: BorderRadius.all(Radius.circular(80.0)), + ), + child: const Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), + child: Text( + '+ Add Todo', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + color: Colors.white, + fontWeight: FontWeight.w600), + ), + ), + ), + )), + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + bottomNavigationBar: const BottomNav(), + ); + } +} + +class BottomNav extends StatefulWidget { + const BottomNav({ + Key key, + }) : super(key: key); + + @override + _BottomNavState createState() => _BottomNavState(); +} + +class _BottomNavState extends State { + int selectedIndex = 0; + + @override + Widget build(BuildContext context) { + return Container( + decoration: const BoxDecoration(boxShadow: [ + BoxShadow( + color: Color(0x22CCCCCC), + offset: Offset(-4, -4), + blurRadius: 8, + spreadRadius: 8) + ]), + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(32), + topRight: Radius.circular(32), + ), + child: BottomAppBar( + elevation: 20, + shape: const AutomaticNotchedShape( + RoundedRectangleBorder(), + StadiumBorder( + side: BorderSide(), + ), + ), + child: Container( + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: const [ + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: Icon(Icons.home), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: Icon(Icons.pie_chart), + ) + ], + ), + ), + ), ), ); } } -class Name { - Name({this.abc = "Hello World"}); +class AppbarContent extends StatelessWidget { + const AppbarContent({ + Key key, + }) : super(key: key); - String abc; + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(200), + child: Image.network(johnDoeImage, height: 52, width: 52), + ), + const Text( + "Todo", + style: TextStyle(fontSize: 28, fontWeight: FontWeight.w600), + ), + SvgPicture.asset( + "assets/images/success.svg", + height: 32, + width: 32, + ) + ], + ); + } } + +String johnDoeImage = + "https://themes.themewaves.com/nuzi/wp-content/uploads/sites/4/2013/05/Team-Member-3.jpg"; diff --git a/lib/features/splash/spalash_screen.dart b/lib/features/splash/spalash_screen.dart index 8e3e8e3..2d6a4e9 100644 --- a/lib/features/splash/spalash_screen.dart +++ b/lib/features/splash/spalash_screen.dart @@ -2,6 +2,7 @@ import 'package:dartx/dartx.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:lottie/lottie.dart'; +import 'package:productive/common/resources/strings.dart'; import 'package:productive/features/home/home_screen.dart'; import 'package:productive/utils/animation/animated_scale.dart'; import 'package:productive/utils/extensions/navigation_extension.dart'; @@ -71,15 +72,16 @@ class SplashLogo extends StatelessWidget { shaderCallback: (Rect bound) { return const LinearGradient( colors: [ - Color(0xFF01A4FF), + Color(0xFF00C2FF), Color(0xFF0186FF), ], - begin: Alignment(-1.0, -8.0), - end: Alignment(1.0, 4.0), + begin: Alignment(-1.0, -1.0), + end: Alignment(0.7, 0.7), + transform: GradientRotation(-3.14 / 4), ).createShader(bound); }, child: Text( - "Productive", + R.strings.appName, style: TextStyle( fontWeight: FontWeight.w700, fontSize: 64, diff --git a/lib/main.dart b/lib/main.dart index 598676a..2b606ff 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:productive/features/splash/spalash_screen.dart'; +import 'package:productive/utils/design/colors.dart'; + void main() { runApp(ProductiveApp()); } @@ -9,8 +11,7 @@ class ProductiveApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( theme: ThemeData( - fontFamily: 'Product Sans', - ), + fontFamily: 'Product Sans', primarySwatch: whiteMaterialColor), debugShowCheckedModeBanner: false, home: const SplashScreen(), ); diff --git a/lib/utils/design/colors.dart b/lib/utils/design/colors.dart new file mode 100644 index 0000000..7e3aae0 --- /dev/null +++ b/lib/utils/design/colors.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +const MaterialColor whiteMaterialColor = MaterialColor( + 0xFFFFFFFF, + { + 50: Color(0xFFFFFFFF), + 100: Color(0xFFFFFFFF), + 200: Color(0xFFFFFFFF), + 300: Color(0xFFFFFFFF), + 400: Color(0xFFFFFFFF), + 500: Color(0xFFFFFFFF), + 600: Color(0xFFFFFFFF), + 700: Color(0xFFFFFFFF), + 800: Color(0xFFFFFFFF), + 900: Color(0xFFFFFFFF), + }, +); diff --git a/test/test_utils.dart b/test/test_utils.dart new file mode 100644 index 0000000..4357711 --- /dev/null +++ b/test/test_utils.dart @@ -0,0 +1,6 @@ +import 'package:flutter/material.dart'; + +extension TestWidget on Widget { + Widget get testWidget => + Directionality(textDirection: TextDirection.ltr, child: this); +} diff --git a/test/widget_test.dart b/test/widget_test.dart index c9ce1fd..d1130be 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,9 +1,38 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:lottie/lottie.dart'; +import 'package:productive/common/resources/strings.dart'; +import 'package:productive/features/splash/spalash_screen.dart'; import 'package:productive/main.dart'; +import 'package:productive/utils/animation/animated_scale.dart'; + +import 'test_utils.dart'; + void main() { - testWidgets('App Follows MaterialTheme', (WidgetTester tester) async { - await tester.pumpWidget(ProductiveApp()); - expect(find.byType(MaterialApp), findsOneWidget); + group("Basic App Setup test", () { + testWidgets('App Follows MaterialTheme', (WidgetTester tester) async { + await tester.pumpWidget(ProductiveApp()); + expect(find.byType(MaterialApp), findsOneWidget); + }); }); -} \ No newline at end of file + + group("Splash Screen Tests", () { + testWidgets("There is Lottie Widget", (WidgetTester tester) async { + await tester.pumpWidget(const SplashScreenBody().testWidget); + expect(find.byType(LottieBuilder), findsOneWidget); + }); + + testWidgets("There is a Productive Text Logo", (WidgetTester tester) async { + await tester.pumpWidget(const SplashScreenBody().testWidget); + expect(find.byType(ShaderMask), findsOneWidget); + expect(find.text(R.strings.appName), findsOneWidget); + }); + + testWidgets("There is a Google Sign in Button", + (WidgetTester tester) async { + await tester.pumpWidget(const SplashScreenBody().testWidget); + expect(find.byType(AnimatedScale), findsOneWidget); + expect(find.text("Continue with google"), findsOneWidget); + }); + }); +} From 083aacfe0e8b06fdbd235030e2f1ee15d252cb2a Mon Sep 17 00:00:00 2001 From: erluxman Date: Wed, 24 Jun 2020 07:45:45 +0545 Subject: [PATCH 04/56] compelted designing the bottom navbar --- assets/images/home.svg | 3 + assets/images/stats.svg | 12 +-- lib/common/resources/strings.dart | 15 ++-- lib/features/home/home_screen.dart | 82 ++++++++++--------- ...spalash_screen.dart => splash_screen.dart} | 29 ++----- lib/main.dart | 4 +- lib/utils/extensions/gradient_extensions.dart | 48 +++++++++++ test/widget_test.dart | 2 +- 8 files changed, 117 insertions(+), 78 deletions(-) create mode 100644 assets/images/home.svg rename lib/features/splash/{spalash_screen.dart => splash_screen.dart} (87%) create mode 100644 lib/utils/extensions/gradient_extensions.dart diff --git a/assets/images/home.svg b/assets/images/home.svg new file mode 100644 index 0000000..fc25f0b --- /dev/null +++ b/assets/images/home.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/stats.svg b/assets/images/stats.svg index c5fc5aa..6191e14 100644 --- a/assets/images/stats.svg +++ b/assets/images/stats.svg @@ -1,13 +1,7 @@ - - - + + + - - - - - - diff --git a/lib/common/resources/strings.dart b/lib/common/resources/strings.dart index 8ce673d..43ec320 100644 --- a/lib/common/resources/strings.dart +++ b/lib/common/resources/strings.dart @@ -1,8 +1,13 @@ - -class R{ +class R { static Strings strings = Strings(); + static SVGImages svgImages = SVGImages(); +} + +class Strings { + String appName = "Productive"; } -class Strings{ - String appName = "Productive"; -} \ No newline at end of file +class SVGImages { + String homeIcon = "assets/images/home.svg"; + String statsIcon = "assets/images/stats.svg"; +} diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index e5d175d..4ba7716 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; - +import 'package:productive/common/resources/strings.dart'; +import 'package:productive/utils/extensions/gradient_extensions.dart'; class HomeScreen extends StatelessWidget { const HomeScreen(); @@ -14,45 +15,42 @@ class HomeScreen extends StatelessWidget { title: const AppbarContent(), leading: null, ), - floatingActionButton: Padding( - padding: const EdgeInsets.symmetric(horizontal: 6), - child: RaisedButton( - onPressed: () {}, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(80.0)), - padding: const EdgeInsets.all(0.0), - child: Ink( - decoration: const BoxDecoration( - gradient: LinearGradient( - colors: [ - Color(0xFF00C2FF), - Color(0xFF0186FF), - ], - begin: Alignment(-1.0, -1.0), - end: Alignment(0.7, 0.7), - transform: GradientRotation(-3.14 / 4), - ), - borderRadius: BorderRadius.all(Radius.circular(80.0)), - ), - child: const Padding( - padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), - child: Text( - '+ Add Todo', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - color: Colors.white, - fontWeight: FontWeight.w600), - ), - ), - ), - )), + floatingActionButton: const Fab(), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: const BottomNav(), ); } } +class Fab extends StatelessWidget { + const Fab({ + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 6), + child: RaisedButton( + onPressed: () {}, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(80.0)), + padding: const EdgeInsets.all(0.0), + child: const Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), + child: Text( + '+ Add Todo', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + color: Colors.white, + fontWeight: FontWeight.w600), + ), + ).withBlueGradientBg(), + )); + } +} + class BottomNav extends StatefulWidget { const BottomNav({ Key key, @@ -70,7 +68,7 @@ class _BottomNavState extends State { return Container( decoration: const BoxDecoration(boxShadow: [ BoxShadow( - color: Color(0x22CCCCCC), + color: Color(0x33CCCCCC), offset: Offset(-4, -4), blurRadius: 8, spreadRadius: 8) @@ -92,14 +90,18 @@ class _BottomNavState extends State { padding: const EdgeInsets.all(16.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: const [ + children: [ Padding( - padding: EdgeInsets.symmetric(horizontal: 16.0), - child: Icon(Icons.home), + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: SvgPicture.asset( + R.svgImages.homeIcon, + ).withGreyGradientFg(), ), Padding( - padding: EdgeInsets.symmetric(horizontal: 16.0), - child: Icon(Icons.pie_chart), + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: SvgPicture.asset( + R.svgImages.statsIcon, + ).withBlueGradientFg(), ) ], ), diff --git a/lib/features/splash/spalash_screen.dart b/lib/features/splash/splash_screen.dart similarity index 87% rename from lib/features/splash/spalash_screen.dart rename to lib/features/splash/splash_screen.dart index 2d6a4e9..8429a17 100644 --- a/lib/features/splash/spalash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -6,6 +6,7 @@ import 'package:productive/common/resources/strings.dart'; import 'package:productive/features/home/home_screen.dart'; import 'package:productive/utils/animation/animated_scale.dart'; import 'package:productive/utils/extensions/navigation_extension.dart'; +import 'package:productive/utils/extensions/gradient_extensions.dart'; class SplashScreen extends StatefulWidget { const SplashScreen(); @@ -67,28 +68,14 @@ class SplashLogo extends StatelessWidget { @override Widget build(BuildContext context) { - return ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (Rect bound) { - return const LinearGradient( - colors: [ - Color(0xFF00C2FF), - Color(0xFF0186FF), - ], - begin: Alignment(-1.0, -1.0), - end: Alignment(0.7, 0.7), - transform: GradientRotation(-3.14 / 4), - ).createShader(bound); - }, - child: Text( - R.strings.appName, - style: TextStyle( - fontWeight: FontWeight.w700, - fontSize: 64, - color: Colors.blue, - ), + return Text( + R.strings.appName, + style: TextStyle( + fontWeight: FontWeight.w700, + fontSize: 64, + color: Colors.blue, ), - ); + ).withBlueGradientFg(); } } diff --git a/lib/main.dart b/lib/main.dart index 2b606ff..874c5f4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:productive/features/splash/spalash_screen.dart'; +import 'package:productive/features/home/home_screen.dart'; import 'package:productive/utils/design/colors.dart'; void main() { @@ -13,7 +13,7 @@ class ProductiveApp extends StatelessWidget { theme: ThemeData( fontFamily: 'Product Sans', primarySwatch: whiteMaterialColor), debugShowCheckedModeBanner: false, - home: const SplashScreen(), + home: const HomeScreen(), ); } } diff --git a/lib/utils/extensions/gradient_extensions.dart b/lib/utils/extensions/gradient_extensions.dart new file mode 100644 index 0000000..43308f0 --- /dev/null +++ b/lib/utils/extensions/gradient_extensions.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; + +extension WidgetUnderGradient on Widget { + Widget withBlueGradientFg() { + return _getShadedWidget(blueLinearGradient); + } + + Widget withGreyGradientFg() { + return _getShadedWidget(greyLinearGradient); + } + + Widget _getShadedWidget(LinearGradient gradient) { + return ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (Rect bound) { + return gradient.createShader(bound); + }, + child: this, + ); + } + + Widget withBlueGradientBg( + {BorderRadiusGeometry borderRadius = + const BorderRadius.all(Radius.circular(200.0))}) { + return Ink( + decoration: BoxDecoration( + gradient: blueLinearGradient, + borderRadius: borderRadius, + ), + child: this, + ); + } +} + +LinearGradient blueLinearGradient = getLinearGradient(_blueGradientColors); +LinearGradient greyLinearGradient = getLinearGradient(_greyGradientColors); + +LinearGradient getLinearGradient(List colors) { + return LinearGradient( + colors: colors, + begin: const Alignment(-1.0, -1.0), + end: const Alignment(0.7, 0.7), + transform: const GradientRotation(-3.14 / 3), + ); +} + +const List _blueGradientColors = [Color(0xFF0186FF), Color(0xFF00C2FF)]; +const List _greyGradientColors = [Color(0xFFD0D1D1), Color(0xFF8E9496)]; diff --git a/test/widget_test.dart b/test/widget_test.dart index d1130be..ecbe092 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:lottie/lottie.dart'; import 'package:productive/common/resources/strings.dart'; -import 'package:productive/features/splash/spalash_screen.dart'; +import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/main.dart'; import 'package:productive/utils/animation/animated_scale.dart'; From 44ea612185c123408b5eb9059bc81796494e60c6 Mon Sep 17 00:00:00 2001 From: erluxman Date: Wed, 24 Jun 2020 07:50:54 +0545 Subject: [PATCH 05/56] Remove the leading < button on appbar of home --- lib/features/home/home_screen.dart | 10 +++++----- lib/main.dart | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index 4ba7716..744fb8c 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:productive/common/resources/strings.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; + class HomeScreen extends StatelessWidget { const HomeScreen(); @@ -12,9 +13,8 @@ class HomeScreen extends StatelessWidget { child: Text("Hello world"), ), appBar: AppBar( - title: const AppbarContent(), - leading: null, - ), + title: const AppbarContent(), + automaticallyImplyLeading: false), floatingActionButton: const Fab(), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: const BottomNav(), @@ -33,8 +33,8 @@ class Fab extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 6), child: RaisedButton( onPressed: () {}, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(80.0)), + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)), padding: const EdgeInsets.all(0.0), child: const Padding( padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), diff --git a/lib/main.dart b/lib/main.dart index 874c5f4..b28cbbe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:productive/features/home/home_screen.dart'; +import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/utils/design/colors.dart'; void main() { @@ -13,7 +14,7 @@ class ProductiveApp extends StatelessWidget { theme: ThemeData( fontFamily: 'Product Sans', primarySwatch: whiteMaterialColor), debugShowCheckedModeBanner: false, - home: const HomeScreen(), + home: const SplashScreen(), ); } } From a0faa2d18fdd1e664829d743ea554fd0fb13d32f Mon Sep 17 00:00:00 2001 From: erluxman Date: Wed, 24 Jun 2020 12:00:26 +0545 Subject: [PATCH 06/56] removed debug tag for animated scale --- lib/features/home/home_screen.dart | 144 ------------------ lib/features/home/widgets/home_app_bar.dart | 76 +++++++++ lib/features/home/widgets/home_body.dart | 12 ++ .../home/widgets/home_bottom_nav_bar.dart | 63 ++++++++ lib/features/home/widgets/home_fab.dart | 29 ++++ lib/features/home/widgets/home_screen.dart | 21 +++ lib/features/splash/splash_screen.dart | 2 +- lib/main.dart | 4 +- lib/utils/animation/animated_scale.dart | 6 - lib/utils/extensions/gradient_extensions.dart | 4 +- 10 files changed, 206 insertions(+), 155 deletions(-) delete mode 100644 lib/features/home/home_screen.dart create mode 100644 lib/features/home/widgets/home_app_bar.dart create mode 100644 lib/features/home/widgets/home_body.dart create mode 100644 lib/features/home/widgets/home_bottom_nav_bar.dart create mode 100644 lib/features/home/widgets/home_fab.dart create mode 100644 lib/features/home/widgets/home_screen.dart diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart deleted file mode 100644 index 744fb8c..0000000 --- a/lib/features/home/home_screen.dart +++ /dev/null @@ -1,144 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:productive/common/resources/strings.dart'; -import 'package:productive/utils/extensions/gradient_extensions.dart'; - -class HomeScreen extends StatelessWidget { - const HomeScreen(); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: const Center( - child: Text("Hello world"), - ), - appBar: AppBar( - title: const AppbarContent(), - automaticallyImplyLeading: false), - floatingActionButton: const Fab(), - floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, - bottomNavigationBar: const BottomNav(), - ); - } -} - -class Fab extends StatelessWidget { - const Fab({ - Key key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 6), - child: RaisedButton( - onPressed: () {}, - shape: - RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)), - padding: const EdgeInsets.all(0.0), - child: const Padding( - padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), - child: Text( - '+ Add Todo', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - color: Colors.white, - fontWeight: FontWeight.w600), - ), - ).withBlueGradientBg(), - )); - } -} - -class BottomNav extends StatefulWidget { - const BottomNav({ - Key key, - }) : super(key: key); - - @override - _BottomNavState createState() => _BottomNavState(); -} - -class _BottomNavState extends State { - int selectedIndex = 0; - - @override - Widget build(BuildContext context) { - return Container( - decoration: const BoxDecoration(boxShadow: [ - BoxShadow( - color: Color(0x33CCCCCC), - offset: Offset(-4, -4), - blurRadius: 8, - spreadRadius: 8) - ]), - child: ClipRRect( - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(32), - topRight: Radius.circular(32), - ), - child: BottomAppBar( - elevation: 20, - shape: const AutomaticNotchedShape( - RoundedRectangleBorder(), - StadiumBorder( - side: BorderSide(), - ), - ), - child: Container( - padding: const EdgeInsets.all(16.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: SvgPicture.asset( - R.svgImages.homeIcon, - ).withGreyGradientFg(), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: SvgPicture.asset( - R.svgImages.statsIcon, - ).withBlueGradientFg(), - ) - ], - ), - ), - ), - ), - ); - } -} - -class AppbarContent extends StatelessWidget { - const AppbarContent({ - Key key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ClipRRect( - borderRadius: BorderRadius.circular(200), - child: Image.network(johnDoeImage, height: 52, width: 52), - ), - const Text( - "Todo", - style: TextStyle(fontSize: 28, fontWeight: FontWeight.w600), - ), - SvgPicture.asset( - "assets/images/success.svg", - height: 32, - width: 32, - ) - ], - ); - } -} - -String johnDoeImage = - "https://themes.themewaves.com/nuzi/wp-content/uploads/sites/4/2013/05/Team-Member-3.jpg"; diff --git a/lib/features/home/widgets/home_app_bar.dart b/lib/features/home/widgets/home_app_bar.dart new file mode 100644 index 0000000..f5e20de --- /dev/null +++ b/lib/features/home/widgets/home_app_bar.dart @@ -0,0 +1,76 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +class AppbarContent extends StatelessWidget { + const AppbarContent({Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Stack( + alignment: Alignment.center, + children: [ + const MotivationMeter(motivation: 0.8), + ClipRRect( + borderRadius: BorderRadius.circular(200), + child: Image.network(johnDoeImage, height: 32, width: 32), + ), + ], + ), + const Text( + "Todo", + style: TextStyle(fontSize: 28, fontWeight: FontWeight.w600), + ), + SvgPicture.asset( + "assets/images/success.svg", + height: 32, + width: 32, + ) + ], + ); + } +} + +class MotivationMeter extends StatelessWidget { + const MotivationMeter({ + this.motivation, + Key key, + }) : assert(motivation <= 1.0 && motivation >= 0), + super(key: key); + + final double motivation; + + @override + Widget build(BuildContext context) { + return Container( + height: 58, + width: 58, + decoration: ShapeDecoration( + shape: const CircleBorder(), + gradient: SweepGradient( + colors: [ + const Color(0xFF0286FF), + const Color(0xFF0290FF), + const Color(0xFF0199FF), + const Color(0xFF01AAFF), + const Color(0xFF01BBFF), + const Color(0xFF00C2FF), + const Color(0xFF00C2FF), + Colors.transparent, + ], + startAngle: pi / 2, + endAngle: 2 * motivation * pi, + transform: const GradientRotation(3 * pi / 2))), + ); + } +} + +AppBar homeAppbar = + AppBar(title: const AppbarContent(), automaticallyImplyLeading: false); + +String johnDoeImage = + "https://themes.themewaves.com/nuzi/wp-content/uploads/sites/4/2013/05/Team-Member-3.jpg"; diff --git a/lib/features/home/widgets/home_body.dart b/lib/features/home/widgets/home_body.dart new file mode 100644 index 0000000..f598582 --- /dev/null +++ b/lib/features/home/widgets/home_body.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +class HomeBody extends StatelessWidget { + const HomeBody({Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const Center( + child: Text("Hello world"), + ); + } +} diff --git a/lib/features/home/widgets/home_bottom_nav_bar.dart b/lib/features/home/widgets/home_bottom_nav_bar.dart new file mode 100644 index 0000000..cbc4b3f --- /dev/null +++ b/lib/features/home/widgets/home_bottom_nav_bar.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:productive/common/resources/strings.dart'; +import 'package:productive/utils/extensions/gradient_extensions.dart'; + +class BottomNav extends StatefulWidget { + const BottomNav({Key key}) : super(key: key); + + @override + _BottomNavState createState() => _BottomNavState(); +} + +class _BottomNavState extends State { + int selectedIndex = 0; + + @override + Widget build(BuildContext context) { + return Container( + decoration: const BoxDecoration(boxShadow: [ + BoxShadow( + color: Color(0x33CCCCCC), + offset: Offset(-4, -4), + blurRadius: 8, + spreadRadius: 8) + ]), + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(32), + topRight: Radius.circular(32), + ), + child: BottomAppBar( + elevation: 20, + shape: const AutomaticNotchedShape( + RoundedRectangleBorder(), + StadiumBorder( + side: BorderSide(), + ), + ), + child: Container( + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: SvgPicture.asset( + R.svgImages.homeIcon, + ).withGreyGradientFg(), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: SvgPicture.asset( + R.svgImages.statsIcon, + ).withBlueGradientFg(), + ) + ], + ), + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/features/home/widgets/home_fab.dart b/lib/features/home/widgets/home_fab.dart new file mode 100644 index 0000000..cd08fa1 --- /dev/null +++ b/lib/features/home/widgets/home_fab.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:productive/utils/extensions/gradient_extensions.dart'; + +class Fab extends StatelessWidget { + const Fab({Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 6), + child: RaisedButton( + onPressed: () {}, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)), + padding: const EdgeInsets.all(0.0), + child: const Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), + child: Text( + '+ Add Todo', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + color: Colors.white, + fontWeight: FontWeight.w600), + ), + ).withBlueGradientBg(), + )); + } +} diff --git a/lib/features/home/widgets/home_screen.dart b/lib/features/home/widgets/home_screen.dart new file mode 100644 index 0000000..6ba31cf --- /dev/null +++ b/lib/features/home/widgets/home_screen.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:productive/features/home/widgets/home_body.dart'; + +import 'home_app_bar.dart'; +import 'home_bottom_nav_bar.dart'; +import 'home_fab.dart'; + +class HomeScreen extends StatelessWidget { + const HomeScreen(); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: const HomeBody(), + appBar: homeAppbar, + floatingActionButton: const Fab(), + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + bottomNavigationBar: const BottomNav(), + ); + } +} diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index 8429a17..7cb21bd 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:lottie/lottie.dart'; import 'package:productive/common/resources/strings.dart'; -import 'package:productive/features/home/home_screen.dart'; +import 'package:productive/features/home/widgets/home_screen.dart'; import 'package:productive/utils/animation/animated_scale.dart'; import 'package:productive/utils/extensions/navigation_extension.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; diff --git a/lib/main.dart b/lib/main.dart index b28cbbe..b5cb539 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:productive/features/home/home_screen.dart'; +import 'package:productive/features/home/widgets/home_screen.dart'; import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/utils/design/colors.dart'; @@ -14,7 +14,7 @@ class ProductiveApp extends StatelessWidget { theme: ThemeData( fontFamily: 'Product Sans', primarySwatch: whiteMaterialColor), debugShowCheckedModeBanner: false, - home: const SplashScreen(), + home: const HomeScreen(), ); } } diff --git a/lib/utils/animation/animated_scale.dart b/lib/utils/animation/animated_scale.dart index bc065cd..d30bc3e 100644 --- a/lib/utils/animation/animated_scale.dart +++ b/lib/utils/animation/animated_scale.dart @@ -21,12 +21,6 @@ class AnimatedScale extends ImplicitlyAnimatedWidget { @override _AnimatedScaleState createState() => _AnimatedScaleState(); - - @override - void debugFillProperties(DiagnosticPropertiesBuilder properties) { - super.debugFillProperties(properties); - properties.add(DoubleProperty('scale', scale)); - } } class _AnimatedScaleState extends ImplicitlyAnimatedWidgetState { diff --git a/lib/utils/extensions/gradient_extensions.dart b/lib/utils/extensions/gradient_extensions.dart index 43308f0..cbfbd10 100644 --- a/lib/utils/extensions/gradient_extensions.dart +++ b/lib/utils/extensions/gradient_extensions.dart @@ -32,7 +32,7 @@ extension WidgetUnderGradient on Widget { } } -LinearGradient blueLinearGradient = getLinearGradient(_blueGradientColors); +LinearGradient blueLinearGradient = getLinearGradient(blueGradientColors); LinearGradient greyLinearGradient = getLinearGradient(_greyGradientColors); LinearGradient getLinearGradient(List colors) { @@ -44,5 +44,5 @@ LinearGradient getLinearGradient(List colors) { ); } -const List _blueGradientColors = [Color(0xFF0186FF), Color(0xFF00C2FF)]; +const List blueGradientColors = [Color(0xFF0186FF), Color(0xFF00C2FF)]; const List _greyGradientColors = [Color(0xFFD0D1D1), Color(0xFF8E9496)]; From 9fe67b31ed90f13dcad1e1af878dc737ef49b953 Mon Sep 17 00:00:00 2001 From: erluxman Date: Wed, 24 Jun 2020 12:28:13 +0545 Subject: [PATCH 07/56] removed an unused import --- lib/main.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index b5cb539..23d59ea 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; -import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/utils/design/colors.dart'; void main() { From 5bd512990db0487f89e80dd4d26c9b3f8284c98b Mon Sep 17 00:00:00 2001 From: erluxman Date: Wed, 24 Jun 2020 12:36:13 +0545 Subject: [PATCH 08/56] Improved test for MaterialApp --- lib/main.dart | 9 +++++---- test/widget_test.dart | 4 +++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 23d59ea..eeeca5c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,18 +2,19 @@ import 'package:flutter/material.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; import 'package:productive/utils/design/colors.dart'; -void main() { - runApp(ProductiveApp()); -} +void main() => runApp(const ProductiveApp()); class ProductiveApp extends StatelessWidget { + const ProductiveApp({Key key, this.testChild}) : super(key: key); + final Widget testChild; + @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData( fontFamily: 'Product Sans', primarySwatch: whiteMaterialColor), debugShowCheckedModeBanner: false, - home: const HomeScreen(), + home: testChild ?? const HomeScreen(), ); } } diff --git a/test/widget_test.dart b/test/widget_test.dart index ecbe092..91d0d48 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -11,7 +11,9 @@ import 'test_utils.dart'; void main() { group("Basic App Setup test", () { testWidgets('App Follows MaterialTheme', (WidgetTester tester) async { - await tester.pumpWidget(ProductiveApp()); + await tester.pumpWidget(ProductiveApp( + testChild: Container(), + )); expect(find.byType(MaterialApp), findsOneWidget); }); }); From a79ccffe17b9eb01fbc8f4faa65b6e795016be3c Mon Sep 17 00:00:00 2001 From: erluxman Date: Thu, 25 Jun 2020 15:00:52 +0545 Subject: [PATCH 09/56] Add sound effects on splashscreen --- assets/sounds/point.mp3 | Bin 0 -> 78688 bytes assets/sounds/wind.mp3 | Bin 0 -> 297699 bytes ios/Runner.xcodeproj/project.pbxproj | 8 ++ lib/features/home/widgets/home_app_bar.dart | 130 ++++++++++++++---- lib/features/splash/splash_screen.dart | 20 ++- lib/main.dart | 3 +- .../extensions/navigation_extension.dart | 16 ++- pubspec.yaml | 3 + 8 files changed, 146 insertions(+), 34 deletions(-) create mode 100644 assets/sounds/point.mp3 create mode 100644 assets/sounds/wind.mp3 diff --git a/assets/sounds/point.mp3 b/assets/sounds/point.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d130ccefd1a13b286ca35905b2095bf8fa30e66e GIT binary patch literal 78688 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 VSe4fNr-uF)e%Am0%76ZW{|hc*dK&-$ literal 0 HcmV?d00001 diff --git a/assets/sounds/wind.mp3 b/assets/sounds/wind.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e20ee10614039e9eebdd001c56959981fae94dfe GIT binary patch literal 297699 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 #FrL_*ZNqQPF!ynC08`Xp~ck122t&&zbM+YvpC$ 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⁣HBLNNyWA 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 Ro=wH@wnF|SlCVPvs-lj*a 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[ - const MotivationMeter(motivation: 0.8), + const AnimatedMotivationMeter( + motivation: 0.6, + height: 42, + width: 42, + ), ClipRRect( borderRadius: BorderRadius.circular(200), - child: Image.network(johnDoeImage, height: 32, width: 32), + child: CachedNetworkImage( + imageUrl: johnDoeImage, + placeholder: (context, url) => + const CircularProgressIndicator(), + errorWidget: (context, url, error) => Icon(Icons.error), + height: 36, + width: 36, + ), ), ], ), @@ -35,42 +49,110 @@ class AppbarContent extends StatelessWidget { } } -class MotivationMeter extends StatelessWidget { - const MotivationMeter({ +class AnimatedMotivationMeter extends StatefulWidget { + const AnimatedMotivationMeter({ this.motivation, + this.height, + this.width, Key key, }) : assert(motivation <= 1.0 && motivation >= 0), super(key: key); final double motivation; + final double height; + final double width; + + @override + _AnimatedMotivationMeterState createState() => + _AnimatedMotivationMeterState(); +} + +class _AnimatedMotivationMeterState extends State + with SingleTickerProviderStateMixin { + Animation animation; + AnimationController controller; + final _audioPlayer = AssetsAudioPlayer(); + + @override + void initState() { + super.initState(); + super.initState(); + _audioPlayer.open(Audio("assets/sounds/point.mp3")); + controller = AnimationController( + vsync: this, duration: const Duration(milliseconds: 2000)); + animation = Tween( + begin: widget.motivation * 0.5, + end: widget.motivation, + ).chain(CurveTween(curve: Curves.decelerate)).animate(controller) + ..addListener(() { + setState(() {}); + }); + + controller.forward(); + } @override Widget build(BuildContext context) { - return Container( - height: 58, - width: 58, - decoration: ShapeDecoration( - shape: const CircleBorder(), - gradient: SweepGradient( - colors: [ - const Color(0xFF0286FF), - const Color(0xFF0290FF), - const Color(0xFF0199FF), - const Color(0xFF01AAFF), - const Color(0xFF01BBFF), - const Color(0xFF00C2FF), - const Color(0xFF00C2FF), - Colors.transparent, - ], - startAngle: pi / 2, - endAngle: 2 * motivation * pi, - transform: const GradientRotation(3 * pi / 2))), + return CustomPaint( + willChange: true, + painter: CircleProgressPainter(widget.motivation, animation.value), + size: Size(widget.width, widget.height), ); } + + @override + void dispose() { + super.dispose(); + _audioPlayer.dispose(); + } +} + +class CircleProgressPainter extends CustomPainter { + CircleProgressPainter(this.maxMotivation, this.animatingMotivation) { + endAngle = pi * 2 * min(animatingMotivation, 0.95); + } + + final double startAngle = -pi / 2; + final double gradientRotationAngle = -pi / 2 - 0.14; + double endAngle; + final double maxMotivation; + final double animatingMotivation; + Paint _ink; + + @override + void paint(Canvas canvas, Size size) { + _ink ??= Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = 6 + ..strokeCap = StrokeCap.round + ..shader = SweepGradient( + colors: blueGradientColors, + startAngle: startAngle, + endAngle: endAngle, + transform: GradientRotation(gradientRotationAngle)) + .createShader( + Rect.fromCenter( + center: Offset(size.height / 2, size.width / 2), + width: size.width, + height: size.height), + ); + canvas.drawArc( + Rect.fromCenter( + center: Offset(size.height / 2, size.width / 2), + width: size.width, + height: size.height), + startAngle, + endAngle, + false, + _ink); + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) => true; } AppBar homeAppbar = AppBar(title: const AppbarContent(), automaticallyImplyLeading: false); String johnDoeImage = - "https://themes.themewaves.com/nuzi/wp-content/uploads/sites/4/2013/05/Team-Member-3.jpg"; + "https://pbs.twimg.com/profile_images/1057989852942270464/bt45DHmR.jpg"; diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index 7cb21bd..5d165c8 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -1,3 +1,4 @@ +import 'package:assets_audio_player/assets_audio_player.dart'; import 'package:dartx/dartx.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -5,8 +6,8 @@ import 'package:lottie/lottie.dart'; import 'package:productive/common/resources/strings.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; import 'package:productive/utils/animation/animated_scale.dart'; -import 'package:productive/utils/extensions/navigation_extension.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; +import 'package:productive/utils/extensions/navigation_extension.dart'; class SplashScreen extends StatefulWidget { const SplashScreen(); @@ -16,12 +17,27 @@ class SplashScreen extends StatefulWidget { } class _SplashScreenState extends State { + final _audioPlayer = AssetsAudioPlayer(); + + @override + void initState() { + super.initState(); + _audioPlayer.open(Audio("assets/sounds/wind.mp3"), + loopMode: LoopMode.single); + } + @override Widget build(BuildContext context) { return const Scaffold( body: SplashScreenBody(), ); } + + @override + void dispose() { + super.dispose(); + _audioPlayer.dispose(); + } } class SplashScreenBody extends StatelessWidget { @@ -113,7 +129,7 @@ class _LoginWithGoogleState extends State { }); }, onTap: () { - context.navigateTo(const HomeScreen()); + context.navigateTo(const HomeScreen(), replace: true); }, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 48.0), diff --git a/lib/main.dart b/lib/main.dart index eeeca5c..d107f5f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; +import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/utils/design/colors.dart'; void main() => runApp(const ProductiveApp()); @@ -14,7 +15,7 @@ class ProductiveApp extends StatelessWidget { theme: ThemeData( fontFamily: 'Product Sans', primarySwatch: whiteMaterialColor), debugShowCheckedModeBanner: false, - home: testChild ?? const HomeScreen(), + home: testChild ?? const SplashScreen(), ); } } diff --git a/lib/utils/extensions/navigation_extension.dart b/lib/utils/extensions/navigation_extension.dart index 14a7ec6..8bd205b 100644 --- a/lib/utils/extensions/navigation_extension.dart +++ b/lib/utils/extensions/navigation_extension.dart @@ -1,13 +1,15 @@ -import 'package:flutter/material.dart'; import 'package:dartx/dartx.dart'; +import 'package:flutter/material.dart'; extension NavigationExtension on BuildContext { - Future navigateTo( - Widget destination, { - Duration delay = const Duration(), - }) async { + Future navigateTo(Widget destination, + {Duration delay = const Duration(), bool replace = false}) async { await delay.delay; - Navigator.of(this) - .push(MaterialPageRoute(builder: (context) => destination)); + final route = MaterialPageRoute(builder: (context) => destination); + if (replace) { + Navigator.of(this).pushReplacement(route); + } else { + Navigator.of(this).push(route); + } } } diff --git a/pubspec.yaml b/pubspec.yaml index 6ae2cd3..59bd42b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: google_fonts: ^1.1.0 flutter_svg: ^0.17.4 lottie: ^0.4.0+1 + cached_network_image: ^2.2.0+1 #Architecture rxdart: ^0.24.1 @@ -22,6 +23,7 @@ dependencies: #Utils dartx: ^0.4.2 + assets_audio_player: ^2.0.6+4 dev_dependencies: flutter_test: @@ -33,6 +35,7 @@ flutter: assets: - assets/lottie/ - assets/images/ + - assets/sounds/ fonts: - family: Product Sans From c9fe80f06a47c2543c5442c00df9bc99ece1e08b Mon Sep 17 00:00:00 2001 From: erluxman Date: Thu, 25 Jun 2020 17:33:35 +0545 Subject: [PATCH 10/56] some animation --- lib/features/home/widgets/home_app_bar.dart | 1 - .../home/widgets/home_bottom_nav_bar.dart | 46 +++++- lib/features/home/widgets/home_fab.dart | 44 +++--- lib/features/home/widgets/home_screen.dart | 8 +- lib/features/splash/splash_screen.dart | 139 ++++++------------ lib/main.dart | 1 - .../animation/animated_scale_button.dart | 104 +++++++++++++ lib/utils/extensions/gradient_extensions.dart | 6 +- .../extensions/navigation_extension.dart | 18 ++- 9 files changed, 240 insertions(+), 127 deletions(-) create mode 100644 lib/utils/animation/animated_scale_button.dart diff --git a/lib/features/home/widgets/home_app_bar.dart b/lib/features/home/widgets/home_app_bar.dart index f7a399e..2308cb0 100644 --- a/lib/features/home/widgets/home_app_bar.dart +++ b/lib/features/home/widgets/home_app_bar.dart @@ -87,7 +87,6 @@ class _AnimatedMotivationMeterState extends State ..addListener(() { setState(() {}); }); - controller.forward(); } diff --git a/lib/features/home/widgets/home_bottom_nav_bar.dart b/lib/features/home/widgets/home_bottom_nav_bar.dart index cbc4b3f..a4eeb60 100644 --- a/lib/features/home/widgets/home_bottom_nav_bar.dart +++ b/lib/features/home/widgets/home_bottom_nav_bar.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:productive/common/resources/strings.dart'; +import 'package:productive/utils/animation/animated_scale_button.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; class BottomNav extends StatefulWidget { @@ -11,8 +12,21 @@ class BottomNav extends StatefulWidget { } class _BottomNavState extends State { + NavButtonsState navState = + const NavButtonsState(selectedIndex: 0, pressedIndex: -1); + int selectedIndex = 0; + void _selectPage(int index) { + setState(() { + selectedIndex = index; + }); + } + + void _selectHome() => _selectPage(0); + + void _selectStats() => _selectPage(1); + @override Widget build(BuildContext context) { return Container( @@ -41,17 +55,27 @@ class _BottomNavState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), + ScaleOnPressWidget( + scaleFactor: 0.8, + onTap: _selectHome, + outerPadding: const EdgeInsets.all(16), child: SvgPicture.asset( R.svgImages.homeIcon, - ).withGreyGradientFg(), + height: selectedIndex == 0 ? 32 : 24, + ).getShadedWidget(selectedIndex == 0 + ? blueLinearGradient + : greyLinearGradient), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), + ScaleOnPressWidget( + scaleFactor: 0.8, + onTap: _selectStats, + outerPadding: const EdgeInsets.all(16), child: SvgPicture.asset( R.svgImages.statsIcon, - ).withBlueGradientFg(), + height: selectedIndex == 1 ? 32 : 24, + ).getShadedWidget(selectedIndex == 1 + ? blueLinearGradient + : greyLinearGradient), ) ], ), @@ -60,4 +84,12 @@ class _BottomNavState extends State { ), ); } -} \ No newline at end of file +} + +class NavButtonsState { + const NavButtonsState({this.selectedIndex, this.pressedIndex}); + + final int selectedIndex; + final int pressedIndex; + +} diff --git a/lib/features/home/widgets/home_fab.dart b/lib/features/home/widgets/home_fab.dart index cd08fa1..c341d4d 100644 --- a/lib/features/home/widgets/home_fab.dart +++ b/lib/features/home/widgets/home_fab.dart @@ -1,29 +1,33 @@ import 'package:flutter/material.dart'; +import 'package:productive/features/home/widgets/home_screen.dart'; +import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; - +import 'package:productive/utils/extensions/navigation_extension.dart'; class Fab extends StatelessWidget { const Fab({Key key}) : super(key: key); @override Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 6), - child: RaisedButton( - onPressed: () {}, - shape: - RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)), - padding: const EdgeInsets.all(0.0), - child: const Padding( - padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), - child: Text( - '+ Add Todo', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 18, - color: Colors.white, - fontWeight: FontWeight.w600), - ), - ).withBlueGradientBg(), - )); + return RaisedButton( + color: Colors.transparent, + splashColor: Colors.transparent, + onPressed: () { + context.navigateTo(const SplashScreen()); + }, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)), + padding: const EdgeInsets.all(0.0), + child: const Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 12), + child: Text( + '+ Add Todo', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + color: Colors.white, + fontWeight: FontWeight.w600), + ), + ).withBlueGradientBg(), + ); } } diff --git a/lib/features/home/widgets/home_screen.dart b/lib/features/home/widgets/home_screen.dart index 6ba31cf..cacf4e0 100644 --- a/lib/features/home/widgets/home_screen.dart +++ b/lib/features/home/widgets/home_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:productive/features/home/widgets/home_body.dart'; +import 'package:productive/utils/animation/animated_scale_button.dart'; import 'home_app_bar.dart'; import 'home_bottom_nav_bar.dart'; @@ -13,7 +14,12 @@ class HomeScreen extends StatelessWidget { return Scaffold( body: const HomeBody(), appBar: homeAppbar, - floatingActionButton: const Fab(), + floatingActionButton: const Padding( + padding: EdgeInsets.symmetric(horizontal: 2,vertical: 2), + child: ScaleOnPressWidget( + child: Fab(), + ), + ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: const BottomNav(), ); diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index 5d165c8..781ba01 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -1,11 +1,10 @@ import 'package:assets_audio_player/assets_audio_player.dart'; -import 'package:dartx/dartx.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:lottie/lottie.dart'; import 'package:productive/common/resources/strings.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; -import 'package:productive/utils/animation/animated_scale.dart'; +import 'package:productive/utils/animation/animated_scale_button.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; import 'package:productive/utils/extensions/navigation_extension.dart'; @@ -22,8 +21,12 @@ class _SplashScreenState extends State { @override void initState() { super.initState(); - _audioPlayer.open(Audio("assets/sounds/wind.mp3"), - loopMode: LoopMode.single); + _audioPlayer.open( + Audio("assets/sounds/wind.mp3"), + loopMode: LoopMode.single, + playInBackground: PlayInBackground.disabledRestoreOnForeground, + seek: const Duration(seconds: 2), + ); } @override @@ -48,14 +51,45 @@ class SplashScreenBody extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.end, - children: const [ - Spacer(flex: 3), - PaperPlaneWidget(), - Spacer(flex: 3), - SplashLogo(), - Spacer(flex: 5), - LoginWithGoogle(), - Spacer(flex: 2) + children: [ + const Spacer(flex: 3), + const PaperPlaneWidget(), + const Spacer(flex: 3), + const SplashLogo(), + const Spacer(flex: 5), + ScaleOnPressWidget( + onTap: () { + context.navigateTo(const HomeScreen(), replace: true); + }, + outerPadding: const EdgeInsets.symmetric(horizontal: 48.0), + innerPadding: + const EdgeInsets.only(top: 12, bottom: 8, left: 12, right: 12), + child: const SignInWithGoogleButton()), + const Spacer(flex: 2) + ], + ); + } +} + +class SignInWithGoogleButton extends StatelessWidget { + const SignInWithGoogleButton({Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset("assets/images/google.svg"), + const SizedBox( + width: 16, + ), + Text( + "Continue with google", + style: TextStyle( + fontSize: 17, + fontWeight: FontWeight.w700, + ), + ), ], ); } @@ -94,84 +128,3 @@ class SplashLogo extends StatelessWidget { ).withBlueGradientFg(); } } - -class LoginWithGoogle extends StatefulWidget { - const LoginWithGoogle(); - - @override - _LoginWithGoogleState createState() => _LoginWithGoogleState(); -} - -class _LoginWithGoogleState extends State { - bool isPressed = false; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onLongPressStart: (details) { - setState(() { - isPressed = true; - }); - }, - onLongPressEnd: (details) { - setState(() { - isPressed = false; - }); - }, - onTapDown: (details) { - setState(() { - isPressed = true; - }); - }, - onTapUp: (details) { - setState(() { - isPressed = false; - }); - }, - onTap: () { - context.navigateTo(const HomeScreen(), replace: true); - }, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 48.0), - child: AnimatedScale( - duration: (isPressed ? 100 : 200).milliseconds, - scale: isPressed ? 0.95 : 1.0, - curve: Curves.decelerate, - child: AnimatedContainer( - duration: (isPressed ? 100 : 200).milliseconds, - curve: Curves.decelerate, - padding: - const EdgeInsets.only(top: 12, bottom: 8, left: 12, right: 12), - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: const Color(0x33CCCCCC), - blurRadius: isPressed ? 0 : 4, - offset: isPressed ? const Offset(0, 0) : const Offset(4, 4), - spreadRadius: isPressed ? 0 : 4) - ], - color: Colors.white, - borderRadius: BorderRadius.circular(200), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset("assets/images/google.svg"), - const SizedBox( - width: 16, - ), - Text( - "Continue with google", - style: TextStyle( - fontSize: 17, - fontWeight: FontWeight.w700, - ), - ), - ], - ), - ), - ), - ), - ); - } -} diff --git a/lib/main.dart b/lib/main.dart index d107f5f..5d6c1c2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:productive/features/home/widgets/home_screen.dart'; import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/utils/design/colors.dart'; diff --git a/lib/utils/animation/animated_scale_button.dart b/lib/utils/animation/animated_scale_button.dart new file mode 100644 index 0000000..00028ee --- /dev/null +++ b/lib/utils/animation/animated_scale_button.dart @@ -0,0 +1,104 @@ +import 'package:dartx/dartx.dart'; +import 'package:flutter/material.dart'; + +import 'animated_scale.dart'; + +class ScaleOnPressWidget extends StatefulWidget { + const ScaleOnPressWidget( + {this.child, + this.onTap, + this.outerPadding = EdgeInsets.zero, + this.innerPadding = EdgeInsets.zero, + this.scaleFactor = 0.95}); + + final Widget child; + final GestureTapCallback onTap; + final EdgeInsets outerPadding; + final EdgeInsets innerPadding; + final double scaleFactor; + + @override + _ScaleOnPressWidgetState createState() => _ScaleOnPressWidgetState(); +} + +class _ScaleOnPressWidgetState extends State { + bool isPressed = false; + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onLongPressStart: (details) { + setState(() { + isPressed = true; + }); + }, + onLongPressEnd: (details) { + setState(() { + isPressed = false; + }); + }, + onTapDown: (details) { + setState(() { + isPressed = true; + }); + }, + onTapUp: (details) { + setState(() { + isPressed = false; + }); + }, + onLongPress: () { + setState(() { + isPressed = true; + }); + }, + onLongPressUp: () { + setState(() { + isPressed = false; + }); + }, + onSecondaryTapUp: (details) { + setState(() { + isPressed = false; + }); + }, + onDoubleTap: () { + setState(() { + isPressed = true; + }); + }, + onTap: () { + widget.onTap(); + setState(() { + isPressed = true; + }); + }, + child: Padding( + padding: widget.outerPadding, + child: AnimatedScale( + duration: (isPressed ? 50 : 200).milliseconds, + scale: isPressed ? widget.scaleFactor : 1.0, + curve: Curves.decelerate, + child: AnimatedContainer( + duration: (isPressed ? 50 : 200).milliseconds, + curve: Curves.decelerate, + padding: widget.innerPadding, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: const Color(0x33CCCCCC), + blurRadius: isPressed ? 0 : 4, + offset: isPressed ? const Offset(0, 0) : const Offset(4, 4), + spreadRadius: isPressed ? 0 : 4) + ], + color: Colors.white, + borderRadius: BorderRadius.circular(200), + ), + child: widget.child, + ), + ), + ), + ); + } +} diff --git a/lib/utils/extensions/gradient_extensions.dart b/lib/utils/extensions/gradient_extensions.dart index cbfbd10..0df611f 100644 --- a/lib/utils/extensions/gradient_extensions.dart +++ b/lib/utils/extensions/gradient_extensions.dart @@ -2,14 +2,14 @@ import 'package:flutter/material.dart'; extension WidgetUnderGradient on Widget { Widget withBlueGradientFg() { - return _getShadedWidget(blueLinearGradient); + return getShadedWidget(blueLinearGradient); } Widget withGreyGradientFg() { - return _getShadedWidget(greyLinearGradient); + return getShadedWidget(greyLinearGradient); } - Widget _getShadedWidget(LinearGradient gradient) { + Widget getShadedWidget(LinearGradient gradient) { return ShaderMask( blendMode: BlendMode.srcIn, shaderCallback: (Rect bound) { diff --git a/lib/utils/extensions/navigation_extension.dart b/lib/utils/extensions/navigation_extension.dart index 8bd205b..c51aa31 100644 --- a/lib/utils/extensions/navigation_extension.dart +++ b/lib/utils/extensions/navigation_extension.dart @@ -5,7 +5,23 @@ extension NavigationExtension on BuildContext { Future navigateTo(Widget destination, {Duration delay = const Duration(), bool replace = false}) async { await delay.delay; - final route = MaterialPageRoute(builder: (context) => destination); + final route = PageRouteBuilder( + pageBuilder: (context, animation, secondaryAnimation) => destination, + transitionsBuilder: (context, animation, secondaryAnimation, child) { + const begin = Offset(1.0, 0.0); + final end = Offset.zero; + final curve = Curves.decelerate; + + final tween = + Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); + + return SlideTransition( + position: animation.drive(tween), + child: child, + ); + }, + ); + if (replace) { Navigator.of(this).pushReplacement(route); } else { From dd3da7da0c88a3bc038f5648f46b66fac7908307 Mon Sep 17 00:00:00 2001 From: erluxman Date: Thu, 25 Jun 2020 18:42:10 +0545 Subject: [PATCH 11/56] Bottom nav bar icons animation done --- .../home/widgets/home_bottom_nav_bar.dart | 97 ++++++++++++++----- .../animation/animated_scale_button.dart | 7 +- 2 files changed, 76 insertions(+), 28 deletions(-) diff --git a/lib/features/home/widgets/home_bottom_nav_bar.dart b/lib/features/home/widgets/home_bottom_nav_bar.dart index a4eeb60..1c4e88e 100644 --- a/lib/features/home/widgets/home_bottom_nav_bar.dart +++ b/lib/features/home/widgets/home_bottom_nav_bar.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:productive/common/resources/strings.dart'; +import 'package:productive/utils/animation/animated_scale.dart'; import 'package:productive/utils/animation/animated_scale_button.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; @@ -15,11 +16,15 @@ class _BottomNavState extends State { NavButtonsState navState = const NavButtonsState(selectedIndex: 0, pressedIndex: -1); - int selectedIndex = 0; - void _selectPage(int index) { setState(() { - selectedIndex = index; + navState = navState.copyWith(selectedIndex: index); + }); + } + + void _touchIcon(int index) { + setState(() { + navState = navState.copyWith(pressedIndex: index); }); } @@ -27,6 +32,10 @@ class _BottomNavState extends State { void _selectStats() => _selectPage(1); + void _touchHomeIcon() => _touchIcon(0); + + void _touchStatsIcon() => _touchIcon(1); + @override Widget build(BuildContext context) { return Container( @@ -55,27 +64,35 @@ class _BottomNavState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ScaleOnPressWidget( - scaleFactor: 0.8, + GestureDetector( + behavior: HitTestBehavior.opaque, onTap: _selectHome, - outerPadding: const EdgeInsets.all(16), - child: SvgPicture.asset( - R.svgImages.homeIcon, - height: selectedIndex == 0 ? 32 : 24, - ).getShadedWidget(selectedIndex == 0 - ? blueLinearGradient - : greyLinearGradient), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: AnimatedScale( + duration: _getDuration(0, navState), + scale: _getScale(0, navState), + child: SvgPicture.asset( + R.svgImages.homeIcon, + height: 32, + ).getShadedWidget(_getGradient(0, navState)), + ), + ), ), - ScaleOnPressWidget( - scaleFactor: 0.8, + GestureDetector( + behavior: HitTestBehavior.opaque, onTap: _selectStats, - outerPadding: const EdgeInsets.all(16), - child: SvgPicture.asset( - R.svgImages.statsIcon, - height: selectedIndex == 1 ? 32 : 24, - ).getShadedWidget(selectedIndex == 1 - ? blueLinearGradient - : greyLinearGradient), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: AnimatedScale( + duration: _getDuration(1, navState), + scale: _getScale(1, navState), + child: SvgPicture.asset( + R.svgImages.statsIcon, + height: 32, + ).getShadedWidget(_getGradient(1, navState)), + ), + ), ) ], ), @@ -84,6 +101,27 @@ class _BottomNavState extends State { ), ); } + + LinearGradient _getGradient(int buttonIndex, NavButtonsState navState) { + return buttonIndex == navState.selectedIndex + ? blueLinearGradient + : greyLinearGradient; + } + + Duration _getDuration(int buttonIndex, NavButtonsState navState) { + final bool toEnlarge = buttonIndex == navState.selectedIndex || + buttonIndex != navState.pressedIndex; + return Duration(milliseconds: toEnlarge ? 200 : 50); + } + + double _getScale(int buttonIndex, NavButtonsState navState) { + if (buttonIndex == navState.pressedIndex && + buttonIndex == navState.selectedIndex) return 0.8; + if (buttonIndex == navState.pressedIndex) return 0.6; + if (buttonIndex != navState.pressedIndex && + buttonIndex != navState.selectedIndex) return 0.8; + return 1.0; + } } class NavButtonsState { @@ -91,5 +129,20 @@ class NavButtonsState { final int selectedIndex; final int pressedIndex; - + + NavButtonsState copyWith({ + int selectedIndex, + int pressedIndex, + }) { + if ((selectedIndex == null || + identical(selectedIndex, this.selectedIndex)) && + (pressedIndex == null || identical(pressedIndex, this.pressedIndex))) { + return this; + } + + return NavButtonsState( + selectedIndex: selectedIndex ?? this.selectedIndex, + pressedIndex: pressedIndex ?? this.pressedIndex, + ); + } } diff --git a/lib/utils/animation/animated_scale_button.dart b/lib/utils/animation/animated_scale_button.dart index 00028ee..6decc16 100644 --- a/lib/utils/animation/animated_scale_button.dart +++ b/lib/utils/animation/animated_scale_button.dart @@ -68,12 +68,7 @@ class _ScaleOnPressWidgetState extends State { isPressed = true; }); }, - onTap: () { - widget.onTap(); - setState(() { - isPressed = true; - }); - }, + onTap: widget.onTap, child: Padding( padding: widget.outerPadding, child: AnimatedScale( From 544c53d91e7fc5fc8bba33de57a7edfe31e33ab9 Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 26 Jun 2020 06:57:27 +0545 Subject: [PATCH 12/56] removed unused imprt --- lib/common/resources/strings.dart | 12 +++++++ lib/features/home/widgets/home_app_bar.dart | 8 ++--- .../home/widgets/home_bottom_nav_bar.dart | 34 ++++++++++++------- lib/features/home/widgets/home_fab.dart | 9 ++--- lib/features/splash/splash_screen.dart | 1 + 5 files changed, 42 insertions(+), 22 deletions(-) diff --git a/lib/common/resources/strings.dart b/lib/common/resources/strings.dart index 43ec320..0554a14 100644 --- a/lib/common/resources/strings.dart +++ b/lib/common/resources/strings.dart @@ -1,13 +1,25 @@ class R { static Strings strings = Strings(); static SVGImages svgImages = SVGImages(); + static LottieFiles lottieFiles = LottieFiles(); + static AudioFiles audioFiles = AudioFiles(); } class Strings { String appName = "Productive"; + String loginWithGoogle = "Login With Google"; } class SVGImages { String homeIcon = "assets/images/home.svg"; String statsIcon = "assets/images/stats.svg"; } + +class LottieFiles { + String paperPlane = "assets/lottie/paper_plane.json"; +} + +class AudioFiles { + String splashBreeze = "assets/sounds/wind.mp3"; + String welcomeTone = "assets/sounds/point.mp3"; +} diff --git a/lib/features/home/widgets/home_app_bar.dart b/lib/features/home/widgets/home_app_bar.dart index 2308cb0..c0f280a 100644 --- a/lib/features/home/widgets/home_app_bar.dart +++ b/lib/features/home/widgets/home_app_bar.dart @@ -19,8 +19,8 @@ class AppbarContent extends StatelessWidget { children: [ const AnimatedMotivationMeter( motivation: 0.6, - height: 42, - width: 42, + height: 46, + width: 46, ), ClipRRect( borderRadius: BorderRadius.circular(200), @@ -29,8 +29,8 @@ class AppbarContent extends StatelessWidget { placeholder: (context, url) => const CircularProgressIndicator(), errorWidget: (context, url, error) => Icon(Icons.error), - height: 36, - width: 36, + height: 40, + width: 40, ), ), ], diff --git a/lib/features/home/widgets/home_bottom_nav_bar.dart b/lib/features/home/widgets/home_bottom_nav_bar.dart index 1c4e88e..b41e0eb 100644 --- a/lib/features/home/widgets/home_bottom_nav_bar.dart +++ b/lib/features/home/widgets/home_bottom_nav_bar.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:productive/common/resources/strings.dart'; import 'package:productive/utils/animation/animated_scale.dart'; -import 'package:productive/utils/animation/animated_scale_button.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; class BottomNav extends StatefulWidget { @@ -36,6 +35,8 @@ class _BottomNavState extends State { void _touchStatsIcon() => _touchIcon(1); + void _untouch() => _touchIcon(-1); + @override Widget build(BuildContext context) { return Container( @@ -60,18 +61,22 @@ class _BottomNavState extends State { ), ), child: Container( - padding: const EdgeInsets.all(16.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GestureDetector( behavior: HitTestBehavior.opaque, onTap: _selectHome, + onLongPress: _touchHomeIcon, + onLongPressUp: _untouch, + onTapUp: (_) => _untouch, + onLongPressStart: (_) => _touchHomeIcon, + onLongPressEnd: (_) => _untouch, child: Padding( - padding: const EdgeInsets.all(16.0), + padding: const EdgeInsets.all(32.0), child: AnimatedScale( - duration: _getDuration(0, navState), - scale: _getScale(0, navState), + duration: const Duration(milliseconds: 200), + scale: _getScaleProxy(0, navState), child: SvgPicture.asset( R.svgImages.homeIcon, height: 32, @@ -82,11 +87,16 @@ class _BottomNavState extends State { GestureDetector( behavior: HitTestBehavior.opaque, onTap: _selectStats, + onLongPress: _touchStatsIcon, + onLongPressUp: _untouch, + onTapUp: (_) => _untouch, + onLongPressStart: (_) => _touchStatsIcon, + onLongPressEnd: (_) => _untouch, child: Padding( - padding: const EdgeInsets.all(16.0), + padding: const EdgeInsets.all(32.0), child: AnimatedScale( - duration: _getDuration(1, navState), - scale: _getScale(1, navState), + duration: const Duration(milliseconds: 200), + scale: _getScaleProxy(1, navState), child: SvgPicture.asset( R.svgImages.statsIcon, height: 32, @@ -108,10 +118,10 @@ class _BottomNavState extends State { : greyLinearGradient; } - Duration _getDuration(int buttonIndex, NavButtonsState navState) { - final bool toEnlarge = buttonIndex == navState.selectedIndex || - buttonIndex != navState.pressedIndex; - return Duration(milliseconds: toEnlarge ? 200 : 50); + double _getScaleProxy(int buttonIndex, NavButtonsState navState) { + var scale = _getScale(buttonIndex, navState); + print("Index $buttonIndex Scale : $scale"); + return scale; } double _getScale(int buttonIndex, NavButtonsState navState) { diff --git a/lib/features/home/widgets/home_fab.dart b/lib/features/home/widgets/home_fab.dart index c341d4d..383231f 100644 --- a/lib/features/home/widgets/home_fab.dart +++ b/lib/features/home/widgets/home_fab.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:productive/features/home/widgets/home_screen.dart'; import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; import 'package:productive/utils/extensions/navigation_extension.dart'; + class Fab extends StatelessWidget { const Fab({Key key}) : super(key: key); @@ -14,8 +14,7 @@ class Fab extends StatelessWidget { onPressed: () { context.navigateTo(const SplashScreen()); }, - shape: - RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)), padding: const EdgeInsets.all(0.0), child: const Padding( padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 12), @@ -23,9 +22,7 @@ class Fab extends StatelessWidget { '+ Add Todo', textAlign: TextAlign.center, style: TextStyle( - fontSize: 18, - color: Colors.white, - fontWeight: FontWeight.w600), + fontSize: 18, color: Colors.white, fontWeight: FontWeight.w600), ), ).withBlueGradientBg(), ); diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index 781ba01..dbd0c0b 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -26,6 +26,7 @@ class _SplashScreenState extends State { loopMode: LoopMode.single, playInBackground: PlayInBackground.disabledRestoreOnForeground, seek: const Duration(seconds: 2), + volume: 0.5 ); } From ffc4698ed4a8434857d7b3b9a8589a5d346aa5eb Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 26 Jun 2020 07:16:50 +0545 Subject: [PATCH 13/56] Replaced hardcoded stings and asset path with resrouce class --- lib/common/resources/r.dart | 37 ++++++++ lib/common/resources/strings.dart | 25 ----- lib/features/home/widgets/home_app_bar.dart | 14 ++- .../home/widgets/home_bottom_nav_bar.dart | 94 +++++++++---------- lib/features/home/widgets/home_fab.dart | 7 +- lib/features/splash/splash_screen.dart | 12 +-- .../extensions/navigation_extension.dart | 4 +- pubspec.yaml | 7 -- test/widget_test.dart | 4 +- 9 files changed, 100 insertions(+), 104 deletions(-) create mode 100644 lib/common/resources/r.dart delete mode 100644 lib/common/resources/strings.dart diff --git a/lib/common/resources/r.dart b/lib/common/resources/r.dart new file mode 100644 index 0000000..fafb6ff --- /dev/null +++ b/lib/common/resources/r.dart @@ -0,0 +1,37 @@ +class R { + static Strings string = Strings(); + static SVGImages svg = SVGImages(); + static LottieFiles lottie = LottieFiles(); + static AudioFiles audio = AudioFiles(); + static Placeholders placeholders = Placeholders(); +} + +class Placeholders { + Placeholders(); + + String johDoeImage = + "https://pbs.twimg.com/profile_images/1057989852942270464/bt45DHmR.jpg"; +} + +class Strings { + String appName = "Productive"; + String loginWithGoogle = "Continue With Google"; + String todo = "Todo"; + String addTodo = "+ Add Todo"; +} + +class SVGImages { + String homeIcon = "assets/images/home.svg"; + String statsIcon = "assets/images/stats.svg"; + String googleIcon = "assets/images/google.svg"; + String successIcon = "assets/images/success.svg"; +} + +class LottieFiles { + String paperPlane = "assets/lottie/paper_plane.json"; +} + +class AudioFiles { + String splashBreeze = "assets/sounds/wind.mp3"; + String welcomeTone = "assets/sounds/point.mp3"; +} diff --git a/lib/common/resources/strings.dart b/lib/common/resources/strings.dart deleted file mode 100644 index 0554a14..0000000 --- a/lib/common/resources/strings.dart +++ /dev/null @@ -1,25 +0,0 @@ -class R { - static Strings strings = Strings(); - static SVGImages svgImages = SVGImages(); - static LottieFiles lottieFiles = LottieFiles(); - static AudioFiles audioFiles = AudioFiles(); -} - -class Strings { - String appName = "Productive"; - String loginWithGoogle = "Login With Google"; -} - -class SVGImages { - String homeIcon = "assets/images/home.svg"; - String statsIcon = "assets/images/stats.svg"; -} - -class LottieFiles { - String paperPlane = "assets/lottie/paper_plane.json"; -} - -class AudioFiles { - String splashBreeze = "assets/sounds/wind.mp3"; - String welcomeTone = "assets/sounds/point.mp3"; -} diff --git a/lib/features/home/widgets/home_app_bar.dart b/lib/features/home/widgets/home_app_bar.dart index c0f280a..a62b3c1 100644 --- a/lib/features/home/widgets/home_app_bar.dart +++ b/lib/features/home/widgets/home_app_bar.dart @@ -4,6 +4,7 @@ import 'package:assets_audio_player/assets_audio_player.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:productive/common/resources/r.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; class AppbarContent extends StatelessWidget { @@ -25,7 +26,7 @@ class AppbarContent extends StatelessWidget { ClipRRect( borderRadius: BorderRadius.circular(200), child: CachedNetworkImage( - imageUrl: johnDoeImage, + imageUrl: R.placeholders.johDoeImage, placeholder: (context, url) => const CircularProgressIndicator(), errorWidget: (context, url, error) => Icon(Icons.error), @@ -35,12 +36,12 @@ class AppbarContent extends StatelessWidget { ), ], ), - const Text( - "Todo", + Text( + R.string.todo, style: TextStyle(fontSize: 28, fontWeight: FontWeight.w600), ), SvgPicture.asset( - "assets/images/success.svg", + R.svg.successIcon, height: 32, width: 32, ) @@ -77,7 +78,7 @@ class _AnimatedMotivationMeterState extends State void initState() { super.initState(); super.initState(); - _audioPlayer.open(Audio("assets/sounds/point.mp3")); + _audioPlayer.open(Audio(R.audio.welcomeTone)); controller = AnimationController( vsync: this, duration: const Duration(milliseconds: 2000)); animation = Tween( @@ -152,6 +153,3 @@ class CircleProgressPainter extends CustomPainter { AppBar homeAppbar = AppBar(title: const AppbarContent(), automaticallyImplyLeading: false); - -String johnDoeImage = - "https://pbs.twimg.com/profile_images/1057989852942270464/bt45DHmR.jpg"; diff --git a/lib/features/home/widgets/home_bottom_nav_bar.dart b/lib/features/home/widgets/home_bottom_nav_bar.dart index b41e0eb..b12275d 100644 --- a/lib/features/home/widgets/home_bottom_nav_bar.dart +++ b/lib/features/home/widgets/home_bottom_nav_bar.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:productive/common/resources/strings.dart'; +import 'package:productive/common/resources/r.dart'; import 'package:productive/utils/animation/animated_scale.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; @@ -35,7 +35,7 @@ class _BottomNavState extends State { void _touchStatsIcon() => _touchIcon(1); - void _untouch() => _touchIcon(-1); + void _unTouch() => _touchIcon(-1); @override Widget build(BuildContext context) { @@ -60,52 +60,50 @@ class _BottomNavState extends State { side: BorderSide(), ), ), - child: Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: _selectHome, - onLongPress: _touchHomeIcon, - onLongPressUp: _untouch, - onTapUp: (_) => _untouch, - onLongPressStart: (_) => _touchHomeIcon, - onLongPressEnd: (_) => _untouch, - child: Padding( - padding: const EdgeInsets.all(32.0), - child: AnimatedScale( - duration: const Duration(milliseconds: 200), - scale: _getScaleProxy(0, navState), - child: SvgPicture.asset( - R.svgImages.homeIcon, - height: 32, - ).getShadedWidget(_getGradient(0, navState)), - ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: _selectHome, + onLongPress: _touchHomeIcon, + onLongPressUp: _unTouch, + onTapUp: (_) => _unTouch, + onLongPressStart: (_) => _touchHomeIcon, + onLongPressEnd: (_) => _unTouch, + child: Padding( + padding: const EdgeInsets.all(32.0), + child: AnimatedScale( + duration: const Duration(milliseconds: 200), + scale: _getScale(0, navState), + child: SvgPicture.asset( + R.svg.homeIcon, + height: 32, + ).getShadedWidget(_getGradient(0, navState)), ), ), - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: _selectStats, - onLongPress: _touchStatsIcon, - onLongPressUp: _untouch, - onTapUp: (_) => _untouch, - onLongPressStart: (_) => _touchStatsIcon, - onLongPressEnd: (_) => _untouch, - child: Padding( - padding: const EdgeInsets.all(32.0), - child: AnimatedScale( - duration: const Duration(milliseconds: 200), - scale: _getScaleProxy(1, navState), - child: SvgPicture.asset( - R.svgImages.statsIcon, - height: 32, - ).getShadedWidget(_getGradient(1, navState)), - ), + ), + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: _selectStats, + onLongPress: _touchStatsIcon, + onLongPressUp: _unTouch, + onTapUp: (_) => _unTouch, + onLongPressStart: (_) => _touchStatsIcon, + onLongPressEnd: (_) => _unTouch, + child: Padding( + padding: const EdgeInsets.all(32.0), + child: AnimatedScale( + duration: const Duration(milliseconds: 200), + scale: _getScale(1, navState), + child: SvgPicture.asset( + R.svg.statsIcon, + height: 32, + ).getShadedWidget(_getGradient(1, navState)), ), - ) - ], - ), + ), + ) + ], ), ), ), @@ -118,12 +116,6 @@ class _BottomNavState extends State { : greyLinearGradient; } - double _getScaleProxy(int buttonIndex, NavButtonsState navState) { - var scale = _getScale(buttonIndex, navState); - print("Index $buttonIndex Scale : $scale"); - return scale; - } - double _getScale(int buttonIndex, NavButtonsState navState) { if (buttonIndex == navState.pressedIndex && buttonIndex == navState.selectedIndex) return 0.8; diff --git a/lib/features/home/widgets/home_fab.dart b/lib/features/home/widgets/home_fab.dart index 383231f..1ff8da3 100644 --- a/lib/features/home/widgets/home_fab.dart +++ b/lib/features/home/widgets/home_fab.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:productive/common/resources/r.dart'; import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; import 'package:productive/utils/extensions/navigation_extension.dart'; @@ -16,10 +17,10 @@ class Fab extends StatelessWidget { }, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(80.0)), padding: const EdgeInsets.all(0.0), - child: const Padding( - padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 12), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12), child: Text( - '+ Add Todo', + R.string.addTodo, textAlign: TextAlign.center, style: TextStyle( fontSize: 18, color: Colors.white, fontWeight: FontWeight.w600), diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index dbd0c0b..f7fa60b 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -2,7 +2,7 @@ import 'package:assets_audio_player/assets_audio_player.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:lottie/lottie.dart'; -import 'package:productive/common/resources/strings.dart'; +import 'package:productive/common/resources/r.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; import 'package:productive/utils/animation/animated_scale_button.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; @@ -22,7 +22,7 @@ class _SplashScreenState extends State { void initState() { super.initState(); _audioPlayer.open( - Audio("assets/sounds/wind.mp3"), + Audio(R.audio.splashBreeze), loopMode: LoopMode.single, playInBackground: PlayInBackground.disabledRestoreOnForeground, seek: const Duration(seconds: 2), @@ -80,12 +80,12 @@ class SignInWithGoogleButton extends StatelessWidget { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - SvgPicture.asset("assets/images/google.svg"), + SvgPicture.asset(R.svg.googleIcon), const SizedBox( width: 16, ), Text( - "Continue with google", + R.string.loginWithGoogle, style: TextStyle( fontSize: 17, fontWeight: FontWeight.w700, @@ -105,7 +105,7 @@ class PaperPlaneWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Lottie.asset( - 'assets/lottie/paper_plane.json', + R.lottie.paperPlane, height: 300, width: 300, ), @@ -120,7 +120,7 @@ class SplashLogo extends StatelessWidget { @override Widget build(BuildContext context) { return Text( - R.strings.appName, + R.string.appName, style: TextStyle( fontWeight: FontWeight.w700, fontSize: 64, diff --git a/lib/utils/extensions/navigation_extension.dart b/lib/utils/extensions/navigation_extension.dart index c51aa31..2d50c3a 100644 --- a/lib/utils/extensions/navigation_extension.dart +++ b/lib/utils/extensions/navigation_extension.dart @@ -9,8 +9,8 @@ extension NavigationExtension on BuildContext { pageBuilder: (context, animation, secondaryAnimation) => destination, transitionsBuilder: (context, animation, secondaryAnimation, child) { const begin = Offset(1.0, 0.0); - final end = Offset.zero; - final curve = Curves.decelerate; + const end = Offset.zero; + const curve = Curves.decelerate; final tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); diff --git a/pubspec.yaml b/pubspec.yaml index 59bd42b..78be950 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -46,10 +46,3 @@ flutter: style: italic - asset: assets/fonts/Product_Sans_Bold_Italic.ttf style: italic - - - -# fonts Balsamiq+Sans, Poppins, Tenali, Rubik, Patrick Hand, Lobster two, Handlee, El Messiri, Alice, -# Amaranth, Comic neue, Jost, Capriola, Combo, Reem Kufi, Cabin Sketch,Caladea,Cinzel, Cousard,Sen, -# Delius, Metrophobic,Pompiere, Gabriela,Kurale,Vioada Libre,Amarante,Soloway, - diff --git a/test/widget_test.dart b/test/widget_test.dart index 91d0d48..0af7599 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:lottie/lottie.dart'; -import 'package:productive/common/resources/strings.dart'; +import 'package:productive/common/resources/r.dart'; import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/main.dart'; import 'package:productive/utils/animation/animated_scale.dart'; @@ -27,7 +27,7 @@ void main() { testWidgets("There is a Productive Text Logo", (WidgetTester tester) async { await tester.pumpWidget(const SplashScreenBody().testWidget); expect(find.byType(ShaderMask), findsOneWidget); - expect(find.text(R.strings.appName), findsOneWidget); + expect(find.text(R.string.appName), findsOneWidget); }); testWidgets("There is a Google Sign in Button", From 7101e9c2408f871b78f10fe3564ef4ff5e8f0107 Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 26 Jun 2020 07:30:20 +0545 Subject: [PATCH 14/56] Fixed splash test --- lib/common/resources/r.dart | 2 - lib/features/home/widgets/home_app_bar.dart | 44 +++++++++++++-------- test/widget_test.dart | 2 +- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/lib/common/resources/r.dart b/lib/common/resources/r.dart index fafb6ff..f1dfbf0 100644 --- a/lib/common/resources/r.dart +++ b/lib/common/resources/r.dart @@ -7,8 +7,6 @@ class R { } class Placeholders { - Placeholders(); - String johDoeImage = "https://pbs.twimg.com/profile_images/1057989852942270464/bt45DHmR.jpg"; } diff --git a/lib/features/home/widgets/home_app_bar.dart b/lib/features/home/widgets/home_app_bar.dart index a62b3c1..d292026 100644 --- a/lib/features/home/widgets/home_app_bar.dart +++ b/lib/features/home/widgets/home_app_bar.dart @@ -17,23 +17,13 @@ class AppbarContent extends StatelessWidget { children: [ Stack( alignment: Alignment.center, - children: [ - const AnimatedMotivationMeter( + children: const [ + AnimatedMotivationMeter( motivation: 0.6, - height: 46, - width: 46, - ), - ClipRRect( - borderRadius: BorderRadius.circular(200), - child: CachedNetworkImage( - imageUrl: R.placeholders.johDoeImage, - placeholder: (context, url) => - const CircularProgressIndicator(), - errorWidget: (context, url, error) => Icon(Icons.error), - height: 40, - width: 40, - ), + height: 42, + width: 42, ), + DisplayPic(), ], ), Text( @@ -42,14 +32,34 @@ class AppbarContent extends StatelessWidget { ), SvgPicture.asset( R.svg.successIcon, - height: 32, - width: 32, + height: 28, + width: 28, ) ], ); } } +class DisplayPic extends StatelessWidget { + const DisplayPic({ + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: BorderRadius.circular(200), + child: CachedNetworkImage( + imageUrl: R.placeholders.johDoeImage, + placeholder: (context, url) => const CircularProgressIndicator(), + errorWidget: (context, url, error) => Icon(Icons.error), + height: 36, + width: 36, + ), + ); + } +} + class AnimatedMotivationMeter extends StatefulWidget { const AnimatedMotivationMeter({ this.motivation, diff --git a/test/widget_test.dart b/test/widget_test.dart index 0af7599..f31f082 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -34,7 +34,7 @@ void main() { (WidgetTester tester) async { await tester.pumpWidget(const SplashScreenBody().testWidget); expect(find.byType(AnimatedScale), findsOneWidget); - expect(find.text("Continue with google"), findsOneWidget); + expect(find.text(R.string.loginWithGoogle), findsOneWidget); }); }); } From 0084bb327e6501b400a1ef89d9fc414e47aa23f9 Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 26 Jun 2020 08:24:48 +0545 Subject: [PATCH 15/56] Completed Refactoring --- .../widgets/animated_circle_progress.dart | 107 ++++++++++++++ .../home/widgets/animated_nav_button.dart | 115 +++++++++++++++ lib/features/home/widgets/home_app_bar.dart | 132 ++---------------- lib/features/home/widgets/home_body.dart | 5 +- .../home/widgets/home_bottom_nav_bar.dart | 100 +++---------- lib/features/home/widgets/home_screen.dart | 6 +- lib/features/splash/splash_screen.dart | 62 ++------ .../animation/animated_scale_button.dart | 71 ++++------ .../extensions/navigation_extension.dart | 30 ++-- 9 files changed, 309 insertions(+), 319 deletions(-) create mode 100644 lib/features/home/widgets/animated_circle_progress.dart create mode 100644 lib/features/home/widgets/animated_nav_button.dart diff --git a/lib/features/home/widgets/animated_circle_progress.dart b/lib/features/home/widgets/animated_circle_progress.dart new file mode 100644 index 0000000..ef68622 --- /dev/null +++ b/lib/features/home/widgets/animated_circle_progress.dart @@ -0,0 +1,107 @@ +import 'dart:math'; + +import 'package:assets_audio_player/assets_audio_player.dart'; +import 'package:flutter/material.dart'; +import 'package:productive/common/resources/r.dart'; +import 'package:productive/utils/extensions/gradient_extensions.dart'; + +class AnimatedMotivationMeter extends StatefulWidget { + const AnimatedMotivationMeter({ + this.motivation, + this.height, + this.width, + Key key, + }) : assert(motivation <= 1.0 && motivation >= 0), + super(key: key); + + final double motivation; + final double height; + final double width; + + @override + _AnimatedMotivationMeterState createState() => + _AnimatedMotivationMeterState(); +} + +class _AnimatedMotivationMeterState extends State + with SingleTickerProviderStateMixin { + Animation animation; + AnimationController controller; + final _audioPlayer = AssetsAudioPlayer(); + + @override + void initState() { + super.initState(); + super.initState(); + _audioPlayer.open(Audio(R.audio.welcomeTone), volume: 0.5); + controller = AnimationController( + vsync: this, duration: const Duration(milliseconds: 2000)); + animation = Tween( + begin: widget.motivation * 0.5, + end: widget.motivation, + ).chain(CurveTween(curve: Curves.decelerate)).animate(controller) + ..addListener(() { + setState(() {}); + }); + controller.forward(); + } + + @override + Widget build(BuildContext context) { + return CustomPaint( + willChange: true, + painter: CircleProgressPainter(widget.motivation, animation.value), + size: Size(widget.width, widget.height), + ); + } + + @override + void dispose() { + super.dispose(); + _audioPlayer.dispose(); + } +} + +class CircleProgressPainter extends CustomPainter { + CircleProgressPainter(this.maxMotivation, this.animatingMotivation) { + endAngle = pi * 2 * min(animatingMotivation, 0.95); + } + + final double startAngle = -pi / 2; + final double gradientRotationAngle = -pi / 2 - 0.14; + double endAngle; + final double maxMotivation; + final double animatingMotivation; + Paint _ink; + + @override + void paint(Canvas canvas, Size size) { + _ink ??= Paint() + ..style = PaintingStyle.stroke + ..strokeWidth = 6 + ..strokeCap = StrokeCap.round + ..shader = SweepGradient( + colors: blueGradientColors, + startAngle: startAngle, + endAngle: endAngle, + transform: GradientRotation(gradientRotationAngle)) + .createShader( + Rect.fromCenter( + center: Offset(size.height / 2, size.width / 2), + width: size.width, + height: size.height), + ); + canvas.drawArc( + Rect.fromCenter( + center: Offset(size.height / 2, size.width / 2), + width: size.width, + height: size.height), + startAngle, + endAngle, + false, + _ink); + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) => true; +} diff --git a/lib/features/home/widgets/animated_nav_button.dart b/lib/features/home/widgets/animated_nav_button.dart new file mode 100644 index 0000000..453b8f9 --- /dev/null +++ b/lib/features/home/widgets/animated_nav_button.dart @@ -0,0 +1,115 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:productive/common/resources/r.dart'; +import 'package:productive/utils/animation/animated_scale.dart'; +import 'package:productive/utils/extensions/gradient_extensions.dart'; + +class AnimatedNavIcon extends StatelessWidget { + const AnimatedNavIcon({ + Key key, + @required this.navState, + @required this.select, + @required this.touch, + @required this.unTouch, + @required this.child, + }) : super(key: key); + final NavButtonsState navState; + final Function() select; + final Function() touch; + final Function() unTouch; + final Widget child; + + @override + Widget build(BuildContext context) { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: select, + onLongPress: touch, + onLongPressUp: unTouch, + onTapUp: (_) => unTouch, + onLongPressStart: (_) => touch, + onLongPressEnd: (_) => unTouch, + child: child, + ); + } +} + +class HomeIcon extends StatelessWidget { + const HomeIcon({Key key, @required this.navState}) : super(key: key); + + final NavButtonsState navState; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(32.0), + child: AnimatedScale( + duration: const Duration(milliseconds: 200), + scale: _getScale(0, navState), + child: SvgPicture.asset( + R.svg.homeIcon, + height: 32, + ).getShadedWidget(_getGradient(0, navState)), + ), + ); + } +} + +class StatsIcon extends StatelessWidget { + const StatsIcon({Key key, @required this.navState}) : super(key: key); + + final NavButtonsState navState; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(32.0), + child: AnimatedScale( + duration: const Duration(milliseconds: 200), + scale: _getScale(1, navState), + child: SvgPicture.asset( + R.svg.statsIcon, + height: 32, + ).getShadedWidget(_getGradient(1, navState)), + ), + ); + } +} + +LinearGradient _getGradient(int buttonIndex, NavButtonsState navState) { + return buttonIndex == navState.selectedIndex + ? blueLinearGradient + : greyLinearGradient; +} + +double _getScale(int buttonIndex, NavButtonsState navState) { + if (buttonIndex == navState.pressedIndex && + buttonIndex == navState.selectedIndex) return 0.8; + if (buttonIndex == navState.pressedIndex) return 0.6; + if (buttonIndex != navState.pressedIndex && + buttonIndex != navState.selectedIndex) return 0.8; + return 1.0; +} + +class NavButtonsState { + const NavButtonsState({this.selectedIndex, this.pressedIndex}); + + final int selectedIndex; + final int pressedIndex; + + NavButtonsState copyWith({ + int selectedIndex, + int pressedIndex, + }) { + if ((selectedIndex == null || + identical(selectedIndex, this.selectedIndex)) && + (pressedIndex == null || identical(pressedIndex, this.pressedIndex))) { + return this; + } + + return NavButtonsState( + selectedIndex: selectedIndex ?? this.selectedIndex, + pressedIndex: pressedIndex ?? this.pressedIndex, + ); + } +} \ No newline at end of file diff --git a/lib/features/home/widgets/home_app_bar.dart b/lib/features/home/widgets/home_app_bar.dart index d292026..99da82b 100644 --- a/lib/features/home/widgets/home_app_bar.dart +++ b/lib/features/home/widgets/home_app_bar.dart @@ -1,11 +1,9 @@ -import 'dart:math'; - -import 'package:assets_audio_player/assets_audio_player.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:productive/common/resources/r.dart'; -import 'package:productive/utils/extensions/gradient_extensions.dart'; + +import 'animated_circle_progress.dart'; class AppbarContent extends StatelessWidget { const AppbarContent({Key key}) : super(key: key); @@ -18,32 +16,25 @@ class AppbarContent extends StatelessWidget { Stack( alignment: Alignment.center, children: const [ - AnimatedMotivationMeter( - motivation: 0.6, - height: 42, - width: 42, - ), - DisplayPic(), + AnimatedMotivationMeter(motivation: 0.6, height: 42, width: 42), + DisplayPic(height: 36, width: 36), ], ), Text( R.string.todo, style: TextStyle(fontSize: 28, fontWeight: FontWeight.w600), ), - SvgPicture.asset( - R.svg.successIcon, - height: 28, - width: 28, - ) + SvgPicture.asset(R.svg.successIcon, height: 28, width: 28) ], ); } } class DisplayPic extends StatelessWidget { - const DisplayPic({ - Key key, - }) : super(key: key); + const DisplayPic({this.height, this.width, Key key}) : super(key: key); + + final double height; + final double width; @override Widget build(BuildContext context) { @@ -53,113 +44,12 @@ class DisplayPic extends StatelessWidget { imageUrl: R.placeholders.johDoeImage, placeholder: (context, url) => const CircularProgressIndicator(), errorWidget: (context, url, error) => Icon(Icons.error), - height: 36, - width: 36, + height: height, + width: width, ), ); } } -class AnimatedMotivationMeter extends StatefulWidget { - const AnimatedMotivationMeter({ - this.motivation, - this.height, - this.width, - Key key, - }) : assert(motivation <= 1.0 && motivation >= 0), - super(key: key); - - final double motivation; - final double height; - final double width; - - @override - _AnimatedMotivationMeterState createState() => - _AnimatedMotivationMeterState(); -} - -class _AnimatedMotivationMeterState extends State - with SingleTickerProviderStateMixin { - Animation animation; - AnimationController controller; - final _audioPlayer = AssetsAudioPlayer(); - - @override - void initState() { - super.initState(); - super.initState(); - _audioPlayer.open(Audio(R.audio.welcomeTone)); - controller = AnimationController( - vsync: this, duration: const Duration(milliseconds: 2000)); - animation = Tween( - begin: widget.motivation * 0.5, - end: widget.motivation, - ).chain(CurveTween(curve: Curves.decelerate)).animate(controller) - ..addListener(() { - setState(() {}); - }); - controller.forward(); - } - - @override - Widget build(BuildContext context) { - return CustomPaint( - willChange: true, - painter: CircleProgressPainter(widget.motivation, animation.value), - size: Size(widget.width, widget.height), - ); - } - - @override - void dispose() { - super.dispose(); - _audioPlayer.dispose(); - } -} - -class CircleProgressPainter extends CustomPainter { - CircleProgressPainter(this.maxMotivation, this.animatingMotivation) { - endAngle = pi * 2 * min(animatingMotivation, 0.95); - } - - final double startAngle = -pi / 2; - final double gradientRotationAngle = -pi / 2 - 0.14; - double endAngle; - final double maxMotivation; - final double animatingMotivation; - Paint _ink; - - @override - void paint(Canvas canvas, Size size) { - _ink ??= Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = 6 - ..strokeCap = StrokeCap.round - ..shader = SweepGradient( - colors: blueGradientColors, - startAngle: startAngle, - endAngle: endAngle, - transform: GradientRotation(gradientRotationAngle)) - .createShader( - Rect.fromCenter( - center: Offset(size.height / 2, size.width / 2), - width: size.width, - height: size.height), - ); - canvas.drawArc( - Rect.fromCenter( - center: Offset(size.height / 2, size.width / 2), - width: size.width, - height: size.height), - startAngle, - endAngle, - false, - _ink); - } - - @override - bool shouldRepaint(CustomPainter oldDelegate) => true; -} - AppBar homeAppbar = AppBar(title: const AppbarContent(), automaticallyImplyLeading: false); diff --git a/lib/features/home/widgets/home_body.dart b/lib/features/home/widgets/home_body.dart index f598582..42a6eb3 100644 --- a/lib/features/home/widgets/home_body.dart +++ b/lib/features/home/widgets/home_body.dart @@ -1,12 +1,13 @@ import 'package:flutter/material.dart'; +import 'package:productive/common/resources/r.dart'; class HomeBody extends StatelessWidget { const HomeBody({Key key}) : super(key: key); @override Widget build(BuildContext context) { - return const Center( - child: Text("Hello world"), + return Center( + child: Text(R.string.appName), ); } } diff --git a/lib/features/home/widgets/home_bottom_nav_bar.dart b/lib/features/home/widgets/home_bottom_nav_bar.dart index b12275d..85000c3 100644 --- a/lib/features/home/widgets/home_bottom_nav_bar.dart +++ b/lib/features/home/widgets/home_bottom_nav_bar.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:productive/common/resources/r.dart'; -import 'package:productive/utils/animation/animated_scale.dart'; -import 'package:productive/utils/extensions/gradient_extensions.dart'; + +import 'animated_nav_button.dart'; class BottomNav extends StatefulWidget { const BottomNav({Key key}) : super(key: key); @@ -29,10 +27,10 @@ class _BottomNavState extends State { void _selectHome() => _selectPage(0); - void _selectStats() => _selectPage(1); - void _touchHomeIcon() => _touchIcon(0); + void _selectStats() => _selectPage(1); + void _touchStatsIcon() => _touchIcon(1); void _unTouch() => _touchIcon(-1); @@ -63,88 +61,24 @@ class _BottomNavState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: _selectHome, - onLongPress: _touchHomeIcon, - onLongPressUp: _unTouch, - onTapUp: (_) => _unTouch, - onLongPressStart: (_) => _touchHomeIcon, - onLongPressEnd: (_) => _unTouch, - child: Padding( - padding: const EdgeInsets.all(32.0), - child: AnimatedScale( - duration: const Duration(milliseconds: 200), - scale: _getScale(0, navState), - child: SvgPicture.asset( - R.svg.homeIcon, - height: 32, - ).getShadedWidget(_getGradient(0, navState)), - ), - ), + AnimatedNavIcon( + navState: navState, + select: _selectHome, + unTouch: _unTouch, + touch: _touchHomeIcon, + child: HomeIcon(navState: navState), + ), + AnimatedNavIcon( + navState: navState, + select: _selectStats, + unTouch: _unTouch, + touch: _touchStatsIcon, + child: StatsIcon(navState: navState), ), - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: _selectStats, - onLongPress: _touchStatsIcon, - onLongPressUp: _unTouch, - onTapUp: (_) => _unTouch, - onLongPressStart: (_) => _touchStatsIcon, - onLongPressEnd: (_) => _unTouch, - child: Padding( - padding: const EdgeInsets.all(32.0), - child: AnimatedScale( - duration: const Duration(milliseconds: 200), - scale: _getScale(1, navState), - child: SvgPicture.asset( - R.svg.statsIcon, - height: 32, - ).getShadedWidget(_getGradient(1, navState)), - ), - ), - ) ], ), ), ), ); } - - LinearGradient _getGradient(int buttonIndex, NavButtonsState navState) { - return buttonIndex == navState.selectedIndex - ? blueLinearGradient - : greyLinearGradient; - } - - double _getScale(int buttonIndex, NavButtonsState navState) { - if (buttonIndex == navState.pressedIndex && - buttonIndex == navState.selectedIndex) return 0.8; - if (buttonIndex == navState.pressedIndex) return 0.6; - if (buttonIndex != navState.pressedIndex && - buttonIndex != navState.selectedIndex) return 0.8; - return 1.0; - } -} - -class NavButtonsState { - const NavButtonsState({this.selectedIndex, this.pressedIndex}); - - final int selectedIndex; - final int pressedIndex; - - NavButtonsState copyWith({ - int selectedIndex, - int pressedIndex, - }) { - if ((selectedIndex == null || - identical(selectedIndex, this.selectedIndex)) && - (pressedIndex == null || identical(pressedIndex, this.pressedIndex))) { - return this; - } - - return NavButtonsState( - selectedIndex: selectedIndex ?? this.selectedIndex, - pressedIndex: pressedIndex ?? this.pressedIndex, - ); - } } diff --git a/lib/features/home/widgets/home_screen.dart b/lib/features/home/widgets/home_screen.dart index cacf4e0..d823212 100644 --- a/lib/features/home/widgets/home_screen.dart +++ b/lib/features/home/widgets/home_screen.dart @@ -15,10 +15,8 @@ class HomeScreen extends StatelessWidget { body: const HomeBody(), appBar: homeAppbar, floatingActionButton: const Padding( - padding: EdgeInsets.symmetric(horizontal: 2,vertical: 2), - child: ScaleOnPressWidget( - child: Fab(), - ), + padding: EdgeInsets.symmetric(horizontal: 2, vertical: 2), + child: ScaleOnPressWidget(child: Fab()), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: const BottomNav(), diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index f7fa60b..9439e51 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -21,13 +21,11 @@ class _SplashScreenState extends State { @override void initState() { super.initState(); - _audioPlayer.open( - Audio(R.audio.splashBreeze), - loopMode: LoopMode.single, - playInBackground: PlayInBackground.disabledRestoreOnForeground, - seek: const Duration(seconds: 2), - volume: 0.5 - ); + _audioPlayer.open(Audio(R.audio.splashBreeze), + loopMode: LoopMode.single, + playInBackground: PlayInBackground.disabledRestoreOnForeground, + seek: const Duration(seconds: 2), + volume: 0.5); } @override @@ -54,9 +52,12 @@ class SplashScreenBody extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.end, children: [ const Spacer(flex: 3), - const PaperPlaneWidget(), + Lottie.asset(R.lottie.paperPlane, height: 300, width: 300), const Spacer(flex: 3), - const SplashLogo(), + Text( + R.string.appName, + style: TextStyle(fontWeight: FontWeight.w700, fontSize: 64), + ).withBlueGradientFg(), const Spacer(flex: 5), ScaleOnPressWidget( onTap: () { @@ -81,51 +82,12 @@ class SignInWithGoogleButton extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ SvgPicture.asset(R.svg.googleIcon), - const SizedBox( - width: 16, - ), + const SizedBox(width: 16), Text( R.string.loginWithGoogle, - style: TextStyle( - fontSize: 17, - fontWeight: FontWeight.w700, - ), + style: TextStyle(fontSize: 17, fontWeight: FontWeight.w700), ), ], ); } } - -class PaperPlaneWidget extends StatelessWidget { - const PaperPlaneWidget(); - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Lottie.asset( - R.lottie.paperPlane, - height: 300, - width: 300, - ), - ], - ); - } -} - -class SplashLogo extends StatelessWidget { - const SplashLogo(); - - @override - Widget build(BuildContext context) { - return Text( - R.string.appName, - style: TextStyle( - fontWeight: FontWeight.w700, - fontSize: 64, - color: Colors.blue, - ), - ).withBlueGradientFg(); - } -} diff --git a/lib/utils/animation/animated_scale_button.dart b/lib/utils/animation/animated_scale_button.dart index 6decc16..698088a 100644 --- a/lib/utils/animation/animated_scale_button.dart +++ b/lib/utils/animation/animated_scale_button.dart @@ -4,12 +4,13 @@ import 'package:flutter/material.dart'; import 'animated_scale.dart'; class ScaleOnPressWidget extends StatefulWidget { - const ScaleOnPressWidget( - {this.child, - this.onTap, - this.outerPadding = EdgeInsets.zero, - this.innerPadding = EdgeInsets.zero, - this.scaleFactor = 0.95}); + const ScaleOnPressWidget({ + this.child, + this.onTap, + this.outerPadding = EdgeInsets.zero, + this.innerPadding = EdgeInsets.zero, + this.scaleFactor = 0.95, + }); final Widget child; final GestureTapCallback onTap; @@ -24,50 +25,28 @@ class ScaleOnPressWidget extends StatefulWidget { class _ScaleOnPressWidgetState extends State { bool isPressed = false; + void _unPress() => _update(false); + + void _press() => _update(true); + + void _update(bool pressed) { + setState(() { + isPressed = pressed; + }); + } + @override Widget build(BuildContext context) { return GestureDetector( behavior: HitTestBehavior.opaque, - onLongPressStart: (details) { - setState(() { - isPressed = true; - }); - }, - onLongPressEnd: (details) { - setState(() { - isPressed = false; - }); - }, - onTapDown: (details) { - setState(() { - isPressed = true; - }); - }, - onTapUp: (details) { - setState(() { - isPressed = false; - }); - }, - onLongPress: () { - setState(() { - isPressed = true; - }); - }, - onLongPressUp: () { - setState(() { - isPressed = false; - }); - }, - onSecondaryTapUp: (details) { - setState(() { - isPressed = false; - }); - }, - onDoubleTap: () { - setState(() { - isPressed = true; - }); - }, + onLongPressStart: (_) => _press, + onLongPressEnd: (_) => _unPress, + onTapDown: (_) => _press, + onTapUp: (_) => _unPress, + onLongPress: _press, + onLongPressUp: _unPress, + onSecondaryTapUp: (_) => _unPress, + onDoubleTap: _press, onTap: widget.onTap, child: Padding( padding: widget.outerPadding, diff --git a/lib/utils/extensions/navigation_extension.dart b/lib/utils/extensions/navigation_extension.dart index 2d50c3a..0537fad 100644 --- a/lib/utils/extensions/navigation_extension.dart +++ b/lib/utils/extensions/navigation_extension.dart @@ -2,10 +2,23 @@ import 'package:dartx/dartx.dart'; import 'package:flutter/material.dart'; extension NavigationExtension on BuildContext { - Future navigateTo(Widget destination, - {Duration delay = const Duration(), bool replace = false}) async { + Future navigateTo( + Widget destination, { + Duration delay = const Duration(), + bool replace = false, + }) async { await delay.delay; - final route = PageRouteBuilder( + final route = _createRoute(destination); + + if (replace) { + Navigator.of(this).pushReplacement(route); + } else { + Navigator.of(this).push(route); + } + } + + PageRouteBuilder _createRoute(Widget destination) { + return PageRouteBuilder( pageBuilder: (context, animation, secondaryAnimation) => destination, transitionsBuilder: (context, animation, secondaryAnimation, child) { const begin = Offset(1.0, 0.0); @@ -15,17 +28,8 @@ extension NavigationExtension on BuildContext { final tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); - return SlideTransition( - position: animation.drive(tween), - child: child, - ); + return SlideTransition(position: animation.drive(tween), child: child); }, ); - - if (replace) { - Navigator.of(this).pushReplacement(route); - } else { - Navigator.of(this).push(route); - } } } From 5c0e2cc1b82fdb868ad849a3f172c355322353cb Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 27 Jun 2020 06:23:15 +0545 Subject: [PATCH 16/56] Wrapped Splashcreen around Material App in testing --- .../splash/splash_screen_test.dart} | 18 ++++-------------- test/main_test.dart | 14 ++++++++++++++ test/unit_test.dart | 9 --------- test/{ => utils/widget}/test_utils.dart | 2 ++ 4 files changed, 20 insertions(+), 23 deletions(-) rename test/{widget_test.dart => features/splash/splash_screen_test.dart} (63%) create mode 100644 test/main_test.dart delete mode 100644 test/unit_test.dart rename test/{ => utils/widget}/test_utils.dart (76%) diff --git a/test/widget_test.dart b/test/features/splash/splash_screen_test.dart similarity index 63% rename from test/widget_test.dart rename to test/features/splash/splash_screen_test.dart index f31f082..256e278 100644 --- a/test/widget_test.dart +++ b/test/features/splash/splash_screen_test.dart @@ -3,36 +3,26 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:lottie/lottie.dart'; import 'package:productive/common/resources/r.dart'; import 'package:productive/features/splash/splash_screen.dart'; -import 'package:productive/main.dart'; import 'package:productive/utils/animation/animated_scale.dart'; -import 'test_utils.dart'; +import '../../utils/widget/test_utils.dart'; void main() { - group("Basic App Setup test", () { - testWidgets('App Follows MaterialTheme', (WidgetTester tester) async { - await tester.pumpWidget(ProductiveApp( - testChild: Container(), - )); - expect(find.byType(MaterialApp), findsOneWidget); - }); - }); - group("Splash Screen Tests", () { testWidgets("There is Lottie Widget", (WidgetTester tester) async { - await tester.pumpWidget(const SplashScreenBody().testWidget); + await tester.pumpWidget(const SplashScreen().asScaffold); expect(find.byType(LottieBuilder), findsOneWidget); }); testWidgets("There is a Productive Text Logo", (WidgetTester tester) async { - await tester.pumpWidget(const SplashScreenBody().testWidget); + await tester.pumpWidget(const SplashScreen().asScaffold); expect(find.byType(ShaderMask), findsOneWidget); expect(find.text(R.string.appName), findsOneWidget); }); testWidgets("There is a Google Sign in Button", (WidgetTester tester) async { - await tester.pumpWidget(const SplashScreenBody().testWidget); + await tester.pumpWidget(const SplashScreen().asScaffold); expect(find.byType(AnimatedScale), findsOneWidget); expect(find.text(R.string.loginWithGoogle), findsOneWidget); }); diff --git a/test/main_test.dart b/test/main_test.dart new file mode 100644 index 0000000..954b84f --- /dev/null +++ b/test/main_test.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:productive/main.dart'; + +void main() { + group("Basic App Setup test", () { + testWidgets('App Follows MaterialTheme', (WidgetTester tester) async { + await tester.pumpWidget(ProductiveApp( + testChild: Container(), + )); + expect(find.byType(MaterialApp), findsOneWidget); + }); + }); +} diff --git a/test/unit_test.dart b/test/unit_test.dart deleted file mode 100644 index 13e9bf3..0000000 --- a/test/unit_test.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group("blablabla", () { - test("unit tests", () { - expect(5, 4 + 1); - }); - }); -} diff --git a/test/test_utils.dart b/test/utils/widget/test_utils.dart similarity index 76% rename from test/test_utils.dart rename to test/utils/widget/test_utils.dart index 4357711..8853ad7 100644 --- a/test/test_utils.dart +++ b/test/utils/widget/test_utils.dart @@ -3,4 +3,6 @@ import 'package:flutter/material.dart'; extension TestWidget on Widget { Widget get testWidget => Directionality(textDirection: TextDirection.ltr, child: this); + + Widget get asScaffold => MaterialApp(home: this); } From 11bde28a8ee5c4da0577e94597eee0329b1c6efb Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 27 Jun 2020 07:14:25 +0545 Subject: [PATCH 17/56] Added test coverage for Fab --- .../widgets/animated_circle_progress.dart | 4 +- lib/features/splash/splash_screen.dart | 4 +- test/features/home/home_screen_test.dart | 21 ++++++++++ test/features/splash/splash_screen_test.dart | 40 +++++++++++-------- 4 files changed, 49 insertions(+), 20 deletions(-) create mode 100644 test/features/home/home_screen_test.dart diff --git a/lib/features/home/widgets/animated_circle_progress.dart b/lib/features/home/widgets/animated_circle_progress.dart index ef68622..cf68d12 100644 --- a/lib/features/home/widgets/animated_circle_progress.dart +++ b/lib/features/home/widgets/animated_circle_progress.dart @@ -31,7 +31,6 @@ class _AnimatedMotivationMeterState extends State @override void initState() { - super.initState(); super.initState(); _audioPlayer.open(Audio(R.audio.welcomeTone), volume: 0.5); controller = AnimationController( @@ -57,8 +56,9 @@ class _AnimatedMotivationMeterState extends State @override void dispose() { - super.dispose(); _audioPlayer.dispose(); + controller.dispose(); + super.dispose(); } } diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index 9439e51..76c74dd 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -9,7 +9,7 @@ import 'package:productive/utils/extensions/gradient_extensions.dart'; import 'package:productive/utils/extensions/navigation_extension.dart'; class SplashScreen extends StatefulWidget { - const SplashScreen(); + const SplashScreen({Key key}) : super(key: key); @override _SplashScreenState createState() => _SplashScreenState(); @@ -43,7 +43,7 @@ class _SplashScreenState extends State { } class SplashScreenBody extends StatelessWidget { - const SplashScreenBody(); + const SplashScreenBody({Key key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/test/features/home/home_screen_test.dart b/test/features/home/home_screen_test.dart new file mode 100644 index 0000000..cc3a880 --- /dev/null +++ b/test/features/home/home_screen_test.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:productive/common/resources/r.dart'; +import 'package:productive/features/home/widgets/home_fab.dart'; +import 'package:productive/features/home/widgets/home_screen.dart'; +import '../../utils/widget/test_utils.dart'; + +void main() { + group("All required widgets are on the Home screen", () { + testWidgets( + "Fab with Text + Add Todo exist", + (WidgetTester tester) async { + await tester.pumpWidget(const HomeScreen().asScaffold); + expect(find.byType(Fab), findsOneWidget); + expect(find.byType(RaisedButton), findsOneWidget); + await tester.pumpWidget(const Fab().testWidget); + expect(find.text(R.string.addTodo ), findsOneWidget); + }, + ); + }); +} diff --git a/test/features/splash/splash_screen_test.dart b/test/features/splash/splash_screen_test.dart index 256e278..66f5800 100644 --- a/test/features/splash/splash_screen_test.dart +++ b/test/features/splash/splash_screen_test.dart @@ -8,23 +8,31 @@ import 'package:productive/utils/animation/animated_scale.dart'; import '../../utils/widget/test_utils.dart'; void main() { - group("Splash Screen Tests", () { - testWidgets("There is Lottie Widget", (WidgetTester tester) async { - await tester.pumpWidget(const SplashScreen().asScaffold); - expect(find.byType(LottieBuilder), findsOneWidget); - }); + group("All required widgets are on the Splash screen", () { + testWidgets( + "There is Lottie Widget", + (WidgetTester tester) async { + await tester.pumpWidget(const SplashScreen().asScaffold); + expect(find.byType(LottieBuilder), findsOneWidget); + }, + ); - testWidgets("There is a Productive Text Logo", (WidgetTester tester) async { - await tester.pumpWidget(const SplashScreen().asScaffold); - expect(find.byType(ShaderMask), findsOneWidget); - expect(find.text(R.string.appName), findsOneWidget); - }); + testWidgets( + "There is a Productive Text Logo", + (WidgetTester tester) async { + await tester.pumpWidget(const SplashScreen().asScaffold); + expect(find.byType(ShaderMask), findsOneWidget); + expect(find.text(R.string.appName), findsOneWidget); + }, + ); - testWidgets("There is a Google Sign in Button", - (WidgetTester tester) async { - await tester.pumpWidget(const SplashScreen().asScaffold); - expect(find.byType(AnimatedScale), findsOneWidget); - expect(find.text(R.string.loginWithGoogle), findsOneWidget); - }); + testWidgets( + "There is a Google Sign in Button", + (WidgetTester tester) async { + await tester.pumpWidget(const SplashScreen().asScaffold); + expect(find.byType(AnimatedScale), findsOneWidget); + expect(find.text(R.string.loginWithGoogle), findsOneWidget); + }, + ); }); } From bd975bab27987837ee97948ea7920a63e9c68f2f Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 27 Jun 2020 07:19:52 +0545 Subject: [PATCH 18/56] Added code coverage for Appbar --- test/features/home/home_screen_test.dart | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/features/home/home_screen_test.dart b/test/features/home/home_screen_test.dart index cc3a880..333e3d1 100644 --- a/test/features/home/home_screen_test.dart +++ b/test/features/home/home_screen_test.dart @@ -1,20 +1,26 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:productive/common/resources/r.dart'; +import 'package:productive/features/home/widgets/home_app_bar.dart'; +import 'package:productive/features/home/widgets/home_bottom_nav_bar.dart'; import 'package:productive/features/home/widgets/home_fab.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; + import '../../utils/widget/test_utils.dart'; void main() { group("All required widgets are on the Home screen", () { testWidgets( - "Fab with Text + Add Todo exist", + "Fab,BottomNav and AppbarContent exist", (WidgetTester tester) async { - await tester.pumpWidget(const HomeScreen().asScaffold); + await tester.pumpWidget(const HomeScreen().asScaffold); expect(find.byType(Fab), findsOneWidget); expect(find.byType(RaisedButton), findsOneWidget); + expect(find.byType(BottomNav), findsOneWidget); + expect(find.byType(AppbarContent), findsOneWidget); + await tester.pumpWidget(const Fab().testWidget); - expect(find.text(R.string.addTodo ), findsOneWidget); + expect(find.text(R.string.addTodo), findsOneWidget); }, ); }); From 5ce4a22078995d5915825f499645270fdad18040 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 27 Jun 2020 07:39:13 +0545 Subject: [PATCH 19/56] Refactored Bottomnav icon --- .../home/widgets/animated_nav_button.dart | 42 +++++++------------ .../home/widgets/home_bottom_nav_bar.dart | 13 +++++- test/features/home/home_screen_test.dart | 10 +++++ 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/lib/features/home/widgets/animated_nav_button.dart b/lib/features/home/widgets/animated_nav_button.dart index 453b8f9..4928300 100644 --- a/lib/features/home/widgets/animated_nav_button.dart +++ b/lib/features/home/widgets/animated_nav_button.dart @@ -34,31 +34,17 @@ class AnimatedNavIcon extends StatelessWidget { } } -class HomeIcon extends StatelessWidget { - const HomeIcon({Key key, @required this.navState}) : super(key: key); - - final NavButtonsState navState; - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(32.0), - child: AnimatedScale( - duration: const Duration(milliseconds: 200), - scale: _getScale(0, navState), - child: SvgPicture.asset( - R.svg.homeIcon, - height: 32, - ).getShadedWidget(_getGradient(0, navState)), - ), - ); - } -} - -class StatsIcon extends StatelessWidget { - const StatsIcon({Key key, @required this.navState}) : super(key: key); +class NavIcon extends StatelessWidget { + const NavIcon({ + Key key, + @required this.navState, + @required this.svgPath, + @required this.position + }) : super(key: key); final NavButtonsState navState; + final String svgPath; + final int position; @override Widget build(BuildContext context) { @@ -66,11 +52,11 @@ class StatsIcon extends StatelessWidget { padding: const EdgeInsets.all(32.0), child: AnimatedScale( duration: const Duration(milliseconds: 200), - scale: _getScale(1, navState), + scale: _getScale(position, navState), child: SvgPicture.asset( - R.svg.statsIcon, + svgPath, height: 32, - ).getShadedWidget(_getGradient(1, navState)), + ).getShadedWidget(_getGradient(position, navState)), ), ); } @@ -102,7 +88,7 @@ class NavButtonsState { int pressedIndex, }) { if ((selectedIndex == null || - identical(selectedIndex, this.selectedIndex)) && + identical(selectedIndex, this.selectedIndex)) && (pressedIndex == null || identical(pressedIndex, this.pressedIndex))) { return this; } @@ -112,4 +98,4 @@ class NavButtonsState { pressedIndex: pressedIndex ?? this.pressedIndex, ); } -} \ No newline at end of file +} diff --git a/lib/features/home/widgets/home_bottom_nav_bar.dart b/lib/features/home/widgets/home_bottom_nav_bar.dart index 85000c3..27056aa 100644 --- a/lib/features/home/widgets/home_bottom_nav_bar.dart +++ b/lib/features/home/widgets/home_bottom_nav_bar.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:productive/common/resources/r.dart'; import 'animated_nav_button.dart'; @@ -66,14 +67,22 @@ class _BottomNavState extends State { select: _selectHome, unTouch: _unTouch, touch: _touchHomeIcon, - child: HomeIcon(navState: navState), + child: NavIcon( + position: 0, + svgPath: R.svg.homeIcon, + navState: navState, + ), ), AnimatedNavIcon( navState: navState, select: _selectStats, unTouch: _unTouch, touch: _touchStatsIcon, - child: StatsIcon(navState: navState), + child: NavIcon( + position: 1, + svgPath: R.svg.statsIcon, + navState: navState, + ), ), ], ), diff --git a/test/features/home/home_screen_test.dart b/test/features/home/home_screen_test.dart index 333e3d1..2a0603b 100644 --- a/test/features/home/home_screen_test.dart +++ b/test/features/home/home_screen_test.dart @@ -24,4 +24,14 @@ void main() { }, ); }); + + group("Test BottomNav behaviors", () { + testWidgets( + "When a button is long pressed, it has 80% size", + (WidgetTester tester) async{ + await tester.pumpWidget(const HomeScreen().asScaffold); + // await tester.longPress(find.byType(type)) + }, + ); + }); } From 40bb54f4fc9fdb0fc1222405511c28df7525bfb3 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 27 Jun 2020 07:40:13 +0545 Subject: [PATCH 20/56] Removed unused import --- lib/features/home/widgets/animated_nav_button.dart | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/features/home/widgets/animated_nav_button.dart b/lib/features/home/widgets/animated_nav_button.dart index 4928300..9d6e871 100644 --- a/lib/features/home/widgets/animated_nav_button.dart +++ b/lib/features/home/widgets/animated_nav_button.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:productive/common/resources/r.dart'; import 'package:productive/utils/animation/animated_scale.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; @@ -35,12 +34,12 @@ class AnimatedNavIcon extends StatelessWidget { } class NavIcon extends StatelessWidget { - const NavIcon({ - Key key, - @required this.navState, - @required this.svgPath, - @required this.position - }) : super(key: key); + const NavIcon( + {Key key, + @required this.navState, + @required this.svgPath, + @required this.position}) + : super(key: key); final NavButtonsState navState; final String svgPath; From 2ef95ed5136825ef0b407909fbb59e5feec74242 Mon Sep 17 00:00:00 2001 From: erluxman Date: Mon, 29 Jun 2020 08:52:50 +0545 Subject: [PATCH 21/56] added some sandbox navigation testing code --- lib/features/home/widgets/home_screen.dart | 5 +- lib/features/splash/splash_screen.dart | 1 + lib/playground/testmain.dart | 72 ++++++++++++++++ .../animation/animated_scale_button.dart | 18 ++-- test/features/home/home_screen_test.dart | 12 +-- test/features/splash/splash_screen_test.dart | 10 +++ test/playgorund/testmain_test.dart | 82 +++++++++++++++++++ 7 files changed, 182 insertions(+), 18 deletions(-) create mode 100644 lib/playground/testmain.dart create mode 100644 test/playgorund/testmain_test.dart diff --git a/lib/features/home/widgets/home_screen.dart b/lib/features/home/widgets/home_screen.dart index d823212..895c344 100644 --- a/lib/features/home/widgets/home_screen.dart +++ b/lib/features/home/widgets/home_screen.dart @@ -16,7 +16,10 @@ class HomeScreen extends StatelessWidget { appBar: homeAppbar, floatingActionButton: const Padding( padding: EdgeInsets.symmetric(horizontal: 2, vertical: 2), - child: ScaleOnPressWidget(child: Fab()), + child: ScaleOnPressWidget( + gestureKey: "home_fab", + child: Fab(), + ), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: const BottomNav(), diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index 76c74dd..859f697 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -60,6 +60,7 @@ class SplashScreenBody extends StatelessWidget { ).withBlueGradientFg(), const Spacer(flex: 5), ScaleOnPressWidget( + gestureKey: "login", onTap: () { context.navigateTo(const HomeScreen(), replace: true); }, diff --git a/lib/playground/testmain.dart b/lib/playground/testmain.dart new file mode 100644 index 0000000..31ce763 --- /dev/null +++ b/lib/playground/testmain.dart @@ -0,0 +1,72 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import '../utils/extensions/navigation_extension.dart'; + +main() => runApp(DummyApp()); + +class DummyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Screen1(), + ); + } +} + +class Screen1 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Column( + children: [ + MaterialButton( + key: Key("go_screen_2"), + onPressed: () { + context.navigateTo(Screen2()); + }, + child: Text("Go to screen2"), + ), + GestureDetector( + key: Key("gd1"), + onTap: (){ + context.navigateTo(Screen2()); + }, + child: Text("Jump to screen2"), + ) + ], + ), + ), + ); + } +} + +class Screen2 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Column( + children: [ + MaterialButton( + key: Key("go_screen_1"), + onPressed: () { + context.navigateTo(Screen1()); +// Navigator.of(context) +// .push(MaterialPageRoute(builder: (context) => Screen1())); + }, + child: Text("Go to screen1"), + ), + GestureDetector( + key: Key("gd2"), + onTap: (){ + context.navigateTo(Screen1()); + }, + child: Text("Jump to screen1"), + ) + ], + ), + ), + ); + } +} diff --git a/lib/utils/animation/animated_scale_button.dart b/lib/utils/animation/animated_scale_button.dart index 698088a..3a4de6e 100644 --- a/lib/utils/animation/animated_scale_button.dart +++ b/lib/utils/animation/animated_scale_button.dart @@ -4,19 +4,22 @@ import 'package:flutter/material.dart'; import 'animated_scale.dart'; class ScaleOnPressWidget extends StatefulWidget { - const ScaleOnPressWidget({ - this.child, - this.onTap, - this.outerPadding = EdgeInsets.zero, - this.innerPadding = EdgeInsets.zero, - this.scaleFactor = 0.95, - }); + const ScaleOnPressWidget( + {this.child, + this.onTap, + this.outerPadding = EdgeInsets.zero, + this.innerPadding = EdgeInsets.zero, + this.scaleFactor = 0.95, + @required this.gestureKey, + Key key}) + : super(key: key); final Widget child; final GestureTapCallback onTap; final EdgeInsets outerPadding; final EdgeInsets innerPadding; final double scaleFactor; + final String gestureKey; @override _ScaleOnPressWidgetState createState() => _ScaleOnPressWidgetState(); @@ -38,6 +41,7 @@ class _ScaleOnPressWidgetState extends State { @override Widget build(BuildContext context) { return GestureDetector( + key: Key(widget.gestureKey), behavior: HitTestBehavior.opaque, onLongPressStart: (_) => _press, onLongPressEnd: (_) => _unPress, diff --git a/test/features/home/home_screen_test.dart b/test/features/home/home_screen_test.dart index 2a0603b..02ba0d4 100644 --- a/test/features/home/home_screen_test.dart +++ b/test/features/home/home_screen_test.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:productive/common/resources/r.dart'; import 'package:productive/features/home/widgets/home_app_bar.dart'; @@ -24,14 +25,5 @@ void main() { }, ); }); - - group("Test BottomNav behaviors", () { - testWidgets( - "When a button is long pressed, it has 80% size", - (WidgetTester tester) async{ - await tester.pumpWidget(const HomeScreen().asScaffold); - // await tester.longPress(find.byType(type)) - }, - ); - }); } + diff --git a/test/features/splash/splash_screen_test.dart b/test/features/splash/splash_screen_test.dart index 66f5800..086a748 100644 --- a/test/features/splash/splash_screen_test.dart +++ b/test/features/splash/splash_screen_test.dart @@ -34,5 +34,15 @@ void main() { expect(find.text(R.string.loginWithGoogle), findsOneWidget); }, ); + + testWidgets("Can navigate to HomeScreen", (WidgetTester tester) async { + await tester.pumpWidget(const SplashScreen().asScaffold); + final loginButton = find.byKey(const Key("login")); + expect(loginButton, findsOneWidget); + await tester.tap(loginButton); + await tester.pump(const Duration(seconds: 1)); + await tester.tap(loginButton); + //expect(find.text(R.string.todo), findsOneWidget); + }); }); } diff --git a/test/playgorund/testmain_test.dart b/test/playgorund/testmain_test.dart new file mode 100644 index 0000000..5c924df --- /dev/null +++ b/test/playgorund/testmain_test.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:productive/common/resources/r.dart'; +import 'package:productive/features/home/widgets/home_screen.dart'; +import 'package:productive/playground/testmain.dart'; +import '../utils/widget/test_utils.dart'; + +void main() { + group("Dummy widget test", () { + testWidgets( + "Screen contains a button to go to page2", + (WidgetTester tester) async { + await tester.pumpWidget(DummyApp()); + var buttonFinder = find.byType(MaterialButton); + expect(buttonFinder, findsOneWidget); + expect(find.text("Go to screen2"), findsOneWidget); + await tester.tap(buttonFinder); + await tester.pumpAndSettle(); + expect(buttonFinder, findsOneWidget); + expect(find.text("Go to screen1"), findsOneWidget); + expect(find.text("Go to screen2"), findsNothing); + await tester.tap(buttonFinder); + await tester.pumpAndSettle(); + expect(find.text("Go to screen2"), findsOneWidget); + }, + ); + + testWidgets( + "Gesture Detector also works like button", + (WidgetTester tester) async { + await tester.pumpWidget(DummyApp()); + expect(find.byKey(Key("gd1")), findsOneWidget); + expect(find.text("Jump to screen2"), findsOneWidget); + await tester.tap(find.byKey(Key("gd1"))); + await tester.pumpAndSettle(); + expect(find.byKey(Key("gd2")), findsOneWidget); + expect(find.text("Jump to screen1"), findsOneWidget); + expect(find.text("Jump to screen2"), findsNothing); + await tester.tap(find.byKey(Key("gd2"))); + await tester.pumpAndSettle(); + expect(find.byKey(Key("gd1")), findsOneWidget); + expect(find.text("Jump to screen2"), findsOneWidget); + }, + ); + }); + + group("dummy tests for reference doesn't mean anythign at all", () { + testWidgets( + "When a button is long pressed, it has 80% size", + (WidgetTester tester) async { + await tester.pumpWidget(const HomeScreen().asScaffold); + await tester.press(find.byWidgetPredicate((widget) => + (widget is SvgPicture) && + (widget.pictureProvider as ExactAssetPicture).assetName == + R.svg.homeIcon)); + await tester.pump(); + SvgPicture homeIcon = tester.firstWidget(find.byWidgetPredicate( + (widget) => + (widget is SvgPicture) && + (widget.pictureProvider as ExactAssetPicture).assetName == + R.svg.homeIcon)); + + double enlargedHomeIconHeight = homeIcon.height; + + await tester.press(find.byWidgetPredicate((widget) => + (widget is SvgPicture) && + (widget.pictureProvider as ExactAssetPicture).assetName == + R.svg.statsIcon)); + await tester.pump(); + homeIcon = tester.firstWidget(find.byWidgetPredicate((widget) => + (widget is SvgPicture) && + (widget.pictureProvider as ExactAssetPicture).assetName == + R.svg.homeIcon)); + double zoomedOutHeight = homeIcon.height; + + print("zooomed in $enlargedHomeIconHeight ZoomedOut $zoomedOutHeight"); + }, + ); + }); +} From 9af98b108217097ad600aafaecdffb3707442107 Mon Sep 17 00:00:00 2001 From: erluxman Date: Mon, 29 Jun 2020 09:05:14 +0545 Subject: [PATCH 22/56] Oh ye, the issue is not with splash screen, fully covered --- lib/features/home/widgets/home_screen.dart | 2 +- lib/features/splash/splash_screen.dart | 6 ++-- .../{testmain.dart => test_main.dart} | 31 ++++++++++++------- .../animation/animated_scale_button.dart | 3 -- test/features/splash/splash_screen_test.dart | 6 ++-- test/playgorund/testmain_test.dart | 24 ++++++-------- 6 files changed, 37 insertions(+), 35 deletions(-) rename lib/playground/{testmain.dart => test_main.dart} (64%) diff --git a/lib/features/home/widgets/home_screen.dart b/lib/features/home/widgets/home_screen.dart index 895c344..75cf074 100644 --- a/lib/features/home/widgets/home_screen.dart +++ b/lib/features/home/widgets/home_screen.dart @@ -17,7 +17,7 @@ class HomeScreen extends StatelessWidget { floatingActionButton: const Padding( padding: EdgeInsets.symmetric(horizontal: 2, vertical: 2), child: ScaleOnPressWidget( - gestureKey: "home_fab", + key: Key("home_fab"), child: Fab(), ), ), diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index 859f697..deecf40 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:lottie/lottie.dart'; import 'package:productive/common/resources/r.dart'; -import 'package:productive/features/home/widgets/home_screen.dart'; +import 'package:productive/playground/test_main.dart'; import 'package:productive/utils/animation/animated_scale_button.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; import 'package:productive/utils/extensions/navigation_extension.dart'; @@ -60,9 +60,9 @@ class SplashScreenBody extends StatelessWidget { ).withBlueGradientFg(), const Spacer(flex: 5), ScaleOnPressWidget( - gestureKey: "login", + key: const Key("login"), onTap: () { - context.navigateTo(const HomeScreen(), replace: true); + context.navigateTo(Screen1(), replace: true); }, outerPadding: const EdgeInsets.symmetric(horizontal: 48.0), innerPadding: diff --git a/lib/playground/testmain.dart b/lib/playground/test_main.dart similarity index 64% rename from lib/playground/testmain.dart rename to lib/playground/test_main.dart index 31ce763..c52c34f 100644 --- a/lib/playground/testmain.dart +++ b/lib/playground/test_main.dart @@ -1,8 +1,10 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:productive/features/home/widgets/home_screen.dart'; + import '../utils/extensions/navigation_extension.dart'; -main() => runApp(DummyApp()); +void main() => runApp(DummyApp()); class DummyApp extends StatelessWidget { @override @@ -21,18 +23,25 @@ class Screen1 extends StatelessWidget { child: Column( children: [ MaterialButton( - key: Key("go_screen_2"), + key: const Key("go_screen_2"), onPressed: () { context.navigateTo(Screen2()); }, - child: Text("Go to screen2"), + child: const Text("Go to screen2"), ), GestureDetector( - key: Key("gd1"), - onTap: (){ + key:const Key("gd1"), + onTap: () { context.navigateTo(Screen2()); }, - child: Text("Jump to screen2"), + child:const Text("Jump to screen2"), + ), + GestureDetector( + key:const Key("gotohome"), + onTap: () { + context.navigateTo(const HomeScreen()); + }, + child:const Text("Jump to home"), ) ], ), @@ -49,20 +58,20 @@ class Screen2 extends StatelessWidget { child: Column( children: [ MaterialButton( - key: Key("go_screen_1"), + key: const Key("go_screen_1"), onPressed: () { context.navigateTo(Screen1()); // Navigator.of(context) // .push(MaterialPageRoute(builder: (context) => Screen1())); }, - child: Text("Go to screen1"), + child: const Text("Go to screen1"), ), GestureDetector( - key: Key("gd2"), - onTap: (){ + key: const Key("gd2"), + onTap: () { context.navigateTo(Screen1()); }, - child: Text("Jump to screen1"), + child: const Text("Jump to screen1"), ) ], ), diff --git a/lib/utils/animation/animated_scale_button.dart b/lib/utils/animation/animated_scale_button.dart index 3a4de6e..9fc7429 100644 --- a/lib/utils/animation/animated_scale_button.dart +++ b/lib/utils/animation/animated_scale_button.dart @@ -10,7 +10,6 @@ class ScaleOnPressWidget extends StatefulWidget { this.outerPadding = EdgeInsets.zero, this.innerPadding = EdgeInsets.zero, this.scaleFactor = 0.95, - @required this.gestureKey, Key key}) : super(key: key); @@ -19,7 +18,6 @@ class ScaleOnPressWidget extends StatefulWidget { final EdgeInsets outerPadding; final EdgeInsets innerPadding; final double scaleFactor; - final String gestureKey; @override _ScaleOnPressWidgetState createState() => _ScaleOnPressWidgetState(); @@ -41,7 +39,6 @@ class _ScaleOnPressWidgetState extends State { @override Widget build(BuildContext context) { return GestureDetector( - key: Key(widget.gestureKey), behavior: HitTestBehavior.opaque, onLongPressStart: (_) => _press, onLongPressEnd: (_) => _unPress, diff --git a/test/features/splash/splash_screen_test.dart b/test/features/splash/splash_screen_test.dart index 086a748..12cfe8d 100644 --- a/test/features/splash/splash_screen_test.dart +++ b/test/features/splash/splash_screen_test.dart @@ -40,9 +40,9 @@ void main() { final loginButton = find.byKey(const Key("login")); expect(loginButton, findsOneWidget); await tester.tap(loginButton); - await tester.pump(const Duration(seconds: 1)); - await tester.tap(loginButton); - //expect(find.text(R.string.todo), findsOneWidget); + await tester.pumpAndSettle(); + expect(loginButton, findsNothing); + expect(find.byKey(const Key("go_screen_2")), findsOneWidget); }); }); } diff --git a/test/playgorund/testmain_test.dart b/test/playgorund/testmain_test.dart index 5c924df..9d30081 100644 --- a/test/playgorund/testmain_test.dart +++ b/test/playgorund/testmain_test.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:productive/common/resources/r.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; -import 'package:productive/playground/testmain.dart'; +import 'package:productive/playground/test_main.dart'; + import '../utils/widget/test_utils.dart'; void main() { @@ -13,7 +13,7 @@ void main() { "Screen contains a button to go to page2", (WidgetTester tester) async { await tester.pumpWidget(DummyApp()); - var buttonFinder = find.byType(MaterialButton); + final buttonFinder = find.byType(MaterialButton); expect(buttonFinder, findsOneWidget); expect(find.text("Go to screen2"), findsOneWidget); await tester.tap(buttonFinder); @@ -31,22 +31,22 @@ void main() { "Gesture Detector also works like button", (WidgetTester tester) async { await tester.pumpWidget(DummyApp()); - expect(find.byKey(Key("gd1")), findsOneWidget); + expect(find.byKey(const Key("gd1")), findsOneWidget); expect(find.text("Jump to screen2"), findsOneWidget); - await tester.tap(find.byKey(Key("gd1"))); + await tester.tap(find.byKey(const Key("gd1"))); await tester.pumpAndSettle(); - expect(find.byKey(Key("gd2")), findsOneWidget); + expect(find.byKey(const Key("gd2")), findsOneWidget); expect(find.text("Jump to screen1"), findsOneWidget); expect(find.text("Jump to screen2"), findsNothing); - await tester.tap(find.byKey(Key("gd2"))); + await tester.tap(find.byKey(const Key("gd2"))); await tester.pumpAndSettle(); - expect(find.byKey(Key("gd1")), findsOneWidget); + expect(find.byKey(const Key("gd1")), findsOneWidget); expect(find.text("Jump to screen2"), findsOneWidget); }, ); }); - group("dummy tests for reference doesn't mean anythign at all", () { + group("dummy tests for reference doesn't mean anything at all", () { testWidgets( "When a button is long pressed, it has 80% size", (WidgetTester tester) async { @@ -62,8 +62,6 @@ void main() { (widget.pictureProvider as ExactAssetPicture).assetName == R.svg.homeIcon)); - double enlargedHomeIconHeight = homeIcon.height; - await tester.press(find.byWidgetPredicate((widget) => (widget is SvgPicture) && (widget.pictureProvider as ExactAssetPicture).assetName == @@ -73,9 +71,7 @@ void main() { (widget is SvgPicture) && (widget.pictureProvider as ExactAssetPicture).assetName == R.svg.homeIcon)); - double zoomedOutHeight = homeIcon.height; - - print("zooomed in $enlargedHomeIconHeight ZoomedOut $zoomedOutHeight"); + homeIcon.asScaffold; }, ); }); From 7fe7837f041055f2e2aa26004455462e8c141d62 Mon Sep 17 00:00:00 2001 From: erluxman Date: Tue, 30 Jun 2020 07:36:46 +0545 Subject: [PATCH 23/56] Add build modes and make UI during testing if they make network call --- lib/common/resources/r.dart | 5 +++++ lib/features/home/widgets/home_app_bar.dart | 19 +++++++++---------- lib/features/home/widgets/home_screen.dart | 3 ++- lib/features/splash/splash_screen.dart | 4 ++-- test/features/home/home_screen_test.dart | 3 ++- test/features/splash/splash_screen_test.dart | 14 ++++++++++++-- 6 files changed, 32 insertions(+), 16 deletions(-) diff --git a/lib/common/resources/r.dart b/lib/common/resources/r.dart index f1dfbf0..c488906 100644 --- a/lib/common/resources/r.dart +++ b/lib/common/resources/r.dart @@ -4,6 +4,7 @@ class R { static LottieFiles lottie = LottieFiles(); static AudioFiles audio = AudioFiles(); static Placeholders placeholders = Placeholders(); + static BuildMode buildMode = BuildMode(); } class Placeholders { @@ -33,3 +34,7 @@ class AudioFiles { String splashBreeze = "assets/sounds/wind.mp3"; String welcomeTone = "assets/sounds/point.mp3"; } + +class BuildMode{ + bool isTesting = false; +} diff --git a/lib/features/home/widgets/home_app_bar.dart b/lib/features/home/widgets/home_app_bar.dart index 99da82b..a463a22 100644 --- a/lib/features/home/widgets/home_app_bar.dart +++ b/lib/features/home/widgets/home_app_bar.dart @@ -40,16 +40,15 @@ class DisplayPic extends StatelessWidget { Widget build(BuildContext context) { return ClipRRect( borderRadius: BorderRadius.circular(200), - child: CachedNetworkImage( - imageUrl: R.placeholders.johDoeImage, - placeholder: (context, url) => const CircularProgressIndicator(), - errorWidget: (context, url, error) => Icon(Icons.error), - height: height, - width: width, - ), + child: R.buildMode.isTesting + ? Container() + : CachedNetworkImage( + imageUrl: R.placeholders.johDoeImage, + placeholder: (context, url) => const CircularProgressIndicator(), + errorWidget: (context, url, error) => Icon(Icons.error), + height: height, + width: width, + ), ); } } - -AppBar homeAppbar = - AppBar(title: const AppbarContent(), automaticallyImplyLeading: false); diff --git a/lib/features/home/widgets/home_screen.dart b/lib/features/home/widgets/home_screen.dart index 75cf074..099b3e1 100644 --- a/lib/features/home/widgets/home_screen.dart +++ b/lib/features/home/widgets/home_screen.dart @@ -13,7 +13,8 @@ class HomeScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( body: const HomeBody(), - appBar: homeAppbar, + appBar: AppBar( + title: const AppbarContent(), automaticallyImplyLeading: false), floatingActionButton: const Padding( padding: EdgeInsets.symmetric(horizontal: 2, vertical: 2), child: ScaleOnPressWidget( diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index deecf40..5140e66 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:lottie/lottie.dart'; import 'package:productive/common/resources/r.dart'; -import 'package:productive/playground/test_main.dart'; +import 'package:productive/features/home/widgets/home_screen.dart'; import 'package:productive/utils/animation/animated_scale_button.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; import 'package:productive/utils/extensions/navigation_extension.dart'; @@ -62,7 +62,7 @@ class SplashScreenBody extends StatelessWidget { ScaleOnPressWidget( key: const Key("login"), onTap: () { - context.navigateTo(Screen1(), replace: true); + context.navigateTo(const HomeScreen(), replace: true); }, outerPadding: const EdgeInsets.symmetric(horizontal: 48.0), innerPadding: diff --git a/test/features/home/home_screen_test.dart b/test/features/home/home_screen_test.dart index 02ba0d4..e3ac774 100644 --- a/test/features/home/home_screen_test.dart +++ b/test/features/home/home_screen_test.dart @@ -1,5 +1,5 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:productive/common/resources/r.dart'; import 'package:productive/features/home/widgets/home_app_bar.dart'; @@ -19,6 +19,7 @@ void main() { expect(find.byType(RaisedButton), findsOneWidget); expect(find.byType(BottomNav), findsOneWidget); expect(find.byType(AppbarContent), findsOneWidget); + expect(find.byType(CachedNetworkImage), findsOneWidget); await tester.pumpWidget(const Fab().testWidget); expect(find.text(R.string.addTodo), findsOneWidget); diff --git a/test/features/splash/splash_screen_test.dart b/test/features/splash/splash_screen_test.dart index 12cfe8d..1e3ce2f 100644 --- a/test/features/splash/splash_screen_test.dart +++ b/test/features/splash/splash_screen_test.dart @@ -2,13 +2,22 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:lottie/lottie.dart'; import 'package:productive/common/resources/r.dart'; +import 'package:productive/features/home/widgets/home_body.dart'; +import 'package:productive/features/home/widgets/home_fab.dart'; import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/utils/animation/animated_scale.dart'; - import '../../utils/widget/test_utils.dart'; void main() { + group("All required widgets are on the Splash screen", () { + setUpAll((){ + R.buildMode.isTesting = true; + }); + + tearDownAll((){ + R.buildMode.isTesting = false; + }); testWidgets( "There is Lottie Widget", (WidgetTester tester) async { @@ -42,7 +51,8 @@ void main() { await tester.tap(loginButton); await tester.pumpAndSettle(); expect(loginButton, findsNothing); - expect(find.byKey(const Key("go_screen_2")), findsOneWidget); + expect(find.byType(HomeBody), findsOneWidget); + expect(find.byType(Fab), findsOneWidget); }); }); } From fa60bcb75e048501c471f4caf50896b9b06547ec Mon Sep 17 00:00:00 2001 From: erluxman Date: Sun, 19 Jul 2020 08:17:18 +0545 Subject: [PATCH 24/56] Added preview dependency --- pubspec.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/pubspec.yaml b/pubspec.yaml index 78be950..1e99684 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: google_fonts: ^1.1.0 flutter_svg: ^0.17.4 lottie: ^0.4.0+1 + preview: ^0.0.8 cached_network_image: ^2.2.0+1 #Architecture From e88ce90e4b81f02a0859719dc7a34c320c4847b6 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sun, 19 Jul 2020 08:54:20 +0545 Subject: [PATCH 25/56] Added test for main() method --- lib/playground/test_main.dart | 2 -- test/main_test.dart | 7 ++++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/playground/test_main.dart b/lib/playground/test_main.dart index c52c34f..ee9327c 100644 --- a/lib/playground/test_main.dart +++ b/lib/playground/test_main.dart @@ -4,8 +4,6 @@ import 'package:productive/features/home/widgets/home_screen.dart'; import '../utils/extensions/navigation_extension.dart'; -void main() => runApp(DummyApp()); - class DummyApp extends StatelessWidget { @override Widget build(BuildContext context) { diff --git a/test/main_test.dart b/test/main_test.dart index 954b84f..159c68d 100644 --- a/test/main_test.dart +++ b/test/main_test.dart @@ -1,14 +1,19 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:productive/main.dart' as app; import 'package:productive/main.dart'; void main() { group("Basic App Setup test", () { - testWidgets('App Follows MaterialTheme', (WidgetTester tester) async { + testWidgets('App is MaterialApp', (WidgetTester tester) async { await tester.pumpWidget(ProductiveApp( testChild: Container(), )); expect(find.byType(MaterialApp), findsOneWidget); }); + + testWidgets("main method runs successfully", (WidgetTester tester) async { + app.main(); + }); }); } From 8545c688501dde4b8e2d4765638d6a0a586a826b Mon Sep 17 00:00:00 2001 From: erluxman Date: Sun, 19 Jul 2020 09:03:15 +0545 Subject: [PATCH 26/56] Removed navigation to app from playground --- lib/playground/test_main.dart | 11 ++--------- test/features/home/home_screen_test.dart | 2 +- test/features/splash/splash_screen_test.dart | 2 +- test/playgorund/testmain_test.dart | 2 +- test/{utils/widget => test_utils}/test_utils.dart | 0 test/utils/extensions/gradient_extensions_test.dart | 0 6 files changed, 5 insertions(+), 12 deletions(-) rename test/{utils/widget => test_utils}/test_utils.dart (100%) create mode 100644 test/utils/extensions/gradient_extensions_test.dart diff --git a/lib/playground/test_main.dart b/lib/playground/test_main.dart index ee9327c..be1ea03 100644 --- a/lib/playground/test_main.dart +++ b/lib/playground/test_main.dart @@ -28,19 +28,12 @@ class Screen1 extends StatelessWidget { child: const Text("Go to screen2"), ), GestureDetector( - key:const Key("gd1"), + key: const Key("gd1"), onTap: () { context.navigateTo(Screen2()); }, - child:const Text("Jump to screen2"), + child: const Text("Jump to screen2"), ), - GestureDetector( - key:const Key("gotohome"), - onTap: () { - context.navigateTo(const HomeScreen()); - }, - child:const Text("Jump to home"), - ) ], ), ), diff --git a/test/features/home/home_screen_test.dart b/test/features/home/home_screen_test.dart index e3ac774..5a96317 100644 --- a/test/features/home/home_screen_test.dart +++ b/test/features/home/home_screen_test.dart @@ -7,7 +7,7 @@ import 'package:productive/features/home/widgets/home_bottom_nav_bar.dart'; import 'package:productive/features/home/widgets/home_fab.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; -import '../../utils/widget/test_utils.dart'; +import '../../test_utils/test_utils.dart'; void main() { group("All required widgets are on the Home screen", () { diff --git a/test/features/splash/splash_screen_test.dart b/test/features/splash/splash_screen_test.dart index 1e3ce2f..d5cb42c 100644 --- a/test/features/splash/splash_screen_test.dart +++ b/test/features/splash/splash_screen_test.dart @@ -6,7 +6,7 @@ import 'package:productive/features/home/widgets/home_body.dart'; import 'package:productive/features/home/widgets/home_fab.dart'; import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/utils/animation/animated_scale.dart'; -import '../../utils/widget/test_utils.dart'; +import '../../test_utils/test_utils.dart'; void main() { diff --git a/test/playgorund/testmain_test.dart b/test/playgorund/testmain_test.dart index 9d30081..7799e74 100644 --- a/test/playgorund/testmain_test.dart +++ b/test/playgorund/testmain_test.dart @@ -5,7 +5,7 @@ import 'package:productive/common/resources/r.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; import 'package:productive/playground/test_main.dart'; -import '../utils/widget/test_utils.dart'; +import '../test_utils/test_utils.dart'; void main() { group("Dummy widget test", () { diff --git a/test/utils/widget/test_utils.dart b/test/test_utils/test_utils.dart similarity index 100% rename from test/utils/widget/test_utils.dart rename to test/test_utils/test_utils.dart diff --git a/test/utils/extensions/gradient_extensions_test.dart b/test/utils/extensions/gradient_extensions_test.dart new file mode 100644 index 0000000..e69de29 From 36abfbcc1bf0485988e4e90e1c6110efc82e3418 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sun, 19 Jul 2020 09:28:16 +0545 Subject: [PATCH 27/56] Optimized imports --- lib/playground/test_main.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/playground/test_main.dart b/lib/playground/test_main.dart index be1ea03..a28d0cd 100644 --- a/lib/playground/test_main.dart +++ b/lib/playground/test_main.dart @@ -1,15 +1,12 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:productive/features/home/widgets/home_screen.dart'; import '../utils/extensions/navigation_extension.dart'; class DummyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp( - home: Screen1(), - ); + return MaterialApp(home: Screen1(),); } } From 685c6bef6e3d597cc61686f715b6fd155fa5391d Mon Sep 17 00:00:00 2001 From: erluxman Date: Sun, 19 Jul 2020 10:19:49 +0545 Subject: [PATCH 28/56] Added test for gradients --- test/test_utils/test_utils.dart | 2 ++ .../extensions/gradient_extensions_test.dart | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/test/test_utils/test_utils.dart b/test/test_utils/test_utils.dart index 8853ad7..ef7394a 100644 --- a/test/test_utils/test_utils.dart +++ b/test/test_utils/test_utils.dart @@ -5,4 +5,6 @@ extension TestWidget on Widget { Directionality(textDirection: TextDirection.ltr, child: this); Widget get asScaffold => MaterialApp(home: this); + + Widget get insideMaterialApp =>MaterialApp(home: Scaffold(body: this,)); } diff --git a/test/utils/extensions/gradient_extensions_test.dart b/test/utils/extensions/gradient_extensions_test.dart index e69de29..efb1812 100644 --- a/test/utils/extensions/gradient_extensions_test.dart +++ b/test/utils/extensions/gradient_extensions_test.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:productive/utils/extensions/gradient_extensions.dart'; + +import '../../test_utils/test_utils.dart'; + +void main() { + group("Gradient Extensions Test", () { + testWidgets( + "Gradient on Foreground Test", + (WidgetTester tester) async { + final Widget blueFg = const Text("").withBlueGradientFg().testWidget; + await tester.pumpWidget(blueFg); + expect(find.byType(ShaderMask), findsOneWidget); + final Widget greyFg = const Text("").withBlueGradientFg().testWidget; + await tester.pumpWidget(greyFg); + expect(find.byType(ShaderMask), findsOneWidget); + }, + ); + + testWidgets( + "Gradient on Background Test", + (WidgetTester tester) async { + final Widget blueBg = + const Text("").withBlueGradientBg().insideMaterialApp; + await tester.pumpWidget(blueBg); + expect(find.byType(Ink), findsOneWidget); + }, + ); + }); +} From 2af773fcc1c2db6d07041044f4ae7a951027e637 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sun, 19 Jul 2020 10:29:28 +0545 Subject: [PATCH 29/56] Removed some flaky tests --- test/playgorund/testmain_test.dart | 35 ------------------------------ 1 file changed, 35 deletions(-) diff --git a/test/playgorund/testmain_test.dart b/test/playgorund/testmain_test.dart index 7799e74..efb60fd 100644 --- a/test/playgorund/testmain_test.dart +++ b/test/playgorund/testmain_test.dart @@ -1,12 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:productive/common/resources/r.dart'; -import 'package:productive/features/home/widgets/home_screen.dart'; import 'package:productive/playground/test_main.dart'; -import '../test_utils/test_utils.dart'; - void main() { group("Dummy widget test", () { testWidgets( @@ -45,34 +40,4 @@ void main() { }, ); }); - - group("dummy tests for reference doesn't mean anything at all", () { - testWidgets( - "When a button is long pressed, it has 80% size", - (WidgetTester tester) async { - await tester.pumpWidget(const HomeScreen().asScaffold); - await tester.press(find.byWidgetPredicate((widget) => - (widget is SvgPicture) && - (widget.pictureProvider as ExactAssetPicture).assetName == - R.svg.homeIcon)); - await tester.pump(); - SvgPicture homeIcon = tester.firstWidget(find.byWidgetPredicate( - (widget) => - (widget is SvgPicture) && - (widget.pictureProvider as ExactAssetPicture).assetName == - R.svg.homeIcon)); - - await tester.press(find.byWidgetPredicate((widget) => - (widget is SvgPicture) && - (widget.pictureProvider as ExactAssetPicture).assetName == - R.svg.statsIcon)); - await tester.pump(); - homeIcon = tester.firstWidget(find.byWidgetPredicate((widget) => - (widget is SvgPicture) && - (widget.pictureProvider as ExactAssetPicture).assetName == - R.svg.homeIcon)); - homeIcon.asScaffold; - }, - ); - }); } From 3993e6056fcdce50261619fa2bdcc4fef6df6d0b Mon Sep 17 00:00:00 2001 From: erluxman Date: Sun, 19 Jul 2020 11:10:28 +0545 Subject: [PATCH 30/56] Added tests for ScaledOnPressWidget --- lib/features/home/widgets/home_screen.dart | 2 +- lib/features/splash/splash_screen.dart | 2 +- ..._button.dart => scale_on_press_widget.dart} | 1 - .../animation/scale_on_press_widget_test.dart | 18 ++++++++++++++++++ .../extensions/gradient_extensions_test.dart | 2 +- 5 files changed, 21 insertions(+), 4 deletions(-) rename lib/utils/animation/{animated_scale_button.dart => scale_on_press_widget.dart} (98%) create mode 100644 test/utils/animation/scale_on_press_widget_test.dart diff --git a/lib/features/home/widgets/home_screen.dart b/lib/features/home/widgets/home_screen.dart index 099b3e1..1f49d7d 100644 --- a/lib/features/home/widgets/home_screen.dart +++ b/lib/features/home/widgets/home_screen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:productive/features/home/widgets/home_body.dart'; -import 'package:productive/utils/animation/animated_scale_button.dart'; +import 'package:productive/utils/animation/scale_on_press_widget.dart'; import 'home_app_bar.dart'; import 'home_bottom_nav_bar.dart'; diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index 5140e66..fb17f96 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -4,7 +4,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:lottie/lottie.dart'; import 'package:productive/common/resources/r.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; -import 'package:productive/utils/animation/animated_scale_button.dart'; +import 'package:productive/utils/animation/scale_on_press_widget.dart'; import 'package:productive/utils/extensions/gradient_extensions.dart'; import 'package:productive/utils/extensions/navigation_extension.dart'; diff --git a/lib/utils/animation/animated_scale_button.dart b/lib/utils/animation/scale_on_press_widget.dart similarity index 98% rename from lib/utils/animation/animated_scale_button.dart rename to lib/utils/animation/scale_on_press_widget.dart index 9fc7429..9aa29be 100644 --- a/lib/utils/animation/animated_scale_button.dart +++ b/lib/utils/animation/scale_on_press_widget.dart @@ -46,7 +46,6 @@ class _ScaleOnPressWidgetState extends State { onTapUp: (_) => _unPress, onLongPress: _press, onLongPressUp: _unPress, - onSecondaryTapUp: (_) => _unPress, onDoubleTap: _press, onTap: widget.onTap, child: Padding( diff --git a/test/utils/animation/scale_on_press_widget_test.dart b/test/utils/animation/scale_on_press_widget_test.dart new file mode 100644 index 0000000..7e96bba --- /dev/null +++ b/test/utils/animation/scale_on_press_widget_test.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:productive/utils/animation/scale_on_press_widget.dart'; + +import '../../test_utils/test_utils.dart'; + +void main() { + group("Gradient Extensions Test", () { + testWidgets("Gradient on Foreground Test", (WidgetTester tester) async { + final Widget scaledIcon = + ScaleOnPressWidget(child: Icon(Icons.ac_unit)).testWidget; + await tester.pumpWidget(scaledIcon); + expect(find.byType(GestureDetector), findsOneWidget); + await tester.press(find.byType(GestureDetector)); + await tester.longPress(find.byType(GestureDetector)); + }); + }); +} diff --git a/test/utils/extensions/gradient_extensions_test.dart b/test/utils/extensions/gradient_extensions_test.dart index efb1812..cddf01f 100644 --- a/test/utils/extensions/gradient_extensions_test.dart +++ b/test/utils/extensions/gradient_extensions_test.dart @@ -12,7 +12,7 @@ void main() { final Widget blueFg = const Text("").withBlueGradientFg().testWidget; await tester.pumpWidget(blueFg); expect(find.byType(ShaderMask), findsOneWidget); - final Widget greyFg = const Text("").withBlueGradientFg().testWidget; + final Widget greyFg = const Text("").withGreyGradientFg().testWidget; await tester.pumpWidget(greyFg); expect(find.byType(ShaderMask), findsOneWidget); }, From e41f1a979a8291ace06767b28e9f3a40f943ee45 Mon Sep 17 00:00:00 2001 From: erluxman Date: Thu, 23 Jul 2020 07:44:10 +0545 Subject: [PATCH 31/56] Removed const from Splash Screen --- lib/features/home/widgets/home_app_bar.dart | 1 - test/features/home/animated_motivation_meter_test.dart | 4 ++++ test/features/splash/splash_screen_test.dart | 10 +++++----- 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 test/features/home/animated_motivation_meter_test.dart diff --git a/lib/features/home/widgets/home_app_bar.dart b/lib/features/home/widgets/home_app_bar.dart index a463a22..0a79d4c 100644 --- a/lib/features/home/widgets/home_app_bar.dart +++ b/lib/features/home/widgets/home_app_bar.dart @@ -45,7 +45,6 @@ class DisplayPic extends StatelessWidget { : CachedNetworkImage( imageUrl: R.placeholders.johDoeImage, placeholder: (context, url) => const CircularProgressIndicator(), - errorWidget: (context, url, error) => Icon(Icons.error), height: height, width: width, ), diff --git a/test/features/home/animated_motivation_meter_test.dart b/test/features/home/animated_motivation_meter_test.dart new file mode 100644 index 0000000..6814464 --- /dev/null +++ b/test/features/home/animated_motivation_meter_test.dart @@ -0,0 +1,4 @@ +void main(){ + + +} \ No newline at end of file diff --git a/test/features/splash/splash_screen_test.dart b/test/features/splash/splash_screen_test.dart index d5cb42c..fac6d2f 100644 --- a/test/features/splash/splash_screen_test.dart +++ b/test/features/splash/splash_screen_test.dart @@ -6,22 +6,22 @@ import 'package:productive/features/home/widgets/home_body.dart'; import 'package:productive/features/home/widgets/home_fab.dart'; import 'package:productive/features/splash/splash_screen.dart'; import 'package:productive/utils/animation/animated_scale.dart'; + import '../../test_utils/test_utils.dart'; void main() { - group("All required widgets are on the Splash screen", () { - setUpAll((){ + setUpAll(() { R.buildMode.isTesting = true; }); - tearDownAll((){ + tearDownAll(() { R.buildMode.isTesting = false; }); testWidgets( "There is Lottie Widget", (WidgetTester tester) async { - await tester.pumpWidget(const SplashScreen().asScaffold); + await tester.pumpWidget(SplashScreen().asScaffold); expect(find.byType(LottieBuilder), findsOneWidget); }, ); @@ -29,7 +29,7 @@ void main() { testWidgets( "There is a Productive Text Logo", (WidgetTester tester) async { - await tester.pumpWidget(const SplashScreen().asScaffold); + await tester.pumpWidget(SplashScreen().asScaffold); expect(find.byType(ShaderMask), findsOneWidget); expect(find.text(R.string.appName), findsOneWidget); }, From bfa65efa2097257ad10ddce515e81f582e1331df Mon Sep 17 00:00:00 2001 From: erluxman Date: Thu, 23 Jul 2020 07:52:07 +0545 Subject: [PATCH 32/56] Changed the way to call const constructor in tests --- test/features/splash/splash_screen_test.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/features/splash/splash_screen_test.dart b/test/features/splash/splash_screen_test.dart index fac6d2f..65dcd95 100644 --- a/test/features/splash/splash_screen_test.dart +++ b/test/features/splash/splash_screen_test.dart @@ -21,7 +21,8 @@ void main() { testWidgets( "There is Lottie Widget", (WidgetTester tester) async { - await tester.pumpWidget(SplashScreen().asScaffold); + const splash = SplashScreen(); + await tester.pumpWidget(splash.asScaffold); expect(find.byType(LottieBuilder), findsOneWidget); }, ); @@ -29,8 +30,8 @@ void main() { testWidgets( "There is a Productive Text Logo", (WidgetTester tester) async { - await tester.pumpWidget(SplashScreen().asScaffold); - expect(find.byType(ShaderMask), findsOneWidget); + const splash = SplashScreen(); + await tester.pumpWidget(splash.asScaffold); expect(find.text(R.string.appName), findsOneWidget); }, ); From 4d096bacf89a32686c6640e94e6422bfd5eac3c6 Mon Sep 17 00:00:00 2001 From: erluxman Date: Thu, 23 Jul 2020 08:02:26 +0545 Subject: [PATCH 33/56] Tried to fix the codecoverage with key --- test/features/splash/splash_screen_test.dart | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/features/splash/splash_screen_test.dart b/test/features/splash/splash_screen_test.dart index 65dcd95..6923d43 100644 --- a/test/features/splash/splash_screen_test.dart +++ b/test/features/splash/splash_screen_test.dart @@ -21,8 +21,9 @@ void main() { testWidgets( "There is Lottie Widget", (WidgetTester tester) async { - const splash = SplashScreen(); - await tester.pumpWidget(splash.asScaffold); + await tester.pumpWidget(const SplashScreen( + key: ValueKey("Hello"), + ).asScaffold); expect(find.byType(LottieBuilder), findsOneWidget); }, ); @@ -30,8 +31,8 @@ void main() { testWidgets( "There is a Productive Text Logo", (WidgetTester tester) async { - const splash = SplashScreen(); - await tester.pumpWidget(splash.asScaffold); + await tester.pumpWidget(const SplashScreen().asScaffold); + expect(find.byType(ShaderMask), findsOneWidget); expect(find.text(R.string.appName), findsOneWidget); }, ); From 274ec2c3d11edb88558ac8879ba1564aad4a2d05 Mon Sep 17 00:00:00 2001 From: erluxman Date: Thu, 23 Jul 2020 08:27:01 +0545 Subject: [PATCH 34/56] Yet another attempt --- test/features/splash/splash_screen_test.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/features/splash/splash_screen_test.dart b/test/features/splash/splash_screen_test.dart index 6923d43..ef9fa43 100644 --- a/test/features/splash/splash_screen_test.dart +++ b/test/features/splash/splash_screen_test.dart @@ -21,9 +21,8 @@ void main() { testWidgets( "There is Lottie Widget", (WidgetTester tester) async { - await tester.pumpWidget(const SplashScreen( - key: ValueKey("Hello"), - ).asScaffold); + // ignore: prefer_const_constructors + await tester.pumpWidget(SplashScreen().asScaffold); expect(find.byType(LottieBuilder), findsOneWidget); }, ); From 01a28960b88469f2b39731d9372b901f1d2920cf Mon Sep 17 00:00:00 2001 From: erluxman Date: Thu, 23 Jul 2020 09:50:23 +0545 Subject: [PATCH 35/56] Yet another attempt --- coverage/lcov.info | 365 +++++++++++++++++++ lib/features/splash/splash_screen.dart | 25 +- test/features/splash/splash_screen_test.dart | 6 +- 3 files changed, 385 insertions(+), 11 deletions(-) create mode 100644 coverage/lcov.info diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 0000000..9959c24 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,365 @@ +SF:lib/utils/animation/scale_on_press_widget.dart +DA:7,3 +DA:14,3 +DA:22,4 +DA:23,4 +DA:29,0 +DA:31,2 +DA:33,1 +DA:34,2 +DA:35,1 +DA:39,4 +DA:41,4 +DA:43,2 +DA:44,0 +DA:45,2 +DA:46,0 +DA:47,4 +DA:48,4 +DA:49,4 +DA:50,8 +DA:51,4 +DA:52,8 +DA:53,4 +DA:54,8 +DA:55,6 +DA:57,4 +DA:58,8 +DA:60,8 +DA:61,4 +DA:62,4 +DA:63,4 +DA:65,4 +DA:66,4 +DA:67,4 +DA:70,4 +DA:72,8 +LF:35 +LH:32 +end_of_record +SF:lib/utils/animation/animated_scale.dart +DA:5,4 +DA:13,8 +DA:14,4 +DA:22,4 +DA:23,4 +DA:30,4 +DA:32,20 +DA:33,8 +DA:37,4 +DA:39,16 +DA:42,4 +DA:43,4 +DA:44,4 +DA:45,8 +DA:46,8 +LF:15 +LH:15 +end_of_record +SF:lib/common/resources/r.dart +DA:2,9 +DA:3,9 +DA:4,6 +DA:5,9 +DA:6,3 +DA:7,6 +LF:6 +LH:6 +end_of_record +SF:lib/features/home/widgets/home_app_bar.dart +DA:9,0 +DA:11,1 +DA:13,1 +DA:15,1 +DA:16,1 +DA:23,1 +DA:24,2 +DA:25,1 +DA:27,3 +DA:34,0 +DA:39,1 +DA:41,1 +DA:42,1 +DA:43,2 +DA:44,0 +DA:45,1 +DA:46,2 +DA:47,1 +DA:48,1 +DA:49,1 +LF:20 +LH:17 +end_of_record +SF:lib/features/home/widgets/home_bottom_nav_bar.dart +DA:7,0 +DA:9,1 +DA:10,1 +DA:17,0 +DA:18,0 +DA:19,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:29,0 +DA:31,0 +DA:33,0 +DA:35,0 +DA:37,0 +DA:39,1 +DA:41,1 +DA:49,1 +DA:54,1 +DA:62,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:72,2 +DA:73,1 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,1 +DA:83,2 +DA:84,1 +LF:36 +LH:24 +end_of_record +SF:lib/features/home/widgets/home_fab.dart +DA:8,0 +DA:10,1 +DA:12,1 +DA:15,0 +DA:16,0 +DA:18,2 +DA:20,1 +DA:22,1 +DA:23,2 +DA:25,1 +DA:28,1 +LF:11 +LH:8 +end_of_record +SF:lib/features/home/widgets/home_screen.dart +DA:10,0 +DA:12,1 +DA:14,1 +DA:16,1 +LF:4 +LH:3 +end_of_record +SF:lib/features/home/widgets/animated_circle_progress.dart +DA:9,0 +DA:14,0 +DA:15,0 +DA:21,1 +DA:23,1 +DA:32,1 +DA:34,1 +DA:35,5 +DA:36,2 +DA:38,2 +DA:39,3 +DA:40,2 +DA:41,4 +DA:42,2 +DA:43,2 +DA:45,2 +DA:48,1 +DA:50,1 +DA:52,5 +DA:53,5 +DA:57,1 +DA:59,2 +DA:60,2 +DA:61,1 +DA:66,1 +DA:67,9 +DA:77,1 +DA:79,2 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,2 +DA:85,1 +DA:86,1 +DA:87,2 +DA:88,1 +DA:89,1 +DA:90,5 +DA:91,1 +DA:92,1 +DA:94,1 +DA:95,1 +DA:96,5 +DA:97,1 +DA:98,1 +DA:99,1 +DA:100,1 +DA:102,1 +DA:105,0 +LF:49 +LH:45 +end_of_record +SF:lib/utils/extensions/gradient_extensions.dart +DA:4,3 +DA:5,6 +DA:8,1 +DA:9,2 +DA:12,4 +DA:13,4 +DA:15,4 +DA:16,4 +DA:22,2 +DA:25,2 +DA:26,2 +DA:27,2 +DA:35,12 +DA:36,6 +DA:38,4 +DA:39,4 +LF:16 +LH:16 +end_of_record +SF:lib/features/home/widgets/animated_nav_button.dart +DA:7,1 +DA:14,1 +DA:21,1 +DA:23,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,1 +DA:37,1 +DA:42,1 +DA:48,1 +DA:50,1 +DA:52,1 +DA:54,3 +DA:55,1 +DA:56,1 +DA:58,4 +DA:64,1 +DA:65,2 +DA:66,1 +DA:67,1 +DA:70,1 +DA:71,2 +DA:72,0 +DA:73,2 +DA:74,2 +DA:75,2 +DA:80,0 +DA:85,0 +DA:90,0 +DA:91,0 +DA:95,0 +DA:96,0 +DA:97,0 +LF:37 +LH:26 +end_of_record +SF:lib/features/home/widgets/home_body.dart +DA:5,0 +DA:7,1 +DA:9,1 +DA:10,3 +LF:4 +LH:3 +end_of_record +SF:lib/features/splash/splash_screen.dart +DA:12,2 +DA:14,2 +DA:15,2 +DA:21,2 +DA:23,2 +DA:24,10 +DA:31,2 +DA:38,2 +DA:40,2 +DA:41,4 +DA:46,2 +DA:48,2 +DA:50,2 +DA:53,2 +DA:55,6 +DA:57,2 +DA:58,4 +DA:59,2 +DA:60,2 +DA:70,1 +DA:72,1 +DA:74,2 +DA:76,2 +DA:78,0 +DA:79,0 +DA:84,2 +DA:86,2 +DA:87,6 +DA:89,2 +DA:90,4 +DA:91,2 +LF:31 +LH:29 +end_of_record +SF:lib/utils/extensions/navigation_extension.dart +DA:5,1 +DA:10,2 +DA:11,1 +DA:14,0 +DA:16,2 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:29,3 +DA:31,2 +LF:11 +LH:10 +end_of_record +SF:lib/main.dart +DA:5,2 +DA:8,2 +DA:11,1 +DA:13,1 +DA:14,1 +DA:17,1 +LF:6 +LH:6 +end_of_record +SF:lib/playground/test_main.dart +DA:7,1 +DA:9,2 +DA:14,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,1 +DA:22,1 +DA:23,2 +DA:27,1 +DA:29,1 +DA:30,2 +DA:42,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:47,1 +DA:48,1 +DA:50,1 +DA:51,2 +DA:57,1 +DA:59,1 +DA:60,2 +LF:24 +LH:24 +end_of_record diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index fb17f96..175b8fc 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -59,21 +59,28 @@ class SplashScreenBody extends StatelessWidget { style: TextStyle(fontWeight: FontWeight.w700, fontSize: 64), ).withBlueGradientFg(), const Spacer(flex: 5), - ScaleOnPressWidget( - key: const Key("login"), - onTap: () { - context.navigateTo(const HomeScreen(), replace: true); - }, - outerPadding: const EdgeInsets.symmetric(horizontal: 48.0), - innerPadding: - const EdgeInsets.only(top: 12, bottom: 8, left: 12, right: 12), - child: const SignInWithGoogleButton()), + GoogleSignInButton(), const Spacer(flex: 2) ], ); } } +class GoogleSignInButton extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ScaleOnPressWidget( + key: const Key("login"), + onTap: () { + context.navigateTo(const HomeScreen(), replace: true); + }, + outerPadding: const EdgeInsets.symmetric(horizontal: 48.0), + innerPadding: + const EdgeInsets.only(top: 12, bottom: 8, left: 12, right: 12), + child: const SignInWithGoogleButton()); + } +} + class SignInWithGoogleButton extends StatelessWidget { const SignInWithGoogleButton({Key key}) : super(key: key); diff --git a/test/features/splash/splash_screen_test.dart b/test/features/splash/splash_screen_test.dart index ef9fa43..63e2646 100644 --- a/test/features/splash/splash_screen_test.dart +++ b/test/features/splash/splash_screen_test.dart @@ -39,14 +39,16 @@ void main() { testWidgets( "There is a Google Sign in Button", (WidgetTester tester) async { - await tester.pumpWidget(const SplashScreen().asScaffold); + // ignore: prefer_const_constructors + await tester.pumpWidget(SplashScreenBody().asScaffold); expect(find.byType(AnimatedScale), findsOneWidget); expect(find.text(R.string.loginWithGoogle), findsOneWidget); }, ); testWidgets("Can navigate to HomeScreen", (WidgetTester tester) async { - await tester.pumpWidget(const SplashScreen().asScaffold); + // ignore: prefer_const_constructors + await tester.pumpWidget( SplashScreenBody().insideMaterialApp); final loginButton = find.byKey(const Key("login")); expect(loginButton, findsOneWidget); await tester.tap(loginButton); From 648184fc96dc68124f3f4fbb358c0d096626367e Mon Sep 17 00:00:00 2001 From: erluxman Date: Thu, 23 Jul 2020 11:35:55 +0545 Subject: [PATCH 36/56] Ok hook or crook --- lib/features/splash/splash_screen.dart | 31 +++++++++----------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index 175b8fc..04d51e4 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -77,25 +77,16 @@ class GoogleSignInButton extends StatelessWidget { outerPadding: const EdgeInsets.symmetric(horizontal: 48.0), innerPadding: const EdgeInsets.only(top: 12, bottom: 8, left: 12, right: 12), - child: const SignInWithGoogleButton()); - } -} - -class SignInWithGoogleButton extends StatelessWidget { - const SignInWithGoogleButton({Key key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset(R.svg.googleIcon), - const SizedBox(width: 16), - Text( - R.string.loginWithGoogle, - style: TextStyle(fontSize: 17, fontWeight: FontWeight.w700), - ), - ], - ); + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset(R.svg.googleIcon), + const SizedBox(width: 16), + Text( + R.string.loginWithGoogle, + style: TextStyle(fontSize: 17, fontWeight: FontWeight.w700), + ), + ], + )); } } From 232cb2227b2ea67536ffe1b27e2f97ac4081f9ed Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 24 Jul 2020 09:02:01 +0545 Subject: [PATCH 37/56] Added more tests --- .../home/animated_motivation_meter_test.dart | 4 ---- .../home/home_screen_components_test.dart | 23 +++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) delete mode 100644 test/features/home/animated_motivation_meter_test.dart create mode 100644 test/features/home/home_screen_components_test.dart diff --git a/test/features/home/animated_motivation_meter_test.dart b/test/features/home/animated_motivation_meter_test.dart deleted file mode 100644 index 6814464..0000000 --- a/test/features/home/animated_motivation_meter_test.dart +++ /dev/null @@ -1,4 +0,0 @@ -void main(){ - - -} \ No newline at end of file diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart new file mode 100644 index 0000000..3a1c8ce --- /dev/null +++ b/test/features/home/home_screen_components_test.dart @@ -0,0 +1,23 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:productive/common/resources/r.dart'; +import 'package:productive/features/home/widgets/animated_circle_progress.dart'; + +void main() { + group("All required widgets are on the Splash screen", () { + setUpAll(() { + R.buildMode.isTesting = true; + }); + + tearDownAll(() { + R.buildMode.isTesting = false; + }); + + testWidgets("test animated progressbar", (WidgetTester tester) async { + await tester.pumpWidget( + // ignore: prefer_const_constructors + AnimatedMotivationMeter(height: 200, width: 200, motivation: 0.5)); + expect(find.byType(CustomPaint), findsNWidgets(1)); + }); + }); +} From 49707e05d2502333c3efee6b56faeedfa65aee66 Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 24 Jul 2020 10:30:05 +0545 Subject: [PATCH 38/56] Removed unnnecessary callback --- lib/utils/animation/scale_on_press_widget.dart | 1 - test/features/home/home_screen_components_test.dart | 4 +++- test/utils/animation/scale_on_press_widget_test.dart | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/utils/animation/scale_on_press_widget.dart b/lib/utils/animation/scale_on_press_widget.dart index 9aa29be..c3cf946 100644 --- a/lib/utils/animation/scale_on_press_widget.dart +++ b/lib/utils/animation/scale_on_press_widget.dart @@ -41,7 +41,6 @@ class _ScaleOnPressWidgetState extends State { return GestureDetector( behavior: HitTestBehavior.opaque, onLongPressStart: (_) => _press, - onLongPressEnd: (_) => _unPress, onTapDown: (_) => _press, onTapUp: (_) => _unPress, onLongPress: _press, diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index 3a1c8ce..0b56f30 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -4,7 +4,7 @@ import 'package:productive/common/resources/r.dart'; import 'package:productive/features/home/widgets/animated_circle_progress.dart'; void main() { - group("All required widgets are on the Splash screen", () { + group("Test Animated Motivation Meter", () { setUpAll(() { R.buildMode.isTesting = true; }); @@ -20,4 +20,6 @@ void main() { expect(find.byType(CustomPaint), findsNWidgets(1)); }); }); + + } diff --git a/test/utils/animation/scale_on_press_widget_test.dart b/test/utils/animation/scale_on_press_widget_test.dart index 7e96bba..e133007 100644 --- a/test/utils/animation/scale_on_press_widget_test.dart +++ b/test/utils/animation/scale_on_press_widget_test.dart @@ -12,7 +12,9 @@ void main() { await tester.pumpWidget(scaledIcon); expect(find.byType(GestureDetector), findsOneWidget); await tester.press(find.byType(GestureDetector)); + await tester.pumpAndSettle(); await tester.longPress(find.byType(GestureDetector)); + await tester.pumpAndSettle(); }); }); } From 884c02cbe13c583b80ca0bfebfd709b103dd60dc Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 24 Jul 2020 12:00:52 +0545 Subject: [PATCH 39/56] Optimized ScaleonPress widget --- lib/utils/animation/scale_on_press_widget.dart | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/lib/utils/animation/scale_on_press_widget.dart b/lib/utils/animation/scale_on_press_widget.dart index c3cf946..a4d340e 100644 --- a/lib/utils/animation/scale_on_press_widget.dart +++ b/lib/utils/animation/scale_on_press_widget.dart @@ -26,11 +26,7 @@ class ScaleOnPressWidget extends StatefulWidget { class _ScaleOnPressWidgetState extends State { bool isPressed = false; - void _unPress() => _update(false); - - void _press() => _update(true); - - void _update(bool pressed) { + void _updatePressed(bool pressed) { setState(() { isPressed = pressed; }); @@ -40,12 +36,10 @@ class _ScaleOnPressWidgetState extends State { Widget build(BuildContext context) { return GestureDetector( behavior: HitTestBehavior.opaque, - onLongPressStart: (_) => _press, - onTapDown: (_) => _press, - onTapUp: (_) => _unPress, - onLongPress: _press, - onLongPressUp: _unPress, - onDoubleTap: _press, + onLongPressUp: () => _updatePressed(false), + onLongPress: () => _updatePressed(true), + onTapDown: (_) => _updatePressed(true), + onTapUp: (_) => _updatePressed(false), onTap: widget.onTap, child: Padding( padding: widget.outerPadding, From 4397c8e5b407c2678ce60d22446015aa4b8476b7 Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 24 Jul 2020 12:08:14 +0545 Subject: [PATCH 40/56] Optimized ScaleonPress widget --- lib/utils/animation/scale_on_press_widget.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/utils/animation/scale_on_press_widget.dart b/lib/utils/animation/scale_on_press_widget.dart index a4d340e..e2ace3f 100644 --- a/lib/utils/animation/scale_on_press_widget.dart +++ b/lib/utils/animation/scale_on_press_widget.dart @@ -36,7 +36,6 @@ class _ScaleOnPressWidgetState extends State { Widget build(BuildContext context) { return GestureDetector( behavior: HitTestBehavior.opaque, - onLongPressUp: () => _updatePressed(false), onLongPress: () => _updatePressed(true), onTapDown: (_) => _updatePressed(true), onTapUp: (_) => _updatePressed(false), From 9c0585a2a59aedc4a5ef979b9f9131180668d4c9 Mon Sep 17 00:00:00 2001 From: erluxman Date: Thu, 30 Jul 2020 09:39:00 +0545 Subject: [PATCH 41/56] Some more tests --- .../home/home_screen_components_test.dart | 64 ++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index 0b56f30..dabd113 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -1,7 +1,10 @@ -import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:productive/common/resources/r.dart'; import 'package:productive/features/home/widgets/animated_circle_progress.dart'; +import 'package:productive/features/home/widgets/animated_nav_button.dart'; + +import '../../test_utils/test_utils.dart'; void main() { group("Test Animated Motivation Meter", () { @@ -21,5 +24,64 @@ void main() { }); }); + group("Test Animated Nav Button", () { + setUpAll(() { + R.buildMode.isTesting = true; + }); + + tearDownAll(() { + R.buildMode.isTesting = false; + }); + + testWidgets("gestures are working", (WidgetTester tester) async { + // ignore: prefer_const_constructors + NavButtonsState state = NavButtonsState(); + void select(int index) { + state = state.copyWith(selectedIndex: 1); + } + + void touch(int index) { + state = state.copyWith(pressedIndex: 1); + } + + void unTouch() { + state = state.copyWith(pressedIndex: -1); + } + final navBar = Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AnimatedNavIcon( + navState: state, + select: () => select(0), + unTouch: () => unTouch, + touch: () => touch(0), + child: NavIcon( + position: 0, + svgPath: R.svg.homeIcon, + navState: state, + ), + ), + AnimatedNavIcon( + navState: state, + select: () => select(1), + unTouch: () => unTouch, + touch: () => touch(1), + child: NavIcon( + position: 1, + svgPath: R.svg.statsIcon, + navState: state, + ), + ), + ], + ); + await tester.pumpWidget(navBar.asScaffold); + expect(find.byType(GestureDetector), findsNWidgets(2)); + +// await tester.press(find.byType(GestureDetector)); +// await tester.pumpAndSettle(); +// await tester.longPress(find.byType(GestureDetector)); +// await tester.pumpAndSettle(); + }); + }); } From 96ae9c658c2e0d73242c6e7d140b88152c474f52 Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 31 Jul 2020 09:13:17 +0545 Subject: [PATCH 42/56] Few more tests --- test/features/home/home_screen_components_test.dart | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index dabd113..c6036f6 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -52,6 +52,7 @@ void main() { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ AnimatedNavIcon( + key: const Key("first_icon"), navState: state, select: () => select(0), unTouch: () => unTouch, @@ -63,6 +64,7 @@ void main() { ), ), AnimatedNavIcon( + key: const Key("second_icon"), navState: state, select: () => select(1), unTouch: () => unTouch, @@ -78,10 +80,10 @@ void main() { await tester.pumpWidget(navBar.asScaffold); expect(find.byType(GestureDetector), findsNWidgets(2)); -// await tester.press(find.byType(GestureDetector)); -// await tester.pumpAndSettle(); -// await tester.longPress(find.byType(GestureDetector)); -// await tester.pumpAndSettle(); + await tester.press(find.byKey(const Key("first_icon"))); + await tester.pumpAndSettle(); + await tester.longPress(find.byKey(const Key("second_icon"))); + await tester.pumpAndSettle(); }); }); } From b779f0cca02e9801ece684b3e6f8e2b467e377e9 Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 31 Jul 2020 09:17:24 +0545 Subject: [PATCH 43/56] Added tests to appbar --- .../home/home_screen_components_test.dart | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index c6036f6..e7f9f58 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -1,8 +1,10 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:productive/common/resources/r.dart'; import 'package:productive/features/home/widgets/animated_circle_progress.dart'; import 'package:productive/features/home/widgets/animated_nav_button.dart'; +import 'package:productive/features/home/widgets/home_app_bar.dart'; import '../../test_utils/test_utils.dart'; @@ -86,4 +88,18 @@ void main() { await tester.pumpAndSettle(); }); }); + + group("Test home Appbar", () { + testWidgets("HomeAppbar contains DisplayPic Widget", + (WidgetTester tester) async { + // ignore: prefer_const_constructors + await tester.pumpWidget(AppbarContent().asScaffold); + expect(find.byType(DisplayPic), findsOneWidget); + + // ignore: prefer_const_constructors + await tester.pumpWidget(DisplayPic().asScaffold); + expect(find.byType(ClipRRect), findsOneWidget); + expect(find.byType(CachedNetworkImage), findsOneWidget); + }); + }); } From 5fe4d9ef50c2dfc728b1f7286d40d3a059bf3d06 Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 31 Jul 2020 09:23:18 +0545 Subject: [PATCH 44/56] Few more tests --- .../home/widgets/home_bottom_nav_bar.dart | 2 + .../home/home_screen_components_test.dart | 73 +++++-------------- 2 files changed, 22 insertions(+), 53 deletions(-) diff --git a/lib/features/home/widgets/home_bottom_nav_bar.dart b/lib/features/home/widgets/home_bottom_nav_bar.dart index 27056aa..e14b04e 100644 --- a/lib/features/home/widgets/home_bottom_nav_bar.dart +++ b/lib/features/home/widgets/home_bottom_nav_bar.dart @@ -63,6 +63,7 @@ class _BottomNavState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ AnimatedNavIcon( + key: const Key("first_icon"), navState: navState, select: _selectHome, unTouch: _unTouch, @@ -74,6 +75,7 @@ class _BottomNavState extends State { ), ), AnimatedNavIcon( + key: const Key("second_icon"), navState: navState, select: _selectStats, unTouch: _unTouch, diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index e7f9f58..4a1a661 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -3,8 +3,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:productive/common/resources/r.dart'; import 'package:productive/features/home/widgets/animated_circle_progress.dart'; -import 'package:productive/features/home/widgets/animated_nav_button.dart'; import 'package:productive/features/home/widgets/home_app_bar.dart'; +import 'package:productive/features/home/widgets/home_body.dart'; +import 'package:productive/features/home/widgets/home_bottom_nav_bar.dart'; import '../../test_utils/test_utils.dart'; @@ -26,7 +27,7 @@ void main() { }); }); - group("Test Animated Nav Button", () { + group("Test Animated Nav Bar", () { setUpAll(() { R.buildMode.isTesting = true; }); @@ -37,49 +38,7 @@ void main() { testWidgets("gestures are working", (WidgetTester tester) async { // ignore: prefer_const_constructors - NavButtonsState state = NavButtonsState(); - void select(int index) { - state = state.copyWith(selectedIndex: 1); - } - - void touch(int index) { - state = state.copyWith(pressedIndex: 1); - } - - void unTouch() { - state = state.copyWith(pressedIndex: -1); - } - - final navBar = Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - AnimatedNavIcon( - key: const Key("first_icon"), - navState: state, - select: () => select(0), - unTouch: () => unTouch, - touch: () => touch(0), - child: NavIcon( - position: 0, - svgPath: R.svg.homeIcon, - navState: state, - ), - ), - AnimatedNavIcon( - key: const Key("second_icon"), - navState: state, - select: () => select(1), - unTouch: () => unTouch, - touch: () => touch(1), - child: NavIcon( - position: 1, - svgPath: R.svg.statsIcon, - navState: state, - ), - ), - ], - ); - await tester.pumpWidget(navBar.asScaffold); + await tester.pumpWidget(BottomNav().insideMaterialApp); expect(find.byType(GestureDetector), findsNWidgets(2)); await tester.press(find.byKey(const Key("first_icon"))); @@ -92,14 +51,22 @@ void main() { group("Test home Appbar", () { testWidgets("HomeAppbar contains DisplayPic Widget", (WidgetTester tester) async { - // ignore: prefer_const_constructors - await tester.pumpWidget(AppbarContent().asScaffold); - expect(find.byType(DisplayPic), findsOneWidget); + // ignore: prefer_const_constructors + await tester.pumpWidget(AppbarContent().asScaffold); + expect(find.byType(DisplayPic), findsOneWidget); - // ignore: prefer_const_constructors - await tester.pumpWidget(DisplayPic().asScaffold); - expect(find.byType(ClipRRect), findsOneWidget); - expect(find.byType(CachedNetworkImage), findsOneWidget); - }); + // ignore: prefer_const_constructors + await tester.pumpWidget(DisplayPic().asScaffold); + expect(find.byType(ClipRRect), findsOneWidget); + expect(find.byType(CachedNetworkImage), findsOneWidget); + }); + }); + + group("Test Home Body", () { + testWidgets("Home Body contains App Name", (WidgetTester tester) async { + // ignore: prefer_const_constructors + await tester.pumpWidget(HomeBody().asScaffold); + expect(find.text(R.string.appName), findsOneWidget); + }); }); } From fdf99b3df64dbbd90b177bfd62fab7b0d02e8dbc Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 31 Jul 2020 09:46:34 +0545 Subject: [PATCH 45/56] added test for fab --- lib/features/home/widgets/home_fab.dart | 1 + lib/features/home/widgets/home_screen.dart | 2 -- lib/features/splash/splash_screen.dart | 2 +- test/features/home/home_screen_components_test.dart | 10 ++++++++++ test/features/home/home_screen_test.dart | 3 +-- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/features/home/widgets/home_fab.dart b/lib/features/home/widgets/home_fab.dart index 1ff8da3..3f917fa 100644 --- a/lib/features/home/widgets/home_fab.dart +++ b/lib/features/home/widgets/home_fab.dart @@ -10,6 +10,7 @@ class Fab extends StatelessWidget { @override Widget build(BuildContext context) { return RaisedButton( + key: const Key("home_fab"), color: Colors.transparent, splashColor: Colors.transparent, onPressed: () { diff --git a/lib/features/home/widgets/home_screen.dart b/lib/features/home/widgets/home_screen.dart index 1f49d7d..fa94f94 100644 --- a/lib/features/home/widgets/home_screen.dart +++ b/lib/features/home/widgets/home_screen.dart @@ -7,7 +7,6 @@ import 'home_bottom_nav_bar.dart'; import 'home_fab.dart'; class HomeScreen extends StatelessWidget { - const HomeScreen(); @override Widget build(BuildContext context) { @@ -18,7 +17,6 @@ class HomeScreen extends StatelessWidget { floatingActionButton: const Padding( padding: EdgeInsets.symmetric(horizontal: 2, vertical: 2), child: ScaleOnPressWidget( - key: Key("home_fab"), child: Fab(), ), ), diff --git a/lib/features/splash/splash_screen.dart b/lib/features/splash/splash_screen.dart index 04d51e4..411f580 100644 --- a/lib/features/splash/splash_screen.dart +++ b/lib/features/splash/splash_screen.dart @@ -72,7 +72,7 @@ class GoogleSignInButton extends StatelessWidget { return ScaleOnPressWidget( key: const Key("login"), onTap: () { - context.navigateTo(const HomeScreen(), replace: true); + context.navigateTo(HomeScreen(), replace: true); }, outerPadding: const EdgeInsets.symmetric(horizontal: 48.0), innerPadding: diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index 4a1a661..1062591 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -6,6 +6,8 @@ import 'package:productive/features/home/widgets/animated_circle_progress.dart'; import 'package:productive/features/home/widgets/home_app_bar.dart'; import 'package:productive/features/home/widgets/home_body.dart'; import 'package:productive/features/home/widgets/home_bottom_nav_bar.dart'; +import 'package:productive/features/home/widgets/home_fab.dart'; +import 'package:productive/features/home/widgets/home_screen.dart'; import '../../test_utils/test_utils.dart'; @@ -69,4 +71,12 @@ void main() { expect(find.text(R.string.appName), findsOneWidget); }); }); + + group("Test Home Fab", () { + testWidgets("Home Body contains App Name", (WidgetTester tester) async { + // ignore: prefer_const_constructors + await tester.pumpWidget(Fab().insideMaterialApp); + await tester.press(find.byKey(const Key("home_fab"))); + }); + }); } diff --git a/test/features/home/home_screen_test.dart b/test/features/home/home_screen_test.dart index 5a96317..7619986 100644 --- a/test/features/home/home_screen_test.dart +++ b/test/features/home/home_screen_test.dart @@ -14,7 +14,7 @@ void main() { testWidgets( "Fab,BottomNav and AppbarContent exist", (WidgetTester tester) async { - await tester.pumpWidget(const HomeScreen().asScaffold); + await tester.pumpWidget(HomeScreen().asScaffold); expect(find.byType(Fab), findsOneWidget); expect(find.byType(RaisedButton), findsOneWidget); expect(find.byType(BottomNav), findsOneWidget); @@ -27,4 +27,3 @@ void main() { ); }); } - From df4d93701c99b54b9bdc549372328abbc93d7ce2 Mon Sep 17 00:00:00 2001 From: erluxman Date: Fri, 31 Jul 2020 09:49:56 +0545 Subject: [PATCH 46/56] Removed unused import --- test/features/home/home_screen_components_test.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index 1062591..745a5d0 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -7,7 +7,6 @@ import 'package:productive/features/home/widgets/home_app_bar.dart'; import 'package:productive/features/home/widgets/home_body.dart'; import 'package:productive/features/home/widgets/home_bottom_nav_bar.dart'; import 'package:productive/features/home/widgets/home_fab.dart'; -import 'package:productive/features/home/widgets/home_screen.dart'; import '../../test_utils/test_utils.dart'; From 9a149d7fff6171b36e162e9aae0ff2ae31192258 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 1 Aug 2020 07:47:26 +0545 Subject: [PATCH 47/56] Improved FAB test --- test/features/home/home_screen_components_test.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index 745a5d0..dd72a03 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -76,6 +76,7 @@ void main() { // ignore: prefer_const_constructors await tester.pumpWidget(Fab().insideMaterialApp); await tester.press(find.byKey(const Key("home_fab"))); + await tester.pumpAndSettle(); }); }); } From 0be95a6b03bdd770535f476bdf51a2c7d7b20166 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 1 Aug 2020 07:50:12 +0545 Subject: [PATCH 48/56] Improved bottom nav bar --- test/features/home/home_screen_components_test.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index dd72a03..141e771 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -44,8 +44,12 @@ void main() { await tester.press(find.byKey(const Key("first_icon"))); await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key("first_icon"))); + await tester.pumpAndSettle(); await tester.longPress(find.byKey(const Key("second_icon"))); await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key("second_icon"))); + await tester.pumpAndSettle(); }); }); From b68ede6ff418bcefdfb13558a5147ab227b8c1ad Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 1 Aug 2020 08:03:01 +0545 Subject: [PATCH 49/56] some more.. --- test/features/home/home_screen_components_test.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index 141e771..ef5d70b 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -46,6 +46,8 @@ void main() { await tester.pumpAndSettle(); await tester.tap(find.byKey(const Key("first_icon"))); await tester.pumpAndSettle(); + await tester.longPress(find.byKey(const Key("first_icon"))); + await tester.pumpAndSettle(); await tester.longPress(find.byKey(const Key("second_icon"))); await tester.pumpAndSettle(); await tester.tap(find.byKey(const Key("second_icon"))); From 6aad6dec524bbfd0e540732b319028e786f6fccd Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 1 Aug 2020 08:47:25 +0545 Subject: [PATCH 50/56] more improvement --- lib/features/home/widgets/home_bottom_nav_bar.dart | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/features/home/widgets/home_bottom_nav_bar.dart b/lib/features/home/widgets/home_bottom_nav_bar.dart index e14b04e..3d92289 100644 --- a/lib/features/home/widgets/home_bottom_nav_bar.dart +++ b/lib/features/home/widgets/home_bottom_nav_bar.dart @@ -26,12 +26,8 @@ class _BottomNavState extends State { }); } - void _selectHome() => _selectPage(0); - void _touchHomeIcon() => _touchIcon(0); - void _selectStats() => _selectPage(1); - void _touchStatsIcon() => _touchIcon(1); void _unTouch() => _touchIcon(-1); @@ -65,7 +61,7 @@ class _BottomNavState extends State { AnimatedNavIcon( key: const Key("first_icon"), navState: navState, - select: _selectHome, + select: () => _selectPage(0), unTouch: _unTouch, touch: _touchHomeIcon, child: NavIcon( @@ -77,7 +73,7 @@ class _BottomNavState extends State { AnimatedNavIcon( key: const Key("second_icon"), navState: navState, - select: _selectStats, + select: () => _selectPage(1), unTouch: _unTouch, touch: _touchStatsIcon, child: NavIcon( From 877b78d9092807b88ccbe8a335d65b85530d2945 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 1 Aug 2020 08:48:20 +0545 Subject: [PATCH 51/56] more improvement --- test/features/home/home_screen_components_test.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index ef5d70b..141e771 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -46,8 +46,6 @@ void main() { await tester.pumpAndSettle(); await tester.tap(find.byKey(const Key("first_icon"))); await tester.pumpAndSettle(); - await tester.longPress(find.byKey(const Key("first_icon"))); - await tester.pumpAndSettle(); await tester.longPress(find.byKey(const Key("second_icon"))); await tester.pumpAndSettle(); await tester.tap(find.byKey(const Key("second_icon"))); From 2b1d813837f5596586508f74e7004d8f80a50e00 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 1 Aug 2020 08:56:04 +0545 Subject: [PATCH 52/56] Some more? but why :D --- test/features/home/home_screen_components_test.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index 141e771..ad38eaa 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -50,6 +50,8 @@ void main() { await tester.pumpAndSettle(); await tester.tap(find.byKey(const Key("second_icon"))); await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key("first_icon"))); + await tester.pumpAndSettle(); }); }); From 83a2de8535a3c54d0e07e6ea80a6d374010c8703 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 1 Aug 2020 08:57:21 +0545 Subject: [PATCH 53/56] Some more? but why :D --- test/features/home/home_screen_components_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index ad38eaa..056b029 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -81,7 +81,7 @@ void main() { testWidgets("Home Body contains App Name", (WidgetTester tester) async { // ignore: prefer_const_constructors await tester.pumpWidget(Fab().insideMaterialApp); - await tester.press(find.byKey(const Key("home_fab"))); + await tester.tap(find.byKey(const Key("home_fab"))); await tester.pumpAndSettle(); }); }); From 3363ffb446b60f4a1566f74c66c5074575118981 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 1 Aug 2020 09:03:56 +0545 Subject: [PATCH 54/56] Some more? but why :D --- test/features/home/home_screen_components_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index 056b029..ad38eaa 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -81,7 +81,7 @@ void main() { testWidgets("Home Body contains App Name", (WidgetTester tester) async { // ignore: prefer_const_constructors await tester.pumpWidget(Fab().insideMaterialApp); - await tester.tap(find.byKey(const Key("home_fab"))); + await tester.press(find.byKey(const Key("home_fab"))); await tester.pumpAndSettle(); }); }); From 68cf26b272331e730160b736be00b4acee1ad61c Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 1 Aug 2020 11:24:34 +0545 Subject: [PATCH 55/56] why is press not working damnit --- test/features/home/home_screen_components_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index ad38eaa..ac322c8 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -7,6 +7,7 @@ import 'package:productive/features/home/widgets/home_app_bar.dart'; import 'package:productive/features/home/widgets/home_body.dart'; import 'package:productive/features/home/widgets/home_bottom_nav_bar.dart'; import 'package:productive/features/home/widgets/home_fab.dart'; +import 'package:productive/features/home/widgets/home_screen.dart'; import '../../test_utils/test_utils.dart'; @@ -80,9 +81,8 @@ void main() { group("Test Home Fab", () { testWidgets("Home Body contains App Name", (WidgetTester tester) async { // ignore: prefer_const_constructors - await tester.pumpWidget(Fab().insideMaterialApp); + await tester.pumpWidget(HomeScreen().asScaffold); await tester.press(find.byKey(const Key("home_fab"))); - await tester.pumpAndSettle(); }); }); } From a7e731ec70b31977cd72df3c33e0204ced51b640 Mon Sep 17 00:00:00 2001 From: erluxman Date: Sat, 1 Aug 2020 11:28:42 +0545 Subject: [PATCH 56/56] why is press not working damnit --- test/features/home/home_screen_components_test.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/test/features/home/home_screen_components_test.dart b/test/features/home/home_screen_components_test.dart index ac322c8..6a370e4 100644 --- a/test/features/home/home_screen_components_test.dart +++ b/test/features/home/home_screen_components_test.dart @@ -6,7 +6,6 @@ import 'package:productive/features/home/widgets/animated_circle_progress.dart'; import 'package:productive/features/home/widgets/home_app_bar.dart'; import 'package:productive/features/home/widgets/home_body.dart'; import 'package:productive/features/home/widgets/home_bottom_nav_bar.dart'; -import 'package:productive/features/home/widgets/home_fab.dart'; import 'package:productive/features/home/widgets/home_screen.dart'; import '../../test_utils/test_utils.dart';