├── .flutter-plugins ├── .github └── FUNDING.yml ├── .gitignore ├── .idea ├── codeStyles │ └── Project.xml ├── libraries │ ├── Dart_Packages.xml │ ├── Dart_SDK.xml │ └── Flutter_Plugins.xml ├── misc.xml ├── modules.xml ├── taskist.iml ├── vcs.xml └── workspace.xml ├── LICENSE ├── README.md ├── android ├── .gitignore ├── .idea │ ├── codeStyles │ │ └── Project.xml │ ├── gradle.xml │ ├── misc.xml │ ├── modules.xml │ └── runConfigurations.xml ├── app │ ├── build.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ └── com │ │ │ └── huextrat │ │ │ └── taskist │ │ │ └── MainActivity.kt │ │ ├── res │ │ ├── drawable │ │ │ ├── gradient_background.xml │ │ │ ├── ic_launcher.png │ │ │ └── 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 │ │ └── web_hi_res_512.png ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── assets ├── list.png └── logo.png ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── 1024.jpg │ │ ├── 120-1.jpg │ │ ├── 120.jpg │ │ ├── 152.jpg │ │ ├── 167.png │ │ ├── 180.jpg │ │ ├── 20.jpg │ │ ├── 29-1.jpg │ │ ├── 29.jpg │ │ ├── 40-1.jpg │ │ ├── 40.jpg │ │ ├── 58-1.jpg │ │ ├── 58.jpg │ │ ├── 60.jpg │ │ ├── 76.jpg │ │ ├── 80-1.jpg │ │ ├── 80.jpg │ │ ├── 87.jpg │ │ ├── Contents.json │ │ └── Icon-41.png │ └── LaunchImage.imageset │ │ ├── 152.jpg │ │ ├── 76.jpg │ │ ├── Contents.json │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ ├── Runner-Bridging-Header.h │ └── Runner.entitlements ├── lib ├── main.dart ├── model │ └── element.dart ├── ui │ ├── page_addlist.dart │ ├── page_detail.dart │ ├── page_done.dart │ ├── page_settings.dart │ └── page_task.dart └── utils │ └── diamond_fab.dart ├── pubspec.yaml ├── taskist.iml ├── taskist_android.iml └── test └── widget_test.dart /.flutter-plugins: -------------------------------------------------------------------------------- 1 | cloud_firestore=/Users/hugo.extrat/Documents/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.9.7/ 2 | connectivity=/Users/hugo.extrat/Documents/flutter/.pub-cache/hosted/pub.dartlang.org/connectivity-0.4.2/ 3 | firebase_analytics=/Users/hugo.extrat/Documents/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-2.0.3/ 4 | firebase_auth=/Users/hugo.extrat/Documents/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.8.2/ 5 | firebase_core=/Users/hugo.extrat/Documents/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.3.1+1/ 6 | launch_review=/Users/hugo.extrat/Documents/flutter/.pub-cache/hosted/pub.dartlang.org/launch_review-2.0.0/ 7 | share=/Users/hugo.extrat/Documents/flutter/.pub-cache/hosted/pub.dartlang.org/share-0.6.0+1/ 8 | url_launcher=/Users/hugo.extrat/Documents/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-5.0.2/ 9 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://www.dartlang.org/guides/libraries/private-files 2 | 3 | # Files and directories created by pub 4 | .dart_tool/ 5 | .packages 6 | .pub/ 7 | build/ 8 | # If you're building an application, you may want to check-in your pubspec.lock 9 | pubspec.lock 10 | 11 | # Directory created by dartdoc 12 | # If you don't generate documentation locally you can remove this line. 13 | doc/api/ 14 | 15 | android/app/google-services\.json 16 | 17 | ios/Runner/GoogleService-Info\.plist 18 | 19 | android/app/key\.jks 20 | 21 | android/app/proguard-rules\.pro 22 | 23 | android/key\.properties 24 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 15 | 16 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /.idea/libraries/Dart_Packages.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | -------------------------------------------------------------------------------- /.idea/libraries/Dart_SDK.xml: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /.idea/libraries/Flutter_Plugins.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 27 | 28 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/taskist.iml: -------------------------------------------------------------------------------- 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 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Hugo EXTRAT 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Taskist

2 | 3 |

4 | Taskist is a ToDo List app for Task Management inspired by the design below 5 |

6 | 7 |

8 | The app is using Firebase, you have to configure it from your side to test the app 9 |

10 | 11 |

12 | Download it on Android now: 13 | Taskist on Android 14 | 15 |
16 | Download it on iOS now: 17 | Taskist on iOS 18 | 19 |

20 | 21 | 22 |
23 | 24 | License MIT 25 | 26 | 27 | Awesome Flutter 28 | 29 | 30 | Dart 31 | 32 | 33 | Flutter 34 | 35 |
36 | 37 | 38 |
39 |

40 | 41 | www.hugoextrat.com 42 | 43 |

44 |
45 | 46 | 47 |

48 | UI Design 49 |

50 | 51 |
52 | 53 |
54 | 55 |

56 | Taskist 57 |

58 | 59 |
60 | 61 |
62 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | *.class 3 | .gradle 4 | /local.properties 5 | /.idea/workspace.xml 6 | /.idea/libraries 7 | .DS_Store 8 | /build 9 | /captures 10 | GeneratedPluginRegistrant.java 11 | -------------------------------------------------------------------------------- /android/.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 15 | 16 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /android/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | 25 | -------------------------------------------------------------------------------- /android/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | -------------------------------------------------------------------------------- /android/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /android/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /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 | def keystorePropertiesFile = rootProject.file("key.properties") 25 | def keystoreProperties = new Properties() 26 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 27 | 28 | apply plugin: 'com.android.application' 29 | apply plugin: 'kotlin-android' 30 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 31 | 32 | android { 33 | compileSdkVersion 28 34 | 35 | sourceSets { 36 | main.java.srcDirs += 'src/main/kotlin' 37 | } 38 | 39 | lintOptions { 40 | disable 'InvalidPackage' 41 | } 42 | 43 | defaultConfig { 44 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 45 | applicationId "com.huextrat.taskist" 46 | minSdkVersion 16 47 | targetSdkVersion 28 48 | versionCode flutterVersionCode.toInteger() 49 | versionName flutterVersionName 50 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 51 | multiDexEnabled true 52 | } 53 | 54 | signingConfigs { 55 | release { 56 | keyAlias keystoreProperties['keyAlias'] 57 | keyPassword keystoreProperties['keyPassword'] 58 | storeFile file(keystoreProperties['storeFile']) 59 | storePassword keystoreProperties['storePassword'] 60 | } 61 | } 62 | buildTypes { 63 | release { 64 | signingConfig signingConfigs.release 65 | 66 | useProguard true 67 | 68 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 69 | } 70 | } 71 | } 72 | 73 | flutter { 74 | source '../..' 75 | } 76 | 77 | dependencies { 78 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 79 | testImplementation 'junit:junit:4.12' 80 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 81 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 82 | 83 | implementation 'com.android.support:multidex:1.0.3' 84 | } 85 | apply plugin: 'com.google.gms.google-services' -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 8 | 9 | 10 | 15 | 19 | 26 | 30 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/huextrat/taskist/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.huextrat.taskist 2 | 3 | import android.os.Bundle 4 | 5 | import io.flutter.app.FlutterActivity 6 | import io.flutter.plugins.GeneratedPluginRegistrant 7 | 8 | class MainActivity(): FlutterActivity() { 9 | override fun onCreate(savedInstanceState: Bundle?) { 10 | super.onCreate(savedInstanceState) 11 | GeneratedPluginRegistrant.registerWith(this) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/gradient_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/android/app/src/main/res/drawable/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/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/main/web_hi_res_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/android/app/src/main/web_hi_res_512.png -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.21' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.3.2' 10 | classpath 'com.google.gms:google-services:4.2.0' 11 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | google() 18 | jcenter() 19 | } 20 | } 21 | 22 | rootProject.buildDir = '../build' 23 | subprojects { 24 | project.buildDir = "${rootProject.buildDir}/${project.name}" 25 | } 26 | subprojects { 27 | project.evaluationDependsOn(':app') 28 | } 29 | 30 | task clean(type: Delete) { 31 | delete rootProject.buildDir 32 | } 33 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /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.1-all.zip 7 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /assets/list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/assets/list.png -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/assets/logo.png -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vagrant/ 3 | .sconsign.dblite 4 | .svn/ 5 | 6 | .DS_Store 7 | *.swp 8 | profile 9 | 10 | DerivedData/ 11 | build/ 12 | GeneratedPluginRegistrant.h 13 | GeneratedPluginRegistrant.m 14 | 15 | .generated/ 16 | 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | 22 | !default.pbxuser 23 | !default.mode1v3 24 | !default.mode2v3 25 | !default.perspectivev3 26 | 27 | xcuserdata 28 | 29 | *.moved-aside 30 | 31 | *.pyc 32 | *sync/ 33 | Icon? 34 | .tags* 35 | 36 | /Flutter/app.flx 37 | /Flutter/app.zip 38 | /Flutter/flutter_assets/ 39 | /Flutter/App.framework 40 | /Flutter/Flutter.framework 41 | /Flutter/Generated.xcconfig 42 | /ServiceDefinitions.json 43 | 44 | Pods/ 45 | .symlinks/ 46 | -------------------------------------------------------------------------------- /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 | def parse_KV_file(file, separator='=') 8 | file_abs_path = File.expand_path(file) 9 | if !File.exists? file_abs_path 10 | return []; 11 | end 12 | pods_ary = [] 13 | skip_line_start_symbols = ["#", "/"] 14 | File.foreach(file_abs_path) { |line| 15 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } 16 | plugin = line.split(pattern=separator) 17 | if plugin.length == 2 18 | podname = plugin[0].strip() 19 | path = plugin[1].strip() 20 | podpath = File.expand_path("#{path}", file_abs_path) 21 | pods_ary.push({:name => podname, :path => podpath}); 22 | else 23 | puts "Invalid plugin specification: #{line}" 24 | end 25 | } 26 | return pods_ary 27 | end 28 | 29 | target 'Runner' do 30 | use_frameworks! 31 | 32 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock 33 | # referring to absolute paths on developers' machines. 34 | system('rm -rf .symlinks') 35 | system('mkdir -p .symlinks/plugins') 36 | 37 | # Flutter Pods 38 | generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') 39 | if generated_xcode_build_settings.empty? 40 | puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." 41 | end 42 | generated_xcode_build_settings.map { |p| 43 | if p[:name] == 'FLUTTER_FRAMEWORK_DIR' 44 | symlink = File.join('.symlinks', 'flutter') 45 | File.symlink(File.dirname(p[:path]), symlink) 46 | pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) 47 | end 48 | } 49 | 50 | # Plugin Pods 51 | plugin_pods = parse_KV_file('../.flutter-plugins') 52 | plugin_pods.map { |p| 53 | symlink = File.join('.symlinks', 'plugins', p[:name]) 54 | File.symlink(p[:path], symlink) 55 | pod p[:name], :path => File.join(symlink, 'ios') 56 | } 57 | end 58 | 59 | post_install do |installer| 60 | installer.pods_project.targets.each do |target| 61 | target.build_configurations.each do |config| 62 | config.build_settings['ENABLE_BITCODE'] = 'NO' 63 | end 64 | end 65 | end 66 | -------------------------------------------------------------------------------- /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 | - connectivity (0.0.1): 15 | - Flutter 16 | - Reachability 17 | - Firebase/Auth (5.7.0): 18 | - Firebase/CoreOnly 19 | - FirebaseAuth (= 5.0.3) 20 | - Firebase/Core (5.7.0): 21 | - Firebase/CoreOnly 22 | - FirebaseAnalytics (= 5.1.1) 23 | - Firebase/CoreOnly (5.7.0): 24 | - FirebaseCore (= 5.1.2) 25 | - Firebase/Database (5.7.0): 26 | - Firebase/CoreOnly 27 | - FirebaseDatabase (= 5.0.2) 28 | - Firebase/Firestore (5.7.0): 29 | - Firebase/CoreOnly 30 | - FirebaseFirestore (= 0.13.2) 31 | - firebase_analytics (0.0.1): 32 | - Firebase/Core 33 | - Flutter 34 | - firebase_auth (0.0.1): 35 | - Firebase/Auth 36 | - Firebase/Core 37 | - Flutter 38 | - firebase_core (0.0.1): 39 | - Firebase/Core 40 | - Flutter 41 | - FirebaseAnalytics (5.1.1): 42 | - FirebaseCore (~> 5.1) 43 | - FirebaseInstanceID (~> 3.2) 44 | - GoogleAppMeasurement (~> 5.1) 45 | - GoogleUtilities/AppDelegateSwizzler (~> 5.2.0) 46 | - GoogleUtilities/MethodSwizzler (~> 5.2.0) 47 | - GoogleUtilities/Network (~> 5.2) 48 | - "GoogleUtilities/NSData+zlib (~> 5.2)" 49 | - nanopb (~> 0.3) 50 | - FirebaseAuth (5.0.3): 51 | - FirebaseAuthInterop (~> 1.0) 52 | - FirebaseCore (~> 5.0) 53 | - GoogleUtilities/Environment (~> 5.2) 54 | - GTMSessionFetcher/Core (~> 1.1) 55 | - FirebaseAuthInterop (1.0.0) 56 | - FirebaseCore (5.1.2): 57 | - GoogleUtilities/Logger (~> 5.2) 58 | - FirebaseDatabase (5.0.2): 59 | - FirebaseCore (~> 5.0) 60 | - leveldb-library (~> 1.18) 61 | - FirebaseFirestore (0.13.2): 62 | - FirebaseAuthInterop (~> 1.0) 63 | - FirebaseCore (~> 5.0) 64 | - FirebaseFirestore/abseil-cpp (= 0.13.2) 65 | - gRPC-ProtoRPC (~> 1.0) 66 | - leveldb-library (~> 1.18) 67 | - nanopb (~> 0.3.8) 68 | - Protobuf (~> 3.1) 69 | - FirebaseFirestore/abseil-cpp (0.13.2): 70 | - FirebaseAuthInterop (~> 1.0) 71 | - FirebaseCore (~> 5.0) 72 | - gRPC-ProtoRPC (~> 1.0) 73 | - leveldb-library (~> 1.18) 74 | - nanopb (~> 0.3.8) 75 | - Protobuf (~> 3.1) 76 | - FirebaseInstanceID (3.2.1): 77 | - FirebaseCore (~> 5.1) 78 | - GoogleUtilities/Environment (~> 5.2) 79 | - Flutter (1.0.0) 80 | - GoogleAppMeasurement (5.1.1): 81 | - GoogleUtilities/AppDelegateSwizzler (~> 5.2.0) 82 | - GoogleUtilities/MethodSwizzler (~> 5.2.0) 83 | - GoogleUtilities/Network (~> 5.2) 84 | - "GoogleUtilities/NSData+zlib (~> 5.2)" 85 | - nanopb (~> 0.3) 86 | - GoogleUtilities/AppDelegateSwizzler (5.2.3): 87 | - GoogleUtilities/Environment 88 | - GoogleUtilities/Logger 89 | - GoogleUtilities/Network 90 | - GoogleUtilities/Environment (5.2.3) 91 | - GoogleUtilities/Logger (5.2.3): 92 | - GoogleUtilities/Environment 93 | - GoogleUtilities/MethodSwizzler (5.2.3): 94 | - GoogleUtilities/Logger 95 | - GoogleUtilities/Network (5.2.3): 96 | - GoogleUtilities/Logger 97 | - "GoogleUtilities/NSData+zlib" 98 | - GoogleUtilities/Reachability 99 | - "GoogleUtilities/NSData+zlib (5.2.3)" 100 | - GoogleUtilities/Reachability (5.2.3): 101 | - GoogleUtilities/Logger 102 | - gRPC (1.14.1): 103 | - gRPC-RxLibrary (= 1.14.1) 104 | - gRPC/Main (= 1.14.1) 105 | - gRPC-Core (1.14.1): 106 | - gRPC-Core/Implementation (= 1.14.1) 107 | - gRPC-Core/Interface (= 1.14.1) 108 | - gRPC-Core/Implementation (1.14.1): 109 | - BoringSSL (~> 10.0) 110 | - gRPC-Core/Interface (= 1.14.1) 111 | - nanopb (~> 0.3) 112 | - gRPC-Core/Interface (1.14.1) 113 | - gRPC-ProtoRPC (1.14.1): 114 | - gRPC-ProtoRPC/Main (= 1.14.1) 115 | - gRPC-ProtoRPC/Main (1.14.1): 116 | - gRPC (= 1.14.1) 117 | - gRPC-RxLibrary (= 1.14.1) 118 | - Protobuf (~> 3.0) 119 | - gRPC-RxLibrary (1.14.1) 120 | - gRPC/Main (1.14.1): 121 | - gRPC-Core (= 1.14.1) 122 | - gRPC-RxLibrary (= 1.14.1) 123 | - GTMSessionFetcher/Core (1.2.0) 124 | - launch_review (0.0.1): 125 | - Flutter 126 | - leveldb-library (1.20) 127 | - nanopb (0.3.8): 128 | - nanopb/decode (= 0.3.8) 129 | - nanopb/encode (= 0.3.8) 130 | - nanopb/decode (0.3.8) 131 | - nanopb/encode (0.3.8) 132 | - Protobuf (3.6.1) 133 | - Reachability (3.2) 134 | - share (0.5.2): 135 | - Flutter 136 | - url_launcher (0.0.1): 137 | - Flutter 138 | 139 | DEPENDENCIES: 140 | - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) 141 | - connectivity (from `.symlinks/plugins/connectivity/ios`) 142 | - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) 143 | - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) 144 | - firebase_core (from `.symlinks/plugins/firebase_core/ios`) 145 | - Flutter (from `.symlinks/flutter/ios`) 146 | - launch_review (from `.symlinks/plugins/launch_review/ios`) 147 | - share (from `.symlinks/plugins/share/ios`) 148 | - url_launcher (from `.symlinks/plugins/url_launcher/ios`) 149 | 150 | SPEC REPOS: 151 | https://github.com/cocoapods/specs.git: 152 | - BoringSSL 153 | - Firebase 154 | - FirebaseAnalytics 155 | - FirebaseAuth 156 | - FirebaseAuthInterop 157 | - FirebaseCore 158 | - FirebaseDatabase 159 | - FirebaseFirestore 160 | - FirebaseInstanceID 161 | - GoogleAppMeasurement 162 | - GoogleUtilities 163 | - gRPC 164 | - gRPC-Core 165 | - gRPC-ProtoRPC 166 | - gRPC-RxLibrary 167 | - GTMSessionFetcher 168 | - leveldb-library 169 | - nanopb 170 | - Protobuf 171 | - Reachability 172 | 173 | EXTERNAL SOURCES: 174 | cloud_firestore: 175 | :path: ".symlinks/plugins/cloud_firestore/ios" 176 | connectivity: 177 | :path: ".symlinks/plugins/connectivity/ios" 178 | firebase_analytics: 179 | :path: ".symlinks/plugins/firebase_analytics/ios" 180 | firebase_auth: 181 | :path: ".symlinks/plugins/firebase_auth/ios" 182 | firebase_core: 183 | :path: ".symlinks/plugins/firebase_core/ios" 184 | Flutter: 185 | :path: ".symlinks/flutter/ios" 186 | launch_review: 187 | :path: ".symlinks/plugins/launch_review/ios" 188 | share: 189 | :path: ".symlinks/plugins/share/ios" 190 | url_launcher: 191 | :path: ".symlinks/plugins/url_launcher/ios" 192 | 193 | SPEC CHECKSUMS: 194 | BoringSSL: e10f92a27043805c01071fe815a5cd98ae8212e7 195 | cloud_firestore: 980813a98d8beb5c321b589845fabf6c4c5bd571 196 | connectivity: d5992e3758d68b1c4b12d6e012fe0813f1aa1645 197 | Firebase: 734a4f92957aa6c40e7ae3fda3d9359e1890aa87 198 | firebase_analytics: 06fd3e199bfbc003a9949b90f3e3c6332fa1299e 199 | firebase_auth: a5b249720380ab4ee1c633368cbb84aac9959359 200 | firebase_core: c96aa8b2fcf7f5167d32f22034f502f9304952b8 201 | FirebaseAnalytics: 993577e91157feb40945abedd6ab346d8a4b6ac8 202 | FirebaseAuth: 657a25e4be044d2d333663ebf515a861c5a59cd7 203 | FirebaseAuthInterop: 0ffa57668be100582bb7643d4fcb7615496c41fc 204 | FirebaseCore: 3a97432acb324b439fbed338e642f9cbb516a63d 205 | FirebaseDatabase: 27be5ac5bc75e0b17537b2bbfada8258addcc8cd 206 | FirebaseFirestore: 7eec93809ad61e7ebe303089c5cc5efa63424b72 207 | FirebaseInstanceID: ea5af6920d0a4a29b40459d055bebe4a6c1333c4 208 | Flutter: 9d0fac939486c9aba2809b7982dfdbb47a7b0296 209 | GoogleAppMeasurement: f7507b39b70ad0bd80b3d81518b2f43868974307 210 | GoogleUtilities: 6f681e27050c5e130325e89fa0316dfca826f954 211 | gRPC: 65fa2a50c4fd61940b76f4962d75c239c92c6a8d 212 | gRPC-Core: e3ace1e1161e75903135de8d8231bb69c9d35721 213 | gRPC-ProtoRPC: 78f976fc6a1eafc0e1f4965c255c313aa0859b1e 214 | gRPC-RxLibrary: c4c826507ad3c8c8fab6887f153938eb04b86d59 215 | GTMSessionFetcher: 0c4baf0a73acd0041bf9f71ea018deedab5ea84e 216 | launch_review: 98c85a4cb86d1376b14958ebe69ddbcc753ff192 217 | leveldb-library: 08cba283675b7ed2d99629a4bc5fd052cd2bb6a5 218 | nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3 219 | Protobuf: 1eb9700044745f00181c136ef21b8ff3ad5a0fd5 220 | Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 221 | share: 222b5dcc8031238af9d7de91149df65bad1aef75 222 | url_launcher: 92b89c1029a0373879933c21642958c874539095 223 | 224 | PODFILE CHECKSUM: 7765ea4305eaab0b3dfd384c7de11902aa3195fd 225 | 226 | COCOAPODS: 1.5.3 227 | -------------------------------------------------------------------------------- /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 | 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 12 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 13 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 14 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 15 | 63EF626A213EF1A1008E26F0 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 63EF6269213EF1A1008E26F0 /* GoogleService-Info.plist */; }; 16 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 17 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 18 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 19 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; 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 | E8114118943580EE9978DD94 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12BF304EC55E1EF88A621452 /* Pods_Runner.framework */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXCopyFilesBuildPhase section */ 27 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 28 | isa = PBXCopyFilesBuildPhase; 29 | buildActionMask = 2147483647; 30 | dstPath = ""; 31 | dstSubfolderSpec = 10; 32 | files = ( 33 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, 34 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, 35 | ); 36 | name = "Embed Frameworks"; 37 | runOnlyForDeploymentPostprocessing = 0; 38 | }; 39 | /* End PBXCopyFilesBuildPhase section */ 40 | 41 | /* Begin PBXFileReference section */ 42 | 12BF304EC55E1EF88A621452 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 44 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 45 | 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 46 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 47 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 48 | 63EF6269213EF1A1008E26F0 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 49 | 63FD70E7214156940097C450 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 50 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 51 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 52 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 53 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 54 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 55 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 56 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 58 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 59 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 60 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; 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 | E8114118943580EE9978DD94 /* Pods_Runner.framework in Frameworks */, 71 | ); 72 | runOnlyForDeploymentPostprocessing = 0; 73 | }; 74 | /* End PBXFrameworksBuildPhase section */ 75 | 76 | /* Begin PBXGroup section */ 77 | 21ED49E819C10FD7DA03B8B2 /* Pods */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | ); 81 | name = Pods; 82 | sourceTree = ""; 83 | }; 84 | 9740EEB11CF90186004384FC /* Flutter */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 88 | 3B80C3931E831B6300D905FE /* App.framework */, 89 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 90 | 9740EEBA1CF902C7004384FC /* Flutter.framework */, 91 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 92 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 93 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 94 | ); 95 | name = Flutter; 96 | sourceTree = ""; 97 | }; 98 | 97C146E51CF9000F007C117D = { 99 | isa = PBXGroup; 100 | children = ( 101 | 9740EEB11CF90186004384FC /* Flutter */, 102 | 97C146F01CF9000F007C117D /* Runner */, 103 | 97C146EF1CF9000F007C117D /* Products */, 104 | 21ED49E819C10FD7DA03B8B2 /* Pods */, 105 | FD43B14C7F9A040A07E9D59A /* Frameworks */, 106 | ); 107 | sourceTree = ""; 108 | }; 109 | 97C146EF1CF9000F007C117D /* Products */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | 97C146EE1CF9000F007C117D /* Runner.app */, 113 | ); 114 | name = Products; 115 | sourceTree = ""; 116 | }; 117 | 97C146F01CF9000F007C117D /* Runner */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | 63FD70E7214156940097C450 /* Runner.entitlements */, 121 | 63EF6269213EF1A1008E26F0 /* GoogleService-Info.plist */, 122 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 123 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 124 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 125 | 97C147021CF9000F007C117D /* Info.plist */, 126 | 97C146F11CF9000F007C117D /* Supporting Files */, 127 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 128 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 129 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 130 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 131 | ); 132 | path = Runner; 133 | sourceTree = ""; 134 | }; 135 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | ); 139 | name = "Supporting Files"; 140 | sourceTree = ""; 141 | }; 142 | FD43B14C7F9A040A07E9D59A /* Frameworks */ = { 143 | isa = PBXGroup; 144 | children = ( 145 | 12BF304EC55E1EF88A621452 /* Pods_Runner.framework */, 146 | ); 147 | name = Frameworks; 148 | sourceTree = ""; 149 | }; 150 | /* End PBXGroup section */ 151 | 152 | /* Begin PBXNativeTarget section */ 153 | 97C146ED1CF9000F007C117D /* Runner */ = { 154 | isa = PBXNativeTarget; 155 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 156 | buildPhases = ( 157 | 1901DAF058D8D903A6749123 /* [CP] Check Pods Manifest.lock */, 158 | 9740EEB61CF901F6004384FC /* Run Script */, 159 | 97C146EA1CF9000F007C117D /* Sources */, 160 | 97C146EB1CF9000F007C117D /* Frameworks */, 161 | 97C146EC1CF9000F007C117D /* Resources */, 162 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 163 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 164 | 05BBBC35508597DA039FFB68 /* [CP] Embed Pods Frameworks */, 165 | ); 166 | buildRules = ( 167 | ); 168 | dependencies = ( 169 | ); 170 | name = Runner; 171 | productName = Runner; 172 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 173 | productType = "com.apple.product-type.application"; 174 | }; 175 | /* End PBXNativeTarget section */ 176 | 177 | /* Begin PBXProject section */ 178 | 97C146E61CF9000F007C117D /* Project object */ = { 179 | isa = PBXProject; 180 | attributes = { 181 | LastUpgradeCheck = 0910; 182 | ORGANIZATIONNAME = "The Chromium Authors"; 183 | TargetAttributes = { 184 | 97C146ED1CF9000F007C117D = { 185 | CreatedOnToolsVersion = 7.3.1; 186 | DevelopmentTeam = 63788HPR72; 187 | LastSwiftMigration = 0910; 188 | SystemCapabilities = { 189 | com.apple.Push = { 190 | enabled = 1; 191 | }; 192 | }; 193 | }; 194 | }; 195 | }; 196 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 197 | compatibilityVersion = "Xcode 3.2"; 198 | developmentRegion = English; 199 | hasScannedForEncodings = 0; 200 | knownRegions = ( 201 | en, 202 | Base, 203 | ); 204 | mainGroup = 97C146E51CF9000F007C117D; 205 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 206 | projectDirPath = ""; 207 | projectRoot = ""; 208 | targets = ( 209 | 97C146ED1CF9000F007C117D /* Runner */, 210 | ); 211 | }; 212 | /* End PBXProject section */ 213 | 214 | /* Begin PBXResourcesBuildPhase section */ 215 | 97C146EC1CF9000F007C117D /* Resources */ = { 216 | isa = PBXResourcesBuildPhase; 217 | buildActionMask = 2147483647; 218 | files = ( 219 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 220 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 221 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 222 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 223 | 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, 224 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 225 | 63EF626A213EF1A1008E26F0 /* GoogleService-Info.plist in Resources */, 226 | ); 227 | runOnlyForDeploymentPostprocessing = 0; 228 | }; 229 | /* End PBXResourcesBuildPhase section */ 230 | 231 | /* Begin PBXShellScriptBuildPhase section */ 232 | 05BBBC35508597DA039FFB68 /* [CP] Embed Pods Frameworks */ = { 233 | isa = PBXShellScriptBuildPhase; 234 | buildActionMask = 2147483647; 235 | files = ( 236 | ); 237 | inputPaths = ( 238 | "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", 239 | "${BUILT_PRODUCTS_DIR}/BoringSSL/openssl.framework", 240 | "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", 241 | "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", 242 | "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", 243 | "${BUILT_PRODUCTS_DIR}/Protobuf/Protobuf.framework", 244 | "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", 245 | "${BUILT_PRODUCTS_DIR}/connectivity/connectivity.framework", 246 | "${BUILT_PRODUCTS_DIR}/gRPC/GRPCClient.framework", 247 | "${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework", 248 | "${BUILT_PRODUCTS_DIR}/gRPC-ProtoRPC/ProtoRPC.framework", 249 | "${BUILT_PRODUCTS_DIR}/gRPC-RxLibrary/RxLibrary.framework", 250 | "${BUILT_PRODUCTS_DIR}/launch_review/launch_review.framework", 251 | "${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework", 252 | "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", 253 | "${BUILT_PRODUCTS_DIR}/share/share.framework", 254 | "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework", 255 | ); 256 | name = "[CP] Embed Pods Frameworks"; 257 | outputPaths = ( 258 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl.framework", 259 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", 260 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", 261 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", 262 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", 263 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", 264 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity.framework", 265 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GRPCClient.framework", 266 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework", 267 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ProtoRPC.framework", 268 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxLibrary.framework", 269 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/launch_review.framework", 270 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework", 271 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", 272 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share.framework", 273 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework", 274 | ); 275 | runOnlyForDeploymentPostprocessing = 0; 276 | shellPath = /bin/sh; 277 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 278 | showEnvVarsInLog = 0; 279 | }; 280 | 1901DAF058D8D903A6749123 /* [CP] Check Pods Manifest.lock */ = { 281 | isa = PBXShellScriptBuildPhase; 282 | buildActionMask = 2147483647; 283 | files = ( 284 | ); 285 | inputPaths = ( 286 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 287 | "${PODS_ROOT}/Manifest.lock", 288 | ); 289 | name = "[CP] Check Pods Manifest.lock"; 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 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 299 | isa = PBXShellScriptBuildPhase; 300 | buildActionMask = 2147483647; 301 | files = ( 302 | ); 303 | inputPaths = ( 304 | ); 305 | name = "Thin Binary"; 306 | outputPaths = ( 307 | ); 308 | runOnlyForDeploymentPostprocessing = 0; 309 | shellPath = /bin/sh; 310 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; 311 | }; 312 | 9740EEB61CF901F6004384FC /* Run Script */ = { 313 | isa = PBXShellScriptBuildPhase; 314 | buildActionMask = 2147483647; 315 | files = ( 316 | ); 317 | inputPaths = ( 318 | ); 319 | name = "Run Script"; 320 | outputPaths = ( 321 | ); 322 | runOnlyForDeploymentPostprocessing = 0; 323 | shellPath = /bin/sh; 324 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 325 | }; 326 | /* End PBXShellScriptBuildPhase section */ 327 | 328 | /* Begin PBXSourcesBuildPhase section */ 329 | 97C146EA1CF9000F007C117D /* Sources */ = { 330 | isa = PBXSourcesBuildPhase; 331 | buildActionMask = 2147483647; 332 | files = ( 333 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 334 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 335 | ); 336 | runOnlyForDeploymentPostprocessing = 0; 337 | }; 338 | /* End PBXSourcesBuildPhase section */ 339 | 340 | /* Begin PBXVariantGroup section */ 341 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 342 | isa = PBXVariantGroup; 343 | children = ( 344 | 97C146FB1CF9000F007C117D /* Base */, 345 | ); 346 | name = Main.storyboard; 347 | sourceTree = ""; 348 | }; 349 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 350 | isa = PBXVariantGroup; 351 | children = ( 352 | 97C147001CF9000F007C117D /* Base */, 353 | ); 354 | name = LaunchScreen.storyboard; 355 | sourceTree = ""; 356 | }; 357 | /* End PBXVariantGroup section */ 358 | 359 | /* Begin XCBuildConfiguration section */ 360 | 97C147031CF9000F007C117D /* Debug */ = { 361 | isa = XCBuildConfiguration; 362 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 363 | buildSettings = { 364 | ALWAYS_SEARCH_USER_PATHS = NO; 365 | CLANG_ANALYZER_NONNULL = YES; 366 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 367 | CLANG_CXX_LIBRARY = "libc++"; 368 | CLANG_ENABLE_MODULES = YES; 369 | CLANG_ENABLE_OBJC_ARC = YES; 370 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 371 | CLANG_WARN_BOOL_CONVERSION = YES; 372 | CLANG_WARN_COMMA = YES; 373 | CLANG_WARN_CONSTANT_CONVERSION = YES; 374 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 375 | CLANG_WARN_EMPTY_BODY = YES; 376 | CLANG_WARN_ENUM_CONVERSION = YES; 377 | CLANG_WARN_INFINITE_RECURSION = YES; 378 | CLANG_WARN_INT_CONVERSION = YES; 379 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 380 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 381 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 382 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 383 | CLANG_WARN_STRICT_PROTOTYPES = YES; 384 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 385 | CLANG_WARN_UNREACHABLE_CODE = YES; 386 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 387 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 388 | COPY_PHASE_STRIP = NO; 389 | DEBUG_INFORMATION_FORMAT = dwarf; 390 | ENABLE_STRICT_OBJC_MSGSEND = YES; 391 | ENABLE_TESTABILITY = YES; 392 | GCC_C_LANGUAGE_STANDARD = gnu99; 393 | GCC_DYNAMIC_NO_PIC = NO; 394 | GCC_NO_COMMON_BLOCKS = YES; 395 | GCC_OPTIMIZATION_LEVEL = 0; 396 | GCC_PREPROCESSOR_DEFINITIONS = ( 397 | "DEBUG=1", 398 | "$(inherited)", 399 | ); 400 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 401 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 402 | GCC_WARN_UNDECLARED_SELECTOR = YES; 403 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 404 | GCC_WARN_UNUSED_FUNCTION = YES; 405 | GCC_WARN_UNUSED_VARIABLE = YES; 406 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 407 | MTL_ENABLE_DEBUG_INFO = YES; 408 | ONLY_ACTIVE_ARCH = YES; 409 | SDKROOT = iphoneos; 410 | TARGETED_DEVICE_FAMILY = "1,2"; 411 | }; 412 | name = Debug; 413 | }; 414 | 97C147041CF9000F007C117D /* Release */ = { 415 | isa = XCBuildConfiguration; 416 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 417 | buildSettings = { 418 | ALWAYS_SEARCH_USER_PATHS = NO; 419 | CLANG_ANALYZER_NONNULL = YES; 420 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 421 | CLANG_CXX_LIBRARY = "libc++"; 422 | CLANG_ENABLE_MODULES = YES; 423 | CLANG_ENABLE_OBJC_ARC = YES; 424 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 425 | CLANG_WARN_BOOL_CONVERSION = YES; 426 | CLANG_WARN_COMMA = YES; 427 | CLANG_WARN_CONSTANT_CONVERSION = YES; 428 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 429 | CLANG_WARN_EMPTY_BODY = YES; 430 | CLANG_WARN_ENUM_CONVERSION = YES; 431 | CLANG_WARN_INFINITE_RECURSION = YES; 432 | CLANG_WARN_INT_CONVERSION = YES; 433 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 434 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 435 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 436 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 437 | CLANG_WARN_STRICT_PROTOTYPES = YES; 438 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 439 | CLANG_WARN_UNREACHABLE_CODE = YES; 440 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 441 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 442 | COPY_PHASE_STRIP = NO; 443 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 444 | ENABLE_NS_ASSERTIONS = NO; 445 | ENABLE_STRICT_OBJC_MSGSEND = YES; 446 | GCC_C_LANGUAGE_STANDARD = gnu99; 447 | GCC_NO_COMMON_BLOCKS = YES; 448 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 449 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 450 | GCC_WARN_UNDECLARED_SELECTOR = YES; 451 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 452 | GCC_WARN_UNUSED_FUNCTION = YES; 453 | GCC_WARN_UNUSED_VARIABLE = YES; 454 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 455 | MTL_ENABLE_DEBUG_INFO = NO; 456 | SDKROOT = iphoneos; 457 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 458 | TARGETED_DEVICE_FAMILY = "1,2"; 459 | VALIDATE_PRODUCT = YES; 460 | }; 461 | name = Release; 462 | }; 463 | 97C147061CF9000F007C117D /* Debug */ = { 464 | isa = XCBuildConfiguration; 465 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 466 | buildSettings = { 467 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 468 | CLANG_ENABLE_MODULES = YES; 469 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; 470 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 471 | DEVELOPMENT_TEAM = 63788HPR72; 472 | ENABLE_BITCODE = NO; 473 | FRAMEWORK_SEARCH_PATHS = ( 474 | "$(inherited)", 475 | "$(PROJECT_DIR)/Flutter", 476 | ); 477 | INFOPLIST_FILE = Runner/Info.plist; 478 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 479 | LIBRARY_SEARCH_PATHS = ( 480 | "$(inherited)", 481 | "$(PROJECT_DIR)/Flutter", 482 | ); 483 | PRODUCT_BUNDLE_IDENTIFIER = com.huextrat.taskist; 484 | PRODUCT_NAME = "$(TARGET_NAME)"; 485 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 486 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 487 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 488 | SWIFT_VERSION = 4.0; 489 | VERSIONING_SYSTEM = "apple-generic"; 490 | }; 491 | name = Debug; 492 | }; 493 | 97C147071CF9000F007C117D /* Release */ = { 494 | isa = XCBuildConfiguration; 495 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 496 | buildSettings = { 497 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 498 | CLANG_ENABLE_MODULES = YES; 499 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; 500 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 501 | DEVELOPMENT_TEAM = 63788HPR72; 502 | ENABLE_BITCODE = NO; 503 | FRAMEWORK_SEARCH_PATHS = ( 504 | "$(inherited)", 505 | "$(PROJECT_DIR)/Flutter", 506 | ); 507 | INFOPLIST_FILE = Runner/Info.plist; 508 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 509 | LIBRARY_SEARCH_PATHS = ( 510 | "$(inherited)", 511 | "$(PROJECT_DIR)/Flutter", 512 | ); 513 | PRODUCT_BUNDLE_IDENTIFIER = com.huextrat.taskist; 514 | PRODUCT_NAME = "$(TARGET_NAME)"; 515 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 516 | SWIFT_SWIFT3_OBJC_INFERENCE = On; 517 | SWIFT_VERSION = 4.0; 518 | VERSIONING_SYSTEM = "apple-generic"; 519 | }; 520 | name = Release; 521 | }; 522 | /* End XCBuildConfiguration section */ 523 | 524 | /* Begin XCConfigurationList section */ 525 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 526 | isa = XCConfigurationList; 527 | buildConfigurations = ( 528 | 97C147031CF9000F007C117D /* Debug */, 529 | 97C147041CF9000F007C117D /* Release */, 530 | ); 531 | defaultConfigurationIsVisible = 0; 532 | defaultConfigurationName = Release; 533 | }; 534 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 535 | isa = XCConfigurationList; 536 | buildConfigurations = ( 537 | 97C147061CF9000F007C117D /* Debug */, 538 | 97C147071CF9000F007C117D /* Release */, 539 | ); 540 | defaultConfigurationIsVisible = 0; 541 | defaultConfigurationName = Release; 542 | }; 543 | /* End XCConfigurationList section */ 544 | }; 545 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 546 | } 547 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /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.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/120-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/120-1.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/120.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/152.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/180.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/29-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/29-1.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/40-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/40-1.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/58-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/58-1.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/58.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/60.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/80-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/80-1.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/80.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/87.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "40.jpg", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "60.jpg", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "29-1.jpg", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "58-1.jpg", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "87.jpg", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "80.jpg", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "120.jpg", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "120-1.jpg", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "180.jpg", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "20.jpg", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-41.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "29.jpg", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "58.jpg", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "40-1.jpg", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "80-1.jpg", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "76.jpg", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "152.jpg", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "167.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "1024.jpg", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-41.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/152.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/LaunchImage.imageset/152.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/76.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huextrat/Taskist/032d2ed54f196da216d77efcb4f17d9b1c989b08/ios/Runner/Assets.xcassets/LaunchImage.imageset/76.jpg -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "76.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "152.jpg", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /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 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Taskist 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | taskist 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" -------------------------------------------------------------------------------- /ios/Runner/Runner.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | 8 | 9 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:firebase_auth/firebase_auth.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter/services.dart'; 6 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 7 | import 'package:taskist/ui/page_done.dart'; 8 | import 'package:taskist/ui/page_settings.dart'; 9 | import 'package:taskist/ui/page_task.dart'; 10 | 11 | Future main() async { 12 | _currentUser = await _signInAnonymously(); 13 | 14 | runApp(new TaskistApp()); 15 | } 16 | final FirebaseAuth _auth = FirebaseAuth.instance; 17 | 18 | FirebaseUser _currentUser; 19 | 20 | Future _signInAnonymously() async { 21 | final user = await _auth.signInAnonymously(); 22 | return user; 23 | } 24 | 25 | class HomePage extends StatefulWidget { 26 | final FirebaseUser user; 27 | 28 | HomePage({Key key, this.user}) : super(key: key); 29 | 30 | @override 31 | State createState() => _HomePageState(); 32 | } 33 | 34 | class TaskistApp extends StatelessWidget { 35 | @override 36 | Widget build(BuildContext context) { 37 | return MaterialApp( 38 | debugShowCheckedModeBanner: false, 39 | title: "Taskist", 40 | home: HomePage( 41 | user: _currentUser, 42 | ), 43 | theme: new ThemeData(primarySwatch: Colors.blue), 44 | ); 45 | } 46 | } 47 | 48 | class _HomePageState extends State 49 | with SingleTickerProviderStateMixin { 50 | int _currentIndex = 1; 51 | 52 | final List _children = [ 53 | DonePage( 54 | user: _currentUser, 55 | ), 56 | TaskPage( 57 | user: _currentUser, 58 | ), 59 | SettingsPage( 60 | user: _currentUser, 61 | ) 62 | ]; 63 | 64 | @override 65 | Widget build(BuildContext context) { 66 | return Scaffold( 67 | bottomNavigationBar: BottomNavigationBar( 68 | onTap: onTabTapped, 69 | currentIndex: _currentIndex, 70 | fixedColor: Colors.deepPurple, 71 | items: [ 72 | BottomNavigationBarItem( 73 | icon: new Icon(FontAwesomeIcons.calendarCheck), 74 | title: new Text("")), 75 | BottomNavigationBarItem( 76 | icon: new Icon(FontAwesomeIcons.calendar), title: new Text("")), 77 | BottomNavigationBarItem( 78 | icon: new Icon(FontAwesomeIcons.slidersH), title: new Text("")) 79 | ], 80 | ), 81 | body: _children[_currentIndex], 82 | ); 83 | } 84 | 85 | @override 86 | void dispose() { 87 | super.dispose(); 88 | } 89 | 90 | @override 91 | void initState() { 92 | super.initState(); 93 | 94 | SystemChrome.setPreferredOrientations([ 95 | DeviceOrientation.portraitUp, 96 | DeviceOrientation.portraitDown, 97 | ]); 98 | } 99 | 100 | void onTabTapped(int index) { 101 | setState(() { 102 | _currentIndex = index; 103 | }); 104 | } 105 | } -------------------------------------------------------------------------------- /lib/model/element.dart: -------------------------------------------------------------------------------- 1 | class ElementTask{ 2 | final String name; 3 | final bool isDone; 4 | 5 | ElementTask(this.name, this.isDone); 6 | 7 | } -------------------------------------------------------------------------------- /lib/ui/page_addlist.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'package:flutter/services.dart'; 3 | 4 | import 'package:cloud_firestore/cloud_firestore.dart'; 5 | import 'package:firebase_auth/firebase_auth.dart'; 6 | import 'package:flutter/material.dart'; 7 | import 'package:flutter_colorpicker/flutter_colorpicker.dart'; 8 | import 'package:modal_progress_hud/modal_progress_hud.dart'; 9 | 10 | import 'package:connectivity/connectivity.dart'; 11 | 12 | class NewTaskPage extends StatefulWidget { 13 | final FirebaseUser user; 14 | 15 | NewTaskPage({Key key, this.user}) : super(key: key); 16 | 17 | @override 18 | State createState() => _NewTaskPageState(); 19 | } 20 | 21 | class _NewTaskPageState extends State { 22 | TextEditingController listNameController = new TextEditingController(); 23 | final GlobalKey _scaffoldKey = new GlobalKey(); 24 | 25 | Color pickerColor = Color(0xff6633ff); 26 | Color currentColor = Color(0xff6633ff); 27 | 28 | ValueChanged onColorChanged; 29 | 30 | bool _saving = false; 31 | 32 | String _connectionStatus = 'Unknown'; 33 | final Connectivity _connectivity = new Connectivity(); 34 | StreamSubscription _connectivitySubscription; 35 | 36 | Future initConnectivity() async { 37 | String connectionStatus; 38 | // Platform messages may fail, so we use a try/catch PlatformException. 39 | try { 40 | connectionStatus = (await _connectivity.checkConnectivity()).toString(); 41 | } on PlatformException catch (e) { 42 | print(e.toString()); 43 | connectionStatus = 'Failed to get connectivity.'; 44 | } 45 | 46 | // If the widget was removed from the tree while the asynchronous platform 47 | // message was in flight, we want to discard the reply rather than calling 48 | // setState to update our non-existent appearance. 49 | if (!mounted) { 50 | return; 51 | } 52 | 53 | setState(() { 54 | _connectionStatus = connectionStatus; 55 | }); 56 | } 57 | 58 | void addToFirebase() async { 59 | setState(() { 60 | _saving = true; 61 | }); 62 | 63 | print(_connectionStatus); 64 | 65 | if(_connectionStatus == "ConnectivityResult.none"){ 66 | showInSnackBar("No internet connection currently available"); 67 | setState(() { 68 | _saving = false; 69 | }); 70 | } else { 71 | 72 | bool isExist = false; 73 | 74 | QuerySnapshot query = 75 | await Firestore.instance.collection(widget.user.uid).getDocuments(); 76 | 77 | query.documents.forEach((doc) { 78 | if (listNameController.text.toString() == doc.documentID) { 79 | isExist = true; 80 | } 81 | }); 82 | 83 | if (isExist == false && listNameController.text.isNotEmpty) { 84 | await Firestore.instance 85 | .collection(widget.user.uid) 86 | .document(listNameController.text.toString().trim()) 87 | .setData({ 88 | "color": currentColor.value.toString(), 89 | "date": DateTime.now().millisecondsSinceEpoch 90 | }); 91 | 92 | listNameController.clear(); 93 | 94 | pickerColor = Color(0xff6633ff); 95 | currentColor = Color(0xff6633ff); 96 | 97 | Navigator.of(context).pop(); 98 | } 99 | if (isExist == true) { 100 | showInSnackBar("This list already exists"); 101 | setState(() { 102 | _saving = false; 103 | }); 104 | } 105 | if (listNameController.text.isEmpty) { 106 | showInSnackBar("Please enter a name"); 107 | setState(() { 108 | _saving = false; 109 | }); 110 | } 111 | } 112 | } 113 | 114 | @override 115 | Widget build(BuildContext context) { 116 | return Scaffold( 117 | key: _scaffoldKey, 118 | body: ModalProgressHUD( 119 | child: new Stack( 120 | children: [ 121 | _getToolbar(context), 122 | Container( 123 | child: Column( 124 | children: [ 125 | Padding( 126 | padding: EdgeInsets.only(top: 100.0), 127 | child: Row( 128 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 129 | crossAxisAlignment: CrossAxisAlignment.center, 130 | children: [ 131 | Expanded( 132 | flex: 1, 133 | child: Container( 134 | color: Colors.grey, 135 | height: 1.5, 136 | ), 137 | ), 138 | Expanded( 139 | flex: 2, 140 | child: new Row( 141 | mainAxisAlignment: MainAxisAlignment.center, 142 | children: [ 143 | Text( 144 | 'New', 145 | style: new TextStyle( 146 | fontSize: 30.0, 147 | fontWeight: FontWeight.bold), 148 | ), 149 | Text( 150 | 'List', 151 | style: new TextStyle( 152 | fontSize: 28.0, color: Colors.grey), 153 | ) 154 | ], 155 | )), 156 | Expanded( 157 | flex: 1, 158 | child: Container( 159 | color: Colors.grey, 160 | height: 1.5, 161 | ), 162 | ), 163 | ], 164 | ), 165 | ), 166 | Padding( 167 | padding: 168 | EdgeInsets.only(top: 50.0, left: 20.0, right: 20.0), 169 | child: new Column( 170 | children: [ 171 | new TextFormField( 172 | decoration: InputDecoration( 173 | border: new OutlineInputBorder( 174 | borderSide: 175 | new BorderSide(color: Colors.teal)), 176 | labelText: "List name", 177 | contentPadding: EdgeInsets.only( 178 | left: 16.0, 179 | top: 20.0, 180 | right: 16.0, 181 | bottom: 5.0)), 182 | controller: listNameController, 183 | autofocus: true, 184 | style: TextStyle( 185 | fontSize: 22.0, 186 | color: Colors.black, 187 | fontWeight: FontWeight.w500, 188 | ), 189 | keyboardType: TextInputType.text, 190 | textCapitalization: TextCapitalization.sentences, 191 | maxLength: 20, 192 | ), 193 | new Padding( 194 | padding: EdgeInsets.only(bottom: 10.0), 195 | ), 196 | ButtonTheme( 197 | minWidth: double.infinity, 198 | child: RaisedButton( 199 | elevation: 3.0, 200 | onPressed: () { 201 | pickerColor = currentColor; 202 | showDialog( 203 | context: context, 204 | builder: (BuildContext context) { 205 | return AlertDialog( 206 | title: const Text('Pick a color!'), 207 | content: SingleChildScrollView( 208 | child: ColorPicker( 209 | pickerColor: pickerColor, 210 | onColorChanged: changeColor, 211 | enableLabel: true, 212 | colorPickerWidth: 1000.0, 213 | pickerAreaHeightPercent: 0.7, 214 | ), 215 | ), 216 | actions: [ 217 | FlatButton( 218 | child: Text('Got it'), 219 | onPressed: () { 220 | setState(() => 221 | currentColor = pickerColor); 222 | Navigator.of(context).pop(); 223 | }, 224 | ), 225 | ], 226 | ); 227 | }, 228 | ); 229 | }, 230 | child: Text('Card color'), 231 | color: currentColor, 232 | textColor: const Color(0xffffffff), 233 | ), 234 | ), 235 | ], 236 | ), 237 | ), 238 | Padding( 239 | padding: EdgeInsets.only(top: 50.0), 240 | child: new Column( 241 | children: [ 242 | new RaisedButton( 243 | child: const Text( 244 | 'Add', 245 | style: TextStyle(color: Colors.white), 246 | ), 247 | color: Colors.blue, 248 | elevation: 4.0, 249 | splashColor: Colors.deepPurple, 250 | onPressed: addToFirebase, 251 | ), 252 | ], 253 | ), 254 | ), 255 | ], 256 | ), 257 | ), 258 | ], 259 | ), 260 | inAsyncCall: _saving), 261 | ); 262 | } 263 | 264 | changeColor(Color color) { 265 | setState(() => pickerColor = color); 266 | } 267 | 268 | @override 269 | void dispose() { 270 | _scaffoldKey.currentState?.dispose(); 271 | _connectivitySubscription?.cancel(); 272 | super.dispose(); 273 | } 274 | 275 | @override 276 | void initState() { 277 | super.initState(); 278 | initConnectivity(); 279 | _connectivitySubscription = 280 | _connectivity.onConnectivityChanged.listen((ConnectivityResult result) { 281 | setState(() { 282 | _connectionStatus = result.toString(); 283 | }); 284 | }); 285 | } 286 | 287 | void showInSnackBar(String value) { 288 | _scaffoldKey.currentState?.removeCurrentSnackBar(); 289 | 290 | _scaffoldKey.currentState?.showSnackBar(new SnackBar( 291 | content: new Text(value, textAlign: TextAlign.center), 292 | backgroundColor: currentColor, 293 | duration: Duration(seconds: 3), 294 | )); 295 | } 296 | 297 | Container _getToolbar(BuildContext context) { 298 | return new Container( 299 | margin: new EdgeInsets.only(left: 10.0, top: 40.0), 300 | child: new BackButton(color: Colors.black), 301 | ); 302 | } 303 | } 304 | -------------------------------------------------------------------------------- /lib/ui/page_detail.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:firebase_auth/firebase_auth.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_colorpicker/flutter_colorpicker.dart'; 5 | import 'package:flutter_slidable/flutter_slidable.dart'; 6 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 7 | import 'package:taskist/model/element.dart'; 8 | import 'package:taskist/utils/diamond_fab.dart'; 9 | 10 | class DetailPage extends StatefulWidget { 11 | final FirebaseUser user; 12 | final int i; 13 | final Map> currentList; 14 | final String color; 15 | 16 | DetailPage({Key key, this.user, this.i, this.currentList, this.color}) 17 | : super(key: key); 18 | 19 | @override 20 | State createState() => _DetailPageState(); 21 | } 22 | 23 | class _DetailPageState extends State { 24 | TextEditingController itemController = new TextEditingController(); 25 | 26 | @override 27 | Widget build(BuildContext context) { 28 | return Scaffold( 29 | //key: _scaffoldKey, 30 | backgroundColor: Colors.white, 31 | body: new Stack( 32 | children: [ 33 | _getToolbar(context), 34 | Container( 35 | child: NotificationListener( 36 | onNotification: (overscroll) { 37 | overscroll.disallowGlow(); 38 | }, 39 | child: new StreamBuilder( 40 | stream: Firestore.instance 41 | .collection(widget.user.uid) 42 | .snapshots(), 43 | builder: (BuildContext context, 44 | AsyncSnapshot snapshot) { 45 | if (!snapshot.hasData) 46 | return new Center( 47 | child: CircularProgressIndicator( 48 | backgroundColor: currentColor, 49 | )); 50 | return new Container( 51 | child: getExpenseItems(snapshot), 52 | ); 53 | }), 54 | ), 55 | ), 56 | ], 57 | ), 58 | floatingActionButton: DiamondFab( 59 | onPressed: () { 60 | showDialog( 61 | context: context, 62 | builder: (BuildContext context) { 63 | return AlertDialog( 64 | content: Row( 65 | children: [ 66 | Expanded( 67 | child: new TextField( 68 | autofocus: true, 69 | decoration: InputDecoration( 70 | border: new OutlineInputBorder( 71 | borderSide: new BorderSide( 72 | color: currentColor)), 73 | labelText: "Item", 74 | hintText: "Item", 75 | contentPadding: EdgeInsets.only( 76 | left: 16.0, 77 | top: 20.0, 78 | right: 16.0, 79 | bottom: 5.0)), 80 | controller: itemController, 81 | style: TextStyle( 82 | fontSize: 22.0, 83 | color: Colors.black, 84 | fontWeight: FontWeight.w500, 85 | ), 86 | keyboardType: TextInputType.text, 87 | textCapitalization: TextCapitalization.sentences, 88 | ), 89 | ) 90 | ], 91 | ), 92 | actions: [ 93 | ButtonTheme( 94 | //minWidth: double.infinity, 95 | child: RaisedButton( 96 | elevation: 3.0, 97 | onPressed: () { 98 | if (itemController.text.isNotEmpty && 99 | !widget.currentList.values 100 | .contains(itemController.text.toString())) { 101 | Firestore.instance 102 | .collection(widget.user.uid) 103 | .document( 104 | widget.currentList.keys.elementAt(widget.i)) 105 | .updateData( 106 | {itemController.text.toString(): false}); 107 | 108 | itemController.clear(); 109 | Navigator.of(context).pop(); 110 | } 111 | }, 112 | child: Text('Add'), 113 | color: currentColor, 114 | textColor: const Color(0xffffffff), 115 | ), 116 | ) 117 | ], 118 | ); 119 | }, 120 | ); 121 | }, 122 | child: Icon(Icons.add), 123 | backgroundColor: currentColor, 124 | ), 125 | ); 126 | } 127 | 128 | @override 129 | void dispose() { 130 | super.dispose(); 131 | } 132 | 133 | getExpenseItems(AsyncSnapshot snapshot) { 134 | List listElement = new List(); 135 | int nbIsDone = 0; 136 | 137 | if (widget.user.uid.isNotEmpty) { 138 | snapshot.data.documents.map((f) { 139 | if (f.documentID == widget.currentList.keys.elementAt(widget.i)) { 140 | f.data.forEach((a, b) { 141 | if (b.runtimeType == bool) { 142 | listElement.add(new ElementTask(a, b)); 143 | } 144 | }); 145 | } 146 | }).toList(); 147 | 148 | listElement.forEach((i) { 149 | if (i.isDone) { 150 | nbIsDone++; 151 | } 152 | }); 153 | 154 | return Column( 155 | children: [ 156 | Padding( 157 | padding: EdgeInsets.only(top: 150.0), 158 | child: new Column( 159 | children: [ 160 | Padding( 161 | padding: EdgeInsets.only(top: 5.0, left: 50.0, right: 20.0), 162 | child: Row( 163 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 164 | children: [ 165 | Flexible( 166 | fit: FlexFit.loose, 167 | child: Text( 168 | widget.currentList.keys.elementAt(widget.i), 169 | softWrap: true, 170 | overflow: TextOverflow.fade, 171 | style: TextStyle( 172 | fontWeight: FontWeight.bold, fontSize: 35.0), 173 | ), 174 | ), 175 | GestureDetector( 176 | onTap: () { 177 | showDialog( 178 | context: context, 179 | builder: (BuildContext context) { 180 | return new AlertDialog( 181 | title: Text("Delete: " + widget.currentList.keys.elementAt(widget.i).toString()), 182 | content: Text( 183 | "Are you sure you want to delete this list?", style: TextStyle(fontWeight: FontWeight.w400),), 184 | actions: [ 185 | ButtonTheme( 186 | //minWidth: double.infinity, 187 | child: RaisedButton( 188 | elevation: 3.0, 189 | onPressed: () { 190 | Navigator.pop(context); 191 | }, 192 | child: Text('No'), 193 | color: currentColor, 194 | textColor: const Color(0xffffffff), 195 | ), 196 | ), 197 | ButtonTheme( 198 | //minWidth: double.infinity, 199 | child: RaisedButton( 200 | elevation: 3.0, 201 | onPressed: () { 202 | Firestore.instance 203 | .collection(widget.user.uid) 204 | .document(widget.currentList.keys 205 | .elementAt(widget.i)) 206 | .delete(); 207 | Navigator.pop(context); 208 | Navigator.of(context).pop(); 209 | }, 210 | child: Text('YES'), 211 | color: currentColor, 212 | textColor: const Color(0xffffffff), 213 | ), 214 | ), 215 | ], 216 | ); 217 | }, 218 | ); 219 | }, 220 | child: Icon( 221 | FontAwesomeIcons.trash, 222 | size: 25.0, 223 | color: currentColor, 224 | ), 225 | ), 226 | ], 227 | ), 228 | ), 229 | Padding( 230 | padding: EdgeInsets.only(top: 5.0, left: 50.0), 231 | child: Row( 232 | children: [ 233 | new Text( 234 | nbIsDone.toString() + 235 | " of " + 236 | listElement.length.toString() + 237 | " tasks", 238 | style: TextStyle(fontSize: 18.0, color: Colors.black54), 239 | ), 240 | ], 241 | ), 242 | ), 243 | Padding( 244 | padding: EdgeInsets.only(top: 5.0), 245 | child: Row( 246 | children: [ 247 | Expanded( 248 | flex: 2, 249 | child: Container( 250 | margin: EdgeInsets.only(left: 50.0), 251 | color: Colors.grey, 252 | height: 1.5, 253 | ), 254 | ), 255 | ], 256 | ), 257 | ), 258 | Padding( 259 | padding: EdgeInsets.only(top: 30.0), 260 | child: Column( 261 | children: [ 262 | Container(color: Color(0xFFFCFCFC),child: 263 | SizedBox( 264 | height: MediaQuery.of(context).size.height - 350, 265 | child: ListView.builder( 266 | physics: const BouncingScrollPhysics(), 267 | itemCount: listElement.length, 268 | itemBuilder: (BuildContext ctxt, int i) { 269 | return new Slidable( 270 | delegate: new SlidableBehindDelegate(), 271 | actionExtentRatio: 0.25, 272 | child: GestureDetector( 273 | onTap: () { 274 | Firestore.instance 275 | .collection(widget.user.uid) 276 | .document(widget.currentList.keys 277 | .elementAt(widget.i)) 278 | .updateData({ 279 | listElement.elementAt(i).name: 280 | !listElement.elementAt(i).isDone 281 | }); 282 | }, 283 | child: Container( 284 | height: 50.0, 285 | color: listElement.elementAt(i).isDone 286 | ? Color(0xFFF0F0F0) 287 | : Color(0xFFFCFCFC), 288 | child: Padding( 289 | padding: EdgeInsets.only(left: 50.0), 290 | child: Row( 291 | mainAxisAlignment: 292 | MainAxisAlignment.start, 293 | children: [ 294 | Icon( 295 | listElement.elementAt(i).isDone 296 | ? FontAwesomeIcons.checkSquare 297 | : FontAwesomeIcons.square, 298 | color: listElement 299 | .elementAt(i) 300 | .isDone 301 | ? currentColor 302 | : Colors.black, 303 | size: 20.0, 304 | ), 305 | Padding( 306 | padding: 307 | EdgeInsets.only(left: 30.0), 308 | ), 309 | Flexible( 310 | child: Text( 311 | listElement.elementAt(i).name, 312 | overflow: TextOverflow.ellipsis, 313 | maxLines: 1, 314 | style: listElement 315 | .elementAt(i) 316 | .isDone 317 | ? TextStyle( 318 | decoration: TextDecoration 319 | .lineThrough, 320 | color: currentColor, 321 | fontSize: 27.0, 322 | ) 323 | : TextStyle( 324 | color: Colors.black, 325 | fontSize: 27.0, 326 | ), 327 | ), 328 | ), 329 | ], 330 | ), 331 | ), 332 | ), 333 | ), 334 | secondaryActions: [ 335 | new IconSlideAction( 336 | caption: 'Delete', 337 | color: Colors.red, 338 | icon: Icons.delete, 339 | onTap: () { 340 | Firestore.instance 341 | .collection(widget.user.uid) 342 | .document(widget.currentList.keys 343 | .elementAt(widget.i)) 344 | .updateData({ 345 | listElement.elementAt(i).name: 346 | "" 347 | }); 348 | }, 349 | ), 350 | ], 351 | ); 352 | }), 353 | ),), 354 | ], 355 | ), 356 | ), 357 | ], 358 | ), 359 | ), 360 | ], 361 | ); 362 | } 363 | } 364 | 365 | @override 366 | void initState() { 367 | super.initState(); 368 | pickerColor = Color(int.parse(widget.color)); 369 | currentColor = Color(int.parse(widget.color)); 370 | } 371 | 372 | Color pickerColor; 373 | Color currentColor; 374 | 375 | ValueChanged onColorChanged; 376 | 377 | changeColor(Color color) { 378 | setState(() => pickerColor = color); 379 | } 380 | 381 | Padding _getToolbar(BuildContext context) { 382 | return new Padding( 383 | padding: EdgeInsets.only(top: 50.0, left: 20.0, right: 12.0), 384 | child: 385 | new Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ 386 | new Image( 387 | width: 35.0, 388 | height: 35.0, 389 | fit: BoxFit.cover, 390 | image: new AssetImage('assets/list.png') 391 | ), 392 | RaisedButton( 393 | elevation: 3.0, 394 | onPressed: () { 395 | pickerColor = currentColor; 396 | showDialog( 397 | context: context, 398 | builder: (BuildContext context) { 399 | return AlertDialog( 400 | title: const Text('Pick a color!'), 401 | content: SingleChildScrollView( 402 | child: ColorPicker( 403 | pickerColor: pickerColor, 404 | onColorChanged: changeColor, 405 | enableLabel: true, 406 | colorPickerWidth: 1000.0, 407 | pickerAreaHeightPercent: 0.7, 408 | ), 409 | ), 410 | actions: [ 411 | FlatButton( 412 | child: Text('Got it'), 413 | onPressed: () { 414 | 415 | Firestore.instance 416 | .collection(widget.user.uid) 417 | .document( 418 | widget.currentList.keys.elementAt(widget.i)) 419 | .updateData( 420 | {"color": pickerColor.value.toString()}); 421 | 422 | setState( 423 | () => currentColor = pickerColor); 424 | Navigator.of(context).pop(); 425 | }, 426 | ), 427 | ], 428 | ); 429 | }, 430 | ); 431 | }, 432 | child: Text('Color'), 433 | color: currentColor, 434 | textColor: const Color(0xffffffff), 435 | ), 436 | GestureDetector( 437 | onTap: () { 438 | Navigator.of(context).pop(); 439 | }, 440 | child: new Icon( 441 | Icons.close, 442 | size: 40.0, 443 | color: currentColor, 444 | ), 445 | ), 446 | ]), 447 | ); 448 | } 449 | } -------------------------------------------------------------------------------- /lib/ui/page_done.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:firebase_auth/firebase_auth.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter/services.dart'; 5 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 6 | import 'package:taskist/model/element.dart'; 7 | import 'package:taskist/ui/page_detail.dart'; 8 | 9 | class DonePage extends StatefulWidget { 10 | final FirebaseUser user; 11 | 12 | DonePage({Key key, this.user}) : super(key: key); 13 | 14 | @override 15 | State createState() => _DonePageState(); 16 | } 17 | 18 | class _DonePageState extends State 19 | with SingleTickerProviderStateMixin { 20 | @override 21 | Widget build(BuildContext context) { 22 | return Scaffold( 23 | body: ListView( 24 | children: [ 25 | _getToolbar(context), 26 | new Column( 27 | children: [ 28 | Padding( 29 | padding: EdgeInsets.only(top: 50.0), 30 | child: Row( 31 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 32 | crossAxisAlignment: CrossAxisAlignment.center, 33 | children: [ 34 | Expanded( 35 | flex: 1, 36 | child: Container( 37 | color: Colors.grey, 38 | height: 1.5, 39 | ), 40 | ), 41 | Expanded( 42 | flex: 2, 43 | child: new Row( 44 | mainAxisAlignment: MainAxisAlignment.center, 45 | children: [ 46 | Text( 47 | 'Task', 48 | style: new TextStyle( 49 | fontSize: 30.0, fontWeight: FontWeight.bold), 50 | ), 51 | Text( 52 | 'Done', 53 | style: new TextStyle( 54 | fontSize: 28.0, color: Colors.grey), 55 | ) 56 | ], 57 | )), 58 | Expanded( 59 | flex: 1, 60 | child: Container( 61 | color: Colors.grey, 62 | height: 1.5, 63 | ), 64 | ), 65 | ], 66 | ), 67 | ), 68 | ], 69 | ), 70 | Padding( 71 | padding: EdgeInsets.only(top: 175.0), 72 | child: Container( 73 | height: 360.0, 74 | padding: EdgeInsets.only(bottom: 25.0), 75 | child: NotificationListener( 76 | onNotification: (overscroll) { 77 | overscroll.disallowGlow(); 78 | }, 79 | child: new StreamBuilder( 80 | stream: Firestore.instance 81 | .collection(widget.user.uid).orderBy("date", descending: true) 82 | .snapshots(), 83 | builder: (BuildContext context, 84 | AsyncSnapshot snapshot) { 85 | if (!snapshot.hasData) 86 | return new Center( 87 | child: CircularProgressIndicator( 88 | backgroundColor: Colors.blue, 89 | )); 90 | return new ListView( 91 | physics: const BouncingScrollPhysics(), 92 | padding: EdgeInsets.only(left: 40.0, right: 40.0), 93 | scrollDirection: Axis.horizontal, 94 | children: getExpenseItems(snapshot), 95 | ); 96 | }), 97 | ), 98 | ), 99 | ), 100 | ], 101 | ), 102 | ); 103 | } 104 | 105 | @override 106 | void dispose() { 107 | super.dispose(); 108 | } 109 | 110 | getExpenseItems(AsyncSnapshot snapshot) { 111 | List listElement = new List(), listElement2; 112 | Map> userMap = new Map(); 113 | 114 | List cardColor = new List(); 115 | if (widget.user.uid.isNotEmpty) { 116 | cardColor.clear(); 117 | 118 | snapshot.data.documents.map((f) { 119 | f.data.forEach((a, b) { 120 | if (b.runtimeType == bool) { 121 | listElement.add(new ElementTask(a, b)); 122 | } 123 | if (b.runtimeType == String && a == "color") { 124 | cardColor.add(b); 125 | } 126 | }); 127 | listElement2 = new List.from(listElement); 128 | userMap[f.documentID] = listElement2; 129 | 130 | for (int i = 0; i < listElement2.length; i++) { 131 | if (listElement2.elementAt(i).isDone == false) { 132 | userMap.remove(f.documentID); 133 | if (cardColor.isNotEmpty) { 134 | cardColor.removeLast(); 135 | } 136 | 137 | break; 138 | } 139 | } 140 | if (listElement2.length == 0) { 141 | userMap.remove(f.documentID); 142 | cardColor.removeLast(); 143 | } 144 | listElement.clear(); 145 | }).toList(); 146 | 147 | return new List.generate(userMap.length, (int index) { 148 | return new GestureDetector( 149 | onTap: () { 150 | Navigator.of(context).push( 151 | new PageRouteBuilder( 152 | pageBuilder: (_, __, ___) => new DetailPage( 153 | user: widget.user, 154 | i: index, 155 | currentList: userMap, 156 | color: cardColor.elementAt(index), 157 | ), 158 | transitionsBuilder: 159 | (context, animation, secondaryAnimation, child) => 160 | new ScaleTransition( 161 | scale: new Tween( 162 | begin: 1.5, 163 | end: 1.0, 164 | ).animate( 165 | CurvedAnimation( 166 | parent: animation, 167 | curve: Interval( 168 | 0.50, 169 | 1.00, 170 | curve: Curves.linear, 171 | ), 172 | ), 173 | ), 174 | child: ScaleTransition( 175 | scale: Tween( 176 | begin: 0.0, 177 | end: 1.0, 178 | ).animate( 179 | CurvedAnimation( 180 | parent: animation, 181 | curve: Interval( 182 | 0.00, 183 | 0.50, 184 | curve: Curves.linear, 185 | ), 186 | ), 187 | ), 188 | child: child, 189 | ), 190 | ), 191 | ), 192 | ); 193 | }, 194 | child: Card( 195 | shape: RoundedRectangleBorder( 196 | borderRadius: BorderRadius.all(Radius.circular(8.0)), 197 | ), 198 | color: Color(int.parse(cardColor.elementAt(index))), 199 | child: new Container( 200 | width: 220.0, 201 | //height: 100.0, 202 | child: Container( 203 | child: Column( 204 | children: [ 205 | Padding( 206 | padding: EdgeInsets.only(top: 20.0, bottom: 15.0), 207 | child: Container( 208 | child: Text( 209 | userMap.keys.elementAt(index), 210 | style: TextStyle( 211 | color: Colors.white, 212 | fontSize: 19.0, 213 | ), 214 | ), 215 | ), 216 | ), 217 | Padding( 218 | padding: EdgeInsets.only(top: 5.0), 219 | child: Row( 220 | children: [ 221 | Expanded( 222 | flex: 2, 223 | child: Container( 224 | margin: EdgeInsets.only(left: 50.0), 225 | color: Colors.white, 226 | height: 1.5, 227 | ), 228 | ), 229 | ], 230 | ), 231 | ), 232 | Padding( 233 | padding: 234 | EdgeInsets.only(top: 30.0, left: 15.0, right: 5.0), 235 | child: Column( 236 | children: [ 237 | SizedBox( 238 | height: 220.0, 239 | child: ListView.builder( 240 | //physics: const NeverScrollableScrollPhysics(), 241 | itemCount: 242 | userMap.values.elementAt(index).length, 243 | itemBuilder: (BuildContext ctxt, int i) { 244 | return Row( 245 | mainAxisAlignment: MainAxisAlignment.start, 246 | children: [ 247 | Icon( 248 | userMap.values 249 | .elementAt(index) 250 | .elementAt(i) 251 | .isDone 252 | ? FontAwesomeIcons.checkCircle 253 | : FontAwesomeIcons.circle, 254 | color: userMap.values 255 | .elementAt(index) 256 | .elementAt(i) 257 | .isDone 258 | ? Colors.white70 259 | : Colors.white, 260 | size: 14.0, 261 | ), 262 | Padding( 263 | padding: EdgeInsets.only(left: 10.0), 264 | ), 265 | Flexible( 266 | child: Text( 267 | userMap.values 268 | .elementAt(index) 269 | .elementAt(i) 270 | .name, 271 | style: userMap.values 272 | .elementAt(index) 273 | .elementAt(i) 274 | .isDone 275 | ? TextStyle( 276 | decoration: TextDecoration 277 | .lineThrough, 278 | color: Colors.white70, 279 | fontSize: 17.0, 280 | ) 281 | : TextStyle( 282 | color: Colors.white, 283 | fontSize: 17.0, 284 | ), 285 | ), 286 | ), 287 | ], 288 | ); 289 | }), 290 | ), 291 | ], 292 | ), 293 | ), 294 | ], 295 | ), 296 | ), 297 | ), 298 | ), 299 | ); 300 | }); 301 | } 302 | } 303 | 304 | Padding _getToolbar(BuildContext context) { 305 | return new Padding( 306 | padding: EdgeInsets.only(top: 50.0, left: 20.0, right: 20.0), 307 | child: 308 | new Row(mainAxisAlignment: MainAxisAlignment.center, children: [ 309 | new Image( 310 | width: 40.0, 311 | height: 40.0, 312 | fit: BoxFit.cover, 313 | image: new AssetImage('assets/list.png') 314 | ), 315 | ]), 316 | ); 317 | } 318 | 319 | @override 320 | void initState() { 321 | super.initState(); 322 | 323 | SystemChrome.setPreferredOrientations([ 324 | DeviceOrientation.portraitUp, 325 | DeviceOrientation.portraitDown, 326 | ]); 327 | } 328 | } 329 | -------------------------------------------------------------------------------- /lib/ui/page_settings.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_auth/firebase_auth.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter/services.dart'; 4 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 5 | 6 | import 'package:share/share.dart'; 7 | import 'package:launch_review/launch_review.dart'; 8 | 9 | import 'package:url_launcher/url_launcher.dart'; 10 | 11 | class SettingsPage extends StatefulWidget { 12 | final FirebaseUser user; 13 | 14 | SettingsPage({Key key, this.user}) : super(key: key); 15 | 16 | @override 17 | State createState() => _SettingsPageState(); 18 | } 19 | 20 | class _SettingsPageState extends State 21 | with SingleTickerProviderStateMixin { 22 | 23 | sharePage() async { 24 | Share.share( 25 | "Toi aussi organise mieux tes journées avec #Taskist disponible sur Android et iOS"); 26 | } 27 | 28 | rateApp() async { 29 | LaunchReview.launch( 30 | androidAppId: "com.huextrat.taskist", iOSAppId: "1435481664"); 31 | } 32 | 33 | _launchURL() async { 34 | const url = 'https://twitter.com/HugoExtrat'; 35 | if (await canLaunch(url)) { 36 | await launch(url); 37 | } else { 38 | throw 'Could not launch $url'; 39 | } 40 | } 41 | 42 | @override 43 | Widget build(BuildContext context) { 44 | return Scaffold( 45 | body: ListView( 46 | children: [ 47 | new Column( 48 | children: [ 49 | _getToolbar(context), 50 | Padding( 51 | padding: EdgeInsets.only(top: 50.0), 52 | child: Row( 53 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 54 | crossAxisAlignment: CrossAxisAlignment.center, 55 | children: [ 56 | Expanded( 57 | flex: 1, 58 | child: Container( 59 | color: Colors.grey, 60 | height: 1.5, 61 | ), 62 | ), 63 | Expanded( 64 | flex: 2, 65 | child: new Row( 66 | mainAxisAlignment: MainAxisAlignment.center, 67 | children: [ 68 | Text( 69 | 'Task', 70 | style: new TextStyle( 71 | fontSize: 30.0, fontWeight: FontWeight.bold), 72 | ), 73 | Text( 74 | 'Settings', 75 | style: new TextStyle( 76 | fontSize: 28.0, color: Colors.grey), 77 | ), 78 | ], 79 | )), 80 | Expanded( 81 | flex: 1, 82 | child: Container( 83 | color: Colors.grey, 84 | height: 1.5, 85 | ), 86 | ), 87 | ], 88 | ), 89 | ), 90 | ], 91 | ), 92 | 93 | Padding(padding: EdgeInsets.only(top: 50.0),), 94 | Column( 95 | mainAxisAlignment: MainAxisAlignment.center, 96 | crossAxisAlignment: CrossAxisAlignment.stretch, 97 | children: [ 98 | 99 | Card( 100 | color: Colors.white, 101 | elevation: 2.0, 102 | child: Column( 103 | children: [ 104 | ListTile( 105 | leading: Icon( 106 | FontAwesomeIcons.cogs, 107 | color: Colors.grey, 108 | ), 109 | title: Text("Version"), 110 | trailing: Text("1.0.0"), 111 | ), 112 | ListTile( 113 | onTap: _launchURL, 114 | leading: Icon( 115 | FontAwesomeIcons.twitter, 116 | color: Colors.blue, 117 | ), 118 | title: Text("Twitter"), 119 | trailing: Icon(Icons.arrow_right), 120 | ), 121 | ListTile( 122 | onTap: rateApp, 123 | leading: Icon( 124 | FontAwesomeIcons.star, 125 | color: Colors.blue, 126 | ), 127 | title: Text("Rate Taskist"), 128 | trailing: Icon(Icons.arrow_right), 129 | ), 130 | ListTile( 131 | onTap: sharePage, 132 | leading: Icon( 133 | FontAwesomeIcons.shareAlt, 134 | color: Colors.blue, 135 | ), 136 | title: Text("Share Taskist"), 137 | trailing: Icon(Icons.arrow_right), 138 | ), 139 | ], 140 | ), 141 | ), 142 | ], 143 | ), 144 | ], 145 | ), 146 | ); 147 | } 148 | 149 | @override 150 | void dispose() { 151 | super.dispose(); 152 | } 153 | 154 | @override 155 | void initState() { 156 | super.initState(); 157 | 158 | SystemChrome.setPreferredOrientations([ 159 | DeviceOrientation.portraitUp, 160 | DeviceOrientation.portraitDown, 161 | ]); 162 | } 163 | 164 | Padding _getToolbar(BuildContext context) { 165 | return new Padding( 166 | padding: EdgeInsets.only(top: 50.0, left: 20.0, right: 20.0), 167 | child: 168 | new Row(mainAxisAlignment: MainAxisAlignment.center, children: [ 169 | new Image( 170 | width: 40.0, 171 | height: 40.0, 172 | fit: BoxFit.cover, 173 | image: new AssetImage('assets/list.png') 174 | ), 175 | ]), 176 | ); 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /lib/ui/page_task.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:firebase_auth/firebase_auth.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter/services.dart'; 5 | import 'package:font_awesome_flutter/font_awesome_flutter.dart'; 6 | import 'package:taskist/model/element.dart'; 7 | import 'package:taskist/ui/page_detail.dart'; 8 | 9 | import 'page_addlist.dart'; 10 | 11 | class TaskPage extends StatefulWidget { 12 | final FirebaseUser user; 13 | 14 | TaskPage({Key key, this.user}) : super(key: key); 15 | 16 | @override 17 | State createState() => _TaskPageState(); 18 | } 19 | 20 | class _TaskPageState extends State 21 | with SingleTickerProviderStateMixin { 22 | int index = 1; 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | return Scaffold( 27 | body: ListView( 28 | children: [ 29 | _getToolbar(context), 30 | new Column( 31 | children: [ 32 | Padding( 33 | padding: EdgeInsets.only(top: 50.0), 34 | child: Row( 35 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 36 | crossAxisAlignment: CrossAxisAlignment.center, 37 | children: [ 38 | Expanded( 39 | flex: 1, 40 | child: Container( 41 | color: Colors.grey, 42 | height: 1.5, 43 | ), 44 | ), 45 | Expanded( 46 | flex: 2, 47 | child: new Row( 48 | mainAxisAlignment: MainAxisAlignment.center, 49 | children: [ 50 | Text( 51 | 'Task', 52 | style: new TextStyle( 53 | fontSize: 30.0, fontWeight: FontWeight.bold), 54 | ), 55 | Text( 56 | 'Lists', 57 | style: new TextStyle( 58 | fontSize: 28.0, color: Colors.grey), 59 | ) 60 | ], 61 | )), 62 | Expanded( 63 | flex: 1, 64 | child: Container( 65 | color: Colors.grey, 66 | height: 1.5, 67 | ), 68 | ), 69 | ], 70 | ), 71 | ), 72 | Padding( 73 | padding: EdgeInsets.only(top: 50.0), 74 | child: new Column( 75 | children: [ 76 | new Container( 77 | width: 50.0, 78 | height: 50.0, 79 | decoration: new BoxDecoration( 80 | border: new Border.all(color: Colors.black38), 81 | borderRadius: BorderRadius.all(Radius.circular(7.0))), 82 | child: new IconButton( 83 | icon: new Icon(Icons.add), 84 | onPressed: _addTaskPressed, 85 | iconSize: 30.0, 86 | ), 87 | ), 88 | Padding( 89 | padding: EdgeInsets.only(top: 10.0), 90 | child: Text('Add List', 91 | style: TextStyle(color: Colors.black45)), 92 | ), 93 | ], 94 | ), 95 | ), 96 | ], 97 | ), 98 | Padding( 99 | padding: EdgeInsets.only(top: 50.0), 100 | child: Container( 101 | height: 360.0, 102 | padding: EdgeInsets.only(bottom: 25.0), 103 | child: NotificationListener( 104 | onNotification: (overscroll) { 105 | overscroll.disallowGlow(); 106 | }, 107 | child: new StreamBuilder( 108 | stream: Firestore.instance 109 | .collection(widget.user.uid) 110 | .orderBy("date", descending: true) 111 | .snapshots(), 112 | builder: (BuildContext context, 113 | AsyncSnapshot snapshot) { 114 | if (!snapshot.hasData) 115 | return new Center( 116 | child: CircularProgressIndicator( 117 | backgroundColor: Colors.blue, 118 | )); 119 | return new ListView( 120 | physics: const BouncingScrollPhysics(), 121 | padding: EdgeInsets.only(left: 40.0, right: 40.0), 122 | scrollDirection: Axis.horizontal, 123 | children: getExpenseItems(snapshot), 124 | ); 125 | }), 126 | ), 127 | ), 128 | ), 129 | ], 130 | ), 131 | ); 132 | } 133 | 134 | @override 135 | void dispose() { 136 | super.dispose(); 137 | } 138 | 139 | getExpenseItems(AsyncSnapshot snapshot) { 140 | List listElement = new List(), listElement2; 141 | Map> userMap = new Map(); 142 | 143 | List cardColor = new List(); 144 | 145 | if (widget.user.uid.isNotEmpty) { 146 | cardColor.clear(); 147 | 148 | snapshot.data.documents.map((f) { 149 | String color; 150 | f.data.forEach((a, b) { 151 | if (b.runtimeType == bool) { 152 | listElement.add(new ElementTask(a, b)); 153 | } 154 | if (b.runtimeType == String && a == "color") { 155 | color = b; 156 | } 157 | }); 158 | listElement2 = new List.from(listElement); 159 | for (int i = 0; i < listElement2.length; i++) { 160 | if (listElement2.elementAt(i).isDone == false) { 161 | userMap[f.documentID] = listElement2; 162 | cardColor.add(color); 163 | break; 164 | } 165 | } 166 | if (listElement2.length == 0) { 167 | userMap[f.documentID] = listElement2; 168 | cardColor.add(color); 169 | } 170 | listElement.clear(); 171 | }).toList(); 172 | 173 | return new List.generate(userMap.length, (int index) { 174 | return new GestureDetector( 175 | onTap: () { 176 | Navigator.of(context).push( 177 | new PageRouteBuilder( 178 | pageBuilder: (_, __, ___) => new DetailPage( 179 | user: widget.user, 180 | i: index, 181 | currentList: userMap, 182 | color: cardColor.elementAt(index), 183 | ), 184 | transitionsBuilder: 185 | (context, animation, secondaryAnimation, child) => 186 | new ScaleTransition( 187 | scale: new Tween( 188 | begin: 1.5, 189 | end: 1.0, 190 | ).animate( 191 | CurvedAnimation( 192 | parent: animation, 193 | curve: Interval( 194 | 0.50, 195 | 1.00, 196 | curve: Curves.linear, 197 | ), 198 | ), 199 | ), 200 | child: ScaleTransition( 201 | scale: Tween( 202 | begin: 0.0, 203 | end: 1.0, 204 | ).animate( 205 | CurvedAnimation( 206 | parent: animation, 207 | curve: Interval( 208 | 0.00, 209 | 0.50, 210 | curve: Curves.linear, 211 | ), 212 | ), 213 | ), 214 | child: child, 215 | ), 216 | ), 217 | ), 218 | ); 219 | }, 220 | child: Card( 221 | shape: RoundedRectangleBorder( 222 | borderRadius: BorderRadius.all(Radius.circular(8.0)), 223 | ), 224 | color: Color(int.parse(cardColor.elementAt(index))), 225 | child: new Container( 226 | width: 220.0, 227 | //height: 100.0, 228 | child: Container( 229 | child: Column( 230 | children: [ 231 | Padding( 232 | padding: EdgeInsets.only(top: 20.0, bottom: 15.0), 233 | child: Container( 234 | child: Text( 235 | userMap.keys.elementAt(index), 236 | style: TextStyle( 237 | color: Colors.white, 238 | fontSize: 19.0, 239 | ), 240 | ), 241 | ), 242 | ), 243 | Padding( 244 | padding: EdgeInsets.only(top: 5.0), 245 | child: Row( 246 | children: [ 247 | Expanded( 248 | flex: 2, 249 | child: Container( 250 | margin: EdgeInsets.only(left: 50.0), 251 | color: Colors.white, 252 | height: 1.5, 253 | ), 254 | ), 255 | ], 256 | ), 257 | ), 258 | Padding( 259 | padding: 260 | EdgeInsets.only(top: 30.0, left: 15.0, right: 5.0), 261 | child: Column( 262 | children: [ 263 | SizedBox( 264 | height: 220.0, 265 | child: ListView.builder( 266 | //physics: const NeverScrollableScrollPhysics(), 267 | itemCount: 268 | userMap.values.elementAt(index).length, 269 | itemBuilder: (BuildContext ctxt, int i) { 270 | return Row( 271 | mainAxisAlignment: MainAxisAlignment.start, 272 | children: [ 273 | Icon( 274 | userMap.values 275 | .elementAt(index) 276 | .elementAt(i) 277 | .isDone 278 | ? FontAwesomeIcons.checkCircle 279 | : FontAwesomeIcons.circle, 280 | color: userMap.values 281 | .elementAt(index) 282 | .elementAt(i) 283 | .isDone 284 | ? Colors.white70 285 | : Colors.white, 286 | size: 14.0, 287 | ), 288 | Padding( 289 | padding: EdgeInsets.only(left: 10.0), 290 | ), 291 | Flexible( 292 | child: Text( 293 | userMap.values 294 | .elementAt(index) 295 | .elementAt(i) 296 | .name, 297 | style: userMap.values 298 | .elementAt(index) 299 | .elementAt(i) 300 | .isDone 301 | ? TextStyle( 302 | decoration: TextDecoration 303 | .lineThrough, 304 | color: Colors.white70, 305 | fontSize: 17.0, 306 | ) 307 | : TextStyle( 308 | color: Colors.white, 309 | fontSize: 17.0, 310 | ), 311 | ), 312 | ), 313 | ], 314 | ); 315 | }), 316 | ), 317 | ], 318 | ), 319 | ), 320 | ], 321 | ), 322 | ), 323 | ), 324 | ), 325 | ); 326 | }); 327 | } 328 | } 329 | 330 | @override 331 | void initState() { 332 | super.initState(); 333 | 334 | SystemChrome.setPreferredOrientations([ 335 | DeviceOrientation.portraitUp, 336 | DeviceOrientation.portraitDown, 337 | ]); 338 | } 339 | 340 | void _addTaskPressed() async { 341 | Navigator.of(context).push( 342 | new PageRouteBuilder( 343 | pageBuilder: (_, __, ___) => new NewTaskPage( 344 | user: widget.user, 345 | ), 346 | transitionsBuilder: (context, animation, secondaryAnimation, child) => 347 | new ScaleTransition( 348 | scale: new Tween( 349 | begin: 1.5, 350 | end: 1.0, 351 | ).animate( 352 | CurvedAnimation( 353 | parent: animation, 354 | curve: Interval( 355 | 0.50, 356 | 1.00, 357 | curve: Curves.linear, 358 | ), 359 | ), 360 | ), 361 | child: ScaleTransition( 362 | scale: Tween( 363 | begin: 0.0, 364 | end: 1.0, 365 | ).animate( 366 | CurvedAnimation( 367 | parent: animation, 368 | curve: Interval( 369 | 0.00, 370 | 0.50, 371 | curve: Curves.linear, 372 | ), 373 | ), 374 | ), 375 | child: child, 376 | ), 377 | ), 378 | ), 379 | ); 380 | //Navigator.of(context).pushNamed('/new'); 381 | } 382 | 383 | Padding _getToolbar(BuildContext context) { 384 | return new Padding( 385 | padding: EdgeInsets.only(top: 50.0, left: 20.0, right: 20.0), 386 | child: 387 | new Row(mainAxisAlignment: MainAxisAlignment.center, children: [ 388 | new Image( 389 | width: 40.0, 390 | height: 40.0, 391 | fit: BoxFit.cover, 392 | image: new AssetImage('assets/list.png') 393 | ), 394 | ]), 395 | ); 396 | } 397 | } 398 | -------------------------------------------------------------------------------- /lib/utils/diamond_fab.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | const BoxConstraints _kMiniSizeConstraints = const BoxConstraints.tightFor( 4 | width: 52.0, 5 | height: 52.0, 6 | ); 7 | 8 | const BoxConstraints _kSizeConstraints = const BoxConstraints.tightFor( 9 | width: 68.0, 10 | height: 68.0, 11 | ); 12 | 13 | class DiamondFab extends StatefulWidget { 14 | final Widget child; 15 | final double notchMargin; 16 | final Color backgroundColor; 17 | final Color foregroundColor; 18 | final double elevation; 19 | final String tooltip; 20 | final VoidCallback onPressed; 21 | final Object heroTag; 22 | final double highlightElevation; 23 | final bool mini; 24 | 25 | final BoxConstraints _sizeConstraints; 26 | 27 | DiamondFab({ 28 | Key key, 29 | this.child, 30 | this.notchMargin: 8.0, 31 | this.backgroundColor, 32 | @required this.onPressed, 33 | this.foregroundColor, 34 | this.tooltip, 35 | this.heroTag: const _DefaultHeroTag(), 36 | this.highlightElevation: 12.0, 37 | this.mini: false, 38 | this.elevation: 6.0, 39 | }) : assert(elevation != null), 40 | assert(highlightElevation != null), 41 | assert(mini != null), 42 | assert(notchMargin != null), 43 | _sizeConstraints = mini ? _kMiniSizeConstraints : _kSizeConstraints, 44 | super(key: key); 45 | 46 | @override 47 | DiamondFabState createState() => DiamondFabState(); 48 | } 49 | 50 | class DiamondFabState extends State { 51 | bool _hightlight = false; 52 | VoidCallback _notchChange; 53 | 54 | @override 55 | Widget build(BuildContext context) { 56 | final ThemeData theme = Theme.of(context); 57 | final Color foregroundColor = 58 | widget.foregroundColor ?? theme.accentIconTheme.color; 59 | Widget result; 60 | 61 | if (widget.child != null) { 62 | result = IconTheme.merge( 63 | data: IconThemeData( 64 | color: foregroundColor, 65 | ), 66 | child: widget.child, 67 | ); 68 | } 69 | 70 | if (widget.tooltip != null) { 71 | final Widget tooltip = Tooltip( 72 | message: widget.tooltip, 73 | child: result, 74 | ); 75 | result = widget.child != null ? tooltip : SizedBox.expand(child: tooltip); 76 | } 77 | 78 | result = RawMaterialButton( 79 | onPressed: widget.onPressed, 80 | onHighlightChanged: _handleHightlightChanged, 81 | elevation: _hightlight ? widget.highlightElevation : widget.elevation, 82 | constraints: widget._sizeConstraints, 83 | fillColor: widget.backgroundColor ?? theme.accentColor, 84 | textStyle: theme.accentTextTheme.button.copyWith( 85 | color: foregroundColor, 86 | letterSpacing: 1.2, 87 | ), 88 | shape: _DiamondBorder(), 89 | child: result, 90 | ); 91 | 92 | if (widget.heroTag != null) { 93 | result = Hero( 94 | tag: widget.heroTag, 95 | child: result, 96 | ); 97 | } 98 | 99 | return result; 100 | } 101 | 102 | @override 103 | void deactivate() { 104 | if (_notchChange != null) { 105 | _notchChange(); 106 | } 107 | super.deactivate(); 108 | } 109 | 110 | @override 111 | void didChangeDependencies() { 112 | super.didChangeDependencies(); 113 | //_notchChange = 114 | // Scaffold.setFloatingActionButtonNotchFor(context, _computeNotch); 115 | } 116 | 117 | // Draws the Notch. 118 | void _handleHightlightChanged(bool value) { 119 | setState(() => _hightlight = value); 120 | } 121 | } 122 | 123 | class _DefaultHeroTag { 124 | const _DefaultHeroTag(); 125 | @override 126 | String toString() => ''; 127 | } 128 | 129 | class _DiamondBorder extends ShapeBorder { 130 | @override 131 | EdgeInsetsGeometry get dimensions => EdgeInsets.only(); 132 | 133 | @override 134 | Path getInnerPath(Rect rect, {TextDirection textDirection}) { 135 | return getOuterPath(rect, textDirection: textDirection); 136 | } 137 | 138 | @override 139 | Path getOuterPath(Rect rect, {TextDirection textDirection}) { 140 | return Path() 141 | ..moveTo(rect.left + rect.width / 2.0, rect.top) 142 | ..lineTo(rect.right, rect.top + rect.height / 2.0) 143 | ..lineTo(rect.left + rect.width / 2.0, rect.bottom) 144 | ..lineTo(rect.left, rect.top + rect.height / 2.0) 145 | ..close(); 146 | } 147 | 148 | @override 149 | void paint(Canvas canvas, Rect rect, {TextDirection textDirection}) {} 150 | 151 | @override 152 | ShapeBorder scale(double t) { 153 | return null; 154 | } 155 | } 156 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: taskist 2 | description: Task List App 3 | 4 | version: 1.0.0+6 5 | 6 | environment: 7 | sdk: ">=2.0.0-dev.68.0 <3.0.0" 8 | 9 | dependencies: 10 | flutter: 11 | sdk: flutter 12 | 13 | cupertino_icons: ^0.1.2 14 | 15 | dev_dependencies: 16 | flutter_test: 17 | sdk: flutter 18 | 19 | firebase_analytics: ^2.0.3 20 | firebase_auth: ^0.8.2 21 | cloud_firestore: ^0.9.7 22 | 23 | font_awesome_flutter: ^8.0.1 24 | 25 | flutter_colorpicker: ^0.2.2 26 | flutter_slidable: ^0.4.9 27 | 28 | url_launcher: ^5.0.2 29 | share: ^0.6.0+1 30 | launch_review: ^2.0.0 31 | 32 | modal_progress_hud: ^0.1.3 33 | 34 | connectivity: ^0.4.2 35 | 36 | flutter: 37 | 38 | uses-material-design: true 39 | 40 | assets: 41 | - assets/logo.png 42 | - assets/list.png -------------------------------------------------------------------------------- /taskist.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /taskist_android.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // To perform an interaction with a widget in your test, use the WidgetTester utility that Flutter 3 | // provides. For example, you can send tap and scroll gestures. You can also use WidgetTester to 4 | // find child widgets in the widget tree, read text, and verify that the values of widget properties 5 | // are correct. 6 | 7 | import 'package:flutter_test/flutter_test.dart'; 8 | 9 | import 'package:taskist/main.dart'; 10 | 11 | void main() { 12 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 13 | // Build our app and trigger a frame. 14 | await tester.pumpWidget(new TaskistApp()); 15 | }); 16 | } 17 | --------------------------------------------------------------------------------