diff --git a/assets/images/blank-profile.jpg b/assets/images/blank-profile.jpg new file mode 100644 index 0000000..d757425 Binary files /dev/null and b/assets/images/blank-profile.jpg differ diff --git a/lib/main.dart b/lib/main.dart index 2908986..6dd64e4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:spannable_grid/spannable_grid.dart'; +import 'package:percent_indicator/percent_indicator.dart'; void main() { runApp(const MyApp()); @@ -12,8 +13,13 @@ class MyApp extends StatelessWidget { return MaterialApp( title: 'Fitness Homie', theme: ThemeData( - primarySwatch: Colors.blue, - ), + primarySwatch: Colors.blue, + appBarTheme: AppBarTheme( + backgroundColor: Colors.transparent, + elevation: 0.0, + centerTitle: true, + titleTextStyle: TextStyle(color: Colors.black, fontSize: 20), + )), home: const MyHomePage(title: 'Fitness Homie'), ); } @@ -28,65 +34,476 @@ class MyHomePage extends StatefulWidget { } class _MyHomePageState extends State { - int _counter = 0; - int _selectedIndex = 0; - int itemount = 0; + int _selectedIndex = 1; + int counter = 0; + bool _value = false; + int _completed_tasks = 10; + List tasks = []; + final tasks_progress = []; + int _total_tasks = 15; - final screens = [ - Center(child: Text('Targets')), - SpannableGrid( - cells: [ - SpannableGridCellData( - id: 1, - column: 1, - row: 1, - columnSpan: 2, - child: Container( - child: Center(child: Text("Text 1")), - color: Color.fromRGBO(255, 255, 0, 1)), + final screens = []; + + void set_total_tasks() { + _total_tasks = tasks.length; + } + + void onChanged(value) { + setState(() { + _value = value; + if (value) { + _completed_tasks += 1; + } else { + _completed_tasks -= 1; + } + }); + } + + void add_task(task_name, {goal = Null}) { + setState(() { + ; + Row task = Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + task_name, + style: TextStyle(color: Colors.black, fontSize: 20), + ) + ], + ); + + if (goal == Null) { + tasks_progress.add(false); + task.children.add(Checkbox(value: this._value, onChanged: onChanged)); + } else { + tasks_progress.add(0); + task.children.add(CircularPercentIndicator( + radius: 60.0, + lineWidth: 5.0, + percent: 1.0, + center: new Text("${tasks_progress[tasks_progress.length]}"), + progressColor: Colors.green, + )); + // task.children.add(); + } + Container t = Container( + margin: EdgeInsets.fromLTRB(20, 20, 20, 0), + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + color: Color.fromRGBO(235, 235, 235, 1), + borderRadius: BorderRadius.circular(8)), + child: task, + ); + tasks.add(task); + }); + } + + void onPressed() { + setState(() { + _total_tasks += 1; + add_task("Name"); + }); + } + + void create_profile_page() { + setState(() { + screens.add( + Stack( + children: [ + Column( + children: [ + Expanded( + flex: 5, + child: Container( + width: double.infinity, + height: 10, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.deepPurple, Colors.deepPurpleAccent], + ), + ), + child: Column(children: [ + SizedBox( + height: 80.0, + ), + CircleAvatar( + radius: 65.0, + foregroundImage: AssetImage("blank-profile.jpg"), + backgroundColor: Colors.grey, + ), + SizedBox( + height: 10.0, + ), + Text('Dumitrana Mihnea', + style: TextStyle( + color: Colors.white, + fontSize: 20.0, + )), + Text( + 'Boss', + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + ), + ) + ]), + ), + ), + Expanded( + flex: 5, + child: Container( + color: Colors.grey[200], + child: Center( + child: Card( + margin: EdgeInsets.fromLTRB(0.0, 45.0, 0.0, 10.0), + child: Container( + width: 310.0, + height: 290.0, + child: Padding( + padding: EdgeInsets.all(10.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SizedBox( + height: 60, + ), + Text( + "Information", + style: TextStyle( + fontSize: 17.0, + fontWeight: FontWeight.w800, + ), + ), + Divider( + color: Colors.grey[300], + ), + Row( + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + SizedBox( + height: 20, + ), + Icon( + Icons.fitness_center, + color: Colors.blueAccent[400], + size: 35, + ), + SizedBox( + width: 20.0, + ), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + "Body Type", + style: TextStyle( + fontSize: 15.0, + ), + ), + Text( + "Burly", + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[400], + ), + ) + ], + ) + ], + ), + SizedBox( + height: 20.0, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + Icon( + Icons.accessibility_new, + color: Colors.yellowAccent[400], + size: 35, + ), + SizedBox( + width: 20.0, + ), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + "Heigth", + style: TextStyle( + fontSize: 15.0, + ), + ), + Text( + "1.86 meters", + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[400], + ), + ) + ], + ) + ], + ), + SizedBox( + height: 20.0, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + Icon( + Icons.favorite, + color: Colors.pinkAccent[400], + size: 35, + ), + SizedBox( + width: 20.0, + ), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + "Vitals", + style: TextStyle( + fontSize: 15.0, + ), + ), + Text( + "Cats, Basketball, Guitar", + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[400], + ), + ) + ], + ) + ], + ), + SizedBox( + height: 10.0, + ), + ], + )))), + ), + ), + ) + ], + ), + Positioned( + top: MediaQuery.of(context).size.height * 0.45, + left: 20.0, + right: 20.0, + child: Card( + child: Padding( + padding: EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + child: Column( + children: [ + Text( + 'Achievements', + style: TextStyle( + color: Colors.grey[400], fontSize: 14.0), + ), + SizedBox( + height: 5.0, + ), + Text( + "$counter", + style: TextStyle( + fontSize: 15.0, + ), + ) + ], + )), + Container( + child: Column(children: [ + Text( + 'Birthday', + style: TextStyle( + color: Colors.grey[400], fontSize: 14.0), + ), + SizedBox( + height: 5.0, + ), + Text( + 'April 7th', + style: TextStyle( + fontSize: 15.0, + ), + ) + ]), + ), + Container( + child: Column( + children: [ + Text( + 'Age', + style: TextStyle( + color: Colors.grey[400], fontSize: 14.0), + ), + SizedBox( + height: 5.0, + ), + Text( + '19 yrs', + style: TextStyle( + fontSize: 15.0, + ), + ) + ], + )), + ], + ), + ))) + ], ), - SpannableGridCellData( - id: 2, - column: 1, - row: 2, - columnSpan: 2, - child: Container( - child: Center(child: Text("Text 1")), - color: Color.fromRGBO(255, 255, 0, 1))), - SpannableGridCellData( - id: 3, - column: 1, - row: 3, - child: Container( - child: Center(child: Text("Text 1")), - color: Color.fromRGBO(255, 255, 0, 1)), + ); + }); + } + + void create_targets_page() { + setState(() { + screens.add( + SpannableGrid( + gridSize: SpannableGridSize.parent, + cells: [ + SpannableGridCellData( + id: 1, + column: 1, + row: 1, + child: Container( + margin: EdgeInsets.fromLTRB(20, 20, 20, 0), + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + color: Color.fromRGBO(235, 235, 235, 1), + borderRadius: BorderRadius.circular(8)), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Daily Tasks Completed $_completed_tasks/$_total_tasks", + style: TextStyle(color: Colors.black, fontSize: 20), + ), + ], + ))), + SpannableGridCellData( + id: 2, + column: 1, + row: 2, + child: Container( + margin: EdgeInsets.fromLTRB(10, 0, 20, 10), + decoration: + BoxDecoration(borderRadius: BorderRadius.circular(16)), + child: LinearPercentIndicator( + alignment: MainAxisAlignment.center, + width: MediaQuery.of(context).size.width * 0.8, + lineHeight: 20.0, + animation: true, + animationDuration: 2500, + percent: _completed_tasks / _total_tasks, + backgroundColor: Color.fromRGBO(235, 235, 235, 1), + progressColor: Colors.deepPurpleAccent, + barRadius: Radius.circular(16), + ), + ), + ), + SpannableGridCellData( + id: 3, + column: 1, + row: 3, + rowSpan: 7, + child: ListView( + children: tasks, + )), + SpannableGridCellData( + id: 4, + column: 1, + row: 10, + child: Container( + margin: EdgeInsets.all(10), + child: FloatingActionButton( + onPressed: onPressed, + child: Icon(Icons.add), + foregroundColor: Colors.black, + backgroundColor: Colors.white, + ))) + ], + rows: 10, + columns: 1, ), - SpannableGridCellData( - id: 4, - column: 1, - row: 4, - child: Container( - child: Center(child: Text("Text 1")), - color: Color.fromRGBO(255, 255, 0, 1)), + ); + }); + } + + void create_home_page() { + setState(() { + screens.add( + SpannableGrid( + cells: [ + SpannableGridCellData( + id: 1, + column: 1, + row: 1, + columnSpan: 2, + child: Container( + child: Center(child: Text("Text 1")), + color: Color.fromRGBO(255, 255, 0, 1)), + ), + SpannableGridCellData( + id: 2, + column: 1, + row: 2, + columnSpan: 2, + child: Container( + child: Center(child: Text("Text 1")), + color: Color.fromRGBO(255, 255, 0, 1))), + SpannableGridCellData( + id: 3, + column: 1, + row: 3, + child: Container( + child: Center(child: Text("Text 1")), + color: Color.fromRGBO(255, 255, 0, 1)), + ), + SpannableGridCellData( + id: 4, + column: 1, + row: 4, + child: Container( + child: Center(child: Text("Text 1")), + color: Color.fromRGBO(255, 255, 0, 1)), + ), + SpannableGridCellData( + id: 5, + column: 2, + row: 3, + rowSpan: 2, + child: Container( + child: Center(child: Text("Text 1")), + color: Color.fromRGBO(255, 255, 0, 1)), + ), + ], + columns: 2, + rows: 4, + style: SpannableGridStyle( + spacing: 10, + ), ), - SpannableGridCellData( - id: 5, - column: 2, - row: 3, - rowSpan: 2, - child: Container( - child: Center(child: Text("Text 1")), - color: Color.fromRGBO(255, 255, 0, 1)), - ), - ], - columns: 2, - rows: 4, - style: SpannableGridStyle( - spacing: 10, - ), - ), - Center(child: Text('Profile')), - ]; + ); + }); + } void _onItemTapped(int index) { setState(() { @@ -96,21 +513,41 @@ class _MyHomePageState extends State { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: screens[_selectedIndex], - bottomNavigationBar: BottomNavigationBar( - items: const [ - BottomNavigationBarItem( - label: "Targets", icon: Icon(Icons.track_changes)), - BottomNavigationBarItem(label: "Home", icon: Icon(Icons.home)), - BottomNavigationBarItem(label: "Profile", icon: Icon(Icons.person)) - ], - currentIndex: _selectedIndex, - onTap: _onItemTapped, - ), - ); + create_targets_page(); + create_home_page(); + create_profile_page(); + return Container( + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + title: Text(widget.title), + flexibleSpace: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.deepPurple, Colors.deepPurpleAccent], + ), + ), + ), + ), + body: Center( + child: screens[_selectedIndex], + ), + bottomNavigationBar: BottomNavigationBar( + items: const [ + BottomNavigationBarItem( + label: "Targets", icon: Icon(Icons.track_changes)), + BottomNavigationBarItem(label: "Home", icon: Icon(Icons.home)), + BottomNavigationBarItem( + label: "Profile", icon: Icon(Icons.person)) + ], + currentIndex: _selectedIndex, + onTap: _onItemTapped, + ), + ), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.deepPurple, Colors.deepPurpleAccent], + ), + )); } } diff --git a/lib/notifications.dart b/lib/notifications.dart new file mode 100644 index 0000000..05afc88 --- /dev/null +++ b/lib/notifications.dart @@ -0,0 +1,27 @@ +import 'dart:math'; + +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; + +final _localNotificationsPlugin = FlutterLocalNotificationsPlugin(); +final r = Random(4); + +Future setup() async { + const androidSetting = AndroidInitializationSettings('@mipmap/ic_launcher'); + const initSettings = InitializationSettings(android: androidSetting); + await _localNotificationsPlugin.initialize(initSettings).then((value) => {}); +} + +Future addNotification(title, body) async { + const androidDetail = + AndroidNotificationDetails("0", "Notifications", groupKey: "Key"); + + final id = r.nextInt(100000); + final noticeDetail = const NotificationDetails(android: androidDetail); + + await _localNotificationsPlugin.show( + id, + title, + body, + noticeDetail, + ); +} diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817..d2b4c55 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,8 @@ import FlutterMacOS import Foundation +import flutter_local_notifications func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 61ca4dc..c6a9a42 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" async: dependency: transitive description: @@ -43,6 +50,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.5" + dbus: + dependency: transitive + description: + name: dbus + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.8" fake_async: dependency: transitive description: @@ -50,6 +64,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.4" flutter: dependency: "direct main" description: flutter @@ -62,6 +90,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + url: "https://pub.dartlang.org" + source: hosted + version: "12.0.3+1" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -102,6 +151,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.2" + percent_indicator: + dependency: "direct main" + description: + name: percent_indicator + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.2" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" sky_engine: dependency: transitive description: flutter @@ -156,6 +240,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.12" + timezone: + dependency: transitive + description: + name: timezone + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.0" vector_math: dependency: transitive description: @@ -163,5 +254,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0+2" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.0" sdks: dart: ">=2.18.4 <3.0.0" + flutter: ">=2.12.0" diff --git a/pubspec.yaml b/pubspec.yaml index 1a73832..a8ab086 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,7 @@ version: 1.0.0+1 environment: sdk: '>=2.18.4 <3.0.0' + # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -37,6 +38,8 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 + flutter_local_notifications: ^12.0.3+1 + percent_indicator: ^4.2.2 dev_dependencies: flutter_test: @@ -54,7 +57,8 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - + assets: + - blank-profile.jpg # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class.