├── .gitignore
├── .metadata
├── README.md
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ ├── google-services.json
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── ufinix
│ │ │ │ └── cabdriver
│ │ │ │ └── MainActivity.java
│ │ └── res
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ └── values
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── fonts
├── bolt-regular.ttf
└── bolt-semibold.ttf
├── images
├── car_android.png
├── car_ios.png
├── desticon.png
├── desticon1.png
├── logo.png
├── pickicon.png
├── posimarker.png
├── redmarker.png
├── taxi.png
└── user_icon.png
├── ios
├── .gitignore
├── File.swift
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── Podfile.lock
├── Runner-Bridging-Header.h
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
└── Runner
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Icon-App-1024x1024@1x.png
│ │ ├── 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-83.5x83.5@2x.png
│ └── LaunchImage.imageset
│ │ ├── Contents.json
│ │ ├── LaunchImage.png
│ │ ├── LaunchImage@2x.png
│ │ ├── LaunchImage@3x.png
│ │ └── README.md
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── GoogleService-Info.plist
│ ├── Info.plist
│ ├── Runner.entitlements
│ └── main.m
├── lib
├── brand_colors.dart
├── datamodels
│ ├── directiondetails.dart
│ ├── driver.dart
│ ├── history.dart
│ └── tripdetails.dart
├── dataprovider.dart
├── globalvariabels.dart
├── helpers
│ ├── helpermethods.dart
│ ├── mapkithelper.dart
│ ├── pushnotificationservice.dart
│ └── requesthelper.dart
├── main.dart
├── screens
│ ├── historypage.dart
│ ├── login.dart
│ ├── mainpage.dart
│ ├── newtripspage.dart
│ ├── registration.dart
│ └── vehicleinfo.dart
├── tabs
│ ├── earningstab.dart
│ ├── hometab.dart
│ ├── profiletab.dart
│ └── ratingstab.dart
└── widgets
│ ├── AvailabilityButton.dart
│ ├── BrandDivier.dart
│ ├── CollectPaymentDialog.dart
│ ├── ConfirmSheet.dart
│ ├── HistoryTile.dart
│ ├── NotificationDialog.dart
│ ├── ProgressDialog.dart
│ ├── TaxiButton.dart
│ └── TaxiOutlineButton.dart
├── pubspec.lock
├── pubspec.yaml
├── sounds
└── alert.mp3
└── test
└── widget_test.dart
/.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 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | /build/
32 |
33 | # Web related
34 | lib/generated_plugin_registrant.dart
35 |
36 | # Symbolication related
37 | app.*.symbols
38 |
39 | # Obfuscation related
40 | app.*.map.json
41 |
42 | # Exceptions to above rules.
43 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
44 |
--------------------------------------------------------------------------------
/.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: f7a6a7906be96d2288f5d63a5a54c515a6e987fe
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # cabdriver
2 |
3 | A new Flutter application.
4 |
5 | ## Getting Started
6 |
7 | This project is a starting point for a Flutter application.
8 |
9 | A few resources to get you started if this is your first Flutter project:
10 |
11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
13 |
14 | For help getting started with Flutter, view our
15 | [online documentation](https://flutter.dev/docs), which offers tutorials,
16 | samples, guidance on mobile development, and a full API reference.
17 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/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 from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
26 | apply plugin: 'com.google.gms.google-services'
27 |
28 | android {
29 | compileSdkVersion 30
30 |
31 | lintOptions {
32 | disable 'InvalidPackage'
33 | }
34 |
35 | defaultConfig {
36 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
37 | applicationId "com.ufinix.cabdriver"
38 | minSdkVersion 16
39 | targetSdkVersion 30
40 | versionCode flutterVersionCode.toInteger()
41 | versionName flutterVersionName
42 | }
43 | buildTypes {
44 | release {
45 | // TODO: Add your own signing config for the release build.
46 | // Signing with the debug keys for now, so `flutter run --release` works.
47 | signingConfig signingConfigs.debug
48 | }
49 | }
50 | }
51 |
52 | flutter {
53 | source '../..'
54 | }
55 |
56 | dependencies {
57 |
58 | implementation 'com.google.firebase:firebase-messaging:20.2.0'
59 | }
--------------------------------------------------------------------------------
/android/app/google-services.json:
--------------------------------------------------------------------------------
1 | {
2 | "project_info": {
3 | "project_number": "169450788828",
4 | "firebase_url": "https://geetaxi-9c60a.firebaseio.com",
5 | "project_id": "geetaxi-9c60a",
6 | "storage_bucket": "geetaxi-9c60a.appspot.com"
7 | },
8 | "client": [
9 | {
10 | "client_info": {
11 | "mobilesdk_app_id": "1:169450788828:android:418ca150b8799c9ef9a119",
12 | "android_client_info": {
13 | "package_name": "com.ufinix.cab_rider"
14 | }
15 | },
16 | "oauth_client": [
17 | {
18 | "client_id": "169450788828-u10e9c6dlb73iq7de33l41iaodjd46ug.apps.googleusercontent.com",
19 | "client_type": 3
20 | }
21 | ],
22 | "api_key": [
23 | {
24 | "current_key": "AIzaSyDQSm22dfjceA0OiQ9XL-0tQ0d7_XZTXpQ"
25 | }
26 | ],
27 | "services": {
28 | "appinvite_service": {
29 | "other_platform_oauth_client": [
30 | {
31 | "client_id": "169450788828-u10e9c6dlb73iq7de33l41iaodjd46ug.apps.googleusercontent.com",
32 | "client_type": 3
33 | },
34 | {
35 | "client_id": "169450788828-djkmdaq2voe24hghj5nc05sv5upikbfu.apps.googleusercontent.com",
36 | "client_type": 2,
37 | "ios_info": {
38 | "bundle_id": "com.ufinix.cabRider"
39 | }
40 | }
41 | ]
42 | }
43 | }
44 | },
45 | {
46 | "client_info": {
47 | "mobilesdk_app_id": "1:169450788828:android:5ecb13adb959cb18f9a119",
48 | "android_client_info": {
49 | "package_name": "com.ufinix.cabdriver"
50 | }
51 | },
52 | "oauth_client": [
53 | {
54 | "client_id": "169450788828-u10e9c6dlb73iq7de33l41iaodjd46ug.apps.googleusercontent.com",
55 | "client_type": 3
56 | }
57 | ],
58 | "api_key": [
59 | {
60 | "current_key": "AIzaSyDQSm22dfjceA0OiQ9XL-0tQ0d7_XZTXpQ"
61 | }
62 | ],
63 | "services": {
64 | "appinvite_service": {
65 | "other_platform_oauth_client": [
66 | {
67 | "client_id": "169450788828-u10e9c6dlb73iq7de33l41iaodjd46ug.apps.googleusercontent.com",
68 | "client_type": 3
69 | },
70 | {
71 | "client_id": "169450788828-djkmdaq2voe24hghj5nc05sv5upikbfu.apps.googleusercontent.com",
72 | "client_type": 2,
73 | "ios_info": {
74 | "bundle_id": "com.ufinix.cabRider"
75 | }
76 | }
77 | ]
78 | }
79 | }
80 | }
81 | ],
82 | "configuration_version": "1"
83 | }
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
8 |
9 |
10 |
11 |
12 |
16 |
23 |
27 |
31 |
36 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
54 |
55 |
57 |
58 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/ufinix/cabdriver/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.ufinix.cabdriver;
2 |
3 | import io.flutter.embedding.android.FlutterActivity;
4 |
5 | public class MainActivity extends FlutterActivity {
6 | }
7 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | repositories {
3 | google()
4 | jcenter()
5 | }
6 |
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:3.5.0'
9 | classpath 'com.google.gms:google-services:4.3.3'
10 | }
11 | }
12 |
13 | allprojects {
14 | repositories {
15 | google()
16 | jcenter()
17 | }
18 | }
19 |
20 | rootProject.buildDir = '../build'
21 | subprojects {
22 | project.buildDir = "${rootProject.buildDir}/${project.name}"
23 | }
24 | subprojects {
25 | project.evaluationDependsOn(':app')
26 | }
27 |
28 | task clean(type: Delete) {
29 | delete rootProject.buildDir
30 | }
31 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/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-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/fonts/bolt-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/fonts/bolt-regular.ttf
--------------------------------------------------------------------------------
/fonts/bolt-semibold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/fonts/bolt-semibold.ttf
--------------------------------------------------------------------------------
/images/car_android.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/images/car_android.png
--------------------------------------------------------------------------------
/images/car_ios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/images/car_ios.png
--------------------------------------------------------------------------------
/images/desticon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/images/desticon.png
--------------------------------------------------------------------------------
/images/desticon1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/images/desticon1.png
--------------------------------------------------------------------------------
/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/images/logo.png
--------------------------------------------------------------------------------
/images/pickicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/images/pickicon.png
--------------------------------------------------------------------------------
/images/posimarker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/images/posimarker.png
--------------------------------------------------------------------------------
/images/redmarker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/images/redmarker.png
--------------------------------------------------------------------------------
/images/taxi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/images/taxi.png
--------------------------------------------------------------------------------
/images/user_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/images/user_icon.png
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/ios/File.swift:
--------------------------------------------------------------------------------
1 | //
2 | // File.swift
3 | // Runner
4 | //
5 | // Created by Elatech Limited on 31/05/2020.
6 | //
7 |
8 | import Foundation
9 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
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 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | platform :ios, '9.0'
3 | use_frameworks!
4 |
5 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
6 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
7 |
8 | project 'Runner', {
9 | 'Debug' => :debug,
10 | 'Profile' => :release,
11 | 'Release' => :release,
12 | }
13 |
14 | def parse_KV_file(file, separator='=')
15 | file_abs_path = File.expand_path(file)
16 | if !File.exists? file_abs_path
17 | return [];
18 | end
19 | generated_key_values = {}
20 | skip_line_start_symbols = ["#", "/"]
21 | File.foreach(file_abs_path) do |line|
22 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
23 | plugin = line.split(pattern=separator)
24 | if plugin.length == 2
25 | podname = plugin[0].strip()
26 | path = plugin[1].strip()
27 | podpath = File.expand_path("#{path}", file_abs_path)
28 | generated_key_values[podname] = podpath
29 | else
30 | puts "Invalid plugin specification: #{line}"
31 | end
32 | end
33 | generated_key_values
34 | end
35 |
36 | target 'Runner' do
37 | # Flutter Pod
38 |
39 | copied_flutter_dir = File.join(__dir__, 'Flutter')
40 | copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework')
41 | copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec')
42 | unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path)
43 | # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet.
44 | # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration.
45 | # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist.
46 |
47 | generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig')
48 | unless File.exist?(generated_xcode_build_settings_path)
49 | raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
50 | end
51 | generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path)
52 | cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR'];
53 |
54 | unless File.exist?(copied_framework_path)
55 | FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir)
56 | end
57 | unless File.exist?(copied_podspec_path)
58 | FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir)
59 | end
60 | end
61 |
62 | # Keep pod path relative so it can be checked into Podfile.lock.
63 | pod 'Flutter', :path => 'Flutter'
64 |
65 | # Plugin Pods
66 |
67 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
68 | # referring to absolute paths on developers' machines.
69 | system('rm -rf .symlinks')
70 | system('mkdir -p .symlinks/plugins')
71 | plugin_pods = parse_KV_file('../.flutter-plugins')
72 | plugin_pods.each do |name, path|
73 | symlink = File.join('.symlinks', 'plugins', name)
74 | File.symlink(path, symlink)
75 | pod name, :path => File.join(symlink, 'ios')
76 | end
77 | end
78 |
79 | post_install do |installer|
80 | installer.pods_project.targets.each do |target|
81 | target.build_configurations.each do |config|
82 | config.build_settings['ENABLE_BITCODE'] = 'NO'
83 | end
84 | end
85 | end
86 |
--------------------------------------------------------------------------------
/ios/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - assets_audio_player (0.0.1):
3 | - Flutter
4 | - assets_audio_player_web (0.0.1):
5 | - Flutter
6 | - connectivity (0.0.1):
7 | - Flutter
8 | - Reachability
9 | - connectivity_macos (0.0.1):
10 | - Flutter
11 | - Firebase/Auth (6.14.0):
12 | - Firebase/CoreOnly
13 | - FirebaseAuth (~> 6.4.1)
14 | - Firebase/Core (6.14.0):
15 | - Firebase/CoreOnly
16 | - FirebaseAnalytics (= 6.1.7)
17 | - Firebase/CoreOnly (6.14.0):
18 | - FirebaseCore (= 6.5.0)
19 | - Firebase/Database (6.14.0):
20 | - Firebase/CoreOnly
21 | - FirebaseDatabase (~> 6.1.3)
22 | - Firebase/Messaging (6.14.0):
23 | - Firebase/CoreOnly
24 | - FirebaseMessaging (~> 4.1.10)
25 | - firebase_auth (0.0.1):
26 | - Firebase/Auth (~> 6.3)
27 | - Firebase/Core
28 | - Flutter
29 | - firebase_auth_web (0.1.0):
30 | - Flutter
31 | - firebase_core (0.0.1):
32 | - Firebase/Core
33 | - Flutter
34 | - firebase_core_web (0.1.0):
35 | - Flutter
36 | - firebase_database (0.0.1):
37 | - Firebase/Database
38 | - Flutter
39 | - firebase_messaging (0.0.1):
40 | - Firebase/Core
41 | - Firebase/Messaging
42 | - Flutter
43 | - FirebaseAnalytics (6.1.7):
44 | - FirebaseCore (~> 6.5)
45 | - FirebaseInstanceID (~> 4.2)
46 | - GoogleAppMeasurement (= 6.1.7)
47 | - GoogleUtilities/AppDelegateSwizzler (~> 6.0)
48 | - GoogleUtilities/MethodSwizzler (~> 6.0)
49 | - GoogleUtilities/Network (~> 6.0)
50 | - "GoogleUtilities/NSData+zlib (~> 6.0)"
51 | - nanopb (= 0.3.9011)
52 | - FirebaseAnalyticsInterop (1.5.0)
53 | - FirebaseAuth (6.4.1):
54 | - FirebaseAuthInterop (~> 1.0)
55 | - FirebaseCore (~> 6.2)
56 | - GoogleUtilities/AppDelegateSwizzler (~> 6.2)
57 | - GoogleUtilities/Environment (~> 6.2)
58 | - GTMSessionFetcher/Core (~> 1.1)
59 | - FirebaseAuthInterop (1.0.0)
60 | - FirebaseCore (6.5.0):
61 | - FirebaseCoreDiagnostics (~> 1.0)
62 | - FirebaseCoreDiagnosticsInterop (~> 1.0)
63 | - GoogleUtilities/Environment (~> 6.4)
64 | - GoogleUtilities/Logger (~> 6.4)
65 | - FirebaseCoreDiagnostics (1.1.2):
66 | - FirebaseCoreDiagnosticsInterop (~> 1.0)
67 | - GoogleDataTransportCCTSupport (~> 1.0)
68 | - GoogleUtilities/Environment (~> 6.2)
69 | - GoogleUtilities/Logger (~> 6.2)
70 | - nanopb (~> 0.3.901)
71 | - FirebaseCoreDiagnosticsInterop (1.1.0)
72 | - FirebaseDatabase (6.1.4):
73 | - FirebaseAuthInterop (~> 1.0)
74 | - FirebaseCore (~> 6.0)
75 | - leveldb-library (~> 1.22)
76 | - FirebaseInstanceID (4.2.8):
77 | - FirebaseCore (~> 6.5)
78 | - GoogleUtilities/Environment (~> 6.4)
79 | - GoogleUtilities/UserDefaults (~> 6.4)
80 | - FirebaseMessaging (4.1.10):
81 | - FirebaseAnalyticsInterop (~> 1.3)
82 | - FirebaseCore (~> 6.2)
83 | - FirebaseInstanceID (~> 4.1)
84 | - GoogleUtilities/AppDelegateSwizzler (~> 6.2)
85 | - GoogleUtilities/Environment (~> 6.2)
86 | - GoogleUtilities/Reachability (~> 6.2)
87 | - GoogleUtilities/UserDefaults (~> 6.2)
88 | - Protobuf (>= 3.9.2, ~> 3.9)
89 | - Flutter (1.0.0)
90 | - flutter_geofire (0.0.1):
91 | - Firebase/Database
92 | - Flutter
93 | - GeoFire
94 | - flutter_plugin_android_lifecycle (0.0.1):
95 | - Flutter
96 | - GeoFire (4.0.1):
97 | - Firebase/Database (~> 6.0)
98 | - geolocator (5.3.1):
99 | - Flutter
100 | - google_api_availability (2.0.4):
101 | - Flutter
102 | - google_maps_flutter (0.0.1):
103 | - Flutter
104 | - GoogleMaps
105 | - GoogleAppMeasurement (6.1.7):
106 | - GoogleUtilities/AppDelegateSwizzler (~> 6.0)
107 | - GoogleUtilities/MethodSwizzler (~> 6.0)
108 | - GoogleUtilities/Network (~> 6.0)
109 | - "GoogleUtilities/NSData+zlib (~> 6.0)"
110 | - nanopb (= 0.3.9011)
111 | - GoogleDataTransport (3.2.0)
112 | - GoogleDataTransportCCTSupport (1.2.3):
113 | - GoogleDataTransport (~> 3.2)
114 | - nanopb (~> 0.3.901)
115 | - GoogleMaps (2.7.0):
116 | - GoogleMaps/Maps (= 2.7.0)
117 | - GoogleMaps/Base (2.7.0)
118 | - GoogleMaps/Maps (2.7.0):
119 | - GoogleMaps/Base
120 | - GoogleUtilities/AppDelegateSwizzler (6.4.0):
121 | - GoogleUtilities/Environment
122 | - GoogleUtilities/Logger
123 | - GoogleUtilities/Network
124 | - GoogleUtilities/Environment (6.4.0)
125 | - GoogleUtilities/Logger (6.4.0):
126 | - GoogleUtilities/Environment
127 | - GoogleUtilities/MethodSwizzler (6.4.0):
128 | - GoogleUtilities/Logger
129 | - GoogleUtilities/Network (6.4.0):
130 | - GoogleUtilities/Logger
131 | - "GoogleUtilities/NSData+zlib"
132 | - GoogleUtilities/Reachability
133 | - "GoogleUtilities/NSData+zlib (6.4.0)"
134 | - GoogleUtilities/Reachability (6.4.0):
135 | - GoogleUtilities/Logger
136 | - GoogleUtilities/UserDefaults (6.4.0):
137 | - GoogleUtilities/Logger
138 | - GTMSessionFetcher/Core (1.3.1)
139 | - leveldb-library (1.22)
140 | - location_permissions (2.0.5):
141 | - Flutter
142 | - nanopb (0.3.9011):
143 | - nanopb/decode (= 0.3.9011)
144 | - nanopb/encode (= 0.3.9011)
145 | - nanopb/decode (0.3.9011)
146 | - nanopb/encode (0.3.9011)
147 | - path_provider (0.0.1):
148 | - Flutter
149 | - path_provider_linux (0.0.1):
150 | - Flutter
151 | - path_provider_macos (0.0.1):
152 | - Flutter
153 | - Protobuf (3.11.4)
154 | - Reachability (3.2)
155 |
156 | DEPENDENCIES:
157 | - assets_audio_player (from `.symlinks/plugins/assets_audio_player/ios`)
158 | - assets_audio_player_web (from `.symlinks/plugins/assets_audio_player_web/ios`)
159 | - connectivity (from `.symlinks/plugins/connectivity/ios`)
160 | - connectivity_macos (from `.symlinks/plugins/connectivity_macos/ios`)
161 | - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`)
162 | - firebase_auth_web (from `.symlinks/plugins/firebase_auth_web/ios`)
163 | - firebase_core (from `.symlinks/plugins/firebase_core/ios`)
164 | - firebase_core_web (from `.symlinks/plugins/firebase_core_web/ios`)
165 | - firebase_database (from `.symlinks/plugins/firebase_database/ios`)
166 | - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
167 | - Flutter (from `Flutter`)
168 | - flutter_geofire (from `.symlinks/plugins/flutter_geofire/ios`)
169 | - flutter_plugin_android_lifecycle (from `.symlinks/plugins/flutter_plugin_android_lifecycle/ios`)
170 | - geolocator (from `.symlinks/plugins/geolocator/ios`)
171 | - google_api_availability (from `.symlinks/plugins/google_api_availability/ios`)
172 | - google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`)
173 | - location_permissions (from `.symlinks/plugins/location_permissions/ios`)
174 | - path_provider (from `.symlinks/plugins/path_provider/ios`)
175 | - path_provider_linux (from `.symlinks/plugins/path_provider_linux/ios`)
176 | - path_provider_macos (from `.symlinks/plugins/path_provider_macos/ios`)
177 |
178 | SPEC REPOS:
179 | trunk:
180 | - Firebase
181 | - FirebaseAnalytics
182 | - FirebaseAnalyticsInterop
183 | - FirebaseAuth
184 | - FirebaseAuthInterop
185 | - FirebaseCore
186 | - FirebaseCoreDiagnostics
187 | - FirebaseCoreDiagnosticsInterop
188 | - FirebaseDatabase
189 | - FirebaseInstanceID
190 | - FirebaseMessaging
191 | - GeoFire
192 | - GoogleAppMeasurement
193 | - GoogleDataTransport
194 | - GoogleDataTransportCCTSupport
195 | - GoogleMaps
196 | - GoogleUtilities
197 | - GTMSessionFetcher
198 | - leveldb-library
199 | - nanopb
200 | - Protobuf
201 | - Reachability
202 |
203 | EXTERNAL SOURCES:
204 | assets_audio_player:
205 | :path: ".symlinks/plugins/assets_audio_player/ios"
206 | assets_audio_player_web:
207 | :path: ".symlinks/plugins/assets_audio_player_web/ios"
208 | connectivity:
209 | :path: ".symlinks/plugins/connectivity/ios"
210 | connectivity_macos:
211 | :path: ".symlinks/plugins/connectivity_macos/ios"
212 | firebase_auth:
213 | :path: ".symlinks/plugins/firebase_auth/ios"
214 | firebase_auth_web:
215 | :path: ".symlinks/plugins/firebase_auth_web/ios"
216 | firebase_core:
217 | :path: ".symlinks/plugins/firebase_core/ios"
218 | firebase_core_web:
219 | :path: ".symlinks/plugins/firebase_core_web/ios"
220 | firebase_database:
221 | :path: ".symlinks/plugins/firebase_database/ios"
222 | firebase_messaging:
223 | :path: ".symlinks/plugins/firebase_messaging/ios"
224 | Flutter:
225 | :path: Flutter
226 | flutter_geofire:
227 | :path: ".symlinks/plugins/flutter_geofire/ios"
228 | flutter_plugin_android_lifecycle:
229 | :path: ".symlinks/plugins/flutter_plugin_android_lifecycle/ios"
230 | geolocator:
231 | :path: ".symlinks/plugins/geolocator/ios"
232 | google_api_availability:
233 | :path: ".symlinks/plugins/google_api_availability/ios"
234 | google_maps_flutter:
235 | :path: ".symlinks/plugins/google_maps_flutter/ios"
236 | location_permissions:
237 | :path: ".symlinks/plugins/location_permissions/ios"
238 | path_provider:
239 | :path: ".symlinks/plugins/path_provider/ios"
240 | path_provider_linux:
241 | :path: ".symlinks/plugins/path_provider_linux/ios"
242 | path_provider_macos:
243 | :path: ".symlinks/plugins/path_provider_macos/ios"
244 |
245 | SPEC CHECKSUMS:
246 | assets_audio_player: 1f5d855ea3e0484357e2efb0cb703b17959e6170
247 | assets_audio_player_web: 19826380c44375761aa0b9053665c1e3fbc3b86b
248 | connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467
249 | connectivity_macos: e2e9731b6b22dda39eb1b128f6969d574460e191
250 | Firebase: 0219bb4782eb1406f1b9b0628a2e625484ce910d
251 | firebase_auth: af8784c4d8d87c36f730a305f97bfbcb24db024b
252 | firebase_auth_web: 0955c07bcc06e84af76b9d4e32e6f31518f2d7de
253 | firebase_core: 335c02abd48672b7c83c683df833d0488a72e73e
254 | firebase_core_web: d501d8b946b60c8af265428ce483b0fff5ad52d1
255 | firebase_database: 88085c38a41ad0b5c3c611ede7205831a2ece844
256 | firebase_messaging: 21344b3b3a7d9d325d63a70e3750c0c798fe1e03
257 | FirebaseAnalytics: f68b9f3f1241385129ae0a83b63627fc420c05e5
258 | FirebaseAnalyticsInterop: 3f86269c38ae41f47afeb43ebf32a001f58fcdae
259 | FirebaseAuth: 831577b184ecaba38bc886768c1c22a450cc44e3
260 | FirebaseAuthInterop: 0ffa57668be100582bb7643d4fcb7615496c41fc
261 | FirebaseCore: 632e05cc5e1199d9147122c16d92305eb04c34bd
262 | FirebaseCoreDiagnostics: 511f4f3ed7d440bb69127e8b97c2bc8befae639e
263 | FirebaseCoreDiagnosticsInterop: e9b1b023157e3a2fc6418b5cb601e79b9af7b3a0
264 | FirebaseDatabase: 0144e0706a4761f1b0e8679572eba8095ddb59be
265 | FirebaseInstanceID: ce993a3c3670a8f5d47ce371ac5d143c560608c5
266 | FirebaseMessaging: 089b7a4991425783384acc8bcefcd78c0af913bd
267 | Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
268 | flutter_geofire: 95912394d959280c7c38f43e4e3a69e1184a273a
269 | flutter_plugin_android_lifecycle: dc0b544e129eebb77a6bfb1239d4d1c673a60a35
270 | GeoFire: 67b5276c561434b4e4c7ea567c2c4d64e711339c
271 | geolocator: 460cc8e850b616f8c0e90944c86517d91ccbb686
272 | google_api_availability: 15fa42a8cd83c0a6738507ffe6e87096f12abcb8
273 | google_maps_flutter: df4e7de95264aa0a2f11aac0fc7e313acb8ffc7e
274 | GoogleAppMeasurement: db118eb61a97dd8c4f7014e368d3c335cbbcf80a
275 | GoogleDataTransport: 8e9b210c97d55fbff306cc5468ff91b9cb32dcf5
276 | GoogleDataTransportCCTSupport: 202d7cdf9c4a7d81a2bb7f7e7e1ba6faa421b1f2
277 | GoogleMaps: f79af95cb24d869457b1f961c93d3ce8b2f3b848
278 | GoogleUtilities: 29bd0d8f850efbd28cff6d99e8b7da1f8d236bcf
279 | GTMSessionFetcher: cea130bbfe5a7edc8d06d3f0d17288c32ffe9925
280 | leveldb-library: 55d93ee664b4007aac644a782d11da33fba316f7
281 | location_permissions: 4a49d4e5bec5b653643e551ab77963cc99bb0e4a
282 | nanopb: 18003b5e52dab79db540fe93fe9579f399bd1ccd
283 | path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
284 | path_provider_linux: 4d630dc393e1f20364f3e3b4a2ff41d9674a84e4
285 | path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0
286 | Protobuf: 176220c526ad8bd09ab1fb40a978eac3fef665f7
287 | Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
288 |
289 | PODFILE CHECKSUM: 1fb4b116634f417c6864a5a3d0523938134d1ddc
290 |
291 | COCOAPODS: 1.8.4
292 |
--------------------------------------------------------------------------------
/ios/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | //
2 | // Use this file to import your target's public headers that you would like to expose to Swift.
3 | //
4 |
5 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 51;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
12 | 57001ED824808861001EA583 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 57001ED724808861001EA583 /* GoogleService-Info.plist */; };
13 | 5724C9B22483716200436E02 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5724C9B12483716200436E02 /* File.swift */; };
14 | 62FDC58EB93830DA177F1BE8 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FE5634FD4645C8EE69DC4F6 /* Pods_Runner.framework */; };
15 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
16 | 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
17 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
18 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
19 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
20 | /* End PBXBuildFile section */
21 |
22 | /* Begin PBXCopyFilesBuildPhase section */
23 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
24 | isa = PBXCopyFilesBuildPhase;
25 | buildActionMask = 2147483647;
26 | dstPath = "";
27 | dstSubfolderSpec = 10;
28 | files = (
29 | );
30 | name = "Embed Frameworks";
31 | runOnlyForDeploymentPostprocessing = 0;
32 | };
33 | /* End PBXCopyFilesBuildPhase section */
34 |
35 | /* Begin PBXFileReference section */
36 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
37 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
38 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
39 | 57001ED724808861001EA583 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; };
40 | 571ABCF8248A32A900F3FE65 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; };
41 | 5724C9B02483716100436E02 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
42 | 5724C9B12483716200436E02 /* File.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = ""; };
43 | 5E19991FDCA9044D2FE7C5CC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
44 | 6FE5634FD4645C8EE69DC4F6 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
45 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
46 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
47 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
48 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
49 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
50 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
51 | 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
52 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
53 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
54 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
55 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
56 | BF90CEFB992958DFE427AEF8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
57 | E717FF8BB9D2C59E101A57BD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
58 | /* End PBXFileReference section */
59 |
60 | /* Begin PBXFrameworksBuildPhase section */
61 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
62 | isa = PBXFrameworksBuildPhase;
63 | buildActionMask = 2147483647;
64 | files = (
65 | 62FDC58EB93830DA177F1BE8 /* Pods_Runner.framework in Frameworks */,
66 | );
67 | runOnlyForDeploymentPostprocessing = 0;
68 | };
69 | /* End PBXFrameworksBuildPhase section */
70 |
71 | /* Begin PBXGroup section */
72 | 22DB0B09CC9EA3EB741855B5 /* Pods */ = {
73 | isa = PBXGroup;
74 | children = (
75 | E717FF8BB9D2C59E101A57BD /* Pods-Runner.debug.xcconfig */,
76 | BF90CEFB992958DFE427AEF8 /* Pods-Runner.release.xcconfig */,
77 | 5E19991FDCA9044D2FE7C5CC /* Pods-Runner.profile.xcconfig */,
78 | );
79 | path = Pods;
80 | sourceTree = "";
81 | };
82 | 9740EEB11CF90186004384FC /* Flutter */ = {
83 | isa = PBXGroup;
84 | children = (
85 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
86 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
87 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
88 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
89 | );
90 | name = Flutter;
91 | sourceTree = "";
92 | };
93 | 97C146E51CF9000F007C117D = {
94 | isa = PBXGroup;
95 | children = (
96 | 5724C9B12483716200436E02 /* File.swift */,
97 | 57001ED724808861001EA583 /* GoogleService-Info.plist */,
98 | 9740EEB11CF90186004384FC /* Flutter */,
99 | 97C146F01CF9000F007C117D /* Runner */,
100 | 97C146EF1CF9000F007C117D /* Products */,
101 | 22DB0B09CC9EA3EB741855B5 /* Pods */,
102 | 9E9607F3A9CFD741DD4F009B /* Frameworks */,
103 | 5724C9B02483716100436E02 /* Runner-Bridging-Header.h */,
104 | );
105 | sourceTree = "";
106 | };
107 | 97C146EF1CF9000F007C117D /* Products */ = {
108 | isa = PBXGroup;
109 | children = (
110 | 97C146EE1CF9000F007C117D /* Runner.app */,
111 | );
112 | name = Products;
113 | sourceTree = "";
114 | };
115 | 97C146F01CF9000F007C117D /* Runner */ = {
116 | isa = PBXGroup;
117 | children = (
118 | 571ABCF8248A32A900F3FE65 /* Runner.entitlements */,
119 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,
120 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,
121 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
122 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
123 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
124 | 97C147021CF9000F007C117D /* Info.plist */,
125 | 97C146F11CF9000F007C117D /* Supporting Files */,
126 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
127 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
128 | );
129 | path = Runner;
130 | sourceTree = "";
131 | };
132 | 97C146F11CF9000F007C117D /* Supporting Files */ = {
133 | isa = PBXGroup;
134 | children = (
135 | 97C146F21CF9000F007C117D /* main.m */,
136 | );
137 | name = "Supporting Files";
138 | sourceTree = "";
139 | };
140 | 9E9607F3A9CFD741DD4F009B /* Frameworks */ = {
141 | isa = PBXGroup;
142 | children = (
143 | 6FE5634FD4645C8EE69DC4F6 /* Pods_Runner.framework */,
144 | );
145 | name = Frameworks;
146 | sourceTree = "";
147 | };
148 | /* End PBXGroup section */
149 |
150 | /* Begin PBXNativeTarget section */
151 | 97C146ED1CF9000F007C117D /* Runner */ = {
152 | isa = PBXNativeTarget;
153 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
154 | buildPhases = (
155 | 41D9B9C9B0EFE4A2EBBBF891 /* [CP] Check Pods Manifest.lock */,
156 | 9740EEB61CF901F6004384FC /* Run Script */,
157 | 97C146EA1CF9000F007C117D /* Sources */,
158 | 97C146EB1CF9000F007C117D /* Frameworks */,
159 | 97C146EC1CF9000F007C117D /* Resources */,
160 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
161 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
162 | 6764AE09B8EA19D50E1D212E /* [CP] Embed Pods Frameworks */,
163 | 5A8FC8439F74E4DDFA90F4B8 /* [CP] Copy Pods Resources */,
164 | );
165 | buildRules = (
166 | );
167 | dependencies = (
168 | );
169 | name = Runner;
170 | productName = Runner;
171 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
172 | productType = "com.apple.product-type.application";
173 | };
174 | /* End PBXNativeTarget section */
175 |
176 | /* Begin PBXProject section */
177 | 97C146E61CF9000F007C117D /* Project object */ = {
178 | isa = PBXProject;
179 | attributes = {
180 | LastUpgradeCheck = 1020;
181 | ORGANIZATIONNAME = "";
182 | TargetAttributes = {
183 | 97C146ED1CF9000F007C117D = {
184 | CreatedOnToolsVersion = 7.3.1;
185 | LastSwiftMigration = 1140;
186 | };
187 | };
188 | };
189 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
190 | compatibilityVersion = "Xcode 9.3";
191 | developmentRegion = en;
192 | hasScannedForEncodings = 0;
193 | knownRegions = (
194 | en,
195 | Base,
196 | );
197 | mainGroup = 97C146E51CF9000F007C117D;
198 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
199 | projectDirPath = "";
200 | projectRoot = "";
201 | targets = (
202 | 97C146ED1CF9000F007C117D /* Runner */,
203 | );
204 | };
205 | /* End PBXProject section */
206 |
207 | /* Begin PBXResourcesBuildPhase section */
208 | 97C146EC1CF9000F007C117D /* Resources */ = {
209 | isa = PBXResourcesBuildPhase;
210 | buildActionMask = 2147483647;
211 | files = (
212 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
213 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
214 | 57001ED824808861001EA583 /* GoogleService-Info.plist in Resources */,
215 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
216 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
217 | );
218 | runOnlyForDeploymentPostprocessing = 0;
219 | };
220 | /* End PBXResourcesBuildPhase section */
221 |
222 | /* Begin PBXShellScriptBuildPhase section */
223 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
224 | isa = PBXShellScriptBuildPhase;
225 | buildActionMask = 2147483647;
226 | files = (
227 | );
228 | inputPaths = (
229 | );
230 | name = "Thin Binary";
231 | outputPaths = (
232 | );
233 | runOnlyForDeploymentPostprocessing = 0;
234 | shellPath = /bin/sh;
235 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
236 | };
237 | 41D9B9C9B0EFE4A2EBBBF891 /* [CP] Check Pods Manifest.lock */ = {
238 | isa = PBXShellScriptBuildPhase;
239 | buildActionMask = 2147483647;
240 | files = (
241 | );
242 | inputFileListPaths = (
243 | );
244 | inputPaths = (
245 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
246 | "${PODS_ROOT}/Manifest.lock",
247 | );
248 | name = "[CP] Check Pods Manifest.lock";
249 | outputFileListPaths = (
250 | );
251 | outputPaths = (
252 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
253 | );
254 | runOnlyForDeploymentPostprocessing = 0;
255 | shellPath = /bin/sh;
256 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
257 | showEnvVarsInLog = 0;
258 | };
259 | 5A8FC8439F74E4DDFA90F4B8 /* [CP] Copy Pods Resources */ = {
260 | isa = PBXShellScriptBuildPhase;
261 | buildActionMask = 2147483647;
262 | files = (
263 | );
264 | inputFileListPaths = (
265 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
266 | );
267 | name = "[CP] Copy Pods Resources";
268 | outputFileListPaths = (
269 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
270 | );
271 | runOnlyForDeploymentPostprocessing = 0;
272 | shellPath = /bin/sh;
273 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
274 | showEnvVarsInLog = 0;
275 | };
276 | 6764AE09B8EA19D50E1D212E /* [CP] Embed Pods Frameworks */ = {
277 | isa = PBXShellScriptBuildPhase;
278 | buildActionMask = 2147483647;
279 | files = (
280 | );
281 | inputFileListPaths = (
282 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
283 | );
284 | name = "[CP] Embed Pods Frameworks";
285 | outputFileListPaths = (
286 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
287 | );
288 | runOnlyForDeploymentPostprocessing = 0;
289 | shellPath = /bin/sh;
290 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
291 | showEnvVarsInLog = 0;
292 | };
293 | 9740EEB61CF901F6004384FC /* Run Script */ = {
294 | isa = PBXShellScriptBuildPhase;
295 | buildActionMask = 2147483647;
296 | files = (
297 | );
298 | inputPaths = (
299 | );
300 | name = "Run Script";
301 | outputPaths = (
302 | );
303 | runOnlyForDeploymentPostprocessing = 0;
304 | shellPath = /bin/sh;
305 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
306 | };
307 | /* End PBXShellScriptBuildPhase section */
308 |
309 | /* Begin PBXSourcesBuildPhase section */
310 | 97C146EA1CF9000F007C117D /* Sources */ = {
311 | isa = PBXSourcesBuildPhase;
312 | buildActionMask = 2147483647;
313 | files = (
314 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */,
315 | 5724C9B22483716200436E02 /* File.swift in Sources */,
316 | 97C146F31CF9000F007C117D /* main.m in Sources */,
317 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
318 | );
319 | runOnlyForDeploymentPostprocessing = 0;
320 | };
321 | /* End PBXSourcesBuildPhase section */
322 |
323 | /* Begin PBXVariantGroup section */
324 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
325 | isa = PBXVariantGroup;
326 | children = (
327 | 97C146FB1CF9000F007C117D /* Base */,
328 | );
329 | name = Main.storyboard;
330 | sourceTree = "";
331 | };
332 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
333 | isa = PBXVariantGroup;
334 | children = (
335 | 97C147001CF9000F007C117D /* Base */,
336 | );
337 | name = LaunchScreen.storyboard;
338 | sourceTree = "";
339 | };
340 | /* End PBXVariantGroup section */
341 |
342 | /* Begin XCBuildConfiguration section */
343 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
344 | isa = XCBuildConfiguration;
345 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
346 | buildSettings = {
347 | ALWAYS_SEARCH_USER_PATHS = NO;
348 | CLANG_ANALYZER_NONNULL = YES;
349 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
350 | CLANG_CXX_LIBRARY = "libc++";
351 | CLANG_ENABLE_MODULES = YES;
352 | CLANG_ENABLE_OBJC_ARC = YES;
353 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
354 | CLANG_WARN_BOOL_CONVERSION = YES;
355 | CLANG_WARN_COMMA = YES;
356 | CLANG_WARN_CONSTANT_CONVERSION = YES;
357 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
358 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
359 | CLANG_WARN_EMPTY_BODY = YES;
360 | CLANG_WARN_ENUM_CONVERSION = YES;
361 | CLANG_WARN_INFINITE_RECURSION = YES;
362 | CLANG_WARN_INT_CONVERSION = YES;
363 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
364 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
365 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
366 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
367 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
368 | CLANG_WARN_STRICT_PROTOTYPES = YES;
369 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
370 | CLANG_WARN_UNREACHABLE_CODE = YES;
371 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
372 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
373 | COPY_PHASE_STRIP = NO;
374 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
375 | ENABLE_NS_ASSERTIONS = NO;
376 | ENABLE_STRICT_OBJC_MSGSEND = YES;
377 | GCC_C_LANGUAGE_STANDARD = gnu99;
378 | GCC_NO_COMMON_BLOCKS = YES;
379 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
380 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
381 | GCC_WARN_UNDECLARED_SELECTOR = YES;
382 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
383 | GCC_WARN_UNUSED_FUNCTION = YES;
384 | GCC_WARN_UNUSED_VARIABLE = YES;
385 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
386 | MTL_ENABLE_DEBUG_INFO = NO;
387 | SDKROOT = iphoneos;
388 | SUPPORTED_PLATFORMS = iphoneos;
389 | TARGETED_DEVICE_FAMILY = "1,2";
390 | VALIDATE_PRODUCT = YES;
391 | };
392 | name = Profile;
393 | };
394 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
395 | isa = XCBuildConfiguration;
396 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
397 | buildSettings = {
398 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
399 | CLANG_ENABLE_MODULES = YES;
400 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
401 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
402 | DEVELOPMENT_TEAM = TNN6CLVZL4;
403 | ENABLE_BITCODE = NO;
404 | FRAMEWORK_SEARCH_PATHS = (
405 | "$(inherited)",
406 | "$(PROJECT_DIR)/Flutter",
407 | );
408 | INFOPLIST_FILE = Runner/Info.plist;
409 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
410 | LD_RUNPATH_SEARCH_PATHS = (
411 | "$(inherited)",
412 | "@executable_path/Frameworks",
413 | );
414 | LIBRARY_SEARCH_PATHS = (
415 | "$(inherited)",
416 | "$(PROJECT_DIR)/Flutter",
417 | );
418 | PRODUCT_BUNDLE_IDENTIFIER = com.ufinix.cabdriver;
419 | PRODUCT_NAME = "$(TARGET_NAME)";
420 | SWIFT_OBJC_BRIDGING_HEADER = "Runner-Bridging-Header.h";
421 | SWIFT_VERSION = 4.2;
422 | TARGETED_DEVICE_FAMILY = 1;
423 | VERSIONING_SYSTEM = "apple-generic";
424 | };
425 | name = Profile;
426 | };
427 | 97C147031CF9000F007C117D /* Debug */ = {
428 | isa = XCBuildConfiguration;
429 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
430 | buildSettings = {
431 | ALWAYS_SEARCH_USER_PATHS = NO;
432 | CLANG_ANALYZER_NONNULL = YES;
433 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
434 | CLANG_CXX_LIBRARY = "libc++";
435 | CLANG_ENABLE_MODULES = YES;
436 | CLANG_ENABLE_OBJC_ARC = YES;
437 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
438 | CLANG_WARN_BOOL_CONVERSION = YES;
439 | CLANG_WARN_COMMA = YES;
440 | CLANG_WARN_CONSTANT_CONVERSION = YES;
441 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
442 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
443 | CLANG_WARN_EMPTY_BODY = YES;
444 | CLANG_WARN_ENUM_CONVERSION = YES;
445 | CLANG_WARN_INFINITE_RECURSION = YES;
446 | CLANG_WARN_INT_CONVERSION = YES;
447 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
448 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
449 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
450 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
451 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
452 | CLANG_WARN_STRICT_PROTOTYPES = YES;
453 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
454 | CLANG_WARN_UNREACHABLE_CODE = YES;
455 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
456 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
457 | COPY_PHASE_STRIP = NO;
458 | DEBUG_INFORMATION_FORMAT = dwarf;
459 | ENABLE_STRICT_OBJC_MSGSEND = YES;
460 | ENABLE_TESTABILITY = YES;
461 | GCC_C_LANGUAGE_STANDARD = gnu99;
462 | GCC_DYNAMIC_NO_PIC = NO;
463 | GCC_NO_COMMON_BLOCKS = YES;
464 | GCC_OPTIMIZATION_LEVEL = 0;
465 | GCC_PREPROCESSOR_DEFINITIONS = (
466 | "DEBUG=1",
467 | "$(inherited)",
468 | );
469 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
470 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
471 | GCC_WARN_UNDECLARED_SELECTOR = YES;
472 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
473 | GCC_WARN_UNUSED_FUNCTION = YES;
474 | GCC_WARN_UNUSED_VARIABLE = YES;
475 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
476 | MTL_ENABLE_DEBUG_INFO = YES;
477 | ONLY_ACTIVE_ARCH = YES;
478 | SDKROOT = iphoneos;
479 | TARGETED_DEVICE_FAMILY = "1,2";
480 | };
481 | name = Debug;
482 | };
483 | 97C147041CF9000F007C117D /* Release */ = {
484 | isa = XCBuildConfiguration;
485 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
486 | buildSettings = {
487 | ALWAYS_SEARCH_USER_PATHS = NO;
488 | CLANG_ANALYZER_NONNULL = YES;
489 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
490 | CLANG_CXX_LIBRARY = "libc++";
491 | CLANG_ENABLE_MODULES = YES;
492 | CLANG_ENABLE_OBJC_ARC = YES;
493 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
494 | CLANG_WARN_BOOL_CONVERSION = YES;
495 | CLANG_WARN_COMMA = YES;
496 | CLANG_WARN_CONSTANT_CONVERSION = YES;
497 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
498 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
499 | CLANG_WARN_EMPTY_BODY = YES;
500 | CLANG_WARN_ENUM_CONVERSION = YES;
501 | CLANG_WARN_INFINITE_RECURSION = YES;
502 | CLANG_WARN_INT_CONVERSION = YES;
503 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
504 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
505 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
506 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
507 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
508 | CLANG_WARN_STRICT_PROTOTYPES = YES;
509 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
510 | CLANG_WARN_UNREACHABLE_CODE = YES;
511 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
512 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
513 | COPY_PHASE_STRIP = NO;
514 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
515 | ENABLE_NS_ASSERTIONS = NO;
516 | ENABLE_STRICT_OBJC_MSGSEND = YES;
517 | GCC_C_LANGUAGE_STANDARD = gnu99;
518 | GCC_NO_COMMON_BLOCKS = YES;
519 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
520 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
521 | GCC_WARN_UNDECLARED_SELECTOR = YES;
522 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
523 | GCC_WARN_UNUSED_FUNCTION = YES;
524 | GCC_WARN_UNUSED_VARIABLE = YES;
525 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
526 | MTL_ENABLE_DEBUG_INFO = NO;
527 | SDKROOT = iphoneos;
528 | SUPPORTED_PLATFORMS = iphoneos;
529 | TARGETED_DEVICE_FAMILY = "1,2";
530 | VALIDATE_PRODUCT = YES;
531 | };
532 | name = Release;
533 | };
534 | 97C147061CF9000F007C117D /* Debug */ = {
535 | isa = XCBuildConfiguration;
536 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
537 | buildSettings = {
538 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
539 | CLANG_ENABLE_MODULES = YES;
540 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
541 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
542 | DEVELOPMENT_TEAM = TNN6CLVZL4;
543 | ENABLE_BITCODE = NO;
544 | FRAMEWORK_SEARCH_PATHS = (
545 | "$(inherited)",
546 | "$(PROJECT_DIR)/Flutter",
547 | );
548 | INFOPLIST_FILE = Runner/Info.plist;
549 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
550 | LD_RUNPATH_SEARCH_PATHS = (
551 | "$(inherited)",
552 | "@executable_path/Frameworks",
553 | );
554 | LIBRARY_SEARCH_PATHS = (
555 | "$(inherited)",
556 | "$(PROJECT_DIR)/Flutter",
557 | );
558 | PRODUCT_BUNDLE_IDENTIFIER = com.ufinix.cabdriver;
559 | PRODUCT_NAME = "$(TARGET_NAME)";
560 | SWIFT_OBJC_BRIDGING_HEADER = "Runner-Bridging-Header.h";
561 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
562 | SWIFT_VERSION = 4.2;
563 | TARGETED_DEVICE_FAMILY = 1;
564 | VERSIONING_SYSTEM = "apple-generic";
565 | };
566 | name = Debug;
567 | };
568 | 97C147071CF9000F007C117D /* Release */ = {
569 | isa = XCBuildConfiguration;
570 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
571 | buildSettings = {
572 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
573 | CLANG_ENABLE_MODULES = YES;
574 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
575 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
576 | DEVELOPMENT_TEAM = TNN6CLVZL4;
577 | ENABLE_BITCODE = NO;
578 | FRAMEWORK_SEARCH_PATHS = (
579 | "$(inherited)",
580 | "$(PROJECT_DIR)/Flutter",
581 | );
582 | INFOPLIST_FILE = Runner/Info.plist;
583 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
584 | LD_RUNPATH_SEARCH_PATHS = (
585 | "$(inherited)",
586 | "@executable_path/Frameworks",
587 | );
588 | LIBRARY_SEARCH_PATHS = (
589 | "$(inherited)",
590 | "$(PROJECT_DIR)/Flutter",
591 | );
592 | PRODUCT_BUNDLE_IDENTIFIER = com.ufinix.cabdriver;
593 | PRODUCT_NAME = "$(TARGET_NAME)";
594 | SWIFT_OBJC_BRIDGING_HEADER = "Runner-Bridging-Header.h";
595 | SWIFT_VERSION = 4.2;
596 | TARGETED_DEVICE_FAMILY = 1;
597 | VERSIONING_SYSTEM = "apple-generic";
598 | };
599 | name = Release;
600 | };
601 | /* End XCBuildConfiguration section */
602 |
603 | /* Begin XCConfigurationList section */
604 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
605 | isa = XCConfigurationList;
606 | buildConfigurations = (
607 | 97C147031CF9000F007C117D /* Debug */,
608 | 97C147041CF9000F007C117D /* Release */,
609 | 249021D3217E4FDB00AE95B9 /* Profile */,
610 | );
611 | defaultConfigurationIsVisible = 0;
612 | defaultConfigurationName = Release;
613 | };
614 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
615 | isa = XCConfigurationList;
616 | buildConfigurations = (
617 | 97C147061CF9000F007C117D /* Debug */,
618 | 97C147071CF9000F007C117D /* Release */,
619 | 249021D4217E4FDB00AE95B9 /* Profile */,
620 | );
621 | defaultConfigurationIsVisible = 0;
622 | defaultConfigurationName = Release;
623 | };
624 | /* End XCConfigurationList section */
625 | };
626 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
627 | }
628 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.h:
--------------------------------------------------------------------------------
1 | #import
2 | #import
3 |
4 | @interface AppDelegate : FlutterAppDelegate
5 |
6 | @end
7 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.m:
--------------------------------------------------------------------------------
1 | #import "AppDelegate.h"
2 | #import "GeneratedPluginRegistrant.h"
3 | #import "GoogleMaps/GoogleMaps.h"
4 |
5 |
6 | @implementation AppDelegate
7 |
8 | - (BOOL)application:(UIApplication *)application
9 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
10 | [GMSServices provideAPIKey:@"AIzaSyCGDOgE33dc-6UHtIAptXSAVZRogFvV8Hs"];
11 | [GeneratedPluginRegistrant registerWithRegistry:self];
12 |
13 | if (@available(iOS 10.0, *)) {
14 | [UNUserNotificationCenter currentNotificationCenter].delegate = (id) self;
15 | }
16 | // Override point for customization after application launch.
17 | return [super application:application didFinishLaunchingWithOptions:launchOptions];
18 | }
19 |
20 | @end
21 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/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/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/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/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/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/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 |
--------------------------------------------------------------------------------
/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/GoogleService-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CLIENT_ID
6 | 169450788828-r1vig30pmbl9pn9j1lp5lj8goq1hgc6l.apps.googleusercontent.com
7 | REVERSED_CLIENT_ID
8 | com.googleusercontent.apps.169450788828-r1vig30pmbl9pn9j1lp5lj8goq1hgc6l
9 | API_KEY
10 | AIzaSyBMwYlDSrQ6kFvf9esqGA6Vk4odpInJl6A
11 | GCM_SENDER_ID
12 | 169450788828
13 | PLIST_VERSION
14 | 1
15 | BUNDLE_ID
16 | com.ufinix.cabdriver
17 | PROJECT_ID
18 | geetaxi-9c60a
19 | STORAGE_BUCKET
20 | geetaxi-9c60a.appspot.com
21 | IS_ADS_ENABLED
22 |
23 | IS_ANALYTICS_ENABLED
24 |
25 | IS_APPINVITE_ENABLED
26 |
27 | IS_GCM_ENABLED
28 |
29 | IS_SIGNIN_ENABLED
30 |
31 | GOOGLE_APP_ID
32 | 1:169450788828:ios:565f2d4b4623a7dbf9a119
33 | DATABASE_URL
34 | https://geetaxi-9c60a.firebaseio.com
35 |
36 |
--------------------------------------------------------------------------------
/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 | cabdriver
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | FirebaseAppDelegateProxyEnabled
24 |
25 | LSRequiresIPhoneOS
26 |
27 | NSLocationAlwaysAndWhenInUseUsageDescription
28 | This app needs access to location when open and in the background.
29 | NSLocationAlwaysUsageDescription
30 | This app needs access to location when in the background.
31 | NSLocationWhenInUseUsageDescription
32 | This app needs access to location when open.
33 | UIBackgroundModes
34 |
35 | fetch
36 | location
37 | remote-notification
38 |
39 | UILaunchStoryboardName
40 | LaunchScreen
41 | UIMainStoryboardFile
42 | Main
43 | UISupportedInterfaceOrientations
44 |
45 | UIInterfaceOrientationPortrait
46 | UIInterfaceOrientationLandscapeLeft
47 | UIInterfaceOrientationLandscapeRight
48 |
49 | UISupportedInterfaceOrientations~ipad
50 |
51 | UIInterfaceOrientationPortrait
52 | UIInterfaceOrientationPortraitUpsideDown
53 | UIInterfaceOrientationLandscapeLeft
54 | UIInterfaceOrientationLandscapeRight
55 |
56 | UIViewControllerBasedStatusBarAppearance
57 |
58 | io.flutter.embedded_views_preview
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/ios/Runner/Runner.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | aps-environment
6 | development
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/main.m:
--------------------------------------------------------------------------------
1 | #import
2 | #import
3 | #import "AppDelegate.h"
4 |
5 | int main(int argc, char* argv[]) {
6 | @autoreleasepool {
7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/lib/brand_colors.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class BrandColors{
4 |
5 | static const Color colorIcon = Color(0xFF666666);
6 | static const Color colorPrimary = Color(0xFF0e1526);
7 | static const Color colorPrimaryDark = Color(0xFF1c3aa9);
8 | static const Color colorAccent = Color(0xFF21ba45);
9 | static const Color colorAccent1 = Color(0xFFe3fded);
10 |
11 | static const Color colorBackground = Color(0xFFFBFAFF);
12 |
13 | static const Color colorPink = Color(0xFFE66C75);
14 | static const Color colorOrange = Color(0xFFd16608);
15 | static const Color colorBlue = Color(0xFF2254A3);
16 | static const Color colorAccentPurple = Color(0xFF4f5cd1);
17 |
18 |
19 |
20 | static const Color colorText = Color(0xFF383635);
21 | static const Color colorTextLight = Color(0xFF918D8D);
22 | static const Color colorTextSemiLight = Color(0xFF737373);
23 | static const Color colorTextDark = Color(0xFF292828);
24 |
25 | static const Color colorGreen = Color(0xFF40cf89);
26 | static const Color colorLightGray = Color(0xFFe2e2e2);
27 | static const Color colorLightGrayFair = Color(0xFFe1e5e8);
28 | static const Color colorDimText = Color(0xFFadadad);
29 |
30 |
31 |
32 | }
--------------------------------------------------------------------------------
/lib/datamodels/directiondetails.dart:
--------------------------------------------------------------------------------
1 | class DirectionDetails{
2 | String distanceText;
3 | String durationText;
4 | int distanceValue;
5 | int durationValue;
6 | String encodedPoints;
7 |
8 | DirectionDetails({
9 | this.distanceText,
10 | this.distanceValue,
11 | this.durationText,
12 | this.durationValue,
13 | this.encodedPoints,
14 | });
15 |
16 | }
--------------------------------------------------------------------------------
/lib/datamodels/driver.dart:
--------------------------------------------------------------------------------
1 | import 'package:firebase_database/firebase_database.dart';
2 |
3 | class Driver{
4 | String fullName;
5 | String email;
6 | String phone;
7 | String id;
8 | String carModel;
9 | String carColor;
10 | String vehicleNumber;
11 |
12 | Driver({
13 | this.fullName,
14 | this.email,
15 | this.phone,
16 | this.id,
17 | this.carModel,
18 | this.carColor,
19 | this.vehicleNumber,
20 | });
21 |
22 | Driver.fromSnapshot(DataSnapshot snapshot){
23 | id = snapshot.key;
24 | phone = snapshot.value['phone'];
25 | email = snapshot.value['email'];
26 | fullName = snapshot.value['fullname'];
27 | carModel = snapshot.value['vehicle_details']['car_model'];
28 | carColor = snapshot.value['vehicle_details']['car_color'];
29 | vehicleNumber = snapshot.value['vehicle_details']['vehicle_number'];
30 | }
31 |
32 | }
--------------------------------------------------------------------------------
/lib/datamodels/history.dart:
--------------------------------------------------------------------------------
1 | import 'package:firebase_database/firebase_database.dart';
2 |
3 | class History{
4 | String pickup;
5 | String destination;
6 | String fares;
7 | String status;
8 | String createdAt;
9 | String paymentMethod;
10 |
11 | History({
12 | this.pickup,
13 | this.destination,
14 | this.fares,
15 | this.status,
16 | this.createdAt,
17 | this.paymentMethod,
18 | });
19 |
20 | History.fromSnapshot(DataSnapshot snapshot){
21 | pickup = snapshot.value['pickup_address'];
22 | destination = snapshot.value['destination_address'];
23 | fares = snapshot.value['fares'].toString();
24 | createdAt = snapshot.value['created_at'];
25 | status = snapshot.value['status'];
26 | paymentMethod = snapshot.value['payment_method'];
27 | }
28 |
29 | }
--------------------------------------------------------------------------------
/lib/datamodels/tripdetails.dart:
--------------------------------------------------------------------------------
1 | import 'package:google_maps_flutter/google_maps_flutter.dart';
2 |
3 | class TripDetails {
4 | String destinationAddress;
5 | String pickupAddress;
6 | LatLng pickup;
7 | LatLng destination;
8 | String rideID;
9 | String paymentMethod;
10 | String riderName;
11 | String riderPhone;
12 |
13 | TripDetails({
14 | this.pickupAddress,
15 | this.rideID,
16 | this.destinationAddress,
17 | this.destination,
18 | this.pickup,
19 | this.paymentMethod,
20 | this.riderName,
21 | this.riderPhone
22 | });
23 |
24 | }
--------------------------------------------------------------------------------
/lib/dataprovider.dart:
--------------------------------------------------------------------------------
1 |
2 | import 'package:cabdriver/datamodels/history.dart';
3 | import 'package:flutter/material.dart';
4 |
5 | class AppData extends ChangeNotifier{
6 |
7 | String earnings = '0';
8 | int tripCount = 0;
9 | List tripHistoryKeys = [];
10 | List tripHistory = [];
11 |
12 | void updateEarnings(String newEarnings){
13 | earnings = newEarnings;
14 | notifyListeners();
15 | }
16 |
17 | void updateTripCount(int newTripCount){
18 | tripCount = newTripCount;
19 | notifyListeners();
20 | }
21 |
22 | void updateTripKeys(List newKeys){
23 | tripHistoryKeys = newKeys;
24 | notifyListeners();
25 | }
26 |
27 | void updateTripHistory(History historyItem){
28 | tripHistory.add(historyItem);
29 | notifyListeners();
30 | }
31 | }
--------------------------------------------------------------------------------
/lib/globalvariabels.dart:
--------------------------------------------------------------------------------
1 |
2 | import 'dart:async';
3 |
4 | import 'package:assets_audio_player/assets_audio_player.dart';
5 | import 'package:cabdriver/datamodels/driver.dart';
6 | import 'package:firebase_auth/firebase_auth.dart';
7 | import 'package:firebase_database/firebase_database.dart';
8 | import 'package:geolocator/geolocator.dart';
9 | import 'package:google_maps_flutter/google_maps_flutter.dart';
10 |
11 | FirebaseUser currentFirebaseUser;
12 |
13 | final CameraPosition googlePlex = CameraPosition(
14 | target: LatLng(37.42796133580664, -122.085749655962),
15 | zoom: 14.4746,
16 | );
17 |
18 | String mapKey = 'AIzaSyCGDOgE33dc-6UHtIAptXSAVZRogFvV8Hs';
19 |
20 |
21 | StreamSubscription homeTabPositionStream;
22 |
23 | StreamSubscription ridePositionStream;
24 |
25 | final assetsAudioPlayer = AssetsAudioPlayer();
26 |
27 | Position currentPosition;
28 |
29 | DatabaseReference rideRef;
30 |
31 | Driver currentDriverInfo;
32 |
33 |
--------------------------------------------------------------------------------
/lib/helpers/helpermethods.dart:
--------------------------------------------------------------------------------
1 |
2 | import 'dart:math';
3 |
4 | import 'package:cabdriver/datamodels/directiondetails.dart';
5 | import 'package:cabdriver/datamodels/history.dart';
6 | import 'package:cabdriver/dataprovider.dart';
7 | import 'package:cabdriver/globalvariabels.dart';
8 | import 'package:cabdriver/helpers/requesthelper.dart';
9 | import 'package:cabdriver/widgets/ProgressDialog.dart';
10 | import 'package:connectivity/connectivity.dart';
11 | import 'package:firebase_auth/firebase_auth.dart';
12 | import 'package:firebase_database/firebase_database.dart';
13 | import 'package:flutter/material.dart';
14 | import 'package:flutter_geofire/flutter_geofire.dart';
15 | import 'package:geolocator/geolocator.dart';
16 | import 'package:google_maps_flutter/google_maps_flutter.dart';
17 | import 'package:http/http.dart';
18 | import 'package:intl/intl.dart';
19 | import 'package:provider/provider.dart';
20 |
21 |
22 | class HelperMethods{
23 |
24 |
25 | static Future getDirectionDetails(LatLng startPosition, LatLng endPosition) async {
26 |
27 | String url = 'https://maps.googleapis.com/maps/api/directions/json?origin=${startPosition.latitude},${startPosition.longitude}&destination=${endPosition.latitude},${endPosition.longitude}&mode=driving&key=$mapKey';
28 |
29 | var response = await RequestHelper.getRequest(url);
30 |
31 | if(response == 'failed'){
32 | return null;
33 | }
34 |
35 | DirectionDetails directionDetails = DirectionDetails();
36 |
37 | directionDetails.durationText = response['routes'][0]['legs'][0]['duration']['text'];
38 | directionDetails.durationValue = response['routes'][0]['legs'][0]['duration']['value'];
39 |
40 | directionDetails.distanceText = response['routes'][0]['legs'][0]['distance']['text'];
41 | directionDetails.distanceValue = response['routes'][0]['legs'][0]['distance']['value'];
42 |
43 | directionDetails.encodedPoints = response['routes'][0]['overview_polyline']['points'];
44 |
45 | return directionDetails;
46 | }
47 |
48 | static int estimateFares (DirectionDetails details, int durationValue){
49 | // per km = $0.3,
50 | // per minute = $0.2,
51 | // base fare = $3,
52 |
53 | double baseFare = 3;
54 | double distanceFare = (details.distanceValue/1000) * 0.3;
55 | double timeFare = (durationValue / 60) * 0.2;
56 |
57 | double totalFare = baseFare + distanceFare + timeFare;
58 |
59 | return totalFare.truncate();
60 | }
61 |
62 | static double generateRandomNumber(int max){
63 |
64 | var randomGenerator = Random();
65 | int randInt = randomGenerator.nextInt(max);
66 |
67 | return randInt.toDouble();
68 | }
69 |
70 | static void disableHomTabLocationUpdates(){
71 | homeTabPositionStream.pause();
72 | Geofire.removeLocation(currentFirebaseUser.uid);
73 | }
74 |
75 | static void enableHomTabLocationUpdates(){
76 | homeTabPositionStream.resume();
77 | Geofire.setLocation(currentFirebaseUser.uid, currentPosition.latitude, currentPosition.longitude);
78 | }
79 |
80 | static void showProgressDialog(context){
81 |
82 | //show please wait dialog
83 | showDialog(
84 | barrierDismissible: false,
85 | context: context,
86 | builder: (BuildContext context) => ProgressDialog(status: 'Please wait',),
87 | );
88 | }
89 |
90 | static void getHistoryInfo (context){
91 |
92 | DatabaseReference earningRef = FirebaseDatabase.instance.reference().child('drivers/${currentFirebaseUser.uid}/earnings');
93 |
94 | earningRef.once().then((DataSnapshot snapshot){
95 | if(snapshot.value != null){
96 | String earnings = snapshot.value.toString();
97 | Provider.of(context, listen: false).updateEarnings(earnings);
98 | }
99 |
100 | });
101 |
102 | DatabaseReference historyRef = FirebaseDatabase.instance.reference().child('drivers/${currentFirebaseUser.uid}/history');
103 | historyRef.once().then((DataSnapshot snapshot) {
104 |
105 | if(snapshot.value != null){
106 |
107 | Map values = snapshot.value;
108 | int tripCount = values.length;
109 |
110 | // update trip count to data provider
111 | Provider.of(context, listen: false).updateTripCount(tripCount);
112 |
113 | List tripHistoryKeys = [];
114 | values.forEach((key, value) {tripHistoryKeys.add(key);});
115 |
116 | // update trip keys to data provider
117 | Provider.of(context, listen: false).updateTripKeys(tripHistoryKeys);
118 |
119 | getHistoryData(context);
120 |
121 | }
122 | });
123 |
124 |
125 | }
126 |
127 | static void getHistoryData(context){
128 |
129 | var keys = Provider.of(context, listen: false).tripHistoryKeys;
130 |
131 | for(String key in keys){
132 | DatabaseReference historyRef = FirebaseDatabase.instance.reference().child('rideRequest/$key');
133 |
134 | historyRef.once().then((DataSnapshot snapshot) {
135 | if(snapshot.value != null){
136 |
137 | var history = History.fromSnapshot(snapshot);
138 | Provider.of(context, listen: false).updateTripHistory(history);
139 |
140 | print(history.destination);
141 | }
142 | });
143 | }
144 |
145 | }
146 |
147 |
148 | static String formatMyDate(String datestring){
149 |
150 | DateTime thisDate = DateTime.parse(datestring);
151 | String formattedDate = '${DateFormat.MMMd().format(thisDate)}, ${DateFormat.y().format(thisDate)} - ${DateFormat.jm().format(thisDate)}';
152 |
153 | return formattedDate;
154 | }
155 |
156 | }
--------------------------------------------------------------------------------
/lib/helpers/mapkithelper.dart:
--------------------------------------------------------------------------------
1 |
2 | import 'package:maps_toolkit/maps_toolkit.dart';
3 |
4 | class MapKitHelper{
5 |
6 | static double getMarkerRotation (sourceLat, sourceLng, destinationLat, destinationLng){
7 |
8 | var rotation = SphericalUtil.computeHeading(
9 | LatLng(sourceLat, sourceLng),
10 | LatLng(destinationLat, destinationLng)
11 | );
12 |
13 | return rotation;
14 | }
15 |
16 | }
--------------------------------------------------------------------------------
/lib/helpers/pushnotificationservice.dart:
--------------------------------------------------------------------------------
1 |
2 | import 'package:assets_audio_player/assets_audio_player.dart';
3 | import 'package:cabdriver/datamodels/tripdetails.dart';
4 | import 'package:cabdriver/globalvariabels.dart';
5 | import 'package:cabdriver/widgets/NotificationDialog.dart';
6 | import 'package:cabdriver/widgets/ProgressDialog.dart';
7 | import 'package:firebase_database/firebase_database.dart';
8 | import 'package:firebase_messaging/firebase_messaging.dart';
9 | import 'package:flutter/material.dart';
10 | import 'dart:io';
11 |
12 | import 'package:google_maps_flutter/google_maps_flutter.dart';
13 |
14 | class PushNotificationService{
15 |
16 | final FirebaseMessaging fcm = FirebaseMessaging();
17 |
18 |
19 | Future initialize(context) async {
20 |
21 | if(Platform.isIOS){
22 | fcm.requestNotificationPermissions(IosNotificationSettings());
23 | }
24 |
25 | fcm.configure(
26 |
27 | onMessage: (Map message) async {
28 |
29 | fetchRideInfo(getRideID(message), context);
30 | },
31 | onLaunch: (Map message) async {
32 |
33 | fetchRideInfo(getRideID(message), context);
34 |
35 | },
36 | onResume: (Map message) async {
37 |
38 | fetchRideInfo(getRideID(message), context);
39 |
40 | },
41 |
42 | );
43 |
44 | }
45 |
46 | Future getToken() async{
47 |
48 | String token = await fcm.getToken();
49 | print('token: $token');
50 |
51 | DatabaseReference tokenRef = FirebaseDatabase.instance.reference().child('drivers/${currentFirebaseUser.uid}/token');
52 | tokenRef.set(token);
53 |
54 | fcm.subscribeToTopic('alldrivers');
55 | fcm.subscribeToTopic('allusers');
56 |
57 | }
58 |
59 | String getRideID(Map message){
60 |
61 | String rideID = '';
62 |
63 | if(Platform.isAndroid){
64 | rideID = message['data']['ride_id'];
65 | }
66 | else{
67 | rideID = message['ride_id'];
68 | print('ride_id: $rideID');
69 | }
70 |
71 | return rideID;
72 | }
73 |
74 | void fetchRideInfo(String rideID, context){
75 |
76 | //show please wait dialog
77 | showDialog(
78 | barrierDismissible: false,
79 | context: context,
80 | builder: (BuildContext context) => ProgressDialog(status: 'Fetching details',),
81 | );
82 |
83 | DatabaseReference rideRef = FirebaseDatabase.instance.reference().child('rideRequest/$rideID');
84 | rideRef.once().then((DataSnapshot snapshot){
85 |
86 | Navigator.pop(context);
87 |
88 | if(snapshot.value != null){
89 |
90 | assetsAudioPlayer.open(
91 | Audio('sounds/alert.mp3'),
92 | );
93 | assetsAudioPlayer.play();
94 |
95 | double pickupLat = double.parse(snapshot.value['location']['latitude'].toString());
96 | double pickupLng = double.parse(snapshot.value['location']['longitude'].toString());
97 | String pickupAddress = snapshot.value['pickup_address'].toString();
98 |
99 | double destinationLat = double.parse(snapshot.value['destination']['latitude'].toString());
100 | double destinationLng = double.parse(snapshot.value['destination']['longitude'].toString());
101 | String destinationAddress = snapshot.value['destination_address'];
102 | String paymentMethod = snapshot.value['payment_method'];
103 | String riderName = snapshot.value['rider_name'];
104 | String riderPhone = snapshot.value['rider_phone'];
105 |
106 | TripDetails tripDetails = TripDetails();
107 |
108 | tripDetails.rideID = rideID;
109 | tripDetails.pickupAddress = pickupAddress;
110 | tripDetails.destinationAddress = destinationAddress;
111 | tripDetails.pickup = LatLng(pickupLat, pickupLng);
112 | tripDetails.destination = LatLng(destinationLat, destinationLng);
113 | tripDetails.paymentMethod = paymentMethod;
114 | tripDetails.riderName = riderName;
115 | tripDetails.riderPhone = riderPhone;
116 |
117 | showDialog(
118 | context: context,
119 | barrierDismissible: false,
120 | builder: (BuildContext context) => NotificationDialog(tripDetails: tripDetails,),
121 | );
122 |
123 | }
124 |
125 | });
126 | }
127 |
128 | }
--------------------------------------------------------------------------------
/lib/helpers/requesthelper.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 |
3 | import 'package:http/http.dart' as http;
4 |
5 | class RequestHelper{
6 |
7 |
8 | static Future getRequest(String url) async {
9 | http.Response response = await http.get(url);
10 |
11 | try{
12 | if(response.statusCode == 200){
13 | String data = response.body;
14 | var decodedData = jsonDecode(data);
15 | return decodedData;
16 | }
17 | else{
18 | return 'failed';
19 | }
20 | }
21 | catch(e){
22 | return 'failed';
23 | }
24 |
25 |
26 | }
27 |
28 | }
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:cabdriver/dataprovider.dart';
2 | import 'package:cabdriver/globalvariabels.dart';
3 | import 'package:cabdriver/screens/login.dart';
4 | import 'package:cabdriver/screens/mainpage.dart';
5 | import 'package:cabdriver/screens/registration.dart';
6 | import 'package:cabdriver/screens/vehicleinfo.dart';
7 | import 'package:firebase_auth/firebase_auth.dart';
8 | import 'package:firebase_core/firebase_core.dart';
9 | import 'package:flutter/material.dart';
10 | import 'dart:io';
11 |
12 | import 'package:provider/provider.dart';
13 |
14 | Future main() async {
15 | WidgetsFlutterBinding.ensureInitialized();
16 | final FirebaseApp app = await FirebaseApp.configure(
17 | name: 'db2',
18 | options: Platform.isIOS
19 | ? const FirebaseOptions(
20 | googleAppID: '1:169450788828:ios:565f2d4b4623a7dbf9a119',
21 | gcmSenderID: '169450788828',
22 | databaseURL: 'https://geetaxi-9c60a.firebaseio.com',
23 | )
24 | : const FirebaseOptions(
25 | googleAppID: '1:169450788828:android:5ecb13adb959cb18f9a119',
26 | apiKey: 'AIzaSyDQSm22dfjceA0OiQ9XL-0tQ0d7_XZTXpQ',
27 | databaseURL: 'https://geetaxi-9c60a.firebaseio.com',
28 | ),
29 | );
30 |
31 | currentFirebaseUser = await FirebaseAuth.instance.currentUser();
32 |
33 | runApp(MyApp());
34 | }
35 |
36 |
37 | class MyApp extends StatelessWidget {
38 | // This widget is the root of your application.
39 | @override
40 | Widget build(BuildContext context) {
41 |
42 | return ChangeNotifierProvider(
43 | create: (context) => AppData(),
44 | child: MaterialApp(
45 | theme: ThemeData(
46 |
47 | fontFamily: 'Brand-Regular',
48 | primarySwatch: Colors.blue,
49 | visualDensity: VisualDensity.adaptivePlatformDensity,
50 | ),
51 | initialRoute: (currentFirebaseUser == null) ? LoginPage.id : MainPage.id,
52 | routes: {
53 | MainPage.id: (context) => MainPage(),
54 | RegistrationPage.id: (context) => RegistrationPage(),
55 | VehicleInfoPage.id: (context) => VehicleInfoPage(),
56 | LoginPage.id: (context) => LoginPage(),
57 | },
58 | ),
59 | );
60 | }
61 | }
62 |
63 |
--------------------------------------------------------------------------------
/lib/screens/historypage.dart:
--------------------------------------------------------------------------------
1 | import 'package:cabdriver/brand_colors.dart';
2 | import 'package:cabdriver/dataprovider.dart';
3 | import 'package:cabdriver/widgets/BrandDivier.dart';
4 | import 'package:cabdriver/widgets/HistoryTile.dart';
5 | import 'package:flutter/material.dart';
6 | import 'package:provider/provider.dart';
7 |
8 | class HistoryPage extends StatefulWidget {
9 | @override
10 | _HistoryPageState createState() => _HistoryPageState();
11 | }
12 |
13 | class _HistoryPageState extends State {
14 | @override
15 | Widget build(BuildContext context) {
16 | return Scaffold(
17 | appBar: AppBar(
18 | title: Text('Trip History'),
19 | backgroundColor: BrandColors.colorPrimary,
20 | leading: IconButton(
21 | onPressed: (){
22 | Navigator.pop(context);
23 | },
24 | icon: Icon(Icons.keyboard_arrow_left),
25 | ),
26 | ),
27 | body: ListView.separated(
28 | padding: EdgeInsets.all(0),
29 | itemBuilder: (context, index) {
30 | return HistoryTile(
31 | history: Provider.of(context).tripHistory[index],
32 | );
33 | },
34 | separatorBuilder: (BuildContext context, int index) => BrandDivider(),
35 | itemCount: Provider.of(context).tripHistory.length,
36 | physics: ClampingScrollPhysics(),
37 | shrinkWrap: true,
38 | ),
39 | );
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/lib/screens/login.dart:
--------------------------------------------------------------------------------
1 |
2 | import 'package:cabdriver/brand_colors.dart';
3 | import 'package:cabdriver/screens/mainpage.dart';
4 | import 'package:cabdriver/screens/registration.dart';
5 | import 'package:cabdriver/widgets/ProgressDialog.dart';
6 | import 'package:cabdriver/widgets/TaxiButton.dart';
7 | import 'package:connectivity/connectivity.dart';
8 | import 'package:firebase_auth/firebase_auth.dart';
9 | import 'package:firebase_database/firebase_database.dart';
10 | import 'package:flutter/material.dart';
11 | import 'package:flutter/services.dart';
12 |
13 | class LoginPage extends StatefulWidget {
14 |
15 | static const String id = 'login';
16 |
17 | @override
18 | _LoginPageState createState() => _LoginPageState();
19 | }
20 |
21 | class _LoginPageState extends State {
22 | final GlobalKey scaffoldKey = new GlobalKey();
23 |
24 | void showSnackBar(String title){
25 | final snackbar = SnackBar(
26 | content: Text(title, textAlign: TextAlign.center, style: TextStyle(fontSize: 15),),
27 | );
28 | scaffoldKey.currentState.showSnackBar(snackbar);
29 | }
30 |
31 | final FirebaseAuth _auth = FirebaseAuth.instance;
32 |
33 | var emailController = TextEditingController();
34 |
35 | var passwordController = TextEditingController();
36 |
37 | void login() async {
38 |
39 | //show please wait dialog
40 | showDialog(
41 | barrierDismissible: false,
42 | context: context,
43 | builder: (BuildContext context) => ProgressDialog(status: 'Logging you in',),
44 | );
45 |
46 | final FirebaseUser user = (await _auth.signInWithEmailAndPassword(
47 | email: emailController.text,
48 | password: passwordController.text,
49 | ).catchError((ex){
50 |
51 | //check error and display message
52 | Navigator.pop(context);
53 | PlatformException thisEx = ex;
54 | showSnackBar(thisEx.message);
55 |
56 | })).user;
57 |
58 | if(user != null){
59 | // verify login
60 | DatabaseReference userRef = FirebaseDatabase.instance.reference().child('drivers/${user.uid}');
61 | userRef.once().then((DataSnapshot snapshot) {
62 |
63 | if(snapshot.value != null){
64 | Navigator.pushNamedAndRemoveUntil(context, MainPage.id, (route) => false);
65 | }
66 | });
67 |
68 | }
69 | }
70 |
71 | @override
72 | Widget build(BuildContext context) {
73 | return Scaffold(
74 | key: scaffoldKey,
75 | backgroundColor: Colors.white,
76 | body: SafeArea(
77 | child: SingleChildScrollView(
78 | child: Padding(
79 | padding: EdgeInsets.all(8.0),
80 | child: Column(
81 | children: [
82 | SizedBox(height: 70,),
83 | Image(
84 | alignment: Alignment.center,
85 | height: 100.0,
86 | width: 100.0,
87 | image: AssetImage('images/logo.png'),
88 | ),
89 |
90 | SizedBox(height: 40,),
91 |
92 | Text('Login as a driver',
93 | textAlign: TextAlign.center,
94 | style: TextStyle(fontSize: 25, fontFamily: 'Brand-Bold'),
95 | ),
96 |
97 | Padding(
98 | padding: EdgeInsets.all(20.0),
99 | child: Column(
100 | children: [
101 |
102 | TextField(
103 | controller: emailController,
104 | keyboardType: TextInputType.emailAddress,
105 | decoration: InputDecoration(
106 | labelText: 'Email address',
107 | labelStyle: TextStyle(
108 | fontSize: 14.0,
109 | ),
110 | hintStyle: TextStyle(
111 | color: Colors.grey,
112 | fontSize: 10.0
113 | )
114 | ),
115 | style: TextStyle(fontSize: 14),
116 | ),
117 |
118 | SizedBox(height: 10,),
119 |
120 | TextField(
121 | controller: passwordController,
122 | obscureText: true,
123 | decoration: InputDecoration(
124 | labelText: 'Password',
125 | labelStyle: TextStyle(
126 | fontSize: 14.0,
127 | ),
128 | hintStyle: TextStyle(
129 | color: Colors.grey,
130 | fontSize: 10.0
131 | )
132 | ),
133 | style: TextStyle(fontSize: 14),
134 | ),
135 |
136 | SizedBox(height: 40,),
137 |
138 | TaxiButton(
139 | title: 'LOGIN',
140 | color: BrandColors.colorAccentPurple,
141 | onPressed: () async {
142 |
143 | //check network availability
144 |
145 | var connectivityResult = await Connectivity().checkConnectivity();
146 | if(connectivityResult != ConnectivityResult.mobile && connectivityResult != ConnectivityResult.wifi){
147 | showSnackBar('No internet connectivity');
148 | return;
149 | }
150 |
151 | if(!emailController.text.contains('@')){
152 | showSnackBar('Please enter a valid email address');
153 | return;
154 | }
155 |
156 | if(passwordController.text.length < 8){
157 | showSnackBar('Please enter a valid password');
158 | return;
159 | }
160 |
161 | login();
162 |
163 | },
164 | ),
165 |
166 | ],
167 | ),
168 | ),
169 |
170 | FlatButton(
171 | onPressed: (){
172 | Navigator.pushNamedAndRemoveUntil(context, RegistrationPage.id, (route) => false);
173 | },
174 | child: Text('Don\'t have an account, sign up here')
175 | ),
176 |
177 |
178 | ],
179 | ),
180 | ),
181 | ),
182 | ),
183 | );
184 | }
185 | }
186 |
187 |
--------------------------------------------------------------------------------
/lib/screens/mainpage.dart:
--------------------------------------------------------------------------------
1 | import 'package:cabdriver/brand_colors.dart';
2 | import 'package:cabdriver/globalvariabels.dart';
3 | import 'package:cabdriver/tabs/earningstab.dart';
4 | import 'package:cabdriver/tabs/hometab.dart';
5 | import 'package:cabdriver/tabs/profiletab.dart';
6 | import 'package:cabdriver/tabs/ratingstab.dart';
7 | import 'package:firebase_database/firebase_database.dart';
8 | import 'package:flutter/material.dart';
9 |
10 | class MainPage extends StatefulWidget {
11 | static const String id = 'mainpage';
12 | _MainPageState createState() => _MainPageState();
13 | }
14 |
15 | class _MainPageState extends State with SingleTickerProviderStateMixin {
16 |
17 | TabController tabController;
18 | int selecetdIndex = 0;
19 |
20 | void onItemClicked(int index){
21 | setState(() {
22 | selecetdIndex = index;
23 | tabController.index = selecetdIndex;
24 | });
25 | }
26 |
27 | @override
28 | void initState() {
29 | // TODO: implement initState
30 | super.initState();
31 | tabController = TabController(length: 4, vsync: this);
32 | }
33 |
34 | @override
35 | void dispose() {
36 | // TODO: implement dispose
37 | tabController.dispose();
38 | super.dispose();
39 | }
40 |
41 | @override
42 | Widget build(BuildContext context) {
43 | return Scaffold(
44 |
45 | body: TabBarView(
46 | physics: NeverScrollableScrollPhysics(),
47 | controller: tabController,
48 | children: [
49 | HomeTab(),
50 | EarningsTab(),
51 | RatingsTab(),
52 | ProfileTab(),
53 | ],
54 | ),
55 | bottomNavigationBar: BottomNavigationBar(
56 | items: [
57 | BottomNavigationBarItem(
58 | icon: Icon(Icons.home),
59 | title: Text('Home'),
60 | ),
61 | BottomNavigationBarItem(
62 | icon: Icon(Icons.credit_card),
63 | title: Text('Earnings'),
64 | ),
65 | BottomNavigationBarItem(
66 | icon: Icon(Icons.star),
67 | title: Text('Ratings'),
68 | ),
69 | BottomNavigationBarItem(
70 | icon: Icon(Icons.person),
71 | title: Text('Account'),
72 | ),
73 | ],
74 | currentIndex: selecetdIndex,
75 | unselectedItemColor: BrandColors.colorIcon,
76 | selectedItemColor: BrandColors.colorOrange,
77 | showUnselectedLabels: true,
78 | selectedLabelStyle: TextStyle(fontSize: 12),
79 | type: BottomNavigationBarType.fixed,
80 | onTap: onItemClicked,
81 | ),
82 | );
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/lib/screens/newtripspage.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'dart:io';
3 |
4 | import 'package:cabdriver/brand_colors.dart';
5 | import 'package:cabdriver/datamodels/tripdetails.dart';
6 | import 'package:cabdriver/globalvariabels.dart';
7 | import 'package:cabdriver/helpers/helpermethods.dart';
8 | import 'package:cabdriver/helpers/mapkithelper.dart';
9 | import 'package:cabdriver/widgets/CollectPaymentDialog.dart';
10 | import 'package:cabdriver/widgets/ProgressDialog.dart';
11 | import 'package:cabdriver/widgets/TaxiButton.dart';
12 | import 'package:firebase_database/firebase_database.dart';
13 | import 'package:flutter/material.dart';
14 | import 'package:flutter_polyline_points/flutter_polyline_points.dart';
15 | import 'package:geolocator/geolocator.dart';
16 | import 'package:google_maps_flutter/google_maps_flutter.dart';
17 |
18 | class NewTripPage extends StatefulWidget {
19 |
20 | final TripDetails tripDetails;
21 | NewTripPage({this.tripDetails});
22 | @override
23 | _NewTripPageState createState() => _NewTripPageState();
24 | }
25 |
26 | class _NewTripPageState extends State {
27 |
28 | GoogleMapController rideMapController;
29 | Completer _controller = Completer();
30 | double mapPaddingBottom = 0;
31 |
32 | Set _markers = Set();
33 | Set _circles = Set();
34 | Set _polyLines = Set();
35 |
36 | List polylineCoordinates = [];
37 | PolylinePoints polylinePoints = PolylinePoints();
38 |
39 | var geoLocator = Geolocator();
40 | var locationOptions = LocationOptions(accuracy: LocationAccuracy.bestForNavigation);
41 |
42 | BitmapDescriptor movingMarkerIcon;
43 |
44 | Position myPosition;
45 |
46 | String status = 'accepted';
47 |
48 | String durationString = '';
49 |
50 | bool isRequestingDirection = false;
51 |
52 | String buttonTitle = 'ARRIVED';
53 |
54 | Color buttonColor = BrandColors.colorGreen;
55 |
56 | Timer timer;
57 |
58 | int durationCounter = 0;
59 |
60 | void createMarker(){
61 | if(movingMarkerIcon == null){
62 |
63 | ImageConfiguration imageConfiguration = createLocalImageConfiguration(context, size: Size(2,2));
64 | BitmapDescriptor.fromAssetImage(
65 | imageConfiguration, (Platform.isIOS)
66 | ? 'images/car_ios.png'
67 | : 'images/car_android.png'
68 | ).then((icon){
69 | movingMarkerIcon = icon;
70 | });
71 | }
72 | }
73 |
74 | @override
75 | void initState() {
76 | // TODO: implement initState
77 | super.initState();
78 | acceptTrip();
79 | }
80 |
81 | @override
82 | Widget build(BuildContext context) {
83 |
84 | createMarker();
85 |
86 | return Scaffold(
87 | body: Stack(
88 | children: [
89 | GoogleMap(
90 | padding: EdgeInsets.only(bottom: mapPaddingBottom),
91 | myLocationEnabled: true,
92 | myLocationButtonEnabled: true,
93 | compassEnabled: true,
94 | mapToolbarEnabled: true,
95 | trafficEnabled: true,
96 | mapType: MapType.normal,
97 | circles: _circles,
98 | markers: _markers,
99 | polylines: _polyLines,
100 | initialCameraPosition: googlePlex,
101 | onMapCreated: (GoogleMapController controller) async {
102 | _controller.complete(controller);
103 | rideMapController = controller;
104 |
105 | setState(() {
106 | mapPaddingBottom = (Platform.isIOS) ? 255 : 260;
107 | });
108 |
109 | var currentLatLng = LatLng(currentPosition.latitude, currentPosition.longitude);
110 | var pickupLatLng = widget.tripDetails.pickup;
111 | await getDirection(currentLatLng, pickupLatLng);
112 |
113 | getLocationUpdates();
114 |
115 | },
116 | ),
117 |
118 |
119 | Positioned(
120 | left: 0,
121 | right: 0,
122 | bottom: 0,
123 | child: Container(
124 | decoration: BoxDecoration(
125 | color: Colors.white,
126 | borderRadius: BorderRadius.only(topLeft: Radius.circular(15), topRight: Radius.circular(15)),
127 | boxShadow: [
128 | BoxShadow(
129 | color: Colors.black26,
130 | blurRadius: 15.0,
131 | spreadRadius: 0.5,
132 | offset: Offset(
133 | 0.7,
134 | 0.7,
135 | ),
136 | )
137 | ],
138 | ),
139 | height: Platform.isIOS ? 280 : 255,
140 | child: Padding(
141 | padding: EdgeInsets.symmetric(horizontal: 24, vertical: 18),
142 | child: Column(
143 | crossAxisAlignment: CrossAxisAlignment.start,
144 | children: [
145 | Text(
146 | durationString,
147 | style: TextStyle(
148 | fontSize: 14,
149 | fontFamily: 'Brand-Bold',
150 | color: BrandColors.colorAccentPurple
151 | ),
152 | ),
153 |
154 | SizedBox(height: 5,),
155 |
156 | Row(
157 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
158 | children: [
159 | Text(widget.tripDetails.riderName, style: TextStyle(fontSize: 22, fontFamily: 'Brand-Bold'),),
160 |
161 | Padding(
162 | padding: EdgeInsets.only(right: 10),
163 | child: Icon(Icons.call),
164 | ),
165 |
166 | ],
167 | ),
168 |
169 | SizedBox(height: 25,),
170 |
171 | Row(
172 | children: [
173 | Image.asset('images/pickicon.png', height: 16, width: 16,),
174 | SizedBox(width: 18,),
175 |
176 | Expanded(
177 | child: Container(
178 | child: Text(
179 | widget.tripDetails.pickupAddress,
180 | style: TextStyle(fontSize: 18),
181 | overflow: TextOverflow.ellipsis,
182 | ),
183 | ),
184 | ),
185 |
186 | ],
187 | ),
188 |
189 | SizedBox(height: 15,),
190 |
191 |
192 | Row(
193 | children: [
194 | Image.asset('images/desticon.png', height: 16, width: 16,),
195 | SizedBox(width: 18,),
196 |
197 | Expanded(
198 | child: Container(
199 | child: Text(
200 | widget.tripDetails.destinationAddress,
201 | style: TextStyle(fontSize: 18),
202 | overflow: TextOverflow.ellipsis,
203 | ),
204 | ),
205 | ),
206 |
207 | ],
208 | ),
209 |
210 |
211 | SizedBox(height: 25,),
212 |
213 | TaxiButton(
214 | title: buttonTitle,
215 | color: buttonColor,
216 | onPressed: () async {
217 |
218 | if(status == 'accepted'){
219 |
220 | status = 'arrived';
221 | rideRef.child('status').set(('arrived'));
222 |
223 | setState(() {
224 | buttonTitle = 'START TRIP';
225 | buttonColor = BrandColors.colorAccentPurple;
226 | });
227 |
228 | HelperMethods.showProgressDialog(context);
229 |
230 | await getDirection(widget.tripDetails.pickup, widget.tripDetails.destination);
231 |
232 | Navigator.pop(context);
233 | }
234 | else if(status == 'arrived'){
235 | status = 'ontrip';
236 | rideRef.child('status').set('ontrip');
237 |
238 | setState(() {
239 | buttonTitle = 'END TRIP';
240 | buttonColor = Colors.red[900];
241 | });
242 |
243 | startTimer();
244 | }
245 | else if(status == 'ontrip'){
246 | endTrip();
247 | }
248 |
249 | },
250 | )
251 |
252 | ],
253 | ),
254 | ),
255 | ),
256 | )
257 |
258 | ],
259 |
260 | ),
261 | );
262 | }
263 |
264 | void acceptTrip(){
265 |
266 | String rideID = widget.tripDetails.rideID;
267 | rideRef = FirebaseDatabase.instance.reference().child('rideRequest/$rideID');
268 |
269 | rideRef.child('status').set('accepted');
270 | rideRef.child('driver_name').set(currentDriverInfo.fullName);
271 | rideRef.child('car_details').set('${currentDriverInfo.carColor} - ${currentDriverInfo.carModel}');
272 | rideRef.child('driver_phone').set(currentDriverInfo.phone);
273 | rideRef.child('driver_id').set(currentDriverInfo.id);
274 |
275 | Map locationMap = {
276 | 'latitude': currentPosition.latitude.toString(),
277 | 'longitude': currentPosition.longitude.toString(),
278 | };
279 |
280 | rideRef.child('driver_location').set(locationMap);
281 |
282 | DatabaseReference historyRef = FirebaseDatabase.instance.reference().child('drivers/${currentFirebaseUser.uid}/history/$rideID');
283 | historyRef.set(true);
284 |
285 | }
286 |
287 | void getLocationUpdates(){
288 |
289 | LatLng oldPosition = LatLng(0,0);
290 |
291 | ridePositionStream = geoLocator.getPositionStream(locationOptions).listen((Position position) {
292 | myPosition = position;
293 | currentPosition = position;
294 | LatLng pos = LatLng(position.latitude, position.longitude);
295 |
296 | var rotation = MapKitHelper.getMarkerRotation(oldPosition.latitude, oldPosition.longitude, pos.latitude, pos.longitude);
297 |
298 | print('my rotation = $rotation');
299 |
300 |
301 | Marker movingMaker = Marker(
302 | markerId: MarkerId('moving'),
303 | position: pos,
304 | icon: movingMarkerIcon,
305 | rotation: rotation,
306 | infoWindow: InfoWindow(title: 'Current Location')
307 | );
308 |
309 | setState(() {
310 | CameraPosition cp = new CameraPosition(target: pos, zoom: 17);
311 | rideMapController.animateCamera(CameraUpdate.newCameraPosition(cp));
312 |
313 | _markers.removeWhere((marker) => marker.markerId.value == 'moving');
314 | _markers.add(movingMaker);
315 | });
316 |
317 | oldPosition = pos;
318 |
319 | updateTripDetails();
320 |
321 | Map locationMap = {
322 | 'latitude': myPosition.latitude.toString(),
323 | 'longitude': myPosition.longitude.toString(),
324 | };
325 |
326 | rideRef.child('driver_location').set(locationMap);
327 |
328 | });
329 |
330 | }
331 |
332 | void updateTripDetails() async{
333 |
334 | if(!isRequestingDirection){
335 |
336 | isRequestingDirection = true;
337 |
338 | if(myPosition == null){
339 | return;
340 | }
341 |
342 | var positionLatLng = LatLng(myPosition.latitude, myPosition.longitude);
343 | LatLng destinationLatLng;
344 |
345 | if(status == 'accepted'){
346 | destinationLatLng = widget.tripDetails.pickup;
347 | }
348 | else{
349 | destinationLatLng = widget.tripDetails.destination;
350 | }
351 |
352 | var directionDetails = await HelperMethods.getDirectionDetails(positionLatLng, destinationLatLng);
353 |
354 | if(directionDetails != null){
355 |
356 | print(directionDetails.durationText);
357 |
358 | setState(() {
359 | durationString = directionDetails.durationText;
360 | });
361 | }
362 | isRequestingDirection = false;
363 |
364 | }
365 |
366 | }
367 |
368 | Future getDirection(LatLng pickupLatLng, LatLng destinationLatLng) async {
369 |
370 |
371 | showDialog(
372 | barrierDismissible: false,
373 | context: context,
374 | builder: (BuildContext context) => ProgressDialog(status: 'Please wait...',)
375 | );
376 |
377 | var thisDetails = await HelperMethods.getDirectionDetails(pickupLatLng, destinationLatLng);
378 |
379 | Navigator.pop(context);
380 |
381 | PolylinePoints polylinePoints = PolylinePoints();
382 | List results = polylinePoints.decodePolyline(thisDetails.encodedPoints);
383 |
384 | polylineCoordinates.clear();
385 | if(results.isNotEmpty){
386 | // loop through all PointLatLng points and convert them
387 | // to a list of LatLng, required by the Polyline
388 | results.forEach((PointLatLng point) {
389 | polylineCoordinates.add(LatLng(point.latitude, point.longitude));
390 | });
391 | }
392 |
393 | _polyLines.clear();
394 |
395 | setState(() {
396 |
397 | Polyline polyline = Polyline(
398 | polylineId: PolylineId('polyid'),
399 | color: Color.fromARGB(255, 95, 109, 237),
400 | points: polylineCoordinates,
401 | jointType: JointType.round,
402 | width: 4,
403 | startCap: Cap.roundCap,
404 | endCap: Cap.roundCap,
405 | geodesic: true,
406 | );
407 |
408 | _polyLines.add(polyline);
409 |
410 | });
411 |
412 | // make polyline to fit into the map
413 |
414 | LatLngBounds bounds;
415 |
416 | if(pickupLatLng.latitude > destinationLatLng.latitude && pickupLatLng.longitude > destinationLatLng.longitude){
417 | bounds = LatLngBounds(southwest: destinationLatLng, northeast: pickupLatLng);
418 | }
419 | else if(pickupLatLng.longitude > destinationLatLng.longitude){
420 | bounds = LatLngBounds(
421 | southwest: LatLng(pickupLatLng.latitude, destinationLatLng.longitude),
422 | northeast: LatLng(destinationLatLng.latitude, pickupLatLng.longitude)
423 | );
424 | }
425 | else if(pickupLatLng.latitude > destinationLatLng.latitude){
426 | bounds = LatLngBounds(
427 | southwest: LatLng(destinationLatLng.latitude, pickupLatLng.longitude),
428 | northeast: LatLng(pickupLatLng.latitude, destinationLatLng.longitude),
429 | );
430 | }
431 | else{
432 | bounds = LatLngBounds(southwest: pickupLatLng, northeast: destinationLatLng);
433 | }
434 |
435 | rideMapController.animateCamera(CameraUpdate.newLatLngBounds(bounds, 70));
436 |
437 | Marker pickupMarker = Marker(
438 | markerId: MarkerId('pickup'),
439 | position: pickupLatLng,
440 | icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen),
441 | );
442 |
443 | Marker destinationMarker = Marker(
444 | markerId: MarkerId('destination'),
445 | position: destinationLatLng,
446 | icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed),
447 | );
448 |
449 | setState(() {
450 | _markers.add(pickupMarker);
451 | _markers.add(destinationMarker);
452 | });
453 |
454 | Circle pickupCircle = Circle(
455 | circleId: CircleId('pickup'),
456 | strokeColor: Colors.green,
457 | strokeWidth: 3,
458 | radius: 12,
459 | center: pickupLatLng,
460 | fillColor: BrandColors.colorGreen,
461 | );
462 |
463 | Circle destinationCircle = Circle(
464 | circleId: CircleId('destination'),
465 | strokeColor: BrandColors.colorAccentPurple,
466 | strokeWidth: 3,
467 | radius: 12,
468 | center: destinationLatLng,
469 | fillColor: BrandColors.colorAccentPurple,
470 | );
471 |
472 |
473 |
474 | setState(() {
475 | _circles.add(pickupCircle);
476 | _circles.add(destinationCircle);
477 | });
478 |
479 | }
480 |
481 | void startTimer(){
482 | const interval = Duration(seconds: 1);
483 | timer = Timer.periodic(interval, (timer) {
484 | durationCounter++;
485 | });
486 | }
487 |
488 | void endTrip() async {
489 |
490 | timer.cancel();
491 |
492 | HelperMethods.showProgressDialog(context);
493 |
494 | var currentLatLng = LatLng(myPosition.latitude, myPosition.longitude);
495 |
496 | var directionDetails = await HelperMethods.getDirectionDetails(widget.tripDetails.pickup, currentLatLng);
497 |
498 | Navigator.pop(context);
499 |
500 | int fares = HelperMethods.estimateFares(directionDetails, durationCounter);
501 |
502 | rideRef.child('fares').set(fares.toString());
503 |
504 | rideRef.child('status').set('ended');
505 |
506 | ridePositionStream.cancel();
507 |
508 | showDialog(
509 | context: context,
510 | barrierDismissible: false,
511 | builder: (BuildContext context) => CollectPayment(
512 | paymentMethod: widget.tripDetails.paymentMethod,
513 | fares: fares,
514 | )
515 | );
516 |
517 | topUpEarnings(fares);
518 | }
519 |
520 | void topUpEarnings(int fares){
521 |
522 | DatabaseReference earningsRef = FirebaseDatabase.instance.reference().child('drivers/${currentFirebaseUser.uid}/earnings');
523 | earningsRef.once().then((DataSnapshot snapshot) {
524 |
525 | if(snapshot.value != null){
526 |
527 | double oldEarnings = double.parse(snapshot.value.toString());
528 |
529 | double adjustedEarnings = (fares.toDouble() * 0.85) + oldEarnings;
530 |
531 | earningsRef.set(adjustedEarnings.toStringAsFixed(2));
532 | }
533 | else{
534 | double adjustedEarnings = (fares.toDouble() * 0.85);
535 | earningsRef.set(adjustedEarnings.toStringAsFixed(2));
536 | }
537 |
538 | });
539 | }
540 | }
541 |
--------------------------------------------------------------------------------
/lib/screens/registration.dart:
--------------------------------------------------------------------------------
1 |
2 | import 'package:cabdriver/brand_colors.dart';
3 | import 'package:cabdriver/globalvariabels.dart';
4 | import 'package:cabdriver/screens/login.dart';
5 | import 'package:cabdriver/screens/mainpage.dart';
6 | import 'package:cabdriver/screens/vehicleinfo.dart';
7 | import 'package:cabdriver/widgets/ProgressDialog.dart';
8 | import 'package:cabdriver/widgets/TaxiButton.dart';
9 | import 'package:connectivity/connectivity.dart';
10 | import 'package:firebase_auth/firebase_auth.dart';
11 | import 'package:firebase_database/firebase_database.dart';
12 | import 'package:flutter/material.dart';
13 | import 'package:flutter/services.dart';
14 |
15 | class RegistrationPage extends StatefulWidget {
16 |
17 | static const String id = 'register';
18 |
19 | @override
20 | _RegistrationPageState createState() => _RegistrationPageState();
21 | }
22 |
23 | class _RegistrationPageState extends State {
24 |
25 | final GlobalKey scaffoldKey = new GlobalKey();
26 |
27 | void showSnackBar(String title){
28 | final snackbar = SnackBar(
29 | content: Text(title, textAlign: TextAlign.center, style: TextStyle(fontSize: 15),),
30 | );
31 | scaffoldKey.currentState.showSnackBar(snackbar);
32 | }
33 |
34 | final FirebaseAuth _auth = FirebaseAuth.instance;
35 |
36 | var fullNameController = TextEditingController();
37 |
38 | var phoneController = TextEditingController();
39 |
40 | var emailController = TextEditingController();
41 |
42 | var passwordController = TextEditingController();
43 |
44 | void registerUser() async {
45 |
46 | //show please wait dialog
47 | showDialog(
48 | barrierDismissible: false,
49 | context: context,
50 | builder: (BuildContext context) => ProgressDialog(status: 'Registering you...',),
51 | );
52 |
53 | final FirebaseUser user = (await _auth.createUserWithEmailAndPassword(
54 | email: emailController.text,
55 | password: passwordController.text,
56 | ).catchError((ex){
57 |
58 | //check error and display message
59 | Navigator.pop(context);
60 | PlatformException thisEx = ex;
61 | showSnackBar(thisEx.message);
62 |
63 | })).user;
64 |
65 | Navigator.pop(context);
66 | // check if user registration is successful
67 | if(user != null){
68 |
69 | DatabaseReference newUserRef = FirebaseDatabase.instance.reference().child('drivers/${user.uid}');
70 |
71 | //Prepare data to be saved on users table
72 | Map userMap = {
73 | 'fullname': fullNameController.text,
74 | 'email': emailController.text,
75 | 'phone': phoneController.text,
76 | };
77 |
78 | newUserRef.set(userMap);
79 |
80 | currentFirebaseUser = user;
81 |
82 | //Take the user to the mainPage
83 | Navigator.pushNamed(context, VehicleInfoPage.id);
84 |
85 | }
86 | }
87 |
88 | @override
89 | Widget build(BuildContext context) {
90 | return Scaffold(
91 | key: scaffoldKey,
92 | backgroundColor: Colors.white,
93 | body: SafeArea(
94 | child: SingleChildScrollView(
95 | child: Padding(
96 | padding: EdgeInsets.all(8.0),
97 | child: Column(
98 | children: [
99 | SizedBox(height: 40,),
100 | Image(
101 | alignment: Alignment.center,
102 | height: 100.0,
103 | width: 100.0,
104 | image: AssetImage('images/logo.png'),
105 | ),
106 |
107 | SizedBox(height: 40,),
108 |
109 | Text('Create a Driver\'s Account',
110 | textAlign: TextAlign.center,
111 | style: TextStyle(fontSize: 25, fontFamily: 'Brand-Bold'),
112 | ),
113 |
114 | Padding(
115 | padding: EdgeInsets.all(20.0),
116 | child: Column(
117 | children: [
118 |
119 | // Fullname
120 | TextField(
121 | controller: fullNameController,
122 | keyboardType: TextInputType.text,
123 | decoration: InputDecoration(
124 | labelText: 'Full name',
125 | labelStyle: TextStyle(
126 | fontSize: 14.0,
127 | ),
128 | hintStyle: TextStyle(
129 | color: Colors.grey,
130 | fontSize: 10.0
131 | )
132 | ),
133 | style: TextStyle(fontSize: 14),
134 | ),
135 |
136 | SizedBox(height: 10,),
137 |
138 | // Email Address
139 | TextField(
140 | controller: emailController,
141 | keyboardType: TextInputType.emailAddress,
142 | decoration: InputDecoration(
143 | labelText: 'Email address',
144 | labelStyle: TextStyle(
145 | fontSize: 14.0,
146 | ),
147 | hintStyle: TextStyle(
148 | color: Colors.grey,
149 | fontSize: 10.0
150 | )
151 | ),
152 | style: TextStyle(fontSize: 14),
153 | ),
154 |
155 | SizedBox(height: 10,),
156 |
157 |
158 | // Phone
159 | TextField(
160 | controller: phoneController,
161 | keyboardType: TextInputType.phone,
162 | decoration: InputDecoration(
163 | labelText: 'Phone number',
164 | labelStyle: TextStyle(
165 | fontSize: 14.0,
166 | ),
167 | hintStyle: TextStyle(
168 | color: Colors.grey,
169 | fontSize: 10.0
170 | )
171 | ),
172 | style: TextStyle(fontSize: 14),
173 | ),
174 |
175 | SizedBox(height: 10,),
176 |
177 | // Password
178 | TextField(
179 | controller: passwordController,
180 | obscureText: true,
181 | decoration: InputDecoration(
182 | labelText: 'Password',
183 | labelStyle: TextStyle(
184 | fontSize: 14.0,
185 | ),
186 | hintStyle: TextStyle(
187 | color: Colors.grey,
188 | fontSize: 10.0
189 | )
190 | ),
191 | style: TextStyle(fontSize: 14),
192 | ),
193 |
194 | SizedBox(height: 40,),
195 |
196 | TaxiButton(
197 | title: 'REGISTER',
198 | color: BrandColors.colorAccentPurple,
199 | onPressed: () async{
200 |
201 | //check network availability
202 |
203 | var connectivityResult = await Connectivity().checkConnectivity();
204 | if(connectivityResult != ConnectivityResult.mobile && connectivityResult != ConnectivityResult.wifi){
205 | showSnackBar('No internet connectivity');
206 | return;
207 | }
208 |
209 | if(fullNameController.text.length < 3){
210 | showSnackBar('Please provide a valid fullname');
211 | return;
212 | }
213 |
214 | if(phoneController.text.length < 10){
215 | showSnackBar('Please provide a valid phone number');
216 | return;
217 | }
218 |
219 | if(!emailController.text.contains('@')){
220 | showSnackBar('Please provide a valid email address');
221 | return;
222 | }
223 |
224 | if(passwordController.text.length < 8){
225 | showSnackBar('password must be at least 8 characters');
226 | return;
227 | }
228 |
229 | registerUser();
230 |
231 | },
232 | ),
233 |
234 | ],
235 | ),
236 | ),
237 |
238 | FlatButton(
239 | onPressed: (){
240 | Navigator.pushNamedAndRemoveUntil(context, LoginPage.id, (route) => false);
241 | },
242 | child: Text('Already have a DRIVER account? Log in')
243 | ),
244 |
245 |
246 | ],
247 | ),
248 | ),
249 | ),
250 | ),
251 | );
252 | }
253 | }
254 |
--------------------------------------------------------------------------------
/lib/screens/vehicleinfo.dart:
--------------------------------------------------------------------------------
1 | import 'package:cabdriver/brand_colors.dart';
2 | import 'package:cabdriver/globalvariabels.dart';
3 | import 'package:cabdriver/screens/mainpage.dart';
4 | import 'package:cabdriver/widgets/TaxiButton.dart';
5 | import 'package:firebase_database/firebase_database.dart';
6 | import 'package:flutter/material.dart';
7 |
8 | class VehicleInfoPage extends StatelessWidget {
9 |
10 |
11 | final GlobalKey scaffoldKey = new GlobalKey();
12 |
13 | void showSnackBar(String title){
14 | final snackbar = SnackBar(
15 | content: Text(title, textAlign: TextAlign.center, style: TextStyle(fontSize: 15),),
16 | );
17 | scaffoldKey.currentState.showSnackBar(snackbar);
18 | }
19 |
20 | static const String id = 'vehicleinfo';
21 |
22 | var carModelController = TextEditingController();
23 | var carColorController = TextEditingController();
24 | var vehicleNumberController = TextEditingController();
25 |
26 | void updateProfile(context){
27 |
28 | String id = currentFirebaseUser.uid;
29 | DatabaseReference driverRef =
30 | FirebaseDatabase.instance.reference().child('drivers/$id/vehicle_details');
31 |
32 | Map map = {
33 | 'car_color': carColorController.text,
34 | 'car_model': carModelController.text,
35 | 'vehicle_number': vehicleNumberController.text,
36 | };
37 |
38 | driverRef.set(map);
39 |
40 | Navigator.pushNamedAndRemoveUntil(context, MainPage.id, (route) => false);
41 |
42 | }
43 |
44 | @override
45 | Widget build(BuildContext context) {
46 | return Scaffold(
47 | key: scaffoldKey,
48 | body: SafeArea(
49 | child: SingleChildScrollView(
50 | child: Column(
51 |
52 | children: [
53 |
54 | SizedBox(height: 30,),
55 |
56 | Image.asset('images/logo.png', height: 100, width: 100,),
57 |
58 | Padding(
59 | padding: EdgeInsets.fromLTRB(20, 20, 20, 30),
60 | child: Column(
61 | children: [
62 |
63 | SizedBox(height: 10,),
64 |
65 | Text('Enter vehicle details', style: TextStyle(fontFamily: 'Brand-Bold', fontSize: 22),),
66 |
67 | SizedBox(height: 25,),
68 |
69 | TextField(
70 | controller: carModelController,
71 | keyboardType: TextInputType.text,
72 | decoration: InputDecoration(
73 | labelText: 'Car model',
74 | hintStyle: TextStyle(
75 | color: Colors.grey,
76 | fontSize: 10.0,
77 | )
78 | ),
79 | style: TextStyle(fontSize: 14.0),
80 | ),
81 |
82 | SizedBox(height: 10.0),
83 |
84 | TextField(
85 | controller: carColorController,
86 | decoration: InputDecoration(
87 | labelText: 'Car color',
88 | hintStyle: TextStyle(
89 | color: Colors.grey,
90 | fontSize: 10.0,
91 | )
92 | ),
93 | style: TextStyle(fontSize: 14.0),
94 | ),
95 |
96 | SizedBox(height: 10.0),
97 |
98 | TextField(
99 | controller: vehicleNumberController,
100 | maxLength: 11,
101 | decoration: InputDecoration(
102 | counterText: '',
103 | labelText: 'Vehicle number',
104 | hintStyle: TextStyle(
105 | color: Colors.grey,
106 | fontSize: 10.0,
107 | )
108 | ),
109 | style: TextStyle(fontSize: 14.0),
110 | ),
111 |
112 | SizedBox(height: 40.0),
113 |
114 | TaxiButton(
115 | color: BrandColors.colorGreen,
116 | title: 'PROCEED',
117 | onPressed: (){
118 |
119 |
120 | if(carModelController.text.length < 3){
121 | showSnackBar('Please provide a valid car model');
122 | return;
123 | }
124 |
125 | if(carColorController.text.length < 3){
126 | showSnackBar('Please provide a valid car color');
127 | return;
128 | }
129 |
130 | if(vehicleNumberController.text.length < 3){
131 | showSnackBar('Please provide a valid vehicle number');
132 | return;
133 | }
134 |
135 | updateProfile(context);
136 |
137 | },
138 | )
139 |
140 |
141 | ],
142 | ),
143 | ),
144 |
145 | ],
146 | ),
147 | ),
148 | ),
149 | );
150 | }
151 | }
152 |
--------------------------------------------------------------------------------
/lib/tabs/earningstab.dart:
--------------------------------------------------------------------------------
1 | import 'package:cabdriver/brand_colors.dart';
2 | import 'package:cabdriver/dataprovider.dart';
3 | import 'package:cabdriver/screens/historypage.dart';
4 | import 'package:cabdriver/widgets/BrandDivier.dart';
5 | import 'package:flutter/material.dart';
6 | import 'package:provider/provider.dart';
7 |
8 | class EarningsTab extends StatelessWidget {
9 | @override
10 | Widget build(BuildContext context) {
11 | return Column(
12 | children: [
13 |
14 | Container(
15 | color: BrandColors.colorPrimary,
16 | width: double.infinity,
17 | child: Padding(
18 | padding: EdgeInsets.symmetric(vertical: 70),
19 | child: Column(
20 | children: [
21 |
22 | Text('Total Earnings', style: TextStyle(color: Colors.white),),
23 | Text('\$${Provider.of(context).earnings}', style: TextStyle(color: Colors.white, fontSize: 40, fontFamily: 'Brand-Bold'),)
24 | ],
25 | ),
26 | ),
27 | ),
28 |
29 | FlatButton(
30 | padding: EdgeInsets.all(0),
31 | onPressed: (){
32 | Navigator.push(context, MaterialPageRoute(builder: (context)=> HistoryPage()));
33 | },
34 |
35 | child: Padding(
36 | padding: EdgeInsets.symmetric(horizontal: 30, vertical: 18),
37 | child: Row(
38 | children: [
39 | Image.asset('images/taxi.png', width: 70,),
40 | SizedBox(width: 16,),
41 | Text('Trips', style: TextStyle(fontSize: 16), ),
42 | Expanded(child: Container(child: Text(Provider.of(context).tripCount.toString(), textAlign: TextAlign.end, style: TextStyle(fontSize: 18),))),
43 | ],
44 | ),
45 | ),
46 |
47 | ),
48 |
49 | BrandDivider(),
50 |
51 | ],
52 | );
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/lib/tabs/hometab.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:cabdriver/brand_colors.dart';
4 | import 'package:cabdriver/datamodels/driver.dart';
5 | import 'package:cabdriver/globalvariabels.dart';
6 | import 'package:cabdriver/helpers/helpermethods.dart';
7 | import 'package:cabdriver/helpers/pushnotificationservice.dart';
8 | import 'package:cabdriver/widgets/AvailabilityButton.dart';
9 | import 'package:cabdriver/widgets/ConfirmSheet.dart';
10 | import 'package:cabdriver/widgets/NotificationDialog.dart';
11 | import 'package:cabdriver/widgets/TaxiButton.dart';
12 | import 'package:firebase_auth/firebase_auth.dart';
13 | import 'package:firebase_database/firebase_database.dart';
14 | import 'package:flutter/material.dart';
15 | import 'package:flutter_geofire/flutter_geofire.dart';
16 | import 'package:geolocator/geolocator.dart';
17 | import 'package:google_maps_flutter/google_maps_flutter.dart';
18 |
19 | class HomeTab extends StatefulWidget {
20 | @override
21 | _HomeTabState createState() => _HomeTabState();
22 | }
23 |
24 | class _HomeTabState extends State {
25 |
26 | GoogleMapController mapController;
27 | Completer _controller = Completer();
28 |
29 | DatabaseReference tripRequestRef;
30 |
31 | var geoLocator = Geolocator();
32 | var locationOptions = LocationOptions(accuracy: LocationAccuracy.bestForNavigation, distanceFilter: 4);
33 |
34 | String availabilityTitle = 'GO ONLINE';
35 | Color availabilityColor = BrandColors.colorOrange;
36 |
37 | bool isAvailable = false;
38 |
39 |
40 | void getCurrentPosition() async {
41 |
42 | Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.bestForNavigation);
43 | currentPosition = position;
44 | LatLng pos = LatLng(position.latitude, position.longitude);
45 | mapController.animateCamera(CameraUpdate.newLatLng(pos));
46 |
47 | }
48 |
49 | void getCurrentDriverInfo () async {
50 |
51 | currentFirebaseUser = await FirebaseAuth.instance.currentUser();
52 | DatabaseReference driverRef = FirebaseDatabase.instance.reference().child('drivers/${currentFirebaseUser.uid}');
53 | driverRef.once().then((DataSnapshot snapshot){
54 |
55 | if(snapshot.value != null){
56 | currentDriverInfo = Driver.fromSnapshot(snapshot);
57 | print(currentDriverInfo.fullName);
58 | }
59 |
60 | });
61 |
62 | PushNotificationService pushNotificationService = PushNotificationService();
63 |
64 | pushNotificationService.initialize(context);
65 | pushNotificationService.getToken();
66 |
67 | HelperMethods.getHistoryInfo(context);
68 | }
69 |
70 | @override
71 | void initState() {
72 | // TODO: implement initState
73 | super.initState();
74 | getCurrentDriverInfo();
75 | }
76 |
77 | @override
78 | Widget build(BuildContext context) {
79 | return Stack(
80 | children: [
81 | GoogleMap(
82 | padding: EdgeInsets.only(top: 135),
83 | myLocationEnabled: true,
84 | myLocationButtonEnabled: true,
85 | mapType: MapType.normal,
86 | initialCameraPosition: googlePlex,
87 | onMapCreated: (GoogleMapController controller){
88 | _controller.complete(controller);
89 | mapController = controller;
90 |
91 | getCurrentPosition();
92 | },
93 | ),
94 | Container(
95 | height: 135,
96 | width: double.infinity,
97 | color: BrandColors.colorPrimary,
98 | ),
99 |
100 | Positioned(
101 | top: 60,
102 | left: 0,
103 | right: 0,
104 | child: Row(
105 | mainAxisAlignment: MainAxisAlignment.center,
106 | children: [
107 | AvailabilityButton(
108 | title: availabilityTitle,
109 | color: availabilityColor,
110 | onPressed: (){
111 |
112 |
113 | showModalBottomSheet(
114 | isDismissible: false,
115 | context: context,
116 | builder: (BuildContext context) => ConfirmSheet(
117 | title: (!isAvailable) ? 'GO ONLINE' : 'GO OFFLINE',
118 | subtitle: (!isAvailable) ? 'You are about to become available to receive trip requests': 'you will stop receiving new trip requests',
119 |
120 | onPressed: (){
121 |
122 | if(!isAvailable){
123 | GoOnline();
124 | getLocationUpdates();
125 | Navigator.pop(context);
126 |
127 | setState(() {
128 | availabilityColor = BrandColors.colorGreen;
129 | availabilityTitle = 'GO OFFLINE';
130 | isAvailable = true;
131 | });
132 |
133 | }
134 | else{
135 |
136 | GoOffline();
137 | Navigator.pop(context);
138 | setState(() {
139 | availabilityColor = BrandColors.colorOrange;
140 | availabilityTitle = 'GO ONLINE';
141 | isAvailable = false;
142 | });
143 | }
144 |
145 | },
146 | ),
147 | );
148 |
149 | },
150 | ),
151 | ],
152 | ),
153 | )
154 |
155 | ],
156 | );
157 | }
158 |
159 | void GoOnline(){
160 | Geofire.initialize('driversAvailable');
161 | Geofire.setLocation(currentFirebaseUser.uid, currentPosition.latitude, currentPosition.longitude);
162 |
163 | tripRequestRef = FirebaseDatabase.instance.reference().child('drivers/${currentFirebaseUser.uid}/newtrip');
164 | tripRequestRef.set('waiting');
165 |
166 | tripRequestRef.onValue.listen((event) {
167 |
168 | });
169 |
170 | }
171 |
172 | void GoOffline (){
173 |
174 | Geofire.removeLocation(currentFirebaseUser.uid);
175 | tripRequestRef.onDisconnect();
176 | tripRequestRef.remove();
177 | tripRequestRef = null;
178 |
179 | }
180 |
181 | void getLocationUpdates(){
182 |
183 | homeTabPositionStream = geoLocator.getPositionStream(locationOptions).listen((Position position) {
184 | currentPosition = position;
185 |
186 | if(isAvailable){
187 | Geofire.setLocation(currentFirebaseUser.uid, position.latitude, position.longitude);
188 | }
189 |
190 | LatLng pos = LatLng(position.latitude, position.longitude);
191 | mapController.animateCamera(CameraUpdate.newLatLng(pos));
192 |
193 | });
194 |
195 | }
196 | }
197 |
--------------------------------------------------------------------------------
/lib/tabs/profiletab.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class ProfileTab extends StatelessWidget {
4 | @override
5 | Widget build(BuildContext context) {
6 | return Center(child: Text('Hello Profile'));
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/lib/tabs/ratingstab.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class RatingsTab extends StatelessWidget {
4 | @override
5 | Widget build(BuildContext context) {
6 | return Center(child: Text('Hello Ratings'));
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/lib/widgets/AvailabilityButton.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class AvailabilityButton extends StatelessWidget {
4 |
5 | final String title;
6 | final Color color;
7 | final Function onPressed;
8 |
9 | AvailabilityButton({this.title, this.onPressed, this.color});
10 |
11 | @override
12 | Widget build(BuildContext context) {
13 | return RaisedButton(
14 | onPressed: onPressed,
15 | shape: new RoundedRectangleBorder(
16 | borderRadius: new BorderRadius.circular(25)
17 | ),
18 | color: color,
19 | textColor: Colors.white,
20 | child: Container(
21 | height: 50,
22 | width: 200,
23 | child: Center(
24 | child: Text(
25 | title,
26 | style: TextStyle(fontSize: 20, fontFamily: 'Brand-Bold'),
27 | ),
28 | ),
29 | ),
30 | );
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/lib/widgets/BrandDivier.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class BrandDivider extends StatelessWidget {
4 | @override
5 | Widget build(BuildContext context) {
6 | return Divider(height: 1.0, color: Color(0xFFe2e2e2), thickness: 1.0,);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/lib/widgets/CollectPaymentDialog.dart:
--------------------------------------------------------------------------------
1 | import 'package:cabdriver/brand_colors.dart';
2 | import 'package:cabdriver/helpers/helpermethods.dart';
3 | import 'package:cabdriver/widgets/BrandDivier.dart';
4 | import 'package:cabdriver/widgets/TaxiButton.dart';
5 | import 'package:flutter/material.dart';
6 |
7 | class CollectPayment extends StatelessWidget {
8 |
9 | final String paymentMethod;
10 | final int fares;
11 |
12 | CollectPayment({this.paymentMethod, this.fares});
13 |
14 |
15 | @override
16 | Widget build(BuildContext context) {
17 | return Dialog(
18 | shape: RoundedRectangleBorder(
19 | borderRadius: BorderRadius.circular(10)
20 | ),
21 | backgroundColor: Colors.transparent,
22 | child: Container(
23 | margin: EdgeInsets.all(4.0),
24 | width: double.infinity,
25 | decoration: BoxDecoration(
26 | color: Colors.white,
27 | borderRadius: BorderRadius.circular(4)
28 | ),
29 | child: Column(
30 | mainAxisSize: MainAxisSize.min,
31 | children: [
32 |
33 | SizedBox(height: 20,),
34 |
35 | Text('${paymentMethod.toUpperCase()} PAYMENT'),
36 |
37 | SizedBox(height: 20,),
38 |
39 | BrandDivider(),
40 |
41 | SizedBox(height: 16.0,),
42 |
43 | Text('\$$fares', style: TextStyle(fontFamily: 'Brand-Bold', fontSize: 50),),
44 |
45 | SizedBox(height: 16,),
46 |
47 | Padding(
48 | padding: const EdgeInsets.symmetric(horizontal: 20),
49 | child: Text('Amount above is the total fares to be charged to the rider', textAlign: TextAlign.center,),
50 | ),
51 |
52 | SizedBox(height: 30,),
53 |
54 | Container(
55 | width: 230,
56 | child: TaxiButton(
57 | title: (paymentMethod == 'cash') ? 'COLLECT CASH' : 'CONFIRM',
58 | color: BrandColors.colorGreen,
59 | onPressed: (){
60 |
61 | Navigator.pop(context);
62 | Navigator.pop(context);
63 |
64 | HelperMethods.enableHomTabLocationUpdates();
65 |
66 | },
67 | ),
68 | ),
69 |
70 | SizedBox(height: 40,)
71 | ],
72 | ),
73 | ),
74 | );
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/lib/widgets/ConfirmSheet.dart:
--------------------------------------------------------------------------------
1 | import 'package:cabdriver/brand_colors.dart';
2 | import 'package:cabdriver/widgets/TaxiButton.dart';
3 | import 'package:cabdriver/widgets/TaxiOutlineButton.dart';
4 | import 'package:flutter/material.dart';
5 |
6 | class ConfirmSheet extends StatelessWidget {
7 |
8 | final String title;
9 | final String subtitle;
10 | final Function onPressed;
11 |
12 | ConfirmSheet({this.title, this.subtitle, this.onPressed});
13 |
14 | @override
15 | Widget build(BuildContext context) {
16 | return Container(
17 | decoration: BoxDecoration(
18 | color: Colors.white,
19 | boxShadow: [
20 | BoxShadow(
21 | color: Colors.black26,
22 | blurRadius: 15.0, // soften the shadow
23 | spreadRadius: 0.5, //extend the shadow
24 | offset: Offset(
25 | 0.7, // Move to right 10 horizontally
26 | 0.7, // Move to bottom 10 Vertically
27 | ),
28 | )
29 | ],
30 |
31 | ),
32 | height: 220,
33 | child: Padding(
34 | padding: EdgeInsets.symmetric(horizontal: 24, vertical: 18),
35 | child: Column(
36 | children: [
37 |
38 | SizedBox(height: 10,),
39 |
40 | Text(
41 | title,
42 | textAlign: TextAlign.center,
43 | style: TextStyle(fontSize: 22, fontFamily: 'Brand-Bold', color: BrandColors.colorText),
44 | ),
45 |
46 | SizedBox(height: 20,),
47 |
48 | Text(
49 | subtitle,
50 | textAlign: TextAlign.center,
51 | style: TextStyle(color: BrandColors.colorTextLight),
52 | ),
53 |
54 | SizedBox(height: 24,),
55 |
56 | Row(
57 | children: [
58 |
59 | Expanded(
60 | child: Container(
61 | child: TaxiOutlineButton(
62 | title: 'BACK',
63 | color: BrandColors.colorLightGrayFair,
64 | onPressed: (){
65 | Navigator.pop(context);
66 | },
67 | ),
68 | ),
69 | ),
70 |
71 | SizedBox(width: 16,),
72 |
73 | Expanded(
74 | child: Container(
75 | child: TaxiButton(
76 | onPressed: onPressed,
77 | color: (title == 'GO ONLINE') ? BrandColors.colorGreen : Colors.red,
78 | title: 'CONFIRM',
79 | ),
80 | ),
81 | ),
82 |
83 |
84 |
85 | ],
86 | )
87 |
88 | ],
89 | ),
90 | ),
91 | );
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/lib/widgets/HistoryTile.dart:
--------------------------------------------------------------------------------
1 | import 'package:cabdriver/brand_colors.dart';
2 | import 'package:cabdriver/datamodels/history.dart';
3 | import 'package:cabdriver/helpers/helpermethods.dart';
4 | import 'package:flutter/material.dart';
5 |
6 |
7 | class HistoryTile extends StatelessWidget {
8 |
9 | final History history;
10 | HistoryTile({this.history});
11 |
12 | @override
13 | Widget build(BuildContext context) {
14 | return Padding(
15 | padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
16 | child: Column(
17 | children: [
18 |
19 | Column(
20 | crossAxisAlignment: CrossAxisAlignment.start,
21 | children: [
22 |
23 | Container(
24 | child: Row(
25 | children: [
26 |
27 | Image.asset('images/pickicon.png', height: 16, width: 16,),
28 | SizedBox(width: 18,),
29 | Expanded(child: Container(child: Text(history.pickup, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 18),))),
30 | SizedBox(width: 5,),
31 |
32 | Text('\$${history.fares}', style: TextStyle(fontFamily: 'Brand-Bold', fontSize: 16, color: BrandColors.colorPrimary),),
33 | ],
34 | ),
35 | ),
36 |
37 | SizedBox(height: 8,),
38 |
39 | Row(
40 | mainAxisSize: MainAxisSize.max,
41 | children: [
42 | Image.asset('images/desticon.png', height: 16, width: 16,),
43 | SizedBox(width: 18,),
44 |
45 | Text(history.destination, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 18),),
46 |
47 |
48 | ],
49 | ),
50 |
51 | SizedBox(height: 15,),
52 |
53 | Text(HelperMethods.formatMyDate(history.createdAt), style: TextStyle(color: BrandColors.colorTextLight),),
54 | ],
55 | ),
56 |
57 |
58 | ],
59 | ),
60 | );
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/lib/widgets/NotificationDialog.dart:
--------------------------------------------------------------------------------
1 | import 'package:cabdriver/brand_colors.dart';
2 | import 'package:cabdriver/datamodels/tripdetails.dart';
3 | import 'package:cabdriver/globalvariabels.dart';
4 | import 'package:cabdriver/helpers/helpermethods.dart';
5 | import 'package:cabdriver/screens/newtripspage.dart';
6 | import 'package:cabdriver/widgets/BrandDivier.dart';
7 | import 'package:cabdriver/widgets/ProgressDialog.dart';
8 | import 'package:cabdriver/widgets/TaxiButton.dart';
9 | import 'package:cabdriver/widgets/TaxiOutlineButton.dart';
10 | import 'package:firebase_database/firebase_database.dart';
11 | import 'package:flutter/material.dart';
12 | import 'package:toast/toast.dart';
13 |
14 | class NotificationDialog extends StatelessWidget {
15 |
16 | final TripDetails tripDetails;
17 |
18 | NotificationDialog({this.tripDetails});
19 |
20 | @override
21 | Widget build(BuildContext context) {
22 | return Dialog(
23 | shape: RoundedRectangleBorder(
24 | borderRadius: BorderRadius.circular(10.0),
25 | ),
26 | elevation: 0.0,
27 | backgroundColor: Colors.transparent,
28 | child: Container(
29 | margin: EdgeInsets.all(4),
30 | width: double.infinity,
31 | decoration: BoxDecoration(
32 | color: Colors.white,
33 | borderRadius: BorderRadius.circular(4)
34 | ),
35 | child: Column(
36 | mainAxisSize: MainAxisSize.min,
37 | children: [
38 |
39 | SizedBox(height: 30.0,),
40 |
41 | Image.asset('images/taxi.png', width: 100,),
42 |
43 | SizedBox(height: 16.0,),
44 |
45 | Text('NEW TRIP REQUEST', style: TextStyle(fontFamily: 'Brand-Bold', fontSize: 18),),
46 |
47 | SizedBox(height: 30.0,),
48 |
49 | Padding(
50 | padding: EdgeInsets.all(16.0),
51 | child: Column(
52 |
53 | children: [
54 |
55 | Row(
56 | crossAxisAlignment: CrossAxisAlignment.start,
57 | children: [
58 | Image.asset('images/pickicon.png', height: 16, width: 16,),
59 | SizedBox(width: 18,),
60 |
61 | Expanded(child: Container(child: Text(tripDetails.pickupAddress, style: TextStyle(fontSize: 18),)))
62 |
63 |
64 | ],
65 | ),
66 |
67 | SizedBox(height: 15,),
68 |
69 | Row(
70 | crossAxisAlignment: CrossAxisAlignment.start,
71 | children: [
72 | Image.asset('images/desticon.png', height: 16, width: 16,),
73 | SizedBox(width: 18,),
74 |
75 | Expanded(child: Container(child: Text(tripDetails.destinationAddress, style: TextStyle(fontSize: 18),)))
76 |
77 |
78 | ],
79 | ),
80 |
81 | ],
82 | ),
83 | ),
84 |
85 | SizedBox(height: 20,),
86 |
87 | BrandDivider(),
88 |
89 | SizedBox(height: 8,),
90 |
91 | Padding(
92 | padding: EdgeInsets.all(20.0),
93 | child: Row(
94 | mainAxisAlignment: MainAxisAlignment.center,
95 | children: [
96 |
97 | Expanded(
98 | child: Container(
99 | child: TaxiOutlineButton(
100 | title: 'DECLINE',
101 | color: BrandColors.colorPrimary,
102 | onPressed: () async {
103 | assetsAudioPlayer.stop();
104 | Navigator.pop(context);
105 | },
106 | ),
107 | ),
108 | ),
109 |
110 | SizedBox(width: 10,),
111 |
112 | Expanded(
113 | child: Container(
114 | child: TaxiButton(
115 | title: 'ACCEPT',
116 | color: BrandColors.colorGreen,
117 | onPressed: () async {
118 | assetsAudioPlayer.stop();
119 | checkAvailablity(context);
120 | },
121 | ),
122 | ),
123 | ),
124 |
125 | ],
126 | ),
127 | ),
128 |
129 | SizedBox(height: 10.0,),
130 |
131 | ],
132 | ),
133 | ),
134 | );
135 | }
136 |
137 | void checkAvailablity(context){
138 |
139 | //show please wait dialog
140 | showDialog(
141 | barrierDismissible: false,
142 | context: context,
143 | builder: (BuildContext context) => ProgressDialog(status: 'Accepting request',),
144 | );
145 |
146 | DatabaseReference newRideRef = FirebaseDatabase.instance.reference().child('drivers/${currentFirebaseUser.uid}/newtrip');
147 | newRideRef.once().then((DataSnapshot snapshot) {
148 |
149 | Navigator.pop(context);
150 | Navigator.pop(context);
151 |
152 | String thisRideID = "";
153 | if(snapshot.value != null){
154 | thisRideID = snapshot.value.toString();
155 | }
156 | else{
157 | Toast.show("Ride not found", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
158 | }
159 |
160 | if(thisRideID == tripDetails.rideID){
161 | newRideRef.set('accepted');
162 | HelperMethods.disableHomTabLocationUpdates();
163 | Navigator.push(
164 | context,
165 | MaterialPageRoute(builder: (context) => NewTripPage(tripDetails: tripDetails,),
166 | ));
167 | }
168 | else if(thisRideID == 'cancelled'){
169 | Toast.show("Ride has been cancelled", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
170 | }
171 | else if(thisRideID == 'timeout'){
172 | Toast.show("Ride has timed out", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
173 | }
174 | else{
175 | Toast.show("Ride not found", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
176 | }
177 |
178 | });
179 | }
180 |
181 | }
182 |
--------------------------------------------------------------------------------
/lib/widgets/ProgressDialog.dart:
--------------------------------------------------------------------------------
1 | import 'package:cabdriver/brand_colors.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | class ProgressDialog extends StatelessWidget {
5 |
6 | final String status;
7 | ProgressDialog({this.status});
8 |
9 | @override
10 | Widget build(BuildContext context) {
11 | return Dialog(
12 | shape: RoundedRectangleBorder(
13 | borderRadius: BorderRadius.circular(10.0)
14 | ),
15 | backgroundColor: Colors.transparent,
16 | child: Container(
17 | margin: EdgeInsets.all(16.0),
18 | width: double.infinity,
19 | decoration: BoxDecoration(
20 | color: Colors.white,
21 | borderRadius: BorderRadius.circular(4)
22 | ),
23 | child: Padding(
24 | padding: EdgeInsets.all(16),
25 | child: Row(
26 | children: [
27 | SizedBox(width: 5,),
28 |
29 | CircularProgressIndicator(valueColor: AlwaysStoppedAnimation(BrandColors.colorAccent),),
30 | SizedBox(width: 25.0,),
31 | Text(status, style: TextStyle(fontSize: 15),),
32 | ],
33 | ),
34 | ),
35 | ),
36 | );
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/lib/widgets/TaxiButton.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class TaxiButton extends StatelessWidget {
4 |
5 | final String title;
6 | final Color color;
7 | final Function onPressed;
8 |
9 | TaxiButton({this.title, this.onPressed, this.color});
10 |
11 | @override
12 | Widget build(BuildContext context) {
13 | return RaisedButton(
14 | onPressed: onPressed,
15 | shape: new RoundedRectangleBorder(
16 | borderRadius: new BorderRadius.circular(25)
17 | ),
18 | color: color,
19 | textColor: Colors.white,
20 | child: Container(
21 | height: 50,
22 | child: Center(
23 | child: Text(
24 | title,
25 | style: TextStyle(fontSize: 18, fontFamily: 'Brand-Bold'),
26 | ),
27 | ),
28 | ),
29 | );
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/lib/widgets/TaxiOutlineButton.dart:
--------------------------------------------------------------------------------
1 | import 'package:cabdriver/brand_colors.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | class TaxiOutlineButton extends StatelessWidget {
5 |
6 | final String title;
7 | final Function onPressed;
8 | final Color color;
9 |
10 | TaxiOutlineButton({this.title, this.onPressed, this.color});
11 |
12 | @override
13 | Widget build(BuildContext context) {
14 | return OutlineButton(
15 | borderSide: BorderSide(color: color),
16 | shape: new RoundedRectangleBorder(
17 | borderRadius: new BorderRadius.circular(25.0),
18 | ),
19 | onPressed: onPressed,
20 | color: color,
21 | textColor: color,
22 | child: Container(
23 | height: 50.0,
24 | child: Center(
25 | child: Text(title,
26 | style: TextStyle(fontSize: 15.0, fontFamily: 'Brand-Bold', color: BrandColors.colorText)),
27 | ),
28 | )
29 | );
30 | }
31 | }
32 |
33 |
34 |
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://dart.dev/tools/pub/glossary#lockfile
3 | packages:
4 | animated_text_kit:
5 | dependency: "direct main"
6 | description:
7 | name: animated_text_kit
8 | url: "https://pub.dartlang.org"
9 | source: hosted
10 | version: "2.1.0"
11 | assets_audio_player:
12 | dependency: "direct main"
13 | description:
14 | name: assets_audio_player
15 | url: "https://pub.dartlang.org"
16 | source: hosted
17 | version: "2.0.1+7"
18 | assets_audio_player_web:
19 | dependency: transitive
20 | description:
21 | name: assets_audio_player_web
22 | url: "https://pub.dartlang.org"
23 | source: hosted
24 | version: "2.0.1+7"
25 | async:
26 | dependency: transitive
27 | description:
28 | name: async
29 | url: "https://pub.dartlang.org"
30 | source: hosted
31 | version: "2.4.2"
32 | boolean_selector:
33 | dependency: transitive
34 | description:
35 | name: boolean_selector
36 | url: "https://pub.dartlang.org"
37 | source: hosted
38 | version: "2.0.0"
39 | characters:
40 | dependency: transitive
41 | description:
42 | name: characters
43 | url: "https://pub.dartlang.org"
44 | source: hosted
45 | version: "1.0.0"
46 | charcode:
47 | dependency: transitive
48 | description:
49 | name: charcode
50 | url: "https://pub.dartlang.org"
51 | source: hosted
52 | version: "1.1.3"
53 | clock:
54 | dependency: transitive
55 | description:
56 | name: clock
57 | url: "https://pub.dartlang.org"
58 | source: hosted
59 | version: "1.0.1"
60 | collection:
61 | dependency: transitive
62 | description:
63 | name: collection
64 | url: "https://pub.dartlang.org"
65 | source: hosted
66 | version: "1.14.13"
67 | connectivity:
68 | dependency: "direct main"
69 | description:
70 | name: connectivity
71 | url: "https://pub.dartlang.org"
72 | source: hosted
73 | version: "0.4.8+6"
74 | connectivity_macos:
75 | dependency: transitive
76 | description:
77 | name: connectivity_macos
78 | url: "https://pub.dartlang.org"
79 | source: hosted
80 | version: "0.1.0+3"
81 | connectivity_platform_interface:
82 | dependency: transitive
83 | description:
84 | name: connectivity_platform_interface
85 | url: "https://pub.dartlang.org"
86 | source: hosted
87 | version: "1.0.6"
88 | convert:
89 | dependency: transitive
90 | description:
91 | name: convert
92 | url: "https://pub.dartlang.org"
93 | source: hosted
94 | version: "2.1.1"
95 | crypto:
96 | dependency: transitive
97 | description:
98 | name: crypto
99 | url: "https://pub.dartlang.org"
100 | source: hosted
101 | version: "2.1.4"
102 | cupertino_icons:
103 | dependency: "direct main"
104 | description:
105 | name: cupertino_icons
106 | url: "https://pub.dartlang.org"
107 | source: hosted
108 | version: "0.1.3"
109 | equatable:
110 | dependency: transitive
111 | description:
112 | name: equatable
113 | url: "https://pub.dartlang.org"
114 | source: hosted
115 | version: "1.1.1"
116 | fake_async:
117 | dependency: transitive
118 | description:
119 | name: fake_async
120 | url: "https://pub.dartlang.org"
121 | source: hosted
122 | version: "1.1.0"
123 | file:
124 | dependency: transitive
125 | description:
126 | name: file
127 | url: "https://pub.dartlang.org"
128 | source: hosted
129 | version: "5.1.0"
130 | firebase:
131 | dependency: transitive
132 | description:
133 | name: firebase
134 | url: "https://pub.dartlang.org"
135 | source: hosted
136 | version: "7.3.0"
137 | firebase_auth:
138 | dependency: "direct main"
139 | description:
140 | name: firebase_auth
141 | url: "https://pub.dartlang.org"
142 | source: hosted
143 | version: "0.16.1"
144 | firebase_auth_platform_interface:
145 | dependency: transitive
146 | description:
147 | name: firebase_auth_platform_interface
148 | url: "https://pub.dartlang.org"
149 | source: hosted
150 | version: "1.1.8"
151 | firebase_auth_web:
152 | dependency: transitive
153 | description:
154 | name: firebase_auth_web
155 | url: "https://pub.dartlang.org"
156 | source: hosted
157 | version: "0.1.3+1"
158 | firebase_core:
159 | dependency: "direct main"
160 | description:
161 | name: firebase_core
162 | url: "https://pub.dartlang.org"
163 | source: hosted
164 | version: "0.4.5"
165 | firebase_core_platform_interface:
166 | dependency: transitive
167 | description:
168 | name: firebase_core_platform_interface
169 | url: "https://pub.dartlang.org"
170 | source: hosted
171 | version: "1.0.4"
172 | firebase_core_web:
173 | dependency: transitive
174 | description:
175 | name: firebase_core_web
176 | url: "https://pub.dartlang.org"
177 | source: hosted
178 | version: "0.1.1+2"
179 | firebase_database:
180 | dependency: "direct main"
181 | description:
182 | name: firebase_database
183 | url: "https://pub.dartlang.org"
184 | source: hosted
185 | version: "3.1.6"
186 | firebase_messaging:
187 | dependency: "direct main"
188 | description:
189 | name: firebase_messaging
190 | url: "https://pub.dartlang.org"
191 | source: hosted
192 | version: "6.0.16"
193 | flutter:
194 | dependency: "direct main"
195 | description: flutter
196 | source: sdk
197 | version: "0.0.0"
198 | flutter_geofire:
199 | dependency: "direct main"
200 | description:
201 | name: flutter_geofire
202 | url: "https://pub.dartlang.org"
203 | source: hosted
204 | version: "1.0.3"
205 | flutter_plugin_android_lifecycle:
206 | dependency: transitive
207 | description:
208 | name: flutter_plugin_android_lifecycle
209 | url: "https://pub.dartlang.org"
210 | source: hosted
211 | version: "1.0.8"
212 | flutter_polyline_points:
213 | dependency: "direct main"
214 | description:
215 | name: flutter_polyline_points
216 | url: "https://pub.dartlang.org"
217 | source: hosted
218 | version: "0.2.1"
219 | flutter_test:
220 | dependency: "direct dev"
221 | description: flutter
222 | source: sdk
223 | version: "0.0.0"
224 | flutter_web_plugins:
225 | dependency: transitive
226 | description: flutter
227 | source: sdk
228 | version: "0.0.0"
229 | font_awesome_flutter:
230 | dependency: "direct main"
231 | description:
232 | name: font_awesome_flutter
233 | url: "https://pub.dartlang.org"
234 | source: hosted
235 | version: "8.8.1"
236 | geolocator:
237 | dependency: "direct main"
238 | description:
239 | name: geolocator
240 | url: "https://pub.dartlang.org"
241 | source: hosted
242 | version: "5.3.1"
243 | google_api_availability:
244 | dependency: transitive
245 | description:
246 | name: google_api_availability
247 | url: "https://pub.dartlang.org"
248 | source: hosted
249 | version: "2.0.4"
250 | google_maps_flutter:
251 | dependency: "direct main"
252 | description:
253 | name: google_maps_flutter
254 | url: "https://pub.dartlang.org"
255 | source: hosted
256 | version: "0.5.28+1"
257 | google_maps_flutter_platform_interface:
258 | dependency: transitive
259 | description:
260 | name: google_maps_flutter_platform_interface
261 | url: "https://pub.dartlang.org"
262 | source: hosted
263 | version: "1.0.2"
264 | http:
265 | dependency: "direct main"
266 | description:
267 | name: http
268 | url: "https://pub.dartlang.org"
269 | source: hosted
270 | version: "0.12.1"
271 | http_parser:
272 | dependency: transitive
273 | description:
274 | name: http_parser
275 | url: "https://pub.dartlang.org"
276 | source: hosted
277 | version: "3.1.4"
278 | intl:
279 | dependency: "direct main"
280 | description:
281 | name: intl
282 | url: "https://pub.dartlang.org"
283 | source: hosted
284 | version: "0.16.1"
285 | js:
286 | dependency: transitive
287 | description:
288 | name: js
289 | url: "https://pub.dartlang.org"
290 | source: hosted
291 | version: "0.6.1+1"
292 | location_permissions:
293 | dependency: transitive
294 | description:
295 | name: location_permissions
296 | url: "https://pub.dartlang.org"
297 | source: hosted
298 | version: "2.0.5"
299 | maps_toolkit:
300 | dependency: "direct main"
301 | description:
302 | name: maps_toolkit
303 | url: "https://pub.dartlang.org"
304 | source: hosted
305 | version: "1.1.0+1"
306 | matcher:
307 | dependency: transitive
308 | description:
309 | name: matcher
310 | url: "https://pub.dartlang.org"
311 | source: hosted
312 | version: "0.12.8"
313 | meta:
314 | dependency: transitive
315 | description:
316 | name: meta
317 | url: "https://pub.dartlang.org"
318 | source: hosted
319 | version: "1.1.8"
320 | nested:
321 | dependency: transitive
322 | description:
323 | name: nested
324 | url: "https://pub.dartlang.org"
325 | source: hosted
326 | version: "0.0.4"
327 | outline_material_icons:
328 | dependency: "direct main"
329 | description:
330 | name: outline_material_icons
331 | url: "https://pub.dartlang.org"
332 | source: hosted
333 | version: "0.1.1"
334 | path:
335 | dependency: transitive
336 | description:
337 | name: path
338 | url: "https://pub.dartlang.org"
339 | source: hosted
340 | version: "1.7.0"
341 | path_provider:
342 | dependency: transitive
343 | description:
344 | name: path_provider
345 | url: "https://pub.dartlang.org"
346 | source: hosted
347 | version: "1.6.10"
348 | path_provider_linux:
349 | dependency: transitive
350 | description:
351 | name: path_provider_linux
352 | url: "https://pub.dartlang.org"
353 | source: hosted
354 | version: "0.0.1+1"
355 | path_provider_macos:
356 | dependency: transitive
357 | description:
358 | name: path_provider_macos
359 | url: "https://pub.dartlang.org"
360 | source: hosted
361 | version: "0.0.4+3"
362 | path_provider_platform_interface:
363 | dependency: transitive
364 | description:
365 | name: path_provider_platform_interface
366 | url: "https://pub.dartlang.org"
367 | source: hosted
368 | version: "1.0.2"
369 | pedantic:
370 | dependency: transitive
371 | description:
372 | name: pedantic
373 | url: "https://pub.dartlang.org"
374 | source: hosted
375 | version: "1.9.0"
376 | platform:
377 | dependency: transitive
378 | description:
379 | name: platform
380 | url: "https://pub.dartlang.org"
381 | source: hosted
382 | version: "2.2.1"
383 | plugin_platform_interface:
384 | dependency: transitive
385 | description:
386 | name: plugin_platform_interface
387 | url: "https://pub.dartlang.org"
388 | source: hosted
389 | version: "1.0.2"
390 | process:
391 | dependency: transitive
392 | description:
393 | name: process
394 | url: "https://pub.dartlang.org"
395 | source: hosted
396 | version: "3.0.13"
397 | provider:
398 | dependency: "direct main"
399 | description:
400 | name: provider
401 | url: "https://pub.dartlang.org"
402 | source: hosted
403 | version: "4.1.2"
404 | quiver:
405 | dependency: transitive
406 | description:
407 | name: quiver
408 | url: "https://pub.dartlang.org"
409 | source: hosted
410 | version: "2.1.3"
411 | rxdart:
412 | dependency: transitive
413 | description:
414 | name: rxdart
415 | url: "https://pub.dartlang.org"
416 | source: hosted
417 | version: "0.24.1"
418 | sky_engine:
419 | dependency: transitive
420 | description: flutter
421 | source: sdk
422 | version: "0.0.99"
423 | source_span:
424 | dependency: transitive
425 | description:
426 | name: source_span
427 | url: "https://pub.dartlang.org"
428 | source: hosted
429 | version: "1.7.0"
430 | stack_trace:
431 | dependency: transitive
432 | description:
433 | name: stack_trace
434 | url: "https://pub.dartlang.org"
435 | source: hosted
436 | version: "1.9.5"
437 | stream_channel:
438 | dependency: transitive
439 | description:
440 | name: stream_channel
441 | url: "https://pub.dartlang.org"
442 | source: hosted
443 | version: "2.0.0"
444 | stream_transform:
445 | dependency: transitive
446 | description:
447 | name: stream_transform
448 | url: "https://pub.dartlang.org"
449 | source: hosted
450 | version: "1.2.0"
451 | string_scanner:
452 | dependency: transitive
453 | description:
454 | name: string_scanner
455 | url: "https://pub.dartlang.org"
456 | source: hosted
457 | version: "1.0.5"
458 | term_glyph:
459 | dependency: transitive
460 | description:
461 | name: term_glyph
462 | url: "https://pub.dartlang.org"
463 | source: hosted
464 | version: "1.1.0"
465 | test_api:
466 | dependency: transitive
467 | description:
468 | name: test_api
469 | url: "https://pub.dartlang.org"
470 | source: hosted
471 | version: "0.2.17"
472 | toast:
473 | dependency: "direct main"
474 | description:
475 | name: toast
476 | url: "https://pub.dartlang.org"
477 | source: hosted
478 | version: "0.1.5"
479 | typed_data:
480 | dependency: transitive
481 | description:
482 | name: typed_data
483 | url: "https://pub.dartlang.org"
484 | source: hosted
485 | version: "1.2.0"
486 | uuid:
487 | dependency: transitive
488 | description:
489 | name: uuid
490 | url: "https://pub.dartlang.org"
491 | source: hosted
492 | version: "2.0.4"
493 | vector_math:
494 | dependency: transitive
495 | description:
496 | name: vector_math
497 | url: "https://pub.dartlang.org"
498 | source: hosted
499 | version: "2.0.8"
500 | xdg_directories:
501 | dependency: transitive
502 | description:
503 | name: xdg_directories
504 | url: "https://pub.dartlang.org"
505 | source: hosted
506 | version: "0.1.0"
507 | sdks:
508 | dart: ">=2.9.0-14.0.dev <3.0.0"
509 | flutter: ">=1.16.3 <2.0.0"
510 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: cabdriver
2 | description: A new Flutter application.
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 | flutter:
25 | sdk: flutter
26 |
27 |
28 | # The following adds the Cupertino Icons font to your application.
29 | # Use with the CupertinoIcons class for iOS style icons.
30 | cupertino_icons: ^0.1.3
31 | firebase_core: ^0.4.4+3
32 | firebase_auth: ^0.16.0
33 | firebase_database: ^3.1.5
34 | connectivity: ^0.4.8+6
35 | google_maps_flutter: ^0.5.28
36 | outline_material_icons: ^0.1.1
37 | geolocator: ^5.3.1
38 | http: ^0.12.1
39 | provider: ^4.1.2
40 | flutter_polyline_points: ^0.2.1
41 | font_awesome_flutter: ^8.8.1
42 | animated_text_kit: ^2.1.0
43 | flutter_geofire: ^1.0.3
44 | firebase_messaging: ^6.0.16
45 | assets_audio_player: ^2.0.1+7
46 | toast: ^0.1.5
47 | maps_toolkit: ^1.1.0+1
48 | intl: ^0.16.1
49 |
50 |
51 | dev_dependencies:
52 | flutter_test:
53 | sdk: flutter
54 |
55 | # For information on the generic Dart part of this file, see the
56 | # following page: https://dart.dev/tools/pub/pubspec
57 |
58 | # The following section is specific to Flutter.
59 | flutter:
60 |
61 | # The following line ensures that the Material Icons font is
62 | # included with your application, so that you can use the icons in
63 | # the material Icons class.
64 | uses-material-design: true
65 |
66 | assets:
67 | - images/
68 | - sounds/
69 |
70 | fonts:
71 | - family: Brand-Bold
72 | fonts:
73 | - asset: fonts/bolt-semibold.ttf
74 | - family: Brand-Regular
75 | fonts:
76 | - asset: fonts/bolt-regular.ttf
--------------------------------------------------------------------------------
/sounds/alert.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ufinixacademy/flutter-cab-driver/26980f2f31117cca417a404729baaedb3d24185a/sounds/alert.mp3
--------------------------------------------------------------------------------
/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:cabdriver/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 |
--------------------------------------------------------------------------------