├── ios
├── Flutter
│ ├── Debug.xcconfig
│ ├── Release.xcconfig
│ └── AppFrameworkInfo.plist
├── Runner
│ ├── Runner-Bridging-Header.h
│ ├── Assets.xcassets
│ │ ├── LaunchImage.imageset
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ ├── README.md
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-83.5x83.5@2x.png
│ │ │ └── Contents.json
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── Main.storyboard
│ │ └── LaunchScreen.storyboard
│ └── Info.plist
├── Runner.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── WorkspaceSettings.xcsettings
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── IDEWorkspaceChecks.plist
└── .gitignore
├── assets
├── cui.png
├── pin.png
├── un.png
├── alarm.png
├── army.png
├── card.png
├── flame.png
├── gdsc.png
├── home.png
├── info.png
├── logo.png
├── route.jpg
├── shake.png
├── share.png
├── user.png
├── bg-top.png
├── bus-stop.png
├── contact.png
├── hospital.png
├── pharmacy.png
├── settings.png
├── ambulance.png
├── icons
│ ├── book.png
│ ├── alert.png
│ ├── files.png
│ ├── notes.png
│ ├── phone.png
│ └── announcement.png
├── phone_red.png
├── add-contact.png
├── information.png
├── police-badge.png
└── blossoms.json
├── web
├── favicon.png
├── icons
│ ├── Icon-192.png
│ └── Icon-512.png
├── manifest.json
└── index.html
├── android
├── gradle.properties
├── app
│ ├── src
│ │ ├── main
│ │ │ ├── res
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ ├── ic_logo.png
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ ├── ic_logo.png
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ ├── ic_logo.png
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ ├── ic_logo.png
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ ├── ic_logo.png
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── drawable
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── drawable-v21
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── values
│ │ │ │ │ └── styles.xml
│ │ │ │ └── values-night
│ │ │ │ │ └── styles.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ └── womensafteyhackfair
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── AndroidManifest.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── profile
│ │ │ └── AndroidManifest.xml
│ ├── build.gradle
│ └── google-services.json
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── .gitignore
├── settings.gradle
└── build.gradle
├── .metadata
├── lib
├── Dashboard
│ ├── Articles - SafeCarousel
│ │ ├── SadeWebView.dart
│ │ ├── ArticleDesc.dart
│ │ ├── SafeCarousel.dart
│ │ └── AllArticles.dart
│ ├── DashWidgets
│ │ ├── Emergency.dart
│ │ ├── LiveSafeSpots
│ │ │ ├── HospitalCard.dart
│ │ │ ├── PharmacyCard.dart
│ │ │ ├── BusStationCard.dart
│ │ │ └── PoliceStationCard.dart
│ │ ├── DashAppbar.dart
│ │ ├── LiveSafe.dart
│ │ ├── Emergencies
│ │ │ ├── ArmyEmergency.dart
│ │ │ ├── AmbulanceEmergency.dart
│ │ │ ├── FirebrigadeEmergency.dart
│ │ │ └── PoliceEmergency.dart
│ │ └── SafeHome.dart
│ ├── Splsah
│ │ └── Splash.dart
│ ├── Settings
│ │ ├── AboutCard.dart
│ │ ├── About.dart
│ │ ├── SettingsScreen.dart
│ │ └── ChangePin.dart
│ ├── Home.dart
│ ├── ContactScreens
│ │ ├── MyContacts.dart
│ │ └── phonebook_view.dart
│ └── Dashboard.dart
├── animations
│ └── bottomAnimation.dart
├── main.dart
├── constants.dart
└── background_services.dart
├── .gitignore
├── test
└── widget_test.dart
├── README.md
└── pubspec.yaml
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/assets/cui.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/cui.png
--------------------------------------------------------------------------------
/assets/pin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/pin.png
--------------------------------------------------------------------------------
/assets/un.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/un.png
--------------------------------------------------------------------------------
/assets/alarm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/alarm.png
--------------------------------------------------------------------------------
/assets/army.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/army.png
--------------------------------------------------------------------------------
/assets/card.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/card.png
--------------------------------------------------------------------------------
/assets/flame.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/flame.png
--------------------------------------------------------------------------------
/assets/gdsc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/gdsc.png
--------------------------------------------------------------------------------
/assets/home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/home.png
--------------------------------------------------------------------------------
/assets/info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/info.png
--------------------------------------------------------------------------------
/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/logo.png
--------------------------------------------------------------------------------
/assets/route.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/route.jpg
--------------------------------------------------------------------------------
/assets/shake.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/shake.png
--------------------------------------------------------------------------------
/assets/share.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/share.png
--------------------------------------------------------------------------------
/assets/user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/user.png
--------------------------------------------------------------------------------
/web/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/web/favicon.png
--------------------------------------------------------------------------------
/assets/bg-top.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/bg-top.png
--------------------------------------------------------------------------------
/assets/bus-stop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/bus-stop.png
--------------------------------------------------------------------------------
/assets/contact.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/contact.png
--------------------------------------------------------------------------------
/assets/hospital.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/hospital.png
--------------------------------------------------------------------------------
/assets/pharmacy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/pharmacy.png
--------------------------------------------------------------------------------
/assets/settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/settings.png
--------------------------------------------------------------------------------
/assets/ambulance.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/ambulance.png
--------------------------------------------------------------------------------
/assets/icons/book.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/icons/book.png
--------------------------------------------------------------------------------
/assets/phone_red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/phone_red.png
--------------------------------------------------------------------------------
/assets/add-contact.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/add-contact.png
--------------------------------------------------------------------------------
/assets/icons/alert.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/icons/alert.png
--------------------------------------------------------------------------------
/assets/icons/files.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/icons/files.png
--------------------------------------------------------------------------------
/assets/icons/notes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/icons/notes.png
--------------------------------------------------------------------------------
/assets/icons/phone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/icons/phone.png
--------------------------------------------------------------------------------
/assets/information.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/information.png
--------------------------------------------------------------------------------
/assets/police-badge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/police-badge.png
--------------------------------------------------------------------------------
/web/icons/Icon-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/web/icons/Icon-192.png
--------------------------------------------------------------------------------
/web/icons/Icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/web/icons/Icon-512.png
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/assets/icons/announcement.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/assets/icons/announcement.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/android/app/src/main/res/mipmap-hdpi/ic_logo.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/android/app/src/main/res/mipmap-mdpi/ic_logo.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_logo.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_logo.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_logo.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HassamTalha/Amaan-Women-Safety-App/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/example/womensafteyhackfair/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.womensafteyhackfair
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
7 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: b1395592de68cc8ac4522094ae59956dd21a91db
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | 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.
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
4 | def properties = new Properties()
5 |
6 | assert localPropertiesFile.exists()
7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
8 |
9 | def flutterSdkPath = properties.getProperty("flutter.sdk")
10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
12 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/web/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "womensafteyhackfair",
3 | "short_name": "womensafteyhackfair",
4 | "start_url": ".",
5 | "display": "standalone",
6 | "background_color": "#0175C2",
7 | "theme_color": "#0175C2",
8 | "description": "A new Flutter project.",
9 | "orientation": "portrait-primary",
10 | "prefer_related_applications": false,
11 | "icons": [
12 | {
13 | "src": "icons/Icon-192.png",
14 | "sizes": "192x192",
15 | "type": "image/png"
16 | },
17 | {
18 | "src": "icons/Icon-512.png",
19 | "sizes": "512x512",
20 | "type": "image/png"
21 | }
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.4.32'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:4.1.0'
10 | classpath 'com.google.gms:google-services:4.3.10'
11 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | google()
18 | jcenter()
19 | }
20 | }
21 |
22 | rootProject.buildDir = '../build'
23 | subprojects {
24 | project.buildDir = "${rootProject.buildDir}/${project.name}"
25 | }
26 | subprojects {
27 | project.evaluationDependsOn(':app')
28 | }
29 |
30 | task clean(type: Delete) {
31 | delete rootProject.buildDir
32 | }
33 |
--------------------------------------------------------------------------------
/lib/Dashboard/Articles - SafeCarousel/SadeWebView.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
4 | import 'package:womensafteyhackfair/constants.dart';
5 |
6 | class SafeWebView extends StatelessWidget {
7 | final String url;
8 | final String title;
9 | final int index;
10 | const SafeWebView({Key key, this.url, this.title, this.index})
11 | : super(key: key);
12 |
13 | @override
14 | Widget build(BuildContext context) {
15 | return WebviewScaffold(
16 | url: url,
17 | appBar: CupertinoNavigationBar(
18 | middle: Text(title),
19 | trailing: CircleAvatar(
20 | backgroundColor: Colors.grey[200],
21 | backgroundImage: NetworkImage(imageSliders[index]),
22 | ),
23 | ),
24 | );
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | #.vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | **/ios/Flutter/.last_build_id
26 | .dart_tool/
27 | .flutter-plugins
28 | .flutter-plugins-dependencies
29 | .packages
30 | .pub-cache/
31 | .pub/
32 | /build/
33 |
34 | # Web related
35 | lib/generated_plugin_registrant.dart
36 |
37 | # Symbolication related
38 | app.*.symbols
39 |
40 | # Obfuscation related
41 | app.*.map.json
42 |
43 | # Android Studio will place build artifacts here
44 | /android/app/debug
45 | /android/app/profile
46 | /android/app/release
47 |
48 | # Important Logic Files
49 | # lib/background_services.dart
50 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/Emergency.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/Emergencies/AmbulanceEmergency.dart';
3 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/Emergencies/ArmyEmergency.dart';
4 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/Emergencies/FirebrigadeEmergency.dart';
5 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/Emergencies/PoliceEmergency.dart';
6 |
7 | class Emergency extends StatelessWidget {
8 | const Emergency({Key key}) : super(key: key);
9 |
10 | @override
11 | Widget build(BuildContext context) {
12 | return Container(
13 | width: MediaQuery.of(context).size.width,
14 | height: 180,
15 | child: ListView(
16 | physics: BouncingScrollPhysics(),
17 | scrollDirection: Axis.horizontal,
18 | children: [
19 | PoliceEmergency(),
20 | AmbulanceEmergency(),
21 | FireEmergency(),
22 | ArmyEmergency()
23 | ],
24 | ),
25 | );
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/LiveSafeSpots/HospitalCard.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class HospitalCard extends StatelessWidget {
4 | final Function openMapFunc;
5 |
6 | const HospitalCard({Key key, this.openMapFunc}) : super(key: key);
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | return Padding(
11 | padding: const EdgeInsets.only(left: 20),
12 | child: Column(
13 | children: [
14 | Card(
15 | elevation: 3,
16 | shape:
17 | RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
18 | child: InkWell(
19 | onTap: (){
20 | openMapFunc("Hospitals near me");
21 | },
22 | child: Container(
23 | height: 50,
24 | width: 50,
25 | child: Center(
26 | child: Image.asset(
27 | "assets/hospital.png",
28 | height: 32,
29 | ))),
30 | ),
31 | ),
32 | Text("Hospitals")
33 | ],
34 | ),
35 | );
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/LiveSafeSpots/PharmacyCard.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class PharmacyCard extends StatelessWidget {
4 | final Function openMapFunc;
5 |
6 | const PharmacyCard({Key key, this.openMapFunc}) : super(key: key);
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | return Padding(
11 | padding: const EdgeInsets.only(left: 20),
12 | child: Column(
13 | children: [
14 | Card(
15 | elevation: 3,
16 | shape:
17 | RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
18 | child: InkWell(
19 | onTap: (){
20 | openMapFunc("Pharmacies near me");
21 | },
22 | child: Container(
23 | height: 50,
24 | width: 50,
25 | child: Center(
26 | child: Image.asset(
27 | "assets/pharmacy.png",
28 | height: 32,
29 | ))),
30 | ),
31 | ),
32 | Text("Pharmacies")
33 | ],
34 | ),
35 | );
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/LiveSafeSpots/BusStationCard.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class BusStationCard extends StatelessWidget {
4 | final Function openMapFunc;
5 |
6 | const BusStationCard({Key key, this.openMapFunc}) : super(key: key);
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | return Padding(
11 | padding: const EdgeInsets.only(left: 20),
12 | child: Column(
13 | children: [
14 | Card(
15 | elevation: 3,
16 | shape:
17 | RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
18 | child: InkWell(
19 | onTap: (){
20 | openMapFunc("Bus stops near me");
21 | },
22 | child: Container(
23 | height: 50,
24 | width: 50,
25 | child: Center(
26 | child: Image.asset(
27 | "assets/bus-stop.png",
28 | height: 32,
29 | ))),
30 | ),
31 | ),
32 | Text("Bus Stations")
33 | ],
34 | ),
35 | );
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/LiveSafeSpots/PoliceStationCard.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class PoliceStationCard extends StatelessWidget {
4 | final Function openMapFunc;
5 | const PoliceStationCard({Key key, this.openMapFunc}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Padding(
10 | padding: const EdgeInsets.only(left: 20),
11 | child: Column(
12 | children: [
13 | Card(
14 | elevation: 3,
15 | shape:
16 | RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
17 | child: InkWell(
18 | onTap: (){
19 | openMapFunc("Police Stations near me");
20 | },
21 | child: Container(
22 | height: 50,
23 | width: 50,
24 | child: Center(
25 | child: Image.asset(
26 | "assets/police-badge.png",
27 | height: 32,
28 | ))),
29 | ),
30 | ),
31 | Text("Police Stations")
32 | ],
33 | ),
34 | );
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | // This is a basic Flutter widget test.
2 | //
3 | // To perform an interaction with a widget in your test, use the WidgetTester
4 | // utility that Flutter provides. For example, you can send tap and scroll
5 | // gestures. You can also use WidgetTester to find child widgets in the widget
6 | // tree, read text, and verify that the values of widget properties are correct.
7 |
8 | import 'package:flutter/material.dart';
9 | import 'package:flutter_test/flutter_test.dart';
10 |
11 | import 'package:womensafteyhackfair/main.dart';
12 |
13 | void main() {
14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15 | // Build our app and trigger a frame.
16 | await tester.pumpWidget(MyApp());
17 |
18 | // Verify that our counter starts at 0.
19 | expect(find.text('0'), findsOneWidget);
20 | expect(find.text('1'), findsNothing);
21 |
22 | // Tap the '+' icon and trigger a frame.
23 | await tester.tap(find.byIcon(Icons.add));
24 | await tester.pump();
25 |
26 | // Verify that our counter has incremented.
27 | expect(find.text('0'), findsNothing);
28 | expect(find.text('1'), findsOneWidget);
29 | });
30 | }
31 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/DashAppbar.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:womensafteyhackfair/Dashboard/Settings/SettingsScreen.dart';
3 | import 'package:womensafteyhackfair/constants.dart';
4 |
5 | class DashAppbar extends StatelessWidget {
6 | final Function getRandomInt;
7 | final int quoteIndex;
8 | DashAppbar({Key key, this.getRandomInt, this.quoteIndex}) : super(key: key);
9 |
10 | @override
11 | Widget build(BuildContext context) {
12 | return ListTile(
13 | title: Text(
14 | sweetSayings[quoteIndex][0],
15 | style: TextStyle(
16 | color: Colors.grey[600],
17 | ),
18 | ),
19 | subtitle: GestureDetector(
20 | onTap: () {
21 | getRandomInt(true);
22 | },
23 | child: Text(
24 | sweetSayings[quoteIndex][1],
25 | style: TextStyle(
26 | color: Colors.black,
27 | fontWeight: FontWeight.bold,
28 | fontSize: MediaQuery.of(context).size.width * 0.06),
29 | ),
30 | ),
31 | trailing: Card(
32 | elevation: 4,
33 | shape: CircleBorder(),
34 | child: InkWell(
35 | onTap: () {
36 | Navigator.push(context,
37 | MaterialPageRoute(builder: (context) => SettingsScreen()));
38 | },
39 | child: Padding(
40 | padding: const EdgeInsets.all(4.0),
41 | child: Image.asset(
42 | "assets/settings.png",
43 | height: 24,
44 | ),
45 | ),
46 | ),
47 | ),
48 | );
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | womensafteyhackfair
30 |
31 |
32 |
33 |
36 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | Amaan
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/LiveSafe.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/LiveSafeSpots/BusStationCard.dart';
3 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/LiveSafeSpots/HospitalCard.dart';
4 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/LiveSafeSpots/PharmacyCard.dart';
5 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/LiveSafeSpots/PoliceStationCard.dart';
6 | import 'package:url_launcher/url_launcher.dart';
7 | import 'package:fluttertoast/fluttertoast.dart';
8 |
9 | class LiveSafe extends StatelessWidget {
10 | const LiveSafe({Key key}) : super(key: key);
11 |
12 | @override
13 | Widget build(BuildContext context) {
14 | return Container(
15 | height: 90,
16 | width: MediaQuery.of(context).size.width,
17 | child: ListView(
18 | scrollDirection: Axis.horizontal,
19 | physics: BouncingScrollPhysics(),
20 | children: [
21 | PoliceStationCard(openMapFunc: openMap),
22 | HospitalCard(openMapFunc: openMap),
23 | PharmacyCard(openMapFunc: openMap),
24 | BusStationCard(openMapFunc: openMap)
25 | ]),
26 | );
27 | }
28 |
29 | static Future openMap(String location) async {
30 | String googleUrl =
31 | 'https://www.google.com/maps/search/?api=1&query=$location';
32 |
33 | try {
34 | await launch(googleUrl);
35 | } catch (e) {
36 | print(e);
37 | Fluttertoast.showToast(
38 | msg: "Something went wrong! Call emergency numbers.");
39 | }
40 | // if (await canLaunch(googleUrl)) {
41 | // await launch(googleUrl);
42 | // } else {
43 | // throw 'Could not open the map.';
44 | // }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/lib/animations/bottomAnimation.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:flutter/material.dart';
4 |
5 | class Animator extends StatefulWidget {
6 | final Widget child;
7 | final Duration time;
8 |
9 | Animator(this.child, this.time);
10 |
11 | @override
12 | _AnimatorState createState() => _AnimatorState();
13 | }
14 |
15 | class _AnimatorState extends State
16 | with SingleTickerProviderStateMixin {
17 | Timer timer;
18 | AnimationController animationController;
19 | Animation animation;
20 |
21 | @override
22 | void initState() {
23 | super.initState();
24 | animationController =
25 | AnimationController(duration: Duration(milliseconds: 290), vsync: this);
26 | animation =
27 | CurvedAnimation(parent: animationController, curve: Curves.easeInOut);
28 | timer = Timer(widget.time, animationController.forward);
29 | }
30 |
31 | @override
32 | void dispose() {
33 | animationController.dispose();
34 | super.dispose();
35 | timer.cancel();
36 | }
37 |
38 | @override
39 | Widget build(BuildContext context) {
40 | return AnimatedBuilder(
41 | animation: animation,
42 | child: widget.child,
43 | builder: (BuildContext context, Widget child) {
44 | return Opacity(
45 | opacity: animation.value,
46 | child: Transform.translate(
47 | offset: Offset(0.0, (1 - animation.value) * 20),
48 | child: child,
49 | ),
50 | );
51 | },
52 | );
53 | }
54 | }
55 |
56 | Timer timer;
57 | Duration duration = Duration();
58 |
59 | wait() {
60 | if (timer == null || !timer.isActive) {
61 | timer = Timer(Duration(microseconds: 120), () {
62 | duration = Duration();
63 | });
64 | }
65 | duration += Duration(milliseconds: 100);
66 | return duration;
67 | }
68 |
69 | class WidgetAnimator extends StatelessWidget {
70 | final Widget child;
71 |
72 | WidgetAnimator(this.child);
73 |
74 | @override
75 | Widget build(BuildContext context) {
76 | return Animator(child, wait());
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'com.google.gms.google-services'
26 | apply plugin: 'kotlin-android'
27 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
28 |
29 | android {
30 | compileSdkVersion 30
31 |
32 | sourceSets {
33 | main.java.srcDirs += 'src/main/kotlin'
34 | }
35 |
36 | defaultConfig {
37 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
38 | applicationId "com.example.womensafteyhackfair"
39 | minSdkVersion 21
40 | targetSdkVersion 30
41 | versionCode flutterVersionCode.toInteger()
42 | versionName flutterVersionName
43 | }
44 |
45 | buildTypes {
46 | release {
47 | // TODO: Add your own signing config for the release build.
48 | // Signing with the debug keys for now, so `flutter run --release` works.
49 | signingConfig signingConfigs.debug
50 | }
51 | }
52 | }
53 |
54 | flutter {
55 | source '../..'
56 | }
57 |
58 | dependencies {
59 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
60 | implementation platform('com.google.firebase:firebase-bom:28.4.2')
61 | implementation 'com.google.firebase:firebase-analytics'
62 | }
63 |
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:flutter/material.dart';
4 | import 'package:flutter/services.dart';
5 | import 'package:flutter_background_service/flutter_background_service.dart';
6 | import 'package:google_fonts/google_fonts.dart';
7 | import 'package:shared_preferences/shared_preferences.dart';
8 | import 'package:womensafteyhackfair/Dashboard/Dashboard.dart';
9 | import 'package:womensafteyhackfair/Dashboard/Splsah/Splash.dart';
10 | import 'package:womensafteyhackfair/background_services.dart';
11 | import 'package:workmanager/workmanager.dart';
12 |
13 |
14 |
15 | void main() async {
16 | WidgetsFlutterBinding.ensureInitialized();
17 | await FlutterBackgroundService.initialize(onStart);
18 | Workmanager().initialize(
19 | callbackDispatcher,
20 | isInDebugMode: false,
21 | );
22 |
23 | SystemChrome.setPreferredOrientations(
24 | [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]).then((_) {
25 | runApp(MyApp());
26 | });
27 | }
28 |
29 | class MyApp extends StatelessWidget {
30 |
31 |
32 | @override
33 | Widget build(BuildContext context) {
34 | return MaterialApp(
35 | debugShowCheckedModeBanner: false,
36 | title: 'Amaan',
37 | theme: ThemeData(
38 | fontFamily: GoogleFonts.poppins().fontFamily,
39 | primarySwatch: Colors.blue,
40 | ),
41 | home: FutureBuilder(
42 | future: isAppOpeningForFirstTime(),
43 | builder: (context, AsyncSnapshot snap) {
44 | if (snap.hasData) {
45 | if (snap.data) {
46 | return Dashboard();
47 | } else {
48 | return Splash();
49 | }
50 | } else {
51 | return Container(
52 | color: Colors.white,
53 | );
54 | }
55 | }),
56 | );
57 | }
58 |
59 | Future isAppOpeningForFirstTime() async {
60 | SharedPreferences prefs = await SharedPreferences.getInstance();
61 | bool result = prefs.getBool("appOpenedBefore") ?? false;
62 | if (!result) {
63 | prefs.setBool("appOpenedBefore", true);
64 | }
65 | return result;
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/lib/Dashboard/Splsah/Splash.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:flutter/material.dart';
4 | import 'package:lottie/lottie.dart';
5 | import 'package:womensafteyhackfair/Dashboard/Dashboard.dart';
6 |
7 | class Splash extends StatefulWidget {
8 | const Splash({Key key}) : super(key: key);
9 |
10 | @override
11 | _SplashState createState() => _SplashState();
12 | }
13 |
14 | class _SplashState extends State {
15 | @override
16 | void initState() {
17 | super.initState();
18 |
19 | Timer(Duration(seconds: 3), () {
20 | Navigator.pushReplacement(
21 | context,
22 | MaterialPageRoute(
23 | builder: (context) => Dashboard(),
24 | ),
25 | );
26 | });
27 | }
28 |
29 | @override
30 | Widget build(BuildContext context) {
31 | return Scaffold(
32 | backgroundColor: Color(0xFFFD8080),
33 | body: Stack(
34 | children: [
35 | Align(
36 | alignment: Alignment.center,
37 | child: Lottie.asset('assets/blossoms.json',
38 | height: MediaQuery.of(context).size.width * 1.2)),
39 | Align(
40 | alignment: Alignment.topCenter,
41 | child: Padding(
42 | padding: EdgeInsets.only(top: 80),
43 | child: Image.asset(
44 | "assets/logo.png",
45 | height: 100,
46 | ),
47 | ),
48 | ),
49 | Align(
50 | alignment: Alignment.bottomCenter,
51 | child: Padding(
52 | padding: const EdgeInsets.only(bottom: 180.0),
53 | child: Text(
54 | "AMAAN",
55 | style: TextStyle(
56 | color: Colors.white,
57 | fontWeight: FontWeight.bold,
58 | fontSize: 24),
59 | ),
60 | ),
61 | ),
62 | Align(
63 | alignment: Alignment.bottomCenter,
64 | child: Padding(
65 | padding: const EdgeInsets.only(bottom: 140.0),
66 | child: Text(
67 | "You deserve to be safe!",
68 | style: TextStyle(color: Colors.white, fontSize: 18),
69 | ),
70 | ),
71 | ),
72 | ],
73 | ));
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/lib/Dashboard/Settings/AboutCard.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class AboutCard extends StatelessWidget {
4 | final String title;
5 | final String subtitle;
6 | final String desc;
7 | final String asset;
8 | final double sizeFactor;
9 | AboutCard(
10 | {Key key,
11 | this.asset,
12 | this.desc,
13 | this.subtitle,
14 | this.title,
15 | this.sizeFactor})
16 | : super(key: key);
17 |
18 | @override
19 | Widget build(BuildContext context) {
20 | return Container(
21 | margin: EdgeInsets.all(20),
22 | width: MediaQuery.of(context).size.width,
23 | height: MediaQuery.of(context).size.height / sizeFactor,
24 | child: Stack(
25 | children: [
26 | Positioned(
27 | bottom: 0,
28 | child: Card(
29 | elevation: 5,
30 | shape: RoundedRectangleBorder(
31 | borderRadius: BorderRadius.circular(20),
32 | ),
33 | child: Container(
34 | width: MediaQuery.of(context).size.width - 50,
35 | child: Column(
36 | crossAxisAlignment: CrossAxisAlignment.start,
37 | mainAxisAlignment: MainAxisAlignment.center,
38 | children: [
39 | SizedBox(
40 | height: 80,
41 | ),
42 | ListTile(
43 | title: Text(
44 | title,
45 | style: TextStyle(
46 | fontWeight: FontWeight.bold, fontSize: 20),
47 | ),
48 | subtitle: Text(subtitle),
49 | ),
50 | Padding(
51 | padding: const EdgeInsets.all(12.0),
52 | child: Text(
53 | desc,
54 | textAlign: TextAlign.left,
55 | ),
56 | )
57 | ],
58 | ),
59 | ),
60 | ),
61 | ),
62 | Padding(
63 | padding: const EdgeInsets.only(left: 20.0),
64 | child: CircleAvatar(
65 | radius: 50,
66 | backgroundColor: Colors.grey[200],
67 | child: Center(
68 | child: Image.asset(
69 | "assets/$asset.png",
70 | height: 70,
71 | )),
72 | ),
73 | ),
74 | ],
75 | ),
76 | );
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
16 |
23 |
27 |
31 |
36 |
40 |
41 |
42 |
43 |
44 |
45 |
47 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
Amaan - You Deserve to be Safe!
2 |
3 | This is Hackfair 2.0 Submission where team from Google DSC COMSATS University Islamabad developed a women safety app and played their part in women rights and empowerment.
4 |
5 | ### 🔽[Download][download] Android APK (TESTING)
6 |
7 |
8 |
9 |
10 |
11 | ## ⚠️ Problem Statement
12 | Unfortunately, over time, violence against the fair sex has been intensified which resulted in an obstacle for them to prosper and grow equitably. Women comprise more than 48% of the population of Pakistan which is nearly half of this state. But due to some conventions and annoying happenings, they are not able to take part in activities as much as men.
13 |
14 |
15 | ## 😃 Inspiration & Motivation
16 | The thing that inspired us all to work for women’s empowerment was their capability to perform and deliver, they are as important as men. We as a student, boys, and part of families wanted to contribute to creating a beneficial cause of empowering women and to give them a tap on the shoulder to keep going and not give up!
17 |
18 | For this, we developed a mobile application named **“Amaan” - You deserve to be Safe!**
19 |
20 | It is a mobile application developed specifically for women. That lets them take a leap that they can count on someone and we made sure that “SOMEONE” will be none other but their own contacts which they can send alerts, locations, and much more.
21 |
22 | ## 📱 Features
23 | Following are the features available in Amaan:
24 | - **Get Home Safe**: Tracking user's location after specific time (Set by the user)
25 | - **Safe Shake**: Shake mobile device to send SOS alerts even if the app is closed!
26 | - **Helplines**: Contact nearest police stations, hospitals, fire brigade, pharmacies etc.
27 |
28 | And related features to women safety :)
29 |
30 | ## 🤔 Features in Future
31 | - **Safe Audio**: Enable user's device audio for recording, that could be used as an evidence by respective department (e.g Police)
32 | - **Overcome SMS Charges**: We want to overcome the charges we required to send the SOS SMS in future in collaboration with our Government hopefully.
33 |
34 | ## ⚒️ Tools & Technology
35 |
36 | - Adobe XD (Ui/Ux Designing)
37 | - Flutter (Mobile App Development)
38 |
39 | ## 👀 More Look & Feel
40 |
41 | Here's what we have developed!
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | [download]: https://drive.google.com/file/d/1tEdz0d6l70O9uDjRZzpHKsav-PiPmlan/view?usp=sharing
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/lib/Dashboard/Home.dart:
--------------------------------------------------------------------------------
1 | import 'dart:math';
2 |
3 | import 'package:flutter/material.dart';
4 | import 'package:womensafteyhackfair/Dashboard/Articles%20-%20SafeCarousel/AllArticles.dart';
5 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/DashAppbar.dart';
6 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/Emergency.dart';
7 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/LiveSafe.dart';
8 | import 'package:womensafteyhackfair/Dashboard/Articles%20-%20SafeCarousel/SafeCarousel.dart';
9 | import 'package:womensafteyhackfair/Dashboard/DashWidgets/SafeHome.dart';
10 |
11 | class Home extends StatefulWidget {
12 | const Home({Key key}) : super(key: key);
13 |
14 | @override
15 | _HomeState createState() => _HomeState();
16 | }
17 |
18 | class _HomeState extends State {
19 | int quoteIndex = 0;
20 | @override
21 | void initState() {
22 | super.initState();
23 | getRandomInt(false);
24 | }
25 |
26 | getRandomInt(fromClick) {
27 | Random rnd = Random();
28 |
29 | quoteIndex = rnd.nextInt(4);
30 | if (mounted && fromClick) {
31 | setState(() {});
32 | }
33 | }
34 |
35 | @override
36 | Widget build(BuildContext context) {
37 | return Column(
38 | crossAxisAlignment: CrossAxisAlignment.start,
39 | children: [
40 | DashAppbar(
41 | getRandomInt: getRandomInt,
42 | quoteIndex: quoteIndex,
43 | ),
44 | Expanded(
45 | child: Container(
46 | child: ListView(
47 | shrinkWrap: true,
48 | children: [
49 | SafeCarousel(),
50 | Padding(
51 | padding: const EdgeInsets.symmetric(horizontal: 8.0),
52 | child: Row(
53 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
54 | children: [
55 | Padding(
56 | padding: const EdgeInsets.all(8.0),
57 | child: Text(
58 | "Emergency",
59 | style: TextStyle(
60 | fontWeight: FontWeight.bold, fontSize: 20),
61 | ),
62 | ),
63 | TextButton(
64 | onPressed: () {
65 | Navigator.push(
66 | context,
67 | MaterialPageRoute(
68 | builder: (context) => AllArticles(),
69 | ),
70 | );
71 | },
72 | child: Text("See More"),
73 | ),
74 | ],
75 | ),
76 | ),
77 | Emergency(),
78 | Padding(
79 | padding:
80 | const EdgeInsets.only(left: 16.0, bottom: 10, top: 10),
81 | child: Text(
82 | "Explore LiveSafe",
83 | style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
84 | ),
85 | ),
86 | LiveSafe(),
87 | SafeHome(),
88 | SizedBox(
89 | height: 50,
90 | )
91 | ],
92 | ),
93 | ),
94 | ),
95 | ],
96 | );
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: womensafteyhackfair
2 | description: A new Flutter project.
3 |
4 | # The following line prevents the package from being accidentally published to
5 | # pub.dev using `pub publish`. This is preferred for private packages.
6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev
7 |
8 | # The following defines the version and build number for your application.
9 | # A version number is three numbers separated by dots, like 1.2.43
10 | # followed by an optional build number separated by a +.
11 | # Both the version and the builder number may be overridden in flutter
12 | # build by specifying --build-name and --build-number, respectively.
13 | # In Android, build-name is used as versionName while build-number used as versionCode.
14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning
15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
16 | # Read more about iOS versioning at
17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
18 | version: 1.0.0+1
19 |
20 | environment:
21 | sdk: ">=2.7.0 <3.0.0"
22 |
23 | dependencies:
24 | background_location: ^0.7.0
25 | carousel_slider: ^4.0.0
26 | contacts_service: ^0.6.3
27 | cupertino_icons: ^1.0.2
28 | flutter:
29 | sdk: flutter
30 | flutter_background_service: ^0.1.5
31 | flutter_launcher_icons: ^0.9.2
32 | flutter_phone_direct_caller: ^2.0.0
33 | flutter_slidable: ^0.6.0
34 | flutter_spinkit: ^5.1.0
35 | flutter_webview_plugin: ^0.4.0
36 | fluttertoast: ^8.0.8
37 | geocoder: ^0.2.1
38 | geolocator: ^5.1.1
39 | google_fonts: ^2.1.0
40 | location: ^2.3.5
41 | lottie: ^1.2.1
42 | permission_handler: ^8.1.6
43 | pinput: ^1.2.1
44 | shake: ^1.0.1
45 | shared_preferences: ^2.0.5
46 | sms_maintained: ^0.2.5
47 | telephony: ^0.1.4
48 | url_launcher: ^6.0.10
49 | vibration: ^1.7.3
50 | workmanager: ^0.4.1
51 |
52 | dev_dependencies:
53 | flutter_test:
54 | sdk: flutter
55 | flutter_icons:
56 | image_path: "assets/logo.png"
57 | android: true
58 | ios: true
59 | # For information on the generic Dart part of this file, see the
60 | # following page: https://dart.dev/tools/pub/pubspec
61 | # The following section is specific to Flutter.
62 | flutter:
63 |
64 | # The following line ensures that the Material Icons font is
65 | # included with your application, so that you can use the icons in
66 | # the material Icons class.
67 | uses-material-design: true
68 |
69 | # To add assets to your application, add an assets section, like this:
70 | assets:
71 | - assets/icons/
72 | - assets/
73 | # - images/a_dot_ham.jpeg
74 | # An image asset can refer to one or more resolution-specific "variants", see
75 | # https://flutter.dev/assets-and-images/#resolution-aware.
76 | # For details regarding adding assets from package dependencies, see
77 | # https://flutter.dev/assets-and-images/#from-packages
78 | # To add custom fonts to your application, add a fonts section here,
79 | # in this "flutter" section. Each entry in this list should have a
80 | # "family" key with the font family name, and a "fonts" key with a
81 | # list giving the asset and other descriptors for the font. For
82 | # example:
83 | # fonts:
84 | # - family: Schyler
85 | # fonts:
86 | # - asset: fonts/Schyler-Regular.ttf
87 | # - asset: fonts/Schyler-Italic.ttf
88 | # style: italic
89 | # - family: Trajan Pro
90 | # fonts:
91 | # - asset: fonts/TrajanPro.ttf
92 | # - asset: fonts/TrajanPro_Bold.ttf
93 | # weight: 700
94 | #
95 | # For details regarding fonts from package dependencies,
96 | # see https://flutter.dev/custom-fonts/#from-packages
97 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/Emergencies/ArmyEmergency.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_phone_direct_caller/flutter_phone_direct_caller.dart';
3 |
4 | class ArmyEmergency extends StatelessWidget {
5 | const ArmyEmergency({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Padding(
10 | padding: const EdgeInsets.only(left: 10.0, bottom: 5),
11 | child: Card(
12 | elevation: 5,
13 | shape: RoundedRectangleBorder(
14 | borderRadius: BorderRadius.circular(20),
15 | ),
16 | child: InkWell(
17 | onTap: () {
18 | _callNumber("1717");
19 | },
20 | child: Container(
21 | height: 180,
22 | width: MediaQuery.of(context).size.width * 0.7,
23 | decoration: BoxDecoration(
24 | borderRadius: BorderRadius.circular(20),
25 | gradient: LinearGradient(
26 | begin: Alignment.topLeft,
27 | end: Alignment.bottomRight,
28 | colors: [
29 | Color(0xFFFD8080),
30 | Color(0xFFFB8580),
31 | Color(0xFFFBD079),
32 | ],
33 | ),
34 | ),
35 | child: Padding(
36 | padding: const EdgeInsets.all(8.0),
37 | child: Column(
38 | crossAxisAlignment: CrossAxisAlignment.start,
39 | children: [
40 | CircleAvatar(
41 | backgroundColor: Colors.white.withOpacity(0.5),
42 | radius: 25,
43 | child: Center(
44 | child: Image.asset(
45 | "assets/army.png",
46 | height: 35,
47 | ))),
48 | Expanded(
49 | child: Column(
50 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
51 | crossAxisAlignment: CrossAxisAlignment.start,
52 | children: [
53 | Text(
54 | "NACTA",
55 | style: TextStyle(
56 | color: Colors.white,
57 | fontWeight: FontWeight.bold,
58 | fontSize: MediaQuery.of(context).size.width * 0.06),
59 | ),
60 | Text(
61 | "National Counter Terrorism Authority",
62 | style: TextStyle(
63 | color: Colors.white,
64 | fontSize:
65 | MediaQuery.of(context).size.width * 0.035),
66 | overflow: TextOverflow.ellipsis,
67 | ),
68 | Container(
69 | height: 30,
70 | width: 100,
71 | decoration: BoxDecoration(
72 | color: Colors.white,
73 | borderRadius: BorderRadius.circular(300)),
74 | child: Center(
75 | child: Text(
76 | "1 -7 -1 -7",
77 | style: TextStyle(
78 | color: Colors.red[300],
79 | fontWeight: FontWeight.bold,
80 | fontSize: 18),
81 | ),
82 | ),
83 | ),
84 | ],
85 | )),
86 | ],
87 | ),
88 | ),
89 | ),
90 | ),
91 | ),
92 | );
93 | }
94 |
95 | _callNumber(number) async {
96 | await FlutterPhoneDirectCaller.callNumber(number);
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/Emergencies/AmbulanceEmergency.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_phone_direct_caller/flutter_phone_direct_caller.dart';
3 |
4 | class AmbulanceEmergency extends StatelessWidget {
5 | const AmbulanceEmergency({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Padding(
10 | padding: const EdgeInsets.only(left: 10.0, bottom: 5),
11 | child: Card(
12 | elevation: 5,
13 | shape: RoundedRectangleBorder(
14 | borderRadius: BorderRadius.circular(20),
15 | ),
16 | child: InkWell(
17 | onTap: () {
18 | _callNumber("1122");
19 | },
20 | child: Container(
21 | height: 180,
22 | width: MediaQuery.of(context).size.width * 0.7,
23 | decoration: BoxDecoration(
24 | borderRadius: BorderRadius.circular(20),
25 | gradient: LinearGradient(
26 | begin: Alignment.topLeft,
27 | end: Alignment.bottomRight,
28 | colors: [
29 | Color(0xFFFD8080),
30 | Color(0xFFFB8580),
31 | Color(0xFFFBD079),
32 | ],
33 | ),
34 | ),
35 | child: Padding(
36 | padding: const EdgeInsets.all(8.0),
37 | child: Column(
38 | crossAxisAlignment: CrossAxisAlignment.start,
39 | children: [
40 | CircleAvatar(
41 | backgroundColor: Colors.white.withOpacity(0.5),
42 | radius: 25,
43 | child: Center(
44 | child: Image.asset(
45 | "assets/ambulance.png",
46 | height: 35,
47 | ))),
48 | Expanded(
49 | child: Column(
50 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
51 | crossAxisAlignment: CrossAxisAlignment.start,
52 | children: [
53 | Text(
54 | "Ambulance",
55 | style: TextStyle(
56 | color: Colors.white,
57 | fontWeight: FontWeight.bold,
58 | fontSize: MediaQuery.of(context).size.width * 0.06),
59 | ),
60 | Text(
61 | "In case of any medical emergency call",
62 | style: TextStyle(
63 | color: Colors.white,
64 | fontSize: MediaQuery.of(context).size.width * 0.035,
65 | ),
66 | overflow: TextOverflow.ellipsis,
67 | ),
68 | Container(
69 | height: 30,
70 | width: 100,
71 | decoration: BoxDecoration(
72 | color: Colors.white,
73 | borderRadius: BorderRadius.circular(300)),
74 | child: Center(
75 | child: Text(
76 | "1 -1 -2 -2",
77 | style: TextStyle(
78 | color: Colors.red[300],
79 | fontWeight: FontWeight.bold,
80 | fontSize: 18),
81 | ),
82 | ),
83 | ),
84 | ],
85 | )),
86 | ],
87 | ),
88 | ),
89 | ),
90 | ),
91 | ),
92 | );
93 | }
94 | }
95 |
96 | _callNumber(number) async {
97 | await FlutterPhoneDirectCaller.callNumber(number);
98 | }
99 |
--------------------------------------------------------------------------------
/lib/Dashboard/Articles - SafeCarousel/ArticleDesc.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:womensafteyhackfair/constants.dart';
3 |
4 | class ArticleDesc extends StatelessWidget {
5 | final int index;
6 | const ArticleDesc({Key key, this.index}) : super(key: key);
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | return Scaffold(
11 | appBar: AppBar(
12 | backgroundColor: Colors.transparent,
13 | elevation: 0,
14 | leading: IconButton(
15 | icon: Icon(
16 | Icons.arrow_back_ios_rounded,
17 | color: Colors.black,
18 | ),
19 | onPressed: () {
20 | Navigator.pop(context);
21 | },
22 | ),
23 | ),
24 | body: ListView(
25 | children: [
26 | ListTile(
27 | leading: CircleAvatar(
28 | backgroundColor: Colors.grey[200],
29 | backgroundImage: NetworkImage(imageSliders[index]),
30 | ),
31 | title: Text(
32 | "Daily Life",
33 | style: TextStyle(color: Colors.grey[600], fontSize: 14),
34 | ),
35 | ),
36 | Padding(
37 | padding: const EdgeInsets.symmetric(horizontal: 16.0),
38 | child: Text(
39 | "Protecting each other at work in markets",
40 | style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
41 | ),
42 | ),
43 | ListTile(
44 | leading: CircleAvatar(
45 | backgroundColor: Colors.grey[100],
46 | child: Center(
47 | child: Image.asset("assets/un.png"),
48 | ),
49 | ),
50 | title: Text("UN WOMEN"),
51 | ),
52 | ArticleImage(
53 | imageStr:
54 | "https://www.unwomen.org/-/media/headquarters/images/sections/news/stories/2017/11/fiji_varanisesemaisamoa_rakirakimarket_1_675pxwide.jpg?la=en&vs=1317"),
55 | Padding(
56 | padding: const EdgeInsets.symmetric(horizontal: 16.0),
57 | child: Text(articles[0][0]),
58 | ),
59 | ArticleImage(
60 | imageStr:
61 | "https://www.unwomen.org/-/media/headquarters/images/sections/news/stories/2018/8/tanzania_daressalaam_bettyjaphet-mtewelle_mchikinimarketvendor_august2018_002_1_960x640.jpg?la=en&vs=4847"),
62 | Padding(
63 | padding: const EdgeInsets.symmetric(horizontal: 16.0),
64 | child: Text(articles[0][1]),
65 | ),
66 | ],
67 | ),
68 | );
69 | }
70 | }
71 |
72 | class ArticleImage extends StatelessWidget {
73 | final String imageStr;
74 | const ArticleImage({Key key, this.imageStr}) : super(key: key);
75 |
76 | @override
77 | Widget build(BuildContext context) {
78 | return Padding(
79 | padding: const EdgeInsets.symmetric(horizontal: 10),
80 | child: Card(
81 | elevation: 4,
82 | shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
83 | child: Container(
84 | height: MediaQuery.of(context).size.height * 0.3,
85 | width: MediaQuery.of(context).size.width - 20,
86 | decoration: BoxDecoration(
87 | color: Colors.grey[200],
88 | borderRadius: BorderRadius.circular(20),
89 | image: DecorationImage(
90 | image: NetworkImage(
91 | imageStr,
92 | //"https://www.unwomen.org/-/media/headquarters/images/sections/news/stories/2018/8/tanzania_daressalaam_bettyjaphet-mtewelle_mchikinimarketvendor_august2018_002_1_960x640.jpg?la=en&vs=4847",
93 | ),
94 | fit: BoxFit.cover),
95 | ),
96 | ),
97 | ),
98 | );
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/lib/constants.dart:
--------------------------------------------------------------------------------
1 | List> sweetSayings = [
2 | ["Your presence,", "lights up the whole room"],
3 | ["We admire", "Your strong personality."],
4 | ["We’ll help you", "In any way we can,"],
5 | ["You are Strong", "and courageous"]
6 | ];
7 |
8 | List articleTitle = [
9 | "Pakistani women are inspiring country",
10 | "We have to end Violance",
11 | "Be a change",
12 | "You are strong"
13 | ];
14 | List imageSliders = [
15 | "https://media.istockphoto.com/photos/silhouette-of-super-strong-successful-businesswoman-picture-id1249879109?k=20&m=1249879109&s=612x612&w=0&h=I-joEMjqkq1wCJZJeLWUCd1d2HcB5WxBShdkA9YM0cg=",
16 | "https://media.istockphoto.com/vectors/young-woman-looks-at-the-mirror-and-sees-her-happy-reflection-vector-id1278815846?k=20&m=1278815846&s=612x612&w=0&h=JUTmV9Of-_ILOfXBfV9Cmp_41yuTliSdFIcZy5LKuss=",
17 | "https://media.istockphoto.com/vectors/mental-health-or-psychology-concept-with-flowering-human-head-vector-id1268669581?k=20&m=1268669581&s=612x612&w=0&h=YVLTKCZXKugEn40aqOkir4vcoFeTUAQToa1i3AFYRNU=",
18 | "https://media.istockphoto.com/photos/confidence-and-strength-concept-picture-id1086700012?k=20&m=1086700012&s=612x612&w=0&h=1wWVN3AB7BH7o3y2A2b-NG3HB9H6Dwkc9OLz2lxgwAY=",
19 | ];
20 |
21 | List> articles = [
22 | [
23 | """In Fiji and Tanzania, women market vendors came together to change the culture of their workplace which is the market.
24 | When Varanisese Maisamoa joined the Rakiraki market in Fiji in 2007, she immediately noticed the way that the women market vendors were struggling every day. There was no security, little water supply and not enough lighting.
25 |
26 | “I realized that they had been in this situation for 15, 20 years or more, and nobody had ever listened to their plea,” Maisamoa says.
27 |
28 | In the Mchikichini market in Dar es Salaam, Tanzania, Betty Mtehemu learned that many women were suffering in silence, unable to speak up to protect themselves and their community, some even leaving the industry due to the gender-based violence.
29 |
30 | “I found that everyone was minding their own business, no one helped you when you faced acts of gender-based violence,” says Mtehemu, a market vendor and Chair of the National Women’s Association for Informal Market Traders. “Women would sell their food and not get paid, they were abused by men, and everyone was quiet! There were no measures against gender-based violence.”
31 |
32 | But with awareness sessions on the prevention of sexual harassment, domestic abuse and economic violence and support and legal advice from the local organization Equality for Growth, a grantee of the UN Trust Fund to End Violence against Women, managed by UN Women, there’s been a shift.""",
33 | """
34 |
35 | “It is very important for us women to work with each other,” says Mtehemu. “When we can all speak in a single voice together as women, especially about the challenges faced by a woman, we can face those challenges as a team”.
36 |
37 | Now, the women vendors know what options they have when they are faced with gender-based violence. They formed Women Unions in the market, with committees within each union, and they know how to report and monitor incidents of violence.
38 |
39 | In Fiji, after Maisamoa attended leadership and financial literacy workshops, she formed the Rakiraki Market Vendors Association. The workshops were part of UN Women’s Markets for Change project, funded by the Government of Australia and implemented in partnership with UNDP.
40 |
41 | When the market was damaged by a devastating cyclone in 2016, Maisamoa and the Market Vendor’s Association contributed to making sure the reconstructed market will be cyclone-resilient, including a rain water harvesting system, flood-resistant drainage and a gender-responsive design.
42 |
43 | “Today I am proud of what the association has achieved in terms of improving the safety of the women vendors’ working place. I’m looking forward to a market that is safer, better ventilated, with facilities such as changing areas for babies, improved toilets and a female market security attendant,” Maisamoa says.
44 | """
45 | ]
46 | ];
47 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/Emergencies/FirebrigadeEmergency.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_phone_direct_caller/flutter_phone_direct_caller.dart';
3 |
4 | class FireEmergency extends StatelessWidget {
5 | const FireEmergency({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Padding(
10 | padding: const EdgeInsets.only(left: 10.0, bottom: 5),
11 | child: Card(
12 | elevation: 5,
13 | shape: RoundedRectangleBorder(
14 | borderRadius: BorderRadius.circular(20),
15 | ),
16 | child: InkWell(
17 | onTap: () {
18 | _callNumber("016");
19 | },
20 | child: Container(
21 | height: 180,
22 | width: MediaQuery.of(context).size.width * 0.7,
23 | decoration: BoxDecoration(
24 | borderRadius: BorderRadius.circular(20),
25 | gradient: LinearGradient(
26 | begin: Alignment.topLeft,
27 | end: Alignment.bottomRight,
28 | colors: [
29 | Color(0xFFFD8080),
30 | Color(0xFFFB8580),
31 | Color(0xFFFBD079),
32 | ],
33 | ),
34 | ),
35 | child: Padding(
36 | padding: const EdgeInsets.all(8.0),
37 | child: Column(
38 | crossAxisAlignment: CrossAxisAlignment.start,
39 | children: [
40 | CircleAvatar(
41 | backgroundColor: Colors.white.withOpacity(0.5),
42 | radius: 25,
43 | child: Center(
44 | child: Image.asset(
45 | "assets/flame.png",
46 | height: 35,
47 | ))),
48 | Expanded(
49 | child: Column(
50 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
51 | crossAxisAlignment: CrossAxisAlignment.start,
52 | children: [
53 | Text(
54 | "Fire Brigade",
55 | style: TextStyle(
56 | color: Colors.white,
57 | fontWeight: FontWeight.bold,
58 | fontSize:
59 | MediaQuery.of(context).size.width * 0.06),
60 | ),
61 | Text(
62 | "In case of any Fire emergencies call",
63 | style: TextStyle(
64 | color: Colors.white,
65 | fontSize:
66 | MediaQuery.of(context).size.width * 0.035),
67 | overflow: TextOverflow.ellipsis,
68 | ),
69 | Container(
70 | height: 30,
71 | width: 80,
72 | decoration: BoxDecoration(
73 | color: Colors.white,
74 | borderRadius: BorderRadius.circular(300)),
75 | child: Center(
76 | child: Text(
77 | "0 -1 -6",
78 | style: TextStyle(
79 | color: Colors.red[300],
80 | fontWeight: FontWeight.bold,
81 | fontSize: 18),
82 | ),
83 | ),
84 | ),
85 | ],
86 | ),
87 | ),
88 | ],
89 | ),
90 | ),
91 | ),
92 | ),
93 | ),
94 | );
95 | }
96 |
97 | _callNumber(number) async {
98 | await FlutterPhoneDirectCaller.callNumber(number);
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/Emergencies/PoliceEmergency.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_phone_direct_caller/flutter_phone_direct_caller.dart';
3 |
4 | class PoliceEmergency extends StatelessWidget {
5 | const PoliceEmergency({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Padding(
10 | padding: const EdgeInsets.only(left: 10.0, bottom: 5),
11 | child: Card(
12 | elevation: 5,
13 | shape: RoundedRectangleBorder(
14 | borderRadius: BorderRadius.circular(20),
15 | ),
16 | child: InkWell(
17 | onTap: () {
18 | _callNumber("15");
19 | },
20 | child: Container(
21 | height: 180,
22 | width: MediaQuery.of(context).size.width * 0.7,
23 | decoration: BoxDecoration(
24 | borderRadius: BorderRadius.circular(20),
25 | gradient: LinearGradient(
26 | begin: Alignment.topLeft,
27 | end: Alignment.bottomRight,
28 | colors: [
29 | Color(0xFFFD8080),
30 | Color(0xFFFB8580),
31 | Color(0xFFFBD079),
32 | ],
33 | ),
34 | ),
35 | child: Padding(
36 | padding: const EdgeInsets.all(8.0),
37 | child: Column(
38 | crossAxisAlignment: CrossAxisAlignment.start,
39 | children: [
40 | CircleAvatar(
41 | backgroundColor: Colors.white.withOpacity(0.5),
42 | radius: 25,
43 | child: Center(
44 | child: Image.asset(
45 | "assets/icons/alert.png",
46 | height: 35,
47 | ))),
48 | Expanded(
49 | child: Column(
50 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
51 | crossAxisAlignment: CrossAxisAlignment.start,
52 | children: [
53 | Text(
54 | "Active Emergency",
55 | style: TextStyle(
56 | color: Colors.white,
57 | fontWeight: FontWeight.bold,
58 | fontSize:
59 | MediaQuery.of(context).size.width * 0.06),
60 | ),
61 | Text(
62 | "Call 0-1-5 for emergencies.",
63 | style: TextStyle(
64 | color: Colors.white,
65 | fontSize:
66 | MediaQuery.of(context).size.width * 0.035),
67 | overflow: TextOverflow.ellipsis,
68 | ),
69 | Container(
70 | height: 30,
71 | width: 80,
72 | decoration: BoxDecoration(
73 | color: Colors.white,
74 | borderRadius: BorderRadius.circular(300)),
75 | child: Center(
76 | child: Text(
77 | "0 -1 -5",
78 | style: TextStyle(
79 | color: Colors.red[300],
80 | fontWeight: FontWeight.bold,
81 | fontSize: 18),
82 | ),
83 | ),
84 | ),
85 | ],
86 | ),
87 | ),
88 | ],
89 | ),
90 | ),
91 | ),
92 | ),
93 | ),
94 | );
95 | }
96 |
97 | _callNumber(number) async {
98 | await FlutterPhoneDirectCaller.callNumber(number);
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/lib/Dashboard/Settings/About.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:womensafteyhackfair/Dashboard/Settings/AboutCard.dart';
3 |
4 | class AboutUs extends StatelessWidget {
5 | const AboutUs({Key key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Scaffold(
10 | backgroundColor: Color(0xFFFAF7FA),
11 | appBar: AppBar(
12 | title: Row(
13 | mainAxisSize: MainAxisSize.min,
14 | children: [
15 | Text(
16 | "About Us",
17 | style: TextStyle(color: Colors.black, fontSize: 26),
18 | ),
19 | SizedBox(
20 | width: 10,
21 | ),
22 | Image.asset(
23 | "assets/information.png",
24 | height: 26,
25 | )
26 | ],
27 | ),
28 | backgroundColor: Colors.transparent,
29 | elevation: 0,
30 | centerTitle: true,
31 | leading: Padding(
32 | padding: const EdgeInsets.all(8.0),
33 | child: CircleAvatar(
34 | backgroundColor: Colors.grey[200],
35 | child: IconButton(
36 | icon: Icon(
37 | Icons.arrow_back_ios_rounded,
38 | color: Colors.grey,
39 | ),
40 | onPressed: () {
41 | Navigator.pop(context);
42 | }),
43 | ),
44 | ),
45 | ),
46 | body: ListView(
47 | children: [
48 | AboutCard(
49 | asset: "logo",
50 | desc:
51 | """Amaan is a vigilant mobile application that enables the user to stay connected with the ones who care! It gives the user an option to share live location to concerned people through SOS alerts and enables the user to access emergency services. Be a witness of the unfortunate occurring incident and call for help. It is your personal companion.""",
52 | subtitle: "You Deserve to be safe!",
53 | title: "AMAAN",
54 | sizeFactor: 1.8,
55 | ),
56 | AboutCard(
57 | asset: "gdsc",
58 | desc: "",
59 | subtitle: "Google Developer Student Club - Comsats University",
60 | title: "GDSC - CUI",
61 | sizeFactor: 3,
62 | ),
63 | AboutCard(
64 | asset: "cui",
65 | desc:
66 | """@Kanwal Tanveer, @Fatima, @Mahnoor, @Wadood Jamal, @Shahzaneer, @Zuwanish, @Aftab, @M. Hamza, @Hassam Talha""",
67 | subtitle: "Made with ❤️ for Her!",
68 | title: "Amaan Team",
69 | sizeFactor: 2.5,
70 | ),
71 | Padding(
72 | padding: const EdgeInsets.symmetric(horizontal: 20.0),
73 | child: Card(
74 | shape: RoundedRectangleBorder(
75 | borderRadius: BorderRadius.circular(15)),
76 | elevation: 5,
77 | child: ListTile(
78 | onTap: () {
79 | showLicences(context);
80 | },
81 | leading: CircleAvatar(
82 | backgroundColor: Colors.grey[100],
83 | child: Center(
84 | child: Image.asset("assets/card.png", height: 30),
85 | ),
86 | ),
87 | trailing: Icon(Icons.arrow_forward_ios_rounded),
88 | title: Text("Licences")),
89 | ),
90 | ),
91 | SizedBox(
92 | height: 50,
93 | ),
94 | Row(
95 | children: [
96 | Expanded(
97 | child: Divider(
98 | indent: 10,
99 | endIndent: 10,
100 | ),
101 | ),
102 | Text("© 2021 GDSC CUI, All rights reserved."),
103 | Expanded(
104 | child: Divider(
105 | indent: 10,
106 | endIndent: 10,
107 | ),
108 | ),
109 | ],
110 | ),
111 | SizedBox(
112 | height: 50,
113 | )
114 | ],
115 | ),
116 | );
117 | }
118 |
119 | showLicences(context) {
120 | showAboutDialog(
121 | context: context,
122 | applicationVersion: "1.0.0",
123 | applicationIcon: Image.asset(
124 | "assets/logo.png",
125 | height: 40,
126 | ),
127 | applicationName: "Amaan - Women Saftey",
128 | applicationLegalese:
129 | "GDSC CUI is providing with a solution to female’s problems, an entirely userfriendly app and a need of the hour, aiming to connect you to the ones who care for you!");
130 | }
131 | }
132 |
--------------------------------------------------------------------------------
/android/app/google-services.json:
--------------------------------------------------------------------------------
1 | {
2 | "project_info": {
3 | "project_number": "513918289276",
4 | "firebase_url": "https://testing-project-c7089.firebaseio.com",
5 | "project_id": "testing-project-c7089",
6 | "storage_bucket": "testing-project-c7089.appspot.com"
7 | },
8 | "client": [
9 | {
10 | "client_info": {
11 | "mobilesdk_app_id": "1:513918289276:android:90331bd6101731914a10f9",
12 | "android_client_info": {
13 | "package_name": "com.ashuvssut.women_safety_app"
14 | }
15 | },
16 | "oauth_client": [
17 | {
18 | "client_id": "513918289276-8rgbddfbp1f7f7ipnrraba94ge4rfbpn.apps.googleusercontent.com",
19 | "client_type": 1,
20 | "android_info": {
21 | "package_name": "com.ashuvssut.women_safety_app",
22 | "certificate_hash": "7ddac809df41d79b7f76b068fdc683dd33c68172"
23 | }
24 | },
25 | {
26 | "client_id": "513918289276-fol8f7i5v11v0rf6fcq1h6jsg7ol0i5h.apps.googleusercontent.com",
27 | "client_type": 3
28 | }
29 | ],
30 | "api_key": [
31 | {
32 | "current_key": "AIzaSyDUvl8vpqToOasnRq64WylZOrJXiT2NLnI"
33 | }
34 | ],
35 | "services": {
36 | "appinvite_service": {
37 | "other_platform_oauth_client": [
38 | {
39 | "client_id": "513918289276-fol8f7i5v11v0rf6fcq1h6jsg7ol0i5h.apps.googleusercontent.com",
40 | "client_type": 3
41 | }
42 | ]
43 | }
44 | }
45 | },
46 | {
47 | "client_info": {
48 | "mobilesdk_app_id": "1:513918289276:android:66fa5819c8e0bc094a10f9",
49 | "android_client_info": {
50 | "package_name": "com.example.chat_app"
51 | }
52 | },
53 | "oauth_client": [
54 | {
55 | "client_id": "513918289276-mcc7k25ags9kc1vri09gmd05cngv5t0g.apps.googleusercontent.com",
56 | "client_type": 1,
57 | "android_info": {
58 | "package_name": "com.example.chat_app",
59 | "certificate_hash": "7ddac809df41d79b7f76b068fdc683dd33c68172"
60 | }
61 | },
62 | {
63 | "client_id": "513918289276-fol8f7i5v11v0rf6fcq1h6jsg7ol0i5h.apps.googleusercontent.com",
64 | "client_type": 3
65 | }
66 | ],
67 | "api_key": [
68 | {
69 | "current_key": "AIzaSyDUvl8vpqToOasnRq64WylZOrJXiT2NLnI"
70 | }
71 | ],
72 | "services": {
73 | "appinvite_service": {
74 | "other_platform_oauth_client": [
75 | {
76 | "client_id": "513918289276-fol8f7i5v11v0rf6fcq1h6jsg7ol0i5h.apps.googleusercontent.com",
77 | "client_type": 3
78 | }
79 | ]
80 | }
81 | }
82 | },
83 | {
84 | "client_info": {
85 | "mobilesdk_app_id": "1:513918289276:android:8ac4648ec6b7a5214a10f9",
86 | "android_client_info": {
87 | "package_name": "com.example.excelregister"
88 | }
89 | },
90 | "oauth_client": [
91 | {
92 | "client_id": "513918289276-ehundkpeo0ke0er6boer0usrlrtrelpb.apps.googleusercontent.com",
93 | "client_type": 1,
94 | "android_info": {
95 | "package_name": "com.example.excelregister",
96 | "certificate_hash": "1c1cdbeb6a090376d8b454a7e296b7284814085c"
97 | }
98 | },
99 | {
100 | "client_id": "513918289276-fol8f7i5v11v0rf6fcq1h6jsg7ol0i5h.apps.googleusercontent.com",
101 | "client_type": 3
102 | }
103 | ],
104 | "api_key": [
105 | {
106 | "current_key": "AIzaSyDUvl8vpqToOasnRq64WylZOrJXiT2NLnI"
107 | }
108 | ],
109 | "services": {
110 | "appinvite_service": {
111 | "other_platform_oauth_client": [
112 | {
113 | "client_id": "513918289276-fol8f7i5v11v0rf6fcq1h6jsg7ol0i5h.apps.googleusercontent.com",
114 | "client_type": 3
115 | }
116 | ]
117 | }
118 | }
119 | },
120 | {
121 | "client_info": {
122 | "mobilesdk_app_id": "1:513918289276:android:f2348fc6d4af5e214a10f9",
123 | "android_client_info": {
124 | "package_name": "com.example.womensafteyhackfair"
125 | }
126 | },
127 | "oauth_client": [
128 | {
129 | "client_id": "513918289276-fol8f7i5v11v0rf6fcq1h6jsg7ol0i5h.apps.googleusercontent.com",
130 | "client_type": 3
131 | }
132 | ],
133 | "api_key": [
134 | {
135 | "current_key": "AIzaSyDUvl8vpqToOasnRq64WylZOrJXiT2NLnI"
136 | }
137 | ],
138 | "services": {
139 | "appinvite_service": {
140 | "other_platform_oauth_client": [
141 | {
142 | "client_id": "513918289276-fol8f7i5v11v0rf6fcq1h6jsg7ol0i5h.apps.googleusercontent.com",
143 | "client_type": 3
144 | }
145 | ]
146 | }
147 | }
148 | }
149 | ],
150 | "configuration_version": "1"
151 | }
--------------------------------------------------------------------------------
/lib/Dashboard/ContactScreens/MyContacts.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_slidable/flutter_slidable.dart';
3 | import 'package:fluttertoast/fluttertoast.dart';
4 | import 'package:shared_preferences/shared_preferences.dart';
5 |
6 | class MyContactsScreen extends StatefulWidget {
7 | const MyContactsScreen({Key key}) : super(key: key);
8 |
9 | @override
10 | _MyContactsScreenState createState() => _MyContactsScreenState();
11 | }
12 |
13 | class _MyContactsScreenState extends State {
14 | @override
15 | Widget build(BuildContext context) {
16 | return Scaffold(
17 | backgroundColor: Color(0xFFFAFCFE),
18 | appBar: AppBar(
19 | centerTitle: true,
20 | elevation: 0,
21 | title: Text(
22 | "SOS Contacts",
23 | style: TextStyle(
24 | fontSize: 26, fontWeight: FontWeight.w900, color: Colors.black),
25 | ),
26 | backgroundColor: Colors.transparent,
27 | leading: IconButton(
28 | icon: Image.asset("assets/phone_red.png"),
29 | onPressed: () {},
30 | )),
31 | body: FutureBuilder(
32 | future: checkforContacts(),
33 | builder: (context, AsyncSnapshot> snap) {
34 | if (snap.hasData && snap.data.isNotEmpty) {
35 | return Column(
36 | children: [
37 | Padding(
38 | padding: const EdgeInsets.symmetric(vertical: 8.0),
39 | child: Row(
40 | children: [
41 | Expanded(
42 | child: Divider(
43 | indent: 20,
44 | endIndent: 20,
45 | ),
46 | ),
47 | Text("Swipe left to delete Contact"),
48 | Expanded(
49 | child: Divider(
50 | indent: 20,
51 | endIndent: 20,
52 | ),
53 | ),
54 | ],
55 | ),
56 | ),
57 | Expanded(
58 | child: ListView.builder(
59 | itemCount: snap.data.length,
60 | itemBuilder: (context, index) {
61 | return Slidable(
62 | actionPane: SlidableDrawerActionPane(),
63 | actionExtentRatio: 0.25,
64 | child: Container(
65 | color: Colors.white,
66 | child: ListTile(
67 | leading: CircleAvatar(
68 | backgroundColor: Colors.grey[200],
69 | backgroundImage: AssetImage("assets/user.png"),
70 | ),
71 | title: Text(snap.data[index].split("***")[0] ??
72 | "No Name"),
73 | subtitle: Text(snap.data[index].split("***")[1] ??
74 | "No Contact"),
75 | ),
76 | ),
77 | secondaryActions: [
78 | IconSlideAction(
79 | caption: 'Delete',
80 | color: Colors.red,
81 | icon: Icons.delete,
82 | onTap: () {
83 | print('Delete');
84 | setState(() {
85 | Fluttertoast.showToast(
86 | msg:
87 | "${snap.data[index].split("***")[0] ?? "No Name"} removed!");
88 | snap.data.remove(snap.data[index]);
89 |
90 | updateNewContactList(snap.data);
91 | });
92 | },
93 | ),
94 | ],
95 | );
96 | },
97 | ),
98 | ),
99 | SizedBox(
100 | height: 20,
101 | ),
102 | ],
103 | );
104 | } else {
105 | return Center(
106 | child: Text("No Contacts found!"),
107 | );
108 | }
109 | }),
110 | );
111 | }
112 |
113 | Future> checkforContacts() async {
114 | SharedPreferences prefs = await SharedPreferences.getInstance();
115 | List contacts = prefs.getStringList("numbers") ?? [];
116 | print(contacts);
117 | return contacts;
118 | }
119 |
120 | updateNewContactList(List contacts) async {
121 | SharedPreferences prefs = await SharedPreferences.getInstance();
122 | prefs.setStringList("numbers", contacts);
123 | print(contacts);
124 | }
125 | }
126 |
--------------------------------------------------------------------------------
/lib/Dashboard/Articles - SafeCarousel/SafeCarousel.dart:
--------------------------------------------------------------------------------
1 | import 'package:carousel_slider/carousel_slider.dart';
2 | import 'package:flutter/cupertino.dart';
3 | import 'package:flutter/material.dart';
4 | import 'package:womensafteyhackfair/Dashboard/Articles%20-%20SafeCarousel/ArticleDesc.dart';
5 | import 'package:womensafteyhackfair/Dashboard/Articles%20-%20SafeCarousel/SadeWebView.dart';
6 | import 'package:womensafteyhackfair/constants.dart';
7 |
8 | class SafeCarousel extends StatelessWidget {
9 | const SafeCarousel({Key key}) : super(key: key);
10 |
11 | @override
12 | Widget build(BuildContext context) {
13 | return Container(
14 | child: CarouselSlider(
15 | options: CarouselOptions(
16 | autoPlay: true,
17 | aspectRatio: 2.0,
18 | enlargeCenterPage: true,
19 | ),
20 | items: List.generate(
21 | imageSliders.length,
22 | (index) => Hero(
23 | tag: articleTitle[index],
24 | child: Card(
25 | elevation: 5,
26 | shape: RoundedRectangleBorder(
27 | borderRadius: BorderRadius.circular(20),
28 | ),
29 | child: InkWell(
30 | onTap: () {
31 | // WebviewScaffold(
32 | // url: "https://www.google.com",
33 | // appBar: new AppBar(
34 | // title: new Text("Widget webview"),
35 | // ),
36 | // ),
37 | if (index == 0) {
38 | navigateToRoute(
39 | context,
40 | SafeWebView(
41 | index: index,
42 | title:
43 | "Pakistani women inspiring the country",
44 | url:
45 | "https://gulfnews.com/world/asia/pakistan/womens-day-10-pakistani-women-inspiring-the-country-1.77696239"));
46 | } else if (index == 1) {
47 | navigateToRoute(
48 | context,
49 | SafeWebView(
50 | index: index,
51 | title: "We have to end Violance",
52 | url:
53 | "https://plan-international.org/ending-violence/16-ways-end-violence-girls"));
54 | } else if (index == 2) {
55 | navigateToRoute(context, ArticleDesc(index: index));
56 | } else {
57 | navigateToRoute(
58 | context,
59 | SafeWebView(
60 | index: index,
61 | title: "You are strong",
62 | url:
63 | "https://www.healthline.com/health/womens-health/self-defense-tips-escape"));
64 | }
65 | },
66 | child: Container(
67 | decoration: BoxDecoration(
68 | borderRadius: BorderRadius.circular(20),
69 | image: DecorationImage(
70 | image: NetworkImage(imageSliders[index]),
71 | fit: BoxFit.cover),
72 | ),
73 | child: Container(
74 | decoration: BoxDecoration(
75 | borderRadius: BorderRadius.circular(20),
76 | gradient: LinearGradient(
77 | colors: [
78 | Colors.black.withOpacity(0.5),
79 | Colors.transparent
80 | ],
81 | begin: Alignment.bottomLeft,
82 | end: Alignment.topRight)),
83 | child: Align(
84 | alignment: Alignment.bottomLeft,
85 | child: Padding(
86 | padding:
87 | const EdgeInsets.only(left: 8.0, bottom: 8),
88 | child: Text(
89 | articleTitle[index],
90 | style: TextStyle(
91 | fontWeight: FontWeight.bold,
92 | fontSize:
93 | MediaQuery.of(context).size.width *
94 | 0.05,
95 | color: Colors.white),
96 | ),
97 | ),
98 | ),
99 | ),
100 | ),
101 | ),
102 | ),
103 | )),
104 | ),
105 | );
106 | }
107 |
108 | void navigateToRoute(
109 | BuildContext context,
110 | Widget route,
111 | ) {
112 | Navigator.push(
113 | context,
114 | CupertinoPageRoute(
115 | builder: (context) => route,
116 | ),
117 | );
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/lib/Dashboard/Settings/SettingsScreen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_background_service/flutter_background_service.dart';
3 | import 'package:shared_preferences/shared_preferences.dart';
4 | import 'package:womensafteyhackfair/Dashboard/Settings/About.dart';
5 | import 'package:womensafteyhackfair/Dashboard/Settings/ChangePin.dart';
6 | import 'package:womensafteyhackfair/background_services.dart';
7 |
8 | class SettingsScreen extends StatefulWidget {
9 | const SettingsScreen({Key key}) : super(key: key);
10 |
11 | @override
12 | _SettingsScreenState createState() => _SettingsScreenState();
13 | }
14 |
15 | class _SettingsScreenState extends State {
16 | bool switchValue = false;
17 | Future checkPIN() async {
18 | SharedPreferences prefs = await SharedPreferences.getInstance();
19 | int pin = (prefs.getInt('pin') ?? -1111);
20 | print('User $pin .');
21 | return pin;
22 | }
23 |
24 | @override
25 | void initState() {
26 | super.initState();
27 | checkService();
28 | }
29 |
30 | @override
31 | Widget build(BuildContext context) {
32 | return Scaffold(
33 | backgroundColor: Color(0xFFFAFCFE),
34 | appBar: AppBar(
35 | elevation: 0,
36 | backgroundColor: Colors.transparent,
37 | leading: IconButton(
38 | icon: Icon(
39 | Icons.arrow_back_ios_rounded,
40 | color: Colors.black,
41 | ),
42 | onPressed: () {
43 | Navigator.pop(context);
44 | }),
45 | ),
46 | body: ListView(
47 | children: [
48 | Padding(
49 | padding: const EdgeInsets.all(18.0),
50 | child: Text(
51 | "Settings",
52 | style: TextStyle(fontSize: 35, fontWeight: FontWeight.w900),
53 | ),
54 | ),
55 | FutureBuilder(
56 | future: checkPIN(),
57 | builder: (context, snapshot) {
58 | if (snapshot.hasData) {
59 | return ListTile(
60 | onTap: () {
61 | Navigator.push(
62 | context,
63 | MaterialPageRoute(
64 | builder: (context) =>
65 | ChangePinScreen(pin: snapshot.data),
66 | ),
67 | );
68 | },
69 | leading: CircleAvatar(
70 | backgroundColor: Colors.grey[200],
71 | child: Center(
72 | child: Image.asset("assets/pin.png"),
73 | ),
74 | ),
75 | title: Text(snapshot.data == -1111
76 | ? "Create SOS pin"
77 | : "Change SOS pin"),
78 | subtitle:
79 | Text("SOS PIN is required to switch OFF the SOS alert"),
80 | trailing: CircleAvatar(
81 | radius: 7,
82 | backgroundColor:
83 | snapshot.data == -1111 ? Colors.red : Colors.white,
84 | child: Center(
85 | child: Card(
86 | color: snapshot.data == -1111
87 | ? Colors.orange
88 | : Colors.white,
89 | shape: CircleBorder(),
90 | child: SizedBox(
91 | height: 5,
92 | width: 5,
93 | )),
94 | ),
95 | ),
96 | );
97 | } else {
98 | return SizedBox();
99 | }
100 | }),
101 | Row(
102 | children: [
103 | Padding(
104 | padding: const EdgeInsets.all(12.0),
105 | child: Text(
106 | "Notifications",
107 | style: TextStyle(fontSize: 20),
108 | ),
109 | ),
110 | Expanded(child: Divider())
111 | ],
112 | ),
113 | SwitchListTile(
114 | onChanged: (val) {
115 | setState(() {
116 | switchValue = val;
117 | controllSafeShake(val);
118 | });
119 | },
120 | value: switchValue,
121 | secondary: CircleAvatar(
122 | backgroundColor: Colors.grey[200],
123 | child: Center(
124 | child: Image.asset(
125 | "assets/shake.png",
126 | height: 24,
127 | )),
128 | ),
129 | title: Text("Safe Shake"),
130 | subtitle: Text("Switch ON to listen for device shake"),
131 | ),
132 | Divider(
133 | indent: 40,
134 | endIndent: 40,
135 | ),
136 | Padding(
137 | padding: const EdgeInsets.all(18.0),
138 | child: Text(
139 | "Safe Shake is the key feature for the app. It can be turned on to silently listens for the device shake. When the user feels uncomfortable or finds herself in a situation where sending SOS is the most viable descision. Then She can shake her phone rapidly to send SOS alert to specified contacts without opening the app.",
140 | style: TextStyle(color: Colors.grey),
141 | ),
142 | ),
143 | Row(
144 | children: [
145 | Padding(
146 | padding: const EdgeInsets.all(12.0),
147 | child: Text(
148 | "Application",
149 | style: TextStyle(fontSize: 20),
150 | ),
151 | ),
152 | Expanded(child: Divider())
153 | ],
154 | ),
155 | ListTile(
156 | onTap: () {
157 | Navigator.push(
158 | context, MaterialPageRoute(builder: (context) => AboutUs()));
159 | },
160 | title: Text("About Us"),
161 | leading: CircleAvatar(
162 | backgroundColor: Colors.grey[200],
163 | child: Center(
164 | child: Image.asset(
165 | "assets/info.png",
166 | height: 24,
167 | )),
168 | ),
169 | ),
170 | ListTile(
171 | title: Text("Share"),
172 | leading: CircleAvatar(
173 | backgroundColor: Colors.grey[200],
174 | child: Center(
175 | child: Image.asset(
176 | "assets/share.png",
177 | height: 24,
178 | )),
179 | ),
180 | ),
181 | ],
182 | ),
183 | );
184 | }
185 |
186 | Future checkService() async {
187 | bool running = await FlutterBackgroundService().isServiceRunning();
188 | setState(() {
189 | switchValue = running;
190 | });
191 |
192 | return running;
193 | }
194 |
195 | void controllSafeShake(bool val) async {
196 | if (val) {
197 | FlutterBackgroundService.initialize(onStart);
198 | } else {
199 | FlutterBackgroundService().sendData(
200 | {"action": "stopService"},
201 | );
202 | }
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/lib/Dashboard/Articles - SafeCarousel/AllArticles.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:lottie/lottie.dart';
4 | import 'package:womensafteyhackfair/Dashboard/Articles%20-%20SafeCarousel/ArticleDesc.dart';
5 | import 'package:womensafteyhackfair/Dashboard/Articles%20-%20SafeCarousel/SadeWebView.dart';
6 | import 'package:womensafteyhackfair/constants.dart';
7 |
8 | class AllArticles extends StatefulWidget {
9 | AllArticles({Key key}) : super(key: key);
10 |
11 | @override
12 | _AllArticlesState createState() => _AllArticlesState();
13 | }
14 |
15 | class _AllArticlesState extends State
16 | with TickerProviderStateMixin {
17 | AnimationController _controller;
18 |
19 | @override
20 | void initState() {
21 | super.initState();
22 |
23 | _controller = AnimationController(vsync: this);
24 | }
25 |
26 | @override
27 | void dispose() {
28 | _controller.dispose();
29 | super.dispose();
30 | }
31 |
32 | @override
33 | Widget build(BuildContext context) {
34 | return Scaffold(
35 | body: SafeArea(
36 | child: Stack(fit: StackFit.expand, children: [
37 | Container(
38 | decoration: BoxDecoration(
39 | image: DecorationImage(
40 | image: AssetImage(
41 | 'assets/bg-top.png',
42 | ),
43 | fit: BoxFit.fitWidth,
44 | alignment: Alignment.topCenter,
45 | ),
46 | color: Colors.grey[50].withOpacity(0.3),
47 | ),
48 | child: CustomScrollView(
49 | slivers: [
50 | SliverAppBar(
51 | expandedHeight: 188.0,
52 | backgroundColor: Colors.grey[50].withOpacity(0.3),
53 | flexibleSpace: FlexibleSpaceBar(
54 | background: Lottie.asset(
55 | "assets/reading.json",
56 | controller: _controller,
57 | onLoaded: (composition) {
58 | _controller
59 | ..duration = composition.duration
60 | ..forward();
61 | },
62 | ),
63 | ),
64 | ),
65 | SliverList(
66 | delegate: SliverChildListDelegate(
67 | List.generate(
68 | imageSliders.length,
69 | (index) => Hero(
70 | tag: articleTitle[index],
71 | child: Card(
72 | elevation: 5,
73 | shape: RoundedRectangleBorder(
74 | borderRadius: BorderRadius.circular(20),
75 | ),
76 | child: Container(
77 | height: 180,
78 | child: InkWell(
79 | onTap: () {
80 | // WebviewScaffold(
81 | // url: "https://www.google.com",
82 | // appBar: new AppBar(
83 | // title: new Text("Widget webview"),
84 | // ),
85 | // ),
86 | if (index == 0) {
87 | navigateToRoute(
88 | context,
89 | SafeWebView(
90 | index: index,
91 | title:
92 | "Pakistani women inspiring the country",
93 | url:
94 | "https://gulfnews.com/world/asia/pakistan/womens-day-10-pakistani-women-inspiring-the-country-1.77696239"));
95 | } else if (index == 1) {
96 | navigateToRoute(
97 | context,
98 | SafeWebView(
99 | index: index,
100 | title: "We have to end Violance",
101 | url:
102 | "https://plan-international.org/ending-violence/16-ways-end-violence-girls"));
103 | } else if (index == 2) {
104 | navigateToRoute(
105 | context, ArticleDesc(index: index));
106 | } else {
107 | navigateToRoute(
108 | context,
109 | SafeWebView(
110 | index: index,
111 | title: "You are strong",
112 | url:
113 | "https://www.healthline.com/health/womens-health/self-defense-tips-escape"));
114 | }
115 | },
116 | child: Container(
117 | decoration: BoxDecoration(
118 | borderRadius: BorderRadius.circular(20),
119 | image: DecorationImage(
120 | image: NetworkImage(imageSliders[index]),
121 | fit: BoxFit.cover),
122 | ),
123 | child: Container(
124 | decoration: BoxDecoration(
125 | borderRadius: BorderRadius.circular(20),
126 | gradient: LinearGradient(
127 | colors: [
128 | Colors.black.withOpacity(0.5),
129 | Colors.transparent
130 | ],
131 | begin: Alignment.bottomLeft,
132 | end: Alignment.topRight)),
133 | child: Align(
134 | alignment: Alignment.bottomLeft,
135 | child: Padding(
136 | padding: const EdgeInsets.only(
137 | left: 8.0, bottom: 8),
138 | child: Text(
139 | articleTitle[index],
140 | style: TextStyle(
141 | fontWeight: FontWeight.bold,
142 | fontSize: MediaQuery.of(context)
143 | .size
144 | .width *
145 | 0.05,
146 | color: Colors.white),
147 | ),
148 | ),
149 | ),
150 | ),
151 | ),
152 | ),
153 | ),
154 | ),
155 | ),
156 | ),
157 | ),
158 | ),
159 | ],
160 | ),
161 | ),
162 | ]),
163 | ),
164 | );
165 | }
166 |
167 | void navigateToRoute(
168 | BuildContext context,
169 | Widget route,
170 | ) {
171 | Navigator.push(
172 | context,
173 | CupertinoPageRoute(
174 | builder: (context) => route,
175 | ),
176 | );
177 | }
178 | }
179 |
--------------------------------------------------------------------------------
/lib/Dashboard/Settings/ChangePin.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:fluttertoast/fluttertoast.dart';
3 | import 'package:pinput/pin_put/pin_put.dart';
4 | import 'package:shared_preferences/shared_preferences.dart';
5 |
6 | class ChangePinScreen extends StatefulWidget {
7 | final int pin;
8 | const ChangePinScreen({Key key, this.pin}) : super(key: key);
9 |
10 | @override
11 | _ChangePinScreenState createState() => _ChangePinScreenState();
12 | }
13 |
14 | class _ChangePinScreenState extends State {
15 | final TextEditingController _pinPutController1 = TextEditingController();
16 | final FocusNode _pinPutFocusNode1 = FocusNode();
17 | final TextEditingController _pinPutController2 = TextEditingController();
18 | final FocusNode _pinPutFocusNode2 = FocusNode();
19 | String currentPin = "";
20 | bool pinChanged = false;
21 | BoxDecoration get _pinPutDecoration {
22 | return BoxDecoration(
23 | border: Border.all(color: Colors.deepPurpleAccent),
24 | borderRadius: BorderRadius.circular(15.0),
25 | );
26 | }
27 |
28 | @override
29 | Widget build(BuildContext context) {
30 | return Scaffold(
31 | backgroundColor: Color(0xFFFAFCFE),
32 | appBar: AppBar(
33 | elevation: 0,
34 | backgroundColor: Colors.transparent,
35 | leading: IconButton(
36 | icon: Icon(
37 | Icons.arrow_back_ios_rounded,
38 | color: Colors.black,
39 | ),
40 | onPressed: () {
41 | ScaffoldMessenger.of(context).removeCurrentSnackBar();
42 | Navigator.pop(context);
43 | }),
44 | ),
45 | body: ListView(
46 | children: [
47 | Padding(
48 | padding: const EdgeInsets.all(18.0),
49 | child: Text(
50 | widget.pin == -1111 ? "Create PIN" : "Change PIN",
51 | style: TextStyle(fontSize: 35, fontWeight: FontWeight.w900),
52 | ),
53 | ),
54 | Center(
55 | child: Image.asset(
56 | "assets/pin.png",
57 | height: 70,
58 | ),
59 | ),
60 | Visibility(
61 | visible: widget.pin != -1111,
62 | child: Column(
63 | mainAxisSize: MainAxisSize.min,
64 | children: [
65 | Container(
66 | margin: const EdgeInsets.only(left: 35.0, right: 20),
67 | child: Row(
68 | children: [
69 | Text("Current Pin"),
70 | Expanded(
71 | child: Divider(
72 | indent: 10,
73 | endIndent: 20,
74 | ),
75 | ),
76 | ],
77 | ),
78 | ),
79 | Container(
80 | margin: const EdgeInsets.symmetric(horizontal: 20.0),
81 | padding: const EdgeInsets.all(20.0),
82 | child: PinPut(
83 | onSaved: (value) {
84 | print(value);
85 | },
86 | fieldsCount: 4,
87 | onSubmit: (String pin) {
88 | currentPin = pin;
89 | _pinPutFocusNode1.unfocus();
90 | },
91 | focusNode: _pinPutFocusNode1,
92 | controller: _pinPutController1,
93 | submittedFieldDecoration: _pinPutDecoration.copyWith(
94 | borderRadius: BorderRadius.circular(20.0),
95 | ),
96 | selectedFieldDecoration: _pinPutDecoration,
97 | followingFieldDecoration: _pinPutDecoration.copyWith(
98 | borderRadius: BorderRadius.circular(5.0),
99 | border: Border.all(
100 | color: Colors.deepPurpleAccent.withOpacity(.5),
101 | ),
102 | ),
103 | ),
104 | ),
105 | ],
106 | ),
107 | ),
108 | Container(
109 | margin: const EdgeInsets.only(left: 35.0, right: 20),
110 | child: Row(
111 | children: [
112 | Text("New Pin"),
113 | Expanded(
114 | child: Divider(
115 | indent: 10,
116 | endIndent: 20,
117 | )),
118 | ],
119 | ),
120 | ),
121 | Container(
122 | margin: const EdgeInsets.symmetric(horizontal: 20.0),
123 | padding: const EdgeInsets.all(20.0),
124 | child: PinPut(
125 | onSaved: (value) {
126 | print(value);
127 | },
128 | fieldsCount: 4,
129 | onSubmit: (String pin) => _showSnackBar(pin, context),
130 | focusNode: _pinPutFocusNode2,
131 | controller: _pinPutController2,
132 | submittedFieldDecoration: _pinPutDecoration.copyWith(
133 | borderRadius: BorderRadius.circular(20.0),
134 | ),
135 | selectedFieldDecoration: _pinPutDecoration,
136 | followingFieldDecoration: _pinPutDecoration.copyWith(
137 | borderRadius: BorderRadius.circular(5.0),
138 | border: Border.all(
139 | color: Colors.deepPurpleAccent.withOpacity(.5),
140 | ),
141 | ),
142 | ),
143 | ),
144 | SizedBox(height: 100),
145 | Visibility(
146 | visible: pinChanged,
147 | child: Center(
148 | child: Card(
149 | elevation: 5,
150 | shape: RoundedRectangleBorder(
151 | borderRadius: BorderRadius.circular(30),
152 | ),
153 | child: InkWell(
154 | onTap: () {
155 | ScaffoldMessenger.of(context).removeCurrentSnackBar();
156 |
157 | Navigator.pop(context);
158 | Navigator.pop(context);
159 | },
160 | child: Container(
161 | height: 60,
162 | width: 120,
163 | decoration: BoxDecoration(
164 | borderRadius: BorderRadius.circular(30),
165 | color: Colors.deepPurpleAccent,
166 | ),
167 | child: Center(
168 | child: Text(
169 | "Done",
170 | style: TextStyle(
171 | fontWeight: FontWeight.bold, color: Colors.white),
172 | )),
173 | ),
174 | ),
175 | ),
176 | ))
177 | ],
178 | ),
179 | );
180 | }
181 |
182 | void _showSnackBar(String pin, BuildContext context) {
183 | if (widget.pin != -1111) {
184 | if (currentPin.isEmpty || currentPin.length != 4) {
185 | Fluttertoast.showToast(msg: 'Please enter Current PIN');
186 | _pinPutFocusNode2.unfocus();
187 | return;
188 | }
189 | if (currentPin != widget.pin.toString()) {
190 | final snackBar = SnackBar(
191 | duration: const Duration(seconds: 10),
192 | content: Container(
193 | height: 20.0,
194 | child: Center(
195 | child: Text(
196 | 'Current Pin doesnt match! Please try again.',
197 | style: const TextStyle(fontSize: 16.0),
198 | ),
199 | ),
200 | ),
201 | backgroundColor: Colors.deepPurpleAccent,
202 | );
203 |
204 | ScaffoldMessenger.of(context).removeCurrentSnackBar();
205 | ScaffoldMessenger.of(context).showSnackBar(snackBar);
206 | } else {
207 | changePinSnakBar(pin);
208 | }
209 | } else {
210 | changePinSnakBar(pin);
211 | }
212 | }
213 |
214 | void changePin(int parse) async {
215 | SharedPreferences prefs = await SharedPreferences.getInstance();
216 | prefs.setInt("pin", parse);
217 | }
218 |
219 | void changePinSnakBar(pin) {
220 | final snackBar = SnackBar(
221 | duration: const Duration(seconds: 10),
222 | content: Container(
223 | height: 20.0,
224 | child: Center(
225 | child: Text(
226 | 'Pin Changed. Value: $pin',
227 | style: const TextStyle(fontSize: 16.0),
228 | ),
229 | ),
230 | ),
231 | backgroundColor: Colors.deepPurpleAccent,
232 | );
233 | changePin(int.parse(pin));
234 | setState(() {
235 | pinChanged = true;
236 | });
237 | _pinPutController1.clear();
238 | _pinPutController2.clear();
239 | _pinPutFocusNode1.unfocus();
240 | _pinPutFocusNode2.unfocus();
241 | ScaffoldMessenger.of(context).removeCurrentSnackBar();
242 | ScaffoldMessenger.of(context).showSnackBar(snackBar);
243 | }
244 | }
245 |
--------------------------------------------------------------------------------
/lib/background_services.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:background_location/background_location.dart';
4 | import 'package:flutter/cupertino.dart';
5 | import 'package:flutter/services.dart';
6 | import 'package:flutter_background_service/flutter_background_service.dart';
7 | import 'package:shake/shake.dart';
8 | import 'package:shared_preferences/shared_preferences.dart';
9 | import 'package:telephony/telephony.dart';
10 | import 'package:vibration/vibration.dart';
11 | import 'package:workmanager/workmanager.dart';
12 |
13 | // ** IMPORTANT INSTRUCTIONS **
14 |
15 | // Hey there! :)
16 | // I hope you will be doing great and I hope this code will help you in any way :)
17 | // So all the other code is easy to understand because it
18 | // doesn't follow any complex architecture ;p so I didn't added any comments in it.
19 | // Which are pretty importatnt to add when you are sharing your code. So you should
20 | // add comments in your code I am just a little lazy.
21 | //
22 | // OK Back to the main topic. This file contains most of the core logic behind
23 | // the app's major functionality. I will try to explain every block in it so it will
24 | // be easy to follow along for you. Let's get started...
25 |
26 | // So main functionality of the app is that it runs in background and detects or
27 | // listens for a phone shake and when that event happens it send sos message to
28 | // the selected contacts of the user.
29 | // So main thing here is to set up a background isolate which will work in
30 | // background and will listen to shake events no matter the app is closed
31 | // or in background or foreground.
32 |
33 | // For that I have used -> flutter_background_service: ^0.1.5
34 | // Which is a very handy plugin to run our dart code in background.
35 |
36 |
37 | // This function starts background isolates which is called when the app starts
38 | // in main method and this will instantiate the background service and
39 | // then will listen for updates.
40 | void onStart() async {
41 | WidgetsFlutterBinding.ensureInitialized();
42 | final service = FlutterBackgroundService();
43 |
44 | SharedPreferences prefs = await SharedPreferences.getInstance();
45 |
46 | // I have instanciated the service object above and here I am just
47 | // making a stream to listen for the events
48 | service.onDataReceived.listen((event) async {
49 | if (event["action"] == "setAsForeground") {
50 | service.setForegroundMode(true);
51 |
52 | return;
53 | }
54 |
55 | if (event["action"] == "setAsBackground") {
56 | service.setForegroundMode(false);
57 | }
58 |
59 | if (event["action"] == "stopService") {
60 | service.stopBackgroundService();
61 | }
62 | });
63 | Location _location;
64 | // This is another handy plugin whcih works in background independently and fetches the
65 | // user location as we need location for some of the functionalities. Initially it will
66 | // show a notification to user that the service is running
67 | // this is important so that the user does know that the app is tracking his/her location.
68 |
69 |
70 | await BackgroundLocation.setAndroidNotification(
71 | title: "Location tracking is running in the background!",
72 | message: "You can turn it off from settings menu inside the app",
73 | icon: '@mipmap/ic_logo',
74 | );
75 |
76 | // This is where the location service gets started.
77 | BackgroundLocation.startLocationService(
78 | distanceFilter: 20,
79 | );
80 |
81 | // Its pretty easy to get location updates. As this method will only
82 | // be called when there are some location updates. and will save the data
83 | // in Shared Preferences.
84 |
85 | // ** IMPORTANT CONCEPT **
86 | // When working with isolates we need to comunicate data through ports because unlike
87 | // threads isolates does not share any memory.
88 | // Here I am usong shared preferences to save data because
89 | // I dont need the data actively but need on specific time intervals.
90 | // So instead for passing it to a port and listen to it continously I had managed it
91 | // through shared preferences and worker plugin to get the updates after specific
92 | // time when needed.
93 | // Now you will think that it can be possible through ports too but why do it the hard
94 | // way when it can be done easily :)
95 | //
96 | BackgroundLocation.getLocationUpdates((location) {
97 | _location = location;
98 | prefs.setStringList("location",
99 | [location.latitude.toString(), location.longitude.toString()]);
100 | });
101 | // Here I used screenShaker plugin to listen to shake events and I set the
102 | // threshold to 7, to avoid unnecessery shakes which can be cause by mistake
103 | // like when the phone is in purse or in hand while walking
104 | String screenShake = "Be strong, We are with you!";
105 | ShakeDetector.autoStart(
106 |
107 | // It deals with all the tests and then vibrates the phone so to let
108 | // user know that shake was successful and sos has been generated
109 | shakeThresholdGravity: 7,
110 | onPhoneShake: () async {
111 | print("Test 1");
112 | if (await Vibration.hasVibrator()) {
113 | print("Test 2");
114 | if (await Vibration.hasCustomVibrationsSupport()) {
115 | print("Test 3");
116 | Vibration.vibrate(duration: 1000);
117 | } else {
118 | print("Test 4");
119 | Vibration.vibrate();
120 | await Future.delayed(Duration(milliseconds: 500));
121 | Vibration.vibrate();
122 | }
123 | print("Test 5");
124 | }
125 | print("Test 6");
126 | String link = '';
127 | print("Test 7");
128 | try {
129 | double lat = _location.latitude;
130 | double long = _location.longitude;
131 | print("$lat ... $long");
132 | print("Test 9");
133 | link = "http://maps.google.com/?q=$lat,$long";
134 | SharedPreferences prefs = await SharedPreferences.getInstance();
135 | List numbers = prefs.getStringList("numbers") ?? [];
136 | String error;
137 | try {
138 | if (numbers.isEmpty) {
139 | screenShake = "No contacs found, Please call 15 ASAP.";
140 | debugPrint(
141 | 'No Contacts Found!',
142 | );
143 | return;
144 | } else {
145 | for (int i = 0; i < numbers.length; i++) {
146 | //Here I used telephony to send sms messages to the saved contacts.
147 | Telephony.backgroundInstance.sendSms(
148 | to: numbers[i], message: "Help Me! Track me here.\n$link");
149 | }
150 | prefs.setBool("alerted", true);
151 | screenShake = "SOS alert Sent! Help is on the way.";
152 | }
153 | } on PlatformException catch (e) {
154 | if (e.code == 'PERMISSION_DENIED') {
155 | error = 'Please grant permission';
156 | print('Error due to Denied: $error');
157 | }
158 | if (e.code == 'PERMISSION_DENIED_NEVER_ASK') {
159 | error = 'Permission denied- please enable it from app settings';
160 | print("Error due to not Asking: $error");
161 | }
162 | }
163 | print("Test 10");
164 | print(link);
165 | } catch (e) {
166 | print("Test 11");
167 | print(e);
168 | }
169 | });
170 | print("Test 12");
171 | // on initial call to onStart() this will call which brings the background
172 | // service to life
173 | service.setForegroundMode(true);
174 | // Timer is placed so the background isolate can work every
175 | // second unlike other worker managers
176 | Timer.periodic(Duration(seconds: 1), (timer) async {
177 | if (!(await service.isServiceRunning())) timer.cancel();
178 |
179 | service.setNotificationInfo(
180 | title: "Safe Shake activated!",
181 | content: screenShake,
182 | );
183 |
184 | service.sendData(
185 | {"current_date": DateTime.now().toIso8601String()},
186 | );
187 | });
188 | }
189 |
190 | //GET HOME SAFE _ WORK MANAGER SET TO 15 minutes frequency
191 |
192 |
193 | // This fumction is attached to get home safe functionality
194 | // which will send the user location data to his/her selected
195 | // contact after every 15 minutes.
196 |
197 | // Its simply a workManager which is executing a given task perioadically
198 | // afeter every 15 minutes
199 |
200 |
201 | void callbackDispatcher() {
202 | Workmanager().executeTask((task, inputData) async {
203 | String contact = inputData['contact'];
204 | final prefs = await SharedPreferences.getInstance();
205 | print(contact);
206 | List location = prefs.getStringList("location");
207 | String link = "http://maps.google.com/?q=${location[0]},${location[1]}";
208 | print(location);
209 | print(link);
210 | Telephony.backgroundInstance
211 | .sendSms(to: contact, message: "I am on my way! Track me here.\n$link");
212 | return true;
213 | });
214 | }
215 |
216 | // I hope this project have helped you
217 | // And I am just happy that I have helped you in any way :)
218 | // May your all wishes come true - Happy Fluttering <3
--------------------------------------------------------------------------------
/lib/Dashboard/ContactScreens/phonebook_view.dart:
--------------------------------------------------------------------------------
1 | import 'package:contacts_service/contacts_service.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:flutter/services.dart';
4 | import 'package:fluttertoast/fluttertoast.dart';
5 | import 'package:permission_handler/permission_handler.dart';
6 | import 'package:shared_preferences/shared_preferences.dart';
7 | import 'package:womensafteyhackfair/Dashboard/Dashboard.dart';
8 | import 'package:womensafteyhackfair/animations/bottomAnimation.dart';
9 |
10 | class PhoneBook extends StatefulWidget {
11 | // final FirebaseUser user;
12 | // final bool contactAvailable;
13 | // final Function(bool) callback;
14 |
15 | // PhoneBook({this.user, this.contactAvailable, this.callback});
16 |
17 | @override
18 | _PhoneBookState createState() => _PhoneBookState();
19 | }
20 |
21 | class _PhoneBookState extends State {
22 | List _contacts;
23 | List filteredContacts;
24 | List _userSelectedContacts = [];
25 |
26 | Permission _permission = Permission.contacts;
27 | PermissionStatus _permissionStatus = PermissionStatus.denied;
28 |
29 | Future _getContactPermission() async {
30 | _permissionStatus = await _permission.status;
31 |
32 | if (_permissionStatus != PermissionStatus.granted) {
33 | _permissionStatus = await _permission.request();
34 | return _permissionStatus ?? PermissionStatus.denied;
35 | } else {
36 | return _permissionStatus;
37 | }
38 | }
39 |
40 | refreshContacts() async {
41 | PermissionStatus permissionStatus = await _getContactPermission();
42 | if (permissionStatus == PermissionStatus.granted) {
43 | var contacts = (await ContactsService.getContacts(
44 | withThumbnails: false,
45 | ))
46 | .toList();
47 | setState(() {
48 | _contacts = contacts;
49 | filteredContacts = _contacts;
50 | });
51 | } else {
52 | _handleInvalidPermissions(permissionStatus);
53 | }
54 | }
55 |
56 | void _handleInvalidPermissions(PermissionStatus permissionStatus) {
57 | if (permissionStatus == PermissionStatus.denied) {
58 | throw new PlatformException(
59 | code: "PERMISSION_DENIED",
60 | message: "Access to location data denied",
61 | details: null);
62 | } else if (permissionStatus == PermissionStatus.denied) {
63 | throw new PlatformException(
64 | code: "PERMISSION_DISABLED",
65 | message: "Location data is not available on device",
66 | details: null);
67 | }
68 | }
69 |
70 | @override
71 | initState() {
72 | super.initState();
73 | refreshContacts();
74 | }
75 |
76 | goBack() async {
77 | // checkFor contacts existance
78 | Navigator.pushAndRemoveUntil(
79 | context,
80 | MaterialPageRoute(
81 | builder: (context) => Dashboard(
82 | pageIndex: 1,
83 | )),
84 | (route) => false);
85 | }
86 |
87 | saveContacts() async {
88 | SharedPreferences prefs = await SharedPreferences.getInstance();
89 | List numbers = prefs.getStringList("numbers") ?? [];
90 | if (_userSelectedContacts.isNotEmpty) {
91 | for (Contact c in _userSelectedContacts) {
92 | String entity = "";
93 | if (c.phones.isNotEmpty) {
94 | String refactoredNumber = refactorPhoneNumbers(c.phones.first.value);
95 | entity = "${c.displayName ?? "User"}***$refactoredNumber";
96 | } else {
97 | entity = "${c.displayName ?? "User"}***";
98 | }
99 | if (!numbers.contains(entity)) numbers.add(entity);
100 | }
101 |
102 | prefs.setStringList("numbers", numbers);
103 | Fluttertoast.showToast(msg: "List Has been Saved");
104 | goBack();
105 | } else {
106 | Fluttertoast.showToast(msg: "Please add atleast one contact");
107 | }
108 | }
109 |
110 | @override
111 | Widget build(BuildContext context) {
112 | double width = MediaQuery.of(context).size.width;
113 | double height = MediaQuery.of(context).size.height;
114 |
115 | return Scaffold(
116 | floatingActionButton: FloatingActionButton(
117 | onPressed: saveContacts,
118 | backgroundColor: Color(0xFFFB8580),
119 | child: Text("Save"),
120 | ),
121 | resizeToAvoidBottomInset: false,
122 | appBar: AppBar(
123 | backgroundColor: Color(0xFFFB8580),
124 | leading: IconButton(
125 | icon: Icon(Icons.arrow_back),
126 | onPressed: () {
127 | goBack();
128 | },
129 | ),
130 | title: TextField(
131 | textInputAction: TextInputAction.search,
132 | style: TextStyle(color: Colors.white),
133 | cursorColor: Colors.white,
134 | decoration: InputDecoration(
135 | focusedBorder: UnderlineInputBorder(
136 | borderSide: BorderSide(color: Colors.transparent)),
137 | enabledBorder: UnderlineInputBorder(
138 | borderSide: BorderSide(color: Colors.transparent)),
139 | prefixIcon: Icon(Icons.search,
140 | color: Colors.white70, size: height * 0.03),
141 | hintText: 'Search Name',
142 | hintStyle: TextStyle(color: Colors.white70)),
143 | onChanged: (string) {
144 | setState(() {
145 | filteredContacts = _contacts
146 | .where((c) => (c.displayName
147 | .toLowerCase()
148 | .contains(string.toLowerCase())))
149 | .toList();
150 | });
151 | },
152 | ),
153 | ),
154 | body: _contacts != null
155 | ? Container(
156 | height: height,
157 | width: width,
158 | child: ListView.separated(
159 | padding: EdgeInsets.symmetric(vertical: height * 0.01),
160 | separatorBuilder: (context, index) {
161 | Contact c = filteredContacts?.elementAt(index);
162 | if (c.phones.isEmpty) {
163 | return SizedBox();
164 | }
165 | return Divider(height: height * 0.01);
166 | },
167 | itemCount: filteredContacts?.length ?? 0,
168 | itemBuilder: (BuildContext context, int index) {
169 | Contact c = filteredContacts?.elementAt(index);
170 | return ItemsTile(addToContacts, c, c.phones);
171 | },
172 | ),
173 | )
174 | : Center(
175 | child: CircularProgressIndicator(
176 | valueColor:
177 | new AlwaysStoppedAnimation(Color(0xffbe3a5a))),
178 | ),
179 | );
180 | }
181 |
182 | addToContacts(Contact con) {
183 | print(con.phones);
184 | bool alreadyInList = false;
185 | for (Contact c in _userSelectedContacts) {
186 | print("INside contacts: ID: ${c.displayName}");
187 | if (c.displayName != null || c.displayName != "") {
188 | if (c.displayName == con.displayName) {
189 | alreadyInList = true;
190 | break;
191 | }
192 | } else {
193 | if (c.phones.isNotEmpty) {
194 | if (c.phones.contains(con.phones.first)) {
195 | alreadyInList = true;
196 | break;
197 | }
198 | }
199 | }
200 | }
201 | if (!alreadyInList) {
202 | _userSelectedContacts.add(con);
203 | Fluttertoast.showToast(
204 | msg: "${_userSelectedContacts.length} contacts selected");
205 | } else {
206 | Fluttertoast.showToast(msg: "Already in your selected List");
207 | }
208 | }
209 |
210 | String refactorPhoneNumbers(String phone) {
211 | if (phone == null || phone == "") {
212 | return "";
213 | }
214 | var newPhone = phone.replaceAll(RegExp(r"[^\name\w]"), '');
215 | if (newPhone.length == 12) {
216 | newPhone = "+" + newPhone.substring(0, newPhone.length);
217 | }
218 | if (newPhone.length == 11) {
219 | newPhone = "+92" + newPhone.substring(1, newPhone.length);
220 | }
221 | if (newPhone.length > 12) {
222 | var start2Number = newPhone.substring(0, 2);
223 | if (start2Number == "92") {
224 | newPhone = "+" + newPhone.substring(0, 12);
225 | }
226 | if (start2Number == "03") {
227 | newPhone = "+92" + newPhone.substring(1, newPhone.length);
228 | }
229 | }
230 |
231 | return newPhone;
232 | }
233 | }
234 |
235 | class ItemsTile extends StatefulWidget {
236 | ItemsTile(this.addToContacts, this.c, this._items);
237 | final Function addToContacts;
238 | final Contact c;
239 | final Iterable- _items;
240 |
241 | @override
242 | _ItemsTileState createState() => _ItemsTileState();
243 | }
244 |
245 | class _ItemsTileState extends State {
246 | String currentContact = '';
247 |
248 | @override
249 | void initState() {
250 | super.initState();
251 |
252 | currentContact = '';
253 | }
254 |
255 | @override
256 | Widget build(BuildContext context) {
257 | double height = MediaQuery.of(context).size.height;
258 | if (currentContact.isNotEmpty) {
259 | currentContact = '';
260 | }
261 | return widget._items.isEmpty
262 | ? SizedBox()
263 | : WidgetAnimator(
264 | Card(
265 | child: ListTile(
266 | onTap: () {
267 | widget.addToContacts(widget.c);
268 | FocusScopeNode currentFocus = FocusScope.of(context);
269 |
270 | if (!currentFocus.hasPrimaryFocus) {
271 | currentFocus.unfocus();
272 | }
273 | },
274 | leading: CircleAvatar(
275 | backgroundColor: Color(0xffbe3a5a),
276 | child: Text('${widget.c.displayName[0]}'.toUpperCase(),
277 | style: TextStyle(color: Colors.white)),
278 | radius: height * 0.025),
279 | title: Column(
280 | crossAxisAlignment: CrossAxisAlignment.start,
281 | children: [
282 | Text(
283 | widget.c.displayName ?? "",
284 | style: TextStyle(
285 | color: Colors.black, fontSize: height * 0.022),
286 | ),
287 | SizedBox(height: height * 0.01),
288 | Column(
289 | crossAxisAlignment: CrossAxisAlignment.start,
290 | children: widget._items.map((
291 | i,
292 | ) {
293 | if (currentContact == i.value.replaceAll(" ", "")) {
294 | return Row();
295 | }
296 | currentContact = i.value.replaceAll(" ", "");
297 | return Text(
298 | i.value ?? i.label ?? "",
299 | style: TextStyle(color: Colors.grey[600]),
300 | );
301 | }).toList())
302 | ],
303 | ),
304 | trailing:
305 | Text('Tap', style: TextStyle(color: Colors.grey[400])),
306 | ),
307 | ),
308 | );
309 | }
310 | }
311 |
312 |
313 | // uploadContact.name = widget.c.displayName;
314 | // var phoneNumber =
315 | // widget._items.map((i) => i.value ?? " ").toString();
316 |
--------------------------------------------------------------------------------
/lib/Dashboard/DashWidgets/SafeHome.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_spinkit/flutter_spinkit.dart';
3 | import 'package:fluttertoast/fluttertoast.dart';
4 | import 'package:lottie/lottie.dart';
5 | import 'package:shared_preferences/shared_preferences.dart';
6 | import 'package:womensafteyhackfair/Dashboard/ContactScreens/phonebook_view.dart';
7 | import 'package:womensafteyhackfair/background_services.dart';
8 | import 'package:workmanager/workmanager.dart';
9 |
10 | class SafeHome extends StatefulWidget {
11 | const SafeHome({Key key}) : super(key: key);
12 |
13 | @override
14 | _SafeHomeState createState() => _SafeHomeState();
15 | }
16 |
17 | class _SafeHomeState extends State {
18 | bool getHomeSafeActivated = false;
19 | List numbers = [];
20 |
21 | checkGetHomeActivated() async {
22 | SharedPreferences prefs = await SharedPreferences.getInstance();
23 |
24 | setState(() {
25 | getHomeSafeActivated = prefs.getBool("getHomeSafe") ?? false;
26 | });
27 | }
28 |
29 | changeStateOfHomeSafe(value) async {
30 | if (value) {
31 | Fluttertoast.showToast(msg: "Service Activated in Background!");
32 | } else {
33 | Fluttertoast.showToast(msg: "Service Disabled!");
34 | }
35 | SharedPreferences prefs = await SharedPreferences.getInstance();
36 |
37 | setState(() {
38 | getHomeSafeActivated = value;
39 | prefs.setBool("getHomeSafe", value);
40 | });
41 | }
42 |
43 | @override
44 | void initState() {
45 | super.initState();
46 |
47 | checkGetHomeActivated();
48 | }
49 |
50 | @override
51 | Widget build(BuildContext context) {
52 | return Padding(
53 | padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 5),
54 | child: InkWell(
55 | onTap: () {
56 | showModelSafeHome(getHomeSafeActivated);
57 | },
58 | child: Card(
59 | elevation: 5,
60 | shape: RoundedRectangleBorder(
61 | borderRadius: BorderRadius.circular(20),
62 | ),
63 | child: Container(
64 | height: 180,
65 | width: MediaQuery.of(context).size.width * 0.7,
66 | decoration: BoxDecoration(
67 | borderRadius: BorderRadius.circular(20),
68 | ),
69 | child: Row(
70 | children: [
71 | Expanded(
72 | child: Column(
73 | crossAxisAlignment: CrossAxisAlignment.start,
74 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
75 | children: [
76 | ListTile(
77 | title: Text("Get Home Safe"),
78 | subtitle: Text("Share Location Periodically"),
79 | ),
80 | Visibility(
81 | visible: getHomeSafeActivated,
82 | child: Padding(
83 | padding: const EdgeInsets.all(18.0),
84 | child: Row(
85 | children: [
86 | SpinKitDoubleBounce(
87 | color: Colors.red,
88 | size: 15,
89 | ),
90 | SizedBox(width: 15),
91 | Text("Currently Running...",
92 | style: TextStyle(
93 | color: Colors.red, fontSize: 10)),
94 | ],
95 | )),
96 | ),
97 | ],
98 | ),
99 | ),
100 | ClipRRect(
101 | borderRadius: BorderRadius.circular(20),
102 | child: Image.asset(
103 | "assets/route.jpg",
104 | height: 140,
105 | ))
106 | ],
107 | ),
108 | ),
109 | ),
110 | ),
111 | );
112 | }
113 |
114 | showModelSafeHome(bool processRunning) async {
115 | int selectedContact = -1;
116 | bool getHomeActivated = processRunning;
117 | showModalBottomSheet(
118 | backgroundColor: Colors.transparent,
119 | enableDrag: true,
120 | isScrollControlled: true,
121 | isDismissible: true,
122 | context: context,
123 | builder: (context) {
124 | return StatefulBuilder(
125 | builder: (BuildContext context, StateSetter setModalState) {
126 | return Container(
127 | height: MediaQuery.of(context).size.height / 1.4,
128 | decoration: BoxDecoration(
129 | color: Colors.white,
130 | borderRadius: BorderRadius.only(
131 | topLeft: Radius.circular(30),
132 | topRight: Radius.circular(30),
133 | ),
134 | ),
135 | child: Column(
136 | children: [
137 | Padding(
138 | padding: const EdgeInsets.symmetric(vertical: 10.0),
139 | child: Row(
140 | children: [
141 | Expanded(
142 | child: Divider(
143 | indent: 20,
144 | endIndent: 20,
145 | )),
146 | Text("Get Home Safe"),
147 | Expanded(
148 | child: Divider(
149 | indent: 20,
150 | endIndent: 20,
151 | )),
152 | ],
153 | ),
154 | ),
155 | Container(
156 | margin: EdgeInsets.symmetric(horizontal: 15),
157 | decoration: BoxDecoration(
158 | borderRadius: BorderRadius.circular(20),
159 | color: Color(0xFFF5F4F6)),
160 | child: SwitchListTile(
161 | secondary: Lottie.asset("assets/routes.json"),
162 | value: getHomeActivated,
163 | onChanged: (val) async {
164 | if (val && selectedContact == -1) {
165 | Fluttertoast.showToast(
166 | msg: "Please select one contact!");
167 | return;
168 | }
169 | setModalState(() {
170 | getHomeActivated = val;
171 | });
172 | if (getHomeActivated) {
173 | changeStateOfHomeSafe(true);
174 | Workmanager().registerPeriodicTask(
175 | "3",
176 | "simplePeriodicTask",
177 | tag: "3",
178 | inputData: {
179 | "contact":
180 | numbers[selectedContact].split("***")[1]
181 | },
182 | frequency: Duration(minutes: 15),
183 | );
184 | } else {
185 | changeStateOfHomeSafe(false);
186 | await Workmanager().cancelByTag("3");
187 | }
188 | },
189 | subtitle: Text(
190 | "Your location will be shared with one of your contacts every 15 minutes"),
191 | ),
192 | ),
193 | Expanded(
194 | child: FutureBuilder(
195 | future: getSOSNumbers(),
196 | builder: (context,
197 | AsyncSnapshot
> snapshot) {
198 | if (snapshot.hasData &&
199 | snapshot.data.isNotEmpty) {
200 | return ListView.separated(
201 | itemCount: snapshot.data.length,
202 | separatorBuilder: (context, index) {
203 | return Divider(
204 | indent: 20,
205 | endIndent: 20,
206 | );
207 | },
208 | itemBuilder: (context, index) {
209 | String contactData = snapshot.data[index];
210 | return ListTile(
211 | onTap: () {
212 | setModalState(() {
213 | selectedContact = index;
214 | });
215 | },
216 | leading: CircleAvatar(
217 | backgroundImage:
218 | AssetImage("assets/user.png"),
219 | ),
220 | title:
221 | Text(contactData.split("***")[0]),
222 | subtitle:
223 | Text(contactData.split("***")[1]),
224 | trailing: selectedContact == index
225 | ? Icon(
226 | Icons.check_circle,
227 | color: Colors.green,
228 | )
229 | : null,
230 | );
231 | });
232 | } else {
233 | return ListTile(
234 | onTap: () {
235 | Navigator.pop(context);
236 | Navigator.push(
237 | context,
238 | MaterialPageRoute(
239 | builder: (context) => PhoneBook(),
240 | ),
241 | );
242 | },
243 | title: Text("No contact found!"),
244 | subtitle:
245 | Text("Please add atleast one Contact"),
246 | trailing: Icon(
247 | Icons.arrow_forward_ios_rounded,
248 | color: Colors.grey),
249 | );
250 | }
251 | }))
252 | ],
253 | ),
254 | );
255 | },
256 | );
257 | });
258 | }
259 |
260 | Future> getSOSNumbers() async {
261 | SharedPreferences prefs = await SharedPreferences.getInstance();
262 |
263 | numbers = prefs.getStringList("numbers") ?? [];
264 |
265 | return numbers;
266 | }
267 | }
268 |
--------------------------------------------------------------------------------
/lib/Dashboard/Dashboard.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter/services.dart';
3 | import 'package:fluttertoast/fluttertoast.dart';
4 | import 'package:location/location.dart';
5 | import 'package:permission_handler/permission_handler.dart' as appPermissions;
6 | import 'package:pinput/pin_put/pin_put.dart';
7 | import 'package:shared_preferences/shared_preferences.dart';
8 | import 'package:sms_maintained/sms.dart' as smsSender;
9 | import 'package:womensafteyhackfair/Dashboard/ContactScreens/phonebook_view.dart';
10 | import 'package:womensafteyhackfair/Dashboard/Home.dart';
11 | import 'package:womensafteyhackfair/Dashboard/ContactScreens/MyContacts.dart';
12 |
13 | class Dashboard extends StatefulWidget {
14 | final int pageIndex;
15 | const Dashboard({Key key, this.pageIndex = 0}) : super(key: key);
16 |
17 | @override
18 | _DashboardState createState() => _DashboardState(currentPage: pageIndex);
19 | }
20 |
21 | class _DashboardState extends State {
22 | _DashboardState({this.currentPage = 0});
23 |
24 | List screens = [Home(), MyContactsScreen()];
25 | bool alerted = false;
26 | int currentPage = 0;
27 | final TextEditingController _pinPutController = TextEditingController();
28 | final FocusNode _pinPutFocusNode = FocusNode();
29 | bool pinChanged = false;
30 | BoxDecoration get _pinPutDecoration {
31 | return BoxDecoration(
32 | border: Border.all(color: Colors.deepPurpleAccent),
33 | borderRadius: BorderRadius.circular(15.0),
34 | );
35 | }
36 |
37 | @override
38 | void initState() {
39 | super.initState();
40 | checkAlertSharedPreferences();
41 | checkPermission();
42 | }
43 |
44 | SharedPreferences prefs;
45 | checkAlertSharedPreferences() async {
46 | prefs = await SharedPreferences.getInstance();
47 | if (mounted)
48 | setState(() {
49 | alerted = prefs.getBool("alerted") ?? false;
50 | });
51 | }
52 |
53 | @override
54 | Widget build(BuildContext context) {
55 | return Scaffold(
56 | backgroundColor: Color(0xFFFAFCFE),
57 | floatingActionButton: currentPage == 1
58 | ? FloatingActionButton(
59 | backgroundColor: Colors.white,
60 | onPressed: () {
61 | Navigator.push(context,
62 | MaterialPageRoute(builder: (context) => PhoneBook()));
63 | },
64 | child: Image.asset(
65 | "assets/add-contact.png",
66 | height: 60,
67 | ),
68 | )
69 | : FloatingActionButton(
70 | backgroundColor: Color(0xFFFB9580),
71 | onPressed: () async {
72 | if (alerted) {
73 | int pin = (prefs.getInt('pin') ?? -1111);
74 | print('User $pin .');
75 | if (pin == -1111) {
76 | sendAlertSMS(false);
77 | } else {
78 | showPinModelBottomSheet(pin);
79 | }
80 | } else {
81 | sendAlertSMS(true);
82 | }
83 | },
84 | child: alerted
85 | ? Column(
86 | mainAxisSize: MainAxisSize.min,
87 | children: [
88 | Image.asset(
89 | "assets/alarm.png",
90 | height: 24,
91 | ),
92 | Text("STOP")
93 | ],
94 | )
95 | : Image.asset(
96 | "assets/icons/alert.png",
97 | height: 36,
98 | ),
99 | ),
100 | floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
101 | bottomNavigationBar: BottomAppBar(
102 | shape: CircularNotchedRectangle(),
103 | notchMargin: 12,
104 | child: Container(
105 | height: 60,
106 | child: Row(
107 | mainAxisAlignment: MainAxisAlignment.spaceAround,
108 | children: [
109 | InkWell(
110 | onTap: () {
111 | if (currentPage != 0)
112 | setState(() {
113 | currentPage = 0;
114 | });
115 | },
116 | child: Image.asset(
117 | "assets/home.png",
118 | height: 28,
119 | )),
120 | InkWell(
121 | onTap: () {
122 | if (currentPage != 1)
123 | setState(() {
124 | currentPage = 1;
125 | });
126 | },
127 | child: Image.asset("assets/phone_red.png", height: 28)),
128 | ],
129 | ),
130 | ),
131 | ),
132 | body: SafeArea(child: screens[currentPage]),
133 | );
134 | }
135 |
136 | checkPermission() async {
137 | appPermissions.PermissionStatus conPer =
138 | await appPermissions.Permission.contacts.status;
139 | appPermissions.PermissionStatus locPer =
140 | await appPermissions.Permission.location.status;
141 | appPermissions.PermissionStatus phonePer =
142 | await appPermissions.Permission.phone.status;
143 | appPermissions.PermissionStatus smsPer =
144 | await appPermissions.Permission.sms.status;
145 | if (conPer != appPermissions.PermissionStatus.granted) {
146 | await appPermissions.Permission.contacts.request();
147 | }
148 | if (locPer != appPermissions.PermissionStatus.granted) {
149 | await appPermissions.Permission.location.request();
150 | }
151 | if (phonePer != appPermissions.PermissionStatus.granted) {
152 | await appPermissions.Permission.phone.request();
153 | }
154 | if (smsPer != appPermissions.PermissionStatus.granted) {
155 | await appPermissions.Permission.sms.request();
156 | }
157 | }
158 |
159 | void sendSMS(String number, String msgText) {
160 | print(number);
161 | print(msgText);
162 | smsSender.SmsMessage msg = new smsSender.SmsMessage(number, msgText);
163 | final smsSender.SmsSender sender = new smsSender.SmsSender();
164 | msg.onStateChanged.listen((state) {
165 | if (state == smsSender.SmsMessageState.Sending) {
166 | return Fluttertoast.showToast(
167 | msg: 'Sending Alert...',
168 | backgroundColor: Colors.blue,
169 | );
170 | } else if (state == smsSender.SmsMessageState.Sent) {
171 | return Fluttertoast.showToast(
172 | msg: 'Alert Sent Successfully!',
173 | backgroundColor: Colors.green,
174 | );
175 | } else if (state == smsSender.SmsMessageState.Fail) {
176 | return Fluttertoast.showToast(
177 | msg: 'Failure! Check your credits & Network Signals!',
178 | backgroundColor: Colors.red,
179 | );
180 | } else {
181 | return Fluttertoast.showToast(
182 | msg: 'Failed to send SMS. Try Again!',
183 | backgroundColor: Colors.red,
184 | );
185 | }
186 | });
187 | sender.sendSms(msg);
188 | }
189 |
190 | sendAlertSMS(bool isAlert) async {
191 | SharedPreferences prefs = await SharedPreferences.getInstance();
192 | setState(() {
193 | prefs.setBool("alerted", isAlert);
194 | alerted = isAlert;
195 | });
196 | checkPermission();
197 |
198 | prefs.setBool("alerted", isAlert);
199 | List numbers = prefs.getStringList("numbers") ?? [];
200 | LocationData myLocation;
201 | String error;
202 | Location location = new Location();
203 | String link = '';
204 | try {
205 | myLocation = await location.getLocation();
206 | var currentLocation = myLocation;
207 |
208 | if (numbers.isEmpty) {
209 | setState(() {
210 | prefs.setBool("alerted", false);
211 | alerted = false;
212 | });
213 | return Fluttertoast.showToast(
214 | msg: 'No Contacts Found!',
215 | backgroundColor: Colors.red,
216 | );
217 | } else {
218 | //var coordinates =
219 | // Coordinates(currentLocation.latitude, currentLocation.longitude);
220 | //var addresses =
221 | // await Geocoder.local.findAddressesFromCoordinates(coordinates);
222 | // var first = addresses.first;
223 | String li =
224 | "http://maps.google.com/?q=${currentLocation.latitude},${currentLocation.longitude}";
225 | if (isAlert) {
226 | link = "Help Me! SOS \n$li";
227 | } else {
228 | Fluttertoast.showToast(
229 | msg: "Contacts are being notified about false SOS.");
230 | link = "I am safe, track me here\n$li";
231 | }
232 |
233 | for (int i = 0; i < numbers.length; i++) {
234 | sendSMS(numbers[i].split("***")[1], link);
235 | }
236 | }
237 | } on PlatformException catch (e) {
238 | if (e.code == 'PERMISSION_DENIED') {
239 | error = 'Please grant permission';
240 | print('Error due to Denied: $error');
241 | }
242 | if (e.code == 'PERMISSION_DENIED_NEVER_ASK') {
243 | error = 'Permission denied- please enable it from app settings';
244 | print("Error due to not Asking: $error");
245 | }
246 | myLocation = null;
247 |
248 | prefs.setBool("alerted", false);
249 |
250 | setState(() {
251 | alerted = false;
252 | });
253 | }
254 | }
255 |
256 | showPinModelBottomSheet(int userPin) {
257 | showModalBottomSheet(
258 | isScrollControlled: true,
259 | isDismissible: true,
260 | enableDrag: true,
261 | backgroundColor: Colors.transparent,
262 | context: context,
263 | builder: (context) {
264 | return Container(
265 | height: MediaQuery.of(context).size.height / 2.7,
266 | decoration: BoxDecoration(
267 | color: Colors.white,
268 | borderRadius: BorderRadius.only(
269 | topLeft: Radius.circular(20),
270 | topRight: Radius.circular(20),
271 | ),
272 | ),
273 | child: Column(
274 | children: [
275 | SizedBox(height: 15),
276 | Row(
277 | children: [
278 | Expanded(
279 | child: Divider(
280 | indent: 20,
281 | endIndent: 20,
282 | ),
283 | ),
284 | Text(
285 | "Please enter you PIN!",
286 | style:
287 | TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
288 | ),
289 | Expanded(
290 | child: Divider(
291 | indent: 20,
292 | endIndent: 20,
293 | ),
294 | ),
295 | ],
296 | ),
297 | Image.asset("assets/pin.png"),
298 | Container(
299 | margin: const EdgeInsets.all(20.0),
300 | padding: const EdgeInsets.all(20.0),
301 | child: PinPut(
302 | onSaved: (value) {
303 | print(value);
304 | },
305 | fieldsCount: 4,
306 | onSubmit: (String pin) =>
307 | _showSnackBar(pin, context, userPin),
308 | focusNode: _pinPutFocusNode,
309 | controller: _pinPutController,
310 | submittedFieldDecoration: _pinPutDecoration.copyWith(
311 | borderRadius: BorderRadius.circular(20.0),
312 | ),
313 | selectedFieldDecoration: _pinPutDecoration,
314 | followingFieldDecoration: _pinPutDecoration.copyWith(
315 | borderRadius: BorderRadius.circular(5.0),
316 | border: Border.all(
317 | color: Colors.deepPurpleAccent.withOpacity(.5),
318 | ),
319 | ),
320 | ),
321 | ),
322 | ],
323 | ),
324 | );
325 | });
326 | }
327 |
328 | void _showSnackBar(String pin, BuildContext context, int userPin) {
329 | if (userPin == int.parse(pin)) {
330 | Fluttertoast.showToast(
331 | msg: 'We are glad that you are safe',
332 | );
333 | sendAlertSMS(false);
334 | _pinPutController.clear();
335 | _pinPutFocusNode.unfocus();
336 | } else {
337 | Fluttertoast.showToast(
338 | msg: 'Wrong Pin! Please try again',
339 | );
340 | }
341 | }
342 | }
343 |
--------------------------------------------------------------------------------
/assets/blossoms.json:
--------------------------------------------------------------------------------
1 | {"v":"5.0.1","fr":30,"ip":0,"op":180,"w":500,"h":500,"ddd":0,"assets":[],"layers":[{"ind":3,"nm":"Layer 3","ks":{"p":{"a":0,"k":[300.156,250.16]},"a":{"a":0,"k":[43.806,129.209,0]},"s":{"a":0,"k":[370,370,100]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"e":[360]},{"t":180,"s":[360]}]},"o":{"a":0,"k":100}},"ao":0,"ip":0,"op":180,"st":0,"bm":0,"sr":1,"ty":4,"shapes":[{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"i":[[0,0],[0.43,-0.53],[0.94,-0.1],[0.67,0.66],[0.41,0.33],[1,-0.07],[0.69,0.03],[0.32,-0.07],[0.44,-0.22],[0.43,-0.28],[1.8,-1.92],[0.51,-2.58],[0.33,-1.11],[0.5,1.92],[-1.04,2.69],[-0.02,1.55],[0,0],[0.04,0.31],[1.44,1.36],[0.08,0.08],[0.71,0.6],[0.65,-0.44],[0.26,-0.12],[0.87,-0.16],[0.46,-0.16],[0.5,-0.02],[0.51,-0.8],[0.29,-0.52],[0,0],[0.25,-0.53],[-0.38,-1.78],[-0.54,-0.8],[0,0],[-0.18,-0.26],[-3.59,-2.96],[-0.26,-0.23],[0.09,0.01],[0.39,0.04],[0.72,0.67],[0,0],[0,0],[0.16,0.27],[0.62,0.8],[0.25,0.36],[3.61,-0.63],[2,-0.7],[1.23,0.03],[1.06,-0.03],[0.2,-0.17],[-0.17,-0.35],[-0.3,-0.24],[-0.04,-0.58],[-0.15,-0.56],[-0.66,-1.4],[-0.11,-0.14],[-0.62,-0.43],[-2.73,-0.47],[-0.02,0],[-1.85,0.3],[-3.27,1.2],[-1.11,0.4],[0,0],[0.8,-1.26],[1.44,-0.47],[2.15,-3.87],[0.31,-1.38],[-0.02,-1.23],[-0.69,-1.63],[-0.23,-0.58],[-0.28,-0.16],[-0.44,-0.44],[-0.15,-0.22],[-0.63,0.24],[-0.33,0.13],[-1.71,0.67],[-1.38,1.13],[-0.68,2.6],[-0.01,0.06],[0.01,0.03],[0.6,1.38],[0.2,0.69],[0,0.13],[0.1,0.65],[0.11,0.59],[0,0],[-0.85,-0.23],[-0.24,-1.04],[0.04,-0.73],[-0.36,-0.96],[-0.46,-0.51],[-1.46,-1.59],[-0.01,-0.02],[-0.91,-0.49],[-1.25,-0.11],[-0.42,-0.04],[-2.25,-0.21],[-0.36,0.53],[-0.09,0.55],[-0.17,0.75],[-0.41,0.64],[-0.21,0.25],[0.1,1.08],[1.52,2.1],[0.01,0.01],[2.73,1.47],[0.38,0.16],[0.01,0.01],[0.35,0.11],[0.23,0.03],[0,0],[0.71,-0.16],[0.22,-0.09],[0.77,-0.36],[0.98,-0.04],[0.1,-0.01],[0.62,0.57],[-1.27,0.03],[-2.25,0.34],[-1.14,0.45],[-0.01,0],[-2.32,1.54],[-0.43,0.33],[-0.44,0.73],[-0.17,1.22],[-0.14,1.09],[0.34,0.6]],"o":[[-0.33,-0.59],[0.11,-0.93],[-0.93,0.11],[-0.37,-0.36],[-0.78,-0.63],[-0.69,0.05],[-0.34,-0.02],[-0.47,0.1],[-0.46,0.23],[-2.22,1.4],[-1.8,1.91],[-0.22,1.13],[0,0],[0.42,-3.56],[0.57,-1.47],[0,0],[0.01,-0.3],[-0.31,-1.95],[-0.08,-0.08],[-0.69,-0.64],[-0.6,-0.51],[-0.24,0.15],[-0.81,0.38],[-0.49,0.09],[-0.47,0.16],[-0.93,0.03],[-0.32,0.5],[-0.01,0],[-0.28,0.52],[-0.78,1.64],[0.21,0.94],[0,0],[0.17,0.26],[2.68,3.8],[0.26,0.22],[-0.09,-0.02],[-0.38,-0.04],[-0.93,-0.31],[0,0],[-0.01,0],[-0.18,-0.26],[-0.51,-0.87],[-0.22,-0.38],[-2.08,-3.02],[-2.09,0.36],[-1.16,0.41],[-1.06,-0.02],[-0.27,0.01],[-0.3,0.25],[0.16,0.35],[-0.58,0.04],[0.04,0.58],[0.42,1.49],[0.08,0.17],[0.42,0.61],[2.27,1.58],[0.02,0.01],[1.84,0.3],[3.44,-0.57],[1.1,-0.4],[0,0],[0,0],[-1.38,0.61],[-4.19,1.41],[-0.69,1.24],[-0.28,1.21],[0.03,1.77],[0.24,0.58],[0.12,0.29],[0.55,0.31],[0.19,0.19],[0.39,0.55],[0.33,-0.13],[1.72,-0.67],[1.66,-0.65],[2.07,-1.71],[0.02,-0.07],[0.01,-0.03],[0.52,-1.42],[-0.29,-0.66],[0,-0.13],[0,-0.32],[-0.08,-0.52],[0,0],[0,0],[0.62,0.87],[0.17,0.71],[-0.05,1.02],[0.23,0.65],[1.47,1.59],[0.01,0.01],[0.71,0.77],[1.11,0.59],[0.42,0.04],[2.25,0.2],[0.64,0.05],[-0.35,-0.43],[0.6,0.47],[0.18,-0.74],[0.17,-0.27],[0.68,-0.82],[-0.25,-2.59],[-0.01,-0.01],[-1.82,-2.5],[-0.36,-0.19],[-0.01,-0.01],[-0.32,-0.18],[-0.23,-0.06],[-0.01,0],[-0.73,-0.16],[-0.22,0.05],[-0.79,0.32],[-0.88,0.42],[-0.1,0.01],[-0.38,-0.01],[-0.88,-0.81],[2.27,-0.02],[1.22,-0.19],[0.01,0],[2.57,-1.03],[0.44,-0.29],[0.68,-0.51],[0.64,-1.07],[0.14,-1.09],[0.11,-0.7],[0,0]],"v":[[74.36,111.37],[72.66,111.03],[70.58,109.76],[67.89,109.49],[66.98,108.23],[64.07,108.3],[62,108.06],[61.02,108.15],[59.65,108.64],[58.31,109.41],[52.12,114.25],[48.4,121.08],[47.81,124.49],[46.45,124.7],[48.9,114.56],[50.11,110.02],[50.11,110.01],[50.05,109.1],[46.92,104.22],[46.67,103.99],[44.56,102.12],[42.46,101.54],[41.81,102.08],[39.34,101.33],[38.08,102.08],[36.61,102.03],[34.5,103.7],[33.59,105.24],[33.58,105.25],[32.77,106.83],[31.74,112.08],[32.96,114.67],[32.97,114.68],[33.51,115.47],[42.51,126.07],[43.3,126.74],[43.04,126.68],[41.88,126.59],[39.37,125.16],[39.29,125.09],[39.28,125.08],[38.78,124.26],[37.08,121.76],[36.39,120.64],[26.79,116.61],[20.75,118.73],[17.17,119.41],[14.01,119.16],[13.26,119.37],[13.12,120.44],[13.89,121.29],[13.01,122.58],[13.5,124.25],[14.02,128.84],[14.3,129.3],[15.96,130.8],[23.45,134.22],[23.52,134.23],[29.1,134.11],[39.11,131.15],[42.42,129.95],[42.42,129.95],[42.94,130.94],[38.62,132.36],[28.53,140.52],[27.02,144.48],[26.62,148.16],[27.68,153.32],[28.44,155.03],[28.96,155.8],[30.78,156.05],[31.15,156.74],[33.03,156.87],[34,156.49],[39.15,154.48],[43.88,152.03],[47.75,145.12],[47.8,144.92],[47.82,144.84],[47.75,140.42],[46.86,138.46],[46.87,138.07],[46.72,136.55],[46.43,134.86],[46.43,134.86],[47.21,133.7],[48.52,136.61],[48.72,138.77],[48.79,141.82],[49.96,143.49],[54.37,148.27],[54.41,148.32],[56.76,150.34],[60.41,151.16],[61.66,151.27],[68.41,151.87],[70.18,151.4],[69.76,149.83],[71.39,148.83],[71.85,146.61],[72.48,145.89],[73.12,142.82],[70.33,135.73],[70.31,135.7],[63.25,129.64],[62.13,129.1],[62.09,129.08],[61.09,128.64],[60.39,128.51],[60.38,128.51],[58.2,128.48],[57.54,128.68],[55.31,129.94],[52.49,130.54],[52.19,130.55],[50.49,129.86],[52.38,128.26],[59.22,128.09],[62.75,127.11],[62.78,127.1],[70.05,122.97],[71.37,122.05],[73.1,120.22],[74.08,116.65],[74.51,113.39],[74.36,111.37]],"c":true},"hd":false}},{"ty":"fl","c":{"a":0,"k":[0.91,0.353,0.478,1]},"hd":false,"o":{"a":0,"k":100},"r":1},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"nm":"Object","hd":false}]},{"ind":2,"nm":"Layer 2","ks":{"p":{"a":0,"k":[238.048,167.906]},"a":{"a":0,"k":[23.148,20.992,0]},"s":{"a":0,"k":[-400,-400,100]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"e":[360]},{"t":180,"s":[360]}]},"o":{"a":0,"k":100}},"ao":0,"ip":0,"op":180,"st":0,"bm":0,"sr":1,"ty":4,"shapes":[{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"i":[[0,0],[0.33,-0.4],[0.7,-0.08],[0.51,0.49],[0.3,0.25],[0.76,-0.05],[0.53,0.03],[0.25,-0.05],[0.33,-0.16],[0.33,-0.21],[1.35,-1.44],[0.38,-1.94],[0.24,-0.84],[0.38,1.44],[-0.79,2.02],[-0.01,1.16],[0,0],[0.04,0.23],[1.08,1.03],[0.07,0.06],[0.54,0.46],[0.49,-0.33],[0.2,-0.09],[0.66,-0.12],[0.35,-0.12],[0.37,-0.01],[0.37,-0.59],[0.21,-0.39],[0,0],[0.19,-0.4],[-0.28,-1.34],[-0.4,-0.6],[0,0],[-0.14,-0.19],[-2.7,-2.22],[-0.2,-0.18],[0.07,0],[0.29,0.03],[0.55,0.51],[0,0],[0,0.01],[0.12,0.21],[0.47,0.6],[0.19,0.28],[2.72,-0.47],[1.5,-0.52],[0.93,0.01],[0.79,-0.02],[0.16,-0.13],[-0.12,-0.26],[-0.22,-0.18],[-0.03,-0.43],[-0.12,-0.42],[-0.5,-1.05],[-0.08,-0.11],[-0.47,-0.32],[-2.05,-0.35],[-0.01,-0.01],[-1.39,0.23],[-2.46,0.89],[-0.83,0.3],[0,0],[0.6,-0.94],[1.08,-0.36],[1.62,-2.91],[0.24,-1.04],[-0.02,-0.93],[-0.52,-1.22],[-0.17,-0.43],[-0.21,-0.12],[-0.33,-0.33],[-0.11,-0.17],[-0.48,0.19],[-0.24,0.1],[-1.29,0.5],[-1.03,0.86],[-0.51,1.95],[-0.01,0.05],[0,0.02],[0.45,1.05],[0.15,0.51],[0,0.09],[0.07,0.49],[0.09,0.45],[0,0],[-0.64,-0.17],[-0.18,-0.78],[0.03,-0.54],[-0.27,-0.73],[-0.35,-0.38],[-1.1,-1.2],[-0.01,-0.01],[-0.69,-0.37],[-0.94,-0.09],[-0.32,-0.03],[-1.69,-0.15],[-0.27,0.39],[-0.07,0.41],[-0.13,0.56],[-0.32,0.48],[-0.15,0.19],[0.08,0.81],[1.14,1.58],[0.01,0.01],[2.06,1.11],[0.29,0.13],[0.01,0],[0.26,0.08],[0.18,0.02],[0,0],[0.53,-0.12],[0.17,-0.07],[0.58,-0.27],[0.74,-0.03],[0.07,0],[0.47,0.43],[-0.95,0.02],[-1.68,0.26],[-0.85,0.34],[0,0],[-1.75,1.15],[-0.32,0.24],[-0.33,0.55],[-0.13,0.93],[-0.11,0.82],[0.25,0.45]],"o":[[-0.25,-0.44],[0.08,-0.7],[-0.7,0.08],[-0.28,-0.27],[-0.58,-0.47],[-0.52,0.03],[-0.25,-0.01],[-0.36,0.08],[-0.35,0.17],[-1.67,1.05],[-1.35,1.44],[-0.16,0.85],[0,0],[0.32,-2.68],[0.43,-1.1],[0,0],[0,-0.22],[-0.23,-1.46],[-0.06,-0.06],[-0.52,-0.48],[-0.45,-0.38],[-0.18,0.12],[-0.61,0.29],[-0.37,0.07],[-0.35,0.12],[-0.7,0.02],[-0.24,0.37],[0,0],[-0.21,0.39],[-0.58,1.23],[0.15,0.71],[0,0],[0.13,0.2],[2.02,2.86],[0.2,0.16],[-0.07,-0.01],[-0.29,-0.06],[-0.7,-0.23],[0,0],[-0.01,0],[-0.14,-0.2],[-0.39,-0.66],[-0.16,-0.29],[-1.57,-2.27],[-1.57,0.27],[-0.88,0.31],[-0.79,-0.01],[-0.2,0.01],[-0.22,0.19],[0.12,0.26],[-0.42,0.04],[0.03,0.44],[0.31,1.12],[0.06,0.12],[0.32,0.46],[1.71,1.19],[0.02,0],[1.39,0.23],[2.59,-0.43],[0.83,-0.3],[0,0],[0,0],[-1.03,0.46],[-3.15,1.06],[-0.52,0.93],[-0.21,0.91],[0.02,1.33],[0.18,0.43],[0.09,0.22],[0.41,0.24],[0.14,0.14],[0.29,0.42],[0.24,-0.1],[1.29,-0.5],[1.25,-0.49],[1.56,-1.28],[0.01,-0.05],[0.01,-0.02],[0.39,-1.07],[-0.21,-0.49],[0,-0.1],[0,-0.24],[-0.06,-0.39],[0,0],[0,0],[0.47,0.66],[0.13,0.53],[-0.04,0.77],[0.17,0.49],[1.11,1.2],[0.01,0.01],[0.53,0.58],[0.84,0.44],[0.31,0.03],[1.69,0.15],[0.48,0.04],[-0.27,-0.33],[0.45,0.35],[0.13,-0.56],[0.13,-0.2],[0.51,-0.62],[-0.19,-1.95],[-0.01,-0.01],[-1.37,-1.88],[-0.27,-0.14],[-0.01,0],[-0.24,-0.14],[-0.17,-0.05],[-0.01,0],[-0.55,-0.12],[-0.17,0.03],[-0.59,0.24],[-0.66,0.32],[-0.07,0],[-0.29,-0.01],[-0.66,-0.61],[1.71,-0.01],[0.92,-0.14],[0.01,0],[1.93,-0.77],[0.33,-0.22],[0.51,-0.39],[0.48,-0.81],[0.1,-0.82],[0.06,-0.52],[0,0]],"v":[[46.12,7.56],[44.84,7.3],[43.28,6.35],[41.25,6.15],[40.57,5.2],[38.38,5.25],[36.82,5.07],[36.08,5.13],[35.05,5.5],[34.04,6.08],[29.39,9.72],[26.59,14.86],[26.15,17.43],[25.13,17.59],[26.98,9.97],[27.89,6.56],[27.89,6.56],[27.84,5.88],[25.49,2.21],[25.3,2.04],[23.71,0.63],[22.13,0.19],[21.64,0.6],[19.78,0.04],[18.83,0.6],[17.73,0.56],[16.15,1.81],[15.47,2.96],[15.47,2.97],[14.86,4.16],[14.08,8.11],[15,10.06],[15,10.07],[15.41,10.66],[22.18,18.63],[22.78,19.14],[22.58,19.1],[21.71,19],[19.82,17.92],[19.76,17.87],[19.75,17.86],[19.37,17.24],[18.09,15.36],[17.57,14.51],[10.35,11.48],[5.81,13.07],[3.12,13.59],[0.75,13.4],[0.18,13.56],[0.07,14.36],[0.65,15],[0,15.98],[0.37,17.23],[0.76,20.68],[0.97,21.03],[2.22,22.16],[7.85,24.73],[7.9,24.74],[12.1,24.65],[19.63,22.43],[22.12,21.53],[22.12,21.53],[22.51,22.27],[19.26,23.34],[11.67,29.48],[10.53,32.46],[10.23,35.23],[11.03,39.11],[11.6,40.39],[11.99,40.97],[13.36,41.16],[13.64,41.68],[15.06,41.77],[15.79,41.48],[19.67,39.97],[23.22,38.12],[26.13,32.93],[26.17,32.78],[26.19,32.72],[26.14,29.39],[25.47,27.92],[25.48,27.63],[25.37,26.49],[25.15,25.22],[25.15,25.22],[25.74,24.35],[26.73,26.54],[26.88,28.16],[26.93,30.46],[27.81,31.72],[31.13,35.32],[31.16,35.35],[32.93,36.87],[35.67,37.49],[36.61,37.57],[41.68,38.02],[43.01,37.67],[42.7,36.49],[43.93,35.74],[44.28,34.07],[44.75,33.53],[45.23,31.22],[43.13,25.89],[43.11,25.87],[37.8,21.31],[36.96,20.9],[36.93,20.89],[36.18,20.56],[35.65,20.46],[35.64,20.46],[34,20.44],[33.5,20.59],[31.82,21.54],[29.7,21.99],[29.48,21.99],[28.2,21.47],[29.62,20.27],[34.76,20.14],[37.41,19.4],[37.43,19.39],[42.9,16.29],[43.89,15.6],[45.19,14.22],[45.93,11.53],[46.25,9.08],[46.12,7.56]],"c":true},"hd":false}},{"ty":"fl","c":{"a":0,"k":[1,0.718,0.773,1]},"hd":false,"o":{"a":0,"k":100},"r":1},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"nm":"Object","hd":false}]},{"ind":1,"nm":"Layer 1","ks":{"p":{"a":0,"k":[180.913,307.521]},"a":{"a":0,"k":[23.148,20.992,0]},"s":{"a":0,"k":[-400,400,100]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"e":[360]},{"t":180,"s":[360]}]},"o":{"a":0,"k":100}},"ao":0,"ip":0,"op":180,"st":0,"bm":0,"sr":1,"ty":4,"shapes":[{"ty":"gr","it":[{"ty":"sh","d":1,"ks":{"a":0,"k":{"i":[[0,0],[0.33,-0.4],[0.7,-0.08],[0.51,0.49],[0.3,0.25],[0.76,-0.05],[0.53,0.03],[0.25,-0.05],[0.33,-0.16],[0.33,-0.21],[1.35,-1.44],[0.38,-1.94],[0.24,-0.84],[0.38,1.44],[-0.79,2.02],[-0.01,1.16],[0,0],[0.04,0.23],[1.08,1.03],[0.07,0.06],[0.54,0.46],[0.49,-0.33],[0.2,-0.09],[0.66,-0.12],[0.35,-0.12],[0.37,-0.01],[0.37,-0.59],[0.21,-0.39],[0,0],[0.19,-0.4],[-0.28,-1.34],[-0.4,-0.6],[0,0],[-0.14,-0.19],[-2.7,-2.22],[-0.2,-0.18],[0.07,0],[0.29,0.03],[0.55,0.51],[0,0],[0,0.01],[0.12,0.21],[0.47,0.6],[0.19,0.28],[2.72,-0.47],[1.5,-0.52],[0.93,0.01],[0.79,-0.02],[0.16,-0.13],[-0.12,-0.26],[-0.22,-0.18],[-0.03,-0.43],[-0.12,-0.42],[-0.5,-1.05],[-0.08,-0.11],[-0.47,-0.32],[-2.05,-0.35],[-0.01,-0.01],[-1.39,0.23],[-2.46,0.89],[-0.83,0.3],[0,0],[0.6,-0.94],[1.08,-0.36],[1.62,-2.91],[0.24,-1.04],[-0.02,-0.93],[-0.52,-1.22],[-0.17,-0.43],[-0.21,-0.12],[-0.33,-0.33],[-0.11,-0.17],[-0.48,0.19],[-0.24,0.1],[-1.29,0.5],[-1.03,0.86],[-0.51,1.95],[-0.01,0.05],[0,0.02],[0.45,1.05],[0.15,0.51],[0,0.09],[0.07,0.49],[0.09,0.45],[0,0],[-0.64,-0.17],[-0.18,-0.78],[0.03,-0.54],[-0.27,-0.73],[-0.35,-0.38],[-1.1,-1.2],[-0.01,-0.01],[-0.69,-0.37],[-0.94,-0.09],[-0.32,-0.03],[-1.69,-0.15],[-0.27,0.39],[-0.07,0.41],[-0.13,0.56],[-0.32,0.48],[-0.15,0.19],[0.08,0.81],[1.14,1.58],[0.01,0.01],[2.06,1.11],[0.29,0.13],[0.01,0],[0.26,0.08],[0.18,0.02],[0,0],[0.53,-0.12],[0.17,-0.07],[0.58,-0.27],[0.74,-0.03],[0.07,0],[0.47,0.43],[-0.95,0.02],[-1.68,0.26],[-0.85,0.34],[0,0],[-1.75,1.15],[-0.32,0.24],[-0.33,0.55],[-0.13,0.93],[-0.11,0.82],[0.25,0.45]],"o":[[-0.25,-0.44],[0.08,-0.7],[-0.7,0.08],[-0.28,-0.27],[-0.58,-0.47],[-0.52,0.03],[-0.25,-0.01],[-0.36,0.08],[-0.35,0.17],[-1.67,1.05],[-1.35,1.44],[-0.16,0.85],[0,0],[0.32,-2.68],[0.43,-1.1],[0,0],[0,-0.22],[-0.23,-1.46],[-0.06,-0.06],[-0.52,-0.48],[-0.45,-0.38],[-0.18,0.12],[-0.61,0.29],[-0.37,0.07],[-0.35,0.12],[-0.7,0.02],[-0.24,0.37],[0,0],[-0.21,0.39],[-0.58,1.23],[0.15,0.71],[0,0],[0.13,0.2],[2.02,2.86],[0.2,0.16],[-0.07,-0.01],[-0.29,-0.06],[-0.7,-0.23],[0,0],[-0.01,0],[-0.14,-0.2],[-0.39,-0.66],[-0.16,-0.29],[-1.57,-2.27],[-1.57,0.27],[-0.88,0.31],[-0.79,-0.01],[-0.2,0.01],[-0.22,0.19],[0.12,0.26],[-0.42,0.04],[0.03,0.44],[0.31,1.12],[0.06,0.12],[0.32,0.46],[1.71,1.19],[0.02,0],[1.39,0.23],[2.59,-0.43],[0.83,-0.3],[0,0],[0,0],[-1.03,0.46],[-3.15,1.06],[-0.52,0.93],[-0.21,0.91],[0.02,1.33],[0.18,0.43],[0.09,0.22],[0.41,0.24],[0.14,0.14],[0.29,0.42],[0.24,-0.1],[1.29,-0.5],[1.25,-0.49],[1.56,-1.28],[0.01,-0.05],[0.01,-0.02],[0.39,-1.07],[-0.21,-0.49],[0,-0.1],[0,-0.24],[-0.06,-0.39],[0,0],[0,0],[0.47,0.66],[0.13,0.53],[-0.04,0.77],[0.17,0.49],[1.11,1.2],[0.01,0.01],[0.53,0.58],[0.84,0.44],[0.31,0.03],[1.69,0.15],[0.48,0.04],[-0.27,-0.33],[0.45,0.35],[0.13,-0.56],[0.13,-0.2],[0.51,-0.62],[-0.19,-1.95],[-0.01,-0.01],[-1.37,-1.88],[-0.27,-0.14],[-0.01,0],[-0.24,-0.14],[-0.17,-0.05],[-0.01,0],[-0.55,-0.12],[-0.17,0.03],[-0.59,0.24],[-0.66,0.32],[-0.07,0],[-0.29,-0.01],[-0.66,-0.61],[1.71,-0.01],[0.92,-0.14],[0.01,0],[1.93,-0.77],[0.33,-0.22],[0.51,-0.39],[0.48,-0.81],[0.1,-0.82],[0.06,-0.52],[0,0]],"v":[[46.12,7.56],[44.84,7.3],[43.28,6.35],[41.25,6.15],[40.57,5.2],[38.38,5.25],[36.82,5.07],[36.08,5.13],[35.05,5.5],[34.04,6.08],[29.39,9.72],[26.59,14.86],[26.15,17.43],[25.13,17.59],[26.98,9.97],[27.89,6.56],[27.89,6.56],[27.84,5.88],[25.49,2.21],[25.3,2.04],[23.71,0.63],[22.13,0.19],[21.64,0.6],[19.78,0.04],[18.83,0.6],[17.73,0.56],[16.15,1.81],[15.47,2.96],[15.47,2.97],[14.86,4.16],[14.08,8.11],[15,10.06],[15,10.07],[15.41,10.66],[22.18,18.63],[22.78,19.14],[22.58,19.1],[21.71,19],[19.82,17.92],[19.76,17.87],[19.75,17.86],[19.37,17.24],[18.09,15.36],[17.57,14.51],[10.35,11.48],[5.81,13.07],[3.12,13.59],[0.75,13.4],[0.18,13.56],[0.07,14.36],[0.65,15],[0,15.98],[0.37,17.23],[0.76,20.68],[0.97,21.03],[2.22,22.16],[7.85,24.73],[7.9,24.74],[12.1,24.65],[19.63,22.43],[22.12,21.53],[22.12,21.53],[22.51,22.27],[19.26,23.34],[11.67,29.48],[10.53,32.46],[10.23,35.23],[11.03,39.11],[11.6,40.39],[11.99,40.97],[13.36,41.16],[13.64,41.68],[15.06,41.77],[15.79,41.48],[19.67,39.97],[23.22,38.12],[26.13,32.93],[26.17,32.78],[26.19,32.72],[26.14,29.39],[25.47,27.92],[25.48,27.63],[25.37,26.49],[25.15,25.22],[25.15,25.22],[25.74,24.35],[26.73,26.54],[26.88,28.16],[26.93,30.46],[27.81,31.72],[31.13,35.32],[31.16,35.35],[32.93,36.87],[35.67,37.49],[36.61,37.57],[41.68,38.02],[43.01,37.67],[42.7,36.49],[43.93,35.74],[44.28,34.07],[44.75,33.53],[45.23,31.22],[43.13,25.89],[43.11,25.87],[37.8,21.31],[36.96,20.9],[36.93,20.89],[36.18,20.56],[35.65,20.46],[35.64,20.46],[34,20.44],[33.5,20.59],[31.82,21.54],[29.7,21.99],[29.48,21.99],[28.2,21.47],[29.62,20.27],[34.76,20.14],[37.41,19.4],[37.43,19.39],[42.9,16.29],[43.89,15.6],[45.19,14.22],[45.93,11.53],[46.25,9.08],[46.12,7.56]],"c":true},"hd":false}},{"ty":"fl","c":{"a":0,"k":[1,0.569,0.663,1]},"hd":false,"o":{"a":0,"k":100},"r":1},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"nm":"Object","hd":false}]}],"markers":[]}
--------------------------------------------------------------------------------