From 3829a3d42d9a17395f644438282570449ec63c51 Mon Sep 17 00:00:00 2001 From: Viraj Dhanushka <59219626+viradhanus@users.noreply.github.com> Date: Sat, 21 Mar 2020 15:09:07 +0530 Subject: [PATCH 01/25] Create flutter_app --- flutter_app | 1 + 1 file changed, 1 insertion(+) create mode 100644 flutter_app diff --git a/flutter_app b/flutter_app new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/flutter_app @@ -0,0 +1 @@ + From 850f83258cf4ee5a3e7badf71c395d1f91e22c45 Mon Sep 17 00:00:00 2001 From: Viraj Dhanushka <59219626+viradhanus@users.noreply.github.com> Date: Sat, 21 Mar 2020 15:09:33 +0530 Subject: [PATCH 02/25] Delete flutter_app --- flutter_app | 1 - 1 file changed, 1 deletion(-) delete mode 100644 flutter_app diff --git a/flutter_app b/flutter_app deleted file mode 100644 index 8b13789..0000000 --- a/flutter_app +++ /dev/null @@ -1 +0,0 @@ - From 5e6d7d52a589fc04b4649662e323a80229a12680 Mon Sep 17 00:00:00 2001 From: Viraj Dhanushka <59219626+viradhanus@users.noreply.github.com> Date: Sat, 21 Mar 2020 15:17:31 +0530 Subject: [PATCH 03/25] Create README.md --- Flutter-App/README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Flutter-App/README.md diff --git a/Flutter-App/README.md b/Flutter-App/README.md new file mode 100644 index 0000000..9a7e38e --- /dev/null +++ b/Flutter-App/README.md @@ -0,0 +1,16 @@ +# Diseases-Stop + +This project will be used to stop dengue spread in the society. After the complete and successful implementation for that issue, the project will be extended to prevent othe diseases as well. Therefore the project name will be used as **Diseases-Stop**. + +Access the complete project use the bellow link. + +- [Diseases-Stop Project](https://github.com/viradhanus/Diseases-Stop) + + +## Getting Started + +This is a simple login and registration screens for the flutter app, dengue-stop. Previous logo of the react native app is used as the main logo of the flutter app. **Hero animation** is used to enhance UX. + +For more information use the bellow link. + +- [ScoreLab - Dengue-Stop Project](https://github.com/scorelab/dengue-stop) From f70ad14a261da1c5105aa13f58d60e8b3c3c11c4 Mon Sep 17 00:00:00 2001 From: Viraj Dhanushka <59219626+viradhanus@users.noreply.github.com> Date: Sat, 21 Mar 2020 15:19:39 +0530 Subject: [PATCH 04/25] Add files via upload --- Flutter-App/.gitignore | 37 +++++++ Flutter-App/.metadata | 10 ++ Flutter-App/.packages | 30 ++++++ Flutter-App/denguestop.iml | 19 ++++ Flutter-App/pubspec.lock | 195 +++++++++++++++++++++++++++++++++++++ Flutter-App/pubspec.yaml | 23 +++++ 6 files changed, 314 insertions(+) create mode 100644 Flutter-App/.gitignore create mode 100644 Flutter-App/.metadata create mode 100644 Flutter-App/.packages create mode 100644 Flutter-App/denguestop.iml create mode 100644 Flutter-App/pubspec.lock create mode 100644 Flutter-App/pubspec.yaml diff --git a/Flutter-App/.gitignore b/Flutter-App/.gitignore new file mode 100644 index 0000000..ac246c1 --- /dev/null +++ b/Flutter-App/.gitignore @@ -0,0 +1,37 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# 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/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Exceptions to above rules. +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/Flutter-App/.metadata b/Flutter-App/.metadata new file mode 100644 index 0000000..d05b6c3 --- /dev/null +++ b/Flutter-App/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 0b8abb4724aa590dd0f429683339b1e045a1594d + channel: stable + +project_type: app diff --git a/Flutter-App/.packages b/Flutter-App/.packages new file mode 100644 index 0000000..1929c13 --- /dev/null +++ b/Flutter-App/.packages @@ -0,0 +1,30 @@ +# Generated by pub on 2020-03-21 12:21:52.573705. +archive:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/archive-2.0.11/lib/ +args:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/args-1.5.2/lib/ +async:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.4.0/lib/ +boolean_selector:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.5/lib/ +charcode:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.2/lib/ +collection:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.14.11/lib/ +convert:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/convert-2.1.1/lib/ +crypto:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-2.1.3/lib/ +cupertino_icons:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-0.1.3/lib/ +flutter:file:///C:/src/flutter/flutter/packages/flutter/lib/ +flutter_test:file:///C:/src/flutter/flutter/packages/flutter_test/lib/ +image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/image-2.1.4/lib/ +matcher:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.6/lib/ +meta:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.1.8/lib/ +path:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.6.4/lib/ +pedantic:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.8.0+1/lib/ +petitparser:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-2.4.0/lib/ +quiver:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/quiver-2.0.5/lib/ +sky_engine:file:///C:/src/flutter/flutter/bin/cache/pkg/sky_engine/lib/ +source_span:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.5.5/lib/ +stack_trace:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.9.3/lib/ +stream_channel:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.0.0/lib/ +string_scanner:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.5/lib/ +term_glyph:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.1.0/lib/ +test_api:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.2.11/lib/ +typed_data:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.6/lib/ +vector_math:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.0.8/lib/ +xml:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/xml-3.5.0/lib/ +dengue_stop:lib/ diff --git a/Flutter-App/denguestop.iml b/Flutter-App/denguestop.iml new file mode 100644 index 0000000..066e058 --- /dev/null +++ b/Flutter-App/denguestop.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Flutter-App/pubspec.lock b/Flutter-App/pubspec.lock new file mode 100644 index 0000000..fcf6763 --- /dev/null +++ b/Flutter-App/pubspec.lock @@ -0,0 +1,195 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.2" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.14.11" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + image: + dependency: transitive + description: + name: image + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.4" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.6" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.8" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.4" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0+1" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.5" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.3" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.11" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "3.5.0" +sdks: + dart: ">=2.4.0 <3.0.0" diff --git a/Flutter-App/pubspec.yaml b/Flutter-App/pubspec.yaml new file mode 100644 index 0000000..0fd37e2 --- /dev/null +++ b/Flutter-App/pubspec.yaml @@ -0,0 +1,23 @@ +name: dengue_stop +description: A new Flutter application for stop dengue + +version: 1.0.0+1 + +environment: + sdk: ">=2.1.0<3.0.0" + +dependencies: + flutter: + sdk: flutter + + cupertino_icons: ^0.1.2 + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + uses-material-design: true + + assets: + - images/ From f91f907d7ca32400967b03790c9e05d13a6f96b7 Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Sat, 21 Mar 2020 16:28:00 +0530 Subject: [PATCH 05/25] updated --- Flutter-App/android/.gitignore | 7 + Flutter-App/android/app/build.gradle | 61 +++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 30 + .../com/scorelab/denguestop/MainActivity.java | 13 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 8 + .../app/src/profile/AndroidManifest.xml | 7 + Flutter-App/android/build.gradle | 29 + Flutter-App/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + Flutter-App/android/settings.gradle | 15 + Flutter-App/images/logo.png | Bin 0 -> 43401 bytes Flutter-App/ios/.gitignore | 32 ++ .../ios/Flutter/AppFrameworkInfo.plist | 26 + Flutter-App/ios/Flutter/Debug.xcconfig | 1 + Flutter-App/ios/Flutter/Release.xcconfig | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 518 ++++++++++++++++++ .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 7 + Flutter-App/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ .../ios/Runner/Base.lproj/Main.storyboard | 26 + Flutter-App/ios/Runner/Info.plist | 45 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../lib/components/rounded_button.dart | 36 ++ Flutter-App/lib/constants.dart | 18 + Flutter-App/lib/main.dart | 25 + Flutter-App/lib/screens/login_screen.dart | 62 +++ Flutter-App/lib/screens/main_screen.dart | 46 ++ .../lib/screens/registration_screen.dart | 65 +++ Flutter-App/lib/screens/welcome_screen.dart | 65 +++ 58 files changed, 1464 insertions(+) create mode 100644 Flutter-App/android/.gitignore create mode 100644 Flutter-App/android/app/build.gradle create mode 100644 Flutter-App/android/app/src/debug/AndroidManifest.xml create mode 100644 Flutter-App/android/app/src/main/AndroidManifest.xml create mode 100644 Flutter-App/android/app/src/main/java/com/scorelab/denguestop/MainActivity.java create mode 100644 Flutter-App/android/app/src/main/res/drawable/launch_background.xml create mode 100644 Flutter-App/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 Flutter-App/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 Flutter-App/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 Flutter-App/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 Flutter-App/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 Flutter-App/android/app/src/main/res/values/styles.xml create mode 100644 Flutter-App/android/app/src/profile/AndroidManifest.xml create mode 100644 Flutter-App/android/build.gradle create mode 100644 Flutter-App/android/gradle.properties create mode 100644 Flutter-App/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 Flutter-App/android/settings.gradle create mode 100644 Flutter-App/images/logo.png create mode 100644 Flutter-App/ios/.gitignore create mode 100644 Flutter-App/ios/Flutter/AppFrameworkInfo.plist create mode 100644 Flutter-App/ios/Flutter/Debug.xcconfig create mode 100644 Flutter-App/ios/Flutter/Release.xcconfig create mode 100644 Flutter-App/ios/Runner.xcodeproj/project.pbxproj create mode 100644 Flutter-App/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 Flutter-App/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 Flutter-App/ios/Runner/AppDelegate.swift create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 Flutter-App/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 Flutter-App/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 Flutter-App/ios/Runner/Base.lproj/Main.storyboard create mode 100644 Flutter-App/ios/Runner/Info.plist create mode 100644 Flutter-App/ios/Runner/Runner-Bridging-Header.h create mode 100644 Flutter-App/lib/components/rounded_button.dart create mode 100644 Flutter-App/lib/constants.dart create mode 100644 Flutter-App/lib/main.dart create mode 100644 Flutter-App/lib/screens/login_screen.dart create mode 100644 Flutter-App/lib/screens/main_screen.dart create mode 100644 Flutter-App/lib/screens/registration_screen.dart create mode 100644 Flutter-App/lib/screens/welcome_screen.dart diff --git a/Flutter-App/android/.gitignore b/Flutter-App/android/.gitignore new file mode 100644 index 0000000..bc2100d --- /dev/null +++ b/Flutter-App/android/.gitignore @@ -0,0 +1,7 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java diff --git a/Flutter-App/android/app/build.gradle b/Flutter-App/android/app/build.gradle new file mode 100644 index 0000000..eadc62f --- /dev/null +++ b/Flutter-App/android/app/build.gradle @@ -0,0 +1,61 @@ +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 from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 29 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.scorelab.denguestop" + minSdkVersion 28 + targetSdkVersion 29 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + 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 { + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' +} diff --git a/Flutter-App/android/app/src/debug/AndroidManifest.xml b/Flutter-App/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..c5d65b8 --- /dev/null +++ b/Flutter-App/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/Flutter-App/android/app/src/main/AndroidManifest.xml b/Flutter-App/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..51c93fe --- /dev/null +++ b/Flutter-App/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/Flutter-App/android/app/src/main/java/com/scorelab/denguestop/MainActivity.java b/Flutter-App/android/app/src/main/java/com/scorelab/denguestop/MainActivity.java new file mode 100644 index 0000000..770396e --- /dev/null +++ b/Flutter-App/android/app/src/main/java/com/scorelab/denguestop/MainActivity.java @@ -0,0 +1,13 @@ +package com.scorelab.denguestop; + +import androidx.annotation.NonNull; +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class MainActivity extends FlutterActivity { + @Override + public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { + GeneratedPluginRegistrant.registerWith(flutterEngine); + } +} diff --git a/Flutter-App/android/app/src/main/res/drawable/launch_background.xml b/Flutter-App/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/Flutter-App/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/Flutter-App/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/Flutter-App/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/Flutter-App/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/Flutter-App/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/Flutter-App/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/Flutter-App/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/Flutter-App/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/Flutter-App/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/Flutter-App/android/app/src/main/res/values/styles.xml b/Flutter-App/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..00fa441 --- /dev/null +++ b/Flutter-App/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/Flutter-App/android/app/src/profile/AndroidManifest.xml b/Flutter-App/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..c5d65b8 --- /dev/null +++ b/Flutter-App/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/Flutter-App/android/build.gradle b/Flutter-App/android/build.gradle new file mode 100644 index 0000000..83f114c --- /dev/null +++ b/Flutter-App/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.6.1' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/Flutter-App/android/gradle.properties b/Flutter-App/android/gradle.properties new file mode 100644 index 0000000..38c8d45 --- /dev/null +++ b/Flutter-App/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/Flutter-App/android/gradle/wrapper/gradle-wrapper.properties b/Flutter-App/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..7d3bc58 --- /dev/null +++ b/Flutter-App/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Mar 21 11:27:00 IST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip diff --git a/Flutter-App/android/settings.gradle b/Flutter-App/android/settings.gradle new file mode 100644 index 0000000..5a2f14f --- /dev/null +++ b/Flutter-App/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/Flutter-App/images/logo.png b/Flutter-App/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6f3aa4665904a78f1e0b2c4f59bb93ad26ff1392 GIT binary patch literal 43401 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 + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/Flutter-App/ios/Flutter/Debug.xcconfig b/Flutter-App/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/Flutter-App/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/Flutter-App/ios/Flutter/Release.xcconfig b/Flutter-App/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/Flutter-App/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/Flutter-App/ios/Runner.xcodeproj/project.pbxproj b/Flutter-App/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..9db75b3 --- /dev/null +++ b/Flutter-App/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,518 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 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 = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + 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 = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; 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 = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 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 */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + 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\" 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; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.scorelab.denguestop; + 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; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.scorelab.denguestop; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.scorelab.denguestop; + 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/Flutter-App/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/Flutter-App/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..a28140c --- /dev/null +++ b/Flutter-App/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Flutter-App/ios/Runner.xcworkspace/contents.xcworkspacedata b/Flutter-App/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/Flutter-App/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Flutter-App/ios/Runner/AppDelegate.swift b/Flutter-App/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..70693e4 --- /dev/null +++ b/Flutter-App/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/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/Flutter-App/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/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/Flutter-App/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/Flutter-App/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/Flutter-App/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/Flutter-App/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/Flutter-App/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/Flutter-App/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/Flutter-App/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/Flutter-App/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/Flutter-App/ios/Runner/Base.lproj/LaunchScreen.storyboard b/Flutter-App/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/Flutter-App/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Flutter-App/ios/Runner/Base.lproj/Main.storyboard b/Flutter-App/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/Flutter-App/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Flutter-App/ios/Runner/Info.plist b/Flutter-App/ios/Runner/Info.plist new file mode 100644 index 0000000..de3adcd --- /dev/null +++ b/Flutter-App/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + denguestop + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/Flutter-App/ios/Runner/Runner-Bridging-Header.h b/Flutter-App/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..7335fdf --- /dev/null +++ b/Flutter-App/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" \ No newline at end of file diff --git a/Flutter-App/lib/components/rounded_button.dart b/Flutter-App/lib/components/rounded_button.dart new file mode 100644 index 0000000..3c5f165 --- /dev/null +++ b/Flutter-App/lib/components/rounded_button.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +class RoundedButton extends StatelessWidget { + RoundedButton({ + this.title, + this.color, + @required this.onPressed, + }); + + final Color color; + final String title; + final Function onPressed; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(vertical: 16.0), + child: Material( + color: color, + borderRadius: BorderRadius.circular(30.0), + elevation: 5.0, + child: MaterialButton( + onPressed: onPressed, + minWidth: 200.0, + height: 42.0, + child: Text( + title, + style: TextStyle( + color: Colors.white, + ), + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/Flutter-App/lib/constants.dart b/Flutter-App/lib/constants.dart new file mode 100644 index 0000000..068d640 --- /dev/null +++ b/Flutter-App/lib/constants.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; + + +const kTextFieldDecoration = InputDecoration( + hintText: '', + contentPadding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), + border: OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(32.0)), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.blueAccent, width: 1.0), + borderRadius: BorderRadius.all(Radius.circular(32.0)), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.blueAccent, width: 2.0), + borderRadius: BorderRadius.all(Radius.circular(32.0)), + ), +); diff --git a/Flutter-App/lib/main.dart b/Flutter-App/lib/main.dart new file mode 100644 index 0000000..aaab460 --- /dev/null +++ b/Flutter-App/lib/main.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:dengue_stop/screens/welcome_screen.dart'; +import 'package:dengue_stop/screens/login_screen.dart'; +import 'package:dengue_stop/screens/registration_screen.dart'; +import 'package:dengue_stop/screens/main_screen.dart'; + + +void main() => runApp(FlashChat()); + +class FlashChat extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + + initialRoute: WelcomeScreen.id, + routes: { + WelcomeScreen.id:(context) => WelcomeScreen(), + LoginScreen.id:(context) => LoginScreen(), + RegistrationScreen.id:(context) => RegistrationScreen(), + MainScreen.id:(context) => MainScreen(), + }, + + ); + } +} diff --git a/Flutter-App/lib/screens/login_screen.dart b/Flutter-App/lib/screens/login_screen.dart new file mode 100644 index 0000000..064d90f --- /dev/null +++ b/Flutter-App/lib/screens/login_screen.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; +import 'package:dengue_stop/components/rounded_button.dart'; +import 'package:dengue_stop/constants.dart'; + +class LoginScreen extends StatefulWidget { + static const String id = "logins"; + + @override + _LoginScreenState createState() => _LoginScreenState(); +} + +class _LoginScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Hero( + tag: 'logo', + child: Container( + height: 200.0, + child: Image.asset('images/logo.png'), + ), + ), + SizedBox( + height: 48.0, + ), + TextField( + onChanged: (value) { + //Do something with the user input. + }, + decoration: kTextFieldDecoration.copyWith(hintText: 'Enter your email'), + ), + SizedBox( + height: 8.0, + ), + TextField( + onChanged: (value) { + //Do something with the user input. + }, + decoration: kTextFieldDecoration.copyWith(hintText: 'Enter your password.'), + ), + SizedBox( + height: 24.0, + ), + RoundedButton( + title: 'Log In', + color: Colors.lightBlueAccent, + onPressed: () { + }, + ), + ], + ), + ), + ); + } +} diff --git a/Flutter-App/lib/screens/main_screen.dart b/Flutter-App/lib/screens/main_screen.dart new file mode 100644 index 0000000..4523bc9 --- /dev/null +++ b/Flutter-App/lib/screens/main_screen.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:dengue_stop/constants.dart'; + +class MainScreen extends StatefulWidget { + static const String id = "main"; + + @override + _MainScreenState createState() => _MainScreenState(); +} + +class _MainScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: null, + actions: [ + IconButton( + icon: Icon(Icons.close), + onPressed: () { + //Implement logout functionality + }), + ], + title: Text('Main Screen'), + backgroundColor: Colors.lightBlueAccent, + ), + body: Padding( + padding: EdgeInsets.only(top: 250.0, left: 40.0), + child: Column( + children: [ + Center( + child: Text( + 'Dengue Stop main functionality will be implement here', + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.w500, + ), + ), + ), + + ], + ), + ) + ); + } +} diff --git a/Flutter-App/lib/screens/registration_screen.dart b/Flutter-App/lib/screens/registration_screen.dart new file mode 100644 index 0000000..3e40256 --- /dev/null +++ b/Flutter-App/lib/screens/registration_screen.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:dengue_stop/components/rounded_button.dart'; +import 'package:dengue_stop/constants.dart'; +import 'package:dengue_stop/screens/main_screen.dart'; + +class RegistrationScreen extends StatefulWidget { + static const String id = "registrations"; + + @override + _RegistrationScreenState createState() => _RegistrationScreenState(); +} + +class _RegistrationScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Hero( + tag: 'logo', + child: Container( + height: 200.0, + child: Image.asset('images/logo.png'), + ), + ), + SizedBox( + height: 48.0, + ), + TextField( + onChanged: (value) { + //Do something with the user input. + }, + decoration: kTextFieldDecoration.copyWith(hintText: 'Enter your email'), + ), + SizedBox( + height: 8.0, + ), + TextField( + onChanged: (value) { + //Do something with the user input. + }, + decoration: kTextFieldDecoration.copyWith(hintText: 'Enter your password'), + ), + SizedBox( + height: 24.0, + ), + RoundedButton( + title: 'Register', + color: Colors.blueAccent, + onPressed: () { + Navigator.pushNamed(context, MainScreen.id); + //Implement registration functionality. + }, + ), + ], + ), + ), + ); + } +} diff --git a/Flutter-App/lib/screens/welcome_screen.dart b/Flutter-App/lib/screens/welcome_screen.dart new file mode 100644 index 0000000..581d0c2 --- /dev/null +++ b/Flutter-App/lib/screens/welcome_screen.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'login_screen.dart'; +import 'registration_screen.dart'; +import 'package:dengue_stop/components/rounded_button.dart'; + +class WelcomeScreen extends StatefulWidget { + static const String id = "welcomes"; + + @override + _WelcomeScreenState createState() => _WelcomeScreenState(); +} + +class _WelcomeScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + Hero( + tag: 'logo', + child: Container( + child: Image.asset('images/logo.png'), + height: 60.0, + ), + ), + Text( + 'Dengue Stop', + style: TextStyle( + fontSize: 45.0, + fontWeight: FontWeight.w900, + ), + ), + ], + ), + SizedBox( + height: 48.0, + ), + RoundedButton( + title: 'Log In', + color: Colors.lightBlueAccent, + onPressed: () { + Navigator.pushNamed(context, LoginScreen.id); + }, + ), + RoundedButton( + title: 'Register', + color: Colors.blueAccent, + onPressed: () { + Navigator.pushNamed(context, RegistrationScreen.id); + }, + ), + ], + ), + ), + ); + } +} + From 0932a78c8096de421fb2c619003f7a9376bc698d Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Sat, 21 Mar 2020 20:16:34 +0530 Subject: [PATCH 06/25] Update README.md --- Flutter-App/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Flutter-App/README.md b/Flutter-App/README.md index 9a7e38e..ca47d59 100644 --- a/Flutter-App/README.md +++ b/Flutter-App/README.md @@ -11,6 +11,8 @@ Access the complete project use the bellow link. This is a simple login and registration screens for the flutter app, dengue-stop. Previous logo of the react native app is used as the main logo of the flutter app. **Hero animation** is used to enhance UX. +Firebase authentication is used to authenticate users to the app. Users trying to log in with badly formated emails will be rejected and they should enter atleast 6 characters as a password. + For more information use the bellow link. - [ScoreLab - Dengue-Stop Project](https://github.com/scorelab/dengue-stop) From 2b1d4f6641a18166a537cb9e9e402fbd6b851644 Mon Sep 17 00:00:00 2001 From: Viraj Dhanushka <59219626+viradhanus@users.noreply.github.com> Date: Sat, 21 Mar 2020 20:18:56 +0530 Subject: [PATCH 07/25] Update README.md --- Flutter-App/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flutter-App/README.md b/Flutter-App/README.md index ca47d59..bc0ae4f 100644 --- a/Flutter-App/README.md +++ b/Flutter-App/README.md @@ -11,7 +11,7 @@ Access the complete project use the bellow link. This is a simple login and registration screens for the flutter app, dengue-stop. Previous logo of the react native app is used as the main logo of the flutter app. **Hero animation** is used to enhance UX. -Firebase authentication is used to authenticate users to the app. Users trying to log in with badly formated emails will be rejected and they should enter atleast 6 characters as a password. +Firebase authentication is used to authenticate users to the app. Users trying to log in with badly-formated email address will be rejected and they should enter atleast 6 characters as a password to log in to the app. For more information use the bellow link. From a56dc3cbed9b1020393b53ceec6489eed294541a Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Sat, 21 Mar 2020 21:47:27 +0530 Subject: [PATCH 08/25] firebase auth added --- Flutter-App/.packages | 13 +++- Flutter-App/android/app/build.gradle | 3 + Flutter-App/android/app/google-services.json | 40 ++++++++++ Flutter-App/android/build.gradle | 1 + Flutter-App/lib/screens/login_screen.dart | 27 +++++-- Flutter-App/lib/screens/main_screen.dart | 24 +++++- .../lib/screens/registration_screen.dart | 31 ++++++-- Flutter-App/pubspec.lock | 78 ++++++++++++++++++- Flutter-App/pubspec.yaml | 3 + 9 files changed, 207 insertions(+), 13 deletions(-) create mode 100644 Flutter-App/android/app/google-services.json diff --git a/Flutter-App/.packages b/Flutter-App/.packages index 1929c13..9326a1b 100644 --- a/Flutter-App/.packages +++ b/Flutter-App/.packages @@ -1,21 +1,32 @@ -# Generated by pub on 2020-03-21 12:21:52.573705. +# Generated by pub on 2020-03-21 21:08:21.182221. archive:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/archive-2.0.11/lib/ args:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/args-1.5.2/lib/ async:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.4.0/lib/ boolean_selector:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.5/lib/ charcode:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.2/lib/ +cloud_firestore:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.12.11/lib/ collection:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.14.11/lib/ convert:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/convert-2.1.1/lib/ crypto:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-2.1.3/lib/ cupertino_icons:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-0.1.3/lib/ +firebase:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-7.2.1/lib/ +firebase_auth:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.14.0+9/lib/ +firebase_core:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.4.4+3/lib/ +firebase_core_platform_interface:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-1.0.4/lib/ +firebase_core_web:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.1.1+2/lib/ flutter:file:///C:/src/flutter/flutter/packages/flutter/lib/ flutter_test:file:///C:/src/flutter/flutter/packages/flutter_test/lib/ +flutter_web_plugins:file:///C:/src/flutter/flutter/packages/flutter_web_plugins/lib/ +http:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+4/lib/ +http_parser:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.3/lib/ image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/image-2.1.4/lib/ +js:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.1+1/lib/ matcher:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.6/lib/ meta:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.1.8/lib/ path:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.6.4/lib/ pedantic:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.8.0+1/lib/ petitparser:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-2.4.0/lib/ +plugin_platform_interface:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-1.0.2/lib/ quiver:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/quiver-2.0.5/lib/ sky_engine:file:///C:/src/flutter/flutter/bin/cache/pkg/sky_engine/lib/ source_span:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.5.5/lib/ diff --git a/Flutter-App/android/app/build.gradle b/Flutter-App/android/app/build.gradle index eadc62f..ef2fd6e 100644 --- a/Flutter-App/android/app/build.gradle +++ b/Flutter-App/android/app/build.gradle @@ -23,6 +23,7 @@ if (flutterVersionName == null) { apply plugin: 'com.android.application' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" +apply plugin: 'com.google.gms.google-services' android { compileSdkVersion 29 @@ -55,6 +56,8 @@ flutter { } dependencies { + implementation 'com.google.firebase:firebase-auth:19.3.0' + implementation 'com.google.firebase:firebase-firestore:21.4.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' diff --git a/Flutter-App/android/app/google-services.json b/Flutter-App/android/app/google-services.json new file mode 100644 index 0000000..b639d04 --- /dev/null +++ b/Flutter-App/android/app/google-services.json @@ -0,0 +1,40 @@ +{ + "project_info": { + "project_number": "402013291968", + "firebase_url": "https://dengue-stop-e74b4.firebaseio.com", + "project_id": "dengue-stop-e74b4", + "storage_bucket": "dengue-stop-e74b4.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:402013291968:android:abc78cf566c04f9a183425", + "android_client_info": { + "package_name": "com.scorelab.denguestop" + } + }, + "oauth_client": [ + { + "client_id": "402013291968-cfh6oosnpsfqrua776mu4ae1b6prlrtf.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCocAiWrtbqRYR8_J1-VJZjXFBZHQlrg1c" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "402013291968-cfh6oosnpsfqrua776mu4ae1b6prlrtf.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/Flutter-App/android/build.gradle b/Flutter-App/android/build.gradle index 83f114c..462ab77 100644 --- a/Flutter-App/android/build.gradle +++ b/Flutter-App/android/build.gradle @@ -6,6 +6,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.6.1' + classpath 'com.google.gms:google-services:4.3.3' } } diff --git a/Flutter-App/lib/screens/login_screen.dart b/Flutter-App/lib/screens/login_screen.dart index 064d90f..58de55f 100644 --- a/Flutter-App/lib/screens/login_screen.dart +++ b/Flutter-App/lib/screens/login_screen.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:dengue_stop/components/rounded_button.dart'; import 'package:dengue_stop/constants.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'main_screen.dart'; class LoginScreen extends StatefulWidget { static const String id = "logins"; @@ -10,6 +12,10 @@ class LoginScreen extends StatefulWidget { } class _LoginScreenState extends State { + final _auth = FirebaseAuth.instance; + String email; + String password; + @override Widget build(BuildContext context) { return Scaffold( @@ -32,18 +38,20 @@ class _LoginScreenState extends State { ), TextField( onChanged: (value) { - //Do something with the user input. + email = value; }, - decoration: kTextFieldDecoration.copyWith(hintText: 'Enter your email'), + decoration: + kTextFieldDecoration.copyWith(hintText: 'Enter your email'), ), SizedBox( height: 8.0, ), TextField( onChanged: (value) { - //Do something with the user input. + password = value; }, - decoration: kTextFieldDecoration.copyWith(hintText: 'Enter your password.'), + decoration: kTextFieldDecoration.copyWith( + hintText: 'Enter your password.'), ), SizedBox( height: 24.0, @@ -51,7 +59,16 @@ class _LoginScreenState extends State { RoundedButton( title: 'Log In', color: Colors.lightBlueAccent, - onPressed: () { + onPressed: () async { + try { + final user = await _auth.signInWithEmailAndPassword( + email: email, password: password); + if (user != null) { + Navigator.pushNamed(context, MainScreen.id); + } + } catch (e) { + print(e); + } }, ), ], diff --git a/Flutter-App/lib/screens/main_screen.dart b/Flutter-App/lib/screens/main_screen.dart index 4523bc9..ec5bd13 100644 --- a/Flutter-App/lib/screens/main_screen.dart +++ b/Flutter-App/lib/screens/main_screen.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:dengue_stop/constants.dart'; +import 'package:firebase_auth/firebase_auth.dart'; + class MainScreen extends StatefulWidget { static const String id = "main"; @@ -9,6 +11,25 @@ class MainScreen extends StatefulWidget { } class _MainScreenState extends State { + + final _auth = FirebaseAuth.instance; + FirebaseUser loggedInUser; + + @override + void initState() { + super.initState(); + getCurrentUser(); + } + + void getCurrentUser() async { + try { + final user = await _auth.currentUser(); + loggedInUser = user; + } catch (e) { + print(e); + } + } + @override Widget build(BuildContext context) { return Scaffold( @@ -18,7 +39,8 @@ class _MainScreenState extends State { IconButton( icon: Icon(Icons.close), onPressed: () { - //Implement logout functionality + _auth.signOut(); + Navigator.pop(context); }), ], title: Text('Main Screen'), diff --git a/Flutter-App/lib/screens/registration_screen.dart b/Flutter-App/lib/screens/registration_screen.dart index 3e40256..5398e74 100644 --- a/Flutter-App/lib/screens/registration_screen.dart +++ b/Flutter-App/lib/screens/registration_screen.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:dengue_stop/components/rounded_button.dart'; import 'package:dengue_stop/constants.dart'; import 'package:dengue_stop/screens/main_screen.dart'; +import 'package:firebase_auth/firebase_auth.dart'; + class RegistrationScreen extends StatefulWidget { static const String id = "registrations"; @@ -11,6 +13,11 @@ class RegistrationScreen extends StatefulWidget { } class _RegistrationScreenState extends State { + + final _auth = FirebaseAuth.instance; + String email; + String password; + @override Widget build(BuildContext context) { return Scaffold( @@ -32,8 +39,10 @@ class _RegistrationScreenState extends State { height: 48.0, ), TextField( + keyboardType: TextInputType.emailAddress, + textAlign: TextAlign.center, onChanged: (value) { - //Do something with the user input. + email = value; }, decoration: kTextFieldDecoration.copyWith(hintText: 'Enter your email'), ), @@ -41,8 +50,10 @@ class _RegistrationScreenState extends State { height: 8.0, ), TextField( + textAlign: TextAlign.center, + obscureText: true, onChanged: (value) { - //Do something with the user input. + password = value; }, decoration: kTextFieldDecoration.copyWith(hintText: 'Enter your password'), ), @@ -52,9 +63,19 @@ class _RegistrationScreenState extends State { RoundedButton( title: 'Register', color: Colors.blueAccent, - onPressed: () { - Navigator.pushNamed(context, MainScreen.id); - //Implement registration functionality. + + onPressed: () async { + try { + print(email); + print(password); + + final newUser = await _auth.createUserWithEmailAndPassword(email: email, password: password); + if(newUser != null){ + Navigator.pushNamed(context, MainScreen.id); + } + } catch (e) { + print(e); + } }, ), ], diff --git a/Flutter-App/pubspec.lock b/Flutter-App/pubspec.lock index fcf6763..96e9a4b 100644 --- a/Flutter-App/pubspec.lock +++ b/Flutter-App/pubspec.lock @@ -36,6 +36,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.2" + cloud_firestore: + dependency: "direct main" + description: + name: cloud_firestore + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.11" collection: dependency: transitive description: @@ -64,6 +71,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.3" + firebase: + dependency: transitive + description: + name: firebase + url: "https://pub.dartlang.org" + source: hosted + version: "7.2.1" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + url: "https://pub.dartlang.org" + source: hosted + version: "0.14.0+9" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.4+3" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1+2" flutter: dependency: "direct main" description: flutter @@ -74,6 +116,25 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.0+4" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.3" image: dependency: transitive description: @@ -81,6 +142,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.4" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.1+1" matcher: dependency: transitive description: @@ -116,6 +184,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" quiver: dependency: transitive description: @@ -192,4 +267,5 @@ packages: source: hosted version: "3.5.0" sdks: - dart: ">=2.4.0 <3.0.0" + dart: ">=2.7.0-dev <3.0.0" + flutter: ">=1.12.13+hotfix.4 <2.0.0" diff --git a/Flutter-App/pubspec.yaml b/Flutter-App/pubspec.yaml index 0fd37e2..21e16ea 100644 --- a/Flutter-App/pubspec.yaml +++ b/Flutter-App/pubspec.yaml @@ -11,6 +11,9 @@ dependencies: sdk: flutter cupertino_icons: ^0.1.2 + firebase_core: ^0.4.0+9 + firebase_auth: ^0.14.0+5 + cloud_firestore: ^0.12.9+5 dev_dependencies: flutter_test: From d9676e1cb6214515f64ef91fd8aa24610eb48625 Mon Sep 17 00:00:00 2001 From: Viraj Dhanushka <59219626+viradhanus@users.noreply.github.com> Date: Sat, 21 Mar 2020 21:48:57 +0530 Subject: [PATCH 09/25] Update README.md --- Flutter-App/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flutter-App/README.md b/Flutter-App/README.md index bc0ae4f..cb8403d 100644 --- a/Flutter-App/README.md +++ b/Flutter-App/README.md @@ -11,7 +11,7 @@ Access the complete project use the bellow link. This is a simple login and registration screens for the flutter app, dengue-stop. Previous logo of the react native app is used as the main logo of the flutter app. **Hero animation** is used to enhance UX. -Firebase authentication is used to authenticate users to the app. Users trying to log in with badly-formated email address will be rejected and they should enter atleast 6 characters as a password to log in to the app. +Firebase authentication is used to authenticate users to the app. Users trying to log in with badly-formated email address will be rejected and they should enter atleast 6 characters as a password to log in to the app. Logout button (**X**) is created in Main-Screen For more information use the bellow link. From c08eaeeac182a87d6e7c2231aee4dbc0449b656c Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Sun, 22 Mar 2020 08:55:24 +0530 Subject: [PATCH 10/25] Implement modal_progress_hud A flutter widget modal_progress_hud is used to improve user experience. --- Flutter-App/.packages | 3 +- Flutter-App/README.md | 2 +- Flutter-App/lib/screens/login_screen.dart | 120 +++++++++-------- .../lib/screens/registration_screen.dart | 126 ++++++++++-------- Flutter-App/pubspec.lock | 7 + Flutter-App/pubspec.yaml | 4 +- 6 files changed, 150 insertions(+), 112 deletions(-) diff --git a/Flutter-App/.packages b/Flutter-App/.packages index 9326a1b..4f7156f 100644 --- a/Flutter-App/.packages +++ b/Flutter-App/.packages @@ -1,4 +1,4 @@ -# Generated by pub on 2020-03-21 21:08:21.182221. +# Generated by pub on 2020-03-22 00:15:44.558222. archive:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/archive-2.0.11/lib/ args:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/args-1.5.2/lib/ async:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.4.0/lib/ @@ -23,6 +23,7 @@ image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/image-2. js:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.1+1/lib/ matcher:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.6/lib/ meta:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.1.8/lib/ +modal_progress_hud:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/modal_progress_hud-0.1.3/lib/ path:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.6.4/lib/ pedantic:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.8.0+1/lib/ petitparser:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-2.4.0/lib/ diff --git a/Flutter-App/README.md b/Flutter-App/README.md index cb8403d..8ea2ae9 100644 --- a/Flutter-App/README.md +++ b/Flutter-App/README.md @@ -11,7 +11,7 @@ Access the complete project use the bellow link. This is a simple login and registration screens for the flutter app, dengue-stop. Previous logo of the react native app is used as the main logo of the flutter app. **Hero animation** is used to enhance UX. -Firebase authentication is used to authenticate users to the app. Users trying to log in with badly-formated email address will be rejected and they should enter atleast 6 characters as a password to log in to the app. Logout button (**X**) is created in Main-Screen +Firebase authentication is used to authenticate users to the app. Users trying to log in with badly-formated email address will be rejected and they should enter atleast 6 characters as a password to log in to the app. Logout button (**X**) is created in Main-Screen. A flutter widget **modal_progress_hud** is used to improve user experience. For more information use the bellow link. diff --git a/Flutter-App/lib/screens/login_screen.dart b/Flutter-App/lib/screens/login_screen.dart index 58de55f..e4127fb 100644 --- a/Flutter-App/lib/screens/login_screen.dart +++ b/Flutter-App/lib/screens/login_screen.dart @@ -3,6 +3,7 @@ import 'package:dengue_stop/components/rounded_button.dart'; import 'package:dengue_stop/constants.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'main_screen.dart'; +import 'package:modal_progress_hud/modal_progress_hud.dart'; class LoginScreen extends StatefulWidget { static const String id = "logins"; @@ -12,6 +13,7 @@ class LoginScreen extends StatefulWidget { } class _LoginScreenState extends State { + bool showSpinner = false; final _auth = FirebaseAuth.instance; String email; String password; @@ -20,60 +22,74 @@ class _LoginScreenState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, - body: Padding( - padding: EdgeInsets.symmetric(horizontal: 24.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Hero( - tag: 'logo', - child: Container( - height: 200.0, - child: Image.asset('images/logo.png'), + body: ModalProgressHUD( + inAsyncCall: showSpinner, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Hero( + tag: 'logo', + child: Container( + height: 200.0, + child: Image.asset('images/logo.png'), + ), + ), + SizedBox( + height: 48.0, + ), + TextField( + textAlign: TextAlign.center, + onChanged: (value) { + email = value; + }, + decoration: kTextFieldDecoration.copyWith( + hintText: 'Enter your email'), + ), + SizedBox( + height: 8.0, + ), + TextField( + textAlign: TextAlign.center, + obscureText: true, + onChanged: (value) { + password = value; + }, + decoration: kTextFieldDecoration.copyWith( + hintText: 'Enter your password'), + ), + SizedBox( + height: 24.0, + ), + RoundedButton( + title: 'Log In', + color: Colors.lightBlueAccent, + onPressed: () async { + setState(() { + showSpinner = true; + }); + try { + final user = await _auth.signInWithEmailAndPassword( + email: email, password: password); + if (user != null) { + Navigator.pushNamed(context, MainScreen.id); + setState(() { + showSpinner = false; + }); + } + } catch (e) { + print(e); + } + }, + ), + ], ), ), - SizedBox( - height: 48.0, - ), - TextField( - onChanged: (value) { - email = value; - }, - decoration: - kTextFieldDecoration.copyWith(hintText: 'Enter your email'), - ), - SizedBox( - height: 8.0, - ), - TextField( - onChanged: (value) { - password = value; - }, - decoration: kTextFieldDecoration.copyWith( - hintText: 'Enter your password.'), - ), - SizedBox( - height: 24.0, - ), - RoundedButton( - title: 'Log In', - color: Colors.lightBlueAccent, - onPressed: () async { - try { - final user = await _auth.signInWithEmailAndPassword( - email: email, password: password); - if (user != null) { - Navigator.pushNamed(context, MainScreen.id); - } - } catch (e) { - print(e); - } - }, - ), - ], - ), - ), + ), + + ); } } diff --git a/Flutter-App/lib/screens/registration_screen.dart b/Flutter-App/lib/screens/registration_screen.dart index 5398e74..40d5f6a 100644 --- a/Flutter-App/lib/screens/registration_screen.dart +++ b/Flutter-App/lib/screens/registration_screen.dart @@ -3,7 +3,7 @@ import 'package:dengue_stop/components/rounded_button.dart'; import 'package:dengue_stop/constants.dart'; import 'package:dengue_stop/screens/main_screen.dart'; import 'package:firebase_auth/firebase_auth.dart'; - +import 'package:modal_progress_hud/modal_progress_hud.dart'; class RegistrationScreen extends StatefulWidget { static const String id = "registrations"; @@ -14,6 +14,7 @@ class RegistrationScreen extends StatefulWidget { class _RegistrationScreenState extends State { + bool showSpinner = false; final _auth = FirebaseAuth.instance; String email; String password; @@ -22,65 +23,78 @@ class _RegistrationScreenState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, - body: Padding( - padding: EdgeInsets.symmetric(horizontal: 24.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Hero( - tag: 'logo', - child: Container( - height: 200.0, - child: Image.asset('images/logo.png'), + body:ModalProgressHUD( + inAsyncCall: showSpinner, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Hero( + tag: 'logo', + child: Container( + height: 200.0, + child: Image.asset('images/logo.png'), + ), + ), + SizedBox( + height: 48.0, + ), + TextField( + keyboardType: TextInputType.emailAddress, + textAlign: TextAlign.center, + onChanged: (value) { + email = value; + }, + decoration: kTextFieldDecoration.copyWith( + hintText: 'Enter your email'), + ), + SizedBox( + height: 8.0, + ), + TextField( + textAlign: TextAlign.center, + obscureText: true, + onChanged: (value) { + password = value; + }, + decoration: kTextFieldDecoration.copyWith( + hintText: 'Enter your password'), + ), + SizedBox( + height: 24.0, + ), + RoundedButton( + title: 'Register', + color: Colors.blueAccent, + + onPressed: () async { + setState(() { + showSpinner = true; + }); + try { + final newUser = await _auth + .createUserWithEmailAndPassword( + email: email, password: password); + if (newUser != null) { + Navigator.pushNamed(context, MainScreen.id); + + setState(() { + showSpinner = false; + }); + } + } catch (e) { + print(e); + } + }, + ), + ], ), ), - SizedBox( - height: 48.0, - ), - TextField( - keyboardType: TextInputType.emailAddress, - textAlign: TextAlign.center, - onChanged: (value) { - email = value; - }, - decoration: kTextFieldDecoration.copyWith(hintText: 'Enter your email'), - ), - SizedBox( - height: 8.0, - ), - TextField( - textAlign: TextAlign.center, - obscureText: true, - onChanged: (value) { - password = value; - }, - decoration: kTextFieldDecoration.copyWith(hintText: 'Enter your password'), - ), - SizedBox( - height: 24.0, - ), - RoundedButton( - title: 'Register', - color: Colors.blueAccent, + ), - onPressed: () async { - try { - print(email); - print(password); - final newUser = await _auth.createUserWithEmailAndPassword(email: email, password: password); - if(newUser != null){ - Navigator.pushNamed(context, MainScreen.id); - } - } catch (e) { - print(e); - } - }, - ), - ], - ), - ), ); } } diff --git a/Flutter-App/pubspec.lock b/Flutter-App/pubspec.lock index 96e9a4b..8dc09b7 100644 --- a/Flutter-App/pubspec.lock +++ b/Flutter-App/pubspec.lock @@ -163,6 +163,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.8" + modal_progress_hud: + dependency: "direct main" + description: + name: modal_progress_hud + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" path: dependency: transitive description: diff --git a/Flutter-App/pubspec.yaml b/Flutter-App/pubspec.yaml index 21e16ea..ca7b4b4 100644 --- a/Flutter-App/pubspec.yaml +++ b/Flutter-App/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: firebase_core: ^0.4.0+9 firebase_auth: ^0.14.0+5 cloud_firestore: ^0.12.9+5 - + modal_progress_hud: ^0.1.3 dev_dependencies: flutter_test: sdk: flutter @@ -23,4 +23,4 @@ flutter: uses-material-design: true assets: - - images/ + - images/ From 80e8ff31832bd3320c1c4c757178bcc183b45cb0 Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Sun, 22 Mar 2020 11:50:17 +0530 Subject: [PATCH 11/25] implement bottom navigation --- Flutter-App/.packages | 3 +- Flutter-App/lib/screens/main_screen.dart | 75 +++++++++++++++++++----- Flutter-App/pubspec.lock | 7 +++ Flutter-App/pubspec.yaml | 2 + 4 files changed, 71 insertions(+), 16 deletions(-) diff --git a/Flutter-App/.packages b/Flutter-App/.packages index 4f7156f..6ccf9bc 100644 --- a/Flutter-App/.packages +++ b/Flutter-App/.packages @@ -1,4 +1,4 @@ -# Generated by pub on 2020-03-22 00:15:44.558222. +# Generated by pub on 2020-03-22 09:31:42.436886. archive:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/archive-2.0.11/lib/ args:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/args-1.5.2/lib/ async:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.4.0/lib/ @@ -9,6 +9,7 @@ collection:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/col convert:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/convert-2.1.1/lib/ crypto:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-2.1.3/lib/ cupertino_icons:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-0.1.3/lib/ +curved_navigation_bar:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/curved_navigation_bar-0.3.2/lib/ firebase:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-7.2.1/lib/ firebase_auth:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.14.0+9/lib/ firebase_core:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.4.4+3/lib/ diff --git a/Flutter-App/lib/screens/main_screen.dart b/Flutter-App/lib/screens/main_screen.dart index ec5bd13..00f9203 100644 --- a/Flutter-App/lib/screens/main_screen.dart +++ b/Flutter-App/lib/screens/main_screen.dart @@ -1,3 +1,4 @@ +import 'package:curved_navigation_bar/curved_navigation_bar.dart'; import 'package:flutter/material.dart'; import 'package:dengue_stop/constants.dart'; import 'package:firebase_auth/firebase_auth.dart'; @@ -29,24 +30,36 @@ class _MainScreenState extends State { print(e); } } + int _page = 0; + GlobalKey _bottomNavigationKey = GlobalKey(); @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - leading: null, - actions: [ - IconButton( - icon: Icon(Icons.close), - onPressed: () { - _auth.signOut(); - Navigator.pop(context); - }), - ], - title: Text('Main Screen'), - backgroundColor: Colors.lightBlueAccent, + appBar: AppBar( + leading: null, + iconTheme: IconThemeData( + color: Colors.white, //change color here ), - body: Padding( + actions: [ + IconButton( + icon: Icon(Icons.close), + onPressed: () { + _auth.signOut(); + Navigator.pop(context); + }), + ], + title: Text('Dengue Stop', + style: TextStyle( + color:Colors.white, + ) + ), + backgroundColor: Colors.blueAccent, + ), + body: Container( + color: Colors.white70, + + child: Padding( padding: EdgeInsets.only(top: 250.0, left: 40.0), child: Column( children: [ @@ -56,13 +69,45 @@ class _MainScreenState extends State { style: TextStyle( fontSize: 20.0, fontWeight: FontWeight.w500, + ), ), ), - +// Text(_page.toString(), textScaleFactor: 10.0), +// RaisedButton( +// child: Text('Go To Page of index 1'), +// onPressed: () { +// //Page change using state does the same as clicking index 1 navigation button +// final CurvedNavigationBarState navBarState = +// _bottomNavigationKey.currentState; +// navBarState.setPage(1); +// }, +// ) ], ), - ) + ), + ), + bottomNavigationBar: CurvedNavigationBar( + color: Colors.blueAccent, + backgroundColor: Colors.white70, + buttonBackgroundColor: Colors.blueAccent, + height: 50, + items: [ + Icon(Icons.home, size: 20, color: Colors.white,), + Icon(Icons.add, size: 20, color: Colors.white,), + Icon(Icons.map, size: 20, color: Colors.white,), + ], + animationDuration: Duration( + milliseconds: 200 + ), + animationCurve: Curves.bounceInOut, + onTap: (index){ + debugPrint("$index"); + setState(() { + _page = index; + }); + }, + ), ); } } diff --git a/Flutter-App/pubspec.lock b/Flutter-App/pubspec.lock index 8dc09b7..14d0df4 100644 --- a/Flutter-App/pubspec.lock +++ b/Flutter-App/pubspec.lock @@ -71,6 +71,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.3" + curved_navigation_bar: + dependency: "direct main" + description: + name: curved_navigation_bar + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.2" firebase: dependency: transitive description: diff --git a/Flutter-App/pubspec.yaml b/Flutter-App/pubspec.yaml index ca7b4b4..c37c46b 100644 --- a/Flutter-App/pubspec.yaml +++ b/Flutter-App/pubspec.yaml @@ -15,6 +15,8 @@ dependencies: firebase_auth: ^0.14.0+5 cloud_firestore: ^0.12.9+5 modal_progress_hud: ^0.1.3 + curved_navigation_bar: ^0.3.2 + dev_dependencies: flutter_test: sdk: flutter From 9087ec1051956cb35dda5796962d9698d6dd9ed4 Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Sun, 22 Mar 2020 12:05:10 +0530 Subject: [PATCH 12/25] Update main_screen.dart --- Flutter-App/lib/screens/main_screen.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Flutter-App/lib/screens/main_screen.dart b/Flutter-App/lib/screens/main_screen.dart index 00f9203..673fb99 100644 --- a/Flutter-App/lib/screens/main_screen.dart +++ b/Flutter-App/lib/screens/main_screen.dart @@ -92,9 +92,12 @@ class _MainScreenState extends State { backgroundColor: Colors.white70, buttonBackgroundColor: Colors.blueAccent, height: 50, + index: 2, items: [ Icon(Icons.home, size: 20, color: Colors.white,), + Icon(Icons.healing, size: 20, color: Colors.white,), Icon(Icons.add, size: 20, color: Colors.white,), + Icon(Icons.chat, size: 20, color: Colors.white,), Icon(Icons.map, size: 20, color: Colors.white,), ], animationDuration: Duration( From 9fc898df2f7e1fc50c69ed7c16f3ab35e29d334a Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Mon, 23 Mar 2020 01:47:07 +0530 Subject: [PATCH 13/25] create project strcture --- Flutter-App/lib/main.dart | 16 ++- Flutter-App/lib/screens/chat_screen.dart | 65 +++++++++++ Flutter-App/lib/screens/home_screen.dart | 35 ++++++ Flutter-App/lib/screens/main_screen.dart | 129 ++++++++++----------- Flutter-App/lib/screens/map_screen.dart | 35 ++++++ Flutter-App/lib/screens/post_screen.dart | 35 ++++++ Flutter-App/lib/screens/report_screen.dart | 34 ++++++ 7 files changed, 276 insertions(+), 73 deletions(-) create mode 100644 Flutter-App/lib/screens/chat_screen.dart create mode 100644 Flutter-App/lib/screens/home_screen.dart create mode 100644 Flutter-App/lib/screens/map_screen.dart create mode 100644 Flutter-App/lib/screens/post_screen.dart create mode 100644 Flutter-App/lib/screens/report_screen.dart diff --git a/Flutter-App/lib/main.dart b/Flutter-App/lib/main.dart index aaab460..1523740 100644 --- a/Flutter-App/lib/main.dart +++ b/Flutter-App/lib/main.dart @@ -1,23 +1,33 @@ +import 'package:dengue_stop/screens/map_screen.dart'; +import 'package:dengue_stop/screens/post_screen.dart'; +import 'package:dengue_stop/screens/report_screen.dart'; import 'package:flutter/material.dart'; +import 'package:dengue_stop/screens/chat_screen.dart'; +import 'package:dengue_stop/screens/home_screen.dart'; import 'package:dengue_stop/screens/welcome_screen.dart'; import 'package:dengue_stop/screens/login_screen.dart'; import 'package:dengue_stop/screens/registration_screen.dart'; import 'package:dengue_stop/screens/main_screen.dart'; -void main() => runApp(FlashChat()); +void main() => runApp(DengueStop()); -class FlashChat extends StatelessWidget { +class DengueStop extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( initialRoute: WelcomeScreen.id, routes: { + MainScreen.id:(context) => MainScreen(), WelcomeScreen.id:(context) => WelcomeScreen(), LoginScreen.id:(context) => LoginScreen(), RegistrationScreen.id:(context) => RegistrationScreen(), - MainScreen.id:(context) => MainScreen(), + HomeScreen.id:(context) => HomeScreen(), + ReportScreen.id:(context) => ReportScreen(), + PostScreen.id:(context) => PostScreen(), + ChatScreen.id:(context) => ChatScreen(), + MapScreen.id:(context) => MapScreen(), }, ); diff --git a/Flutter-App/lib/screens/chat_screen.dart b/Flutter-App/lib/screens/chat_screen.dart new file mode 100644 index 0000000..86a8e2b --- /dev/null +++ b/Flutter-App/lib/screens/chat_screen.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:dengue_stop/constants.dart'; + +class ChatScreen extends StatefulWidget { + + static const String id = "chats"; + + @override + _ChatScreenState createState() => _ChatScreenState(); +} + +class _ChatScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: null, + actions: [ + IconButton( + icon: Icon(Icons.close), + onPressed: () { + //Implement logout functionality + }), + ], + title: Text('Chat'), + backgroundColor: Colors.blueAccent, + + ), + body: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + +// Container( +// decoration: kMessageContainerDecoration, +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Expanded( +// child: TextField( +// onChanged: (value) { +// //Do something with the user input. +// }, +// decoration: kMessageTextFieldDecoration, +// ), +// ), +// FlatButton( +// onPressed: () { +// //Implement send functionality. +// }, +// child: Text( +// 'Send', +// style: kSendButtonTextStyle, +// ), +// ), +// ], +// ), +// ), + ], + ), + ), + ); + } +} diff --git a/Flutter-App/lib/screens/home_screen.dart b/Flutter-App/lib/screens/home_screen.dart new file mode 100644 index 0000000..36bdf13 --- /dev/null +++ b/Flutter-App/lib/screens/home_screen.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +class HomeScreen extends StatefulWidget { + static const String id = "home"; + + @override + _HomeScreenState createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + + appBar: AppBar( + leading: null, + iconTheme: IconThemeData( + color: Colors.white, //change color here + ), + actions: [ + IconButton( + icon: Icon(Icons.close), + onPressed: () { + Navigator.pop(context); + }), + ], + title: Text('Dengue Stop', + style: TextStyle( + color: Colors.white, + )), + backgroundColor: Colors.blueAccent, + ), + ); + } +} diff --git a/Flutter-App/lib/screens/main_screen.dart b/Flutter-App/lib/screens/main_screen.dart index 673fb99..4584d03 100644 --- a/Flutter-App/lib/screens/main_screen.dart +++ b/Flutter-App/lib/screens/main_screen.dart @@ -1,8 +1,12 @@ import 'package:curved_navigation_bar/curved_navigation_bar.dart'; +import 'package:dengue_stop/screens/home_screen.dart'; +import 'package:dengue_stop/screens/post_screen.dart'; +import 'package:dengue_stop/screens/report_screen.dart'; import 'package:flutter/material.dart'; import 'package:dengue_stop/constants.dart'; import 'package:firebase_auth/firebase_auth.dart'; - +import 'chat_screen.dart'; +import 'map_screen.dart'; class MainScreen extends StatefulWidget { static const String id = "main"; @@ -12,16 +16,9 @@ class MainScreen extends StatefulWidget { } class _MainScreenState extends State { - final _auth = FirebaseAuth.instance; FirebaseUser loggedInUser; - @override - void initState() { - super.initState(); - getCurrentUser(); - } - void getCurrentUser() async { try { final user = await _auth.currentUser(); @@ -30,84 +27,76 @@ class _MainScreenState extends State { print(e); } } - int _page = 0; - GlobalKey _bottomNavigationKey = GlobalKey(); + + + final PageController _pageController = PageController(); + @override + void initState() { + super.initState(); + getCurrentUser(); + } + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - leading: null, - iconTheme: IconThemeData( - color: Colors.white, //change color here - ), - actions: [ - IconButton( - icon: Icon(Icons.close), - onPressed: () { - _auth.signOut(); - Navigator.pop(context); - }), - ], - title: Text('Dengue Stop', - style: TextStyle( - color:Colors.white, - ) - ), - backgroundColor: Colors.blueAccent, - ), - body: Container( - color: Colors.white70, - child: Padding( - padding: EdgeInsets.only(top: 250.0, left: 40.0), - child: Column( - children: [ - Center( - child: Text( - 'Dengue Stop main functionality will be implement here', - style: TextStyle( - fontSize: 20.0, - fontWeight: FontWeight.w500, + body: PageView( + controller: _pageController, + children: [ + HomeScreen(), + ReportScreen(), + PostScreen(), + ChatScreen(), + MapScreen(), + ], + onPageChanged: (int index) { + setState(() { + _pageController.jumpToPage(index); + }); + }), + - ), - ), - ), -// Text(_page.toString(), textScaleFactor: 10.0), -// RaisedButton( -// child: Text('Go To Page of index 1'), -// onPressed: () { -// //Page change using state does the same as clicking index 1 navigation button -// final CurvedNavigationBarState navBarState = -// _bottomNavigationKey.currentState; -// navBarState.setPage(1); -// }, -// ) - ], - ), - ), - ), bottomNavigationBar: CurvedNavigationBar( color: Colors.blueAccent, backgroundColor: Colors.white70, buttonBackgroundColor: Colors.blueAccent, height: 50, - index: 2, + index: 0, items: [ - Icon(Icons.home, size: 20, color: Colors.white,), - Icon(Icons.healing, size: 20, color: Colors.white,), - Icon(Icons.add, size: 20, color: Colors.white,), - Icon(Icons.chat, size: 20, color: Colors.white,), - Icon(Icons.map, size: 20, color: Colors.white,), + Icon( + Icons.home, + size: 20, + color: Colors.white, + ), + Icon( + Icons.report, + size: 20, + color: Colors.white, + ), + Icon( + Icons.add, + size: 20, + color: Colors.white, + ), + Icon( + Icons.chat, + size: 20, + color: Colors.white, + ), + Icon( + Icons.map, + size: 20, + color: Colors.white, + ), ], - animationDuration: Duration( - milliseconds: 200 - ), + animationDuration: Duration(milliseconds: 200), animationCurve: Curves.bounceInOut, - onTap: (index){ + onTap: (index) { debugPrint("$index"); + setState(() { - _page = index; + _pageController.jumpToPage(index); }); }, ), diff --git a/Flutter-App/lib/screens/map_screen.dart b/Flutter-App/lib/screens/map_screen.dart new file mode 100644 index 0000000..1e27ce1 --- /dev/null +++ b/Flutter-App/lib/screens/map_screen.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +class MapScreen extends StatefulWidget { + static const String id = "map"; + + @override + _MapScreenState createState() => _MapScreenState(); +} + +class _MapScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + + appBar: AppBar( + leading: null, + iconTheme: IconThemeData( + color: Colors.white, //change color here + ), + actions: [ + IconButton( + icon: Icon(Icons.close), + onPressed: () { + Navigator.pop(context); + }), + ], + title: Text('Map', + style: TextStyle( + color: Colors.white, + )), + backgroundColor: Colors.blueAccent, + ), + ); + } +} diff --git a/Flutter-App/lib/screens/post_screen.dart b/Flutter-App/lib/screens/post_screen.dart new file mode 100644 index 0000000..c57b4ff --- /dev/null +++ b/Flutter-App/lib/screens/post_screen.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +class PostScreen extends StatefulWidget { + static const String id = "posts"; + + @override + _PostScreenState createState() => _PostScreenState(); +} + +class _PostScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + + appBar: AppBar( + leading: null, + iconTheme: IconThemeData( + color: Colors.white, //change color here + ), + actions: [ + IconButton( + icon: Icon(Icons.close), + onPressed: () { + Navigator.pop(context); + }), + ], + title: Text('Posts', + style: TextStyle( + color: Colors.white, + )), + backgroundColor: Colors.blueAccent, + ), + ); + } +} diff --git a/Flutter-App/lib/screens/report_screen.dart b/Flutter-App/lib/screens/report_screen.dart new file mode 100644 index 0000000..9eedc79 --- /dev/null +++ b/Flutter-App/lib/screens/report_screen.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +class ReportScreen extends StatefulWidget { + static const String id = "report"; + + @override + _ReportScreenState createState() => _ReportScreenState(); +} + +class _ReportScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: null, + iconTheme: IconThemeData( + color: Colors.white, //change color here + ), + actions: [ + IconButton( + icon: Icon(Icons.close), + onPressed: () { + Navigator.pop(context); + }), + ], + title: Text('Report', + style: TextStyle( + color: Colors.white, + )), + backgroundColor: Colors.blueAccent, + ), + ); + } +} From 5d7639a09cda6606bec4bc0176214febf3580d1a Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Mon, 23 Mar 2020 10:30:49 +0530 Subject: [PATCH 14/25] basic_chat_screen --- Flutter-App/lib/constants.dart | 17 ++++++++ Flutter-App/lib/screens/chat_screen.dart | 50 ++++++++++++------------ 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/Flutter-App/lib/constants.dart b/Flutter-App/lib/constants.dart index 068d640..fa68d07 100644 --- a/Flutter-App/lib/constants.dart +++ b/Flutter-App/lib/constants.dart @@ -1,5 +1,22 @@ import 'package:flutter/material.dart'; +const kSendButtonTextStyle = TextStyle( + color: Colors.lightBlueAccent, + fontWeight: FontWeight.bold, + fontSize: 18.0, +); + +const kMessageTextFieldDecoration = InputDecoration( + contentPadding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), + hintText: 'Type your message here...', + border: InputBorder.none, +); + +const kMessageContainerDecoration = BoxDecoration( + border: Border( + top: BorderSide(color: Colors.lightBlueAccent, width: 2.0), + ), +); const kTextFieldDecoration = InputDecoration( hintText: '', diff --git a/Flutter-App/lib/screens/chat_screen.dart b/Flutter-App/lib/screens/chat_screen.dart index 86a8e2b..2add088 100644 --- a/Flutter-App/lib/screens/chat_screen.dart +++ b/Flutter-App/lib/screens/chat_screen.dart @@ -32,31 +32,31 @@ class _ChatScreenState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ -// Container( -// decoration: kMessageContainerDecoration, -// child: Row( -// crossAxisAlignment: CrossAxisAlignment.center, -// children: [ -// Expanded( -// child: TextField( -// onChanged: (value) { -// //Do something with the user input. -// }, -// decoration: kMessageTextFieldDecoration, -// ), -// ), -// FlatButton( -// onPressed: () { -// //Implement send functionality. -// }, -// child: Text( -// 'Send', -// style: kSendButtonTextStyle, -// ), -// ), -// ], -// ), -// ), + Container( + decoration: kMessageContainerDecoration, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: TextField( + onChanged: (value) { + //Do something with the user input. + }, + decoration: kMessageTextFieldDecoration, + ), + ), + FlatButton( + onPressed: () { + //Implement send functionality. + }, + child: Text( + 'Send', + style: kSendButtonTextStyle, + ), + ), + ], + ), + ), ], ), ), From 9fa64f3eb500ee644de07f9184df753988d95b53 Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Mon, 23 Mar 2020 11:39:47 +0530 Subject: [PATCH 15/25] configure_firestore --- Flutter-App/lib/screens/chat_screen.dart | 42 +++++++++++++++++++--- Flutter-App/lib/screens/home_screen.dart | 20 +++++++++++ Flutter-App/lib/screens/main_screen.dart | 1 - Flutter-App/lib/screens/post_screen.dart | 20 +++++++++++ Flutter-App/lib/screens/report_screen.dart | 21 +++++++++++ 5 files changed, 98 insertions(+), 6 deletions(-) diff --git a/Flutter-App/lib/screens/chat_screen.dart b/Flutter-App/lib/screens/chat_screen.dart index 2add088..79c1c83 100644 --- a/Flutter-App/lib/screens/chat_screen.dart +++ b/Flutter-App/lib/screens/chat_screen.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; import 'package:dengue_stop/constants.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; class ChatScreen extends StatefulWidget { - static const String id = "chats"; @override @@ -10,6 +11,34 @@ class ChatScreen extends StatefulWidget { } class _ChatScreenState extends State { + final _firestore = Firestore.instance; + final _auth = FirebaseAuth.instance; + FirebaseUser loggedInUser; + + String messageText; + + @override + void initState() { + super.initState(); + getCurrentUser(); + } + + void getCurrentUser() async { + try { + final user = await _auth.currentUser(); + loggedInUser = user; + } catch (e) { + print(e); + } + } + + void getMessages() async { + final messages = await _firestore.collection('messages').getDocuments(); + for (var message in messages.documents) { + print(message.data); + } + } + @override Widget build(BuildContext context) { return Scaffold( @@ -19,19 +48,18 @@ class _ChatScreenState extends State { IconButton( icon: Icon(Icons.close), onPressed: () { - //Implement logout functionality + _auth.signOut(); + Navigator.pop(context); }), ], title: Text('Chat'), backgroundColor: Colors.blueAccent, - ), body: SafeArea( child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Container( decoration: kMessageContainerDecoration, child: Row( @@ -40,7 +68,7 @@ class _ChatScreenState extends State { Expanded( child: TextField( onChanged: (value) { - //Do something with the user input. + messageText = value; }, decoration: kMessageTextFieldDecoration, ), @@ -48,6 +76,10 @@ class _ChatScreenState extends State { FlatButton( onPressed: () { //Implement send functionality. + _firestore.collection('messages').add({ + 'text': messageText, + 'sender': loggedInUser.email, + }); }, child: Text( 'Send', diff --git a/Flutter-App/lib/screens/home_screen.dart b/Flutter-App/lib/screens/home_screen.dart index 36bdf13..a65cf0c 100644 --- a/Flutter-App/lib/screens/home_screen.dart +++ b/Flutter-App/lib/screens/home_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:firebase_auth/firebase_auth.dart'; class HomeScreen extends StatefulWidget { static const String id = "home"; @@ -8,6 +9,24 @@ class HomeScreen extends StatefulWidget { } class _HomeScreenState extends State { + final _auth = FirebaseAuth.instance; + FirebaseUser loggedInUser; + + void getCurrentUser() async { + try { + final user = await _auth.currentUser(); + loggedInUser = user; + } catch (e) { + print(e); + } + } + + @override + void initState() { + super.initState(); + getCurrentUser(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -21,6 +40,7 @@ class _HomeScreenState extends State { IconButton( icon: Icon(Icons.close), onPressed: () { + _auth.signOut(); Navigator.pop(context); }), ], diff --git a/Flutter-App/lib/screens/main_screen.dart b/Flutter-App/lib/screens/main_screen.dart index 4584d03..b049f54 100644 --- a/Flutter-App/lib/screens/main_screen.dart +++ b/Flutter-App/lib/screens/main_screen.dart @@ -3,7 +3,6 @@ import 'package:dengue_stop/screens/home_screen.dart'; import 'package:dengue_stop/screens/post_screen.dart'; import 'package:dengue_stop/screens/report_screen.dart'; import 'package:flutter/material.dart'; -import 'package:dengue_stop/constants.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'chat_screen.dart'; import 'map_screen.dart'; diff --git a/Flutter-App/lib/screens/post_screen.dart b/Flutter-App/lib/screens/post_screen.dart index c57b4ff..638ca98 100644 --- a/Flutter-App/lib/screens/post_screen.dart +++ b/Flutter-App/lib/screens/post_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:firebase_auth/firebase_auth.dart'; class PostScreen extends StatefulWidget { static const String id = "posts"; @@ -8,6 +9,24 @@ class PostScreen extends StatefulWidget { } class _PostScreenState extends State { + final _auth = FirebaseAuth.instance; + FirebaseUser loggedInUser; + + void getCurrentUser() async { + try { + final user = await _auth.currentUser(); + loggedInUser = user; + } catch (e) { + print(e); + } + } + + @override + void initState() { + super.initState(); + getCurrentUser(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -21,6 +40,7 @@ class _PostScreenState extends State { IconButton( icon: Icon(Icons.close), onPressed: () { + _auth.signOut(); Navigator.pop(context); }), ], diff --git a/Flutter-App/lib/screens/report_screen.dart b/Flutter-App/lib/screens/report_screen.dart index 9eedc79..4bbe217 100644 --- a/Flutter-App/lib/screens/report_screen.dart +++ b/Flutter-App/lib/screens/report_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:firebase_auth/firebase_auth.dart'; class ReportScreen extends StatefulWidget { static const String id = "report"; @@ -8,6 +9,25 @@ class ReportScreen extends StatefulWidget { } class _ReportScreenState extends State { + + final _auth = FirebaseAuth.instance; + FirebaseUser loggedInUser; + + void getCurrentUser() async { + try { + final user = await _auth.currentUser(); + loggedInUser = user; + } catch (e) { + print(e); + } + } + + @override + void initState() { + super.initState(); + getCurrentUser(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -20,6 +40,7 @@ class _ReportScreenState extends State { IconButton( icon: Icon(Icons.close), onPressed: () { + _auth.signOut(); Navigator.pop(context); }), ], From a5b690cb9d9294a170aba9ba37c4dfc419ee3e32 Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Mon, 23 Mar 2020 18:44:33 +0530 Subject: [PATCH 16/25] Basic group chat fuctionallity implimented --- Flutter-App/lib/screens/chat_screen.dart | 105 +++++++++++++++++++++-- 1 file changed, 96 insertions(+), 9 deletions(-) diff --git a/Flutter-App/lib/screens/chat_screen.dart b/Flutter-App/lib/screens/chat_screen.dart index 79c1c83..9f70cd2 100644 --- a/Flutter-App/lib/screens/chat_screen.dart +++ b/Flutter-App/lib/screens/chat_screen.dart @@ -1,8 +1,12 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:dengue_stop/constants.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; +final _firestore = Firestore.instance; +FirebaseUser loggedInUser; + class ChatScreen extends StatefulWidget { static const String id = "chats"; @@ -11,9 +15,8 @@ class ChatScreen extends StatefulWidget { } class _ChatScreenState extends State { - final _firestore = Firestore.instance; + final messageTextController = TextEditingController(); final _auth = FirebaseAuth.instance; - FirebaseUser loggedInUser; String messageText; @@ -32,13 +35,6 @@ class _ChatScreenState extends State { } } - void getMessages() async { - final messages = await _firestore.collection('messages').getDocuments(); - for (var message in messages.documents) { - print(message.data); - } - } - @override Widget build(BuildContext context) { return Scaffold( @@ -60,6 +56,7 @@ class _ChatScreenState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + MessageStream(), Container( decoration: kMessageContainerDecoration, child: Row( @@ -67,6 +64,7 @@ class _ChatScreenState extends State { children: [ Expanded( child: TextField( + controller: messageTextController, onChanged: (value) { messageText = value; }, @@ -76,6 +74,7 @@ class _ChatScreenState extends State { FlatButton( onPressed: () { //Implement send functionality. + messageTextController.clear(); _firestore.collection('messages').add({ 'text': messageText, 'sender': loggedInUser.email, @@ -95,3 +94,91 @@ class _ChatScreenState extends State { ); } } + +class MessageBubble extends StatelessWidget { + MessageBubble({this.text, this.sender, this.isMe}); + + final String sender; + final String text; + final bool isMe; + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.all(10.0), + child: Column( + crossAxisAlignment: + isMe ? CrossAxisAlignment.end : CrossAxisAlignment.start, + children: [ + Text( + isMe ? "" : sender, + style: TextStyle( + fontSize: 12.0, + color: Colors.black54, + ), + ), + Material( + borderRadius: BorderRadius.only( + topLeft: isMe ? Radius.circular(30.0) : Radius.circular(0.0), + topRight: isMe ? Radius.circular(0.0) : Radius.circular(30.0), + bottomLeft: Radius.circular(30.0), + bottomRight: Radius.circular(30.0), + ), + elevation: 5.0, + color: isMe ? Colors.lightBlueAccent : Colors.white, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0), + child: Text( + text, + style: TextStyle( + fontSize: 15.0, + color: isMe ? Colors.white : Colors.black54, + ), + ), + ), + ), + ], + ), + ); + } +} + +class MessageStream extends StatelessWidget { + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: _firestore.collection('messages').snapshots(), + builder: (context, snapshot) { + if (!snapshot.hasData) { + return Center( + child: CircularProgressIndicator( + backgroundColor: Colors.lightBlueAccent, + ), + ); + } + final messages = snapshot.data.documents.reversed; + List messageBubbles = []; + for (var message in messages) { + final messageText = message.data['text']; + final messageSender = message.data['sender']; + + final currentUser = loggedInUser.email; + + final messageBubble = MessageBubble( + sender: messageSender, + text: messageText, + isMe: messageSender == currentUser, + ); + messageBubbles.add(messageBubble); + } + return Expanded( + child: ListView( + reverse: true, + padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0), + children: messageBubbles, + ), + ); + }, + ); + } +} From b3de3b9fdcc6db550e612d46121bae01a011b6ac Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Mon, 23 Mar 2020 19:26:10 +0530 Subject: [PATCH 17/25] fix UI overflow issues --- Flutter-App/lib/screens/login_screen.dart | 12 +++++++----- Flutter-App/lib/screens/registration_screen.dart | 12 +++++++----- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Flutter-App/lib/screens/login_screen.dart b/Flutter-App/lib/screens/login_screen.dart index e4127fb..6978108 100644 --- a/Flutter-App/lib/screens/login_screen.dart +++ b/Flutter-App/lib/screens/login_screen.dart @@ -30,11 +30,13 @@ class _LoginScreenState extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Hero( - tag: 'logo', - child: Container( - height: 200.0, - child: Image.asset('images/logo.png'), + Flexible( + child: Hero( + tag: 'logo', + child: Container( + height: 200.0, + child: Image.asset('images/logo.png'), + ), ), ), SizedBox( diff --git a/Flutter-App/lib/screens/registration_screen.dart b/Flutter-App/lib/screens/registration_screen.dart index 40d5f6a..9e59105 100644 --- a/Flutter-App/lib/screens/registration_screen.dart +++ b/Flutter-App/lib/screens/registration_screen.dart @@ -31,11 +31,13 @@ class _RegistrationScreenState extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Hero( - tag: 'logo', - child: Container( - height: 200.0, - child: Image.asset('images/logo.png'), + Flexible( + child: Hero( + tag: 'logo', + child: Container( + height: 200.0, + child: Image.asset('images/logo.png'), + ), ), ), SizedBox( From 12cedb613c7e85187a8c5cf0627fc4e21b7450b7 Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Mon, 23 Mar 2020 23:49:27 +0530 Subject: [PATCH 18/25] Update chat_screen.dart --- Flutter-App/lib/screens/chat_screen.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Flutter-App/lib/screens/chat_screen.dart b/Flutter-App/lib/screens/chat_screen.dart index 9f70cd2..b4cb4d3 100644 --- a/Flutter-App/lib/screens/chat_screen.dart +++ b/Flutter-App/lib/screens/chat_screen.dart @@ -78,6 +78,7 @@ class _ChatScreenState extends State { _firestore.collection('messages').add({ 'text': messageText, 'sender': loggedInUser.email, + 'date': DateTime.now().millisecondsSinceEpoch }); }, child: Text( @@ -147,7 +148,7 @@ class MessageStream extends StatelessWidget { @override Widget build(BuildContext context) { return StreamBuilder( - stream: _firestore.collection('messages').snapshots(), + stream: _firestore.collection('messages').orderBy('date',descending: false).snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) { return Center( From 2ba7ef0be0995c4cb0c503193d8fe194b1275e89 Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Tue, 24 Mar 2020 15:36:03 +0530 Subject: [PATCH 19/25] add validatoions to username and password --- Flutter-App/lib/components/dialog_box.dart | 33 +++++ Flutter-App/lib/screens/login_screen.dart | 133 +++++++++--------- .../lib/screens/registration_screen.dart | 9 +- 3 files changed, 110 insertions(+), 65 deletions(-) create mode 100644 Flutter-App/lib/components/dialog_box.dart diff --git a/Flutter-App/lib/components/dialog_box.dart b/Flutter-App/lib/components/dialog_box.dart new file mode 100644 index 0000000..2e88d29 --- /dev/null +++ b/Flutter-App/lib/components/dialog_box.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +class DialogBox{ + information(BuildContext context, String title, String description){ + return showDialog( + context: context, + barrierDismissible: true, + + builder: (BuildContext context){ + return AlertDialog( + title: Text(title), + content: SingleChildScrollView( + child: ListBody( + children: [ + Text(description) + ], + ), + ) , + + actions: [ + FlatButton( + child: Text('Got it'), + onPressed: (){ + return Navigator.pop(context); + }, + ) + ], + + ); + } + ); + } +} \ No newline at end of file diff --git a/Flutter-App/lib/screens/login_screen.dart b/Flutter-App/lib/screens/login_screen.dart index 6978108..5c12ea1 100644 --- a/Flutter-App/lib/screens/login_screen.dart +++ b/Flutter-App/lib/screens/login_screen.dart @@ -4,6 +4,7 @@ import 'package:dengue_stop/constants.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'main_screen.dart'; import 'package:modal_progress_hud/modal_progress_hud.dart'; +import 'package:dengue_stop/components/dialog_box.dart'; class LoginScreen extends StatefulWidget { static const String id = "logins"; @@ -18,80 +19,84 @@ class _LoginScreenState extends State { String email; String password; + DialogBox _dialogBox = DialogBox(); + @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: ModalProgressHUD( - inAsyncCall: showSpinner, - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 24.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Flexible( - child: Hero( - tag: 'logo', - child: Container( - height: 200.0, - child: Image.asset('images/logo.png'), - ), - ), - ), - SizedBox( - height: 48.0, - ), - TextField( - textAlign: TextAlign.center, - onChanged: (value) { - email = value; - }, - decoration: kTextFieldDecoration.copyWith( - hintText: 'Enter your email'), - ), - SizedBox( - height: 8.0, + inAsyncCall: showSpinner, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Flexible( + child: Hero( + tag: 'logo', + child: Container( + height: 200.0, + child: Image.asset('images/logo.png'), ), - TextField( - textAlign: TextAlign.center, - obscureText: true, - onChanged: (value) { - password = value; - }, - decoration: kTextFieldDecoration.copyWith( - hintText: 'Enter your password'), - ), - SizedBox( - height: 24.0, - ), - RoundedButton( - title: 'Log In', - color: Colors.lightBlueAccent, - onPressed: () async { + ), + ), + SizedBox( + height: 48.0, + ), + TextField( + textAlign: TextAlign.center, + onChanged: (value) { + email = value; + }, + decoration: + kTextFieldDecoration.copyWith(hintText: 'Enter your email'), + ), + SizedBox( + height: 8.0, + ), + TextField( + textAlign: TextAlign.center, + obscureText: true, + onChanged: (value) { + password = value; + }, + decoration: kTextFieldDecoration.copyWith( + hintText: 'Enter your password'), + ), + SizedBox( + height: 24.0, + ), + RoundedButton( + title: 'Log In', + color: Colors.lightBlueAccent, + onPressed: () async { + setState(() { + showSpinner = true; + }); + try { + final user = await _auth.signInWithEmailAndPassword( + email: email, password: password); + if (user != null) { + Navigator.pushNamed(context, MainScreen.id); setState(() { - showSpinner = true; + showSpinner = false; }); - try { - final user = await _auth.signInWithEmailAndPassword( - email: email, password: password); - if (user != null) { - Navigator.pushNamed(context, MainScreen.id); - setState(() { - showSpinner = false; - }); - } - } catch (e) { - print(e); - } - }, - ), - ], + } + } catch (e) { + _dialogBox.information( + context, 'Error', 'Invalid Username or Password'); + setState(() { + showSpinner = false; + }); + } + }, ), - ), + ], ), - - + ), + ), ); } } diff --git a/Flutter-App/lib/screens/registration_screen.dart b/Flutter-App/lib/screens/registration_screen.dart index 9e59105..17c4141 100644 --- a/Flutter-App/lib/screens/registration_screen.dart +++ b/Flutter-App/lib/screens/registration_screen.dart @@ -4,6 +4,7 @@ import 'package:dengue_stop/constants.dart'; import 'package:dengue_stop/screens/main_screen.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:modal_progress_hud/modal_progress_hud.dart'; +import 'package:dengue_stop/components/dialog_box.dart'; class RegistrationScreen extends StatefulWidget { static const String id = "registrations"; @@ -19,6 +20,8 @@ class _RegistrationScreenState extends State { String email; String password; + DialogBox _dialogBox = DialogBox(); + @override Widget build(BuildContext context) { return Scaffold( @@ -87,7 +90,11 @@ class _RegistrationScreenState extends State { }); } } catch (e) { - print(e); + _dialogBox.information( + context, 'Error', 'Invalid Username or Username alredy exists.'); + setState(() { + showSpinner = false; + }); } }, ), From 0ab92779e81535b52aad9b042ee567752d42f989 Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Tue, 24 Mar 2020 15:44:22 +0530 Subject: [PATCH 20/25] Update registration_screen.dart --- Flutter-App/lib/screens/registration_screen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flutter-App/lib/screens/registration_screen.dart b/Flutter-App/lib/screens/registration_screen.dart index 17c4141..80f789e 100644 --- a/Flutter-App/lib/screens/registration_screen.dart +++ b/Flutter-App/lib/screens/registration_screen.dart @@ -91,7 +91,7 @@ class _RegistrationScreenState extends State { } } catch (e) { _dialogBox.information( - context, 'Error', 'Invalid Username or Username alredy exists.'); + context, 'Error', 'Invalid Username or Username alredy exists. Make sure Password contains atleast 6 characters.'); setState(() { showSpinner = false; }); From 27cf231dfb195e9faba38378e91b601088fe7aec Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Wed, 25 Mar 2020 17:55:00 +0530 Subject: [PATCH 21/25] uder_location --- .gitignore | 1 + Flutter-App/.packages | 7 +- Flutter-App/android/app/google-services.json | 8 ++ .../android/app/src/main/AndroidManifest.xml | 9 +- Flutter-App/images/mosquito_icon.png | Bin 0 -> 12265 bytes Flutter-App/lib/screens/map_screen.dart | 97 +++++++++++++++++- Flutter-App/pubspec.lock | 37 ++++++- Flutter-App/pubspec.yaml | 6 ++ 8 files changed, 161 insertions(+), 4 deletions(-) create mode 100644 Flutter-App/images/mosquito_icon.png diff --git a/.gitignore b/.gitignore index 10be197..2aaf1f0 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,4 @@ buck-out/ fastlane/report.xml fastlane/Preview.html fastlane/screenshots +Flutter-App/android/app/google-services.json diff --git a/Flutter-App/.packages b/Flutter-App/.packages index 6ccf9bc..a4d2d2c 100644 --- a/Flutter-App/.packages +++ b/Flutter-App/.packages @@ -1,4 +1,4 @@ -# Generated by pub on 2020-03-22 09:31:42.436886. +# Generated by pub on 2020-03-24 19:13:40.118590. archive:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/archive-2.0.11/lib/ args:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/args-1.5.2/lib/ async:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.4.0/lib/ @@ -16,12 +16,16 @@ firebase_core:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/ firebase_core_platform_interface:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-1.0.4/lib/ firebase_core_web:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.1.1+2/lib/ flutter:file:///C:/src/flutter/flutter/packages/flutter/lib/ +flutter_plugin_android_lifecycle:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-1.0.6/lib/ flutter_test:file:///C:/src/flutter/flutter/packages/flutter_test/lib/ flutter_web_plugins:file:///C:/src/flutter/flutter/packages/flutter_web_plugins/lib/ +geoflutterfire:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/geoflutterfire-2.0.3+5/lib/ +google_maps_flutter:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/google_maps_flutter-0.5.25/lib/ http:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+4/lib/ http_parser:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.3/lib/ image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/image-2.1.4/lib/ js:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.1+1/lib/ +location:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/location-2.5.4/lib/ matcher:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.6/lib/ meta:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.1.8/lib/ modal_progress_hud:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/modal_progress_hud-0.1.3/lib/ @@ -30,6 +34,7 @@ pedantic:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/pedan petitparser:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-2.4.0/lib/ plugin_platform_interface:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-1.0.2/lib/ quiver:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/quiver-2.0.5/lib/ +rxdart:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.22.6/lib/ sky_engine:file:///C:/src/flutter/flutter/bin/cache/pkg/sky_engine/lib/ source_span:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.5.5/lib/ stack_trace:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.9.3/lib/ diff --git a/Flutter-App/android/app/google-services.json b/Flutter-App/android/app/google-services.json index b639d04..3f3235e 100644 --- a/Flutter-App/android/app/google-services.json +++ b/Flutter-App/android/app/google-services.json @@ -14,6 +14,14 @@ } }, "oauth_client": [ + { + "client_id": "402013291968-t0hpq04d14mnudppg3mjem4aam0112ik.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.scorelab.denguestop", + "certificate_hash": "97f69b3bb7064bbaa64b849b2727a7fa9b5c8c82" + } + }, { "client_id": "402013291968-cfh6oosnpsfqrua776mu4ae1b6prlrtf.apps.googleusercontent.com", "client_type": 3 diff --git a/Flutter-App/android/app/src/main/AndroidManifest.xml b/Flutter-App/android/app/src/main/AndroidManifest.xml index 51c93fe..698a194 100644 --- a/Flutter-App/android/app/src/main/AndroidManifest.xml +++ b/Flutter-App/android/app/src/main/AndroidManifest.xml @@ -5,10 +5,16 @@ In most cases you can leave this as-is, but you if you want to provide additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> + + + + + android:value="2" + /> diff --git a/Flutter-App/images/mosquito_icon.png b/Flutter-App/images/mosquito_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f71d393438f44437cdee896bb08231e0a4b7638b GIT binary patch literal 12265 zcmZ{KWl&r}v-U2oVHcMWmL<5m1z+5q;2zxForR#mCAb9-?(QT6Cum3@!QK7a_x<(V zs(ZWYOjpm=oH{!*{d7Om6Qiagi;G2$1pokW<>g=+2yKaY3^0%oEmn1_KSDt);eFu900(+DF7gp2>_6|#l=PzGH7t{&vcf8$a)XP z)IHgzxr7o6^I}V){Lf1s^mSz^k`pSpv|PLS!O3gJ!NI}JY0kyV!;i4J z5EjROTdx0Fya-Ex$CA&QpPQePpO;UNpNG#HtK*IdF>6TU|LcGDadZIy^ahXgCSPqq zaJnvt9x#Xa_ySb2`y5L}j(1K-SLhrYXRq7vmpR=?K$!zSz!82&+4`uGWAHyDNMYxl|h5Q`d_)%p21o%Q}O7LoEu*MQzAQWa02O z*V3^ZD`Qq>wEbht4z)|~^(JzE6Bjf~nw58W#DN)Ff>Pxv`_Dw513a5}f9Je*ZzwgA&w69Egg$d#ikffiTrPtuFg1x(^Mhbm3cU?WwB->NSj16(qBYa6V=uh@^*4HRQG)1` zOo@GKWroPM&QGd6dm{{D5NK8o!V1?2!&qxlw%a z0Dd_r0sxq)EFh~+AsIKi$@hyX_V(dDHuo^1_OXWAT zTAAvhAfJ4zcj}`Bdh2@plplJygZdE_6cGx<0Kx2QtG5TEt#01<@4T53!;p?NRFCm& z22JaehKwgu@2sN&K%fvcB~58*d2^_B%V3^JT+h=NUA+CIm^_=elD`WWo^vaH|7gOM z77uw32oY~OVqIEoIjd|w-_jWuD^k4^Uj;;9sWGrnAc@2ABQQB``9m-u*Z?jJY(U6f z`aH@)O-{!pzQyj}pN;6!qxcZC69@*$n`Ug>bT|YaVuOZS-7M@{w1RK}+$<-Gtg6sid4 z{s9(PrQ(MU>oC`&t4j9|(y)F-_MeMgrlx{7W@c#9($b3qiHC`z|H7cC5L|tXA1ro<_ zF_PzX?lOYPfBDHe|H4Fym@oszmoX)Tz#;X-;J0CNcq60chB&lz3Jy3O&_0(?_)lPU z4Y*GCA>hx|mwo-CRuCy+p`*%2cjTJby6 z4pMobU?m>U!M%R%m(T_`Hl}I+o5_~-F6X+`TtF`>3_jtTxH*C*`whi0{_7iF+lG#t zUTBAxXF_6r8+9;~UUe3Dxdmx5eVM)IZRZUQxB%JA??^=btR4v=zKb5jSNKi|C){+EnY{ zCNFiI)+`KCU^7tTg~ZWgzZ;tcxU+%l^tkuZ;6%=f_7hl=-opS40%!?|4D%kkEk(%l z*g)v$u&84~;1ZS1s;QfwQN=;aC#?yTGm|~78$JY+-LUyt=^+P;fLz}P$NgI2_*)c9 z>Vb>Zv>jE2_x9AY^s#m(K48&192Owd#!U?~B!ugW0iRMHh|{Y&c|Fb0Nw$~(K;3K` z`ZXC43m|1{G*CUwYv4gSqIG%O&N)6CfzrctaN_(EHS%)vX^j@gWP+}x3ps;v)UO%FGG=$;M zN`O!!fa)N14jX@HnDx{0j;FNr@h>slZoi^Mcu7S(p3?;%p&2+H^s{xu238edeM^-h`pO-LA&(rAF)m@?TnE-zcS9bQG5Y^KpB08R`jsY1)~ zJf4WP^G4BNUZPGSpIrKdGA^mWCn}$9SL5z<45>?URB=5`55gz&?1S1)4qDu1zO;Km z76ULC7Hn+1&VEvQ?k0{TYhgRWEZbocNM>PCP|0*U13hS7Ds0Pz11Ja4!4eKpq9TUu z?{<#G#9=sgHA77j4SGZ7UngUcgLA{HbdXWk)sc`O3f$J#q(9#M?Rjanc8kT=QRx2> zMrcE9r0e`WKibMFK}#5oKvp_y&bjQTz_2-N6t*Th`IJFYsEP*$dNIVn;iQnxoBR9# zA(zvnbz+fuw0fST`NjE{BdhlvS`@H9r!q3YX}+7oe}2z`OY>hQte^!FVu@-%I0k`1 z4!{1S4n~26QejBFPKJ>K4y6JV27||rz2;oIc)V~KmnJ8bdo2?lRzm2owjX?rr>Db4 zZLm2I^7qiuvWA516KXy*1s_Qq1k)KndU}|<2@G{17XqK4`N4~?xlo#j0Uj*s#Bak&s~+omn3|ghaB4vH?%}im zK6mlA^?XZySGbjRc$_MuUJE~~a{Q;blS%%P0wVg)+`}UM)@9x|laFIe;fY5qz^Uzi zx)6#(aAvSeQ!y_E}KCD@@4p1MQ(}(;eJvQ`Nd&$V~ zSjMEL*|wktDSzhr{=wSfB~&2@&DmhCAF2=2)kYQd!DFrjqN1Qmz#wcJnL!_86KwgS zH)p?A9E(7$#Y+8eY_`vVD9X)O*UWV*!d?Kzba%Ke^IPoxmg>IFldZ&6qV~ZSlGuMk z0v9vU@sn)a5t!4|7-Cd<&~F$z$4u{2&||}1>j5%tFI_zMXc@>2@NwUAi5nuj877KU zd`bZb>|#m~Ms{pwUY#?0MP_(TxB5Su0t<{=^@-V#h{3NuRxcNsx-dDyse?s&a6=`*KMF z0ARAEN=18QWLRFh{n_QsB6=U^{%ct~Kf7(#){x1-si#CZ8phC&%=69q)oRPYZyLaa zt1vS3wV-+TLnx;|Uz=gVPz#s^Di~xK%t5t(p#BA|7eD#ndetxx9U21S`waS9tIzxJ zrQCrzL}E~|ja!Gsh?s(8wOIBCvrIfWubtM(MxeR5c`j?uSXP9+wOWKX#0la(}NpUv#d9Y$&_6@A(qDL}mm0o#XZo9G!~8+?+51IuS49 zrl4SE_Pg*g0Hj`$su3Y47eR_~`!Ru})}Zw|r>^&XtJC-K^Yh)^T}^H6#{8fOlapUP zfe-b+2WRJ2dHs9aPr6(EJdd}{2Dj_#OeK=Hn#AeDKF^5$@y5$J;?f$M^HFI6fkSAS zKk_^O4uc|LRtZ*qX&&a1Nifxz#|H{g=y|!iKDh^n5)8``!W3Z8wSUOHyl6&;0xdbz z!vmZ%oHVth$)B?Q9&gWLW3jBAASM{F3OUrr=fP;aI>YAkRp*zdqt=%emV>XOL9O;T zwG|Z=xw#V54dHOTy{dqN8h)C0;1r&UA3fqA%yVUN3HN_IOP))We0c*bA$bh0WY@7L z5(fp40#JdddIeh#%&Hl$$I!lS_FJ3{yKxZ-i-!&vhze}h$uRl%{ObkSs@NRSeeoVv zvQs2MVkBs-gxGMUb+ZRo`Z|66ijr%xU~0*$FO?0SH1d}^%?9rq&fRLRrVFK@P$)Pi z3+%d7YgDyV?UZPDnYjA3nrAmw0%*OPYx{f*)>TkgHH0UCfaaYZ{ugwfw*sW3Zm9V4 zixLr&yykDoM)qp^)BDYVogH+iOT82Q0Z{Iyd1%@1=c^Y^_6|AVG+F!=BmxsNCLA5_ zP4Lw%P!M??oV>uhu)xdP;u!9p5Gm;g8`956Pt(q;eCM~lo6TFLsGzvc=4}|zHThS+ z{XE*uS^7aahh13xp93k1TkeOE&)h~^wIhw+x0NoWU?Fh1mdD4ziGnZ^6d))}A)nJa zPC@BiAgVrJha&@CQ(jmdioE$(`J#wabIz_TZ^@kH1%}Lu zuQ@30)c*a#|7p*T{Olbr3m7Q=rE1}Tk3%s$M;~QwcA-sOZbw)c0H!Y5-XTqNq#qO zW%oVmOtT>*2|oYx>-E~*{x)MYGA2^dSPNxG8)-v>94Un>JpD}+Br>w=L$KbUV82S2 z55(iUb$UL41OVXvk;Bi<${P4B^J|ou$Ns$U?6!T^Mr^nLjpIsYMn{0IOJtrur_p3z>nDq>=ys$+~z)0STMh@_?s zGgOY#viAHq7O56yKSDC5 z*K#0~>Y6l4VF}Wlf7ea*Tu24p$Fp7{q!Td=n5(II#~rs&RIKD56wI&+0pIh_t-soX zCgxvJ3S(h_IWHc4FP_g94HSvlr^Iqi)YLYU&@jGW-sSo2kG~P|GY)=A zy}gadMJNC+Q3KzSCnwnbf$uDKpy@w+v1T=epMd9Y|9{kXUT;=Z0@3_(AIhk(M>6M<5 zK~v=REf6!gKn=?&WsYIHQ4=228+??_t68Qbg4axBtq5m;fWY!kXcMu``11q+IW7Hu z`dIDGOYU&m5Lm!@iP3KwhtuMiJubhicP|SB5<^8r1HE0RB#EOJOBu#1^+AD-MyyCl z8ic7d000gZrJRyEJR%K^kGBTC`}3P&hQ;0~*FP@>pp zfvHoqYjT*ZtZnk~l_zgp^l6-6Gko_-M@v_?6|>sKE`|sr;Cipzx##X5WurAXWL*&3 z!hCak98IDHNzbEeIXtI)8Z(5A6;&8C)h`2WgOiN(3SHM>)@hFS;ha zRvVALyN~gj3i%Ye?x(3$dw1Q9=vpt>s2VxJ0EZnl zJ@EeEpsG?IH9aDZ8!BY1c8XXEAq0BlA^>K+6OWsl+XqT5*zQ`(hIxR+ULPexrvAN| z#x68vBWai+0X5_-X46f$votNmJxH(D=_o~2^sD`jN+}@#zsSAht2Hbx4&HXzFv-?^ zcwQ(Kb-lkX427Ei=;^M~*~x?4N3^|S_@U&qUhX~dkv@8oy2pey8g zd_FyhS6)(r1OPVxI*gcj-%FOU0N@avyP?HRAsRh~0#9YnQ!A<9$_fUpO5U`zy9uCADHhHt~e!w;>Folrg} zPi;@>>EeYX4?5_p7pwFzBdT#u?fS#L; zr=>8|3v6ucG&6x-i$(Z6V%1kq+AMBQ!FXbq)4WT@Bvkoh0}xZ&r|}Q@h8nuTX}G19 zUBI?v55Qik`x~sJqC%FjJ(Re#l!hTKF zU2AHUCNIy4VrQ_Osn62neAWV``0w5jOJJUvN!0W3d5-6*XrR33H>N`Yy``^qr>hP- z3xoledmJY_U;OwP1@{u(HyZn$4e#&okByB*3=JLD8b#w$ae5v8JUl$a6ZN42N8?ew z!9k<0Hty~?w&_=CO$UJnIkba2v;^g#{u)LIiNHG*~It8Fy0!{~3QpDI}1olErm(e^4I540t{B?Yoio z-bFkGe?nG_&CRiqbNAK1nyr!2?z5Ixw`m%qY4c$oa~-lW*8B0Av@~1U@+l(fZvdx$ z-DZ6D376tP0?`9Rkwr<2z;$ddS2Ap49yqxdsjH+e}AQtJ~Q4A{?(*xzL$~TW` za0%(PAGBPrRJLIP3W@RmNGFM4Oze4nI za(-nUn8%R-N9{9}f1*w$fPjc_qlB>a#wr-;^nr0Qq%zhbrZu}OWAK$^nghVoRnR1s zo{qTv(V5RD%})>4M>!j{M&&A>5sVHLo?0v|^RH|5{_5cT0`F;msh1C@v0?UMf;sp= z%w;n|LNL_-m$Q4)|C2&gX4~@Po077;yqr>8LV{Q4dYP?Iv~32P zk%hT=SOt8sS|q&0!n*J8zZ4G%?hH%XO{#rSE`z%Ef?~t|7v_} zDJ%2)9d`GGj2IHM2JN<_-cOF)BUhmXVU6;u=vt(vvIanmk<}{ z@md2$Nbw(8tugRM7w-LKVqjpPskwFYfSA%xpFV}Hk^#Wlo{O6*D45&x5*_1Ek zdn^D2Rp|`u$7fRoQi%4#?&ILUf{#D&=s!3kGPmuT;4WUP{dwvPJTQ2U2OY0R3mbjo zndG$)VVp1qq{zHXBD`LTu3jLYrpSzxfL>X@C*ZCp&_Dlat1&C<2>stS>BR0z^T9Rc z>I=_@sTE%PK zxBZ3ReJ4mwTbs!G?zcOHup(mfoQ7AUx&m+8U0b`@hpvF0oSRD(z5J_T3`fi&Lxw*zzy5x+|=}fs#wYXg5D{62!2VYck z;Qe|kS3^SsQ()TO-qCT_!Lium@5H;iyVX|5k1;V>Jih0@O#B`1ODtts7As8hkrgnDRXunWcP~O5~V|ax;9rRfhu0zA`chv>m z!xrB6t+cz3uHF24`O6->T(0^nY7*1;$D2DlOaLgl#-c1JkcO?Bw9QI&5dnjf6AIqP zYoTxvziVs`N|Dp{M^b5o$R0@6wRe1ag{tAhq1<04C0X7ckiDkCfV^QL<0sQ zV&WwTnfoq?<<-F;LHSBZNYrH8Upj6YDOhxj+@SWi^$yS8+fRz350{#g4FJ>av1ED` z!kxc=BX5lC?DjABxStWYf?!#B5B(3pw}U6W561@iKPYt6%JDu2kBMfogW@(nrW~%d z;&m7Sl#94o<%p5gUV88;znf*S0c`7aYq$5AoKW@5et%e`>Ut4{Zg}3TN7*6)pbc;| zOowHszzgTMM0|{T2A{b5UJFl2$2PyZ8>IMwm!^?IZ`5eNG=9Dbf!DQ1Y?4Q*kQuvJuF@}}Teg8`pAqnMbar1Sa){&EnImqN!`;$Y8`F}St5pWanxTyp5?;kp;G8yb(h8ddW*W`8coEATna zD)xH+qyvT(z(*$0bBblaA(MaY&RVD+M%wvWtvc)R_ zjY+xdS)z{m-P{KdI8gML*z?_D#Z2)?92qlG1a7;Tq2^Y;FkaWj=?D;ziI@cxh>O_dY+} z{5twsxP{oDaPo=Iun6Ggz32S{6**Uyns^hZLngVurnlh!Vj=<6D zF5Cm$K~lbeHmmn4E+x3g>L;t^x^+&~dP%%qV;)8Ut{-)qaMG=lu8&-IIlz=&iZmg5 zz=KKJm7RrnBzoG(V{)njqSVk9mx4+z4sX%Vl}@K5$l?xhoEAbO zGJ^SJ69NX``NQDb+c*>B<5>vutXa+!jY}cw{*PV%NBZ)NZT3+ev7-F@wqZ2n5Dp_w zl$BQJvm$rY*f>daOHCH5tVmb>VZyl?C@9q0e zeLCWd2C|=4b;#Rpt`^?6LN1f&VZ@gynWs0%F{MKSg+LLpuXRI+RZQ&V;iNY)Az|v< zw}?eNYl?oMw#44&S5o?h;&KrL`0?WeskSYKxf`<+p@nKOq~T~^eoKXT3UDchsc9bM zKZI)OM3q3{gxnv;Vu>dCoxXKmObHVZ5P)+|{I2gV*HHD05+xaS+hpG|&IGR3Y{zJT z-kwL9ZvTC6!af7&P=8>8uGI%U^}alv2p?xI)Ec4XT1#Vv zHJe9vyK*Ok9T>wyp!=1~j5|dxtE2!((c)V^vM51|5yy0*OtIjgpGyH#zdZ!z3|c12 zP2hGN%LIRDoO)(XeWp-^KR=C(Y);xdrl}mcBc}%S2JMJUiS;FLGU5PMTO19VY<@eo zem`8{?G(K5s%%$D-@Ci`+CxW(0XD6f(~PriEt*`*D&Lu3JY>4>I6lofC)Zu(&Au@iI2eK>&zF zjABZ`HTx}#o003&W*jTm6dEy<9Lc&jbbrydh=I_Jh+eHm?9Pz=nVg7H$m8@RIM{Pd zdyB0%0Nw;+j7U<9J;EaqhfITzrVCcADs!CaGN5*DhN+0dxE{gJ8YACZ*Y0l#RNsi^ zzU&q!_B^lHTUpV5=um+_`X1D@ZqQL$?=V1=Y?N}!?yp80&l4MI`59sA(2!bN{)?4` z20lDO%p{9R7sr~XR$WDrWcJ{j_4>lW+77$NtPX<$_{%|^)zTaBzdR-&0E*6%icWWj zrlwk^r&THY1VLoYWHt?S&ci6^E(wT?=CIPl=)F*h$jj#Eo9IXdSwk=`lZ)T&u&Ze) zV9}-)DWyw?qjx&Dk8|L@t76HwkerIu)XzTXd4RCKN8!+0#)$nkYZ1x*?#wcu&8YUX zP@3H5gj7xPiO5KS7n-k!N%rv}?}fbiob$q>mJi8m+B-VvXn7;y`g^}!>J#EF<49eH z2NT~Rh~c zTkP%ZXXjQvyPKCw(Loi+6v*Pu4WW>@BGu28!M{=8pR@8Yp~56;Qac>cUQr;qIpwqx z6(tnF$JGAC+4B6h`<_i2P+{zzbM~!u)q&-1 z8Z0s4pbS*2x(u^8(NKy*q!bIK;i|x{e`x%JpMzpRmMG7bF<0B%h5@-T0+yJC7#Ifm zf&J01sMT-Z%au5F#WV=1E3Wq9Hb!RE6hPMEmA>Y~^U{lQZtzMD2TH3SmA zKR4=g3e?qz1+v<&UH~WiKk9u;_+0g}lNU@UGxBlG{=fzRhM*uhvOiC}Y+5Yl83948 zECX>iRPRV{FR@EY3u%iMr>i;zeWBD%a-E2x8=|Q7=~K#Y`VwmFkBim7Te+SWZ`Fw| z)ufuJ4oNh#_$;y!g2c@AP8vyO#owz*<;t-Me|LiGT`gY7TGx}ae}6^QBcQ?HWC9K| z>n^KGH$R#V#E4leF}M2k#|5c*g2voAB#PV~C|;GFu;c3rDeE)BcTH*Y(8dju}8c6c7NeceLP z$`4luR6c(g+1O|;ZRA>HyZuSTPC@IuicVec6R4VdAF=xS3c@q9)N#p41tp zJ)G#g*xh&|>hEN_=kc2FO4Hu>_;~g(uhVP5L;gJt2{DbJh(4uCO-b9^)5D8U?RHBB zCQ)hyOyT8s5oH>!Yo;Y-pG%SI+S=Oemk#-;{}z-2LE`90UK=t8R4>!*_T%_(3B-TK zbOG#vN-CUG?Y}&q2%*yROxg=f^#BM6BcR*z3_*G5l`;ivrlnQ5G9^KfrM9ybg3|l| zv{$dgWE{IeMD=|)?MMKbV&c+lGx1>eZ)q-QgWu2U(o@spI`=F23WmO^82R@#Tpu@+ z1URriBTWRxGORsQz~rW_`!oegi1Oh_bgdW7DtSeWolzPcDHD>md$+yp@eHW*kiHN2};XA4_YP^2GiK3{4~w?FyT==5%Kr91r~L3n&e zhp=tT6gQ~P8Y3S!~_KO;ObN<%`?e;#ySlusx`zN?U*i%n9{xHT{hHB1P<<^bO zjvZqJuW=!KC$Z{&{{vOW9t|6ABW|jA=xM+Ia?Rwt0n?vm42rOhcr&)>fI(YcwXq)m zk!=8otW}Pj1+!j*t$*a1 zUA8g;6_v+p&;0pD1iYm52X2E*-Yg@w_Q{nDm|>G&$OXX{|I2f zA_Adw*6=R6ut<)@&46957XAgVJ9?dvDHZo$9RBqK_S^5`5iot}(FxVN#)6hiXELxXUe2@ncX~St=9tBBE6N$72~y z#dyKrFj63(g*SyuD?e{Ponm1qMn-`P)kuk?T4Em+jrk{BDeNe*w5%*>j_&yo+qgC1 zqXMUC=YBYI>A>vP6M)4@p!QxM5ch?7%zy=)FBf=7)w|$&C10^lgpLPO3&t$Ye zyS4Q)XE-=kXx?XySY=ct55_+uQ&X$+5^9;qWd<47=l1{RB7=c{cj&V*)O#NyPFsCX zoT@ejw6#nF0Zreb5g2k|aOzk8^gQ|pM2RJ&C;BpNloTTm*+%-FQ@N8GI?Xk>n20=B zp0#M7UtU$qAWFhyNlEHMEv02qlL~jYuA+X363A~@j1O~3W%hwRH3)rO7RNt2OLh3XP|-txudKVIg8_b-Ei{W6EO+$jy@h@0lL|G8;yY35-i zWZ`CoPyjB(&2d%^ZdNW{Ee?JmZXO|SK~@ePAr6k(JA=9ZF~HH;($?Dd{~qwGWXl;b O03a`|0;`oY4f}s-?$r1I literal 0 HcmV?d00001 diff --git a/Flutter-App/lib/screens/map_screen.dart b/Flutter-App/lib/screens/map_screen.dart index 1e27ce1..b2ff888 100644 --- a/Flutter-App/lib/screens/map_screen.dart +++ b/Flutter-App/lib/screens/map_screen.dart @@ -1,4 +1,9 @@ +import 'dart:async'; +import 'dart:typed_data'; +import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:location/location.dart'; class MapScreen extends StatefulWidget { static const String id = "map"; @@ -8,10 +13,86 @@ class MapScreen extends StatefulWidget { } class _MapScreenState extends State { + StreamSubscription _locationSubscription; + Location _locationTracker = Location(); + Marker marker; + Circle circle; + GoogleMapController _controller; + + static final CameraPosition initialLocation = CameraPosition( + target: LatLng(7.8731, 80.7718), + zoom: 8.4746, + ); + + Future getMarker() async { + ByteData byteData = + await DefaultAssetBundle.of(context).load("images/mosquito_icon.png"); + return byteData.buffer.asUint8List(); + } + + void updateMarkerAndCircle(LocationData newLocalData, Uint8List imageData) { + LatLng latlng = LatLng(newLocalData.latitude, newLocalData.longitude); + this.setState(() { + marker = Marker( + markerId: MarkerId("user_location"), + position: latlng, + rotation: newLocalData.heading, + draggable: false, + zIndex: 2, + flat: true, + anchor: Offset(0.5, 0.5), + icon: BitmapDescriptor.fromBytes(imageData)); + circle = Circle( + circleId: CircleId("mosquito"), + radius: newLocalData.accuracy, + zIndex: 1, + strokeColor: Colors.blue, + center: latlng, + fillColor: Colors.blue.withAlpha(70)); + }); + } + + void getCurrentLocation() async { + try { + Uint8List imageData = await getMarker(); + var location = await _locationTracker.getLocation(); + + updateMarkerAndCircle(location, imageData); + + if (_locationSubscription != null) { + _locationSubscription.cancel(); + } + + _locationSubscription = + _locationTracker.onLocationChanged().listen((newLocalData) { + if (_controller != null) { + _controller.animateCamera(CameraUpdate.newCameraPosition( + new CameraPosition( + bearing: 192.8334901395799, + target: LatLng(newLocalData.latitude, newLocalData.longitude), + tilt: 0, + zoom: 18.00))); + updateMarkerAndCircle(newLocalData, imageData); + } + }); + } on PlatformException catch (e) { + if (e.code == 'PERMISSION_DENIED') { + debugPrint("Permission Denied"); + } + } + } + + @override + void dispose() { + if (_locationSubscription != null) { + _locationSubscription.cancel(); + } + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( leading: null, iconTheme: IconThemeData( @@ -30,6 +111,20 @@ class _MapScreenState extends State { )), backgroundColor: Colors.blueAccent, ), + body: GoogleMap( + mapType: MapType.hybrid, + initialCameraPosition: initialLocation, + markers: Set.of((marker != null) ? [marker] : []), + circles: Set.of((circle != null) ? [circle] : []), + onMapCreated: (GoogleMapController controller) { + _controller = controller; + }, + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.location_searching), + onPressed: () { + getCurrentLocation(); + }), ); } } diff --git a/Flutter-App/pubspec.lock b/Flutter-App/pubspec.lock index 14d0df4..47383f4 100644 --- a/Flutter-App/pubspec.lock +++ b/Flutter-App/pubspec.lock @@ -118,6 +118,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.6" flutter_test: dependency: "direct dev" description: flutter @@ -128,6 +135,20 @@ packages: description: flutter source: sdk version: "0.0.0" + geoflutterfire: + dependency: "direct main" + description: + name: geoflutterfire + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3+5" + google_maps_flutter: + dependency: "direct main" + description: + name: google_maps_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.25" http: dependency: transitive description: @@ -156,6 +177,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.1+1" + location: + dependency: "direct main" + description: + name: location + url: "https://pub.dartlang.org" + source: hosted + version: "2.5.4" matcher: dependency: transitive description: @@ -212,6 +240,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.5" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.22.6" sky_engine: dependency: transitive description: flutter @@ -282,4 +317,4 @@ packages: version: "3.5.0" sdks: dart: ">=2.7.0-dev <3.0.0" - flutter: ">=1.12.13+hotfix.4 <2.0.0" + flutter: ">=1.12.13+hotfix.5 <2.0.0" diff --git a/Flutter-App/pubspec.yaml b/Flutter-App/pubspec.yaml index c37c46b..7244951 100644 --- a/Flutter-App/pubspec.yaml +++ b/Flutter-App/pubspec.yaml @@ -17,6 +17,12 @@ dependencies: modal_progress_hud: ^0.1.3 curved_navigation_bar: ^0.3.2 +# google_maps_flutter: ^0.5.11+1 + google_maps_flutter: ^0.5.25 + geoflutterfire: ^2.0.3+2 + location: ^2.3.5 + + dev_dependencies: flutter_test: sdk: flutter From dd2560ede33c7b349fedd4b80eeb833aa81c02a3 Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Sun, 29 Mar 2020 17:04:08 +0530 Subject: [PATCH 22/25] connect firestore --- Flutter-App/.packages | 24 +++- Flutter-App/lib/screens/home_screen.dart | 74 +++++++++- Flutter-App/lib/screens/main_screen.dart | 5 +- Flutter-App/lib/screens/map_screen.dart | 45 ++++-- Flutter-App/lib/screens/report_screen.dart | 23 +++ Flutter-App/pubspec.lock | 156 ++++++++++++++++++++- Flutter-App/pubspec.yaml | 4 +- 7 files changed, 314 insertions(+), 17 deletions(-) diff --git a/Flutter-App/.packages b/Flutter-App/.packages index a4d2d2c..d0ed6f1 100644 --- a/Flutter-App/.packages +++ b/Flutter-App/.packages @@ -1,11 +1,14 @@ -# Generated by pub on 2020-03-24 19:13:40.118590. +# Generated by pub on 2020-03-29 15:32:38.713681. +ansicolor:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/ansicolor-1.0.2/lib/ archive:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/archive-2.0.11/lib/ args:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/args-1.5.2/lib/ async:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.4.0/lib/ boolean_selector:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.5/lib/ +cached_network_image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cached_network_image-2.0.0/lib/ charcode:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.2/lib/ cloud_firestore:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.12.11/lib/ collection:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.14.11/lib/ +console_log_handler:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/console_log_handler-1.1.6/lib/ convert:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/convert-2.1.1/lib/ crypto:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-2.1.3/lib/ cupertino_icons:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-0.1.3/lib/ @@ -16,7 +19,11 @@ firebase_core:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/ firebase_core_platform_interface:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-1.0.4/lib/ firebase_core_web:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.1.1+2/lib/ flutter:file:///C:/src/flutter/flutter/packages/flutter/lib/ +flutter_cache_manager:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_cache_manager-1.1.3/lib/ +flutter_image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_image-3.0.0/lib/ +flutter_map:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_map-0.8.2/lib/ flutter_plugin_android_lifecycle:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-1.0.6/lib/ +flutter_speed_dial:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_speed_dial-1.2.5/lib/ flutter_test:file:///C:/src/flutter/flutter/packages/flutter_test/lib/ flutter_web_plugins:file:///C:/src/flutter/flutter/packages/flutter_web_plugins/lib/ geoflutterfire:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/geoflutterfire-2.0.3+5/lib/ @@ -24,25 +31,40 @@ google_maps_flutter:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlan http:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+4/lib/ http_parser:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.3/lib/ image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/image-2.1.4/lib/ +intl:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.16.1/lib/ js:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.1+1/lib/ +latlong:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/latlong-0.6.1/lib/ location:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/location-2.5.4/lib/ +logging:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/logging-0.11.4/lib/ matcher:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.6/lib/ meta:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.1.8/lib/ modal_progress_hud:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/modal_progress_hud-0.1.3/lib/ path:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.6.4/lib/ +path_provider:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-1.6.5/lib/ +path_provider_macos:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-0.0.4/lib/ +path_provider_platform_interface:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-1.0.1/lib/ pedantic:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.8.0+1/lib/ petitparser:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-2.4.0/lib/ +platform:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/platform-2.2.1/lib/ plugin_platform_interface:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-1.0.2/lib/ +positioned_tap_detector:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/positioned_tap_detector-1.0.3/lib/ quiver:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/quiver-2.0.5/lib/ rxdart:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.22.6/lib/ sky_engine:file:///C:/src/flutter/flutter/bin/cache/pkg/sky_engine/lib/ source_span:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.5.5/lib/ +sqflite:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.0/lib/ +sqflite_common:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite_common-1.0.0+1/lib/ stack_trace:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.9.3/lib/ stream_channel:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.0.0/lib/ string_scanner:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.5/lib/ +synchronized:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/synchronized-2.2.0/lib/ term_glyph:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.1.0/lib/ test_api:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.2.11/lib/ +transparent_image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/transparent_image-1.0.0/lib/ +tuple:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/tuple-1.0.3/lib/ typed_data:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.6/lib/ +uuid:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/uuid-2.0.4/lib/ +validate:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/validate-1.7.0/lib/ vector_math:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.0.8/lib/ xml:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/xml-3.5.0/lib/ dengue_stop:lib/ diff --git a/Flutter-App/lib/screens/home_screen.dart b/Flutter-App/lib/screens/home_screen.dart index a65cf0c..8a78873 100644 --- a/Flutter-App/lib/screens/home_screen.dart +++ b/Flutter-App/lib/screens/home_screen.dart @@ -1,5 +1,9 @@ import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; +import 'package:latlong/latlong.dart'; class HomeScreen extends StatefulWidget { static const String id = "home"; @@ -12,6 +16,30 @@ class _HomeScreenState extends State { final _auth = FirebaseAuth.instance; FirebaseUser loggedInUser; + List allMarkers = []; + + setMarkers() { + allMarkers.add( + Marker( + width: 45.0, + height: 45.0, + point: LatLng(5.9772833, 80.5087741), + builder: (context) => Container( + child: IconButton( + icon: Icon(Icons.location_on), + color: Colors.red, + iconSize: 45, + onPressed: () { + debugPrint("talp"); + }, + ), + ), + ), + ); + + return allMarkers; + } + void getCurrentUser() async { try { final user = await _auth.currentUser(); @@ -30,7 +58,6 @@ class _HomeScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( leading: null, iconTheme: IconThemeData( @@ -50,6 +77,51 @@ class _HomeScreenState extends State { )), backgroundColor: Colors.blueAccent, ), + + floatingActionButton: SpeedDial( + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon(Icons.location_searching), + label: "Your Location", + onTap: () => print("p1") +// () { +// getCurrentLocation(); +// } + ), + SpeedDialChild( + child: Icon(Icons.add_location), + label: "Add Location", + onTap: () => print("p2") +// () { +// addLocationToFierstore(); +// } + ), + ], + ), + + + body: new FlutterMap( + options: new MapOptions( + center: LatLng(7.8731, 80.7718), +// zoom: 8.0, + zoom: 7.5, + ), + layers: [ + new TileLayerOptions( + urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + subdomains: ['a', 'b', 'c'], +// urlTemplate: +// 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', +// subdomains: ['a', 'b', 'c'], +// tileProvider: CachedNetworkTileProvider(), + ), + MarkerLayerOptions( + markers: setMarkers(), + ), + ], + ), + ); } } diff --git a/Flutter-App/lib/screens/main_screen.dart b/Flutter-App/lib/screens/main_screen.dart index b049f54..3fd8ed0 100644 --- a/Flutter-App/lib/screens/main_screen.dart +++ b/Flutter-App/lib/screens/main_screen.dart @@ -27,19 +27,17 @@ class _MainScreenState extends State { } } - final PageController _pageController = PageController(); + @override void initState() { super.initState(); getCurrentUser(); } - @override Widget build(BuildContext context) { return Scaffold( - body: PageView( controller: _pageController, children: [ @@ -55,7 +53,6 @@ class _MainScreenState extends State { }); }), - bottomNavigationBar: CurvedNavigationBar( color: Colors.blueAccent, backgroundColor: Colors.white70, diff --git a/Flutter-App/lib/screens/map_screen.dart b/Flutter-App/lib/screens/map_screen.dart index b2ff888..5e19867 100644 --- a/Flutter-App/lib/screens/map_screen.dart +++ b/Flutter-App/lib/screens/map_screen.dart @@ -1,7 +1,9 @@ import 'dart:async'; import 'dart:typed_data'; +import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:location/location.dart'; @@ -19,6 +21,8 @@ class _MapScreenState extends State { Circle circle; GoogleMapController _controller; + var location; + static final CameraPosition initialLocation = CameraPosition( target: LatLng(7.8731, 80.7718), zoom: 8.4746, @@ -52,17 +56,22 @@ class _MapScreenState extends State { }); } + void addLocationToFierstore() { + Firestore.instance.collection('markers').add({ + 'coodrs': GeoPoint(location.latitude, location.longitude), + 'place': "user location" + }); + } + void getCurrentLocation() async { try { Uint8List imageData = await getMarker(); - var location = await _locationTracker.getLocation(); - + location = await _locationTracker.getLocation(); updateMarkerAndCircle(location, imageData); if (_locationSubscription != null) { _locationSubscription.cancel(); } - _locationSubscription = _locationTracker.onLocationChanged().listen((newLocalData) { if (_controller != null) { @@ -72,6 +81,7 @@ class _MapScreenState extends State { target: LatLng(newLocalData.latitude, newLocalData.longitude), tilt: 0, zoom: 18.00))); + updateMarkerAndCircle(newLocalData, imageData); } }); @@ -120,11 +130,30 @@ class _MapScreenState extends State { _controller = controller; }, ), - floatingActionButton: FloatingActionButton( - child: Icon(Icons.location_searching), - onPressed: () { - getCurrentLocation(); - }), + floatingActionButton: SpeedDial( + animatedIcon: AnimatedIcons.menu_close, + onOpen:(){ + getCurrentLocation(); + }, + children: [ + SpeedDialChild( + child: Icon(Icons.add_location), + backgroundColor: Colors.orange, + labelBackgroundColor: Colors.orangeAccent, + label: "Add Location", + onTap: () { + addLocationToFierstore(); + }), + SpeedDialChild( + child: Icon(Icons.add_location), + backgroundColor: Colors.red, + labelBackgroundColor: Colors.redAccent, + label: "Remove Location", + onTap: () { + + }), + ], + ), ); } } diff --git a/Flutter-App/lib/screens/report_screen.dart b/Flutter-App/lib/screens/report_screen.dart index 4bbe217..f03a7cf 100644 --- a/Flutter-App/lib/screens/report_screen.dart +++ b/Flutter-App/lib/screens/report_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; class ReportScreen extends StatefulWidget { static const String id = "report"; @@ -50,6 +51,28 @@ class _ReportScreenState extends State { )), backgroundColor: Colors.blueAccent, ), + floatingActionButton: SpeedDial( + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon(Icons.location_searching), + label: "Your Location", + onTap: () => print("p1") +// () { +// getCurrentLocation(); +// } + ), + SpeedDialChild( + child: Icon(Icons.add_location), + label: "Add Location", + onTap: () => print("p2") +// () { +// addLocationToFierstore(); +// } + ), + ], + ), + ); } } diff --git a/Flutter-App/pubspec.lock b/Flutter-App/pubspec.lock index 47383f4..0fa9548 100644 --- a/Flutter-App/pubspec.lock +++ b/Flutter-App/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + ansicolor: + dependency: transitive + description: + name: ansicolor + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" archive: dependency: transitive description: @@ -29,6 +36,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.5" + cached_network_image: + dependency: transitive + description: + name: cached_network_image + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" charcode: dependency: transitive description: @@ -50,6 +64,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.14.11" + console_log_handler: + dependency: transitive + description: + name: console_log_handler + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" convert: dependency: transitive description: @@ -118,6 +139,27 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.3" + flutter_image: + dependency: transitive + description: + name: flutter_image + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + flutter_map: + dependency: "direct main" + description: + name: flutter_map + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.2" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -125,6 +167,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.6" + flutter_speed_dial: + dependency: "direct main" + description: + name: flutter_speed_dial + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.5" flutter_test: dependency: "direct dev" description: flutter @@ -170,6 +219,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.4" + intl: + dependency: transitive + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.16.1" js: dependency: transitive description: @@ -177,6 +233,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.6.1+1" + latlong: + dependency: transitive + description: + name: latlong + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.1" location: dependency: "direct main" description: @@ -184,6 +247,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.5.4" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "0.11.4" matcher: dependency: transitive description: @@ -212,6 +282,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.6.4" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.5" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" pedantic: dependency: transitive description: @@ -226,6 +317,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" plugin_platform_interface: dependency: transitive description: @@ -233,6 +331,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + positioned_tap_detector: + dependency: transitive + description: + name: positioned_tap_detector + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" quiver: dependency: transitive description: @@ -259,6 +364,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.5.5" + sqflite: + dependency: transitive + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0+1" stack_trace: dependency: transitive description: @@ -280,6 +399,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.5" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" term_glyph: dependency: transitive description: @@ -294,6 +420,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.11" + transparent_image: + dependency: transitive + description: + name: transparent_image + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + tuple: + dependency: transitive + description: + name: tuple + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" typed_data: dependency: transitive description: @@ -301,6 +441,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.6" + uuid: + dependency: transitive + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" + validate: + dependency: transitive + description: + name: validate + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.0" vector_math: dependency: transitive description: @@ -316,5 +470,5 @@ packages: source: hosted version: "3.5.0" sdks: - dart: ">=2.7.0-dev <3.0.0" + dart: ">=2.7.0 <3.0.0" flutter: ">=1.12.13+hotfix.5 <2.0.0" diff --git a/Flutter-App/pubspec.yaml b/Flutter-App/pubspec.yaml index 7244951..576288b 100644 --- a/Flutter-App/pubspec.yaml +++ b/Flutter-App/pubspec.yaml @@ -16,11 +16,11 @@ dependencies: cloud_firestore: ^0.12.9+5 modal_progress_hud: ^0.1.3 curved_navigation_bar: ^0.3.2 - -# google_maps_flutter: ^0.5.11+1 google_maps_flutter: ^0.5.25 geoflutterfire: ^2.0.3+2 location: ^2.3.5 + flutter_map: ^0.8.2 + flutter_speed_dial: ^1.2.5 dev_dependencies: From 9928a69bd6eaab79b4a86923bb9fac9c9d39b0ca Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Sun, 29 Mar 2020 17:14:06 +0530 Subject: [PATCH 23/25] dialog box added --- Flutter-App/lib/main.dart | 4 ++-- Flutter-App/lib/screens/main_screen.dart | 4 ++-- ..._screen.dart => user_location_screen.dart} | 19 +++++++++++++------ 3 files changed, 17 insertions(+), 10 deletions(-) rename Flutter-App/lib/screens/{map_screen.dart => user_location_screen.dart} (88%) diff --git a/Flutter-App/lib/main.dart b/Flutter-App/lib/main.dart index 1523740..757641d 100644 --- a/Flutter-App/lib/main.dart +++ b/Flutter-App/lib/main.dart @@ -1,4 +1,4 @@ -import 'package:dengue_stop/screens/map_screen.dart'; +import 'package:dengue_stop/screens/user_location_screen.dart'; import 'package:dengue_stop/screens/post_screen.dart'; import 'package:dengue_stop/screens/report_screen.dart'; import 'package:flutter/material.dart'; @@ -27,7 +27,7 @@ class DengueStop extends StatelessWidget { ReportScreen.id:(context) => ReportScreen(), PostScreen.id:(context) => PostScreen(), ChatScreen.id:(context) => ChatScreen(), - MapScreen.id:(context) => MapScreen(), + UserLocationScreen.id:(context) => UserLocationScreen(), }, ); diff --git a/Flutter-App/lib/screens/main_screen.dart b/Flutter-App/lib/screens/main_screen.dart index 3fd8ed0..fd50fd1 100644 --- a/Flutter-App/lib/screens/main_screen.dart +++ b/Flutter-App/lib/screens/main_screen.dart @@ -5,7 +5,7 @@ import 'package:dengue_stop/screens/report_screen.dart'; import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'chat_screen.dart'; -import 'map_screen.dart'; +import 'user_location_screen.dart'; class MainScreen extends StatefulWidget { static const String id = "main"; @@ -45,7 +45,7 @@ class _MainScreenState extends State { ReportScreen(), PostScreen(), ChatScreen(), - MapScreen(), + UserLocationScreen(), ], onPageChanged: (int index) { setState(() { diff --git a/Flutter-App/lib/screens/map_screen.dart b/Flutter-App/lib/screens/user_location_screen.dart similarity index 88% rename from Flutter-App/lib/screens/map_screen.dart rename to Flutter-App/lib/screens/user_location_screen.dart index 5e19867..af7828f 100644 --- a/Flutter-App/lib/screens/map_screen.dart +++ b/Flutter-App/lib/screens/user_location_screen.dart @@ -1,20 +1,24 @@ import 'dart:async'; import 'dart:typed_data'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:dengue_stop/components/dialog_box.dart'; import 'package:flutter/services.dart'; import 'package:flutter/material.dart'; import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:location/location.dart'; -class MapScreen extends StatefulWidget { - static const String id = "map"; +class UserLocationScreen extends StatefulWidget { + static const String id = "user_location"; @override - _MapScreenState createState() => _MapScreenState(); + _UserLocationScreenState createState() => _UserLocationScreenState(); } -class _MapScreenState extends State { +class _UserLocationScreenState extends State { + + DialogBox _dialogBox = DialogBox(); + StreamSubscription _locationSubscription; Location _locationTracker = Location(); Marker marker; @@ -115,7 +119,7 @@ class _MapScreenState extends State { Navigator.pop(context); }), ], - title: Text('Map', + title: Text('Your Location', style: TextStyle( color: Colors.white, )), @@ -143,6 +147,8 @@ class _MapScreenState extends State { label: "Add Location", onTap: () { addLocationToFierstore(); + _dialogBox.information( + context, 'Add Location', 'Your Location Added'); }), SpeedDialChild( child: Icon(Icons.add_location), @@ -150,7 +156,8 @@ class _MapScreenState extends State { labelBackgroundColor: Colors.redAccent, label: "Remove Location", onTap: () { - + _dialogBox.information( + context, 'Remove Location', 'Sorry, this is not yet implemented'); }), ], ), From cf41d30c3146406e9b4d22a215c4c4d289a93496 Mon Sep 17 00:00:00 2001 From: viradhanus <59219626+viradhanus@users.noreply.github.com> Date: Mon, 30 Mar 2020 00:49:42 +0530 Subject: [PATCH 24/25] retrive data from firestore --- Flutter-App/.packages | 3 +- Flutter-App/lib/screens/home_screen.dart | 109 ++++++++++++------ Flutter-App/lib/screens/main_screen.dart | 4 +- Flutter-App/lib/screens/report_screen.dart | 46 ++++---- .../lib/screens/user_location_screen.dart | 2 +- Flutter-App/pubspec.lock | 7 ++ Flutter-App/pubspec.yaml | 2 +- 7 files changed, 107 insertions(+), 66 deletions(-) diff --git a/Flutter-App/.packages b/Flutter-App/.packages index d0ed6f1..2be7898 100644 --- a/Flutter-App/.packages +++ b/Flutter-App/.packages @@ -1,4 +1,4 @@ -# Generated by pub on 2020-03-29 15:32:38.713681. +# Generated by pub on 2020-03-30 00:01:02.496228. ansicolor:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/ansicolor-1.0.2/lib/ archive:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/archive-2.0.11/lib/ args:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/args-1.5.2/lib/ @@ -13,6 +13,7 @@ convert:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/conver crypto:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-2.1.3/lib/ cupertino_icons:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-0.1.3/lib/ curved_navigation_bar:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/curved_navigation_bar-0.3.2/lib/ +fab_circular_menu:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/fab_circular_menu-1.0.0/lib/ firebase:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-7.2.1/lib/ firebase_auth:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.14.0+9/lib/ firebase_core:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.4.4+3/lib/ diff --git a/Flutter-App/lib/screens/home_screen.dart b/Flutter-App/lib/screens/home_screen.dart index 8a78873..4e477b9 100644 --- a/Flutter-App/lib/screens/home_screen.dart +++ b/Flutter-App/lib/screens/home_screen.dart @@ -1,3 +1,5 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:fab_circular_menu/fab_circular_menu.dart'; import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter_map/flutter_map.dart'; @@ -55,6 +57,56 @@ class _HomeScreenState extends State { getCurrentUser(); } + Widget loadMap() { + return StreamBuilder( + stream: Firestore.instance.collection('markers').snapshots(), + builder: (context, snapshot) { + if (!snapshot.hasData) return Text('Loading maps..'); + for (int i = 0; i < snapshot.data.documents.length; i++) { + allMarkers.add( + Marker( + width: 45.0, + height: 45.0, + point: LatLng(snapshot.data.documents[i]['coords'].latitude, + snapshot.data.documents[i]['coords'].longitude), + builder: (context) => Container( + child: IconButton( + icon: Icon(Icons.location_on), + color: Colors.red, + iconSize: 45, + onPressed: () { + print(snapshot.data.documents[i]['place']); + }, + ), + ), + ), + ); + } + + return new FlutterMap( + options: new MapOptions( + center: LatLng(7.8731, 80.7718), +// zoom: 8.0, + zoom: 7.5, + ), + layers: [ + new TileLayerOptions( + urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + subdomains: ['a', 'b', 'c'], +// urlTemplate: +// 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', +// subdomains: ['a', 'b', 'c'], +// tileProvider: CachedNetworkTileProvider(), + ), + MarkerLayerOptions( + markers: allMarkers, + ), + ], + ); + }, + ); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -71,57 +123,38 @@ class _HomeScreenState extends State { Navigator.pop(context); }), ], - title: Text('Dengue Stop', + title: Text('Patient Distribution', style: TextStyle( color: Colors.white, )), backgroundColor: Colors.blueAccent, ), + floatingActionButton:SpeedDial( + animatedIcon: AnimatedIcons.menu_close, - floatingActionButton: SpeedDial( - animatedIcon: AnimatedIcons.menu_close, children: [ - SpeedDialChild( - child: Icon(Icons.location_searching), - label: "Your Location", - onTap: () => print("p1") + SpeedDialChild( + child: Icon(Icons.person), + label: "Male", + labelBackgroundColor: Colors.purpleAccent, + backgroundColor: Colors.purpleAccent, + onTap: () => print("p1") // () { -// getCurrentLocation(); // } - ), - SpeedDialChild( - child: Icon(Icons.add_location), - label: "Add Location", - onTap: () => print("p2") + ), + SpeedDialChild( + child: Icon(Icons.person_outline), + labelBackgroundColor: Colors.orangeAccent, + backgroundColor: Colors.orangeAccent, + label: "Female", + onTap: () => print("p2") // () { // addLocationToFierstore(); // } - ), - ], - ), - - - body: new FlutterMap( - options: new MapOptions( - center: LatLng(7.8731, 80.7718), -// zoom: 8.0, - zoom: 7.5, ), - layers: [ - new TileLayerOptions( - urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - subdomains: ['a', 'b', 'c'], -// urlTemplate: -// 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', -// subdomains: ['a', 'b', 'c'], -// tileProvider: CachedNetworkTileProvider(), - ), - MarkerLayerOptions( - markers: setMarkers(), - ), - ], - ), - + ], + ), + body: loadMap(), ); } } diff --git a/Flutter-App/lib/screens/main_screen.dart b/Flutter-App/lib/screens/main_screen.dart index fd50fd1..319b369 100644 --- a/Flutter-App/lib/screens/main_screen.dart +++ b/Flutter-App/lib/screens/main_screen.dart @@ -66,7 +66,7 @@ class _MainScreenState extends State { color: Colors.white, ), Icon( - Icons.report, + Icons.notifications, size: 20, color: Colors.white, ), @@ -81,7 +81,7 @@ class _MainScreenState extends State { color: Colors.white, ), Icon( - Icons.map, + Icons.my_location, size: 20, color: Colors.white, ), diff --git a/Flutter-App/lib/screens/report_screen.dart b/Flutter-App/lib/screens/report_screen.dart index f03a7cf..8586e49 100644 --- a/Flutter-App/lib/screens/report_screen.dart +++ b/Flutter-App/lib/screens/report_screen.dart @@ -1,3 +1,4 @@ +import 'package:fab_circular_menu/fab_circular_menu.dart'; import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter_speed_dial/flutter_speed_dial.dart'; @@ -10,7 +11,6 @@ class ReportScreen extends StatefulWidget { } class _ReportScreenState extends State { - final _auth = FirebaseAuth.instance; FirebaseUser loggedInUser; @@ -51,28 +51,28 @@ class _ReportScreenState extends State { )), backgroundColor: Colors.blueAccent, ), - floatingActionButton: SpeedDial( - animatedIcon: AnimatedIcons.menu_close, - children: [ - SpeedDialChild( - child: Icon(Icons.location_searching), - label: "Your Location", - onTap: () => print("p1") -// () { -// getCurrentLocation(); -// } - ), - SpeedDialChild( - child: Icon(Icons.add_location), - label: "Add Location", - onTap: () => print("p2") -// () { -// addLocationToFierstore(); -// } - ), - ], - ), - + floatingActionButton: FabCircularMenu(children: [ + IconButton( + icon: Icon(Icons.local_hospital), + onPressed: () { + print('Health tips'); + }), + IconButton( + icon: Icon(Icons.perm_media), + onPressed: () { + print('News'); + }), + IconButton( + icon: Icon(Icons.fastfood), + onPressed: () { + print('Food and Nutrians'); + }), + IconButton( + icon: Icon(Icons.favorite), + onPressed: () { + print('Favorite'); + }) + ]), ); } } diff --git a/Flutter-App/lib/screens/user_location_screen.dart b/Flutter-App/lib/screens/user_location_screen.dart index af7828f..4a6b37e 100644 --- a/Flutter-App/lib/screens/user_location_screen.dart +++ b/Flutter-App/lib/screens/user_location_screen.dart @@ -62,7 +62,7 @@ class _UserLocationScreenState extends State { void addLocationToFierstore() { Firestore.instance.collection('markers').add({ - 'coodrs': GeoPoint(location.latitude, location.longitude), + 'coords': GeoPoint(location.latitude, location.longitude), 'place': "user location" }); } diff --git a/Flutter-App/pubspec.lock b/Flutter-App/pubspec.lock index 0fa9548..ece21c2 100644 --- a/Flutter-App/pubspec.lock +++ b/Flutter-App/pubspec.lock @@ -99,6 +99,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.3.2" + fab_circular_menu: + dependency: "direct main" + description: + name: fab_circular_menu + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" firebase: dependency: transitive description: diff --git a/Flutter-App/pubspec.yaml b/Flutter-App/pubspec.yaml index 576288b..4aa8ef5 100644 --- a/Flutter-App/pubspec.yaml +++ b/Flutter-App/pubspec.yaml @@ -21,7 +21,7 @@ dependencies: location: ^2.3.5 flutter_map: ^0.8.2 flutter_speed_dial: ^1.2.5 - + fab_circular_menu: ^1.0.0 dev_dependencies: flutter_test: From 677e16c374c1f540e2a22ea39e7f3916816a9002 Mon Sep 17 00:00:00 2001 From: Viraj Dhanushka Date: Sun, 16 Aug 2020 01:46:07 +0530 Subject: [PATCH 25/25] sadf sdf --- Flutter-App/.gitignore | 3 + Flutter-App/.packages | 150 ++++++++++-------- Flutter-App/android/app/build.gradle | 2 +- .../android/app/src/main/AndroidManifest.xml | 2 +- Flutter-App/lib/screens/home_screen.dart | 135 ++++++++++------ Flutter-App/lib/screens/main_screen.dart | 2 +- Flutter-App/lib/screens/post_screen.dart | 30 ++++ Flutter-App/lib/screens/report_screen.dart | 23 +-- Flutter-App/pubspec.lock | 80 +++++++++- Flutter-App/pubspec.yaml | 4 +- 10 files changed, 281 insertions(+), 150 deletions(-) diff --git a/Flutter-App/.gitignore b/Flutter-App/.gitignore index ac246c1..5632cd7 100644 --- a/Flutter-App/.gitignore +++ b/Flutter-App/.gitignore @@ -1,3 +1,6 @@ +# Android +google-services.json + # Miscellaneous *.class *.log diff --git a/Flutter-App/.packages b/Flutter-App/.packages index 2be7898..6bd03d4 100644 --- a/Flutter-App/.packages +++ b/Flutter-App/.packages @@ -1,71 +1,81 @@ -# Generated by pub on 2020-03-30 00:01:02.496228. -ansicolor:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/ansicolor-1.0.2/lib/ -archive:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/archive-2.0.11/lib/ -args:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/args-1.5.2/lib/ -async:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.4.0/lib/ -boolean_selector:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.5/lib/ -cached_network_image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cached_network_image-2.0.0/lib/ -charcode:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.2/lib/ -cloud_firestore:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.12.11/lib/ -collection:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.14.11/lib/ -console_log_handler:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/console_log_handler-1.1.6/lib/ -convert:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/convert-2.1.1/lib/ -crypto:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-2.1.3/lib/ -cupertino_icons:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-0.1.3/lib/ -curved_navigation_bar:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/curved_navigation_bar-0.3.2/lib/ -fab_circular_menu:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/fab_circular_menu-1.0.0/lib/ -firebase:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-7.2.1/lib/ -firebase_auth:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.14.0+9/lib/ -firebase_core:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.4.4+3/lib/ -firebase_core_platform_interface:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-1.0.4/lib/ -firebase_core_web:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.1.1+2/lib/ -flutter:file:///C:/src/flutter/flutter/packages/flutter/lib/ -flutter_cache_manager:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_cache_manager-1.1.3/lib/ -flutter_image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_image-3.0.0/lib/ -flutter_map:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_map-0.8.2/lib/ -flutter_plugin_android_lifecycle:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-1.0.6/lib/ -flutter_speed_dial:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_speed_dial-1.2.5/lib/ -flutter_test:file:///C:/src/flutter/flutter/packages/flutter_test/lib/ -flutter_web_plugins:file:///C:/src/flutter/flutter/packages/flutter_web_plugins/lib/ -geoflutterfire:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/geoflutterfire-2.0.3+5/lib/ -google_maps_flutter:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/google_maps_flutter-0.5.25/lib/ -http:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+4/lib/ -http_parser:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.3/lib/ -image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/image-2.1.4/lib/ -intl:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.16.1/lib/ -js:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.1+1/lib/ -latlong:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/latlong-0.6.1/lib/ -location:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/location-2.5.4/lib/ -logging:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/logging-0.11.4/lib/ -matcher:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.6/lib/ -meta:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.1.8/lib/ -modal_progress_hud:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/modal_progress_hud-0.1.3/lib/ -path:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.6.4/lib/ -path_provider:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-1.6.5/lib/ -path_provider_macos:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-0.0.4/lib/ -path_provider_platform_interface:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-1.0.1/lib/ -pedantic:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.8.0+1/lib/ -petitparser:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-2.4.0/lib/ -platform:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/platform-2.2.1/lib/ -plugin_platform_interface:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-1.0.2/lib/ -positioned_tap_detector:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/positioned_tap_detector-1.0.3/lib/ -quiver:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/quiver-2.0.5/lib/ -rxdart:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.22.6/lib/ -sky_engine:file:///C:/src/flutter/flutter/bin/cache/pkg/sky_engine/lib/ -source_span:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.5.5/lib/ -sqflite:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.0/lib/ -sqflite_common:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite_common-1.0.0+1/lib/ -stack_trace:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.9.3/lib/ -stream_channel:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.0.0/lib/ -string_scanner:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.5/lib/ -synchronized:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/synchronized-2.2.0/lib/ -term_glyph:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.1.0/lib/ -test_api:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.2.11/lib/ -transparent_image:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/transparent_image-1.0.0/lib/ -tuple:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/tuple-1.0.3/lib/ -typed_data:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.6/lib/ -uuid:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/uuid-2.0.4/lib/ -validate:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/validate-1.7.0/lib/ -vector_math:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.0.8/lib/ -xml:file:///C:/src/flutter/flutter/.pub-cache/hosted/pub.dartlang.org/xml-3.5.0/lib/ +# Generated by pub on 2020-04-10 12:47:12.955748. +ansicolor:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/ansicolor-1.0.2/lib/ +archive:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/archive-2.0.11/lib/ +args:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/args-1.5.2/lib/ +async:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.4.0/lib/ +boolean_selector:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-1.0.5/lib/ +cached_network_image:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/cached_network_image-2.0.0/lib/ +charcode:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.2/lib/ +cloud_firestore:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.12.11/lib/ +collection:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.14.11/lib/ +console_log_handler:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/console_log_handler-1.1.6/lib/ +convert:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/convert-2.1.1/lib/ +crypto:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-2.1.3/lib/ +cupertino_icons:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-0.1.3/lib/ +curved_navigation_bar:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/curved_navigation_bar-0.3.2/lib/ +equatable:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/equatable-1.1.1/lib/ +extra_pedantic:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/extra_pedantic-1.2.0/lib/ +fab_circular_menu:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/fab_circular_menu-1.0.0/lib/ +firebase:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/firebase-7.2.1/lib/ +firebase_auth:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.14.0+9/lib/ +firebase_core:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.4.4+3/lib/ +firebase_core_platform_interface:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_platform_interface-1.0.4/lib/ +firebase_core_web:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.1.1+2/lib/ +flutter:file:///home/viraj/Documents/Developments/flutter/packages/flutter/lib/ +flutter_cache_manager:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_cache_manager-1.1.3/lib/ +flutter_image:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_image-3.0.0/lib/ +flutter_map:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_map-0.8.2/lib/ +flutter_plugin_android_lifecycle:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-1.0.6/lib/ +flutter_speed_dial:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_speed_dial-1.2.5/lib/ +flutter_test:file:///home/viraj/Documents/Developments/flutter/packages/flutter_test/lib/ +flutter_web_plugins:file:///home/viraj/Documents/Developments/flutter/packages/flutter_web_plugins/lib/ +geodesy:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/geodesy-0.3.2/lib/ +geojson:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/geojson-0.9.1/lib/ +geolocator:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/geolocator-5.3.1/lib/ +geopoint:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/geopoint-0.7.1/lib/ +google_api_availability:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/google_api_availability-2.0.4/lib/ +google_maps_flutter:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/google_maps_flutter-0.5.25/lib/ +http:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.12.0+4/lib/ +http_parser:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.3/lib/ +image:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/image-2.1.4/lib/ +intl:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.16.1/lib/ +iso:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/iso-0.3.0/lib/ +js:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/js-0.6.1+1/lib/ +latlong:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/latlong-0.6.1/lib/ +location:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/location-2.5.4/lib/ +location_permissions:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/location_permissions-2.0.5/lib/ +logging:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/logging-0.11.4/lib/ +map_controller:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/map_controller-0.7.1/lib/ +matcher:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.6/lib/ +meta:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.1.8/lib/ +modal_progress_hud:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/modal_progress_hud-0.1.3/lib/ +path:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.6.4/lib/ +path_provider:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-1.6.5/lib/ +path_provider_macos:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-0.0.4/lib/ +path_provider_platform_interface:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-1.0.1/lib/ +pedantic:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.8.0+1/lib/ +petitparser:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/petitparser-2.4.0/lib/ +platform:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/platform-2.2.1/lib/ +plugin_platform_interface:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-1.0.2/lib/ +positioned_tap_detector:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/positioned_tap_detector-1.0.3/lib/ +quiver:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/quiver-2.0.5/lib/ +rxdart:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/rxdart-0.23.1/lib/ +sky_engine:file:///home/viraj/Documents/Developments/flutter/bin/cache/pkg/sky_engine/lib/ +slugify2:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/slugify2-0.2.1/lib/ +source_span:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.5.5/lib/ +sqflite:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.0/lib/ +sqflite_common:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite_common-1.0.0+1/lib/ +stack_trace:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.9.3/lib/ +stream_channel:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.0.0/lib/ +string_scanner:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.5/lib/ +synchronized:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/synchronized-2.2.0/lib/ +term_glyph:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.1.0/lib/ +test_api:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.2.11/lib/ +transparent_image:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/transparent_image-1.0.0/lib/ +tuple:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/tuple-1.0.3/lib/ +typed_data:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.6/lib/ +uuid:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/uuid-2.0.4/lib/ +validate:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/validate-1.7.0/lib/ +vector_math:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.0.8/lib/ +xml:file:///home/viraj/Documents/Developments/flutter/.pub-cache/hosted/pub.dartlang.org/xml-3.5.0/lib/ dengue_stop:lib/ diff --git a/Flutter-App/android/app/build.gradle b/Flutter-App/android/app/build.gradle index ef2fd6e..3659033 100644 --- a/Flutter-App/android/app/build.gradle +++ b/Flutter-App/android/app/build.gradle @@ -35,7 +35,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.scorelab.denguestop" - minSdkVersion 28 + minSdkVersion 16 targetSdkVersion 29 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/Flutter-App/android/app/src/main/AndroidManifest.xml b/Flutter-App/android/app/src/main/AndroidManifest.xml index 698a194..7bce276 100644 --- a/Flutter-App/android/app/src/main/AndroidManifest.xml +++ b/Flutter-App/android/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> - + { + + LatLng userLocation = LatLng(7.8731, 80.7718); + var zoom =7.5; + + DialogBox _dialogBox = DialogBox(); + final _auth = FirebaseAuth.instance; FirebaseUser loggedInUser; List allMarkers = []; - setMarkers() { - allMarkers.add( - Marker( - width: 45.0, - height: 45.0, - point: LatLng(5.9772833, 80.5087741), - builder: (context) => Container( - child: IconButton( - icon: Icon(Icons.location_on), - color: Colors.red, - iconSize: 45, - onPressed: () { - debugPrint("talp"); - }, + MapController mapController; + + @override + void initState() { + // intialize the controllers + mapController = MapController(); + + super.initState(); + getCurrentUser(); + + } + + + + + void _getCurrentLocation() async { + final position = await Geolocator() + .getCurrentPosition(desiredAccuracy: LocationAccuracy.high); + print(position); + + setState(() { + + userLocation = LatLng(position.latitude, position.longitude); + zoom =12.0; + mapController.move(userLocation,zoom); + + allMarkers.add( + Marker( + width: 45.0, + height: 45.0, + point: userLocation, + builder: (context) => Container( + child: IconButton( + icon: Icon(Icons.location_on), + color: Colors.lightGreenAccent, + iconSize: 45, + onPressed: () {}, + ), ), ), - ), - ); - - return allMarkers; + ); + }); } void getCurrentUser() async { @@ -51,11 +84,7 @@ class _HomeScreenState extends State { } } - @override - void initState() { - super.initState(); - getCurrentUser(); - } + Widget loadMap() { return StreamBuilder( @@ -84,10 +113,12 @@ class _HomeScreenState extends State { } return new FlutterMap( + mapController: mapController, options: new MapOptions( - center: LatLng(7.8731, 80.7718), + center: userLocation, // zoom: 8.0, - zoom: 7.5, + zoom: zoom, + ), layers: [ new TileLayerOptions( @@ -129,31 +160,37 @@ class _HomeScreenState extends State { )), backgroundColor: Colors.blueAccent, ), - floatingActionButton:SpeedDial( - animatedIcon: AnimatedIcons.menu_close, - + floatingActionButton: SpeedDial( + animatedIcon: AnimatedIcons.menu_close, children: [ - SpeedDialChild( - child: Icon(Icons.person), - label: "Male", - labelBackgroundColor: Colors.purpleAccent, - backgroundColor: Colors.purpleAccent, - onTap: () => print("p1") -// () { -// } - ), - SpeedDialChild( - child: Icon(Icons.person_outline), - labelBackgroundColor: Colors.orangeAccent, - backgroundColor: Colors.orangeAccent, - label: "Female", - onTap: () => print("p2") -// () { -// addLocationToFierstore(); -// } - ), - ], - ), + SpeedDialChild( + child: Icon(Icons.location_searching), + label: "my location", + labelBackgroundColor: Colors.greenAccent, + backgroundColor: Colors.lightGreenAccent, + onTap: () { + _getCurrentLocation(); + }), + SpeedDialChild( + child: Icon(Icons.person), + label: "Male", + labelBackgroundColor: Colors.purpleAccent, + backgroundColor: Colors.purpleAccent, + onTap: () { + _dialogBox.information(context, 'Male patients', + 'Sorry, this is not yet implemented'); + }), + SpeedDialChild( + child: Icon(Icons.person_outline), + labelBackgroundColor: Colors.orangeAccent, + backgroundColor: Colors.orangeAccent, + label: "Female", + onTap: () { + _dialogBox.information(context, 'Female patients', + 'Sorry, this is not yet implemented'); + }), + ], + ), body: loadMap(), ); } diff --git a/Flutter-App/lib/screens/main_screen.dart b/Flutter-App/lib/screens/main_screen.dart index 319b369..f9d43d7 100644 --- a/Flutter-App/lib/screens/main_screen.dart +++ b/Flutter-App/lib/screens/main_screen.dart @@ -66,7 +66,7 @@ class _MainScreenState extends State { color: Colors.white, ), Icon( - Icons.notifications, + Icons.local_hospital, size: 20, color: Colors.white, ), diff --git a/Flutter-App/lib/screens/post_screen.dart b/Flutter-App/lib/screens/post_screen.dart index 638ca98..a37c58a 100644 --- a/Flutter-App/lib/screens/post_screen.dart +++ b/Flutter-App/lib/screens/post_screen.dart @@ -1,3 +1,4 @@ +import 'package:fab_circular_menu/fab_circular_menu.dart'; import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; @@ -50,6 +51,35 @@ class _PostScreenState extends State { )), backgroundColor: Colors.blueAccent, ), + + floatingActionButton: FabCircularMenu(children: [ + IconButton( + icon: Icon(Icons.perm_media), + onPressed: () { + print('Timeline'); + }), + IconButton( + icon: Icon(Icons.notifications_active), + onPressed: () { + print('News'); + }), + IconButton( + icon: Icon(Icons.photo_camera), + onPressed: () { + print('Food and Nutrians'); + }), + IconButton( + icon: Icon(Icons.search), + onPressed: () { + print('Favorite'); + }), + IconButton( + icon: Icon(Icons.supervisor_account), + onPressed: () { + print('News'); + }), + ]), + ); } } diff --git a/Flutter-App/lib/screens/report_screen.dart b/Flutter-App/lib/screens/report_screen.dart index 8586e49..abd082d 100644 --- a/Flutter-App/lib/screens/report_screen.dart +++ b/Flutter-App/lib/screens/report_screen.dart @@ -51,28 +51,7 @@ class _ReportScreenState extends State { )), backgroundColor: Colors.blueAccent, ), - floatingActionButton: FabCircularMenu(children: [ - IconButton( - icon: Icon(Icons.local_hospital), - onPressed: () { - print('Health tips'); - }), - IconButton( - icon: Icon(Icons.perm_media), - onPressed: () { - print('News'); - }), - IconButton( - icon: Icon(Icons.fastfood), - onPressed: () { - print('Food and Nutrians'); - }), - IconButton( - icon: Icon(Icons.favorite), - onPressed: () { - print('Favorite'); - }) - ]), + ); } } diff --git a/Flutter-App/pubspec.lock b/Flutter-App/pubspec.lock index ece21c2..dd1a156 100644 --- a/Flutter-App/pubspec.lock +++ b/Flutter-App/pubspec.lock @@ -99,6 +99,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.3.2" + equatable: + dependency: transitive + description: + name: equatable + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + extra_pedantic: + dependency: transitive + description: + name: extra_pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" fab_circular_menu: dependency: "direct main" description: @@ -191,13 +205,41 @@ packages: description: flutter source: sdk version: "0.0.0" - geoflutterfire: + geodesy: + dependency: transitive + description: + name: geodesy + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.2" + geojson: + dependency: transitive + description: + name: geojson + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.1" + geolocator: dependency: "direct main" description: - name: geoflutterfire + name: geolocator url: "https://pub.dartlang.org" source: hosted - version: "2.0.3+5" + version: "5.3.1" + geopoint: + dependency: transitive + description: + name: geopoint + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.1" + google_api_availability: + dependency: transitive + description: + name: google_api_availability + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" google_maps_flutter: dependency: "direct main" description: @@ -233,6 +275,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.16.1" + iso: + dependency: transitive + description: + name: iso + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.0" js: dependency: transitive description: @@ -254,6 +303,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.5.4" + location_permissions: + dependency: transitive + description: + name: location_permissions + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" logging: dependency: transitive description: @@ -261,6 +317,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.11.4" + map_controller: + dependency: "direct main" + description: + name: map_controller + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.1" matcher: dependency: transitive description: @@ -358,12 +421,19 @@ packages: name: rxdart url: "https://pub.dartlang.org" source: hosted - version: "0.22.6" + version: "0.23.1" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" + slugify2: + dependency: transitive + description: + name: slugify2 + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.1" source_span: dependency: transitive description: @@ -478,4 +548,4 @@ packages: version: "3.5.0" sdks: dart: ">=2.7.0 <3.0.0" - flutter: ">=1.12.13+hotfix.5 <2.0.0" + flutter: ">=1.12.13+hotfix.6 <2.0.0" diff --git a/Flutter-App/pubspec.yaml b/Flutter-App/pubspec.yaml index 4aa8ef5..19e66bc 100644 --- a/Flutter-App/pubspec.yaml +++ b/Flutter-App/pubspec.yaml @@ -17,12 +17,14 @@ dependencies: modal_progress_hud: ^0.1.3 curved_navigation_bar: ^0.3.2 google_maps_flutter: ^0.5.25 - geoflutterfire: ^2.0.3+2 +# geoflutterfire: ^2.0.3+2 location: ^2.3.5 flutter_map: ^0.8.2 flutter_speed_dial: ^1.2.5 fab_circular_menu: ^1.0.0 + geolocator: ^5.3.1 + map_controller: ^0.7.1 dev_dependencies: flutter_test: sdk: flutter