diff --git a/.flutter-plugins b/.flutter-plugins
new file mode 100644
index 0000000..e98b61c
--- /dev/null
+++ b/.flutter-plugins
@@ -0,0 +1,25 @@
+# This is a generated file; do not edit or check into version control.
+cloud_firestore=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\cloud_firestore-4.5.0\\
+cloud_firestore_web=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\cloud_firestore_web-3.4.0\\
+firebase_auth=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\firebase_auth-4.4.0\\
+firebase_auth_web=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\firebase_auth_web-5.3.0\\
+firebase_core=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\firebase_core-2.9.0\\
+firebase_core_web=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\firebase_core_web-2.3.0\\
+firebase_database=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\firebase_database-10.1.0\\
+firebase_database_web=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\firebase_database_web-0.2.2\\
+firebase_storage=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\firebase_storage-11.1.0\\
+firebase_storage_web=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\firebase_storage_web-3.4.0\\
+flutter_plugin_android_lifecycle=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\flutter_plugin_android_lifecycle-2.0.9\\
+image_picker=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\image_picker-0.8.7+1\\
+image_picker_android=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\image_picker_android-0.8.6+6\\
+image_picker_for_web=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\image_picker_for_web-2.1.12\\
+image_picker_ios=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\image_picker_ios-0.8.7+2\\
+modal_progress_hud_nsn=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\modal_progress_hud_nsn-0.3.0\\
+pedometer=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\pedometer-3.0.0\\
+url_launcher=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\url_launcher-6.1.10\\
+url_launcher_android=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\url_launcher_android-6.0.26\\
+url_launcher_ios=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\url_launcher_ios-6.1.3\\
+url_launcher_linux=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\url_launcher_linux-3.0.4\\
+url_launcher_macos=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\url_launcher_macos-3.0.4\\
+url_launcher_web=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\url_launcher_web-2.0.16\\
+url_launcher_windows=C:\\Users\\ABHIJOY\\AppData\\Local\\Pub\\Cache\\hosted\\pub.dev\\url_launcher_windows-3.0.5\\
diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies
new file mode 100644
index 0000000..ba9f2d9
--- /dev/null
+++ b/.flutter-plugins-dependencies
@@ -0,0 +1 @@
+{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"cloud_firestore","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\cloud_firestore-4.5.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_auth","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_auth-4.4.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_core","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_core-2.9.0\\\\","native_build":true,"dependencies":[]},{"name":"firebase_database","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_database-10.1.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_storage","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_storage-11.1.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"image_picker_ios","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\image_picker_ios-0.8.7+2\\\\","native_build":true,"dependencies":[]},{"name":"modal_progress_hud_nsn","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\modal_progress_hud_nsn-0.3.0\\\\","native_build":true,"dependencies":[]},{"name":"pedometer","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\pedometer-3.0.0\\\\","native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\url_launcher_ios-6.1.3\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"cloud_firestore","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\cloud_firestore-4.5.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_auth","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_auth-4.4.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_core","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_core-2.9.0\\\\","native_build":true,"dependencies":[]},{"name":"firebase_database","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_database-10.1.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_storage","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_storage-11.1.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"flutter_plugin_android_lifecycle","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\flutter_plugin_android_lifecycle-2.0.9\\\\","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\image_picker_android-0.8.6+6\\\\","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"modal_progress_hud_nsn","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\modal_progress_hud_nsn-0.3.0\\\\","native_build":true,"dependencies":[]},{"name":"pedometer","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\pedometer-3.0.0\\\\","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\url_launcher_android-6.0.26\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"cloud_firestore","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\cloud_firestore-4.5.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_auth","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_auth-4.4.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_core","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_core-2.9.0\\\\","native_build":true,"dependencies":[]},{"name":"firebase_database","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_database-10.1.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"firebase_storage","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_storage-11.1.0\\\\","native_build":true,"dependencies":["firebase_core"]},{"name":"modal_progress_hud_nsn","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\modal_progress_hud_nsn-0.3.0\\\\","native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\url_launcher_macos-3.0.4\\\\","native_build":true,"dependencies":[]}],"linux":[{"name":"modal_progress_hud_nsn","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\modal_progress_hud_nsn-0.3.0\\\\","native_build":true,"dependencies":[]},{"name":"url_launcher_linux","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\url_launcher_linux-3.0.4\\\\","native_build":true,"dependencies":[]}],"windows":[{"name":"modal_progress_hud_nsn","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\modal_progress_hud_nsn-0.3.0\\\\","native_build":true,"dependencies":[]},{"name":"url_launcher_windows","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\url_launcher_windows-3.0.5\\\\","native_build":true,"dependencies":[]}],"web":[{"name":"cloud_firestore_web","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\cloud_firestore_web-3.4.0\\\\","dependencies":["firebase_core_web"]},{"name":"firebase_auth_web","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_auth_web-5.3.0\\\\","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_core_web-2.3.0\\\\","dependencies":[]},{"name":"firebase_database_web","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_database_web-0.2.2\\\\","dependencies":["firebase_core_web"]},{"name":"firebase_storage_web","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\firebase_storage_web-3.4.0\\\\","dependencies":["firebase_core_web"]},{"name":"image_picker_for_web","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\image_picker_for_web-2.1.12\\\\","dependencies":[]},{"name":"url_launcher_web","path":"C:\\\\Users\\\\ABHIJOY\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\pub.dev\\\\url_launcher_web-2.0.16\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"cloud_firestore","dependencies":["cloud_firestore_web","firebase_core"]},{"name":"cloud_firestore_web","dependencies":["firebase_core","firebase_core_web"]},{"name":"firebase_auth","dependencies":["firebase_auth_web","firebase_core"]},{"name":"firebase_auth_web","dependencies":["firebase_core","firebase_core_web"]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]},{"name":"firebase_database","dependencies":["firebase_core","firebase_database_web"]},{"name":"firebase_database_web","dependencies":["firebase_core","firebase_core_web"]},{"name":"firebase_storage","dependencies":["firebase_core","firebase_storage_web"]},{"name":"firebase_storage_web","dependencies":["firebase_core","firebase_core_web"]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"modal_progress_hud_nsn","dependencies":[]},{"name":"pedometer","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2023-04-16 12:10:19.121492","version":"3.7.11"}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..70ccb97
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,44 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/.metadata b/.metadata
new file mode 100644
index 0000000..1e2795f
--- /dev/null
+++ b/.metadata
@@ -0,0 +1,45 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled.
+
+version:
+ revision: 18a827f3933c19f51862dde3fa472197683249d6
+ channel: stable
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ base_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ - platform: android
+ create_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ base_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ - platform: ios
+ create_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ base_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ - platform: linux
+ create_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ base_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ - platform: macos
+ create_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ base_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ - platform: web
+ create_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ base_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ - platform: windows
+ create_revision: 18a827f3933c19f51862dde3fa472197683249d6
+ base_revision: 18a827f3933c19f51862dde3fa472197683249d6
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/README.md b/README.md
index 0287eab..e69de29 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +0,0 @@
-# Electhon - 2023
-
-#### Team Name -
-#### Problem Statement -
-#### Team Leader Email -
-
-## A Brief of the Prototype:
- What is your solution? and how it works.
-
-## Code Execution Instruction:
- *[If your solution is **not** application based, you can ignore this para]
-
- *The Repository must contain your **Execution Plan PDF**.
diff --git a/README1.md b/README1.md
new file mode 100644
index 0000000..6f50d1f
--- /dev/null
+++ b/README1.md
@@ -0,0 +1,18 @@
+# Electhon - 2023
+
+#### Team Name - Gryffindor
+#### Problem Statement - Challenge 2: How to increase the participation of urban and youth voters in election?
+#### Team Leader Email - jhaabhishek887@gmail.com
+
+## A Brief of the Prototype:
+ What is your solution? and how it works.
+ We have made a app with the following features:
+ 1) login and registration with the voter id and phone no.
+ 2) walkthrough of the election process.
+ 3) Encrypted QR to ensure vote casting
+ 4) reward on voting with discount coupon
+
+## Code Execution Instruction:
+ *[If your solution is **not** application based, you can ignore this para]
+
+ *The Repository must contain your **Execution Plan PDF**.
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..a7acf24
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,29 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at
+ # https://dart-lang.github.io/linter/lints/index.html.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/android/app/build.gradle b/android/app/build.gradle
new file mode 100644
index 0000000..be193be
--- /dev/null
+++ b/android/app/build.gradle
@@ -0,0 +1,68 @@
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterRoot = localProperties.getProperty('flutter.sdk')
+if (flutterRoot == null) {
+ throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ flutterVersionName = '1.0'
+}
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+
+android {
+ compileSdkVersion 33
+ ndkVersion flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId "com.example.fitpad"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
+ minSdkVersion 23
+ targetSdkVersion flutter.targetSdkVersion
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ }
+
+ buildTypes {
+ release {
+ // TODO: Add your own signing config for the release build.
+ // Signing with the debug keys for now, so `flutter run --release` works.
+ signingConfig signingConfigs.debug
+ }
+ }
+}
+
+flutter {
+ source '../..'
+}
+dependencies {
+
+ implementation platform('com.google.firebase:firebase-bom:31.1.1')
+
+
+ implementation 'com.google.firebase:firebase-auth'
+ implementation 'com.google.firebase:firebase-firestore'
+}
+apply plugin: 'com.google.gms.google-services'
\ No newline at end of file
diff --git a/android/app/google-services.json b/android/app/google-services.json
new file mode 100644
index 0000000..5479297
--- /dev/null
+++ b/android/app/google-services.json
@@ -0,0 +1,40 @@
+{
+ "project_info": {
+ "project_number": "546001277191",
+ "firebase_url": "https://fitpad-ff2f5-default-rtdb.firebaseio.com",
+ "project_id": "fitpad-ff2f5",
+ "storage_bucket": "fitpad-ff2f5.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:546001277191:android:7b3a657ea2580334bd75a2",
+ "android_client_info": {
+ "package_name": "com.example.fitpad"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "546001277191-qsdsd17mt2r8dbubec101ln0rkg1f1a7.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyDYQakYeVuLrNUAxPMLrdZjXuJKGcY2q4k"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": [
+ {
+ "client_id": "546001277191-qsdsd17mt2r8dbubec101ln0rkg1f1a7.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..8648c1e
--- /dev/null
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..e59487b
--- /dev/null
+++ b/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/java/com/example/fitpad/MainActivity.java b/android/app/src/main/java/com/example/fitpad/MainActivity.java
new file mode 100644
index 0000000..70a8102
--- /dev/null
+++ b/android/app/src/main/java/com/example/fitpad/MainActivity.java
@@ -0,0 +1,6 @@
+package com.example.fitpad;
+
+import io.flutter.embedding.android.FlutterActivity;
+
+public class MainActivity extends FlutterActivity {
+}
diff --git a/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
new file mode 100644
index 0000000..641766f
--- /dev/null
+++ b/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
@@ -0,0 +1,69 @@
+package io.flutter.plugins;
+
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+import io.flutter.Log;
+
+import io.flutter.embedding.engine.FlutterEngine;
+
+/**
+ * Generated file. Do not edit.
+ * This file is generated by the Flutter tool based on the
+ * plugins that support the Android platform.
+ */
+@Keep
+public final class GeneratedPluginRegistrant {
+ private static final String TAG = "GeneratedPluginRegistrant";
+ public static void registerWith(@NonNull FlutterEngine flutterEngine) {
+ try {
+ flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.firestore.FlutterFirebaseFirestorePlugin());
+ } catch(Exception e) {
+ Log.e(TAG, "Error registering plugin cloud_firestore, io.flutter.plugins.firebase.firestore.FlutterFirebaseFirestorePlugin", e);
+ }
+ try {
+ flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.auth.FlutterFirebaseAuthPlugin());
+ } catch(Exception e) {
+ Log.e(TAG, "Error registering plugin firebase_auth, io.flutter.plugins.firebase.auth.FlutterFirebaseAuthPlugin", e);
+ }
+ try {
+ flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin());
+ } catch(Exception e) {
+ Log.e(TAG, "Error registering plugin firebase_core, io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin", e);
+ }
+ try {
+ flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.database.FirebaseDatabasePlugin());
+ } catch(Exception e) {
+ Log.e(TAG, "Error registering plugin firebase_database, io.flutter.plugins.firebase.database.FirebaseDatabasePlugin", e);
+ }
+ try {
+ flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.storage.FlutterFirebaseStoragePlugin());
+ } catch(Exception e) {
+ Log.e(TAG, "Error registering plugin firebase_storage, io.flutter.plugins.firebase.storage.FlutterFirebaseStoragePlugin", e);
+ }
+ try {
+ flutterEngine.getPlugins().add(new io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin());
+ } catch(Exception e) {
+ Log.e(TAG, "Error registering plugin flutter_plugin_android_lifecycle, io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin", e);
+ }
+ try {
+ flutterEngine.getPlugins().add(new io.flutter.plugins.imagepicker.ImagePickerPlugin());
+ } catch(Exception e) {
+ Log.e(TAG, "Error registering plugin image_picker_android, io.flutter.plugins.imagepicker.ImagePickerPlugin", e);
+ }
+ try {
+ flutterEngine.getPlugins().add(new com.walle.modal_progress_hud_nsn.ModalProgressHudNsnPlugin());
+ } catch(Exception e) {
+ Log.e(TAG, "Error registering plugin modal_progress_hud_nsn, com.walle.modal_progress_hud_nsn.ModalProgressHudNsnPlugin", e);
+ }
+ try {
+ flutterEngine.getPlugins().add(new com.example.pedometer.PedometerPlugin());
+ } catch(Exception e) {
+ Log.e(TAG, "Error registering plugin pedometer, com.example.pedometer.PedometerPlugin", e);
+ }
+ try {
+ flutterEngine.getPlugins().add(new io.flutter.plugins.urllauncher.UrlLauncherPlugin());
+ } catch(Exception e) {
+ Log.e(TAG, "Error registering plugin url_launcher_android, io.flutter.plugins.urllauncher.UrlLauncherPlugin", e);
+ }
+ }
+}
diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 0000000..1cb7aa2
--- /dev/null
+++ b/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 0000000..8403758
--- /dev/null
+++ b/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..d1d839b
--- /dev/null
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..44cc2df
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_back.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_back.png
new file mode 100644
index 0000000..1966948
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_back.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_fore.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_fore.png
new file mode 100644
index 0000000..d255302
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_fore.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..b0a7c01
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_back.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_back.png
new file mode 100644
index 0000000..75025cf
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_back.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_fore.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_fore.png
new file mode 100644
index 0000000..e84c5cd
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_fore.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..1598cc8
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_back.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_back.png
new file mode 100644
index 0000000..9784f16
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_back.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_fore.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_fore.png
new file mode 100644
index 0000000..82e3208
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_fore.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..9bae358
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_back.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_back.png
new file mode 100644
index 0000000..04ef206
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_back.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_fore.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_fore.png
new file mode 100644
index 0000000..6f02410
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_fore.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..03d1cc6
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_back.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_back.png
new file mode 100644
index 0000000..66a5487
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_back.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png
new file mode 100644
index 0000000..506f207
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png differ
diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 0000000..360a160
--- /dev/null
+++ b/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..5fac679
--- /dev/null
+++ b/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 0000000..8648c1e
--- /dev/null
+++ b/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,8 @@
+
+
+
+
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..f92c102
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,32 @@
+buildscript {
+ ext.kotlin_version = '1.6.10'
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:7.1.2'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath 'com.google.gms:google-services:4.3.13'
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/android/gradle.properties b/android/gradle.properties
new file mode 100644
index 0000000..46c1f16
--- /dev/null
+++ b/android/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx1536M
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..01cf6e6
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip
diff --git a/android/gradlew b/android/gradlew
new file mode 100644
index 0000000..9d82f78
--- /dev/null
+++ b/android/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/android/gradlew.bat b/android/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/android/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/android/local.properties b/android/local.properties
new file mode 100644
index 0000000..a308bca
--- /dev/null
+++ b/android/local.properties
@@ -0,0 +1,5 @@
+sdk.dir=C:\\Users\\ABHIJOY\\AppData\\Local\\Android\\sdk
+flutter.sdk=D:\\flutter\\flutter
+flutter.buildMode=debug
+flutter.versionName=1.0.0
+flutter.versionCode=1
\ No newline at end of file
diff --git a/android/settings.gradle b/android/settings.gradle
new file mode 100644
index 0000000..33f0745
--- /dev/null
+++ b/android/settings.gradle
@@ -0,0 +1,11 @@
+include ':app'
+
+def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
+def properties = new Properties()
+
+assert localPropertiesFile.exists()
+localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
+
+def flutterSdkPath = properties.getProperty("flutter.sdk")
+assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
diff --git a/fonts/Oswald-Regular.ttf b/fonts/Oswald-Regular.ttf
new file mode 100644
index 0000000..053cf26
Binary files /dev/null and b/fonts/Oswald-Regular.ttf differ
diff --git a/images/mainIcon.png b/images/mainIcon.png
new file mode 100644
index 0000000..526cfdb
Binary files /dev/null and b/images/mainIcon.png differ
diff --git a/images/ms0.jpg b/images/ms0.jpg
new file mode 100644
index 0000000..a076288
Binary files /dev/null and b/images/ms0.jpg differ
diff --git a/images/ms1.jpg b/images/ms1.jpg
new file mode 100644
index 0000000..1d7ac71
Binary files /dev/null and b/images/ms1.jpg differ
diff --git a/images/ms2.jpg b/images/ms2.jpg
new file mode 100644
index 0000000..9df0402
Binary files /dev/null and b/images/ms2.jpg differ
diff --git a/images/ms3.jpg b/images/ms3.jpg
new file mode 100644
index 0000000..aebd084
Binary files /dev/null and b/images/ms3.jpg differ
diff --git a/images/ms4.jpg b/images/ms4.jpg
new file mode 100644
index 0000000..6efecb8
Binary files /dev/null and b/images/ms4.jpg differ
diff --git a/images/ms5.jpg b/images/ms5.jpg
new file mode 100644
index 0000000..1a53ded
Binary files /dev/null and b/images/ms5.jpg differ
diff --git a/images/ms6.jpg b/images/ms6.jpg
new file mode 100644
index 0000000..48baedf
Binary files /dev/null and b/images/ms6.jpg differ
diff --git a/images/ms7.jpg b/images/ms7.jpg
new file mode 100644
index 0000000..ebf1e1f
Binary files /dev/null and b/images/ms7.jpg differ
diff --git a/images/welcomeImage.png b/images/welcomeImage.png
new file mode 100644
index 0000000..d7f6cb3
Binary files /dev/null and b/images/welcomeImage.png differ
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 0000000..0d9747f
--- /dev/null
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 11.0
+
+
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
new file mode 100644
index 0000000..0b2d479
--- /dev/null
+++ b/ios/Flutter/Debug.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/ios/Flutter/Generated.xcconfig b/ios/Flutter/Generated.xcconfig
new file mode 100644
index 0000000..5ce100d
--- /dev/null
+++ b/ios/Flutter/Generated.xcconfig
@@ -0,0 +1,14 @@
+// This is a generated file; do not edit or check into version control.
+FLUTTER_ROOT=D:\flutter\flutter
+FLUTTER_APPLICATION_PATH=C:\Users\ABHIJOY\Music\app\FitPad
+COCOAPODS_PARALLEL_CODE_SIGN=true
+FLUTTER_TARGET=lib\main.dart
+FLUTTER_BUILD_DIR=build
+FLUTTER_BUILD_NAME=1.0.0
+FLUTTER_BUILD_NUMBER=1
+EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386
+EXCLUDED_ARCHS[sdk=iphoneos*]=armv7
+DART_OBFUSCATION=false
+TRACK_WIDGET_CREATION=true
+TREE_SHAKE_ICONS=false
+PACKAGE_CONFIG=.dart_tool/package_config.json
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
new file mode 100644
index 0000000..0b2d479
--- /dev/null
+++ b/ios/Flutter/Release.xcconfig
@@ -0,0 +1 @@
+#include "Generated.xcconfig"
diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh
new file mode 100644
index 0000000..1bad920
--- /dev/null
+++ b/ios/Flutter/flutter_export_environment.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+# This is a generated file; do not edit or check into version control.
+export "FLUTTER_ROOT=D:\flutter\flutter"
+export "FLUTTER_APPLICATION_PATH=C:\Users\ABHIJOY\Music\app\FitPad"
+export "COCOAPODS_PARALLEL_CODE_SIGN=true"
+export "FLUTTER_TARGET=lib\main.dart"
+export "FLUTTER_BUILD_DIR=build"
+export "FLUTTER_BUILD_NAME=1.0.0"
+export "FLUTTER_BUILD_NUMBER=1"
+export "DART_OBFUSCATION=false"
+export "TRACK_WIDGET_CREATION=true"
+export "TREE_SHAKE_ICONS=false"
+export "PACKAGE_CONFIG=.dart_tool/package_config.json"
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..88b247e
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,481 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 1300;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.fitpad;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.fitpad;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.fitpad;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..c4b79bd
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..fc6bf80
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..af0309c
--- /dev/null
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 0000000..f9cbb25
--- /dev/null
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..59c6d39
--- /dev/null
+++ b/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..fc6bf80
--- /dev/null
+++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..af0309c
--- /dev/null
+++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
new file mode 100644
index 0000000..3763683
--- /dev/null
+++ b/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..1950fd8
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+ "images" : [
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-83.5x83.5@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "Icon-App-1024x1024@1x.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 0000000..dc9ada4
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 0000000..28c6bf0
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 0000000..2ccbfd9
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 0000000..f091b6b
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 0000000..4cde121
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 0000000..d0ef06e
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 0000000..dcdc230
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 0000000..2ccbfd9
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 0000000..c8f9ed8
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 0000000..a6d6b86
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 0000000..a6d6b86
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 0000000..75b2d16
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 0000000..c4df70d
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 0000000..6a84f41
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000..d0e1f58
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 0000000..d08a4de
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 0000000..65a94b5
--- /dev/null
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..497371e
--- /dev/null
+++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..bbb83ca
--- /dev/null
+++ b/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/GeneratedPluginRegistrant.h b/ios/Runner/GeneratedPluginRegistrant.h
new file mode 100644
index 0000000..7a89092
--- /dev/null
+++ b/ios/Runner/GeneratedPluginRegistrant.h
@@ -0,0 +1,19 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#ifndef GeneratedPluginRegistrant_h
+#define GeneratedPluginRegistrant_h
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface GeneratedPluginRegistrant : NSObject
++ (void)registerWithRegistry:(NSObject*)registry;
+@end
+
+NS_ASSUME_NONNULL_END
+#endif /* GeneratedPluginRegistrant_h */
diff --git a/ios/Runner/GeneratedPluginRegistrant.m b/ios/Runner/GeneratedPluginRegistrant.m
new file mode 100644
index 0000000..e1d1c22
--- /dev/null
+++ b/ios/Runner/GeneratedPluginRegistrant.m
@@ -0,0 +1,77 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#import "GeneratedPluginRegistrant.h"
+
+#if __has_include()
+#import
+#else
+@import cloud_firestore;
+#endif
+
+#if __has_include()
+#import
+#else
+@import firebase_auth;
+#endif
+
+#if __has_include()
+#import
+#else
+@import firebase_core;
+#endif
+
+#if __has_include()
+#import
+#else
+@import firebase_database;
+#endif
+
+#if __has_include()
+#import
+#else
+@import firebase_storage;
+#endif
+
+#if __has_include()
+#import
+#else
+@import image_picker_ios;
+#endif
+
+#if __has_include()
+#import
+#else
+@import modal_progress_hud_nsn;
+#endif
+
+#if __has_include()
+#import
+#else
+@import pedometer;
+#endif
+
+#if __has_include()
+#import
+#else
+@import url_launcher_ios;
+#endif
+
+@implementation GeneratedPluginRegistrant
+
++ (void)registerWithRegistry:(NSObject*)registry {
+ [FLTFirebaseFirestorePlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseFirestorePlugin"]];
+ [FLTFirebaseAuthPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseAuthPlugin"]];
+ [FLTFirebaseCorePlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseCorePlugin"]];
+ [FLTFirebaseDatabasePlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseDatabasePlugin"]];
+ [FLTFirebaseStoragePlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseStoragePlugin"]];
+ [FLTImagePickerPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTImagePickerPlugin"]];
+ [ModalProgressHudNsnPlugin registerWithRegistrar:[registry registrarForPlugin:@"ModalProgressHudNsnPlugin"]];
+ [PedometerPlugin registerWithRegistrar:[registry registrarForPlugin:@"PedometerPlugin"]];
+ [FLTURLLauncherPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTURLLauncherPlugin"]];
+}
+
+@end
diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist
new file mode 100644
index 0000000..d49459a
--- /dev/null
+++ b/ios/Runner/GoogleService-Info.plist
@@ -0,0 +1,36 @@
+
+
+
+
+ CLIENT_ID
+ 546001277191-tieai27oge9lio812s0m284293va3ae8.apps.googleusercontent.com
+ REVERSED_CLIENT_ID
+ com.googleusercontent.apps.546001277191-tieai27oge9lio812s0m284293va3ae8
+ API_KEY
+ AIzaSyBQlPPTyQU52SAifE7i5LwcdJ5otAvmGAY
+ GCM_SENDER_ID
+ 546001277191
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ com.example.fitpad
+ PROJECT_ID
+ fitpad-ff2f5
+ STORAGE_BUCKET
+ fitpad-ff2f5.appspot.com
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:546001277191:ios:032ec8e98fc14bf7bd75a2
+ DATABASE_URL
+ https://fitpad-ff2f5-default-rtdb.firebaseio.com
+
+
\ No newline at end of file
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
new file mode 100644
index 0000000..e8bc064
--- /dev/null
+++ b/ios/Runner/Info.plist
@@ -0,0 +1,51 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Fitpad
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ fitpad
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 0000000..fae207f
--- /dev/null
+++ b/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/ios/firebase_app_id_file.json b/ios/firebase_app_id_file.json
new file mode 100644
index 0000000..fe1dae0
--- /dev/null
+++ b/ios/firebase_app_id_file.json
@@ -0,0 +1,7 @@
+{
+ "file_generated_by": "FlutterFire CLI",
+ "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
+ "GOOGLE_APP_ID": "1:546001277191:ios:032ec8e98fc14bf7bd75a2",
+ "FIREBASE_PROJECT_ID": "fitpad-ff2f5",
+ "GCM_SENDER_ID": "546001277191"
+}
\ No newline at end of file
diff --git a/lib/authentication/screens/login_screen.dart b/lib/authentication/screens/login_screen.dart
new file mode 100644
index 0000000..a206f06
--- /dev/null
+++ b/lib/authentication/screens/login_screen.dart
@@ -0,0 +1,213 @@
+// ignore_for_file: use_build_context_synchronously
+
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:fitpad/authentication/screens/register_screen.dart';
+
+import 'package:fitpad/features/reset_password/screens/reset_password_screen.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:fitpad/shared/widgets/custom_button.dart';
+import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+
+import '../../features/home_screen.dart';
+
+class LoginScreen extends StatefulWidget {
+ const LoginScreen({super.key});
+
+ @override
+ State createState() => _LoginScreenState();
+}
+
+class _LoginScreenState extends State {
+ final formKey = GlobalKey();
+ late String email;
+ bool visiblePassword = true;
+ late String password;
+ bool showSpinner = false;
+ Future signIn() async {
+ setState(() {
+ showSpinner = true;
+ });
+ try {
+ final signInUser = await FirebaseAuth.instance.signInWithEmailAndPassword(
+ email: email.trim(),
+ password: password.trim(),
+ );
+ setState(() {
+ showSpinner = false;
+ });
+ if (signInUser != null) {
+ Navigator.pushReplacement(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const HomeScreen(),
+ ));
+ }
+ } on FirebaseAuthException catch (e) {
+ ScaffoldMessenger.of(context).showSnackBar(
+ SnackBar(
+ backgroundColor: blueColor,
+ elevation: 5,
+ content: Text(
+ e.message.toString(),
+ style: kTextStyleLarge,
+ ),
+ ),
+ );
+ setState(() {
+ showSpinner = false;
+ });
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: ModalProgressHUD(
+ progressIndicator: const CircularProgressIndicator(
+ color: blueColor,
+ ),
+ inAsyncCall: showSpinner,
+ child: Center(
+ child: SingleChildScrollView(
+ reverse: true,
+ child: Form(
+ key: formKey,
+ child: Column(
+ children: [
+ const Text("Welcome back!", style: kTextStyleHeaders),
+ Text(
+ "Please sign in to your account",
+ style: kTextStyleSmall.copyWith(color: Colors.grey),
+ ),
+ const SizedBox(height: 50),
+ Padding(
+ padding: const EdgeInsets.only(
+ bottom: 15, left: 40, right: 40, top: 30),
+ child: TextFormField(
+ decoration: kTextFieldDecoration.copyWith(
+ hintText: "Phone",
+ prefixIcon: const Icon(
+ Icons.phone_android,
+ color: Colors.white,
+ )),
+ onChanged: (value) {
+ setState(() {
+ email = value;
+ });
+ },
+ keyboardType: TextInputType.emailAddress,
+ textInputAction: TextInputAction.done,
+ validator: (value) {
+ if (value!.isEmpty) {
+ return "phone is required";
+ }
+ return null;
+ },
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 40),
+ child: TextFormField(
+ decoration: kTextFieldDecoration.copyWith(
+ hintText: "Password",
+ suffixIcon: IconButton(
+ onPressed: () {
+ setState(() {
+ if (visiblePassword == true) {
+ visiblePassword = false;
+ } else {
+ visiblePassword = true;
+ }
+ });
+ },
+ icon: visiblePassword == true
+ ? const Icon(CupertinoIcons.eye_fill,
+ color: Colors.white)
+ : const Icon(CupertinoIcons.eye_slash_fill,
+ color: Colors.white),
+ ),
+ prefixIcon: const Icon(
+ Icons.lock,
+ color: Colors.white,
+ )),
+ onChanged: (value) {
+ setState(() {
+ password = value;
+ });
+ },
+ obscureText: visiblePassword,
+ textInputAction: TextInputAction.done,
+ validator: (value) {
+ if (value!.isEmpty) {
+ return "password is required";
+ }
+ return null;
+ },
+ ),
+ ),
+ const SizedBox(height: 10),
+ Padding(
+ padding: const EdgeInsets.only(right: 40),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ GestureDetector(
+ child: Text(
+ "Forgot password?",
+ style: kTextStyleSmall.copyWith(color: Colors.grey),
+ ),
+ onTap: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) =>
+ const ResetPasswordScreen(),
+ ));
+ },
+ ),
+ ],
+ ),
+ ),
+ const SizedBox(height: 50),
+ CustomButton(
+ text: 'Sign In',
+ onPressed: () {
+ final validateForm = formKey.currentState!.validate();
+ if (validateForm) {
+ signIn();
+ }
+ },
+ ),
+ const SizedBox(height: 10),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ const Text("Don't have account?", style: kTextStyleSmall),
+ TextButton(
+ onPressed: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const RegisterScreen(),
+ ),
+ );
+ },
+ child: Text(
+ "Sign Up",
+ style: kTextStyleSmall.copyWith(
+ fontWeight: FontWeight.bold, color: Colors.deepPurple),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/authentication/screens/register_screen.dart b/lib/authentication/screens/register_screen.dart
new file mode 100644
index 0000000..f6c78df
--- /dev/null
+++ b/lib/authentication/screens/register_screen.dart
@@ -0,0 +1,336 @@
+// ignore_for_file: use_build_context_synchronously
+import 'package:cloud_firestore/cloud_firestore.dart';
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:fitpad/authentication/screens/login_screen.dart';
+import 'package:fitpad/features/home_screen.dart';
+
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:fitpad/shared/widgets/custom_button.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
+
+class RegisterScreen extends StatefulWidget {
+ const RegisterScreen({super.key});
+
+ @override
+ State createState() => _RegisterScreenState();
+}
+
+class _RegisterScreenState extends State {
+ final formKey = GlobalKey();
+ String? email;
+ bool visiblePassword = true;
+ String? password;
+ String? name;
+ String? number;
+ bool showSpinner = false;
+ Future signUp() async {
+ setState(() {
+ showSpinner = true;
+ });
+ try {
+ final signUpUser = await FirebaseAuth.instance
+ .createUserWithEmailAndPassword(
+ email: email!.trim(), password: password!.trim());
+ if (signUpUser != null) {
+ Navigator.pushReplacement(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const HomeScreen(),
+ ),
+ );
+ }
+ setState(() {
+ showSpinner = false;
+ });
+ } on FirebaseAuthException catch (e) {
+ ScaffoldMessenger.of(context).showSnackBar(
+ SnackBar(
+ backgroundColor: blueColor,
+ elevation: 5,
+ duration: const Duration(seconds: 3),
+ content: Text(
+ e.message.toString(),
+ style: kTextStyleLarge,
+ ),
+ ),
+ );
+ setState(() {
+ showSpinner = false;
+ });
+ }
+ }
+
+ final _firebaseFirestore =
+ FirebaseFirestore.instance.collection('ProfileDetails');
+
+ @override
+ void dispose() {
+ Map information = {
+ 'UserName': name!.trim(),
+ 'Number': number!.trim(),
+ };
+ _firebaseFirestore
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .set(information);
+ _firebaseFirestore
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .collection('ProfilePicture')
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .set({});
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: ModalProgressHUD(
+ progressIndicator: const CircularProgressIndicator(
+ color: blueColor,
+ ),
+ inAsyncCall: showSpinner,
+ child: Center(
+ child: SingleChildScrollView(
+ reverse: true,
+ child: Form(
+ key: formKey,
+ child: Column(
+ children: [
+ const Text("Create new account", style: kTextStyleHeaders),
+ Text(
+ "Please fill the form to continue",
+ style: kTextStyleSmall.copyWith(color: Colors.grey),
+ ),
+ const SizedBox(height: 50),
+ Padding(
+ padding:
+ const EdgeInsets.symmetric(horizontal: 40, vertical: 5),
+ child: TextFormField(
+ textCapitalization: TextCapitalization.words,
+ decoration: kTextFieldDecoration.copyWith(
+ hintText: "Username",
+ prefixIcon: const Icon(
+ Icons.person,
+ color: Colors.white,
+ )),
+ onChanged: (value) {
+ setState(() {
+ name = value;
+ });
+ },
+ textInputAction: TextInputAction.done,
+ validator: (value) {
+ if (value!.isEmpty) {
+ return "Username is required";
+ }
+ return null;
+ },
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsets.symmetric(horizontal: 40, vertical: 5),
+ child: TextFormField(
+ decoration: kTextFieldDecoration.copyWith(
+ hintText: "Email",
+ prefixIcon: const Icon(
+ Icons.mail,
+ color: Colors.white,
+ )),
+ onChanged: (value) {
+ setState(() {
+ email = value;
+ });
+ },
+ keyboardType: TextInputType.emailAddress,
+ textInputAction: TextInputAction.done,
+ validator: (value) {
+ if (value!.isEmpty) {
+ return "email is required";
+ }
+ return null;
+ },
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsets.symmetric(horizontal: 40, vertical: 5),
+ child: TextFormField(
+ decoration: kTextFieldDecoration.copyWith(
+ hintText: "Age",
+ prefixIcon: const Icon(
+ Icons.person,
+ color: Colors.white,
+ )),
+ onChanged: (value) {
+ setState(() {
+ email = value;
+ });
+ },
+ keyboardType: TextInputType.number,
+ textInputAction: TextInputAction.done,
+ validator: (value) {
+ if (value!.isEmpty) {
+ return "Age is required";
+ }
+ return null;
+ },
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsets.symmetric(horizontal: 40, vertical: 5),
+ child: TextFormField(
+ decoration: kTextFieldDecoration.copyWith(
+ hintText: "Address",
+ prefixIcon: const Icon(
+ Icons.house,
+ color: Colors.white,
+ )),
+ onChanged: (value) {
+ setState(() {
+ email = value;
+ });
+ },
+ keyboardType: TextInputType.streetAddress,
+ textInputAction: TextInputAction.done,
+ validator: (value) {
+ if (value!.isEmpty) {
+ return "Address is required";
+ }
+ return null;
+ },
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsets.symmetric(horizontal: 40, vertical: 5),
+ child: TextFormField(
+ decoration: kTextFieldDecoration.copyWith(
+ hintText: "Phone Number",
+ prefixIcon: const Icon(
+ Icons.phone,
+ color: Colors.white,
+ )),
+ onChanged: (value) {
+ setState(() {
+ number = value;
+ });
+ },
+ keyboardType: TextInputType.phone,
+ textInputAction: TextInputAction.done,
+ validator: (value) {
+ if (value != null && value.length < 10) {
+ return "phone number must be of 10 digit";
+ }
+ return null;
+ },
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsets.symmetric(horizontal: 40, vertical: 5),
+ child: TextFormField(
+ decoration: kTextFieldDecoration.copyWith(
+ hintText: "Voter ID Number",
+ prefixIcon: const Icon(
+ Icons.how_to_vote,
+ color: Colors.white,
+ )),
+ onChanged: (value) {
+ setState(() {
+ number = value;
+ });
+ },
+ keyboardType: TextInputType.text,
+ textInputAction: TextInputAction.done,
+ validator: (value) {
+ if (value != null && value.length < 10) {
+ return "Voter Id number must be of 10 digit";
+ }
+ return null;
+ },
+ ),
+ ),
+ Padding(
+ padding:
+ const EdgeInsets.symmetric(horizontal: 40, vertical: 5),
+ child: TextFormField(
+ decoration: kTextFieldDecoration.copyWith(
+ hintText: "Password",
+ suffixIcon: IconButton(
+ onPressed: () {
+ setState(() {
+ if (visiblePassword == true) {
+ visiblePassword = false;
+ } else {
+ visiblePassword = true;
+ }
+ });
+ },
+ icon: visiblePassword == true
+ ? const Icon(CupertinoIcons.eye_fill,
+ color: Colors.white)
+ : const Icon(CupertinoIcons.eye_slash_fill,
+ color: Colors.white),
+ ),
+ prefixIcon: const Icon(
+ Icons.lock,
+ color: Colors.white,
+ )),
+ onChanged: (value) {
+ setState(() {
+ password = value;
+ });
+ },
+ obscureText: visiblePassword,
+ textInputAction: TextInputAction.done,
+ validator: (value) {
+ if (value!.isEmpty) {
+ return "password is required";
+ }
+ return null;
+ },
+ ),
+ ),
+ const SizedBox(height: 50),
+ CustomButton(
+ text: 'Sign Up',
+ onPressed: () {
+ final validateForm = formKey.currentState!.validate();
+ if (validateForm) {
+ signUp();
+ }
+ },
+ ),
+ const SizedBox(height: 10),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ const Text("Already have account?", style: kTextStyleSmall),
+ TextButton(
+ onPressed: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const LoginScreen(),
+ ));
+ },
+ child: Text(
+ "Sign In",
+ style: kTextStyleSmall.copyWith(
+ fontWeight: FontWeight.bold,
+ color: Colors.deepPurple),
+ ))
+ ],
+ )
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/dashboard/screens/dashboard_screen.dart b/lib/features/dashboard/screens/dashboard_screen.dart
new file mode 100644
index 0000000..a58de4c
--- /dev/null
+++ b/lib/features/dashboard/screens/dashboard_screen.dart
@@ -0,0 +1,89 @@
+import 'package:firebase_database/firebase_database.dart';
+import 'package:fitpad/features/dashboard/screens/output_screen.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+
+class dashboardScreen extends StatefulWidget {
+ const dashboardScreen({super.key});
+
+ @override
+ State createState() => _dashboardScreenState();
+}
+
+class _dashboardScreenState extends State {
+ List getData = [];
+ final DatabaseReference _databaseReference =
+ FirebaseDatabase.instance.reference();
+
+ @override
+ void initState() {
+ _databaseReference
+ .child('Leaderboard')
+ .once()
+ .then((DatabaseEvent databaseEvent) {
+ setState(() {
+ getData = databaseEvent.snapshot.value as List;
+ });
+ });
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text(
+ 'Leaderboard',
+ style: kTextStyleHeaders,
+ ),
+ ),
+ body: Padding(
+ padding: const EdgeInsets.only(left: 8, right: 8, top: 8),
+ child: getData.isEmpty
+ ? const Center(
+ child: CircularProgressIndicator(
+ color: blueColor,
+ ),
+ )
+ : ListView.builder(
+ itemBuilder: (context, index) {
+ return Padding(
+ padding: const EdgeInsets.only(top: 5, left: 5, right: 5),
+ child: Column(
+ children: [
+ Card(
+ elevation: 2,
+ color: Colors.white,
+ shadowColor: Colors.white,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(10)),
+ child: ListTile(
+ leading: const Image(
+ image: AssetImage('images/mainIcon.png'),
+ height: 40,
+ width: 40,
+ ),
+ title: Text('${getData[index]['AName']}',
+ style: kTextStyleLarge.copyWith(
+ color: Colors.black)),
+ onTap: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => OutputScreen(
+ name: getData[index]['AName'],
+ index: index),
+ ));
+ },
+ ),
+ ),
+ ],
+ ),
+ );
+ },
+ itemCount: getData.length,
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/dashboard/screens/output_screen.dart b/lib/features/dashboard/screens/output_screen.dart
new file mode 100644
index 0000000..1433fdf
--- /dev/null
+++ b/lib/features/dashboard/screens/output_screen.dart
@@ -0,0 +1,82 @@
+import 'package:firebase_database/firebase_database.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+
+class OutputScreen extends StatefulWidget {
+ const OutputScreen({super.key, this.name, this.index});
+ final String? name;
+ final int? index;
+ @override
+ State createState() => _OutputScreenState();
+}
+
+class _OutputScreenState extends State {
+ List getData = [];
+
+ final DatabaseReference _databaseReference =
+ FirebaseDatabase.instance.reference();
+
+ @override
+ void initState() {
+ _databaseReference
+ .child('dashboardAsans')
+ .once()
+ .then((DatabaseEvent databaseEvent) {
+ setState(() {
+ getData = databaseEvent.snapshot.value as List;
+ });
+ });
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text(
+ widget.name.toString(),
+ style: kTextStyleHeaders,
+ ),
+ ),
+ body: getData.isEmpty
+ ? const Center(
+ child: CircularProgressIndicator(
+ color: blueColor,
+ ),
+ )
+ : SingleChildScrollView(
+ child: Padding(
+ padding: const EdgeInsets.only(left: 20, top: 20),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text('About:- ',
+ style: kTextStyleLarge.copyWith(
+ fontWeight: FontWeight.w700,
+ color: Colors.green)),
+ Text('${getData[widget.index!]['Benefits']}',
+ style: kTextStyleSmall),
+ ],
+ ),
+ const SizedBox(height: 5),
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text('No. of referals:- ',
+ style: kTextStyleLarge.copyWith(
+ fontWeight: FontWeight.w700,
+ color: Colors.amber)),
+ Text('${getData[widget.index!]['Breathing']}',
+ style: kTextStyleSmall),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/feedback/screens/feedback_screen.dart b/lib/features/feedback/screens/feedback_screen.dart
new file mode 100644
index 0000000..64c0593
--- /dev/null
+++ b/lib/features/feedback/screens/feedback_screen.dart
@@ -0,0 +1,84 @@
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:fitpad/shared/widgets/custom_button.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_rating_bar/flutter_rating_bar.dart';
+import 'package:rflutter_alert/rflutter_alert.dart';
+
+class FeedbackScreen extends StatelessWidget {
+ const FeedbackScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return SafeArea(
+ child: Scaffold(
+ resizeToAvoidBottomInset: false,
+ appBar: AppBar(
+ backgroundColor: blueColor,
+ title: const Text(
+ 'Feedback',
+ style: kTextStyleHeaders,
+ ),
+ ),
+ body: Padding(
+ padding: const EdgeInsets.only(left: 30, right: 30),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const SizedBox(height: 50),
+ const Text(
+ 'Rate Experience',
+ style: kTextStyleHeadings,
+ ),
+ const SizedBox(height: 5),
+ const Text('Are you Satisfied from our services?',
+ style: kTextStyleSmall),
+ const SizedBox(height: 20),
+ RatingBar.builder(
+ itemBuilder: (context, index) {
+ return const Icon(
+ Icons.star,
+ color: Color(0xFFE21414),
+ );
+ },
+ itemCount: 5,
+ itemSize: 45,
+ unratedColor: Colors.white,
+ itemPadding: const EdgeInsets.all(5),
+ initialRating: 0,
+ allowHalfRating: true,
+ onRatingUpdate: (value) {},
+ ),
+ const Divider(thickness: 1, height: 50),
+ TextFormField(
+ decoration: kTextFieldDecoration.copyWith(
+ hintText: 'Tell us how can we improve',
+ ),
+ ),
+ const SizedBox(height: 50),
+ Center(
+ child: CustomButton(
+ text: 'Submit',
+ onPressed: () {
+ Alert(
+ context: context,
+ title: 'Thank You',
+ desc: 'Your feedback has been successfully submitted',
+ type: AlertType.success,
+ closeIcon: const Icon(Icons.clear),
+ style: const AlertStyle(
+ animationType: AnimationType.shrink, alertElevation: 2),
+ buttons: [
+ DialogButton(
+ child: const Text('Back'),
+ onPressed: () {
+ Navigator.pop(context);
+ }),
+ ]).show();
+ },
+ )),
+ ],
+ ),
+ ),
+ ));
+ }
+}
diff --git a/lib/features/home_screen.dart b/lib/features/home_screen.dart
new file mode 100644
index 0000000..43285fc
--- /dev/null
+++ b/lib/features/home_screen.dart
@@ -0,0 +1,214 @@
+import 'package:cloud_firestore/cloud_firestore.dart';
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:fitpad/features/qrcode/screens/calculators_screen.dart';
+import 'package:fitpad/features/refer/screens/coupon.dart';
+import 'package:fitpad/features/profile/screens/profile_screen.dart';
+import 'package:fitpad/features/toDoList/models/toDoList_model.dart';
+import 'package:fitpad/features/toDoList/screens/ToDolist_screen.dart';
+import 'package:fitpad/features/dashboard/screens/dashboard_screen.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:provider/provider.dart';
+
+class HomeScreen extends StatelessWidget {
+ const HomeScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final provider = Provider.of(context, listen: true);
+ return Scaffold(
+ body: SingleChildScrollView(
+ physics: const NeverScrollableScrollPhysics(),
+ child: Padding(
+ padding:
+ const EdgeInsets.only(left: 20, right: 16, bottom: 16, top: 30),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ SafeArea(
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ RichText(
+ text: TextSpan(children: [
+ const TextSpan(text: 'Vote', style: kTextStyleHeadings),
+ TextSpan(
+ text: 'One',
+ style: kTextStyleHeadings.copyWith(
+ color: Colors.deepPurple))
+ ])),
+ InkWell(
+ borderRadius: BorderRadius.circular(100),
+ onTap: () => Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const ProfileScreen(),
+ )),
+ child: StreamBuilder(
+ stream: FirebaseFirestore.instance
+ .collection('ProfileDetails')
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .collection('ProfilePicture')
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .snapshots(),
+ builder: (context, snapshot) {
+ if (!snapshot.hasData) {
+ return const CircleAvatar(
+ backgroundColor: Colors.transparent,
+ child:
+ Icon(Icons.person, color: Colors.white));
+ }
+ return CircleAvatar(
+ backgroundImage: snapshot.data!
+ .data()!['ProfilePicture'] ==
+ null
+ ? null
+ : NetworkImage(
+ snapshot.data!.data()!['ProfilePicture']),
+ backgroundColor: Colors.transparent,
+ child: snapshot.data!.data()!['ProfilePicture'] ==
+ null
+ ? const Icon(Icons.person,
+ color: Colors.white)
+ : null,
+ );
+ }),
+ )
+ ],
+ ),
+ ),
+ const SizedBox(height: 30),
+ const Text(
+ 'Dashboard',
+ style: kTextStyleHeadings,
+ ),
+ const SizedBox(height: 10),
+ StaggeredGrid.count(
+ crossAxisCount: 4,
+ mainAxisSpacing: 4,
+ crossAxisSpacing: 4,
+ children: [
+ StaggeredGridTile.count(
+ crossAxisCellCount: 4,
+ mainAxisCellCount: 2,
+ child: CardTile(
+ index: 1,
+ text: 'Leaderboard',
+ onTap: () => Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const dashboardScreen(),
+ )),
+ ),
+ ),
+ StaggeredGridTile.count(
+ crossAxisCellCount: 2,
+ mainAxisCellCount: 2,
+ child: Card(
+ elevation: 5,
+ shadowColor: Colors.grey,
+ color: Colors.red.shade400,
+ child: InkWell(
+ borderRadius: BorderRadius.circular(10),
+ onTap: () => Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const CalculatorsScreen(),
+ ),
+ ),
+ child: Ink(
+ child: const Icon(
+ FontAwesomeIcons.qrcode,
+ size: 45,
+ color: Colors.white,
+ ),
+ ),
+ ),
+ ),
+ ),
+ StaggeredGridTile.count(
+ crossAxisCellCount: 2,
+ mainAxisCellCount: 4,
+ child: CardTile(
+ index: 3,
+ text: 'CREDIT',
+ onTap: () => Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const GymScreen(),
+ )),
+ ),
+ ),
+ StaggeredGridTile.count(
+ crossAxisCellCount: 2,
+ mainAxisCellCount: 2,
+ child: Card(
+ elevation: 5,
+ shadowColor: Colors.grey,
+ color: Colors.blue.shade600,
+ child: InkWell(
+ borderRadius: BorderRadius.circular(10),
+ onTap: () => Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const ToDoListScreen(),
+ )),
+ child: Ink(
+ child: const Icon(
+ FontAwesomeIcons.personWalking,
+ size: 45,
+ color: Colors.white,
+ ),
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
+
+class CardTile extends StatelessWidget {
+ const CardTile(
+ {Key? key, required this.text, required this.index, required this.onTap})
+ : super(key: key);
+ final String text;
+ final int index;
+ final Function() onTap;
+ @override
+ Widget build(BuildContext context) {
+ return Card(
+ elevation: 5,
+ color: Colors.transparent,
+ shadowColor: Colors.grey,
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
+ child: InkWell(
+ onTap: onTap,
+ borderRadius: BorderRadius.circular(10),
+ child: Ink(
+ decoration: kContainerDecoration.copyWith(
+ image: DecorationImage(
+ image: AssetImage('images/a$index.jpg'), fit: BoxFit.cover)),
+ child: Padding(
+ padding: const EdgeInsets.all(14.0),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.end,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(text,
+ style: kTextStyleHeaders.copyWith(color: Colors.white))
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/profile/models/profile_model.dart b/lib/features/profile/models/profile_model.dart
new file mode 100644
index 0000000..cbc70ff
--- /dev/null
+++ b/lib/features/profile/models/profile_model.dart
@@ -0,0 +1,51 @@
+import 'dart:io';
+import 'package:cloud_firestore/cloud_firestore.dart';
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:firebase_storage/firebase_storage.dart';
+import 'package:flutter/material.dart';
+import 'package:path/path.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:image_picker/image_picker.dart';
+import 'package:provider/provider.dart';
+
+import '../../toDoList/models/toDoList_model.dart';
+
+class ProfileModel {
+ static final _firebaseFirestore =
+ FirebaseFirestore.instance.collection('ProfileDetails');
+ static void setProfilePicture(BuildContext context) async {
+ try {
+ final picker = await ImagePicker().pickImage(source: ImageSource.gallery);
+
+ uploadProfileImageToFirebaseStorage(File(picker!.path), context);
+ } catch (e) {
+ print(e);
+ }
+ }
+
+ static Future uploadProfileImageToFirebaseStorage(
+ File image, BuildContext context) async {
+ String fileName = basename(image.path);
+
+ var reference = FirebaseStorage.instance.ref().child(
+ 'profileImages/${FirebaseAuth.instance.currentUser!.uid}/$fileName');
+ UploadTask uploadTask = reference.putFile(image);
+ TaskSnapshot taskSnapshot = await uploadTask.whenComplete(() => null);
+ await taskSnapshot.ref.getDownloadURL().then((value) {
+ Provider.of(context, listen: false).setProfilePhoto(value);
+ Map information = {
+ 'ProfilePicture': value,
+ };
+ _firebaseFirestore
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .collection('ProfilePicture')
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .set(information);
+ }).catchError((FirebaseException e) {
+ ScaffoldMessenger.of(context)
+ .showSnackBar(SnackBar(content: Text(e.message!)));
+ });
+
+ return Provider.of(context, listen: false).profilePhoto!;
+ }
+}
diff --git a/lib/features/profile/screens/profile_screen.dart b/lib/features/profile/screens/profile_screen.dart
new file mode 100644
index 0000000..eda1484
--- /dev/null
+++ b/lib/features/profile/screens/profile_screen.dart
@@ -0,0 +1,31 @@
+// ignore_for_file: deprecated_member_use
+
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+
+import '../widgets/profile_card.dart';
+import '../widgets/profile_list.dart';
+
+class ProfileScreen extends StatelessWidget {
+ const ProfileScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ elevation: 0,
+ backgroundColor: Colors.transparent,
+ title: const Text(
+ 'Profile',
+ style: kTextStyleHeaders,
+ ),
+ ),
+ body: Stack(
+ children: const [
+ ProfileList(),
+ ProfileCard(),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/features/profile/widgets/profile_card.dart b/lib/features/profile/widgets/profile_card.dart
new file mode 100644
index 0000000..c30ab3c
--- /dev/null
+++ b/lib/features/profile/widgets/profile_card.dart
@@ -0,0 +1,119 @@
+import 'package:cloud_firestore/cloud_firestore.dart';
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import '../../../shared/utils/constants.dart';
+import '../../toDoList/models/toDoList_model.dart';
+import '../models/profile_model.dart';
+
+class ProfileCard extends StatelessWidget {
+ const ProfileCard({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ final provider = Provider.of(context, listen: true);
+ return StreamBuilder(
+ stream: FirebaseFirestore.instance
+ .collection('ProfileDetails')
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .snapshots(),
+ builder: (context, snapshot) {
+ if (snapshot.connectionState == ConnectionState.waiting) {
+ return const Center(
+ child: CircularProgressIndicator(
+ color: blueColor,
+ ),
+ );
+ } else {
+ return Padding(
+ padding: const EdgeInsets.only(left: 15, top: 15),
+ child: Card(
+ elevation: 5,
+ color: const Color(0xff2F3541),
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(25)),
+ child: SizedBox(
+ height: 220,
+ width: 350,
+ child: Padding(
+ padding: const EdgeInsets.only(top: 30),
+ child: Column(
+ children: [
+ Stack(
+ children: [
+ StreamBuilder(
+ stream: FirebaseFirestore.instance
+ .collection('ProfileDetails')
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .collection('ProfilePicture')
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .snapshots(),
+ builder: (context, snapshot) {
+ if (!snapshot.hasData) {
+ return const CircleAvatar(
+ radius: 45,
+ backgroundColor: Color(0xff181920),
+ child: Icon(
+ Icons.person,
+ color: Colors.white,
+ size: 45,
+ ));
+ }
+ return CircleAvatar(
+ radius: 45,
+ backgroundColor: const Color(0xff181920),
+ backgroundImage: snapshot.data!
+ .data()!['ProfilePicture'] ==
+ null
+ ? null
+ : NetworkImage(snapshot.data!
+ .data()!['ProfilePicture']),
+ child: snapshot.data!
+ .data()!['ProfilePicture'] ==
+ null
+ ? const Icon(
+ Icons.person,
+ color: Colors.white,
+ size: 45,
+ )
+ : null,
+ );
+ }),
+ Positioned(
+ bottom: 1.5,
+ right: 0.5,
+ child: GestureDetector(
+ onTap: () =>
+ ProfileModel.setProfilePicture(context),
+ child: const CircleAvatar(
+ radius: 15,
+ backgroundColor: orangeColor,
+ child: Icon(
+ Icons.edit,
+ color: Colors.white,
+ size: 17,
+ ),
+ ),
+ ),
+ ),
+ ],
+ ),
+ const SizedBox(height: 10),
+ Text('${snapshot.data!.data()!['UserName']}',
+ style: kTextStyleHeaders),
+ Text(
+ '${FirebaseAuth.instance.currentUser!.email}',
+ style: kTextStyleLarge.copyWith(
+ color: Colors.grey, fontWeight: FontWeight.w400),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+ },
+ );
+ }
+}
diff --git a/lib/features/profile/widgets/profile_list.dart b/lib/features/profile/widgets/profile_list.dart
new file mode 100644
index 0000000..1c637e0
--- /dev/null
+++ b/lib/features/profile/widgets/profile_list.dart
@@ -0,0 +1,90 @@
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:fitpad/features/profile/widgets/profile_tile.dart';
+import 'package:flutter/material.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+import '../../../main.dart';
+import '../../feedback/screens/feedback_screen.dart';
+import '../../reset_password/screens/reset_password_screen.dart';
+
+class ProfileList extends StatelessWidget {
+ const ProfileList({Key? key}) : super(key: key);
+ urlLaunch(Uri url) async {
+ try {
+ if (!await launchUrl(url, mode: LaunchMode.inAppWebView)) {
+ print('could not reach');
+ }
+ } catch (e) {
+ print(e);
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ children: [
+ Expanded(child: Container()),
+ Expanded(
+ flex: 3,
+ child: Container(
+ color: const Color(0xff2F3541),
+ child: Padding(
+ padding: const EdgeInsets.only(bottom: 30),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.end,
+ children: [
+ ProfileTile(
+ icon: Icons.lock_reset,
+ text: 'Change Password',
+ onTap: () => Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const ResetPasswordScreen(),
+ ))),
+ ProfileTile(
+ icon: Icons.safety_check,
+ text: 'Terms and Conditions',
+ onTap: () {
+ Uri url = Uri.parse(
+ 'https://pages.flycricket.io/fitpad/terms.html');
+ urlLaunch(url);
+ },
+ ),
+ ProfileTile(
+ icon: Icons.privacy_tip,
+ text: 'Privacy Policy',
+ onTap: () {
+ Uri url = Uri.parse(
+ 'https://pages.flycricket.io/fitpad/privacy.html');
+ urlLaunch(url);
+ },
+ ),
+ ProfileTile(
+ icon: Icons.feedback,
+ text: 'Feedback',
+ onTap: () => Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const FeedbackScreen(),
+ ))),
+ ProfileTile(
+ icon: Icons.logout,
+ text: 'Sign Out',
+ onTap: () {
+ FirebaseAuth.instance.signOut();
+ Navigator.pushReplacement(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const MainPage(),
+ ));
+ },
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/features/profile/widgets/profile_tile.dart b/lib/features/profile/widgets/profile_tile.dart
new file mode 100644
index 0000000..f6d7906
--- /dev/null
+++ b/lib/features/profile/widgets/profile_tile.dart
@@ -0,0 +1,30 @@
+import 'package:flutter/material.dart';
+
+import '../../../shared/utils/constants.dart';
+class ProfileTile extends StatelessWidget {
+ const ProfileTile(
+ {Key? key, required this.icon, required this.text, required this.onTap})
+ : super(key: key);
+ final IconData icon;
+ final String text;
+ final Function() onTap;
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: const EdgeInsets.all(10.0),
+ child: ListTile(
+ leading: CircleAvatar(
+ backgroundColor: const Color(0xff282E38),
+ child: Icon(icon, color: Colors.grey, size: 25)),
+ title: Text(
+ text,
+ style: kTextStyleLarge,
+ ),
+ trailing: const Icon(Icons.arrow_forward, color: Colors.white),
+ onTap: onTap,
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
+ ),
+ );
+ }
+}
+
diff --git a/lib/features/qrcode/models/calculator_model.dart b/lib/features/qrcode/models/calculator_model.dart
new file mode 100644
index 0000000..6e6419a
--- /dev/null
+++ b/lib/features/qrcode/models/calculator_model.dart
@@ -0,0 +1,44 @@
+class CalTile {
+ const CalTile({required this.title, required this.leading});
+ final String leading;
+ final String title;
+ static const List getCalData = [
+ CalTile(title: 'Body Mass Index', leading: 'BMI'),
+ CalTile(title: 'Basal Metabolic Rate', leading: 'BMR'),
+ CalTile(title: 'Body Fat Percentage', leading: 'BFP'),
+ CalTile(title: 'Ideal Body Weight', leading: 'IBW'),
+ CalTile(title: 'Waist-Hip ratio', leading: 'WHR'),
+ CalTile(title: 'A Body Shape Index', leading: 'ABSI'),
+ ];
+}
+
+class CalResult {
+ final String description;
+ const CalResult({required this.description});
+ static const List getCalResult = [
+ CalResult(
+ description:
+ 'If your BMI is less than 18.5, it falls within the underweight range. If your BMI is 18.5 to 24.9, it falls within the Healthy Weight range. If your BMI is 25.0 to 29.9, it falls within the overweight range. If your BMI is 30.0 or higher, it falls within the obese range.',
+ ),
+ CalResult(
+ description:
+ "Your BMR score is a number which refers to how many calories you burn at rest. Most people's BMR is between 1000 – 2000. This means that they need to take in between 1000 – 2000 calories each day to fuel their basic functions while in a resting state.",
+ ),
+ CalResult(
+ description:
+ "However, generally 14-17% BFP is a fit, and healthy range, although 18-25% is considered acceptable. Male athletes, depending on the sport, usually have between 6 and 13% BFP.",
+ ),
+ CalResult(
+ description:
+ "Males: IBW = 50 kg + 2.3 kg for each inch over 5 feet. Females: IBW = 45.5 kg + 2.3 kg for each inch over 5 feet.",
+ ),
+ CalResult(
+ description:
+ "Men should have a waist to hip ratio slightly under a 1.0 - a . 99 according to this study. Women should have a waist to hip ratio under 1.0 - a . 90 or lower.",
+ ),
+ CalResult(
+ description:
+ "A normal range for BSI has not been established, as it is a relatively new measure and research on its clinical significance is ongoing. However, some studies suggest that a BSI of less than 0.077 is associated with a lower risk of cardiometabolic disease in both men and women. It's important to note that the BSI is just one of many measures of body composition and health, and should be considered in the context of an individual's overall health profile.",
+ )
+ ];
+}
diff --git a/lib/features/qrcode/screens/calculators_screen.dart b/lib/features/qrcode/screens/calculators_screen.dart
new file mode 100644
index 0000000..c3b4ce7
--- /dev/null
+++ b/lib/features/qrcode/screens/calculators_screen.dart
@@ -0,0 +1,73 @@
+import 'package:fitpad/features/qrcode/models/calculator_model.dart';
+import 'package:fitpad/features/qrcode/widgets/calculator.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+
+class CalculatorsScreen extends StatelessWidget {
+ const CalculatorsScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+
+ title: const Text(
+ 'Calculators',
+ style: kTextStyleHeaders,
+ ),
+ ),
+ body: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ SizedBox(
+ height: 500,
+ child: Padding(
+ padding: const EdgeInsets.only(bottom: 16, right: 16, left: 16),
+ child: ListView.builder(
+ itemBuilder: (context, index) {
+ return Tile(index: index, context: context);
+ },
+ itemCount: CalTile.getCalData.length,
+ physics: const NeverScrollableScrollPhysics(),
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
+
+class Tile extends StatelessWidget {
+ const Tile({Key? key, required this.index, required this.context})
+ : super(key: key);
+ final int index;
+ final BuildContext context;
+ @override
+ Widget build(BuildContext context) {
+ return Card(
+ elevation: 3,
+ shadowColor: Colors.grey,
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
+ child: ListTile(
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
+ leading: Text(
+ CalTile.getCalData[index].leading,
+ style: kTextStyleHeaders.copyWith(color: blueColor),
+ ),
+ title: Text(
+ CalTile.getCalData[index].title,
+ style: kTextStyleLarge.copyWith(color: Colors.black, fontSize: 20),
+ ),
+ onTap: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) =>
+ Calculator(name: CalTile.getCalData[index].leading)));
+ },
+ ),
+ );
+ }
+}
diff --git a/lib/features/qrcode/widgets/calculator.dart b/lib/features/qrcode/widgets/calculator.dart
new file mode 100644
index 0000000..8b9af46
--- /dev/null
+++ b/lib/features/qrcode/widgets/calculator.dart
@@ -0,0 +1,406 @@
+import 'package:fitpad/features/qrcode/widgets/gender_card.dart';
+import 'package:fitpad/features/qrcode/widgets/result_sheet.dart';
+import 'package:fitpad/features/qrcode/widgets/value_card.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:fitpad/shared/widgets/custom_button.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:vertical_weight_slider/vertical_weight_slider.dart';
+
+class Calculator extends StatefulWidget {
+ const Calculator({super.key, this.name});
+ final String? name;
+
+ @override
+ State createState() => _CalculatorState();
+}
+
+class _CalculatorState extends State {
+ late WeightSliderController _controller;
+ int screenState = 0;
+
+ double index = 0;
+ double height = 130;
+ int weight = 30;
+ int age = 0;
+ int waist = 0;
+ int hip = 0;
+ int value1 = 0;
+ int value2 = 0;
+ int value3 = 0;
+ int value4 = 0;
+ String? title1;
+ String? title2;
+ String? title3;
+ String? title4;
+ int flag = 0;
+ void setScreenState() {
+ if (widget.name == 'ABSI') {
+ setState(() {
+ screenState = 1;
+ });
+ } else {
+ screenState = 0;
+ }
+ }
+
+ void getValue() {
+ if (widget.name == 'BMI' ||
+ widget.name == 'BMR' ||
+ widget.name == 'BFP' ||
+ widget.name == 'IBW') {
+ value1 = weight;
+ value2 = age;
+ title1 = 'Weight';
+ title2 = 'Age';
+ } else if (widget.name == 'WHR') {
+ value1 = hip;
+ value2 = waist;
+ title1 = 'Hip';
+ title2 = 'Waist';
+ } else if (widget.name == 'ABSI') {
+ value1 = weight;
+ value2 = age;
+ title1 = 'Weight';
+ title2 = 'Age';
+ value3 = hip;
+ value4 = waist;
+ title3 = 'Hip';
+ title4 = 'Waist';
+ }
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ setScreenState();
+ _controller = WeightSliderController(
+ initialWeight: height, minWeight: 120, interval: 0.1);
+ getValue();
+ }
+
+ @override
+ void dispose() {
+ _controller.dispose();
+ super.dispose();
+ }
+
+ Color maleInactiveColor = const Color(0xFF2B3C4F);
+ Color femaleInactiveColor = const Color(0xFFE54C3C);
+ Color maleActiveColor = Colors.blue;
+ Color femaleActiveColor = const Color(0xFFFF4181);
+ Color maleCardColor = const Color(0xFF2B3C4F);
+ Color femaleCardColor = const Color(0xFFE54C3C);
+
+ @override
+ Widget build(BuildContext context) {
+ return SafeArea(
+ child: Scaffold(
+ appBar: AppBar(
+ title: Text(
+ '${widget.name.toString()}' ' Calculator',
+ style: kTextStyleHeaders,
+ ),
+ actions: [
+ IconButton(
+ onPressed: () {
+ setState(() {
+ height = 130;
+ value1 = 30;
+ value2 = 0;
+ maleCardColor = maleInactiveColor;
+ femaleCardColor = femaleInactiveColor;
+ });
+ },
+ icon: const Icon(Icons.refresh))
+ ],
+ ),
+ body: SingleChildScrollView(
+ physics: screenState == 0
+ ? const NeverScrollableScrollPhysics()
+ : null,
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Column(
+ children: [
+ screenState == 1
+ ? const SizedBox(height: 10)
+ : const SizedBox(height: 30),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ GenderCard(
+ onTap: () {
+ setState(() {
+ flag = 1;
+ if (maleCardColor == maleInactiveColor) {
+ maleCardColor = maleActiveColor;
+ femaleCardColor = femaleInactiveColor;
+ } else {
+ maleCardColor = maleInactiveColor;
+ }
+ });
+ },
+ text: 'Male',
+ icon: const Icon(
+ FontAwesomeIcons.mars,
+ color: Colors.white,
+ ),
+ inactiveColor: maleCardColor,
+ ),
+ GenderCard(
+ onTap: () {
+ setState(() {
+ flag = 2;
+ if (femaleCardColor == femaleInactiveColor) {
+ femaleCardColor = femaleActiveColor;
+ maleCardColor = maleInactiveColor;
+ } else {
+ femaleCardColor = femaleInactiveColor;
+ }
+ });
+ },
+ text: 'Female',
+ icon: const Icon(
+ FontAwesomeIcons.venus,
+ color: Colors.white,
+ ),
+ inactiveColor: femaleCardColor,
+ ),
+ ],
+ ),
+ StaggeredGrid.count(
+ crossAxisCount: 4,
+ mainAxisSpacing: 4,
+ crossAxisSpacing: 4,
+ children: screenState == 1
+ ? [
+ StaggeredGridTile.count(
+ crossAxisCellCount: 2,
+ mainAxisCellCount: 4,
+ child: Card(
+ margin: const EdgeInsets.all(10),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(
+ 'Height',
+ style: kTextStyleLarge.copyWith(
+ color: Colors.black),
+ ),
+ Text(
+ "$height cm",
+ style: kTextStyleHeaders.copyWith(
+ color: Colors.black, fontSize: 30),
+ ),
+ VerticalWeightSlider(
+ controller: _controller,
+ decoration: const PointerDecoration(
+ width: 100.0,
+ height: 3.0,
+ largeColor: Color(0xFF898989),
+ mediumColor: Color(0xFFC5C5C5),
+ smallColor: Color(0xFFF0F0F0),
+ gap: 30.0,
+ ),
+ onChanged: (double value) {
+ setState(() {
+ height = value;
+ });
+ },
+ indicator: Container(
+ height: 3.0,
+ width: 130.0,
+ alignment: Alignment.centerLeft,
+ color: Colors.red[300],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ StaggeredGridTile.count(
+ crossAxisCellCount: 2,
+ mainAxisCellCount: 2,
+ child: ValueCard(
+ value: value1,
+ title: title1,
+ onPressedSub: () {
+ setState(() {
+ value1--;
+ });
+ },
+ onPressedAdd: () {
+ setState(() {
+ value1++;
+ });
+ },
+ )),
+ StaggeredGridTile.count(
+ crossAxisCellCount: 2,
+ mainAxisCellCount: 2,
+ child: ValueCard(
+ title: title2,
+ onPressedAdd: () {
+ setState(() {
+ value2++;
+ });
+ },
+ onPressedSub: () {
+ setState(() {
+ value2--;
+ });
+ },
+ value: value2,
+ ),
+ ),
+ StaggeredGridTile.count(
+ crossAxisCellCount: 2,
+ mainAxisCellCount: 2,
+ child: ValueCard(
+ title: title3,
+ onPressedAdd: () {
+ setState(() {
+ value3++;
+ });
+ },
+ onPressedSub: () {
+ setState(() {
+ value3--;
+ });
+ },
+ value: value3),
+ ),
+ StaggeredGridTile.count(
+ crossAxisCellCount: 2,
+ mainAxisCellCount: 2,
+ child: ValueCard(
+ onPressedSub: () {
+ setState(() {
+ value4--;
+ });
+ },
+ onPressedAdd: () {
+ setState(() {
+ value4++;
+ });
+ },
+ title: title4,
+ value: value4,
+ ),
+ ),
+ ]
+ : [
+ StaggeredGridTile.count(
+ crossAxisCellCount: 2,
+ mainAxisCellCount: 4,
+ child: Card(
+ margin: const EdgeInsets.all(10),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(
+ 'Height',
+ style: kTextStyleLarge.copyWith(
+ color: Colors.black),
+ ),
+ Text(
+ "$height cm",
+ style: kTextStyleHeaders.copyWith(
+ color: Colors.black, fontSize: 30),
+ ),
+ VerticalWeightSlider(
+ controller: _controller,
+ decoration: const PointerDecoration(
+ width: 100.0,
+ height: 3.0,
+ largeColor: Color(0xFF898989),
+ mediumColor: Color(0xFFC5C5C5),
+ smallColor: Color(0xFFF0F0F0),
+ gap: 30.0,
+ ),
+ onChanged: (double value) {
+ setState(() {
+ height = value;
+ });
+ },
+ indicator: Container(
+ height: 3.0,
+ width: 130.0,
+ alignment: Alignment.centerLeft,
+ color: Colors.red[300],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ StaggeredGridTile.count(
+ crossAxisCellCount: 2,
+ mainAxisCellCount: 2,
+ child: ValueCard(
+ value: value1,
+ title: title1,
+ onPressedSub: () {
+ setState(() {
+ value1--;
+ });
+ },
+ onPressedAdd: () {
+ setState(() {
+ value1++;
+ });
+ },
+ )),
+ StaggeredGridTile.count(
+ crossAxisCellCount: 2,
+ mainAxisCellCount: 2,
+ child: ValueCard(
+ title: title2,
+ onPressedAdd: () {
+ setState(() {
+ value2++;
+ });
+ },
+ onPressedSub: () {
+ setState(() {
+ value2--;
+ });
+ },
+ value: value2,
+ ),
+ ),
+ ],
+ ),
+ Padding(
+ padding: const EdgeInsets.all(10.0),
+ child: CustomButton(
+ text: 'Calculate',
+ onPressed: () {
+ showModalBottomSheet(
+ elevation: 5,
+ shape: const RoundedRectangleBorder(
+ borderRadius: BorderRadius.only(
+ topRight: Radius.circular(20),
+ topLeft: Radius.circular(20))),
+ backgroundColor: blueColor,
+ context: context,
+ builder: (context) => ResultSheet(
+ height: height,
+ weight: value1,
+ name: widget.name,
+ flag: flag,
+ age: value2,
+ hip: hip,
+ waist: waist,
+ ),
+ );
+ },
+ ))
+ ],
+ ),
+ ),
+ )));
+ }
+}
diff --git a/lib/features/qrcode/widgets/gender_card.dart b/lib/features/qrcode/widgets/gender_card.dart
new file mode 100644
index 0000000..6edbf9b
--- /dev/null
+++ b/lib/features/qrcode/widgets/gender_card.dart
@@ -0,0 +1,46 @@
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+
+class GenderCard extends StatelessWidget {
+ const GenderCard({
+ super.key,
+ required this.text,
+ required this.icon,
+ required this.inactiveColor,
+ required this.onTap,
+ });
+ final String text;
+ final Icon icon;
+ final Color inactiveColor;
+ final Function() onTap;
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: const EdgeInsets.all(8.0),
+ child: InkWell(
+ borderRadius: BorderRadius.circular(10),
+ onTap: onTap,
+ child: Ink(
+ decoration: kContainerDecoration.copyWith(color: inactiveColor),
+ width: 160,
+ height: 90,
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ icon,
+ Text(
+ text,
+ style: kTextStyleLarge.copyWith(
+ color: Colors.white, fontSize: 22),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/qrcode/widgets/result_sheet.dart b/lib/features/qrcode/widgets/result_sheet.dart
new file mode 100644
index 0000000..28fdf03
--- /dev/null
+++ b/lib/features/qrcode/widgets/result_sheet.dart
@@ -0,0 +1,96 @@
+import 'dart:math';
+import 'package:fitpad/features/qrcode/models/calculator_model.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+
+class ResultSheet extends StatelessWidget {
+ ResultSheet(
+ {super.key,
+ this.height,
+ this.weight,
+ this.name,
+ required this.flag,
+ this.age,
+ this.hip,
+ this.waist});
+ double? height = 0;
+ int? weight = 0;
+ int? age = 0;
+ double sum = 0;
+ String report = 'Normal';
+ int? hip = 0;
+ int? waist = 0;
+ String? name;
+ int flag = 0;
+ void result() {
+ if (name == 'BMI') {
+ sum = weight! / pow(height! / 100, 2);
+ } else if (name == 'BMR' && flag == 1) {
+ sum = 66 + (13.7 * weight!) + (5 * height!) - (6.8 * age!);
+ } else if (name == 'BMR' && flag == 2) {
+ sum = 655 + (9.6 * weight!) + (1.8 * height!) - (4.7 * age!);
+ } else if (name == 'BFP' && flag == 1) {
+ sum = (1.2 * (weight! / pow(height! / 100, 2))) +
+ (0.23 * age!) -
+ (10.8 * 1) -
+ 0.54;
+ } else if (name == 'BFP' && flag == 2) {
+ sum = (1.2 * (weight! / pow(height! / 100, 2))) +
+ (0.23 * age!) -
+ (10.8 * 0) -
+ 0.54;
+ } else if (name == 'IBW' && flag == 1) {
+ sum = 50 + ((0.91 * height!) - 152.4);
+ } else if (name == 'IBW' && flag == 2) {
+ sum = 45.5 + ((0.91 * height!) - 152.4);
+ } else if (name == 'WHR') {
+ sum = age! / weight!;
+ } else if (name == 'ABSI') {
+ sum = waist! /
+ pow((weight! / pow(height! / 100, 2)), 0.6) *
+ pow(height!, 0.5);
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ result();
+ return Padding(
+ padding: const EdgeInsets.all(20.0),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Text(
+ 'Your $name is',
+ style: kTextStyleSmall,
+ ),
+ const SizedBox(height: 10),
+ Text(
+ sum.toStringAsFixed(1),
+ style: kTextStyleHeadings,
+ ),
+ const SizedBox(height: 10),
+ Text(
+ name == 'BMI'
+ ? CalResult.getCalResult[0].description
+ : name == 'BMR'
+ ? CalResult.getCalResult[1].description
+ : name == 'BFP'
+ ? CalResult.getCalResult[2].description
+ : name == "IBW"
+ ? CalResult.getCalResult[3].description
+ : name == "WHR"
+ ? CalResult.getCalResult[4].description
+ : name == "ABSI"
+ ? CalResult.getCalResult[5].description
+ : '',
+ style: kTextStyleSmall,
+ textAlign: TextAlign.center,
+ )
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/features/qrcode/widgets/value_card.dart b/lib/features/qrcode/widgets/value_card.dart
new file mode 100644
index 0000000..028dae2
--- /dev/null
+++ b/lib/features/qrcode/widgets/value_card.dart
@@ -0,0 +1,54 @@
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+
+class ValueCard extends StatelessWidget {
+ const ValueCard(
+ {super.key,
+ this.value,
+ this.title,
+ this.onPressedAdd,
+ this.onPressedSub});
+ final String? title;
+ final int? value;
+ final Function()? onPressedAdd;
+ final Function()? onPressedSub;
+ @override
+ Widget build(BuildContext context) {
+ return Card(
+ margin: const EdgeInsets.all(10),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(title.toString(),
+ style: kTextStyleLarge.copyWith(color: Colors.black)),
+ Text('$value',
+ style: kTextStyleHeadings.copyWith(
+ color: Colors.black,
+ fontWeight: FontWeight.w400,
+ fontSize: 50)),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ children: [
+ GestureDetector(
+ onTap: onPressedAdd,
+ child: const Icon(
+ Icons.add_circle,
+ color: orangeColor,
+ size: 40,
+ ),
+ ),
+ GestureDetector(
+ onTap: onPressedSub,
+ child: const Icon(
+ Icons.remove_circle,
+ color: orangeColor,
+ size: 40,
+ ),
+ ),
+ ],
+ )
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/features/refer/models/difficulty_model.dart b/lib/features/refer/models/difficulty_model.dart
new file mode 100644
index 0000000..5ae532b
--- /dev/null
+++ b/lib/features/refer/models/difficulty_model.dart
@@ -0,0 +1,10 @@
+class DifficultyModel {
+ final String level;
+ final double rating;
+ const DifficultyModel({required this.level, required this.rating});
+ static const List getDifficultyData = [
+ DifficultyModel(level: 'BEGINNER', rating: 2),
+ DifficultyModel(level: 'INTERMEDIATE', rating: 3.5),
+ DifficultyModel(level: 'EXPERT', rating: 5),
+ ];
+}
diff --git a/lib/features/refer/models/gym_model.dart b/lib/features/refer/models/gym_model.dart
new file mode 100644
index 0000000..786570b
--- /dev/null
+++ b/lib/features/refer/models/gym_model.dart
@@ -0,0 +1,79 @@
+import 'difficulty_model.dart';
+import 'muscles_model.dart';
+
+class GymModel {
+ static String? muscles;
+ static String? difficulty;
+
+ static void beginner(String muscle, String level) {
+ if (muscle == MusclesModel.getMusclesData[0].name &&
+ level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'biceps';
+ difficulty = 'beginner';
+ } else if (muscle == MusclesModel.getMusclesData[1].name &&
+ level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'forearms';
+ difficulty = 'beginner';
+ } else if (muscle == MusclesModel.getMusclesData[2].name &&
+ level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'chest';
+ difficulty = 'beginner';
+ } else if (muscle == MusclesModel.getMusclesData[3].name &&
+ level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'abdominals';
+ difficulty = 'beginner';
+ } else if (muscle == MusclesModel.getMusclesData[4].name &&
+ level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'hamstrings';
+ difficulty = 'beginner';
+ } else if (muscle == MusclesModel.getMusclesData[5].name &&
+ level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'lats';
+ difficulty = 'beginner';
+ } else if (muscle == MusclesModel.getMusclesData[6].name &&
+ level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'traps';
+ difficulty = 'beginner';
+ } else if (muscle == MusclesModel.getMusclesData[7].name &&
+ level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'triceps';
+ difficulty = 'beginner';
+ }
+ }
+
+ static void intermediate(String muscle, String level) {
+ if (muscle == MusclesModel.getMusclesData[0].name &&
+ level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'biceps';
+ difficulty = 'intermediate';
+ } else if (muscle == MusclesModel.getMusclesData[1].name &&
+ level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'forearms';
+ difficulty = 'intermediate';
+ } else if (muscle == MusclesModel.getMusclesData[2].name &&
+ level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'chest';
+ difficulty = 'intermediate';
+ } else if (muscle == MusclesModel.getMusclesData[3].name &&
+ level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'abdominals';
+ difficulty = 'intermediate';
+ } else if (muscle == MusclesModel.getMusclesData[4].name &&
+ level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'hamstrings';
+ difficulty = 'intermediate';
+ } else if (muscle == MusclesModel.getMusclesData[5].name &&
+ level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'lats';
+ difficulty = 'intermediate';
+ } else if (muscle == MusclesModel.getMusclesData[6].name &&
+ level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'traps';
+ difficulty = 'intermediate';
+ } else if (muscle == MusclesModel.getMusclesData[7].name &&
+ level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'triceps';
+ difficulty = 'intermediate';
+ }
+ }
+}
diff --git a/lib/features/refer/models/muscles_model.dart b/lib/features/refer/models/muscles_model.dart
new file mode 100644
index 0000000..a03024c
--- /dev/null
+++ b/lib/features/refer/models/muscles_model.dart
@@ -0,0 +1,14 @@
+class MusclesModel {
+ final String name;
+ const MusclesModel({required this.name});
+ static const List getMusclesData = [
+ MusclesModel(name: 'BICEPS'),
+ MusclesModel(name: 'FOREARMS'),
+ MusclesModel(name: 'CHEST'),
+ MusclesModel(name: 'ABS'),
+ MusclesModel(name: 'LEGS'),
+ MusclesModel(name: 'BACK'),
+ MusclesModel(name: 'SHOULDERS'),
+ MusclesModel(name: 'TRICEPS'),
+ ];
+}
diff --git a/lib/features/refer/screens/coupon.dart b/lib/features/refer/screens/coupon.dart
new file mode 100644
index 0000000..2e73121
--- /dev/null
+++ b/lib/features/refer/screens/coupon.dart
@@ -0,0 +1,43 @@
+import 'package:fitpad/features/refer/models/muscles_model.dart';
+import 'package:fitpad/features/refer/screens/difficulty_screen.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+import '../widgets/gym_tile.dart';
+
+class GymScreen extends StatelessWidget {
+ const GymScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text(
+ 'Gym',
+ style: kTextStyleHeaders,
+ ),
+ ),
+ body: Padding(
+ padding:
+ const EdgeInsets.only(left: 35, right: 35, bottom: 20, top: 28),
+ child: GridView.builder(
+ gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
+ crossAxisCount: 2),
+ itemBuilder: (context, index) {
+ return GymTile(
+ index: index,
+ onTap: () => Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => DifficultyScreen(
+ muscle: MusclesModel.getMusclesData[index].name),
+ ),
+ ),
+ );
+ },
+ scrollDirection: Axis.vertical,
+ itemCount: MusclesModel.getMusclesData.length,
+ physics: const NeverScrollableScrollPhysics(),
+ ),
+ ));
+ }
+}
diff --git a/lib/features/refer/screens/difficulty_screen.dart b/lib/features/refer/screens/difficulty_screen.dart
new file mode 100644
index 0000000..f0c3824
--- /dev/null
+++ b/lib/features/refer/screens/difficulty_screen.dart
@@ -0,0 +1,47 @@
+import 'package:flutter/material.dart';
+import '../../../shared/utils/constants.dart';
+import '../models/difficulty_model.dart';
+import '../widgets/difficulty_tile.dart';
+import 'list_screen.dart';
+
+class DifficultyScreen extends StatelessWidget {
+ const DifficultyScreen({Key? key, required this.muscle}) : super(key: key);
+ final String muscle;
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text(
+ muscle.toString(),
+ style: kTextStyleHeaders,
+ ),
+ ),
+ body: Center(
+ child: Padding(
+ padding: const EdgeInsets.only(left: 16, right: 16, top: 16),
+ child: ListView.builder(
+ itemBuilder: (context, index) {
+ return Padding(
+ padding: const EdgeInsets.symmetric(vertical: 5.0),
+ child: DifficultyTile(
+ index: index,
+ onTap: () => Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => ListScreen(
+ level: DifficultyModel.getDifficultyData[index].level,
+ muscle: muscle),
+ ),
+ ),
+ ),
+ );
+ },
+ itemCount: 3,
+ physics: const NeverScrollableScrollPhysics(),
+ scrollDirection: Axis.vertical,
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/refer/screens/list_screen.dart b/lib/features/refer/screens/list_screen.dart
new file mode 100644
index 0000000..4bf73f8
--- /dev/null
+++ b/lib/features/refer/screens/list_screen.dart
@@ -0,0 +1,105 @@
+import 'dart:convert';
+
+import 'package:fitpad/features/refer/models/difficulty_model.dart';
+import 'package:fitpad/features/refer/screens/work_screen.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+import 'package:http/http.dart';
+import '../models/gym_model.dart';
+
+class ListScreen extends StatefulWidget {
+ const ListScreen({super.key, required this.muscle, required this.level});
+ final String muscle;
+ final String level;
+
+ @override
+ State createState() => _ListScreenState();
+}
+
+class _ListScreenState extends State {
+ List decodeData = [];
+ Future getWorkout() async {
+ var url =
+ "https://exercises-by-api-ninjas.p.rapidapi.com/v1/exercises?${'muscle'}=${GymModel.muscles}&difficulty=${GymModel.difficulty}";
+ final headers = {
+ 'X-RapidAPI-Key': "8963005d09msh043f84b9a7c9cd8p1761dejsn83d9562938be",
+ 'X-RapidAPI-Host': "exercises-by-api-ninjas.p.rapidapi.com",
+ };
+ Response response = await get(Uri.parse(url), headers: headers);
+
+ if (response.statusCode == 200) {
+ setState(() => decodeData = json.decode(response.body));
+ } else {
+ print(response.statusCode);
+ }
+ }
+
+ @override
+ void initState() {
+ GymModel.beginner(widget.muscle, widget.level);
+ GymModel.intermediate(widget.muscle, widget.level);
+ getWorkout();
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text(
+ 'Exercises',
+ style: kTextStyleHeaders,
+ ),
+ ),
+ body: decodeData.isEmpty
+ ? const Center(
+ child: CircularProgressIndicator(
+ color: blueColor,
+ ),
+ )
+ : widget.level == DifficultyModel.getDifficultyData[2].level
+ ? const Center(
+ child: Text('No Data', style: kTextStyleHeadings),
+ )
+ : Padding(
+ padding: const EdgeInsets.only(left: 8, right: 8, top: 8),
+ child: ListView.builder(
+ itemBuilder: (context, index) {
+ return Padding(
+ padding:
+ const EdgeInsets.only(top: 5, left: 5, right: 5),
+ child: Card(
+ elevation: 3,
+ shadowColor: Colors.grey,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(10)),
+ child: ListTile(
+ leading: const Image(
+ image: AssetImage('images/mainIcon.png'),
+ height: 40,
+ width: 40,
+ ),
+ title: Text(decodeData[index]['name'],
+ style: kTextStyleLarge.copyWith(
+ color: Colors.black)),
+ onTap: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => WorkoutScreen(
+ muscle: widget.muscle,
+ level: widget.level,
+ name: decodeData[index]['name'],
+ ),
+ ));
+ },
+ ),
+ ),
+ );
+ },
+ itemCount: decodeData.length,
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/refer/screens/work_screen.dart b/lib/features/refer/screens/work_screen.dart
new file mode 100644
index 0000000..8457ba3
--- /dev/null
+++ b/lib/features/refer/screens/work_screen.dart
@@ -0,0 +1,213 @@
+import 'package:fitpad/features/refer/models/difficulty_model.dart';
+import 'package:fitpad/features/refer/models/muscles_model.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+import 'dart:convert';
+import 'package:http/http.dart';
+
+class WorkoutScreen extends StatefulWidget {
+ const WorkoutScreen(
+ {super.key, this.muscle, this.level, this.name, this.crossfit});
+ final String? muscle;
+ final String? level;
+ final String? name;
+ final String? crossfit;
+ @override
+ State createState() => _WorkoutScreenState();
+}
+
+class _WorkoutScreenState extends State {
+ late final String muscles;
+ late final String difficulty;
+ late final String type;
+
+ void beginner() {
+ if (widget.muscle == MusclesModel.getMusclesData[0].name &&
+ widget.level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'biceps';
+ difficulty = 'beginner';
+ } else if (widget.muscle == MusclesModel.getMusclesData[1].name &&
+ widget.level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'forearms';
+ difficulty = 'beginner';
+ } else if (widget.muscle == MusclesModel.getMusclesData[2].name &&
+ widget.level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'chest';
+ difficulty = 'beginner';
+ } else if (widget.muscle == MusclesModel.getMusclesData[3].name &&
+ widget.level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'abdominals';
+ difficulty = 'beginner';
+ } else if (widget.muscle == MusclesModel.getMusclesData[4].name &&
+ widget.level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'hamstrings';
+ difficulty = 'beginner';
+ } else if (widget.muscle == MusclesModel.getMusclesData[5].name &&
+ widget.level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'lats';
+ difficulty = 'beginner';
+ } else if (widget.muscle == MusclesModel.getMusclesData[6].name &&
+ widget.level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'traps';
+ difficulty = 'beginner';
+ } else if (widget.muscle == MusclesModel.getMusclesData[7].name &&
+ widget.level == DifficultyModel.getDifficultyData[0].level) {
+ muscles = 'triceps';
+ difficulty = 'beginner';
+ }
+ }
+
+ void intermediate() {
+ if (widget.muscle == MusclesModel.getMusclesData[0].name &&
+ widget.level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'biceps';
+ difficulty = 'intermediate';
+ } else if (widget.muscle == MusclesModel.getMusclesData[1].name &&
+ widget.level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'forearms';
+ difficulty = 'intermediate';
+ } else if (widget.muscle == MusclesModel.getMusclesData[2].name &&
+ widget.level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'chest';
+ difficulty = 'intermediate';
+ } else if (widget.muscle == MusclesModel.getMusclesData[3].name &&
+ widget.level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'abdominals';
+ difficulty = 'intermediate';
+ } else if (widget.muscle == MusclesModel.getMusclesData[4].name &&
+ widget.level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'hamstrings';
+ difficulty = 'intermediate';
+ } else if (widget.muscle == MusclesModel.getMusclesData[5].name &&
+ widget.level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'lats';
+ difficulty = 'intermediate';
+ } else if (widget.muscle == MusclesModel.getMusclesData[6].name &&
+ widget.level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'traps';
+ difficulty = 'intermediate';
+ } else if (widget.muscle == MusclesModel.getMusclesData[7].name &&
+ widget.level == DifficultyModel.getDifficultyData[1].level) {
+ muscles = 'triceps';
+ difficulty = 'intermediate';
+ }
+ }
+
+ List decodeData = [];
+ String? naam;
+ String? equipment;
+ String? instructions;
+
+ Future getWorkout() async {
+ var url =
+ "https://exercises-by-api-ninjas.p.rapidapi.com/v1/exercises?${'muscle'}=$muscles&difficulty=$difficulty";
+ final headers = {
+ 'X-RapidAPI-Key': "8963005d09msh043f84b9a7c9cd8p1761dejsn83d9562938be",
+ 'X-RapidAPI-Host': "exercises-by-api-ninjas.p.rapidapi.com",
+ };
+ Response response = await get(Uri.parse(url), headers: headers);
+
+ if (response.statusCode == 200) {
+ setState(() {
+ decodeData = json.decode(response.body);
+ });
+ } else {
+ print(response.statusCode);
+ }
+ }
+
+ void workout() {
+ if (widget.name == decodeData[0]['name']) {
+ naam = decodeData[0]['name'];
+ equipment = decodeData[0]['equipment'];
+ instructions = decodeData[0]['instructions'];
+ } else if (widget.name == decodeData[1]['name']) {
+ naam = decodeData[1]['name'];
+ equipment = decodeData[1]['equipment'];
+ instructions = decodeData[1]['instructions'];
+ } else if (widget.name == decodeData[2]['name']) {
+ naam = decodeData[2]['name'];
+ equipment = decodeData[2]['equipment'];
+ instructions = decodeData[2]['instructions'];
+ } else if (widget.name == decodeData[3]['name']) {
+ naam = decodeData[3]['name'];
+ equipment = decodeData[3]['equipment'];
+ instructions = decodeData[3]['instructions'];
+ } else if (widget.name == decodeData[4]['name']) {
+ naam = decodeData[4]['name'];
+ equipment = decodeData[4]['equipment'];
+ instructions = decodeData[4]['instructions'];
+ } else if (widget.name == decodeData[5]['name']) {
+ naam = decodeData[5]['name'];
+ equipment = decodeData[5]['equipment'];
+ instructions = decodeData[5]['instructions'];
+ } else if (widget.name == decodeData[6]['name']) {
+ naam = decodeData[6]['name'];
+ equipment = decodeData[6]['equipment'];
+ instructions = decodeData[6]['instructions'];
+ } else if (widget.name == decodeData[7]['name']) {
+ naam = decodeData[7]['name'];
+ equipment = decodeData[7]['equipment'];
+ instructions = decodeData[7]['instructions'];
+ } else if (widget.name == decodeData[8]['name']) {
+ naam = decodeData[8]['name'];
+ equipment = decodeData[8]['equipment'];
+ instructions = decodeData[8]['instructions'];
+ } else if (widget.name == decodeData[9]['name']) {
+ naam = decodeData[9]['name'];
+ equipment = decodeData[9]['equipment'];
+ instructions = decodeData[9]['instructions'];
+ }
+ }
+
+ @override
+ void initState() {
+ beginner();
+ intermediate();
+ getWorkout();
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ try {
+ workout();
+ } catch (e) {
+ print(e);
+ }
+ return SafeArea(
+ child: Scaffold(
+ appBar: AppBar(
+ title: Text(widget.name.toString(), style: kTextStyleHeaders),
+ ),
+ body: naam == null
+ ? const Center(
+ child: CircularProgressIndicator(
+ color: blueColor,
+ ),
+ )
+ : SingleChildScrollView(
+ child: Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.end,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const Image(
+ image: AssetImage('images/mainIcon.png'),
+ height: 100,
+ width: 100,
+ color: Colors.white,
+ ),
+ Text(naam.toString(), style: kTextStyleHeaders),
+ Text('Equipment :- ' '${equipment.toString()}',
+ style: kTextStyleLarge),
+ const SizedBox(height: 20),
+ Text(instructions.toString(), style: kTextStyleSmall),
+ ],
+ ),
+ ),
+ ),
+ ));
+ }
+}
diff --git a/lib/features/refer/widgets/difficulty_tile.dart b/lib/features/refer/widgets/difficulty_tile.dart
new file mode 100644
index 0000000..4bb0c8e
--- /dev/null
+++ b/lib/features/refer/widgets/difficulty_tile.dart
@@ -0,0 +1,60 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_rating_bar/flutter_rating_bar.dart';
+
+import '../../../shared/utils/constants.dart';
+import '../models/difficulty_model.dart';
+
+class DifficultyTile extends StatelessWidget {
+ const DifficultyTile({Key? key, required this.onTap, required this.index})
+ : super(key: key);
+ final Function() onTap;
+ final int index;
+ @override
+ Widget build(BuildContext context) {
+ return Card(
+ elevation: 10,
+ color: Colors.transparent,
+ shadowColor: Colors.transparent,
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
+ child: InkWell(
+ borderRadius: BorderRadius.circular(10),
+ onTap: onTap,
+ child: Ink(
+ width: 300,
+ height: 200,
+ decoration: kContainerDecoration.copyWith(
+ image: DecorationImage(
+ image: AssetImage('images/d$index.jpg'), fit: BoxFit.cover)),
+ child: Padding(
+ padding: const EdgeInsets.all(14.0),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.end,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ RatingBar.builder(
+ itemCount: 5,
+ allowHalfRating: true,
+ itemSize: 30,
+ ignoreGestures: true,
+ unratedColor: Colors.white,
+ initialRating:
+ DifficultyModel.getDifficultyData[index].rating,
+ itemBuilder: (context, index) {
+ return const Icon(
+ Icons.star,
+ color: Color(0xFFE21414),
+ );
+ },
+ onRatingUpdate: (value) {},
+ ),
+ Text(DifficultyModel.getDifficultyData[index].level,
+ style: kTextStyleHeaders.copyWith(
+ color: Colors.white, fontSize: 20)),
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/refer/widgets/gym_tile.dart b/lib/features/refer/widgets/gym_tile.dart
new file mode 100644
index 0000000..ff1ce6c
--- /dev/null
+++ b/lib/features/refer/widgets/gym_tile.dart
@@ -0,0 +1,46 @@
+import 'package:flutter/material.dart';
+
+import '../../../shared/utils/constants.dart';
+import '../models/muscles_model.dart';
+
+class GymTile extends StatelessWidget {
+ const GymTile({
+ super.key,
+ required this.onTap,
+ required this.index,
+ });
+ final Function() onTap;
+ final int index;
+ @override
+ Widget build(BuildContext context) {
+ return Card(
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
+ shadowColor: Colors.transparent,
+ elevation: 10,
+ color: Colors.transparent,
+ child: InkWell(
+ onTap: onTap,
+ borderRadius: BorderRadius.circular(10),
+ child: Ink(
+ decoration: kContainerDecoration.copyWith(
+ image: DecorationImage(
+ image: AssetImage('images/ms$index.jpg'), fit: BoxFit.cover),
+
+ ),
+ child: Padding(
+ padding: const EdgeInsets.all(14.0),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.end,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(MusclesModel.getMusclesData[index].name,
+ style: kTextStyleHeaders.copyWith(
+ color: Colors.white, fontSize: 20))
+ ],
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/reset_password/screens/reset_password_screen.dart b/lib/features/reset_password/screens/reset_password_screen.dart
new file mode 100644
index 0000000..1fd9b1a
--- /dev/null
+++ b/lib/features/reset_password/screens/reset_password_screen.dart
@@ -0,0 +1,115 @@
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:fitpad/shared/widgets/custom_button.dart';
+import 'package:flutter/material.dart';
+import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
+
+class ResetPasswordScreen extends StatefulWidget {
+ const ResetPasswordScreen({super.key});
+
+ @override
+ State createState() => _ResetPasswordScreenState();
+}
+
+class _ResetPasswordScreenState extends State {
+ final formKey = GlobalKey();
+ bool showSpinner = false;
+ String? email;
+
+ Future resetPassword() async {
+ setState(() {
+ showSpinner = true;
+ });
+ try {
+ final reset = await FirebaseAuth.instance
+ .sendPasswordResetEmail(email: email!.trim());
+ setState(() {
+ showSpinner = false;
+ });
+ } on FirebaseAuthException catch (e) {
+ ScaffoldMessenger.of(context).showSnackBar(
+ SnackBar(
+ backgroundColor: blueColor,
+ elevation: 5,
+ duration: const Duration(seconds: 3),
+ content: Text(
+ e.message.toString(),
+ style: kTextStyleLarge,
+ ),
+ ),
+ );
+ setState(() {
+ showSpinner = false;
+ });
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ backgroundColor: Colors.transparent,
+ elevation: 0,
+ ),
+ body: ModalProgressHUD(
+ progressIndicator: const CircularProgressIndicator(
+ color: blueColor,
+ ),
+ inAsyncCall: showSpinner,
+ child: Center(
+ child: SingleChildScrollView(
+ reverse: true,
+ child: Form(
+ key: formKey,
+ child: Column(
+ children: [
+ const Text("Reset your Password", style: kTextStyleHeaders),
+ Text(
+ "Enter your mail reset password link will be sent to your email",
+ style: kTextStyleSmall.copyWith(
+ color: Colors.grey, fontSize: 15),
+ ),
+ const SizedBox(height: 50),
+ Padding(
+ padding: const EdgeInsets.only(
+ bottom: 15, left: 40, right: 40, top: 30),
+ child: TextFormField(
+ textCapitalization: TextCapitalization.words,
+ decoration: kTextFieldDecoration.copyWith(
+ hintText: "Email",
+ prefixIcon: const Icon(
+ Icons.mail,
+ color: Colors.white,
+ )),
+ onChanged: (value) {
+ setState(() {
+ email = value;
+ });
+ },
+ keyboardType: TextInputType.emailAddress,
+ textInputAction: TextInputAction.done,
+ validator: (value) {
+ if (value!.isEmpty) {
+ return "email is required";
+ }
+ },
+ ),
+ ),
+ const SizedBox(height: 50),
+ CustomButton(
+ text: 'Reset',
+ onPressed: () {
+ formKey.currentState?.validate();
+ email == null ? null : resetPassword();
+ Navigator.pop(context);
+ },
+ )
+ ],
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/features/toDoList/models/toDoList_model.dart b/lib/features/toDoList/models/toDoList_model.dart
new file mode 100644
index 0000000..2604a69
--- /dev/null
+++ b/lib/features/toDoList/models/toDoList_model.dart
@@ -0,0 +1,40 @@
+import 'package:flutter/material.dart';
+
+class Task {
+ Task({this.tasks, this.onChecked = false});
+ String? tasks;
+ bool onChecked;
+ void toggleDone() {
+ onChecked = !onChecked;
+ }
+}
+
+class TaskData extends ChangeNotifier {
+ List tasks = [];
+ String? profilePhoto;
+
+ void setProfilePhoto(String value) {
+ profilePhoto = value;
+ notifyListeners();
+ }
+
+ void addTasks(String newTask) {
+ final task = Task(tasks: newTask);
+ tasks.add(task);
+ notifyListeners();
+ }
+
+ int get tasksLength {
+ return tasks.length;
+ }
+
+ void updateTasks(Task task) {
+ task.toggleDone();
+ notifyListeners();
+ }
+
+ void deleteTasks(Task task) {
+ tasks.remove(task);
+ notifyListeners();
+ }
+}
diff --git a/lib/features/toDoList/screens/ToDolist_screen.dart b/lib/features/toDoList/screens/ToDolist_screen.dart
new file mode 100644
index 0000000..ce3ceec
--- /dev/null
+++ b/lib/features/toDoList/screens/ToDolist_screen.dart
@@ -0,0 +1,72 @@
+import 'package:fitpad/features/toDoList/widgets/add_task_dialog.dart';
+import 'package:fitpad/features/toDoList/widgets/task_list.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+
+import '../models/toDoList_model.dart';
+
+class ToDoListScreen extends StatelessWidget {
+ const ToDoListScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ backgroundColor: Colors.transparent,
+ elevation: 0,
+ ),
+ floatingActionButton: FloatingActionButton(
+ backgroundColor: blueColor,
+ onPressed: () => showDialog(
+ context: context,
+ builder: (context) => const AlertDialog(
+ content: AddTaskDialog(),
+ ),
+ ),
+ child: const Icon(Icons.add),
+ ),
+ body: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsets.only(left: 50, top: 20),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const CircleAvatar(
+ radius: 35,
+ backgroundColor: blueColor,
+ child:
+ Icon(Icons.fact_check, size: 35, color: Colors.white),
+ ),
+ const SizedBox(height: 20),
+ const Text(
+ 'Walkthrough',
+ style: kTextStyleHeaders,
+ ),
+ const SizedBox(height: 10),
+ Text(
+ '${Provider.of(context, listen: true).tasksLength} process left',
+ style:
+ kTextStyleLarge.copyWith(fontWeight: FontWeight.w400),
+ )
+ ],
+ ),
+ ),
+ ),
+ Expanded(
+ flex: 2,
+ child: Container(
+ decoration: const BoxDecoration(
+ color: Colors.white,
+ borderRadius:
+ BorderRadius.only(topLeft: Radius.circular(60))),
+ child: TaskList(),
+ ),
+ ),
+ ],
+ ));
+ }
+}
diff --git a/lib/features/toDoList/widgets/add_task_dialog.dart b/lib/features/toDoList/widgets/add_task_dialog.dart
new file mode 100644
index 0000000..aa7d0ea
--- /dev/null
+++ b/lib/features/toDoList/widgets/add_task_dialog.dart
@@ -0,0 +1,65 @@
+import 'package:cloud_firestore/cloud_firestore.dart';
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:fitpad/features/toDoList/models/toDoList_model.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:fitpad/shared/widgets/custom_button.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:uuid/uuid.dart';
+
+class AddTaskDialog extends StatefulWidget {
+ const AddTaskDialog({super.key});
+ static var taskId = const Uuid().v1();
+ @override
+ State createState() => _AddTaskDialogState();
+}
+
+class _AddTaskDialogState extends State {
+ String? task;
+ Task obj = Task();
+
+ final firebaseFirestore = FirebaseFirestore.instance
+ .collection('Tasks')
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .collection('Task');
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Text('New Task',
+ style: kTextStyleHeaders.copyWith(color: Colors.black)),
+ const SizedBox(height: 10),
+ Text('What will be your next steps ?',
+ style: kTextStyleSmall.copyWith(color: Colors.black)),
+ const SizedBox(height: 30),
+ SizedBox(
+ height: 30,
+ child: TextField(
+ textCapitalization: TextCapitalization.words,
+ style: kTextStyleSmall.copyWith(color: Colors.black),
+ onChanged: (value) {
+ setState(() {
+ task = value;
+ });
+ },
+ ),
+ ),
+ const SizedBox(height: 30),
+ CustomButton(
+ text: 'Add',
+ onPressed: () {
+ Provider.of(context, listen: false).addTasks(
+ task.toString(),
+ );
+ firebaseFirestore.doc(AddTaskDialog.taskId).set({
+ 'taskName': task.toString(),
+ 'isDone': obj.onChecked,
+ });
+ Navigator.pop(context);
+ },
+ )
+ ],
+ );
+ }
+}
diff --git a/lib/features/toDoList/widgets/task_list.dart b/lib/features/toDoList/widgets/task_list.dart
new file mode 100644
index 0000000..ec01088
--- /dev/null
+++ b/lib/features/toDoList/widgets/task_list.dart
@@ -0,0 +1,48 @@
+import 'package:cloud_firestore/cloud_firestore.dart';
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:fitpad/features/toDoList/models/toDoList_model.dart';
+import 'package:fitpad/features/toDoList/screens/ToDolist_screen.dart';
+import 'package:fitpad/features/toDoList/widgets/add_task_dialog.dart';
+import 'package:fitpad/features/toDoList/widgets/task_tile.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+
+class TaskList extends StatelessWidget {
+ TaskList({super.key});
+ final firebaseFirestore = FirebaseFirestore.instance
+ .collection('Tasks')
+ .doc(FirebaseAuth.instance.currentUser!.uid)
+ .collection('Task');
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: const EdgeInsets.all(20.0),
+ child: Consumer(
+ builder: (context, taskData, child) {
+ return ListView.builder(
+ itemBuilder: (context, index) {
+ return TaskTile(
+ onChecked: taskData.tasks[index].onChecked,
+ task: taskData.tasks[index].tasks,
+ checkBoxCallBack: (checkState) {
+ taskData.updateTasks(
+ taskData.tasks[index],
+ );
+ firebaseFirestore.doc(AddTaskDialog.taskId).set({
+ 'taskName': taskData.tasks[index].tasks.toString(),
+ 'isDone': taskData.tasks[index].onChecked,
+ });
+ },
+ longPressCallBack: () {
+ taskData.deleteTasks(taskData.tasks[index]);
+ firebaseFirestore.doc(AddTaskDialog.taskId).delete();
+ },
+ );
+ },
+ itemCount: taskData.tasksLength,
+ );
+ },
+ ),
+ );
+ }
+}
diff --git a/lib/features/toDoList/widgets/task_tile.dart b/lib/features/toDoList/widgets/task_tile.dart
new file mode 100644
index 0000000..1bc401f
--- /dev/null
+++ b/lib/features/toDoList/widgets/task_tile.dart
@@ -0,0 +1,36 @@
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+
+class TaskTile extends StatelessWidget {
+ const TaskTile(
+ {super.key,
+ this.onChecked = false,
+ this.task,
+ this.checkBoxCallBack,
+ this.longPressCallBack});
+ final String? task;
+ final bool onChecked;
+ final Function(bool?)? checkBoxCallBack;
+ final Function()? longPressCallBack;
+
+ @override
+ Widget build(BuildContext context) {
+ return ListTile(
+ onLongPress: longPressCallBack!,
+ leading: Text(
+ task.toString(),
+ style: kTextStyleLarge.copyWith(
+ color: Colors.black,
+ decoration: onChecked == true ? TextDecoration.lineThrough : null,
+ decorationThickness: 3),
+ ),
+ trailing: Checkbox(
+ checkColor: orangeColor,
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(100)),
+ activeColor: const Color(0xff181920),
+ value: onChecked,
+ onChanged: checkBoxCallBack!,
+ ),
+ );
+ }
+}
diff --git a/lib/features/welcome/screens/welcome_screen.dart b/lib/features/welcome/screens/welcome_screen.dart
new file mode 100644
index 0000000..644e959
--- /dev/null
+++ b/lib/features/welcome/screens/welcome_screen.dart
@@ -0,0 +1,56 @@
+import 'package:fitpad/authentication/screens/login_screen.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:fitpad/shared/widgets/custom_button.dart';
+import 'package:flutter/material.dart';
+
+class WelcomeScreen extends StatelessWidget {
+ const WelcomeScreen({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Center(
+ child: Container(
+ decoration: const BoxDecoration(
+ image: DecorationImage(
+ image: AssetImage("images/welcomeImage.png"),
+ ),
+ ),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: const [
+ SizedBox(height: 300),
+ Text(
+ "Vote1",
+ style: kTextStyleHeaders,
+ ),
+ Padding(
+ padding: EdgeInsets.only(top: 8, left: 30, right: 30),
+ child: Text(
+ "The App For Young India",
+ style: kTextStyleSmall,
+ textAlign: TextAlign.center,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ const SizedBox(height: 80),
+ CustomButton(
+ text: 'Get Started',
+ onPressed: () => Navigator.pushReplacement(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const LoginScreen(),
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart
new file mode 100644
index 0000000..d8d9e6b
--- /dev/null
+++ b/lib/firebase_options.dart
@@ -0,0 +1,86 @@
+// File generated by FlutterFire CLI.
+// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members
+import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
+import 'package:flutter/foundation.dart'
+ show defaultTargetPlatform, kIsWeb, TargetPlatform;
+
+/// Default [FirebaseOptions] for use with your Firebase apps.
+///
+/// Example:
+/// ```dart
+/// import 'firebase_options.dart';
+/// // ...
+/// await Firebase.initializeApp(
+/// options: DefaultFirebaseOptions.currentPlatform,
+/// );
+/// ```
+class DefaultFirebaseOptions {
+ static FirebaseOptions get currentPlatform {
+ if (kIsWeb) {
+ return web;
+ }
+ switch (defaultTargetPlatform) {
+ case TargetPlatform.android:
+ return android;
+ case TargetPlatform.iOS:
+ return ios;
+ case TargetPlatform.macOS:
+ return macos;
+ case TargetPlatform.windows:
+ throw UnsupportedError(
+ 'DefaultFirebaseOptions have not been configured for windows - '
+ 'you can reconfigure this by running the FlutterFire CLI again.',
+ );
+ case TargetPlatform.linux:
+ throw UnsupportedError(
+ 'DefaultFirebaseOptions have not been configured for linux - '
+ 'you can reconfigure this by running the FlutterFire CLI again.',
+ );
+ default:
+ throw UnsupportedError(
+ 'DefaultFirebaseOptions are not supported for this platform.',
+ );
+ }
+ }
+
+ static const FirebaseOptions web = FirebaseOptions(
+ apiKey: 'AIzaSyAbvDQ3ECU06X1aU_H0dYdTP43IlvZSKI8',
+ appId: '1:546001277191:web:76f93ed1522732b4bd75a2',
+ messagingSenderId: '546001277191',
+ projectId: 'fitpad-ff2f5',
+ authDomain: 'fitpad-ff2f5.firebaseapp.com',
+ databaseURL: 'https://fitpad-ff2f5-default-rtdb.firebaseio.com',
+ storageBucket: 'fitpad-ff2f5.appspot.com',
+ );
+
+ static const FirebaseOptions android = FirebaseOptions(
+ apiKey: 'AIzaSyDYQakYeVuLrNUAxPMLrdZjXuJKGcY2q4k',
+ appId: '1:546001277191:android:7b3a657ea2580334bd75a2',
+ messagingSenderId: '546001277191',
+ projectId: 'fitpad-ff2f5',
+ databaseURL: 'https://fitpad-ff2f5-default-rtdb.firebaseio.com',
+ storageBucket: 'fitpad-ff2f5.appspot.com',
+ );
+
+ static const FirebaseOptions ios = FirebaseOptions(
+ apiKey: 'AIzaSyBQlPPTyQU52SAifE7i5LwcdJ5otAvmGAY',
+ appId: '1:546001277191:ios:032ec8e98fc14bf7bd75a2',
+ messagingSenderId: '546001277191',
+ projectId: 'fitpad-ff2f5',
+ databaseURL: 'https://fitpad-ff2f5-default-rtdb.firebaseio.com',
+ storageBucket: 'fitpad-ff2f5.appspot.com',
+ iosClientId: '546001277191-tieai27oge9lio812s0m284293va3ae8.apps.googleusercontent.com',
+ iosBundleId: 'com.example.fitpad',
+ );
+
+ static const FirebaseOptions macos = FirebaseOptions(
+ apiKey: 'AIzaSyBQlPPTyQU52SAifE7i5LwcdJ5otAvmGAY',
+ appId: '1:546001277191:ios:032ec8e98fc14bf7bd75a2',
+ messagingSenderId: '546001277191',
+ projectId: 'fitpad-ff2f5',
+ databaseURL: 'https://fitpad-ff2f5-default-rtdb.firebaseio.com',
+ storageBucket: 'fitpad-ff2f5.appspot.com',
+ iosClientId: '546001277191-tieai27oge9lio812s0m284293va3ae8.apps.googleusercontent.com',
+ iosBundleId: 'com.example.fitpad',
+ );
+}
diff --git a/lib/main.dart b/lib/main.dart
new file mode 100644
index 0000000..a28f701
--- /dev/null
+++ b/lib/main.dart
@@ -0,0 +1,74 @@
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:firebase_core/firebase_core.dart';
+import 'package:fitpad/features/home_screen.dart';
+import 'package:fitpad/features/toDoList/models/toDoList_model.dart';
+import 'package:fitpad/features/welcome/screens/welcome_screen.dart';
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:provider/provider.dart';
+
+void main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+ await Firebase.initializeApp();
+ await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
+ runApp(const FitPad());
+}
+
+class FitPad extends StatelessWidget {
+ const FitPad({super.key});
+ @override
+ Widget build(BuildContext context) {
+ return ChangeNotifierProvider(
+ create: (_) => TaskData(),
+ child: MaterialApp(
+ debugShowCheckedModeBanner: false,
+ theme: ThemeData(
+ scaffoldBackgroundColor: const Color(0xff181920),
+ appBarTheme: const AppBarTheme(
+ elevation: 0,
+ backgroundColor: Colors.transparent,
+ centerTitle: true,
+ ),
+ ),
+ home: const MainPage(),
+ ),
+ );
+ }
+}
+
+class MainPage extends StatelessWidget {
+ const MainPage({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return StreamBuilder(
+ stream: FirebaseAuth.instance.authStateChanges(),
+ builder: (context, snapshot) {
+ if (snapshot.connectionState == ConnectionState.waiting) {
+ return const Center(
+ child: CircularProgressIndicator(
+ color: blueColor,
+ ),
+ );
+ } else if (snapshot.hasError) {
+ return Center(
+ child: Container(
+ color: Colors.black26,
+ width: double.maxFinite,
+ height: double.maxFinite,
+ child: const Text(
+ "Something went wrong",
+ style: kTextStyleHeadings,
+ ),
+ ),
+ );
+ } else if (snapshot.hasData) {
+ return const HomeScreen();
+ } else {
+ return const WelcomeScreen();
+ }
+ },
+ );
+ }
+}
diff --git a/lib/shared/utils/constants.dart b/lib/shared/utils/constants.dart
new file mode 100644
index 0000000..9c00736
--- /dev/null
+++ b/lib/shared/utils/constants.dart
@@ -0,0 +1,52 @@
+import 'package:flutter/material.dart';
+
+const kTextStyleHeadings = TextStyle(
+ fontFamily: 'Oswald',
+ fontSize: 35,
+ fontWeight: FontWeight.w800,
+ color: Colors.white);
+
+const kContainerDecoration = BoxDecoration(
+ borderRadius: BorderRadius.all(Radius.circular(10)),
+);
+
+const kTextStyleSmall = TextStyle(
+ fontSize: 17,
+ fontFamily: 'Oswald',
+ fontWeight: FontWeight.w400,
+ color: Colors.white,
+);
+const kTextStyleLarge = TextStyle(
+ fontSize: 20,
+ fontFamily: 'Oswald',
+ fontWeight: FontWeight.w600,
+ color: Colors.white,
+);
+const kTextStyleHeaders = TextStyle(
+ fontSize: 25,
+ fontFamily: 'Oswald',
+ fontWeight: FontWeight.w600,
+ color: Colors.white,
+);
+const kTextFieldDecoration = InputDecoration(
+ filled: true,
+ fillColor: Colors.grey,
+ focusedBorder: OutlineInputBorder(
+ borderRadius: BorderRadius.all(Radius.circular(20)),
+ borderSide: BorderSide(color: Colors.grey),
+ ),
+ enabledBorder: OutlineInputBorder(
+ borderRadius: BorderRadius.all(Radius.circular(20)),
+ borderSide: BorderSide(color: Colors.grey),
+ ),
+ errorBorder: OutlineInputBorder(
+ borderSide: BorderSide(color: Colors.red, width: 2),
+ borderRadius: BorderRadius.all(Radius.circular(20)),
+ ),
+ focusedErrorBorder: OutlineInputBorder(
+ borderSide: BorderSide(color: Colors.red, width: 2),
+ borderRadius: BorderRadius.all(Radius.circular(20)),
+ ),
+);
+const orangeColor = Color(0xFFE57944);
+const blueColor = Color(0xff5568FE);
diff --git a/lib/shared/widgets/custom_button.dart b/lib/shared/widgets/custom_button.dart
new file mode 100644
index 0000000..b559fcf
--- /dev/null
+++ b/lib/shared/widgets/custom_button.dart
@@ -0,0 +1,32 @@
+import 'package:fitpad/shared/utils/constants.dart';
+import 'package:flutter/material.dart';
+
+class CustomButton extends StatelessWidget {
+ const CustomButton({Key? key, required this.text, required this.onPressed})
+ : super(key: key);
+ final Function() onPressed;
+ final String text;
+ @override
+ Widget build(BuildContext context) {
+ return Card(
+ elevation: 5,
+ shadowColor: Colors.grey,
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
+ color: Colors.deepPurple,
+ child: InkWell(
+ onTap: onPressed,
+ borderRadius: BorderRadius.circular(20),
+ child: Ink(
+ height: 50,
+ width: 300,
+ child: Center(
+ child: Text(
+ text,
+ style: kTextStyleSmall.copyWith(fontSize: 20),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt
new file mode 100644
index 0000000..ea34689
--- /dev/null
+++ b/linux/CMakeLists.txt
@@ -0,0 +1,138 @@
+# Project-level configuration.
+cmake_minimum_required(VERSION 3.10)
+project(runner LANGUAGES CXX)
+
+# The name of the executable created for the application. Change this to change
+# the on-disk name of your application.
+set(BINARY_NAME "fitpad")
+# The unique GTK application identifier for this application. See:
+# https://wiki.gnome.org/HowDoI/ChooseApplicationID
+set(APPLICATION_ID "com.example.fitpad")
+
+# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
+# versions of CMake.
+cmake_policy(SET CMP0063 NEW)
+
+# Load bundled libraries from the lib/ directory relative to the binary.
+set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
+
+# Root filesystem for cross-building.
+if(FLUTTER_TARGET_PLATFORM_SYSROOT)
+ set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+endif()
+
+# Define build configuration options.
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "Debug" CACHE
+ STRING "Flutter build mode" FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "Debug" "Profile" "Release")
+endif()
+
+# Compilation settings that should be applied to most targets.
+#
+# Be cautious about adding new options here, as plugins use this function by
+# default. In most cases, you should add new options to specific targets instead
+# of modifying this function.
+function(APPLY_STANDARD_SETTINGS TARGET)
+ target_compile_features(${TARGET} PUBLIC cxx_std_14)
+ target_compile_options(${TARGET} PRIVATE -Wall -Werror)
+ target_compile_options(${TARGET} PRIVATE "$<$>:-O3>")
+ target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>")
+endfunction()
+
+# Flutter library and tool build rules.
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+
+add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
+
+# Define the application target. To change its name, change BINARY_NAME above,
+# not the value here, or `flutter run` will no longer work.
+#
+# Any new source files that you add to the application should be added here.
+add_executable(${BINARY_NAME}
+ "main.cc"
+ "my_application.cc"
+ "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+)
+
+# Apply the standard set of build settings. This can be removed for applications
+# that need different build settings.
+apply_standard_settings(${BINARY_NAME})
+
+# Add dependency libraries. Add any application-specific dependencies here.
+target_link_libraries(${BINARY_NAME} PRIVATE flutter)
+target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
+
+# Run the Flutter tool portions of the build. This must not be removed.
+add_dependencies(${BINARY_NAME} flutter_assemble)
+
+# Only the install-generated bundle's copy of the executable will launch
+# correctly, since the resources must in the right relative locations. To avoid
+# people trying to run the unbundled copy, put it in a subdirectory instead of
+# the default top-level location.
+set_target_properties(${BINARY_NAME}
+ PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
+)
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# By default, "installing" just makes a relocatable bundle in the build
+# directory.
+set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+# Start with a clean build bundle directory every time.
+install(CODE "
+ file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\")
+ " COMPONENT Runtime)
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
+ install(FILES "${bundled_library}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endforeach(bundled_library)
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+ file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+ " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+ DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
+ install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endif()
diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt
new file mode 100644
index 0000000..27860e8
--- /dev/null
+++ b/linux/flutter/CMakeLists.txt
@@ -0,0 +1,88 @@
+# This file controls Flutter-level build steps. It should not be edited.
+cmake_minimum_required(VERSION 3.10)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+
+# Serves the same purpose as list(TRANSFORM ... PREPEND ...),
+# which isn't available in 3.10.
+function(list_prepend LIST_NAME PREFIX)
+ set(NEW_LIST "")
+ foreach(element ${${LIST_NAME}})
+ list(APPEND NEW_LIST "${PREFIX}${element}")
+ endforeach(element)
+ set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE)
+endfunction()
+
+# === Flutter Library ===
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
+pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
+
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+ "fl_basic_message_channel.h"
+ "fl_binary_codec.h"
+ "fl_binary_messenger.h"
+ "fl_dart_project.h"
+ "fl_engine.h"
+ "fl_json_message_codec.h"
+ "fl_json_method_codec.h"
+ "fl_message_codec.h"
+ "fl_method_call.h"
+ "fl_method_channel.h"
+ "fl_method_codec.h"
+ "fl_method_response.h"
+ "fl_plugin_registrar.h"
+ "fl_plugin_registry.h"
+ "fl_standard_message_codec.h"
+ "fl_standard_method_codec.h"
+ "fl_string_codec.h"
+ "fl_value.h"
+ "fl_view.h"
+ "flutter_linux.h"
+)
+list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+ "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}")
+target_link_libraries(flutter INTERFACE
+ PkgConfig::GTK
+ PkgConfig::GLIB
+ PkgConfig::GIO
+)
+add_dependencies(flutter flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+add_custom_command(
+ OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+ ${CMAKE_CURRENT_BINARY_DIR}/_phony_
+ COMMAND ${CMAKE_COMMAND} -E env
+ ${FLUTTER_TOOL_ENVIRONMENT}
+ "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
+ ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
+ VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+ "${FLUTTER_LIBRARY}"
+ ${FLUTTER_LIBRARY_HEADERS}
+)
diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc
new file mode 100644
index 0000000..f177591
--- /dev/null
+++ b/linux/flutter/generated_plugin_registrant.cc
@@ -0,0 +1,19 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#include "generated_plugin_registrant.h"
+
+#include
+#include
+
+void fl_register_plugins(FlPluginRegistry* registry) {
+ g_autoptr(FlPluginRegistrar) modal_progress_hud_nsn_registrar =
+ fl_plugin_registry_get_registrar_for_plugin(registry, "ModalProgressHudNsnPlugin");
+ modal_progress_hud_nsn_plugin_register_with_registrar(modal_progress_hud_nsn_registrar);
+ g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
+ fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
+ url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
+}
diff --git a/linux/flutter/generated_plugin_registrant.h b/linux/flutter/generated_plugin_registrant.h
new file mode 100644
index 0000000..e0f0a47
--- /dev/null
+++ b/linux/flutter/generated_plugin_registrant.h
@@ -0,0 +1,15 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#ifndef GENERATED_PLUGIN_REGISTRANT_
+#define GENERATED_PLUGIN_REGISTRANT_
+
+#include
+
+// Registers Flutter plugins.
+void fl_register_plugins(FlPluginRegistry* registry);
+
+#endif // GENERATED_PLUGIN_REGISTRANT_
diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake
new file mode 100644
index 0000000..812da58
--- /dev/null
+++ b/linux/flutter/generated_plugins.cmake
@@ -0,0 +1,25 @@
+#
+# Generated file, do not edit.
+#
+
+list(APPEND FLUTTER_PLUGIN_LIST
+ modal_progress_hud_nsn
+ url_launcher_linux
+)
+
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
+set(PLUGIN_BUNDLED_LIBRARIES)
+
+foreach(plugin ${FLUTTER_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})
+ target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES $)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
+endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/linux/main.cc b/linux/main.cc
new file mode 100644
index 0000000..4340ffc
--- /dev/null
+++ b/linux/main.cc
@@ -0,0 +1,6 @@
+#include "my_application.h"
+
+int main(int argc, char** argv) {
+ g_autoptr(MyApplication) app = my_application_new();
+ return g_application_run(G_APPLICATION(app), argc, argv);
+}
diff --git a/linux/my_application.cc b/linux/my_application.cc
new file mode 100644
index 0000000..dd6028d
--- /dev/null
+++ b/linux/my_application.cc
@@ -0,0 +1,104 @@
+#include "my_application.h"
+
+#include
+#ifdef GDK_WINDOWING_X11
+#include
+#endif
+
+#include "flutter/generated_plugin_registrant.h"
+
+struct _MyApplication {
+ GtkApplication parent_instance;
+ char** dart_entrypoint_arguments;
+};
+
+G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
+
+// Implements GApplication::activate.
+static void my_application_activate(GApplication* application) {
+ MyApplication* self = MY_APPLICATION(application);
+ GtkWindow* window =
+ GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
+
+ // Use a header bar when running in GNOME as this is the common style used
+ // by applications and is the setup most users will be using (e.g. Ubuntu
+ // desktop).
+ // If running on X and not using GNOME then just use a traditional title bar
+ // in case the window manager does more exotic layout, e.g. tiling.
+ // If running on Wayland assume the header bar will work (may need changing
+ // if future cases occur).
+ gboolean use_header_bar = TRUE;
+#ifdef GDK_WINDOWING_X11
+ GdkScreen* screen = gtk_window_get_screen(window);
+ if (GDK_IS_X11_SCREEN(screen)) {
+ const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
+ if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
+ use_header_bar = FALSE;
+ }
+ }
+#endif
+ if (use_header_bar) {
+ GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
+ gtk_widget_show(GTK_WIDGET(header_bar));
+ gtk_header_bar_set_title(header_bar, "fitpad");
+ gtk_header_bar_set_show_close_button(header_bar, TRUE);
+ gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
+ } else {
+ gtk_window_set_title(window, "fitpad");
+ }
+
+ gtk_window_set_default_size(window, 1280, 720);
+ gtk_widget_show(GTK_WIDGET(window));
+
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
+
+ FlView* view = fl_view_new(project);
+ gtk_widget_show(GTK_WIDGET(view));
+ gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
+
+ fl_register_plugins(FL_PLUGIN_REGISTRY(view));
+
+ gtk_widget_grab_focus(GTK_WIDGET(view));
+}
+
+// Implements GApplication::local_command_line.
+static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
+ MyApplication* self = MY_APPLICATION(application);
+ // Strip out the first argument as it is the binary name.
+ self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
+
+ g_autoptr(GError) error = nullptr;
+ if (!g_application_register(application, nullptr, &error)) {
+ g_warning("Failed to register: %s", error->message);
+ *exit_status = 1;
+ return TRUE;
+ }
+
+ g_application_activate(application);
+ *exit_status = 0;
+
+ return TRUE;
+}
+
+// Implements GObject::dispose.
+static void my_application_dispose(GObject* object) {
+ MyApplication* self = MY_APPLICATION(object);
+ g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
+ G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
+}
+
+static void my_application_class_init(MyApplicationClass* klass) {
+ G_APPLICATION_CLASS(klass)->activate = my_application_activate;
+ G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
+ G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
+}
+
+static void my_application_init(MyApplication* self) {}
+
+MyApplication* my_application_new() {
+ return MY_APPLICATION(g_object_new(my_application_get_type(),
+ "application-id", APPLICATION_ID,
+ "flags", G_APPLICATION_NON_UNIQUE,
+ nullptr));
+}
diff --git a/linux/my_application.h b/linux/my_application.h
new file mode 100644
index 0000000..8f20fb5
--- /dev/null
+++ b/linux/my_application.h
@@ -0,0 +1,18 @@
+#ifndef FLUTTER_MY_APPLICATION_H_
+#define FLUTTER_MY_APPLICATION_H_
+
+#include
+
+G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,
+ GtkApplication)
+
+/**
+ * my_application_new:
+ *
+ * Creates a new Flutter-based application.
+ *
+ * Returns: a new #MyApplication.
+ */
+MyApplication* my_application_new();
+
+#endif // FLUTTER_MY_APPLICATION_H_
diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig
new file mode 100644
index 0000000..f022c34
--- /dev/null
+++ b/macos/Flutter/Flutter-Debug.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig
new file mode 100644
index 0000000..f022c34
--- /dev/null
+++ b/macos/Flutter/Flutter-Release.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift
new file mode 100644
index 0000000..2b7c38b
--- /dev/null
+++ b/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -0,0 +1,24 @@
+//
+// Generated file. Do not edit.
+//
+
+import FlutterMacOS
+import Foundation
+
+import cloud_firestore
+import firebase_auth
+import firebase_core
+import firebase_database
+import firebase_storage
+import modal_progress_hud_nsn
+import url_launcher_macos
+
+func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+ FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin"))
+ FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin"))
+ FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
+ FLTFirebaseDatabasePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseDatabasePlugin"))
+ FLTFirebaseStoragePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseStoragePlugin"))
+ ModalProgressHudNsnPlugin.register(with: registry.registrar(forPlugin: "ModalProgressHudNsnPlugin"))
+ UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
+}
diff --git a/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig
new file mode 100644
index 0000000..910a1de
--- /dev/null
+++ b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig
@@ -0,0 +1,11 @@
+// This is a generated file; do not edit or check into version control.
+FLUTTER_ROOT=D:\flutter\flutter
+FLUTTER_APPLICATION_PATH=C:\Users\ABHIJOY\Music\app\FitPad
+COCOAPODS_PARALLEL_CODE_SIGN=true
+FLUTTER_BUILD_DIR=build
+FLUTTER_BUILD_NAME=1.0.0
+FLUTTER_BUILD_NUMBER=1
+DART_OBFUSCATION=false
+TRACK_WIDGET_CREATION=true
+TREE_SHAKE_ICONS=false
+PACKAGE_CONFIG=.dart_tool/package_config.json
diff --git a/macos/Flutter/ephemeral/flutter_export_environment.sh b/macos/Flutter/ephemeral/flutter_export_environment.sh
new file mode 100644
index 0000000..a8b711f
--- /dev/null
+++ b/macos/Flutter/ephemeral/flutter_export_environment.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+# This is a generated file; do not edit or check into version control.
+export "FLUTTER_ROOT=D:\flutter\flutter"
+export "FLUTTER_APPLICATION_PATH=C:\Users\ABHIJOY\Music\app\FitPad"
+export "COCOAPODS_PARALLEL_CODE_SIGN=true"
+export "FLUTTER_BUILD_DIR=build"
+export "FLUTTER_BUILD_NAME=1.0.0"
+export "FLUTTER_BUILD_NUMBER=1"
+export "DART_OBFUSCATION=false"
+export "TRACK_WIDGET_CREATION=true"
+export "TREE_SHAKE_ICONS=false"
+export "PACKAGE_CONFIG=.dart_tool/package_config.json"
diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift
new file mode 100644
index 0000000..553a135
--- /dev/null
+++ b/macos/Runner/AppDelegate.swift
@@ -0,0 +1,9 @@
+import Cocoa
+import FlutterMacOS
+
+@NSApplicationMain
+class AppDelegate: FlutterAppDelegate {
+ override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
+ return true
+ }
+}
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..8d4e7cb
--- /dev/null
+++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "images" : [
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_16.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_64.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_128.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_1024.png",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
new file mode 100644
index 0000000..82b6f9d
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
new file mode 100644
index 0000000..13b35eb
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
new file mode 100644
index 0000000..0a3f5fa
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
new file mode 100644
index 0000000..bdb5722
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
new file mode 100644
index 0000000..f083318
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
new file mode 100644
index 0000000..326c0e7
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
new file mode 100644
index 0000000..2f1632c
Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ
diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/macos/Runner/Base.lproj/MainMenu.xib
new file mode 100644
index 0000000..4632c69
--- /dev/null
+++ b/macos/Runner/Base.lproj/MainMenu.xib
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig
new file mode 100644
index 0000000..b4f77fe
--- /dev/null
+++ b/macos/Runner/Configs/AppInfo.xcconfig
@@ -0,0 +1,14 @@
+// Application-level settings for the Runner target.
+//
+// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
+// future. If not, the values below would default to using the project name when this becomes a
+// 'flutter create' template.
+
+// The application's name. By default this is also the title of the Flutter window.
+PRODUCT_NAME = fitpad
+
+// The application's bundle identifier
+PRODUCT_BUNDLE_IDENTIFIER = com.example.fitpad
+
+// The copyright displayed in application information
+PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved.
diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig
new file mode 100644
index 0000000..b398823
--- /dev/null
+++ b/macos/Runner/Configs/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Debug.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig
new file mode 100644
index 0000000..d93e5dc
--- /dev/null
+++ b/macos/Runner/Configs/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Release.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig
new file mode 100644
index 0000000..fb4d7d3
--- /dev/null
+++ b/macos/Runner/Configs/Warnings.xcconfig
@@ -0,0 +1,13 @@
+WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
+GCC_WARN_UNDECLARED_SELECTOR = YES
+CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
+CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
+CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
+CLANG_WARN_PRAGMA_PACK = YES
+CLANG_WARN_STRICT_PROTOTYPES = YES
+CLANG_WARN_COMMA = YES
+GCC_WARN_STRICT_SELECTOR_MATCH = YES
+CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
+CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
+GCC_WARN_SHADOW = YES
+CLANG_WARN_UNREACHABLE_CODE = YES
diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements
new file mode 100644
index 0000000..51d0967
--- /dev/null
+++ b/macos/Runner/DebugProfile.entitlements
@@ -0,0 +1,12 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.cs.allow-jit
+
+ com.apple.security.network.server
+
+
+
diff --git a/macos/Runner/GoogleService-Info.plist b/macos/Runner/GoogleService-Info.plist
new file mode 100644
index 0000000..d49459a
--- /dev/null
+++ b/macos/Runner/GoogleService-Info.plist
@@ -0,0 +1,36 @@
+
+
+
+
+ CLIENT_ID
+ 546001277191-tieai27oge9lio812s0m284293va3ae8.apps.googleusercontent.com
+ REVERSED_CLIENT_ID
+ com.googleusercontent.apps.546001277191-tieai27oge9lio812s0m284293va3ae8
+ API_KEY
+ AIzaSyBQlPPTyQU52SAifE7i5LwcdJ5otAvmGAY
+ GCM_SENDER_ID
+ 546001277191
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ com.example.fitpad
+ PROJECT_ID
+ fitpad-ff2f5
+ STORAGE_BUCKET
+ fitpad-ff2f5.appspot.com
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:546001277191:ios:032ec8e98fc14bf7bd75a2
+ DATABASE_URL
+ https://fitpad-ff2f5-default-rtdb.firebaseio.com
+
+
\ No newline at end of file
diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist
new file mode 100644
index 0000000..3733c1a
--- /dev/null
+++ b/macos/Runner/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSMinimumSystemVersion
+ $(MACOSX_DEPLOYMENT_TARGET)
+ NSHumanReadableCopyright
+ $(PRODUCT_COPYRIGHT)
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/macos/firebase_app_id_file.json b/macos/firebase_app_id_file.json
new file mode 100644
index 0000000..fe1dae0
--- /dev/null
+++ b/macos/firebase_app_id_file.json
@@ -0,0 +1,7 @@
+{
+ "file_generated_by": "FlutterFire CLI",
+ "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
+ "GOOGLE_APP_ID": "1:546001277191:ios:032ec8e98fc14bf7bd75a2",
+ "FIREBASE_PROJECT_ID": "fitpad-ff2f5",
+ "GCM_SENDER_ID": "546001277191"
+}
\ No newline at end of file
diff --git a/pubspec.lock b/pubspec.lock
new file mode 100644
index 0000000..0f0e843
--- /dev/null
+++ b/pubspec.lock
@@ -0,0 +1,578 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+ _flutterfire_internals:
+ dependency: transitive
+ description:
+ name: _flutterfire_internals
+ sha256: f175bc1414e4edf8c5b83372c98eeabecf8353f39c9da423c2cfdf1f1f508788
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
+ async:
+ dependency: transitive
+ description:
+ name: async
+ sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.10.0"
+ boolean_selector:
+ dependency: transitive
+ description:
+ name: boolean_selector
+ sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ carousel_slider:
+ dependency: "direct main"
+ description:
+ name: carousel_slider
+ sha256: "9c695cc963bf1d04a47bd6021f68befce8970bcd61d24938e1fb0918cf5d9c42"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.2.1"
+ characters:
+ dependency: transitive
+ description:
+ name: characters
+ sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.1"
+ clock:
+ dependency: transitive
+ description:
+ name: clock
+ sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.1"
+ cloud_firestore:
+ dependency: "direct main"
+ description:
+ name: cloud_firestore
+ sha256: "3a2dba23d7d084a2d3c2dfd240d2122908cca40bab2d142f7e107f40df174ab5"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.5.0"
+ cloud_firestore_platform_interface:
+ dependency: transitive
+ description:
+ name: cloud_firestore_platform_interface
+ sha256: "29349a0687bc31290ab81d1de2b1cdadb40d0ea3ab30d247323c6c5be0d4c6fc"
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.12.0"
+ cloud_firestore_web:
+ dependency: transitive
+ description:
+ name: cloud_firestore_web
+ sha256: bc1fbcd6287acedded1139c9b13cfd47e792d5198f130f98759464839ea510a7
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.4.0"
+ collection:
+ dependency: transitive
+ description:
+ name: collection
+ sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.17.0"
+ cross_file:
+ dependency: transitive
+ description:
+ name: cross_file
+ sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.3.3+4"
+ crypto:
+ dependency: transitive
+ description:
+ name: crypto
+ sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.2"
+ cupertino_icons:
+ dependency: "direct main"
+ description:
+ name: cupertino_icons
+ sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.5"
+ fake_async:
+ dependency: transitive
+ description:
+ name: fake_async
+ sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.1"
+ firebase_auth:
+ dependency: "direct main"
+ description:
+ name: firebase_auth
+ sha256: "3d33d6646f08407122cd2cbd292d274b98035d93f59c9e341ba992ebefd59ffa"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.4.0"
+ firebase_auth_platform_interface:
+ dependency: transitive
+ description:
+ name: firebase_auth_platform_interface
+ sha256: "5d5f283517ba34afd69ef448cc81ea23bcf8887393bedae4f70f45060b045fb9"
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.13.0"
+ firebase_auth_web:
+ dependency: transitive
+ description:
+ name: firebase_auth_web
+ sha256: f50f7026b95c62dba3f0b28bdb3ab3601ea402b4908c1469103f16ae2b0f5281
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.3.0"
+ firebase_core:
+ dependency: "direct main"
+ description:
+ name: firebase_core
+ sha256: ed611fb8e67e43ecc7956f242cecca383d87cf71aace27287aa5dd4bdba4ac07
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.9.0"
+ firebase_core_platform_interface:
+ dependency: transitive
+ description:
+ name: firebase_core_platform_interface
+ sha256: "0df0a064ab0cad7f8836291ca6f3272edd7b83ad5b3540478ee46a0849d8022b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.6.0"
+ firebase_core_web:
+ dependency: transitive
+ description:
+ name: firebase_core_web
+ sha256: "347351a8f0518f3343d79a9a0690fa67ad232fc32e2ea270677791949eac792b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.0"
+ firebase_database:
+ dependency: "direct main"
+ description:
+ name: firebase_database
+ sha256: d437ccb3537485cbcf92df60c493b1601e93bce579518a9874c8d7be5408231e
+ url: "https://pub.dev"
+ source: hosted
+ version: "10.1.0"
+ firebase_database_platform_interface:
+ dependency: transitive
+ description:
+ name: firebase_database_platform_interface
+ sha256: "509351811777e8bcd643f295ae096d8e7741d9bf845467d3626e086d1ac89848"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.2.3"
+ firebase_database_web:
+ dependency: transitive
+ description:
+ name: firebase_database_web
+ sha256: d4a319e7923380f6adc7a46de331ce372aeafe101ae0ec684fef0540d41821bb
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.2.2"
+ firebase_storage:
+ dependency: "direct main"
+ description:
+ name: firebase_storage
+ sha256: a27909491c25acef90acc932be4d87bafb9d33fb98678edd2f81eaec9568a109
+ url: "https://pub.dev"
+ source: hosted
+ version: "11.1.0"
+ firebase_storage_platform_interface:
+ dependency: transitive
+ description:
+ name: firebase_storage_platform_interface
+ sha256: f254e064890df4ee588f10bea06d679e047018910451a4bc3c529b9791adb0a9
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.2.0"
+ firebase_storage_web:
+ dependency: transitive
+ description:
+ name: firebase_storage_web
+ sha256: b6d3c104fecafdce5fe1795306d33856c9a11fa76f73fe7eb062430fc151d686
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.4.0"
+ flutter:
+ dependency: "direct main"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_lints:
+ dependency: "direct dev"
+ description:
+ name: flutter_lints
+ sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.1"
+ flutter_plugin_android_lifecycle:
+ dependency: transitive
+ description:
+ name: flutter_plugin_android_lifecycle
+ sha256: c224ac897bed083dabf11f238dd11a239809b446740be0c2044608c50029ffdf
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.9"
+ flutter_rating_bar:
+ dependency: "direct main"
+ description:
+ name: flutter_rating_bar
+ sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.1"
+ flutter_staggered_grid_view:
+ dependency: "direct main"
+ description:
+ name: flutter_staggered_grid_view
+ sha256: "1312314293acceb65b92754298754801b0e1f26a1845833b740b30415bbbcf07"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.6.2"
+ flutter_test:
+ dependency: "direct dev"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_web_plugins:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ font_awesome_flutter:
+ dependency: "direct main"
+ description:
+ name: font_awesome_flutter
+ sha256: "959ef4add147753f990b4a7c6cccb746d5792dbdc81b1cde99e62e7edb31b206"
+ url: "https://pub.dev"
+ source: hosted
+ version: "10.4.0"
+ http:
+ dependency: "direct main"
+ description:
+ name: http
+ sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.13.5"
+ http_parser:
+ dependency: transitive
+ description:
+ name: http_parser
+ sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.2"
+ image_picker:
+ dependency: "direct main"
+ description:
+ name: image_picker
+ sha256: cb25f04595a88450970dbe727243ba8cd21b6f7e0d7d1fc5b789fc6f52e95494
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.8.7+1"
+ image_picker_android:
+ dependency: transitive
+ description:
+ name: image_picker_android
+ sha256: dfb5b0f28b8786fcc662b7ed42bfb4b82a6cbbd74da1958384b10d40bdf212a7
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.8.6+6"
+ image_picker_for_web:
+ dependency: transitive
+ description:
+ name: image_picker_for_web
+ sha256: "98f50d6b9f294c8ba35e25cc0d13b04bfddd25dbc8d32fa9d566a6572f2c081c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.12"
+ image_picker_ios:
+ dependency: transitive
+ description:
+ name: image_picker_ios
+ sha256: d4cb8ab04f770dab9d04c7959e5f6d22e8c5280343d425f9344f93832cf58445
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.8.7+2"
+ image_picker_platform_interface:
+ dependency: transitive
+ description:
+ name: image_picker_platform_interface
+ sha256: "1991219d9dbc42a99aff77e663af8ca51ced592cd6685c9485e3458302d3d4f8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.6.3"
+ intl:
+ dependency: transitive
+ description:
+ name: intl
+ sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.17.0"
+ js:
+ dependency: transitive
+ description:
+ name: js
+ sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.6.5"
+ lints:
+ dependency: transitive
+ description:
+ name: lints
+ sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.1"
+ matcher:
+ dependency: transitive
+ description:
+ name: matcher
+ sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.12.13"
+ material_color_utilities:
+ dependency: transitive
+ description:
+ name: material_color_utilities
+ sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.2.0"
+ meta:
+ dependency: transitive
+ description:
+ name: meta
+ sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.8.0"
+ modal_progress_hud_nsn:
+ dependency: "direct main"
+ description:
+ name: modal_progress_hud_nsn
+ sha256: "408b9bcce97567de94637de932260e50be48db1842edc761aeea61670e5ec30c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.3.0"
+ nested:
+ dependency: transitive
+ description:
+ name: nested
+ sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
+ path:
+ dependency: transitive
+ description:
+ name: path
+ sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.8.2"
+ pedometer:
+ dependency: "direct main"
+ description:
+ name: pedometer
+ sha256: "16d7a3df91b9ad72304cf47924dfe9c1abd50304fbf23245edbc89d8429957c1"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.0"
+ plugin_platform_interface:
+ dependency: transitive
+ description:
+ name: plugin_platform_interface
+ sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.4"
+ provider:
+ dependency: "direct main"
+ description:
+ name: provider
+ sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.0.5"
+ rflutter_alert:
+ dependency: "direct main"
+ description:
+ name: rflutter_alert
+ sha256: a77c8c937fad29e70565388c5934f678b92325047663367b985570ba101929fa
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.4"
+ sky_engine:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.99"
+ source_span:
+ dependency: transitive
+ description:
+ name: source_span
+ sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.9.1"
+ stack_trace:
+ dependency: transitive
+ description:
+ name: stack_trace
+ sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.11.0"
+ stream_channel:
+ dependency: transitive
+ description:
+ name: stream_channel
+ sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ string_scanner:
+ dependency: transitive
+ description:
+ name: string_scanner
+ sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.0"
+ term_glyph:
+ dependency: transitive
+ description:
+ name: term_glyph
+ sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.1"
+ test_api:
+ dependency: transitive
+ description:
+ name: test_api
+ sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.4.16"
+ typed_data:
+ dependency: transitive
+ description:
+ name: typed_data
+ sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.1"
+ url_launcher:
+ dependency: "direct main"
+ description:
+ name: url_launcher
+ sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.1.10"
+ url_launcher_android:
+ dependency: transitive
+ description:
+ name: url_launcher_android
+ sha256: dd729390aa936bf1bdf5cd1bc7468ff340263f80a2c4f569416507667de8e3c8
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.0.26"
+ url_launcher_ios:
+ dependency: transitive
+ description:
+ name: url_launcher_ios
+ sha256: "3dedc66ca3c0bef9e6a93c0999aee102556a450afcc1b7bcfeace7a424927d92"
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.1.3"
+ url_launcher_linux:
+ dependency: transitive
+ description:
+ name: url_launcher_linux
+ sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.4"
+ url_launcher_macos:
+ dependency: transitive
+ description:
+ name: url_launcher_macos
+ sha256: "0ef2b4f97942a16523e51256b799e9aa1843da6c60c55eefbfa9dbc2dcb8331a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.4"
+ url_launcher_platform_interface:
+ dependency: transitive
+ description:
+ name: url_launcher_platform_interface
+ sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ url_launcher_web:
+ dependency: transitive
+ description:
+ name: url_launcher_web
+ sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.16"
+ url_launcher_windows:
+ dependency: transitive
+ description:
+ name: url_launcher_windows
+ sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.5"
+ uuid:
+ dependency: "direct main"
+ description:
+ name: uuid
+ sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.7"
+ vector_math:
+ dependency: transitive
+ description:
+ name: vector_math
+ sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.4"
+ vertical_weight_slider:
+ dependency: "direct main"
+ description:
+ name: vertical_weight_slider
+ sha256: "90edadfd8ac9f1aa0a252ce4b793c0f9c055cceac76f885750335f186227cf84"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.5.0"
+sdks:
+ dart: ">=2.18.2 <3.0.0"
+ flutter: ">=3.3.0"
diff --git a/pubspec.yaml b/pubspec.yaml
new file mode 100644
index 0000000..e1c1102
--- /dev/null
+++ b/pubspec.yaml
@@ -0,0 +1,109 @@
+name: fitpad
+description: A new Flutter project.
+
+# The following line prevents the package from being accidentally published to
+# pub.dev using `flutter pub publish`. This is preferred for private packages.
+publish_to: 'none' # Remove this line if you wish to publish to pub.dev
+
+# The following defines the version and build number for your application.
+# A version number is three numbers separated by dots, like 1.2.43
+# followed by an optional build number separated by a +.
+# Both the version and the builder number may be overridden in flutter
+# build by specifying --build-name and --build-number, respectively.
+# In Android, build-name is used as versionName while build-number used as versionCode.
+# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
+# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion.
+# Read more about iOS versioning at
+# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
+# In Windows, build-name is used as the major, minor, and patch parts
+# of the product and file versions while build-number is used as the build suffix.
+version: 1.0.0+1
+
+environment:
+ sdk: '>=2.18.2 <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
+# consider running `flutter pub upgrade --major-versions`. Alternatively,
+# dependencies can be manually updated by changing the version numbers below to
+# the latest version available on pub.dev. To see which dependencies have newer
+# versions available, run `flutter pub outdated`.
+dependencies:
+ flutter:
+ sdk: flutter
+
+
+ # The following adds the Cupertino Icons font to your application.
+ # Use with the CupertinoIcons class for iOS style icons.
+ cupertino_icons: ^1.0.2
+ flutter_staggered_grid_view: ^0.6.2
+ carousel_slider: ^4.2.1
+ url_launcher: ^6.1.10
+ flutter_rating_bar: ^4.0.1
+ http: ^0.13.5
+ pedometer: ^3.0.0
+ vertical_weight_slider: ^2.4.0
+ font_awesome_flutter: ^10.3.0
+ firebase_core: ^2.4.1
+ firebase_auth: ^4.2.5
+ cloud_firestore: ^4.3.1
+ firebase_database: ^10.0.7
+ rflutter_alert: ^2.0.4
+ provider: ^6.0.5
+ uuid: ^3.0.7
+ modal_progress_hud_nsn: ^0.3.0
+ firebase_storage: ^11.0.10
+ image_picker: ^0.8.6+1
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+
+ # The "flutter_lints" package below contains a set of recommended lints to
+ # encourage good coding practices. The lint set provided by the package is
+ # activated in the `analysis_options.yaml` file located at the root of your
+ # package. See that file for information about deactivating specific lint
+ # rules and activating additional ones.
+ flutter_lints: ^2.0.0
+
+# For information on the generic Dart part of this file, see the
+# following page: https://dart.dev/tools/pub/pubspec
+
+# The following section is specific to Flutter packages.
+flutter:
+
+ # The following line ensures that the Material Icons font is
+ # included with your application, so that you can use the icons in
+ # the material Icons class.
+ uses-material-design: true
+
+ # To add assets to your application, add an assets section, like this:
+ assets:
+ - images/
+ # - images/a_dot_ham.jpeg
+
+ # An image asset can refer to one or more resolution-specific "variants", see
+ # https://flutter.dev/assets-and-images/#resolution-aware
+
+ # For details regarding adding assets from package dependencies, see
+ # https://flutter.dev/assets-and-images/#from-packages
+
+ # To add custom fonts to your application, add a fonts section here,
+ # in this "flutter" section. Each entry in this list should have a
+ # "family" key with the font family name, and a "fonts" key with a
+ # list giving the asset and other descriptors for the font. For
+ # example:
+ fonts:
+ - family: Oswald
+ fonts:
+ - asset: fonts/Oswald-Regular.ttf
+ # - asset: fonts/Schyler-Italic.ttf
+ # style: italic
+ # - family: Trajan Pro
+ # fonts:
+ # - asset: fonts/TrajanPro.ttf
+ # - asset: fonts/TrajanPro_Bold.ttf
+ # weight: 700
+ #
+ # For details regarding fonts from package dependencies,
+ # see https://flutter.dev/custom-fonts/#from-packages
diff --git a/test/widget_test.dart b/test/widget_test.dart
new file mode 100644
index 0000000..ec77899
--- /dev/null
+++ b/test/widget_test.dart
@@ -0,0 +1,30 @@
+// This is a basic Flutter widget test.
+//
+// To perform an interaction with a widget in your test, use the WidgetTester
+// utility in the flutter_test package. For example, you can send tap and scroll
+// gestures. You can also use WidgetTester to find child widgets in the widget
+// tree, read text, and verify that the values of widget properties are correct.
+
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+import 'package:fitpad/main.dart';
+
+void main() {
+ testWidgets('Counter increments smoke test', (WidgetTester tester) async {
+ // Build our app and trigger a frame.
+ await tester.pumpWidget(FitPad());
+
+ // Verify that our counter starts at 0.
+ expect(find.text('0'), findsOneWidget);
+ expect(find.text('1'), findsNothing);
+
+ // Tap the '+' icon and trigger a frame.
+ await tester.tap(find.byIcon(Icons.add));
+ await tester.pump();
+
+ // Verify that our counter has incremented.
+ expect(find.text('0'), findsNothing);
+ expect(find.text('1'), findsOneWidget);
+ });
+}
diff --git a/web/favicon.png b/web/favicon.png
new file mode 100644
index 0000000..8aaa46a
Binary files /dev/null and b/web/favicon.png differ
diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png
new file mode 100644
index 0000000..b749bfe
Binary files /dev/null and b/web/icons/Icon-192.png differ
diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png
new file mode 100644
index 0000000..88cfd48
Binary files /dev/null and b/web/icons/Icon-512.png differ
diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png
new file mode 100644
index 0000000..eb9b4d7
Binary files /dev/null and b/web/icons/Icon-maskable-192.png differ
diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png
new file mode 100644
index 0000000..d69c566
Binary files /dev/null and b/web/icons/Icon-maskable-512.png differ
diff --git a/web/index.html b/web/index.html
new file mode 100644
index 0000000..1f36cdc
--- /dev/null
+++ b/web/index.html
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fitpad
+
+
+
+
+
+
+
+
+
+
diff --git a/web/manifest.json b/web/manifest.json
new file mode 100644
index 0000000..ec01a41
--- /dev/null
+++ b/web/manifest.json
@@ -0,0 +1,35 @@
+{
+ "name": "fitpad",
+ "short_name": "fitpad",
+ "start_url": ".",
+ "display": "standalone",
+ "background_color": "#0175C2",
+ "theme_color": "#0175C2",
+ "description": "A new Flutter project.",
+ "orientation": "portrait-primary",
+ "prefer_related_applications": false,
+ "icons": [
+ {
+ "src": "icons/Icon-192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-maskable-192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ },
+ {
+ "src": "icons/Icon-maskable-512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ]
+}
diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt
new file mode 100644
index 0000000..606e25a
--- /dev/null
+++ b/windows/CMakeLists.txt
@@ -0,0 +1,101 @@
+# Project-level configuration.
+cmake_minimum_required(VERSION 3.14)
+project(fitpad LANGUAGES CXX)
+
+# The name of the executable created for the application. Change this to change
+# the on-disk name of your application.
+set(BINARY_NAME "fitpad")
+
+# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
+# versions of CMake.
+cmake_policy(SET CMP0063 NEW)
+
+# Define build configuration option.
+get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+if(IS_MULTICONFIG)
+ set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release"
+ CACHE STRING "" FORCE)
+else()
+ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "Debug" CACHE
+ STRING "Flutter build mode" FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "Debug" "Profile" "Release")
+ endif()
+endif()
+# Define settings for the Profile build mode.
+set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
+set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
+set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
+set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
+
+# Use Unicode for all projects.
+add_definitions(-DUNICODE -D_UNICODE)
+
+# Compilation settings that should be applied to most targets.
+#
+# Be cautious about adding new options here, as plugins use this function by
+# default. In most cases, you should add new options to specific targets instead
+# of modifying this function.
+function(APPLY_STANDARD_SETTINGS TARGET)
+ target_compile_features(${TARGET} PUBLIC cxx_std_17)
+ target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
+ target_compile_options(${TARGET} PRIVATE /EHsc)
+ target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
+ target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>")
+endfunction()
+
+# Flutter library and tool build rules.
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# Application build; see runner/CMakeLists.txt.
+add_subdirectory("runner")
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# Support files are copied into place next to the executable, so that it can
+# run in place. This is done instead of making a separate bundle (as on Linux)
+# so that building and running from within Visual Studio will work.
+set(BUILD_BUNDLE_DIR "$")
+# Make the "install" step default, as it's required to run.
+set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+if(PLUGIN_BUNDLED_LIBRARIES)
+ install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endif()
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+ file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+ " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+ DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ CONFIGURATIONS Profile;Release
+ COMPONENT Runtime)
diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt
new file mode 100644
index 0000000..3f71e17
--- /dev/null
+++ b/windows/flutter/CMakeLists.txt
@@ -0,0 +1,104 @@
+# This file controls Flutter-level build steps. It should not be edited.
+cmake_minimum_required(VERSION 3.14)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
+
+# === Flutter Library ===
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+ "flutter_export.h"
+ "flutter_windows.h"
+ "flutter_messenger.h"
+ "flutter_plugin_registrar.h"
+ "flutter_texture_registrar.h"
+)
+list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+ "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib")
+add_dependencies(flutter flutter_assemble)
+
+# === Wrapper ===
+list(APPEND CPP_WRAPPER_SOURCES_CORE
+ "core_implementations.cc"
+ "standard_codec.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_PLUGIN
+ "plugin_registrar.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_APP
+ "flutter_engine.cc"
+ "flutter_view_controller.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/")
+
+# Wrapper sources needed for a plugin.
+add_library(flutter_wrapper_plugin STATIC
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_PLUGIN}
+)
+apply_standard_settings(flutter_wrapper_plugin)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+ POSITION_INDEPENDENT_CODE ON)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+ CXX_VISIBILITY_PRESET hidden)
+target_link_libraries(flutter_wrapper_plugin PUBLIC flutter)
+target_include_directories(flutter_wrapper_plugin PUBLIC
+ "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_plugin flutter_assemble)
+
+# Wrapper sources needed for the runner.
+add_library(flutter_wrapper_app STATIC
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_APP}
+)
+apply_standard_settings(flutter_wrapper_app)
+target_link_libraries(flutter_wrapper_app PUBLIC flutter)
+target_include_directories(flutter_wrapper_app PUBLIC
+ "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_app flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_")
+set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE)
+add_custom_command(
+ OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+ ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}
+ ${CPP_WRAPPER_SOURCES_APP}
+ ${PHONY_OUTPUT}
+ COMMAND ${CMAKE_COMMAND} -E env
+ ${FLUTTER_TOOL_ENVIRONMENT}
+ "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
+ windows-x64 $
+ VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+ "${FLUTTER_LIBRARY}"
+ ${FLUTTER_LIBRARY_HEADERS}
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_PLUGIN}
+ ${CPP_WRAPPER_SOURCES_APP}
+)
diff --git a/windows/flutter/ephemeral/generated_config.cmake b/windows/flutter/ephemeral/generated_config.cmake
new file mode 100644
index 0000000..ffae266
--- /dev/null
+++ b/windows/flutter/ephemeral/generated_config.cmake
@@ -0,0 +1,24 @@
+# Generated code do not commit.
+file(TO_CMAKE_PATH "D:\\flutter\\flutter" FLUTTER_ROOT)
+file(TO_CMAKE_PATH "C:\\Users\\ABHIJOY\\Music\\app\\FitPad" PROJECT_DIR)
+
+set(FLUTTER_VERSION "1.0.0+1" PARENT_SCOPE)
+set(FLUTTER_VERSION_MAJOR 1 PARENT_SCOPE)
+set(FLUTTER_VERSION_MINOR 0 PARENT_SCOPE)
+set(FLUTTER_VERSION_PATCH 0 PARENT_SCOPE)
+set(FLUTTER_VERSION_BUILD 1 PARENT_SCOPE)
+
+# Environment variables to pass to tool_backend.sh
+list(APPEND FLUTTER_TOOL_ENVIRONMENT
+ "FLUTTER_ROOT=D:\\flutter\\flutter"
+ "PROJECT_DIR=C:\\Users\\ABHIJOY\\Music\\app\\FitPad"
+ "FLUTTER_ROOT=D:\\flutter\\flutter"
+ "FLUTTER_EPHEMERAL_DIR=C:\\Users\\ABHIJOY\\Music\\app\\FitPad\\windows\\flutter\\ephemeral"
+ "PROJECT_DIR=C:\\Users\\ABHIJOY\\Music\\app\\FitPad"
+ "FLUTTER_TARGET=C:\\Users\\ABHIJOY\\Music\\app\\FitPad\\lib\\main.dart"
+ "DART_DEFINES=RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ=="
+ "DART_OBFUSCATION=false"
+ "TRACK_WIDGET_CREATION=true"
+ "TREE_SHAKE_ICONS=false"
+ "PACKAGE_CONFIG=C:\\Users\\ABHIJOY\\Music\\app\\FitPad\\.dart_tool\\package_config.json"
+)
diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc
new file mode 100644
index 0000000..4677966
--- /dev/null
+++ b/windows/flutter/generated_plugin_registrant.cc
@@ -0,0 +1,17 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#include "generated_plugin_registrant.h"
+
+#include
+#include
+
+void RegisterPlugins(flutter::PluginRegistry* registry) {
+ ModalProgressHudNsnPluginRegisterWithRegistrar(
+ registry->GetRegistrarForPlugin("ModalProgressHudNsnPlugin"));
+ UrlLauncherWindowsRegisterWithRegistrar(
+ registry->GetRegistrarForPlugin("UrlLauncherWindows"));
+}
diff --git a/windows/flutter/generated_plugin_registrant.h b/windows/flutter/generated_plugin_registrant.h
new file mode 100644
index 0000000..dc139d8
--- /dev/null
+++ b/windows/flutter/generated_plugin_registrant.h
@@ -0,0 +1,15 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#ifndef GENERATED_PLUGIN_REGISTRANT_
+#define GENERATED_PLUGIN_REGISTRANT_
+
+#include
+
+// Registers Flutter plugins.
+void RegisterPlugins(flutter::PluginRegistry* registry);
+
+#endif // GENERATED_PLUGIN_REGISTRANT_
diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake
new file mode 100644
index 0000000..d69ee09
--- /dev/null
+++ b/windows/flutter/generated_plugins.cmake
@@ -0,0 +1,25 @@
+#
+# Generated file, do not edit.
+#
+
+list(APPEND FLUTTER_PLUGIN_LIST
+ modal_progress_hud_nsn
+ url_launcher_windows
+)
+
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
+set(PLUGIN_BUNDLED_LIBRARIES)
+
+foreach(plugin ${FLUTTER_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})
+ target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES $)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
+endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt
new file mode 100644
index 0000000..c832c4b
--- /dev/null
+++ b/windows/runner/CMakeLists.txt
@@ -0,0 +1,39 @@
+cmake_minimum_required(VERSION 3.14)
+project(runner LANGUAGES CXX)
+
+# Define the application target. To change its name, change BINARY_NAME in the
+# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer
+# work.
+#
+# Any new source files that you add to the application should be added here.
+add_executable(${BINARY_NAME} WIN32
+ "flutter_window.cpp"
+ "main.cpp"
+ "utils.cpp"
+ "win32_window.cpp"
+ "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+ "Runner.rc"
+ "runner.exe.manifest"
+)
+
+# Apply the standard set of build settings. This can be removed for applications
+# that need different build settings.
+apply_standard_settings(${BINARY_NAME})
+
+# Add preprocessor definitions for the build version.
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}")
+
+# Disable Windows macros that collide with C++ standard library functions.
+target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
+
+# Add dependency libraries and include directories. Add any application-specific
+# dependencies here.
+target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
+target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
+
+# Run the Flutter tool portions of the build. This must not be removed.
+add_dependencies(${BINARY_NAME} flutter_assemble)
diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc
new file mode 100644
index 0000000..e0ca2df
--- /dev/null
+++ b/windows/runner/Runner.rc
@@ -0,0 +1,121 @@
+// Microsoft Visual C++ generated resource script.
+//
+#pragma code_page(65001)
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (United States) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""winres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_APP_ICON ICON "resources\\app_icon.ico"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)
+#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD
+#else
+#define VERSION_AS_NUMBER 1,0,0,0
+#endif
+
+#if defined(FLUTTER_VERSION)
+#define VERSION_AS_STRING FLUTTER_VERSION
+#else
+#define VERSION_AS_STRING "1.0.0"
+#endif
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION VERSION_AS_NUMBER
+ PRODUCTVERSION VERSION_AS_NUMBER
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_APP
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904e4"
+ BEGIN
+ VALUE "CompanyName", "com.example" "\0"
+ VALUE "FileDescription", "fitpad" "\0"
+ VALUE "FileVersion", VERSION_AS_STRING "\0"
+ VALUE "InternalName", "fitpad" "\0"
+ VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0"
+ VALUE "OriginalFilename", "fitpad.exe" "\0"
+ VALUE "ProductName", "fitpad" "\0"
+ VALUE "ProductVersion", VERSION_AS_STRING "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
+#endif // English (United States) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp
new file mode 100644
index 0000000..3a11b51
--- /dev/null
+++ b/windows/runner/flutter_window.cpp
@@ -0,0 +1,61 @@
+#include "flutter_window.h"
+
+#include
+
+#include "flutter/generated_plugin_registrant.h"
+
+FlutterWindow::FlutterWindow(const flutter::DartProject& project)
+ : project_(project) {}
+
+FlutterWindow::~FlutterWindow() {}
+
+bool FlutterWindow::OnCreate() {
+ if (!Win32Window::OnCreate()) {
+ return false;
+ }
+
+ RECT frame = GetClientArea();
+
+ // The size here must match the window dimensions to avoid unnecessary surface
+ // creation / destruction in the startup path.
+ flutter_controller_ = std::make_unique(
+ frame.right - frame.left, frame.bottom - frame.top, project_);
+ // Ensure that basic setup of the controller was successful.
+ if (!flutter_controller_->engine() || !flutter_controller_->view()) {
+ return false;
+ }
+ RegisterPlugins(flutter_controller_->engine());
+ SetChildContent(flutter_controller_->view()->GetNativeWindow());
+ return true;
+}
+
+void FlutterWindow::OnDestroy() {
+ if (flutter_controller_) {
+ flutter_controller_ = nullptr;
+ }
+
+ Win32Window::OnDestroy();
+}
+
+LRESULT
+FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept {
+ // Give Flutter, including plugins, an opportunity to handle window messages.
+ if (flutter_controller_) {
+ std::optional result =
+ flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,
+ lparam);
+ if (result) {
+ return *result;
+ }
+ }
+
+ switch (message) {
+ case WM_FONTCHANGE:
+ flutter_controller_->engine()->ReloadSystemFonts();
+ break;
+ }
+
+ return Win32Window::MessageHandler(hwnd, message, wparam, lparam);
+}
diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h
new file mode 100644
index 0000000..28c2383
--- /dev/null
+++ b/windows/runner/flutter_window.h
@@ -0,0 +1,33 @@
+#ifndef RUNNER_FLUTTER_WINDOW_H_
+#define RUNNER_FLUTTER_WINDOW_H_
+
+#include
+#include
+
+#include
+
+#include "win32_window.h"
+
+// A window that does nothing but host a Flutter view.
+class FlutterWindow : public Win32Window {
+ public:
+ // Creates a new FlutterWindow hosting a Flutter view running |project|.
+ explicit FlutterWindow(const flutter::DartProject& project);
+ virtual ~FlutterWindow();
+
+ protected:
+ // Win32Window:
+ bool OnCreate() override;
+ void OnDestroy() override;
+ LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,
+ LPARAM const lparam) noexcept override;
+
+ private:
+ // The project to run.
+ flutter::DartProject project_;
+
+ // The Flutter instance hosted by this window.
+ std::unique_ptr flutter_controller_;
+};
+
+#endif // RUNNER_FLUTTER_WINDOW_H_
diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp
new file mode 100644
index 0000000..e3b37fe
--- /dev/null
+++ b/windows/runner/main.cpp
@@ -0,0 +1,43 @@
+#include
+#include
+#include
+
+#include "flutter_window.h"
+#include "utils.h"
+
+int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
+ _In_ wchar_t *command_line, _In_ int show_command) {
+ // Attach to console when present (e.g., 'flutter run') or create a
+ // new console when running with a debugger.
+ if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
+ CreateAndAttachConsole();
+ }
+
+ // Initialize COM, so that it is available for use in the library and/or
+ // plugins.
+ ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
+
+ flutter::DartProject project(L"data");
+
+ std::vector command_line_arguments =
+ GetCommandLineArguments();
+
+ project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
+
+ FlutterWindow window(project);
+ Win32Window::Point origin(10, 10);
+ Win32Window::Size size(1280, 720);
+ if (!window.CreateAndShow(L"fitpad", origin, size)) {
+ return EXIT_FAILURE;
+ }
+ window.SetQuitOnClose(true);
+
+ ::MSG msg;
+ while (::GetMessage(&msg, nullptr, 0, 0)) {
+ ::TranslateMessage(&msg);
+ ::DispatchMessage(&msg);
+ }
+
+ ::CoUninitialize();
+ return EXIT_SUCCESS;
+}
diff --git a/windows/runner/resource.h b/windows/runner/resource.h
new file mode 100644
index 0000000..ddc7f3e
--- /dev/null
+++ b/windows/runner/resource.h
@@ -0,0 +1,16 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by Runner.rc
+//
+#define IDI_APP_ICON 101
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 102
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico
new file mode 100644
index 0000000..c04e20c
Binary files /dev/null and b/windows/runner/resources/app_icon.ico differ
diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest
new file mode 100644
index 0000000..157e871
--- /dev/null
+++ b/windows/runner/runner.exe.manifest
@@ -0,0 +1,20 @@
+
+
+
+
+ PerMonitorV2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+