├── .gitignore
├── .metadata
├── README.md
├── android
    ├── app
    │   ├── build.gradle
    │   └── src
    │   │   ├── debug
    │   │       └── AndroidManifest.xml
    │   │   ├── main
    │   │       ├── AndroidManifest.xml
    │   │       ├── java
    │   │       │   └── com
    │   │       │   │   └── example
    │   │       │   │       └── firenotes
    │   │       │   │           └── 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
├── ios
    ├── Flutter
    │   ├── AppFrameworkInfo.plist
    │   ├── Debug.xcconfig
    │   └── Release.xcconfig
    ├── Podfile
    ├── Podfile.lock
    ├── Runner.xcodeproj
    │   ├── project.pbxproj
    │   ├── project.xcworkspace
    │   │   ├── contents.xcworkspacedata
    │   │   └── xcshareddata
    │   │   │   └── IDEWorkspaceChecks.plist
    │   └── 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
    │   ├── Info.plist
    │   └── main.m
├── lib
    ├── main.dart
    ├── note.dart
    ├── note_model.dart
    ├── note_service.dart
    └── widgets
    │   ├── note_edit_widget.dart
    │   ├── note_list_widget.dart
    │   ├── note_widget.dart
    │   └── upload_task_list_tile_widget.dart
├── promo.png
├── pubspec.lock
├── pubspec.yaml
└── 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 | # Visual Studio Code related
19 | .vscode/
20 | 
21 | # Flutter/Dart/Pub related
22 | **/doc/api/
23 | .dart_tool/
24 | .flutter-plugins
25 | .packages
26 | .pub-cache/
27 | .pub/
28 | /build/
29 | 
30 | # Android related
31 | **/android/**/gradle-wrapper.jar
32 | **/android/.gradle
33 | **/android/captures/
34 | **/android/gradlew
35 | **/android/gradlew.bat
36 | **/android/local.properties
37 | **/android/**/GeneratedPluginRegistrant.java
38 | 
39 | # iOS/XCode related
40 | **/ios/**/*.mode1v3
41 | **/ios/**/*.mode2v3
42 | **/ios/**/*.moved-aside
43 | **/ios/**/*.pbxuser
44 | **/ios/**/*.perspectivev3
45 | **/ios/**/*sync/
46 | **/ios/**/.sconsign.dblite
47 | **/ios/**/.tags*
48 | **/ios/**/.vagrant/
49 | **/ios/**/DerivedData/
50 | **/ios/**/Icon?
51 | **/ios/**/Pods/
52 | **/ios/**/.symlinks/
53 | **/ios/**/profile
54 | **/ios/**/xcuserdata
55 | **/ios/.generated/
56 | **/ios/Flutter/App.framework
57 | **/ios/Flutter/Flutter.framework
58 | **/ios/Flutter/Generated.xcconfig
59 | **/ios/Flutter/app.flx
60 | **/ios/Flutter/app.zip
61 | **/ios/Flutter/flutter_assets/
62 | **/ios/ServiceDefinitions.json
63 | **/ios/Runner/GeneratedPluginRegistrant.*
64 | 
65 | # Exceptions to above rules.
66 | !**/ios/**/default.mode1v3
67 | !**/ios/**/default.mode2v3
68 | !**/ios/**/default.pbxuser
69 | !**/ios/**/default.perspectivev3
70 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
71 | 
--------------------------------------------------------------------------------
/.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: 8661d8aecd626f7f57ccbcb735553edc05a2e713
 8 |   channel: beta
 9 | 
10 | project_type: app
11 | 
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
 1 | # firenotes
 2 | 
 3 | 
 4 | 
 5 | A Flutter notes app using Firestore and Firebase Storage as backend
 6 | 
 7 | ## Getting Started
 8 | 
 9 | - Clone
10 | - Create Firebase App
11 | - Create iOS app in firebase, download google-service-info.plist, copy in Runner
12 | - Create Android app in firebase, download google-services.json, copy in Android/app
13 | - Run
14 | 
--------------------------------------------------------------------------------
/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 | 
27 | android {
28 |     compileSdkVersion 28
29 |     
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.alfianlosari.firenotes"
38 |         minSdkVersion 16
39 |         targetSdkVersion 28
40 |         versionCode flutterVersionCode.toInteger()
41 |         versionName flutterVersionName
42 |         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
43 |     }
44 | 
45 |     buildTypes {
46 |         release {
47 |             // TODO: Add your own signing config for the release build.
48 |             // Signing with the debug keys for now, so `flutter run --release` works.
49 |             signingConfig signingConfigs.debug
50 |         }
51 |     }
52 | }
53 | 
54 | 
55 | flutter {
56 |     source '../..'
57 | }
58 | 
59 | dependencies {
60 |     testImplementation 'junit:junit:4.12'
61 |     androidTestImplementation 'com.android.support.test:runner:1.0.2'
62 |     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
63 | }
64 | 
65 | apply plugin: 'com.google.gms.google-services'  // Gradle plugin
66 | 
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 | 
3 |     
6 |     
7 | 
8 | 
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
 1 | 
 3 | 
 4 |     
 9 |     
13 |         
20 |             
24 |             
27 |             
28 |                 
29 |                 
30 |             
31 |         
32 |     
33 | 
34 | 
--------------------------------------------------------------------------------
/android/app/src/main/java/com/example/firenotes/MainActivity.java:
--------------------------------------------------------------------------------
 1 | package com.example.firenotes;
 2 | 
 3 | import android.os.Bundle;
 4 | import io.flutter.app.FlutterActivity;
 5 | import io.flutter.plugins.GeneratedPluginRegistrant;
 6 | 
 7 | public class MainActivity extends FlutterActivity {
 8 |   @Override
 9 |   protected void onCreate(Bundle savedInstanceState) {
10 |     super.onCreate(savedInstanceState);
11 |     GeneratedPluginRegistrant.registerWith(this);
12 |   }
13 | }
14 | 
--------------------------------------------------------------------------------
/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 | 
2 | 
3 |     
8 | 
9 | 
--------------------------------------------------------------------------------
/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.2.1'
 9 |         classpath 'com.google.gms:google-services:3.2.1'
10 | 
11 |     }
12 | }
13 | 
14 | allprojects {
15 |     repositories {
16 |         google()
17 |         jcenter()
18 |     }
19 | }
20 | 
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 |     project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 |     project.evaluationDependsOn(':app')
27 | }
28 | 
29 | task clean(type: Delete) {
30 |     delete rootProject.buildDir
31 | }
32 | 
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 | 
--------------------------------------------------------------------------------
/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-4.10.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 | 
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 | 
 4 | 
 5 |   CFBundleDevelopmentRegion
 6 |   en
 7 |   CFBundleExecutable
 8 |   App
 9 |   CFBundleIdentifier
10 |   io.flutter.flutter.app
11 |   CFBundleInfoDictionaryVersion
12 |   6.0
13 |   CFBundleName
14 |   App
15 |   CFBundlePackageType
16 |   FMWK
17 |   CFBundleShortVersionString
18 |   1.0
19 |   CFBundleSignature
20 |   ????
21 |   CFBundleVersion
22 |   1.0
23 |   MinimumOSVersion
24 |   8.0
25 | 
26 | 
27 | 
--------------------------------------------------------------------------------
/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 | 
 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
 6 | 
 7 | project 'Runner', {
 8 |   'Debug' => :debug,
 9 |   'Profile' => :release,
10 |   'Release' => :release,
11 | }
12 | 
13 | def parse_KV_file(file, separator='=')
14 |   file_abs_path = File.expand_path(file)
15 |   if !File.exists? file_abs_path
16 |     return [];
17 |   end
18 |   pods_ary = []
19 |   skip_line_start_symbols = ["#", "/"]
20 |   File.foreach(file_abs_path) { |line|
21 |       next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
22 |       plugin = line.split(pattern=separator)
23 |       if plugin.length == 2
24 |         podname = plugin[0].strip()
25 |         path = plugin[1].strip()
26 |         podpath = File.expand_path("#{path}", file_abs_path)
27 |         pods_ary.push({:name => podname, :path => podpath});
28 |       else
29 |         puts "Invalid plugin specification: #{line}"
30 |       end
31 |   }
32 |   return pods_ary
33 | end
34 | 
35 | target 'Runner' do
36 |   # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
37 |   # referring to absolute paths on developers' machines.
38 |   system('rm -rf .symlinks')
39 |   system('mkdir -p .symlinks/plugins')
40 | 
41 |   # Flutter Pods
42 |   generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig')
43 |   if generated_xcode_build_settings.empty?
44 |     puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first."
45 |   end
46 |   generated_xcode_build_settings.map { |p|
47 |     if p[:name] == 'FLUTTER_FRAMEWORK_DIR'
48 |       symlink = File.join('.symlinks', 'flutter')
49 |       File.symlink(File.dirname(p[:path]), symlink)
50 |       pod 'Flutter', :path => File.join(symlink, File.basename(p[:path]))
51 |     end
52 |   }
53 | 
54 |   # Plugin Pods
55 |   plugin_pods = parse_KV_file('../.flutter-plugins')
56 |   plugin_pods.map { |p|
57 |     symlink = File.join('.symlinks', 'plugins', p[:name])
58 |     File.symlink(p[:path], symlink)
59 |     pod p[:name], :path => File.join(symlink, 'ios')
60 |   }
61 | end
62 | 
63 | post_install do |installer|
64 |   installer.pods_project.targets.each do |target|
65 |     target.build_configurations.each do |config|
66 |       config.build_settings['ENABLE_BITCODE'] = 'NO'
67 |     end
68 |   end
69 | end
70 | 
--------------------------------------------------------------------------------
/ios/Podfile.lock:
--------------------------------------------------------------------------------
  1 | PODS:
  2 |   - BoringSSL (10.0.6):
  3 |     - BoringSSL/Implementation (= 10.0.6)
  4 |     - BoringSSL/Interface (= 10.0.6)
  5 |   - BoringSSL/Implementation (10.0.6):
  6 |     - BoringSSL/Interface (= 10.0.6)
  7 |   - BoringSSL/Interface (10.0.6)
  8 |   - cloud_firestore (0.0.1):
  9 |     - Firebase/Auth
 10 |     - Firebase/Core
 11 |     - Firebase/Database
 12 |     - Firebase/Firestore
 13 |     - Flutter
 14 |   - cloud_functions (0.0.1):
 15 |     - Firebase/Core
 16 |     - Firebase/Functions
 17 |     - Flutter
 18 |   - Firebase/Auth (5.9.0):
 19 |     - Firebase/CoreOnly
 20 |     - FirebaseAuth (= 5.0.4)
 21 |   - Firebase/Core (5.9.0):
 22 |     - Firebase/CoreOnly
 23 |     - FirebaseAnalytics (= 5.2.0)
 24 |   - Firebase/CoreOnly (5.9.0):
 25 |     - FirebaseCore (= 5.1.4)
 26 |   - Firebase/Database (5.9.0):
 27 |     - Firebase/CoreOnly
 28 |     - FirebaseDatabase (= 5.0.3)
 29 |   - Firebase/Firestore (5.9.0):
 30 |     - Firebase/CoreOnly
 31 |     - FirebaseFirestore (= 0.13.4)
 32 |   - Firebase/Functions (5.9.0):
 33 |     - Firebase/CoreOnly
 34 |     - FirebaseFunctions (= 2.1.1)
 35 |   - Firebase/Storage (5.9.0):
 36 |     - Firebase/CoreOnly
 37 |     - FirebaseStorage (= 3.0.2)
 38 |   - firebase_core (0.0.1):
 39 |     - Firebase/Core
 40 |     - Flutter
 41 |   - firebase_storage (0.0.1):
 42 |     - Firebase/Storage
 43 |     - Flutter
 44 |   - FirebaseAnalytics (5.2.0):
 45 |     - FirebaseCore (~> 5.1)
 46 |     - FirebaseInstanceID (~> 3.2)
 47 |     - GoogleAppMeasurement (~> 5.2)
 48 |     - GoogleUtilities/AppDelegateSwizzler (~> 5.2)
 49 |     - GoogleUtilities/MethodSwizzler (~> 5.2)
 50 |     - GoogleUtilities/Network (~> 5.2)
 51 |     - "GoogleUtilities/NSData+zlib (~> 5.2)"
 52 |     - nanopb (~> 0.3)
 53 |   - FirebaseAuth (5.0.4):
 54 |     - FirebaseAuthInterop (~> 1.0)
 55 |     - FirebaseCore (~> 5.0)
 56 |     - GoogleUtilities/Environment (~> 5.2)
 57 |     - GTMSessionFetcher/Core (~> 1.1)
 58 |   - FirebaseAuthInterop (1.0.0)
 59 |   - FirebaseCore (5.1.4):
 60 |     - GoogleUtilities/Logger (~> 5.2)
 61 |   - FirebaseDatabase (5.0.3):
 62 |     - FirebaseCore (~> 5.0)
 63 |     - leveldb-library (~> 1.18)
 64 |   - FirebaseFirestore (0.13.4):
 65 |     - FirebaseAuthInterop (~> 1.0)
 66 |     - FirebaseCore (~> 5.0)
 67 |     - FirebaseFirestore/abseil-cpp (= 0.13.4)
 68 |     - "gRPC-C++ (~> 0.0.3)"
 69 |     - gRPC-ProtoRPC (~> 1.0)
 70 |     - leveldb-library (~> 1.20)
 71 |     - nanopb (~> 0.3.8)
 72 |     - Protobuf (~> 3.1)
 73 |   - FirebaseFirestore/abseil-cpp (0.13.4):
 74 |     - FirebaseAuthInterop (~> 1.0)
 75 |     - FirebaseCore (~> 5.0)
 76 |     - "gRPC-C++ (~> 0.0.3)"
 77 |     - gRPC-ProtoRPC (~> 1.0)
 78 |     - leveldb-library (~> 1.20)
 79 |     - nanopb (~> 0.3.8)
 80 |     - Protobuf (~> 3.1)
 81 |   - FirebaseFunctions (2.1.1):
 82 |     - FirebaseCore (~> 5.0)
 83 |     - GTMSessionFetcher/Core (~> 1.1)
 84 |   - FirebaseInstanceID (3.2.2):
 85 |     - FirebaseCore (~> 5.1)
 86 |     - GoogleUtilities/Environment (~> 5.3)
 87 |     - GoogleUtilities/UserDefaults (~> 5.3)
 88 |   - FirebaseStorage (3.0.2):
 89 |     - FirebaseAuthInterop (~> 1.0)
 90 |     - FirebaseCore (~> 5.0)
 91 |     - GTMSessionFetcher/Core (~> 1.1)
 92 |   - Flutter (1.0.0)
 93 |   - GoogleAppMeasurement (5.2.0):
 94 |     - GoogleUtilities/AppDelegateSwizzler (~> 5.2)
 95 |     - GoogleUtilities/MethodSwizzler (~> 5.2)
 96 |     - GoogleUtilities/Network (~> 5.2)
 97 |     - "GoogleUtilities/NSData+zlib (~> 5.2)"
 98 |     - nanopb (~> 0.3)
 99 |   - GoogleUtilities/AppDelegateSwizzler (5.3.0):
100 |     - GoogleUtilities/Environment
101 |     - GoogleUtilities/Logger
102 |     - GoogleUtilities/Network
103 |   - GoogleUtilities/Environment (5.3.0)
104 |   - GoogleUtilities/Logger (5.3.0):
105 |     - GoogleUtilities/Environment
106 |   - GoogleUtilities/MethodSwizzler (5.3.0):
107 |     - GoogleUtilities/Logger
108 |   - GoogleUtilities/Network (5.3.0):
109 |     - GoogleUtilities/Logger
110 |     - "GoogleUtilities/NSData+zlib"
111 |     - GoogleUtilities/Reachability
112 |   - "GoogleUtilities/NSData+zlib (5.3.0)"
113 |   - GoogleUtilities/Reachability (5.3.0):
114 |     - GoogleUtilities/Logger
115 |   - GoogleUtilities/UserDefaults (5.3.0):
116 |     - GoogleUtilities/Logger
117 |   - gRPC (1.14.0):
118 |     - gRPC-RxLibrary (= 1.14.0)
119 |     - gRPC/Main (= 1.14.0)
120 |   - "gRPC-C++ (0.0.3)":
121 |     - "gRPC-C++/Implementation (= 0.0.3)"
122 |     - "gRPC-C++/Interface (= 0.0.3)"
123 |   - "gRPC-C++/Implementation (0.0.3)":
124 |     - "gRPC-C++/Interface (= 0.0.3)"
125 |     - gRPC-Core (= 1.14.0)
126 |     - nanopb (~> 0.3)
127 |   - "gRPC-C++/Interface (0.0.3)"
128 |   - gRPC-Core (1.14.0):
129 |     - gRPC-Core/Implementation (= 1.14.0)
130 |     - gRPC-Core/Interface (= 1.14.0)
131 |   - gRPC-Core/Implementation (1.14.0):
132 |     - BoringSSL (~> 10.0)
133 |     - gRPC-Core/Interface (= 1.14.0)
134 |     - nanopb (~> 0.3)
135 |   - gRPC-Core/Interface (1.14.0)
136 |   - gRPC-ProtoRPC (1.14.0):
137 |     - gRPC-ProtoRPC/Main (= 1.14.0)
138 |   - gRPC-ProtoRPC/Main (1.14.0):
139 |     - gRPC (= 1.14.0)
140 |     - gRPC-RxLibrary (= 1.14.0)
141 |     - Protobuf (~> 3.0)
142 |   - gRPC-RxLibrary (1.14.0)
143 |   - gRPC/Main (1.14.0):
144 |     - gRPC-Core (= 1.14.0)
145 |     - gRPC-RxLibrary (= 1.14.0)
146 |   - GTMSessionFetcher/Core (1.2.0)
147 |   - image_picker (0.0.1):
148 |     - Flutter
149 |   - leveldb-library (1.20)
150 |   - nanopb (0.3.8):
151 |     - nanopb/decode (= 0.3.8)
152 |     - nanopb/encode (= 0.3.8)
153 |   - nanopb/decode (0.3.8)
154 |   - nanopb/encode (0.3.8)
155 |   - Protobuf (3.6.1)
156 | 
157 | DEPENDENCIES:
158 |   - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`)
159 |   - cloud_functions (from `.symlinks/plugins/cloud_functions/ios`)
160 |   - firebase_core (from `.symlinks/plugins/firebase_core/ios`)
161 |   - firebase_storage (from `.symlinks/plugins/firebase_storage/ios`)
162 |   - Flutter (from `.symlinks/flutter/ios`)
163 |   - image_picker (from `.symlinks/plugins/image_picker/ios`)
164 | 
165 | SPEC REPOS:
166 |   https://github.com/cocoapods/specs.git:
167 |     - BoringSSL
168 |     - Firebase
169 |     - FirebaseAnalytics
170 |     - FirebaseAuth
171 |     - FirebaseAuthInterop
172 |     - FirebaseCore
173 |     - FirebaseDatabase
174 |     - FirebaseFirestore
175 |     - FirebaseFunctions
176 |     - FirebaseInstanceID
177 |     - FirebaseStorage
178 |     - GoogleAppMeasurement
179 |     - GoogleUtilities
180 |     - gRPC
181 |     - "gRPC-C++"
182 |     - gRPC-Core
183 |     - gRPC-ProtoRPC
184 |     - gRPC-RxLibrary
185 |     - GTMSessionFetcher
186 |     - leveldb-library
187 |     - nanopb
188 |     - Protobuf
189 | 
190 | EXTERNAL SOURCES:
191 |   cloud_firestore:
192 |     :path: ".symlinks/plugins/cloud_firestore/ios"
193 |   cloud_functions:
194 |     :path: ".symlinks/plugins/cloud_functions/ios"
195 |   firebase_core:
196 |     :path: ".symlinks/plugins/firebase_core/ios"
197 |   firebase_storage:
198 |     :path: ".symlinks/plugins/firebase_storage/ios"
199 |   Flutter:
200 |     :path: ".symlinks/flutter/ios"
201 |   image_picker:
202 |     :path: ".symlinks/plugins/image_picker/ios"
203 | 
204 | SPEC CHECKSUMS:
205 |   BoringSSL: e10f92a27043805c01071fe815a5cd98ae8212e7
206 |   cloud_firestore: cd6e849ecb8ab43e5a7a5f1f169304ca65436c03
207 |   cloud_functions: 523e0589f696f7cca5434795181b7cb25feb15e2
208 |   Firebase: 383fa29aca93e371cab776b48a5c66544d3c2003
209 |   firebase_core: ce5006bb48508ee4e71e0f429a3f519bb8ee2961
210 |   firebase_storage: 2543f377090a6e219caab9224dead5bbcb30ef33
211 |   FirebaseAnalytics: 831f1f127f4a75698e9875a87bf7e2668730d953
212 |   FirebaseAuth: 504b198ceb3472dca5c65bb95544ea44cfc9439e
213 |   FirebaseAuthInterop: 0ffa57668be100582bb7643d4fcb7615496c41fc
214 |   FirebaseCore: 2a84b6b325792a4319ef71ee18819dcba08d2fd7
215 |   FirebaseDatabase: e2bcbc106adc4b11a2da3ec2eb63c0c4a44f2f54
216 |   FirebaseFirestore: eaf0b6244e9463e2429fe216666b641e4dec606b
217 |   FirebaseFunctions: 6c03d7c5d62520be4678dc3fb7957654aab82b4f
218 |   FirebaseInstanceID: 78ba376fcd5b94c001f9999b2cbd3d1f1e56e78d
219 |   FirebaseStorage: fd82e5e5c474897e19972b34b22ac0f589dce04e
220 |   Flutter: 58dd7d1b27887414a370fcccb9e645c08ffd7a6a
221 |   GoogleAppMeasurement: 2b3a023a61239c8d002e6e4fcf4abce8eddce0e0
222 |   GoogleUtilities: 760ccb53b7c7f40f9c02d8c241f76f841a7a6162
223 |   gRPC: 9d4c549f37c7cef22478634bac7a0405b6e3dbfb
224 |   "gRPC-C++": ee0b01db3122f0b6c2be28b5b11039f62fa15fe6
225 |   gRPC-Core: f4836515817c0eb479aeeb9cc27c91c4ba62a9f6
226 |   gRPC-ProtoRPC: 76f6053639a842e1fb45fa82aa598bf3f4d9f66f
227 |   gRPC-RxLibrary: 3c305f32155024b116b780f389323c73a28197e6
228 |   GTMSessionFetcher: 0c4baf0a73acd0041bf9f71ea018deedab5ea84e
229 |   image_picker: a211f28b95a560433c00f5cd3773f4710a20404d
230 |   leveldb-library: 08cba283675b7ed2d99629a4bc5fd052cd2bb6a5
231 |   nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3
232 |   Protobuf: 1eb9700044745f00181c136ef21b8ff3ad5a0fd5
233 | 
234 | PODFILE CHECKSUM: aff02bfeed411c636180d6812254b2daeea14d09
235 | 
236 | COCOAPODS: 1.6.0.beta.2
237 | 
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
  1 | // !$*UTF8*$!
  2 | {
  3 | 	archiveVersion = 1;
  4 | 	classes = {
  5 | 	};
  6 | 	objectVersion = 46;
  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 | 		3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };
 13 | 		3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 14 | 		77B6A1E3BDE80A9D4BF35BBB /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 36C4F8385FB411FBFB426286 /* libPods-Runner.a */; };
 15 | 		9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };
 16 | 		9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 17 | 		9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };
 18 | 		978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
 19 | 		97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
 20 | 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
 21 | 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
 22 | 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
 23 | /* End PBXBuildFile section */
 24 | 
 25 | /* Begin PBXCopyFilesBuildPhase section */
 26 | 		9705A1C41CF9048500538489 /* Embed Frameworks */ = {
 27 | 			isa = PBXCopyFilesBuildPhase;
 28 | 			buildActionMask = 2147483647;
 29 | 			dstPath = "";
 30 | 			dstSubfolderSpec = 10;
 31 | 			files = (
 32 | 				3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,
 33 | 				9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,
 34 | 			);
 35 | 			name = "Embed Frameworks";
 36 | 			runOnlyForDeploymentPostprocessing = 0;
 37 | 		};
 38 | /* End PBXCopyFilesBuildPhase section */
 39 | 
 40 | /* Begin PBXFileReference section */
 41 | 		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
 42 | 		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
 43 | 		36C4F8385FB411FBFB426286 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 44 | 		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
 45 | 		3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; };
 46 | 		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
 47 | 		7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
 48 | 		7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
 49 | 		9100C09AEFD2556126ADC17D /* 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 = ""; };
 50 | 		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
 51 | 		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
 52 | 		9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; };
 53 | 		97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
 54 | 		97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
 55 | 		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
 56 | 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
 57 | 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
 58 | 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
 59 | 		989B504DCCEEAEF535D6465E /* 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 = ""; };
 60 | 		F735AE039A3B3FA8A98E9FBA /* 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 = ""; };
 61 | /* End PBXFileReference section */
 62 | 
 63 | /* Begin PBXFrameworksBuildPhase section */
 64 | 		97C146EB1CF9000F007C117D /* Frameworks */ = {
 65 | 			isa = PBXFrameworksBuildPhase;
 66 | 			buildActionMask = 2147483647;
 67 | 			files = (
 68 | 				9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,
 69 | 				3B80C3941E831B6300D905FE /* App.framework in Frameworks */,
 70 | 				77B6A1E3BDE80A9D4BF35BBB /* libPods-Runner.a in Frameworks */,
 71 | 			);
 72 | 			runOnlyForDeploymentPostprocessing = 0;
 73 | 		};
 74 | /* End PBXFrameworksBuildPhase section */
 75 | 
 76 | /* Begin PBXGroup section */
 77 | 		1774993E9E6B7708400ADA06 /* Pods */ = {
 78 | 			isa = PBXGroup;
 79 | 			children = (
 80 | 				F735AE039A3B3FA8A98E9FBA /* Pods-Runner.debug.xcconfig */,
 81 | 				989B504DCCEEAEF535D6465E /* Pods-Runner.release.xcconfig */,
 82 | 				9100C09AEFD2556126ADC17D /* Pods-Runner.profile.xcconfig */,
 83 | 			);
 84 | 			path = Pods;
 85 | 			sourceTree = "";
 86 | 		};
 87 | 		3CE7BE10D17636039F605748 /* Frameworks */ = {
 88 | 			isa = PBXGroup;
 89 | 			children = (
 90 | 				36C4F8385FB411FBFB426286 /* libPods-Runner.a */,
 91 | 			);
 92 | 			name = Frameworks;
 93 | 			sourceTree = "";
 94 | 		};
 95 | 		9740EEB11CF90186004384FC /* Flutter */ = {
 96 | 			isa = PBXGroup;
 97 | 			children = (
 98 | 				3B80C3931E831B6300D905FE /* App.framework */,
 99 | 				3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
100 | 				9740EEBA1CF902C7004384FC /* Flutter.framework */,
101 | 				9740EEB21CF90195004384FC /* Debug.xcconfig */,
102 | 				7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
103 | 				9740EEB31CF90195004384FC /* Generated.xcconfig */,
104 | 			);
105 | 			name = Flutter;
106 | 			sourceTree = "";
107 | 		};
108 | 		97C146E51CF9000F007C117D = {
109 | 			isa = PBXGroup;
110 | 			children = (
111 | 				9740EEB11CF90186004384FC /* Flutter */,
112 | 				97C146F01CF9000F007C117D /* Runner */,
113 | 				97C146EF1CF9000F007C117D /* Products */,
114 | 				1774993E9E6B7708400ADA06 /* Pods */,
115 | 				3CE7BE10D17636039F605748 /* Frameworks */,
116 | 			);
117 | 			sourceTree = "";
118 | 		};
119 | 		97C146EF1CF9000F007C117D /* Products */ = {
120 | 			isa = PBXGroup;
121 | 			children = (
122 | 				97C146EE1CF9000F007C117D /* Runner.app */,
123 | 			);
124 | 			name = Products;
125 | 			sourceTree = "";
126 | 		};
127 | 		97C146F01CF9000F007C117D /* Runner */ = {
128 | 			isa = PBXGroup;
129 | 			children = (
130 | 				7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,
131 | 				7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,
132 | 				97C146FA1CF9000F007C117D /* Main.storyboard */,
133 | 				97C146FD1CF9000F007C117D /* Assets.xcassets */,
134 | 				97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
135 | 				97C147021CF9000F007C117D /* Info.plist */,
136 | 				97C146F11CF9000F007C117D /* Supporting Files */,
137 | 				1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
138 | 				1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
139 | 			);
140 | 			path = Runner;
141 | 			sourceTree = "";
142 | 		};
143 | 		97C146F11CF9000F007C117D /* Supporting Files */ = {
144 | 			isa = PBXGroup;
145 | 			children = (
146 | 				97C146F21CF9000F007C117D /* main.m */,
147 | 			);
148 | 			name = "Supporting Files";
149 | 			sourceTree = "";
150 | 		};
151 | /* End PBXGroup section */
152 | 
153 | /* Begin PBXNativeTarget section */
154 | 		97C146ED1CF9000F007C117D /* Runner */ = {
155 | 			isa = PBXNativeTarget;
156 | 			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
157 | 			buildPhases = (
158 | 				AE700DC460E76D1648998523 /* [CP] Check Pods Manifest.lock */,
159 | 				9740EEB61CF901F6004384FC /* Run Script */,
160 | 				97C146EA1CF9000F007C117D /* Sources */,
161 | 				97C146EB1CF9000F007C117D /* Frameworks */,
162 | 				97C146EC1CF9000F007C117D /* Resources */,
163 | 				9705A1C41CF9048500538489 /* Embed Frameworks */,
164 | 				3B06AD1E1E4923F5004D2608 /* Thin Binary */,
165 | 				2C7C98C064E56137F3A8CE46 /* [CP] Embed Pods Frameworks */,
166 | 				C85596A05B2B521285F4B15D /* [CP] Copy Pods Resources */,
167 | 			);
168 | 			buildRules = (
169 | 			);
170 | 			dependencies = (
171 | 			);
172 | 			name = Runner;
173 | 			productName = Runner;
174 | 			productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
175 | 			productType = "com.apple.product-type.application";
176 | 		};
177 | /* End PBXNativeTarget section */
178 | 
179 | /* Begin PBXProject section */
180 | 		97C146E61CF9000F007C117D /* Project object */ = {
181 | 			isa = PBXProject;
182 | 			attributes = {
183 | 				LastUpgradeCheck = 0910;
184 | 				ORGANIZATIONNAME = "The Chromium Authors";
185 | 				TargetAttributes = {
186 | 					97C146ED1CF9000F007C117D = {
187 | 						CreatedOnToolsVersion = 7.3.1;
188 | 						DevelopmentTeam = 5C2XD9H2JS;
189 | 					};
190 | 				};
191 | 			};
192 | 			buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
193 | 			compatibilityVersion = "Xcode 3.2";
194 | 			developmentRegion = English;
195 | 			hasScannedForEncodings = 0;
196 | 			knownRegions = (
197 | 				en,
198 | 				Base,
199 | 			);
200 | 			mainGroup = 97C146E51CF9000F007C117D;
201 | 			productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
202 | 			projectDirPath = "";
203 | 			projectRoot = "";
204 | 			targets = (
205 | 				97C146ED1CF9000F007C117D /* Runner */,
206 | 			);
207 | 		};
208 | /* End PBXProject section */
209 | 
210 | /* Begin PBXResourcesBuildPhase section */
211 | 		97C146EC1CF9000F007C117D /* Resources */ = {
212 | 			isa = PBXResourcesBuildPhase;
213 | 			buildActionMask = 2147483647;
214 | 			files = (
215 | 				97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
216 | 				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
217 | 				9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,
218 | 				97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
219 | 				97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
220 | 			);
221 | 			runOnlyForDeploymentPostprocessing = 0;
222 | 		};
223 | /* End PBXResourcesBuildPhase section */
224 | 
225 | /* Begin PBXShellScriptBuildPhase section */
226 | 		2C7C98C064E56137F3A8CE46 /* [CP] Embed Pods Frameworks */ = {
227 | 			isa = PBXShellScriptBuildPhase;
228 | 			buildActionMask = 2147483647;
229 | 			files = (
230 | 			);
231 | 			inputFileListPaths = (
232 | 			);
233 | 			inputPaths = (
234 | 				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
235 | 				"${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework",
236 | 			);
237 | 			name = "[CP] Embed Pods Frameworks";
238 | 			outputFileListPaths = (
239 | 			);
240 | 			outputPaths = (
241 | 				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
242 | 			);
243 | 			runOnlyForDeploymentPostprocessing = 0;
244 | 			shellPath = /bin/sh;
245 | 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
246 | 			showEnvVarsInLog = 0;
247 | 		};
248 | 		3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
249 | 			isa = PBXShellScriptBuildPhase;
250 | 			buildActionMask = 2147483647;
251 | 			files = (
252 | 			);
253 | 			inputPaths = (
254 | 			);
255 | 			name = "Thin Binary";
256 | 			outputPaths = (
257 | 			);
258 | 			runOnlyForDeploymentPostprocessing = 0;
259 | 			shellPath = /bin/sh;
260 | 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin";
261 | 		};
262 | 		9740EEB61CF901F6004384FC /* Run Script */ = {
263 | 			isa = PBXShellScriptBuildPhase;
264 | 			buildActionMask = 2147483647;
265 | 			files = (
266 | 			);
267 | 			inputPaths = (
268 | 			);
269 | 			name = "Run Script";
270 | 			outputPaths = (
271 | 			);
272 | 			runOnlyForDeploymentPostprocessing = 0;
273 | 			shellPath = /bin/sh;
274 | 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
275 | 		};
276 | 		AE700DC460E76D1648998523 /* [CP] Check Pods Manifest.lock */ = {
277 | 			isa = PBXShellScriptBuildPhase;
278 | 			buildActionMask = 2147483647;
279 | 			files = (
280 | 			);
281 | 			inputFileListPaths = (
282 | 			);
283 | 			inputPaths = (
284 | 				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
285 | 				"${PODS_ROOT}/Manifest.lock",
286 | 			);
287 | 			name = "[CP] Check Pods Manifest.lock";
288 | 			outputFileListPaths = (
289 | 			);
290 | 			outputPaths = (
291 | 				"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
292 | 			);
293 | 			runOnlyForDeploymentPostprocessing = 0;
294 | 			shellPath = /bin/sh;
295 | 			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";
296 | 			showEnvVarsInLog = 0;
297 | 		};
298 | 		C85596A05B2B521285F4B15D /* [CP] Copy Pods Resources */ = {
299 | 			isa = PBXShellScriptBuildPhase;
300 | 			buildActionMask = 2147483647;
301 | 			files = (
302 | 			);
303 | 			inputFileListPaths = (
304 | 			);
305 | 			inputPaths = (
306 | 				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh",
307 | 				"${PODS_CONFIGURATION_BUILD_DIR}/gRPC/gRPCCertificates.bundle",
308 | 			);
309 | 			name = "[CP] Copy Pods Resources";
310 | 			outputFileListPaths = (
311 | 			);
312 | 			outputPaths = (
313 | 				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates.bundle",
314 | 			);
315 | 			runOnlyForDeploymentPostprocessing = 0;
316 | 			shellPath = /bin/sh;
317 | 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
318 | 			showEnvVarsInLog = 0;
319 | 		};
320 | /* End PBXShellScriptBuildPhase section */
321 | 
322 | /* Begin PBXSourcesBuildPhase section */
323 | 		97C146EA1CF9000F007C117D /* Sources */ = {
324 | 			isa = PBXSourcesBuildPhase;
325 | 			buildActionMask = 2147483647;
326 | 			files = (
327 | 				978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */,
328 | 				97C146F31CF9000F007C117D /* main.m in Sources */,
329 | 				1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
330 | 			);
331 | 			runOnlyForDeploymentPostprocessing = 0;
332 | 		};
333 | /* End PBXSourcesBuildPhase section */
334 | 
335 | /* Begin PBXVariantGroup section */
336 | 		97C146FA1CF9000F007C117D /* Main.storyboard */ = {
337 | 			isa = PBXVariantGroup;
338 | 			children = (
339 | 				97C146FB1CF9000F007C117D /* Base */,
340 | 			);
341 | 			name = Main.storyboard;
342 | 			sourceTree = "";
343 | 		};
344 | 		97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
345 | 			isa = PBXVariantGroup;
346 | 			children = (
347 | 				97C147001CF9000F007C117D /* Base */,
348 | 			);
349 | 			name = LaunchScreen.storyboard;
350 | 			sourceTree = "";
351 | 		};
352 | /* End PBXVariantGroup section */
353 | 
354 | /* Begin XCBuildConfiguration section */
355 | 		249021D3217E4FDB00AE95B9 /* Profile */ = {
356 | 			isa = XCBuildConfiguration;
357 | 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
358 | 			buildSettings = {
359 | 				ALWAYS_SEARCH_USER_PATHS = NO;
360 | 				CLANG_ANALYZER_NONNULL = YES;
361 | 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
362 | 				CLANG_CXX_LIBRARY = "libc++";
363 | 				CLANG_ENABLE_MODULES = YES;
364 | 				CLANG_ENABLE_OBJC_ARC = YES;
365 | 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
366 | 				CLANG_WARN_BOOL_CONVERSION = YES;
367 | 				CLANG_WARN_COMMA = YES;
368 | 				CLANG_WARN_CONSTANT_CONVERSION = YES;
369 | 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
370 | 				CLANG_WARN_EMPTY_BODY = YES;
371 | 				CLANG_WARN_ENUM_CONVERSION = YES;
372 | 				CLANG_WARN_INFINITE_RECURSION = YES;
373 | 				CLANG_WARN_INT_CONVERSION = YES;
374 | 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
375 | 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
376 | 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
377 | 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
378 | 				CLANG_WARN_STRICT_PROTOTYPES = YES;
379 | 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
380 | 				CLANG_WARN_UNREACHABLE_CODE = YES;
381 | 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
382 | 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
383 | 				COPY_PHASE_STRIP = NO;
384 | 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
385 | 				ENABLE_NS_ASSERTIONS = NO;
386 | 				ENABLE_STRICT_OBJC_MSGSEND = YES;
387 | 				GCC_C_LANGUAGE_STANDARD = gnu99;
388 | 				GCC_NO_COMMON_BLOCKS = YES;
389 | 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
390 | 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
391 | 				GCC_WARN_UNDECLARED_SELECTOR = YES;
392 | 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
393 | 				GCC_WARN_UNUSED_FUNCTION = YES;
394 | 				GCC_WARN_UNUSED_VARIABLE = YES;
395 | 				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
396 | 				MTL_ENABLE_DEBUG_INFO = NO;
397 | 				SDKROOT = iphoneos;
398 | 				TARGETED_DEVICE_FAMILY = "1,2";
399 | 				VALIDATE_PRODUCT = YES;
400 | 			};
401 | 			name = Profile;
402 | 		};
403 | 		249021D4217E4FDB00AE95B9 /* Profile */ = {
404 | 			isa = XCBuildConfiguration;
405 | 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
406 | 			buildSettings = {
407 | 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
408 | 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
409 | 				DEVELOPMENT_TEAM = 5C2XD9H2JS;
410 | 				ENABLE_BITCODE = NO;
411 | 				FRAMEWORK_SEARCH_PATHS = (
412 | 					"$(inherited)",
413 | 					"$(PROJECT_DIR)/Flutter",
414 | 				);
415 | 				INFOPLIST_FILE = Runner/Info.plist;
416 | 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
417 | 				LIBRARY_SEARCH_PATHS = (
418 | 					"$(inherited)",
419 | 					"$(PROJECT_DIR)/Flutter",
420 | 				);
421 | 				PRODUCT_BUNDLE_IDENTIFIER = com.alfianlosari.firenotes;
422 | 				PRODUCT_NAME = "$(TARGET_NAME)";
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_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
442 | 				CLANG_WARN_EMPTY_BODY = YES;
443 | 				CLANG_WARN_ENUM_CONVERSION = YES;
444 | 				CLANG_WARN_INFINITE_RECURSION = YES;
445 | 				CLANG_WARN_INT_CONVERSION = YES;
446 | 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
447 | 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
448 | 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
449 | 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
450 | 				CLANG_WARN_STRICT_PROTOTYPES = YES;
451 | 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
452 | 				CLANG_WARN_UNREACHABLE_CODE = YES;
453 | 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
454 | 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
455 | 				COPY_PHASE_STRIP = NO;
456 | 				DEBUG_INFORMATION_FORMAT = dwarf;
457 | 				ENABLE_STRICT_OBJC_MSGSEND = YES;
458 | 				ENABLE_TESTABILITY = YES;
459 | 				GCC_C_LANGUAGE_STANDARD = gnu99;
460 | 				GCC_DYNAMIC_NO_PIC = NO;
461 | 				GCC_NO_COMMON_BLOCKS = YES;
462 | 				GCC_OPTIMIZATION_LEVEL = 0;
463 | 				GCC_PREPROCESSOR_DEFINITIONS = (
464 | 					"DEBUG=1",
465 | 					"$(inherited)",
466 | 				);
467 | 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
468 | 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
469 | 				GCC_WARN_UNDECLARED_SELECTOR = YES;
470 | 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
471 | 				GCC_WARN_UNUSED_FUNCTION = YES;
472 | 				GCC_WARN_UNUSED_VARIABLE = YES;
473 | 				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
474 | 				MTL_ENABLE_DEBUG_INFO = YES;
475 | 				ONLY_ACTIVE_ARCH = YES;
476 | 				SDKROOT = iphoneos;
477 | 				TARGETED_DEVICE_FAMILY = "1,2";
478 | 			};
479 | 			name = Debug;
480 | 		};
481 | 		97C147041CF9000F007C117D /* Release */ = {
482 | 			isa = XCBuildConfiguration;
483 | 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
484 | 			buildSettings = {
485 | 				ALWAYS_SEARCH_USER_PATHS = NO;
486 | 				CLANG_ANALYZER_NONNULL = YES;
487 | 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
488 | 				CLANG_CXX_LIBRARY = "libc++";
489 | 				CLANG_ENABLE_MODULES = YES;
490 | 				CLANG_ENABLE_OBJC_ARC = YES;
491 | 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
492 | 				CLANG_WARN_BOOL_CONVERSION = YES;
493 | 				CLANG_WARN_COMMA = YES;
494 | 				CLANG_WARN_CONSTANT_CONVERSION = YES;
495 | 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
496 | 				CLANG_WARN_EMPTY_BODY = YES;
497 | 				CLANG_WARN_ENUM_CONVERSION = YES;
498 | 				CLANG_WARN_INFINITE_RECURSION = YES;
499 | 				CLANG_WARN_INT_CONVERSION = YES;
500 | 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
501 | 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
502 | 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
503 | 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
504 | 				CLANG_WARN_STRICT_PROTOTYPES = YES;
505 | 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
506 | 				CLANG_WARN_UNREACHABLE_CODE = YES;
507 | 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
508 | 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
509 | 				COPY_PHASE_STRIP = NO;
510 | 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
511 | 				ENABLE_NS_ASSERTIONS = NO;
512 | 				ENABLE_STRICT_OBJC_MSGSEND = YES;
513 | 				GCC_C_LANGUAGE_STANDARD = gnu99;
514 | 				GCC_NO_COMMON_BLOCKS = YES;
515 | 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
516 | 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
517 | 				GCC_WARN_UNDECLARED_SELECTOR = YES;
518 | 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
519 | 				GCC_WARN_UNUSED_FUNCTION = YES;
520 | 				GCC_WARN_UNUSED_VARIABLE = YES;
521 | 				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
522 | 				MTL_ENABLE_DEBUG_INFO = NO;
523 | 				SDKROOT = iphoneos;
524 | 				TARGETED_DEVICE_FAMILY = "1,2";
525 | 				VALIDATE_PRODUCT = YES;
526 | 			};
527 | 			name = Release;
528 | 		};
529 | 		97C147061CF9000F007C117D /* Debug */ = {
530 | 			isa = XCBuildConfiguration;
531 | 			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
532 | 			buildSettings = {
533 | 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
534 | 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
535 | 				DEVELOPMENT_TEAM = 5C2XD9H2JS;
536 | 				ENABLE_BITCODE = NO;
537 | 				FRAMEWORK_SEARCH_PATHS = (
538 | 					"$(inherited)",
539 | 					"$(PROJECT_DIR)/Flutter",
540 | 				);
541 | 				INFOPLIST_FILE = Runner/Info.plist;
542 | 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
543 | 				LIBRARY_SEARCH_PATHS = (
544 | 					"$(inherited)",
545 | 					"$(PROJECT_DIR)/Flutter",
546 | 				);
547 | 				PRODUCT_BUNDLE_IDENTIFIER = com.alfianlosari.firenotes;
548 | 				PRODUCT_NAME = "$(TARGET_NAME)";
549 | 				VERSIONING_SYSTEM = "apple-generic";
550 | 			};
551 | 			name = Debug;
552 | 		};
553 | 		97C147071CF9000F007C117D /* Release */ = {
554 | 			isa = XCBuildConfiguration;
555 | 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
556 | 			buildSettings = {
557 | 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
558 | 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
559 | 				DEVELOPMENT_TEAM = 5C2XD9H2JS;
560 | 				ENABLE_BITCODE = NO;
561 | 				FRAMEWORK_SEARCH_PATHS = (
562 | 					"$(inherited)",
563 | 					"$(PROJECT_DIR)/Flutter",
564 | 				);
565 | 				INFOPLIST_FILE = Runner/Info.plist;
566 | 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
567 | 				LIBRARY_SEARCH_PATHS = (
568 | 					"$(inherited)",
569 | 					"$(PROJECT_DIR)/Flutter",
570 | 				);
571 | 				PRODUCT_BUNDLE_IDENTIFIER = com.alfianlosari.firenotes;
572 | 				PRODUCT_NAME = "$(TARGET_NAME)";
573 | 				VERSIONING_SYSTEM = "apple-generic";
574 | 			};
575 | 			name = Release;
576 | 		};
577 | /* End XCBuildConfiguration section */
578 | 
579 | /* Begin XCConfigurationList section */
580 | 		97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
581 | 			isa = XCConfigurationList;
582 | 			buildConfigurations = (
583 | 				97C147031CF9000F007C117D /* Debug */,
584 | 				97C147041CF9000F007C117D /* Release */,
585 | 				249021D3217E4FDB00AE95B9 /* Profile */,
586 | 			);
587 | 			defaultConfigurationIsVisible = 0;
588 | 			defaultConfigurationName = Release;
589 | 		};
590 | 		97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
591 | 			isa = XCConfigurationList;
592 | 			buildConfigurations = (
593 | 				97C147061CF9000F007C117D /* Debug */,
594 | 				97C147071CF9000F007C117D /* Release */,
595 | 				249021D4217E4FDB00AE95B9 /* Profile */,
596 | 			);
597 | 			defaultConfigurationIsVisible = 0;
598 | 			defaultConfigurationName = Release;
599 | 		};
600 | /* End XCConfigurationList section */
601 | 	};
602 | 	rootObject = 97C146E61CF9000F007C117D /* Project object */;
603 | }
604 | 
--------------------------------------------------------------------------------
/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/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 5 |    
 8 |       
 9 |          
15 |             
21 |             
22 |          
23 |       
24 |    
25 |    
31 |       
32 |       
33 |       
34 |          
40 |          
41 |       
42 |       
43 |       
44 |    
45 |    
56 |       
58 |          
64 |          
65 |       
66 |       
67 |       
68 |    
69 |    
75 |       
77 |          
83 |          
84 |       
85 |    
86 |    
88 |    
89 |    
92 |    
93 | 
94 | 
--------------------------------------------------------------------------------
/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 | 	BuildSystemType
6 | 	Original
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 | #include "AppDelegate.h"
 2 | #include "GeneratedPluginRegistrant.h"
 3 | 
 4 | @implementation AppDelegate
 5 | 
 6 | - (BOOL)application:(UIApplication *)application
 7 |     didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 8 |   [GeneratedPluginRegistrant registerWithRegistry:self];
 9 |   // Override point for customization after application launch.
10 |   return [super application:application didFinishLaunchingWithOptions:launchOptions];
11 | }
12 | 
13 | @end
14 | 
--------------------------------------------------------------------------------
/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/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/Info.plist:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 | 
 4 | 
 5 | 	NSMicrophoneUsageDescription
 6 | 	the app wants to access your microphone
 7 | 	NSPhotoLibraryAddUsageDescription
 8 | 	the app wants to access your library
 9 | 	NSCameraUsageDescription
10 | 	the app wants to access your camera 
11 | 	CFBundleDevelopmentRegion
12 | 	en
13 | 	CFBundleExecutable
14 | 	$(EXECUTABLE_NAME)
15 | 	CFBundleIdentifier
16 | 	$(PRODUCT_BUNDLE_IDENTIFIER)
17 | 	CFBundleInfoDictionaryVersion
18 | 	6.0
19 | 	CFBundleName
20 | 	firenotes
21 | 	CFBundlePackageType
22 | 	APPL
23 | 	CFBundleShortVersionString
24 | 	$(FLUTTER_BUILD_NAME)
25 | 	CFBundleSignature
26 | 	????
27 | 	CFBundleVersion
28 | 	$(FLUTTER_BUILD_NUMBER)
29 | 	LSRequiresIPhoneOS
30 | 	
31 | 	UILaunchStoryboardName
32 | 	LaunchScreen
33 | 	UIMainStoryboardFile
34 | 	Main
35 | 	UISupportedInterfaceOrientations
36 | 	
37 | 		UIInterfaceOrientationPortrait
38 | 		UIInterfaceOrientationLandscapeLeft
39 | 		UIInterfaceOrientationLandscapeRight
40 | 	
41 | 	UISupportedInterfaceOrientations~ipad
42 | 	
43 | 		UIInterfaceOrientationPortrait
44 | 		UIInterfaceOrientationPortraitUpsideDown
45 | 		UIInterfaceOrientationLandscapeLeft
46 | 		UIInterfaceOrientationLandscapeRight
47 | 	
48 | 	UIViewControllerBasedStatusBarAppearance
49 | 	
50 | 
51 | 
52 | 
--------------------------------------------------------------------------------
/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/main.dart:
--------------------------------------------------------------------------------
 1 | import 'package:flutter/material.dart';
 2 | import 'package:cloud_firestore/cloud_firestore.dart';
 3 | import 'note_model.dart';
 4 | import 'package:scoped_model/scoped_model.dart';
 5 | import 'package:firenotes/widgets/note_list_widget.dart';
 6 | 
 7 | void main() {
 8 |   final db = Firestore.instance;
 9 |   db.settings(timestampsInSnapshotsEnabled: true, persistenceEnabled: false);
10 |   runApp(MyApp());
11 | }
12 | 
13 | class MyApp extends StatelessWidget {
14 |   // This widget is the root of your application.
15 |   @override
16 |   Widget build(BuildContext context) {
17 |     final noteModel = NoteModel();
18 |     return ScopedModel(
19 |         model: noteModel,
20 |         child: MaterialApp(
21 |           debugShowCheckedModeBanner: false,
22 |           title: 'Firenotes',
23 |           theme: ThemeData(
24 |             primaryColor: Color.fromRGBO(155, 68, 152, 1.0),
25 |           ),
26 |           home: NoteListWidget(title: 'Firenotes'),
27 |         ));
28 |   }
29 | }
30 | 
--------------------------------------------------------------------------------
/lib/note.dart:
--------------------------------------------------------------------------------
 1 | import 'package:cloud_firestore/cloud_firestore.dart';
 2 | 
 3 | class Note extends Object {
 4 |   String uid;
 5 |   String text;
 6 |   String imageURL;
 7 |   DateTime createdAt;
 8 |   DateTime updatedAt;
 9 | 
10 |   String get description => "$uid-$text-$createdAt";
11 |   Note({String uid, String text, String imageURL}) {
12 |     this.uid = uid;
13 |     this.text = text;
14 |     this.imageURL = imageURL;
15 |   }
16 | 
17 |   Note.clone(Note note)
18 |       : this(uid: note.uid, text: note.text, imageURL: note.imageURL);
19 | 
20 |   Note.mapFromJSON(Map json) {
21 |     this.uid = json['uid'];
22 |     this.text = json['text'];
23 |     this.createdAt = DateTime.fromMillisecondsSinceEpoch(
24 |         json['createdAt'].millisecondsSinceEpoch);
25 |     this.updatedAt = DateTime.fromMillisecondsSinceEpoch(
26 |         json['createdAt'].millisecondsSinceEpoch);
27 |     this.imageURL = json['imageURL'];
28 |   }
29 | 
30 |   Note.mapFromSnapshot(DocumentSnapshot snapshot) {
31 |     this.uid = snapshot.documentID;
32 | 
33 |     final json = snapshot.data;
34 |     this.text = json['text'];
35 | 
36 |     final createdAtTimestamp = json['createdAt']?.millisecondsSinceEpoch;
37 |     this.createdAt = (createdAtTimestamp != null)
38 |         ? DateTime.fromMillisecondsSinceEpoch(createdAtTimestamp)
39 |         : null;
40 | 
41 |     final updatedAtTimestamp = json['updatedAt']?.millisecondsSinceEpoch;
42 |     this.updatedAt = (updatedAtTimestamp != null)
43 |         ? DateTime.fromMillisecondsSinceEpoch(updatedAtTimestamp)
44 |         : null;
45 | 
46 |     this.imageURL = json['imageURL'];
47 |   }
48 | }
49 | 
--------------------------------------------------------------------------------
/lib/note_model.dart:
--------------------------------------------------------------------------------
 1 | import 'package:scoped_model/scoped_model.dart';
 2 | import 'note_service.dart';
 3 | import 'note.dart';
 4 | 
 5 | class NoteModel extends Model {
 6 |   final INoteService _service = FirestoreNoteService();
 7 | 
 8 |   List notes = [];
 9 |   bool isLoading = false;
10 |   bool isSubmittingNote = false;
11 |   bool noteHasSubmitted = false;
12 | 
13 |   dynamic nextCursor;
14 | 
15 |   bool get isEmpty => notes.isEmpty;
16 | 
17 |   void getNotes() async {
18 |     if (isLoading) {
19 |       return;
20 |     }
21 | 
22 |     isLoading = true;
23 | 
24 |     if (this.nextCursor == null) {
25 |       notifyListeners();
26 |     }
27 | 
28 |     final notes = await _service.getNotes(nextCursor: nextCursor);
29 |     if (notes.length >= INoteService.PER_PAGE) {
30 |       this.nextCursor = notes.last.updatedAt;
31 |     } else {
32 |       this.nextCursor = null;
33 |     }
34 | 
35 |     this.notes.addAll(notes);
36 |     this.isLoading = false;
37 |     notifyListeners();
38 |   }
39 | 
40 |   void deleteNote(Note note, Function() success) async {
41 |     if (this.isSubmittingNote) {
42 |       return;
43 |     }
44 | 
45 |     this.noteHasSubmitted = false;
46 |     this.isSubmittingNote = true;
47 |     notifyListeners();
48 |     await _service.deleteNote(note);
49 |     this.noteHasSubmitted = true;
50 |     this.isSubmittingNote = false;
51 |     notifyListeners();
52 |     success();
53 |   }
54 | 
55 |   void editNote(Note note, Function(Note note) success) async {
56 |     if (this.isSubmittingNote) {
57 |       return;
58 |     }
59 | 
60 |     this.noteHasSubmitted = false;
61 |     this.isSubmittingNote = true;
62 |     notifyListeners();
63 |     final updatedNote = await _service.updateNote(note);
64 |     this.noteHasSubmitted = true;
65 |     this.isSubmittingNote = false;
66 |     notifyListeners();
67 |     success(updatedNote);
68 |   }
69 | 
70 |   addNote(Note note, Function(Note note) success) async {
71 |     if (this.isSubmittingNote) {
72 |       return;
73 |     }
74 | 
75 |     this.noteHasSubmitted = false;
76 |     this.isSubmittingNote = true;
77 |     notifyListeners();
78 |     final createdNote = await _service.addNote(note);
79 |     this.noteHasSubmitted = true;
80 |     this.isSubmittingNote = false;
81 |     notifyListeners();
82 |     success(createdNote);
83 |   }
84 | 
85 |   void clearNotes() {
86 |     notes = [];
87 |     nextCursor = null;
88 |     notifyListeners();
89 |   }
90 | }
91 | 
--------------------------------------------------------------------------------
/lib/note_service.dart:
--------------------------------------------------------------------------------
 1 | import 'package:firenotes/note.dart';
 2 | import 'package:cloud_firestore/cloud_firestore.dart';
 3 | import 'dart:async';
 4 | 
 5 | abstract class INoteService {
 6 |   static const int PER_PAGE = 20;
 7 | 
 8 |   Future> getNotes({dynamic nextCursor});
 9 |   Future getNote(String uid);
10 | 
11 |   Future addNote(Note note);
12 |   Future updateNote(Note note);
13 |   Future deleteNote(Note note);
14 | }
15 | 
16 | class FirestoreNoteService implements INoteService {
17 |   static final _notesCollection = Firestore.instance.collection("notes");
18 | 
19 |   @override
20 |   Future addNote(Note note) async {
21 |     final Map data = {
22 |       'text': note.text,
23 |       'createdAt': FieldValue.serverTimestamp(),
24 |       'updatedAt': FieldValue.serverTimestamp()
25 |     };
26 | 
27 |     if (note.imageURL != null) {
28 |       data['imageURL'] = note.imageURL;
29 |     }
30 | 
31 |     final ref = await _notesCollection.add(data);
32 | 
33 |     final addedSnapshot = await ref.get();
34 |     final addedNote = Note.mapFromSnapshot(addedSnapshot);
35 |     return addedNote;
36 |   }
37 | 
38 |   @override
39 |   Future deleteNote(Note note) async {
40 |     await _notesCollection.document(note.uid).delete();
41 |     return true;
42 |   }
43 | 
44 |   @override
45 |   Future getNote(String uid) async {
46 |     final snapshot =
47 |         await _notesCollection.where("uid", isEqualTo: uid).getDocuments();
48 | 
49 |     final doc = snapshot.documents.first;
50 |     if (doc != null) {
51 |       return Note.mapFromSnapshot(doc);
52 |     } else {
53 |       return null;
54 |     }
55 |   }
56 | 
57 |   @override
58 |   Future> getNotes({dynamic nextCursor}) async {
59 |     var query = _notesCollection.orderBy('updatedAt', descending: true);
60 |     if (nextCursor != null) {
61 |       query = query.startAfter([nextCursor]);
62 |     }
63 | 
64 |     query = query.limit(INoteService.PER_PAGE);
65 | 
66 |     final snapshot = await query.getDocuments();
67 |     final notes =
68 |         snapshot.documents.map((doc) => Note.mapFromSnapshot(doc)).toList();
69 |     return notes;
70 |   }
71 | 
72 |   @override
73 |   Future updateNote(Note note) async {
74 |     final ref = _notesCollection.document(note.uid);
75 | 
76 |     final Map data = {
77 |       'text': note.text,
78 |       'updatedAt': FieldValue.serverTimestamp()
79 |     };
80 | 
81 |     if (note.imageURL != null) {
82 |       data['imageURL'] = note.imageURL;
83 |     }
84 | 
85 |     await ref.updateData(data);
86 | 
87 |     final updatedSnapshot = await ref.get();
88 |     final updatedNote = Note.mapFromSnapshot(updatedSnapshot);
89 |     return updatedNote;
90 |   }
91 | }
92 | 
--------------------------------------------------------------------------------
/lib/widgets/note_edit_widget.dart:
--------------------------------------------------------------------------------
  1 | import 'package:flutter/material.dart';
  2 | import 'package:scoped_model/scoped_model.dart';
  3 | import 'package:firenotes/note_model.dart';
  4 | import 'package:firenotes/note.dart';
  5 | import 'package:image_picker/image_picker.dart';
  6 | import 'package:firebase_storage/firebase_storage.dart';
  7 | import 'upload_task_list_tile_widget.dart';
  8 | import 'package:transparent_image/transparent_image.dart';
  9 | import 'dart:io';
 10 | 
 11 | class NoteEditWidget extends StatefulWidget {
 12 |   final Note _note;
 13 | 
 14 |   NoteEditWidget(this._note);
 15 | 
 16 |   @override
 17 |   _NoteEditWidgetState createState() => _NoteEditWidgetState();
 18 | }
 19 | 
 20 | class _NoteEditWidgetState extends State {
 21 |   final _scaffoldKey = GlobalKey();
 22 |   final _formKey = GlobalKey();
 23 |   final _textController = TextEditingController();
 24 |   final FirebaseStorage storage = FirebaseStorage.instance;
 25 | 
 26 |   StorageUploadTask _task;
 27 |   File _image;
 28 | 
 29 |   bool get isEditing => widget._note != null;
 30 |   NoteModel get _noteModel => ScopedModel.of(context);
 31 | 
 32 |   uploadFile(File file, Note note) {
 33 |     final String uuid = note.uid;
 34 | 
 35 |     final StorageReference ref =
 36 |         storage.ref().child('images').child("$uuid.jpg");
 37 |     final StorageUploadTask task = ref.putFile(
 38 |       file,
 39 |       StorageMetadata(
 40 |         contentType: 'image/jpeg',
 41 |       ),
 42 |     );
 43 | 
 44 |     setState(() {
 45 |       _task = task;
 46 |     });
 47 | 
 48 |     task.onComplete.then((value) {
 49 |       value.ref.getDownloadURL().then((v) {
 50 |         note.imageURL = v;
 51 |         _noteModel.editNote(note, (_) {
 52 |           Navigator.pop(context);
 53 |         });
 54 | 
 55 |         setState(() {
 56 |           _task = null;
 57 |         });
 58 |       }, onError: (e) {
 59 |         setState(() {
 60 |           _task = null;
 61 |         });
 62 |       });
 63 |     }, onError: (error) {
 64 |       setState(() {
 65 |         _task = null;
 66 |       });
 67 | 
 68 |       showInSnackBar('Upload Fails');
 69 |     });
 70 | 
 71 |     showInSnackBar('Uploading Image...');
 72 |   }
 73 | 
 74 |   Future getImage() async {
 75 |     var image = await ImagePicker.pickImage(
 76 |         source: ImageSource.gallery, maxHeight: 512, maxWidth: 512);
 77 |     setState(() {
 78 |       _image = image;
 79 |     });
 80 |   }
 81 | 
 82 |   void addNote(String text) async {
 83 |     _noteModel.addNote(Note(text: text), (note) {
 84 |       if (_image != null) {
 85 |         uploadFile(_image, note);
 86 |       } else {
 87 |         Navigator.pop(context);
 88 |       }
 89 |     });
 90 |     showInSnackBar('Adding Note...');
 91 |   }
 92 | 
 93 |   void updateNote(Note note, String text) async {
 94 |     widget._note.text = text;
 95 |     _noteModel.editNote(widget._note, (updatedNote) {
 96 |       if (_image != null) {
 97 |         uploadFile(_image, updatedNote);
 98 |       } else {
 99 |         Navigator.pop(context);
100 |       }
101 |     });
102 |     showInSnackBar('Updating Note');
103 |   }
104 | 
105 |   void deleteNote(Note note) {
106 |     final noteModel = ScopedModel.of(context);
107 |     noteModel.deleteNote(widget._note, () => Navigator.pop(context));
108 |     showInSnackBar('Deleting Note...');
109 |   }
110 | 
111 |   void showInSnackBar(String value) {
112 |     _scaffoldKey.currentState.showSnackBar(SnackBar(content: Text(value)));
113 |   }
114 | 
115 |   @override
116 |   void initState() {
117 |     _textController.text = isEditing ? widget._note.text : '';
118 |     super.initState();
119 |   }
120 | 
121 |   @override
122 |   Widget build(BuildContext context) {
123 |     List _formChildren = List();
124 |     if (_image != null) {
125 |       _formChildren.add(Center(
126 |         child: Image.file(_image),
127 |       ));
128 |     } else if (isEditing && widget._note.imageURL != null) {
129 |       _formChildren.add(Center(
130 |         child: FadeInImage.memoryNetwork(
131 |           placeholder: kTransparentImage,
132 |           image: widget._note.imageURL,
133 |         ),
134 |       ));
135 |     }
136 | 
137 |     _formChildren.add(TextFormField(
138 |       keyboardType: TextInputType.multiline,
139 |       maxLines: null,
140 |       controller: _textController,
141 |       validator: (value) {
142 |         if (value.isEmpty) {
143 |           return 'Please enter some text';
144 |         }
145 |       },
146 |     ));
147 | 
148 |     _formChildren.add(Padding(
149 |         padding: const EdgeInsets.symmetric(vertical: 16.0),
150 |         child: ScopedModelDescendant(
151 |           builder: (context, child, note) {
152 |             return RaisedButton(
153 |               onPressed: note.isSubmittingNote || _task != null
154 |                   ? null
155 |                   : () {
156 |                       if (_formKey.currentState.validate()) {
157 |                         final text = _textController.text;
158 |                         if (isEditing) {
159 |                           updateNote(widget._note, text);
160 |                         } else {
161 |                           addNote(text);
162 |                         }
163 |                       }
164 |                     },
165 |               child: Text('Submit'),
166 |             );
167 |           },
168 |         )));
169 | 
170 |     if (this._task != null && !this._task.isComplete) {
171 |       _formChildren.add(UploadTaskListTile(
172 |         task: _task,
173 |         onDismissed: () => setState(() => _task = null),
174 |         onDownload: () {},
175 |       ));
176 |     }
177 | 
178 |     return Scaffold(
179 |         key: _scaffoldKey,
180 |         appBar: AppBar(
181 |           title: Text(isEditing ? 'Edit Note' : 'Add Note'),
182 |           actions: !isEditing
183 |               ? null
184 |               : [
185 |                   IconButton(
186 |                       icon: Icon(Icons.delete),
187 |                       onPressed: () => deleteNote(widget._note)),
188 |                 ],
189 |         ),
190 |         floatingActionButton: FloatingActionButton(
191 |           onPressed:
192 |               _task != null || _noteModel.isSubmittingNote ? null : getImage,
193 |           tooltip: 'Pick Image',
194 |           child: Icon(Icons.add_a_photo),
195 |         ),
196 |         body: Padding(
197 |             padding: EdgeInsets.all(16.0),
198 |             child: Form(
199 |               key: _formKey,
200 |               child: ListView(
201 |                 children: _formChildren,
202 |               ),
203 |             )));
204 |   }
205 | }
206 | 
--------------------------------------------------------------------------------
/lib/widgets/note_list_widget.dart:
--------------------------------------------------------------------------------
 1 | import 'package:flutter/material.dart';
 2 | import 'package:scoped_model/scoped_model.dart';
 3 | import 'note_widget.dart';
 4 | import 'package:firenotes/note_model.dart';
 5 | import 'note_edit_widget.dart';
 6 | import 'package:firenotes/note.dart';
 7 | 
 8 | class NoteListWidget extends StatefulWidget {
 9 |   NoteListWidget({Key key, this.title}) : super(key: key);
10 |   final String title;
11 | 
12 |   @override
13 |   _NoteListState createState() => _NoteListState();
14 | }
15 | 
16 | class _NoteListState extends State {
17 |   NoteModel get _noteModel => ScopedModel.of(context);
18 | 
19 |   void refreshNotes() {
20 |     _noteModel.clearNotes();
21 |     _noteModel.getNotes();
22 |   }
23 | 
24 |   void addNote() {
25 |     Navigator.push(
26 |         context, MaterialPageRoute(builder: (context) => NoteEditWidget(null)));
27 |   }
28 | 
29 |   void editNote(Note note) {
30 |     Navigator.push(
31 |         context,
32 |         MaterialPageRoute(
33 |             builder: (context) => NoteEditWidget(Note.clone(note))));
34 |   }
35 | 
36 |   @override
37 |   Widget build(BuildContext context) {
38 |     refreshNotes();
39 |     return Scaffold(
40 |         appBar: AppBar(
41 |           title: Text(widget.title),
42 |           actions: [
43 |             IconButton(
44 |                 icon: Icon(Icons.refresh), onPressed: () => refreshNotes()),
45 |             IconButton(icon: Icon(Icons.add), onPressed: () => addNote())
46 |           ],
47 |         ),
48 |         body: Center(child:
49 |             ScopedModelDescendant(builder: (context, child, note) {
50 |           return note.isLoading && note.isEmpty
51 |               ? CircularProgressIndicator(value: null)
52 |               : ListView.builder(
53 |                   padding: EdgeInsets.all(8.0),
54 |                   itemCount: note.notes.length,
55 |                   itemBuilder: (BuildContext ctx, int index) {
56 |                     final noteWidget = NoteWidget(
57 |                         note.notes[index], () => editNote(note.notes[index]));
58 |                     if (index == note.notes.length - 1 &&
59 |                         note.nextCursor != null &&
60 |                         !note.isLoading) {
61 |                       note.getNotes();
62 |                       return Column(
63 |                         crossAxisAlignment: CrossAxisAlignment.stretch,
64 |                         children: [
65 |                           noteWidget,
66 |                           Center(
67 |                             child: CircularProgressIndicator(
68 |                               value: null,
69 |                             ),
70 |                           )
71 |                         ],
72 |                       );
73 |                     }
74 |                     return noteWidget;
75 |                   },
76 |                 );
77 |         })));
78 |   }
79 | }
80 | 
--------------------------------------------------------------------------------
/lib/widgets/note_widget.dart:
--------------------------------------------------------------------------------
 1 | import 'package:firenotes/note.dart';
 2 | import 'package:flutter/material.dart';
 3 | import 'package:transparent_image/transparent_image.dart';
 4 | 
 5 | class NoteWidget extends StatelessWidget {
 6 |   final Note _note;
 7 |   final Function() _onTap;
 8 | 
 9 |   NoteWidget(this._note, this._onTap);
10 | 
11 |   @override
12 |   Widget build(BuildContext context) {
13 |     final List rowChildren = [];
14 | 
15 |     rowChildren.add(Expanded(
16 |         child: Column(
17 |             mainAxisAlignment: MainAxisAlignment.spaceEvenly,
18 |             crossAxisAlignment: CrossAxisAlignment.start,
19 |             children: [
20 |           Text(
21 |             _note.text,
22 |             style: Theme.of(context).textTheme.display1,
23 |           ),
24 |           // Text(
25 |           //   _note.updatedAt.toString(),
26 |           //   style: Theme.of(context).textTheme.caption,
27 |           // )
28 |         ])));
29 | 
30 |     if (_note.imageURL != null) {
31 |       rowChildren.add(Expanded(
32 |         child: FadeInImage.memoryNetwork(
33 |           placeholder: kTransparentImage,
34 |           image: _note.imageURL,
35 |           width: 80,
36 |         ),
37 |       ));
38 |     }
39 | 
40 |     return InkWell(
41 |         onTap: this._onTap,
42 |         child: Card(
43 |             child: Padding(
44 |           padding: EdgeInsets.all(8.0),
45 |           child: Row(
46 |             crossAxisAlignment: CrossAxisAlignment.start,
47 |             children: rowChildren,
48 |           ),
49 |         )));
50 |   }
51 | }
52 | 
--------------------------------------------------------------------------------
/lib/widgets/upload_task_list_tile_widget.dart:
--------------------------------------------------------------------------------
 1 | import 'package:flutter/material.dart';
 2 | import 'package:firebase_storage/firebase_storage.dart';
 3 | 
 4 | class UploadTaskListTile extends StatelessWidget {
 5 |   const UploadTaskListTile(
 6 |       {Key key, this.task, this.onDismissed, this.onDownload})
 7 |       : super(key: key);
 8 | 
 9 |   final StorageUploadTask task;
10 |   final VoidCallback onDismissed;
11 |   final VoidCallback onDownload;
12 | 
13 |   String get status {
14 |     String result;
15 |     if (task.isComplete) {
16 |       if (task.isSuccessful) {
17 |         result = 'Complete';
18 |       } else if (task.isCanceled) {
19 |         result = 'Canceled';
20 |       } else {
21 |         result = 'Failed ERROR: ${task.lastSnapshot.error}';
22 |       }
23 |     } else if (task.isInProgress) {
24 |       result = 'Uploading';
25 |     } else if (task.isPaused) {
26 |       result = 'Paused';
27 |     }
28 |     return result;
29 |   }
30 | 
31 |   String _bytesTransferred(StorageTaskSnapshot snapshot) {
32 |     final percentage =
33 |         (snapshot.bytesTransferred / snapshot.totalByteCount) * 100;
34 |     return "${percentage.toInt()}%";
35 |   }
36 | 
37 |   @override
38 |   Widget build(BuildContext context) {
39 |     return StreamBuilder(
40 |       stream: task.events,
41 |       builder: (BuildContext context,
42 |           AsyncSnapshot asyncSnapshot) {
43 |         Widget subtitle;
44 |         if (asyncSnapshot.hasData) {
45 |           final StorageTaskEvent event = asyncSnapshot.data;
46 |           final StorageTaskSnapshot snapshot = event.snapshot;
47 |           subtitle = Text('${_bytesTransferred(snapshot)}');
48 |         } else {
49 |           subtitle = const Text('Starting...');
50 |         }
51 |         return ListTile(
52 |           key: Key(task.hashCode.toString()),
53 |           title: Text('$status'),
54 |           subtitle: subtitle,
55 |           trailing: Row(
56 |             mainAxisSize: MainAxisSize.min,
57 |             children: [
58 |               Offstage(
59 |                 offstage: !task.isInProgress,
60 |                 child: IconButton(
61 |                   icon: const Icon(Icons.pause),
62 |                   onPressed: () => task.pause(),
63 |                 ),
64 |               ),
65 |               Offstage(
66 |                 offstage: !task.isPaused,
67 |                 child: IconButton(
68 |                   icon: const Icon(Icons.file_upload),
69 |                   onPressed: () => task.resume(),
70 |                 ),
71 |               ),
72 |             ],
73 |           ),
74 |         );
75 |       },
76 |     );
77 |   }
78 | }
79 | 
--------------------------------------------------------------------------------
/promo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alfianlosari/firenotes/0346b37f6400de90c484d754fa1134b6e8ba54fe/promo.png
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
  1 | # Generated by pub
  2 | # See https://www.dartlang.org/tools/pub/glossary#lockfile
  3 | packages:
  4 |   async:
  5 |     dependency: transitive
  6 |     description:
  7 |       name: async
  8 |       url: "https://pub.dartlang.org"
  9 |     source: hosted
 10 |     version: "2.0.8"
 11 |   boolean_selector:
 12 |     dependency: transitive
 13 |     description:
 14 |       name: boolean_selector
 15 |       url: "https://pub.dartlang.org"
 16 |     source: hosted
 17 |     version: "1.0.4"
 18 |   charcode:
 19 |     dependency: transitive
 20 |     description:
 21 |       name: charcode
 22 |       url: "https://pub.dartlang.org"
 23 |     source: hosted
 24 |     version: "1.1.2"
 25 |   cloud_firestore:
 26 |     dependency: "direct main"
 27 |     description:
 28 |       name: cloud_firestore
 29 |       url: "https://pub.dartlang.org"
 30 |     source: hosted
 31 |     version: "0.9.5+2"
 32 |   cloud_functions:
 33 |     dependency: "direct main"
 34 |     description:
 35 |       name: cloud_functions
 36 |       url: "https://pub.dartlang.org"
 37 |     source: hosted
 38 |     version: "0.1.1+1"
 39 |   collection:
 40 |     dependency: transitive
 41 |     description:
 42 |       name: collection
 43 |       url: "https://pub.dartlang.org"
 44 |     source: hosted
 45 |     version: "1.14.11"
 46 |   cupertino_icons:
 47 |     dependency: "direct main"
 48 |     description:
 49 |       name: cupertino_icons
 50 |       url: "https://pub.dartlang.org"
 51 |     source: hosted
 52 |     version: "0.1.2"
 53 |   firebase_core:
 54 |     dependency: "direct main"
 55 |     description:
 56 |       name: firebase_core
 57 |       url: "https://pub.dartlang.org"
 58 |     source: hosted
 59 |     version: "0.3.1+1"
 60 |   firebase_storage:
 61 |     dependency: "direct main"
 62 |     description:
 63 |       name: firebase_storage
 64 |       url: "https://pub.dartlang.org"
 65 |     source: hosted
 66 |     version: "2.1.0+1"
 67 |   flutter:
 68 |     dependency: "direct main"
 69 |     description: flutter
 70 |     source: sdk
 71 |     version: "0.0.0"
 72 |   flutter_test:
 73 |     dependency: "direct dev"
 74 |     description: flutter
 75 |     source: sdk
 76 |     version: "0.0.0"
 77 |   image_picker:
 78 |     dependency: "direct main"
 79 |     description:
 80 |       name: image_picker
 81 |       url: "https://pub.dartlang.org"
 82 |     source: hosted
 83 |     version: "0.5.0+3"
 84 |   matcher:
 85 |     dependency: transitive
 86 |     description:
 87 |       name: matcher
 88 |       url: "https://pub.dartlang.org"
 89 |     source: hosted
 90 |     version: "0.12.3+1"
 91 |   meta:
 92 |     dependency: transitive
 93 |     description:
 94 |       name: meta
 95 |       url: "https://pub.dartlang.org"
 96 |     source: hosted
 97 |     version: "1.1.6"
 98 |   path:
 99 |     dependency: transitive
100 |     description:
101 |       name: path
102 |       url: "https://pub.dartlang.org"
103 |     source: hosted
104 |     version: "1.6.2"
105 |   pedantic:
106 |     dependency: transitive
107 |     description:
108 |       name: pedantic
109 |       url: "https://pub.dartlang.org"
110 |     source: hosted
111 |     version: "1.4.0"
112 |   quiver:
113 |     dependency: transitive
114 |     description:
115 |       name: quiver
116 |       url: "https://pub.dartlang.org"
117 |     source: hosted
118 |     version: "2.0.1"
119 |   scoped_model:
120 |     dependency: "direct main"
121 |     description:
122 |       name: scoped_model
123 |       url: "https://pub.dartlang.org"
124 |     source: hosted
125 |     version: "1.0.1"
126 |   sky_engine:
127 |     dependency: transitive
128 |     description: flutter
129 |     source: sdk
130 |     version: "0.0.99"
131 |   source_span:
132 |     dependency: transitive
133 |     description:
134 |       name: source_span
135 |       url: "https://pub.dartlang.org"
136 |     source: hosted
137 |     version: "1.5.4"
138 |   stack_trace:
139 |     dependency: transitive
140 |     description:
141 |       name: stack_trace
142 |       url: "https://pub.dartlang.org"
143 |     source: hosted
144 |     version: "1.9.3"
145 |   stream_channel:
146 |     dependency: transitive
147 |     description:
148 |       name: stream_channel
149 |       url: "https://pub.dartlang.org"
150 |     source: hosted
151 |     version: "1.6.8"
152 |   string_scanner:
153 |     dependency: transitive
154 |     description:
155 |       name: string_scanner
156 |       url: "https://pub.dartlang.org"
157 |     source: hosted
158 |     version: "1.0.4"
159 |   term_glyph:
160 |     dependency: transitive
161 |     description:
162 |       name: term_glyph
163 |       url: "https://pub.dartlang.org"
164 |     source: hosted
165 |     version: "1.1.0"
166 |   test_api:
167 |     dependency: transitive
168 |     description:
169 |       name: test_api
170 |       url: "https://pub.dartlang.org"
171 |     source: hosted
172 |     version: "0.2.2"
173 |   transparent_image:
174 |     dependency: "direct main"
175 |     description:
176 |       name: transparent_image
177 |       url: "https://pub.dartlang.org"
178 |     source: hosted
179 |     version: "0.1.0"
180 |   typed_data:
181 |     dependency: transitive
182 |     description:
183 |       name: typed_data
184 |       url: "https://pub.dartlang.org"
185 |     source: hosted
186 |     version: "1.1.6"
187 |   vector_math:
188 |     dependency: transitive
189 |     description:
190 |       name: vector_math
191 |       url: "https://pub.dartlang.org"
192 |     source: hosted
193 |     version: "2.0.8"
194 | sdks:
195 |   dart: ">=2.1.0 <3.0.0"
196 |   flutter: ">=0.2.4 <2.0.0"
197 | 
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
 1 | name: firenotes
 2 | description: Notes App using Firebase & Firestore as Backend
 3 | 
 4 | version: 1.0.0+1
 5 | 
 6 | environment:
 7 |   sdk: ">=2.1.0 <3.0.0"
 8 | 
 9 | dependencies:
10 |   flutter:
11 |     sdk: flutter
12 | 
13 |   image_picker: ^0.5.0+3
14 |   scoped_model: ^1.0.1
15 | 
16 |   firebase_core: ^0.3.1
17 |   firebase_storage: ^2.1.0
18 |   cloud_firestore: ^0.9.5
19 |   cloud_functions: ^0.1.1
20 |   transparent_image: ^0.1.0
21 |   cupertino_icons: ^0.1.2
22 | 
23 | dev_dependencies:
24 |   flutter_test:
25 |     sdk: flutter
26 | 
27 | flutter:
28 | 
29 |   uses-material-design: true
30 | 
31 | 
--------------------------------------------------------------------------------
/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:firenotes/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 | 
--------------------------------------------------------------------------------