From 7b9df7fec05fda249528c82db20b02db1e550362 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Fri, 14 Sep 2018 18:59:13 +0200 Subject: [PATCH 01/99] Add initial flutter project --- .gitignore | 397 ++++++++++++++++ .idea/runConfigurations/main_dart.xml | 6 + .metadata | 8 + android/.gitignore | 10 + android/app/build.gradle | 67 +++ android/app/src/main/AndroidManifest.xml | 39 ++ .../vikunja/flutteringvikunja/MainActivity.kt | 13 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes android/app/src/main/res/values/styles.xml | 8 + android/build.gradle | 31 ++ android/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.properties | 6 + android/gradlew | 160 +++++++ android/gradlew.bat | 90 ++++ android/settings.gradle | 15 + ios/.gitignore | 45 ++ ios/Flutter/AppFrameworkInfo.plist | 26 ++ ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Runner.xcodeproj/project.pbxproj | 442 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 93 ++++ .../contents.xcworkspacedata | 7 + ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 11112 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ ios/Runner/Base.lproj/Main.storyboard | 26 ++ ios/Runner/Info.plist | 45 ++ ios/Runner/Runner-Bridging-Header.h | 1 + lib/main.dart | 109 +++++ pubspec.yaml | 68 +++ test/widget_test.dart | 29 ++ 57 files changed, 1963 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/runConfigurations/main_dart.xml create mode 100644 .metadata create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100755 android/gradlew create mode 100644 android/gradlew.bat create mode 100644 android/settings.gradle create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner/AppDelegate.swift create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 lib/main.dart create mode 100644 pubspec.yaml create mode 100644 test/widget_test.dart diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6e5cfc --- /dev/null +++ b/.gitignore @@ -0,0 +1,397 @@ +# Created by https://www.gitignore.io/api/dart,swift,xcode,kotlin,android,flutter,intellij,androidstudio,visualstudiocode + +### Android ### +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +.idea/caches + +# Keystore files +# Uncomment the following line if you do not want to check your keystore files in. +#*.jks + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +### Android Patch ### +gen-external-apklibs + +### AndroidStudio ### +# Covers files to be ignored for android development using Android Studio. + +# Built application files + +# Files for the ART/Dalvik VM + +# Java class files + +# Generated files + +# Gradle files +.gradle + +# Signing files +.signing/ + +# Local configuration file (sdk path, etc) + +# Proguard folder generated by Eclipse + +# Log Files + +# Android Studio +/*/build/ +/*/local.properties +/*/out +/*/*/build +/*/*/production +*.ipr +*~ +*.swp + +# Android Patch + +# External native build folder generated in Android Studio 2.2 and later + +# NDK +obj/ + +# IntelliJ IDEA +*.iws +/out/ + +# User-specific configurations +.idea/caches/ +.idea/libraries/ +.idea/shelf/ +.idea/.name +.idea/compiler.xml +.idea/copyright/profiles_settings.xml +.idea/encodings.xml +.idea/misc.xml +.idea/modules.xml +.idea/scopes/scope_settings.xml +.idea/vcs.xml +.idea/jsLibraryMappings.xml +.idea/datasources.xml +.idea/dataSources.ids +.idea/sqlDataSources.xml +.idea/dynamic.xml +.idea/uiDesigner.xml + +# OS-specific files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Legacy Eclipse project files +.classpath +.project +.cproject +.settings/ + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.war +*.ear + +# virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml) +hs_err_pid* + +## Plugin-specific files: + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Mongo Explorer plugin +.idea/mongoSettings.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### AndroidStudio Patch ### + +!/gradle/wrapper/gradle-wrapper.jar + +### Dart ### +# See https://www.dartlang.org/guides/libraries/private-files + +# Files and directories created by pub +.dart_tool/ +.packages +# If you're building an application, you may want to check-in your pubspec.lock +pubspec.lock + +# Directory created by dartdoc +# If you don't generate documentation locally you can remove this line. +doc/api/ + +# Avoid committing generated Javascript files: +*.dart.js +*.info.json # Produced by the --dump-info flag. +*.js # When generated by dart2js. Don't specify *.js if your + # project includes source files written in JavaScript. +*.js_ +*.js.deps +*.js.map + +### Flutter ### +.flutter-plugins + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) + +# Editor-based Rest Client +.idea/httpRequests + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Kotlin ### +# Compiled class file + +# Log file + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) + +# Package Files # +*.jar +*.nar +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml + +### Swift ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +DerivedData/ + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ + +## Other +*.moved-aside +*.xccheckout +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ +# +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/screenshots/**/*.png + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +### Xcode ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) + +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcworkspace/contents.xcworkspacedata +/*.gcno + + +# End of https://www.gitignore.io/api/dart,swift,xcode,kotlin,android,flutter,intellij,androidstudio,visualstudiocode + diff --git a/.idea/runConfigurations/main_dart.xml b/.idea/runConfigurations/main_dart.xml new file mode 100644 index 0000000..aab7b5c --- /dev/null +++ b/.idea/runConfigurations/main_dart.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..1634cfb --- /dev/null +++ b/.metadata @@ -0,0 +1,8 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 3b309bda072a6b326e8aa4591a5836af600923ce + channel: beta diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..65b7315 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,10 @@ +*.iml +*.class +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +GeneratedPluginRegistrant.java diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..2eda7a0 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,67 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 27 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "io.vikunja.flutteringvikunja" + minSdkVersion 16 + targetSdkVersion 27 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d6b0a94 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt b/android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt new file mode 100644 index 0000000..f4538bf --- /dev/null +++ b/android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt @@ -0,0 +1,13 @@ +package io.vikunja.flutteringvikunja + +import android.os.Bundle + +import io.flutter.app.FlutterActivity +import io.flutter.plugins.GeneratedPluginRegistrant + +class MainActivity(): FlutterActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + GeneratedPluginRegistrant.registerWith(this) + } +} diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..00fa441 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..830798d --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.2.30' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.1.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..8bd86f6 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1536M diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..9372d0f --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/android/gradlew b/android/gradlew new file mode 100755 index 0000000..9d82f78 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..5a2f14f --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..79cc4da --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,45 @@ +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +.DS_Store +*.swp +profile + +DerivedData/ +build/ +GeneratedPluginRegistrant.h +GeneratedPluginRegistrant.m + +.generated/ + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + +/Flutter/app.flx +/Flutter/app.zip +/Flutter/flutter_assets/ +/Flutter/App.framework +/Flutter/Flutter.framework +/Flutter/Generated.xcconfig +/ServiceDefinitions.json + +Pods/ +.symlinks/ diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..9367d48 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..916f2c4 --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,442 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0910; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 0910; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.vikunja.flutteringVikunja; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = io.vikunja.flutteringVikunja; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..1263ac8 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..71cc41e --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d43d11e66f4de3da27ed045ca4fe38ad8b48094 GIT binary patch literal 11112 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 P-1+_A+?hGkL;m(J7kc&K literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f GIT binary patch literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..a6b54e6 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + fluttering_vikunja + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..7335fdf --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..94b23e9 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; + +void main() => runApp(new MyApp()); + +class MyApp extends StatelessWidget { + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return new MaterialApp( + title: 'Flutter Demo', + theme: new ThemeData( + // This is the theme of your application. + // + // Try running your application with "flutter run". You'll see the + // application has a blue toolbar. Then, without quitting the app, try + // changing the primarySwatch below to Colors.green and then invoke + // "hot reload" (press "r" in the console where you ran "flutter run", + // or press Run > Flutter Hot Reload in IntelliJ). Notice that the + // counter didn't reset back to zero; the application is not restarted. + primarySwatch: Colors.blue, + ), + home: new MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatefulWidget { + MyHomePage({Key key, this.title}) : super(key: key); + + // This widget is the home page of your application. It is stateful, meaning + // that it has a State object (defined below) that contains fields that affect + // how it looks. + + // This class is the configuration for the state. It holds the values (in this + // case the title) provided by the parent (in this case the App widget) and + // used by the build method of the State. Fields in a Widget subclass are + // always marked "final". + + final String title; + + @override + _MyHomePageState createState() => new _MyHomePageState(); +} + +class _MyHomePageState extends State { + int _counter = 0; + + void _incrementCounter() { + setState(() { + // This call to setState tells the Flutter framework that something has + // changed in this State, which causes it to rerun the build method below + // so that the display can reflect the updated values. If we changed + // _counter without calling setState(), then the build method would not be + // called again, and so nothing would appear to happen. + _counter++; + }); + } + + @override + Widget build(BuildContext context) { + // This method is rerun every time setState is called, for instance as done + // by the _incrementCounter method above. + // + // The Flutter framework has been optimized to make rerunning build methods + // fast, so that you can just rebuild anything that needs updating rather + // than having to individually change instances of widgets. + return new Scaffold( + appBar: new AppBar( + // Here we take the value from the MyHomePage object that was created by + // the App.build method, and use it to set our appbar title. + title: new Text(widget.title), + ), + body: new Center( + // Center is a layout widget. It takes a single child and positions it + // in the middle of the parent. + child: new Column( + // Column is also layout widget. It takes a list of children and + // arranges them vertically. By default, it sizes itself to fit its + // children horizontally, and tries to be as tall as its parent. + // + // Invoke "debug paint" (press "p" in the console where you ran + // "flutter run", or select "Toggle Debug Paint" from the Flutter tool + // window in IntelliJ) to see the wireframe for each widget. + // + // Column has various properties to control how it sizes itself and + // how it positions its children. Here we use mainAxisAlignment to + // center the children vertically; the main axis here is the vertical + // axis because Columns are vertical (the cross axis would be + // horizontal). + mainAxisAlignment: MainAxisAlignment.center, + children: [ + new Text( + 'You have pushed the button this many times:', + ), + new Text( + '$_counter', + style: Theme.of(context).textTheme.display1, + ), + ], + ), + ), + floatingActionButton: new FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Increment', + child: new Icon(Icons.add), + ), // This trailing comma makes auto-formatting nicer for build methods. + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..d204c66 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,68 @@ +name: fluttering_vikunja +description: Vikunja as Flutter cross platform app + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# Read more about versioning at semver.org. +version: 1.0.0+1 + +environment: + sdk: ">=2.0.0-dev.68.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^0.1.2 + +dev_dependencies: + flutter_test: + sdk: flutter + + +# For information on the generic Dart part of this file, see the +# following page: https://www.dartlang.org/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.io/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.io/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.io/custom-fonts/#from-packages diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 0000000..6cf6986 --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,29 @@ +// This is a basic Flutter widget test. +// To perform an interaction with a widget in your test, use the WidgetTester utility that Flutter +// provides. For example, you can send tap and scroll gestures. You can also use WidgetTester to +// find child widgets in the widget tree, read text, and verify that the values of widget properties +// are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:fluttering_vikunja/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(new MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} From a26489bb3d43f172cf8fa0b287f349993e6c8d92 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 15 Sep 2018 14:18:24 +0200 Subject: [PATCH 02/99] Add vikunja design Add drawer menu --- android/app/src/main/AndroidManifest.xml | 4 +- .../drawable-hdpi/ic_launcher_foreground.png | Bin 0 -> 5446 bytes .../drawable-mdpi/ic_launcher_foreground.png | Bin 0 -> 3495 bytes .../drawable-xhdpi/ic_launcher_foreground.png | Bin 0 -> 7449 bytes .../ic_launcher_foreground.png | Bin 0 -> 11349 bytes .../ic_launcher_foreground.png | Bin 0 -> 15423 bytes .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 ++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 4407 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 2806 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 5983 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 9122 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 12176 bytes android/app/src/main/res/values/colors.xml | 4 + assets/fonts/quicksand-v7-latin-regular.ttf | Bin 0 -> 44224 bytes assets/graphics/background.jpg | Bin 0 -> 128618 bytes assets/vikunja_ios.png | Bin 0 -> 44859 bytes assets/vikunja_logo.png | Bin 0 -> 11501 bytes assets/vikunja_logo_adaptive.png | Bin 0 -> 34093 bytes ios/Runner.xcodeproj/project.pbxproj | 2 +- .../Icon-App-1024x1024@1x.png | Bin 11112 -> 47378 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 622 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 1322 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 2096 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 914 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 2002 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 3214 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 1322 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 2901 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 4548 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 4548 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 6954 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 2763 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 5820 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 6503 bytes lib/main.dart | 78 ++++++++++++------ lib/style.dart | 31 +++++++ pubspec.yaml | 17 ++++ 37 files changed, 113 insertions(+), 28 deletions(-) create mode 100644 android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 android/app/src/main/res/values/colors.xml create mode 100644 assets/fonts/quicksand-v7-latin-regular.ttf create mode 100644 assets/graphics/background.jpg create mode 100644 assets/vikunja_ios.png create mode 100644 assets/vikunja_logo.png create mode 100644 assets/vikunja_logo_adaptive.png create mode 100644 lib/style.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d6b0a94..80612ca 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -14,7 +14,7 @@ FlutterApplication and put your custom class here. --> - + \ No newline at end of file diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c92c29c77a2b69cff137e02b5ed0a2f48b7440 GIT binary patch literal 5446 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 U?iT8R_#Z`5lvR_dmHrz1KSLdN{r~^~ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..57fabdf0ccf05a58428d123d1b1da8d42f989616 GIT binary patch literal 3495 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 Ag#Z8m literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..d477bca0b6dd3219831592d57bc4d4050d9fa580 GIT binary patch literal 7449 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 xk_;$zZ*xh0R5<}OFmSERr+@8J5+ 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 Bu4VuL literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..9ab3c45 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..17f7f7e646c32f97ba321f459b325d65abb0b023 100644 GIT binary patch literal 4407 zcmV-75yN?16@f^|hdm$Ef^E{7kQ|ca!UO+$Gjw$i!NFrqOLb){{-)8deAU={ z;q9LG`rYQ?&OSEohnB@wL)y|6H|i@lyoo5$&%Vaxa^UGl?|{`S<^{@{T6&@WTt`B( zY7ohrHdNEcWyQJh``rhCLs43#y7GCYx?6)M%0e;wSWB;(oYG^=Y$C22_%A=)%U$FPFFn&VMdJ~YE>58z43;y*X;Jh z^{H4iO%Ubv0>Rtsm8n3Ll2~z16FI;fL z=D)i=L|Lr58`oFSQw+mxwSdPy34(0jU~{_M@rn*WnkJ&ZDT)GXR|kl-1+a8+31rG7 zFlx4j)F*kO<#VgQcR{K+`)G5+`@7?j6&FFu{P_#ZtG66>dmuA*ZGfr;h4eS&^}wW| z4>$tBG(pb92}(;7`VKrE@VcBZ+20FdT_G%6QVL&ueLm99g!#IvH@RHCqN#4r%S>f4 zCMZw0_}2N=o8QCzV^TjuDyF9xhI4cTD0DNF#~Zlra(S4F4ng`9L0*rq4LmYEHY+SB z*G3}s^n-0Xj{@wPFTT1y#>YT1Q(tTMqAuRW~Lk+~rPu1ZBy5&k2v50FXZN6UPKa@@I=V0hir%Q+Qv?D0}F>I(%t`o`&LiAIA1DRJzI;FT&E z*;zi~ae43v;_!GdGH8jflLUwtE?fWSllw2<9LbN1NYI?h+iuB{7yUFoi9xdc9=dn> zvC@hf-59=h`?`ftiIi%QRsnfR83+(Tv*AWc-8eiBz5OQSn)E>A28Pn|swawuR z;95`okr0wETCs5XJ+Cz!+4W@D>){Gz@*=gmY}LCE#R!ar=_fzk1V<T56PkY*HL)?b%HP%IkIj<*)!(l1;Bd6hP8s z0}h&E9{U&?O~?==a1@fFM;23% zQ;|!yke*faE%fyqeHXqRPj-=$EoD@XBg&*lk;gVdk1Pu7C-mWnWpT+%PiIah6ClH} zQjuGjM#^#uP)`W<_GG3YXQ(u>a^?z=11ii&N}fMX%_2CYAae;R%~CH#CtS8$m*+$t zL3oMp?K6N@lh3$4`ZxUppjE5FUiXJ#*#z<|DoI(Uri%5J0gs^Y1mPQf`uSI2|Dj{> zqkFysKl``)W47f*zj@-9{{cr&*1=29{T%MNbzMjuNzh&yTgb{O(vt$QbUy1XL*yye z(%KFeE;Yk}58s7{pLhl~ZM+@Ss@$k;U2JNG&TBnz;G=ipS1-Q)jSFJqts|;g|#&t`EYl9j|~=o&#IAYy^wd3Tcv=rU8#f zq7OHz-ICcz%TVT%1Q6jTb&}w4!Y{k)*WMI3E-utDYU}n})&!2%-n24eJsh@WlOQ0d z9K6hDvDe}>Ty7kjVQzbRT$A9mj`%F>DL)O{N<5(yNc3Uiip-94Ck={_VuDy-A2F;} z2V|tj-iE*s z$kG<1E07lw-el|PAC9w!41l_a2%^k5>4@#NPo8OofBAO!)E7VSo|)I<+djrq?cmYV zkc(C~eQ5!FzW+FkjE=zrKiC}Ttq18RGJ<1!<*I?r?)yN1g+%Ib2+c9(CM`o;X*0m} zAv3z+$Uc?VGrd=bm9S2ug4cGwg+oNZBf0SF?K8LKaF$3o;QDpvB5sZ*0cwBcr#UL8Ie4Y|w6*5T1nML#AiRuGHBSRQDJ=kP)u(o^+U zp{?^eYkdxe({61e$A`PmK*@4CESw4spvKaH8R}k3%QOMJ8QEP zMJXW&<8(u0g0LQ1R8<2xSu*$-kjO z%mZ}h8BLJU(EOFIbVbVa(7>RXUTq@jA#5FsvkSpKWpDt%?4##DJCQ*tiX{G9zbqaL{Td&e8?)is&a5#e*L} zMraB#In>|$6+Q^;&6o`T+>uwfDkTJA*d5F=>!XD=DCCw@5t=(uml*o4>uI* zOJ5L6b-!jqc$#F|3&-9&Db1youE%Dgqg@0x2D$O+s4N+KK~O$PHMU;dyEELih$E!o z=sPdhtb6z-kvJ=K8#7MK-u1-p1DT$SxIs$TK1Powu88kjwa{|TB<&@d(HR#g7&vuk z_gyZhHEg&tB0)~4)qAP_{rjp{KX4`4m^Ck4t`Oe$Ld!QtCSDfCQKRNZZhU;N_ev zWR`Fh40V21!UT;NJOAh0vE8r5s>f)RYO33_)3d}W$uFpS2@)VF5i6Pr3N&&!btdi? znPJ>)`20fcJKLDlWxR|xH@^R}-DYkpn!DytXn4n!4kk@OauY_y+*livA@Gh2b^hVP z>36odUCiD~kIT;KY(DfJ0hFO=?z;VG95GhhnQW~%v!E}DFEPbz?D)mm|o`w5W99U4P;6MA5fSr;yFEQRfF<$?ywygT~O8hG&4H22j5r?rdrNI9?eE zS<3z0m)eG|cdcHy{F&d%vN?}H480UBUolze)HzWJvfI)dE;anu=22r;ZzAm{>`J&C zR!75;XMb8WXU*r@vJG$W_>PF#P)d2~2-0eDp#Gm>{)-GnjrCvae4*{q-ru9XCj25< z(!N&bmBU{S8k)-IRc(GzmaYBS>^5g_QgcGwa0A7&0zjY!iR=y4|#L?f+@LcW&9ddA(RH z&?FL@#suLw5{?9Lgc)G5I!tFz*B<@svri7}+xNj|-PcmLL6*}0f@iml+D{z$^mF|A z;l1C7`IS|LRaJ|t^m_fgIr=%}T8&CsP*hSN;Pd2s9x3GUxHNq(mxpq?+)k&{Z5}cj xyIQZb4EGzZUq)y>dGh$_i{~3#Q`zre{6Enc6YcGBs(%0g002ovPDHLkV1ktumc9T0 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..88e41335a04d1174614fa96cf92f4b4f31cebdc0 100644 GIT binary patch literal 2806 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 N002ovPDHLkV1kvgXVCxv literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!iOI#yLg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+5i=O3-AeX1=1l$e`s#|#^}+&7(N@w0CIr{$Oe+Uk^K-ZP~83C zcc@hG6rikF&NPT(23>y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..db3a47b9c000cf62c69b45501bab084f0a6df430 100644 GIT binary patch literal 9122 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 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372eebdb28e45604e46eeda8dd24651419bc0..c54794abf7d3c756a6546de986ee80b41d16165d 100644 GIT binary patch literal 12176 zcmV;BFK^I^P)?yW+s{R9y+9ekO34aVnGNgC@NO4tzyHnyZU!mSEae)DxmAD?yBp$i!SQ2 z76Q7qRY)Nqb`Yf`lw?8=5SRo=GLvNHx$iws3X^1>sZX03zn{-A{XUn;{oQ-+z2}~z zhhLDC88a3|Tce|ffZaY42+80mq)wB}0O1Y+ zr55(&5G8Psy?>NA=ugETE-)+oe+p&vYF8kbxnR}{QE}9k%TqFy5IUSS+>tgQ*~H;s z?VSjpp~7AJW7depAw8Z@I=1Us=l6633T7@j&5GW~%G$zS`HCm7_2AaB&AWD$v`Y6s z3m<+FfCn;7d2xi2A*@Y~%rNDS(g8P^y`00EWj0V-62+$8)k2B8q9lP`A&xcvQS2e! zZe=433?7|l9XxvKJ__U*t81mXqNIWe?*RK;1#fli*}J!#m%U;^$}a+NLGIOy5)Jyu zLQ462SnDoOyFOkJ#iTKUiDLvCE+%J<%y)jzde($#Us1w8SG;oJTD2;uRelkG6VtDK zcA%YeJjNd0#cYr$Lgeq!6(EXIC;-ak7tUPrJ^LShTD7C}b#rCu5w$C(1;SPUNvTBX<-{xO;b67vqB#hh1;p_wGn3w-gnPZDXzoU}tE2=WEr7Gm$~D;ax+}6w z`IiG_JsyCGz03ttW|T1kl9OV<)?x=seIronZf#RL;B+QqP#Pq}M?>w=1~^)G($&Wd z>~niDS)9vr|UAtO!^J8>*unk{e>3; zn9pM4xis$_n03|pFtA^8*X#Qaoq*pjd>c+T+5)Vx{7k+e2NwMPYT>cN!NbREHp5%* zeF@Fh7MGuAzuovKt93jxjUWqXF>yrPvi8GAjwxAZB?vhIXlRUhk3GC9(6Vq9 zs9?${xZ&yxVDNyHUhm^;6UPmOlJ(mIy_D=+blzEAk99f@uDNUiOqw_xez)-7PqLQgjXABm2NWDPqT zuDyH$3?JIx?PrH&_SL)qIF7(MqlWZ)JuM|37SFpLo_*yLsIEEcsh9}XA>1>}lv_Ar z^wj0Mx0RMO9NG7+#Zna@Vv}Rn-vctcaOTn> zoa31X*L*nl=RoVJ20*Rr`x0 zX{nwqLOq)o+<(_JSoGX#VUp|vQ+OS}xnSm!|ClREpJg|1h7rvWR07DIwJ6p=Bh~(9=(WE_0` z!yfo?YmHymVnVngYefF@OaS-zRe-{1UI5u63i@OY&;29excfjtTfY-D53as!yx-q% zZg#znt|ek)BE9}B?s+VH=xVrs?wfGm+w9sGfV+K-=6z;}NJ)jr zlRU;}XE$ev#+2`cmo_lZkn~OBzK&2T0O#juQc-HurfdY*m z8J5-8<7e#6P0)OBKSZXcvzzO)G7g9K1rQw-A^IMAv$oV7WAh;nB9goNJDoc^Ll`Mf zowiC=7YcNCL}SF5Y}3>!)fMX+BrDiYR2M)}YG&;C$@l)=-ooRu*+8YPJNE2Mx9>Yz zY+$WDBs^|AS=^jZ7_Yu_vFh2M0mjU?OmAqzpYCL2P7C-&SGrPEXUk%U>HwV70jWre? zh)&n*vs#}6pkrTz$Q}o^ci+WsId-(00FW7%jDyA4|y!XdHbn~GDU5&r%b>87p09s!KijH<;{`4^4__kJP zYp4f9Vp7*@xFnjA91F)!$g;7kXFvBpvrKv0%oSzd%W(mZ6;R`%Nokn_$4|cdCH5yk zpM6DaerKlVj}d(j8vx(hdvgm%0C2IIsC5%4(ai*yxA)$|upX@iqSt{w_RL6-F)&Ro z0U#VRhgK3G_f}Vwu952^VyGg3@l)o!%kCzraqT{72{2-qxQ~Bpy~w5|b=}izT>$P@ zfO?uh?JrU`_c;u4L*u%l+YK6+0-Ju8FCrtm%8)Em{ui01f)`6x&3j0;3%NjX0Tj$! z`ULxxRcZW)yT*?_zpLKg9a=YmVxq;}AbOfW&ad-K9Gszj$V*Q2-aR}J2+-eW<>Y_N zCdTE8To4o#KvHVvfbqF=R)QCYYUvFzX4GwFw&*imgd>Jupu~7F^M$fGfE!0Xr#X+&=({gbpilxYX659Snk&n8$ax)E1;EUn zc-Hg(l|7sdN`y}KKq9kcF(N`w(B`!_dI)qNQhTjWg2hGvds9=drQU8hE&InrdGAgw zAzaqTf;U(-uBxdl^LS$4Ut|@)xG8fUVeRI2Ij`Xh2_jBmf+^r}qsO%Zw7wD6C*Adk zhdxejaS9AK54 z+1jE7#Zs0lxd4XdJ+lQ8H-oWi{6#YH}&f!(A)9M{bR zlJY!2fTZgv_sv18*8JxW*W_Qb!K1N!C2P3qPhJ;;VW7n=vLHSzPAUB*e#GL%MaIZrI)iPHx_XViWkfS!m>`rYj8>f^e*PV7H;+=~n{>cK{V zKM-(ySY1)>*F?o{0Zht$^ky5isCKZ$A6i91nR^mIWJ-$5^T5Fh;Y9u~>~}E4b+`XN z`0NL77Rl7)-0Ylb&ocr1#-A_yEdVRETp4V3k6p}j(@l?v;)qC07JWY$5fgLIc@FMz zeDi~Tc$J^!X;JKiQ;2l>&v$h2ev9Crll`<%e}X#d7rdFI#xs)8pC2-U1b(IRuK; z=Gq4aqae6~i;V0QCnprp8C~xWIL~u%w0!IRFO{m26!cHe%DV%8ShvKNFZtfJapZZR z!Poc^tB6yV*a)DD48Do4H*gUV?PgyO<6d~Z1I&RemP1&p@D2`BX2~aju@~NTIY#>R zsa6`IQ6!BNwbD2xKu!v}@u#|z z+oe|30)YdbdozF5k{?Tp=6jW_&ual-26kwKDgM_@eb8s;@DU3P?B6{Kva4lKT>5mk zIur^R;uC~GV0b>j5TDrf`T=JC;4Mhe5gz`??r-$w!(Its=+NmpePhJi5MTy&El|2) z2i$gJcPq~M@COo^)(0Yzx{D-KG4|=#-T`!o9Rq#6_>a$3u2o>L|H}2*Ie9NsS9*>& z>XiU8$6P#z-OUQPW*Xqr;w^&zPPa3!P9_lcijgU)YE(@XdaekedFZeEwT2+sro!2h z2p}UP7wv<`B&n7LIC-iWzWRPQOqzJcg9F8Y6F@xnh`oO}gTDnP41eO;RccoyASm%J z{H8|%aM8ljlKX5DL58bSTrn9UArr%p^T!Pn@+Y91br3T;|Jubjlzyqaz_IDgvxl&q1`b zPKK#)thu7pdjTY+XGKs-mxNZICLSBqU+j%_7%&LHAQF8c$id7oheALA9PraYWGUaZ z08%r@lMu4~J24ofJJm%UZ9v$#>BNb?DlrX@PE<$MZ)ZPO2)1CPn+6B;yAlyblpP&;K?H-2r zgFCO7`PyGTU3Fi#kcwg>Ku~*qig8TB=mvyvppWY-^zwXbGwb#3?P-PB>x9#{N0Y|a z2w}Z{@ExqdaEP`RO$5c2idY+*_yfEDt@De$1dw;bQ`z8vzKT^#L0VevVBU8OvW7^v zV#65|gj-K=f{daNOrIcht3G<{q}o-G90KH;+}zyz%gf8V#^hcC(Al|%Lu^UA8+)pc zNGbp^aPo_gh~PX`cA{QW0db|G-~OYzbJ+b)oiB6~z?D}%8)qfj4R0<5VmY&Wb2?=iLNAfcGo9R}4Y}m7;~i>iC?u*0ayYf-XkAQ)!{H2hbCakO|Ju zy9AIuDi57xrYT+{1;JrGB0`xUS114sHRx!z2>S#Md+$?Lgf)D8k8fr6c58Q=n;6s` z0YX&(jIoOrE#lZsNRn`-HSjQ4wJIru(snJb0CDj~K?Jxl)(I|?a>jTjlDKvO*iN&a zzuD=F?EMI_4DZSi8KNc-BWmLgBgT^7hEKW#z@}_xt5zk2z%)gQgOR0UQUzPTGt;DV zATAsQbg@R@FlhzuF5}!;IHa%c^f@LvvRC$-kb&~E*}sqA!!7}2jF=jd?hnqWB7jcV z`~xS(qHhbL&`tzuosJV04C+pV)NZf<>so#VJq5tjK0vh^DMVC=F73%hVnTFC3V_k? z(i@j%eDU7Az0NbjVX9R}Aw-kL{env{@7W&n5w)u!3-&f4v&<__a{w|dST}9FC0-14`C?37db~2BS>F;i}7|S~=dmyx=J)+wisUoP0pwhaZ222k*NR z(ozH4NK8GPpE97m^Z{ z@;3r_?O!Xp8h?8|D17wUTKIWeC4BhKGSCN*+bkut1%RoQ2Dgs@goH(~9I4I(f48a2 zmkMH{qaZRe5-jx%V6(Nr-{1H*%x5Ek64W=Ggty;Y-SxbGzdmsML_M^&whCt1_KICF zX0*xg@{-U&8xKB+iR1;rq=$!-79O%S@q9 z;kKmPP{V71yHAwCY4J~0<2T`&QvYxcqK<~|Ag4jhC}J}(JK03mJy zA%pan%vzMp=5isw2Y^Un0`1ykh8>l=Au%By{|g#4&%F35 zKW6!ETGZ-9$0JWqH$G%ExC{m;L^RX5!Q8@~FMz4Cv4UnA5_ zpp4Ai{(3ua7|4Zz{f`)pf%~_7@X6=G0k3DCoY&R(JDEE9LiqDvUxTB^>fl)23Fwn9 zUwA>Bhag5{B+QuJeboo&AP+xq4=jA@Ic5@BgptZ0&>u*z*NLZ>4RQ=o`ZzsDNXUgh z5hKD7m?tPUY81eIcisvYO&s6r{Q>>@!m~^me|hx{IAO8KDu7K}w!!2JC&K^TcL!_W zNxj~`a(W@G-}o);sxtd600cJ=F||}E;vjsw9teyG#;67Upw|bs(wm%=0H3_K9QyVV zkDEEYaH?>V8*KP!`-_3**9%Mj81Qvsq9Q|900c;yo=`{)llC7ldcEFl<5v=QjbBQn zFdH>Yteywx7ba5x;OQ??_Z35cW}~*Dae6jV_6rvih`PuOqdpXPhaGr(tKg@L@rK%6 zr`zKT5tTRSX-Ib(Bu>wM|3uFp3=LeRMp6aVsO&9`(AsPf?%jos!}G$1sCdvv#(^#f z18iv=BMKlXXk&Nyh^@6v#jCSM-`WhVP1xv9b!BMx1aG%N%W1qF1I}QCi0BkB7~_P| zK?yLaV8}ut3Ri(be82k)tty53!(h41_4~ll8dzh(h!M7vhoI#Y2QjJHY;=&{ThkJn z0kYa5Ak1*W=9pBQN*g+@O~(Un{LbLnV%w>s5S=V<90Lp`iMJ3&IDH+`PT$V7C~N{@ zL&e75(s*3*veArcw(JFCd_UPnf_(>qI!mNC2qS=YPGZYUi=rkFWepU~9{Dzra01wd_rtL|3k>L&4p|ukML*kSJt?UGYW9cx z1Q@aE3BW<7^Koj|LC=A>yrvk&ik!MX`R=V*5ul`=dh&ZX_Qmw4SFI>JRt>FpmIiuQR6TG&(2sVDZMR?3{9Q^Lrw?KTH`)JX)8iYH} zQZ0ubJ`(aPKu9wi0mwnMYoR1xf4_&B6}2!dtDh|8^A7h@D(v+i`pvDdcmHAd*MB~Q z-BtV8a6zYnT@j0WN4lO>jq^e5aq}L66&-49(?~}wQQ5&&Kv;VkPsgWznOCb z{J)pq>b2s6=a(P2=O*D$x(^rk{f6FdfFvfw!Tg8jz~F&CnrRXUU`5fF;j#k6Y)1VN z{TClBtSy|m1dUE@9ClTR?>AS;BLF|_$&oqPFm37utmiEgp5JlvRlYZVytFQ`jWG26 zU$N?|fXWCas&}qE+WCv&o_AOYV7E+h?>U_Tc)R*-8cv?>dW>@eU%{i3D84}WtawX6 z-w!${)V2$Na_fQ6dsVKEqF_h&{Hyj6j?JmDkt8_R0f(eLsjfWI0rILJ&ah z=1+Mh0GtSie5%x*SZ!_a_4m8s%1fnlhcX!B!Nx`cZ#Tty;_E_^F4F&`+SPlH!Y6Bg z^!xk43bTOA8yfaf=S0~@NEiwL!QM|w0U&4w*?kazb0~F(gZF6zERc9XVQ}chCG6MU ziuYXt;DOt&1HM4LDyheJTdLt`-AN%Ws8nDeE4%Hq=MQ#(Va_|LKY0q$Tts~C$?3*s zHhDEe-X&-GRY!EUE?K|L^9Mr@JJ)Jhi4VF2u(zUkN46Xa$JbVHM_75zxVkhX9tT)ENM<0I*+bgPI(15;>nvy8& z@Zv2xx_dk_j6B^*OUoIL(z@doFz-9W?(5n8K`_@GWTVvyVe*RM+Hbn~R=?}`@tVzk ze>a$+K)SLDcKzxE$aZzAqYbb@y}G;v7SF$4veZTxvuDQid`L}Bgpa>i4>fxac15Vx z={SgsjS+5W?_286oFe<%>+cDxLg=&PygJkges}VPAGGZ|6wa zs<~b6u05Pb$XX_luoVDu@UTTP0U$UT#&vo;D3hL+439r@FMPY{XZZTNpJB_^N{=}U z49qk#jmU

~_(_F_4m+*io+k8(;el9*3r8-~E+B16u9;teXHFhPGw8Ha(^l4C%BW z?$}jb3**ORNm`~MI;qP&0?n6;CY~$Y8k?+8d$bOk*nMMDlMucg&95k9q+l9hkKc!h zCNi@3B-aq_f8MX{JHvOnrw6*J`*SDC-u>gQ!kJ6T*~3Bw>!c}a_8pVF%!rs2Xl*(n z#O`q>HYN&&W%(Z9HZnF1^bx-M3w09m@qXN}t74tF0NSBzm?;#t0+1sdIA(c?Vsn9J zAKfEdfty~DvFQPof%Ba3g;qH~>m`7i9qX25j?87!K#2XvpMZf`fA?_L6^sw_Fh1b`{VFHx*s8Uj;- zVpN1ca|*ixd++GvOlA(%b(lon9b(5b2FAE_;XY9Ivc`{Iu;B=y!f0D81DRb zz_)Vxl|5f{DS$ndCFR+s{Dy~n7QO-_VX>2r&`(tlS2e6d}|}{ z9Z@NW!N^AbGrP#>0~F#}A6@d}4`pA7z2|nVk0XwMQL3Ad4<)aahVkT|qivl2R6SOf zY%OXg3Rev~#}UzZFKz{}w&?Mig6kHqA%skqzFykJ7#UoyP{P?`PS-J!J|kY#v9kdb z%5xhr*#H0cRohENW4(La?J-xDt;#m#hnE11!6N`_w}BlU?O5a2MJEZ*JLwrJG3?AA zLN}}}TJVayk9gkhr0|Vo6$%pM*aemgzBB$1Gj|+KC%Rt8_(VNJB^nH2lM-5h@Z?2L zpYiyYw$xVd%r@n{&BoW+(o{?PXwd{hw+Y&2Z8vo~8a6)XTRQhF(Aa4=e~2LpbWy#} z6dNUsfTwjR&@G25fBMMN=R67kW2Yo?!|rV0tIlV?v47zQf{d7G?d|{ZRtxZAPIS!t zF(eG^aJQ!2R(_m`3L?`kP@*7Zc|}E$$JGq4#`>b7>mAdsTe5_e_GZ8}3j*Tf{r9z( z3!*n-{#BRn3B5fbg4yGaU^49jg*EokWn&C!Z3+afty-H zAKAX*BP?%{c5}#utuF?iMvIAxfF^5*r-r8VwNrJqUIjezS^zkl^vyW?Oh>p_U z96&0xXx>Q)rR0I4Ro8pHmG6@Psw+xsvU2htWGZ`sJq^h~Fq)$FIL2Z=g?cZDbCF;CTVh*XmsmOq!A&gKIE?rnx3Bi4fng#I?dh7@%GZ><-WA-MqJ^D9lp zppX+l8%M|`=8DNxo3TyXTA}%&c*bl(iq@e(7f9uy2&GW1ABLU6g%s+j(G~=9$jqGnf4?^V3 z0ImXgf-@!vzQ(vBgd0hxgel)(x}!KN>&9{h$I5|@5<%xj?0~c0{E2_<*7-OkBy^!Lo5|^tnmxpn8GnE zW@9&>5X>OjW)oumC>8d^8xn$iH<FfQ=vL5Qr`&Mc89df}r+wBJcy(7V)W6#YrlF z@;4XR#!kNLcPZ)Fn1e}~?o47hP8w4MPi0}RPjRJ)%@6F2$AB|L3&Nn(AjX2%fkzs9e-L!hsfuo<1)~Xs>-{CG7W`W3a%J)6N+iRcY=Ek9tk##w zQNEl=9h4RuHjPRYR*HJRsRw;*y2q1TQWK0OkP(t!m!n)+1b{~<2bwOqYWT?9_c=)&DlHe_heD=88{D*+{US z{a0sYk1W`%#`Qhn`Al$VFn&y?+Es9dXKmuPlGO`VD1Bj78lbtdZ0pcbg||>j|IMCi zs>_Xx(3~b^0Z)ddCda{Xi}DEpd&1g5ks6I3QSGn2wrJk_%oN&|m6P{6n|NNJRy}%> zkPvt>>R@5~m@N3B>}NHr(8L=53TF1GmWE5!?v9y56>QdXdG^Tsui4WPYSsloPtf?- zkUHbj=kBEME0^jXD)*NA>aETv=K_Y}CaU@ibyJdz!0eUC<;5hh@-C zvNO_EyEdmMkFR-O-NuioE&yar(ISh!;oL^muCLFgMu%C9j>DqP@HTa+8#( z*rflvnu^i|N?pubG$#OL?RyIkWSXWz#A<;ffXw`C-ckA| zox|}-)$Vf5B`VgW0FauBb=%nO`hr={3?`Ic&tA%q^Ll6woHewcoR`of17s8cC9tlh zvgGRO%Cb|kT_iv>D}YW)istUmGHtji+qAJ9WQ<0g#>}5^%AwUsa-u8;@$Eq9A4-bm zzXUMfW1>1W35vhCxnlCSK=X!XWKO+C7tQ^a_1D9tzQ*t{?ER7c{Su`tu9fxsWtPL$ z&u{+vUnKyVGx>WF6aqlZm1PIn?d7bT{1w@w^4|ptmq=Ouh+#n+$t58A_f3|ns47An z)7BQLzqaoSK_h@paO2EeSu(xgx}|fN+5T6MXo4(ZLkKD`DYyhaK^F6lN!M3bP7bQZ zj|80n+99-LH7v_CO)bkdO}m#+It>V%4FPPR4bKiw6A1CsCkW&8d}yvHeHrw+uc|BO zYi@pYXV}1V+#*6@tS{g7lo&7AaabFKAibEYz!gKY`gmOyrSNR=>iKh} zs+-z`i~sT6M!c^nK;FANnBcAW*U*nth-9_^v$FYa)HLiE(F`f?D3oq_%^E$ zo)N*gM6NQ{^h-|?{DKbET3i=O>1HEISyr)Q<+|!h$8I_6uQVYffKHx-@7BW__5g2C zFmvf+1n5$5Ge1z!9YA(?+ew$N3mI%g(lwz2>;z^8^$-9?W>`%L_fpBKxf>;~s744u z0d%Ki)x2j5uY2kPAiDe6Q;aRy>jYYCbO@P1*qVDL>cEUPQSR6Kd$>k7vr_I}yK4SB zlGjgTguDQd;?2yNKAbdX$_N(vi*t@^(`5}W+lY-?$7|}<#6aW_)*Pg}F4JS`q zZB^#l&ri3sEh(5XdXrpr3^c#Y;1rtj%Mhqa)8t zNs3F>q9%0FDeVoNcbv&V#!Ml>-06Usd2p)H+S1r)tL1r8w)Fq6z4`j5&)@H#J$rKJ zjjQK}{xy+Q0HYZI39MT^AG9@U)|{D$!|Ud+I%*)o&zYzwFB+t&DlNlAr3*Bu0U$%2 zEGWZU|Ni}Fc=Ytmx0kO!+`e`DWmjB;?Xd62QUXRZ00EE~W_D%8s_g*}G_2$#%CokW1rN=lQ8fZ5S6)>6sNC3eeCZHOk z9f}zO!c#aoS(!}P*;rNC*;x2_c{#aqbBYDN{QN1!%*ZIm!NDfR%FM*g%)-pY%EHXS z!otkL#>N87GmMNZEKH2Z_mTbj_2>WZKYu|(IRAhA{PpMe?|(o4{Qdj$&!4|ve*gOO z{@3rnZ@&NjduPqESucP5`1R-0mmlxHegFC3*N;CB&R;xp>%pDNRJ%88Bmn?cy5UW< Sxrv7W0000V6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..8885c99 --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #FF455486 + \ No newline at end of file diff --git a/assets/fonts/quicksand-v7-latin-regular.ttf b/assets/fonts/quicksand-v7-latin-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..91c1d599aae292d45a1bd50ff01efc2893e8e893 GIT binary patch literal 44224 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 B2D1PF literal 0 HcmV?d00001 diff --git a/assets/vikunja_ios.png b/assets/vikunja_ios.png new file mode 100644 index 0000000000000000000000000000000000000000..a5938bcbce7965414a80e6df44bdccd6978218f6 GIT binary patch literal 44859 zcmeFZ8AkZ#68QA7mkmQpEcX-v8WBnRmR z>7KJ5_WQo)A2=V6KWEDfYgSzMb?3UD9ipM8Ktp+k5&%G>q$sZm05SZL7?6{~e}dR} zpCIqtZYXJ!!$1Dy7BAp?3KvCvHvlAzkr#>ucN_iySln;vxobIFxqCfuwFF*XUIMmG z_HO16Tr35gU9A(Aublw^1C->iYkMayj`)P1o$;C3HD&kk(DBmU4B0=A#SxP;V7S@O zb8B96H;mxYFXwMDZ`oS>Q_TL{O8l3Jq36?TgSJ0aVJv=T64$B<3#*c2^`);xT=?Z0 znpbF%5OGVB@m9z?#mB@URVdNDToIA&H>6l28h0Jb=>+}VLwO;Uw<9b28o~=ZQ|qz? zn}43y(v!n|13)c0Q23FC_#9{#Za|9t>hu*dHKmX!X#AHq@p{}718|JS&D$)bX@ zVtoh7GCd-7qFP93qSoSN$}=KG-0aGvvXqH{(IYs3o@J;^^j@BgnZMr6%<7lV5)ZI; zq6ShDb-CsZ*1dM?Tqs4>mWbs#zc=i)gnJ{k&N)0&<2rI~u2yR5a{Hf>{iiKuc1Luz z3(BdrDZ!U_$1I2yK!fnW3*WhxMrxF#y>ffP^0WqPJv6mWrn@Hfswa?KPrcC4KHs#$ z-Yt>reZ8Z`h4a@-)P@4MNe;rPyS6patYa3rbDJFTQ)1nszu*+HtI<6{%f}aj!X}^&w+5@JXo${da(JXsqFjVcHO}ItlZIz^ZXma z#!By;cUnFT_;Lnn${0`n!tAKD*WAD7&OOHEc*ecwN2Pmfrq?oq))j(mEt~=GFS}ER ze`93R2W=#aWN2%A?-1tcj*J9rT!o8d02oFC@a4ze+^5m?o$ED+e-F>F2*e2}tOV?{ z`HnX+ZT|K$y<$umuAj2IV|d|kO;Aa?Om%KMXr^axLhjJ-5KowMK1F;j1&zCmsHwXP z!Lx>tVAFJrn&FrqkzK2DXB8q&AZNr*Zj8Cx`z(k-av-!;rv@wSRisq`2!$E4)&m{_0TK#veoH9*#pnxg68| zC_2u)76QqNw|Cv#30&*PFxt7i?NKv}m5_fA4o97X?!1xvQMV81FG@j+d6RY-pOv!z z`@&$MW3xNAam9K)?I}u0u>{ASOc3|4Gobv}(FQ@YA~D_cuwkVyT6JPCoiJlR&PWe7 z-XN#Ak55+J+f|qQl;CXOT=_0}(k*`rU!;!@oDQGU#I<@45&5acV3hVkwnx%8d&C0% zZP(@At1_=V3lznmRG9CdH2=QWdWpUJ0^Oq4W2^nm$t=enVt`fYQ`ar^n<4G7G}@?_ zsS?xNr8u09Ig(dyQSF%mSi37k0FZ_+{Mnl&Tka+N+fV6Dr^_O=)NwivTzgPSj1h6d zmy10tU_}^4*jrE0_Hb`>=LX>h(7p=Y_jF3>BkVm(>9&?V3a5OQIOlq!*ysBf1g}5k z*2Qxt@@*T+xDS_|12j)ge9uxw;k3^KfJ43QsMy<0@s%fRy^_l_mhOuaxa6K75f&$a zY7DLM6OR*kppzgTy09I%uVo--EM`mzGH4-zsd0{m7dQ7!ceoFC{6_hBZ3C*#vGAM< zRpTTpdM|F!7wjPh&)L5*`Qc~=zw;&Qk^&Sz`1tJ-H&DFN5+S>GRxcA(G;)m%k7zaOpHO zX7Ff_%54LD!-gDU^XHW7b|1d(*!Ra<`csyfvisxv-b&Dsah&aLUBt|8mNFnU8I%G7UzYmX_J-wr1h1b1 zMr07I3~X9>kMrR=-NJ>Hx(0Xd+i;4mB0lAwlXFSAgs~dG4L7-6@g7TnHA5!ywc6tm6usISZ!+XGOrbi>6B?kphuDx^uc#zNMoy%GFgMwxS*sPP>$J^=~U z7(iX}_fC^LMcQXRWx_$ssIoUD&_ysL9<21aQMW&o@;jJOZ6fUD%&wjIP*w{d9ZYox zikh-B^Ad8~=Tz0Rys}W>>1(JwC#(>XAu4&&e4uK2#W&h}k51mn0t;bbW)YZMPuV{v zCj^}V0sXpoZq6JPVJ-dBJF*#WBfZlxtj91`7zr8QnDul>=oUO&98!%zfeJN&SPulxydxz7j%#4N7OGfM?WI*y1wfb&Xwg#qxw;32M~xhgC# zXqR`T|HsvJ9bmzP44$kE3tTYuSA=d%#Q4s5QbIujgxvdyFY(ypK^y(LBVG;-ftgqV z5)cYe1W%5tQhXAle~XQi1Ns_1m6p1x>DPO4>en2g7=<3g5!5~_6J(qD3eFP7x9t)y z0B~MnmJKlZj~RQ-EkBV)j$a5r1w>BJ-`1`6yondMphFIDvoveeIA#6ljgG*7BcEQo zE>Pke&Oy1wLPgly4BA3f2v}=WJ#=y!K-7zuW|bf4euBnRm+-I3Qa_6qh1-GF9~-(R zshdI=CKEHsi51}Tn1zt)@>xuf*OPd$eNkEoT*S=@1B^K24}H4nL96*-joXtsVa-eA z=r(>ADnMUq77WF^vj`nV8*9VyZsECcvBTTb2`qd4>Cb)!U+a)CCKXzJ$-;v6{&?eD zHsNm!zM+s0#9`sFu6%%diV0d~%W6@~b6Za&kd15beaTW5GJ{SeVD0;Mf&dXXuK-6f zm=C%WrYQhU&%%+kK2vtB*3Z4C%ofp{41`W*a$8%{Uz{t|-Jyck@~!@$LCG$dtFdr;8-O>YXYtr%pc(IU6XK7t~PF@;}P> z1C~>&bxCBkw;dmRgjV?enB_w-R_Z@JL1*jg{{s?;o&p;E7maUf4rxdHdwhE=sh>_w zWg%QsAgh0=$=%U;4-maVmepY8U$`W<2GJzFT{9|dj22p*1>WBi=teWhmIoZ+s^o0Q zs$(;do``7@CjBLh0`wJTZ)tJLhu^X}Cdip^kDx&S=Z1n7PRndW8>+@!(TJWuivsU| zG2mKML+KWttkkw3+v0)SBEKszGn*2)#a8s?7LWGp+d~KsE`TqC3Zp>q!fjpJom*jT!e@4~HV<}5)c!R*}% zzLa^%d14L4Pb{LDsS%b$sQb_I^F(<+KK%@Fj1aVk#AAbJ8~W6P4$dKKUPjg=?uktI z-A*S{iMjIGfFBJoc1A>BD$A>Ptwwy;ZzIF-$HU|f3(I+8+>l|jaAOeF&49%x+i-EP zcN=06Fj#A;Nr&$!4Z3UBg97ql=WzXA+h3CgE6kH1aZ?51mO8V8HkzJWK3p-)U`CV6 z7ihSs#)Nw#hlb_`SBq!?2cle%@J$ec0>}!Ct2-F}L$tlz<(+2+Wi!hHWwY_uoMUXT z?!#_iYS;{B9LKc8Ol zpY#k1Kqow*gFIQifsD%vJB)V_{Q7q` zD1q^r{C68$IU91#tKXc-^_fxTxB1FAZ3prmAQQ_5c8Jf z9hpwmcWNktmb($FMcBAA=&3ITYqE zUrTotd(DVDOI&vb5qL4I@$H6c-GKJO;+({hTUF+-5OV{mgO>;QTJBpqU;PqP_3P6y z2X&#KQ>nc0g<6mkSuKr>(EN7saxESNS^NBp4;r!mUAi&fVkg+zVAR!nw!w;-5BK{V zL|UMFrjRI0xiL}vCV14ywM2?rkeQcaDrV)qx&$gWv=xN?b7drW#d#MDzX z*F!7l>x(kVhiiuZ9Dz5QEEb1#&qk)7E;n*OEBYL9%2QRw;^%MDIaMeSz`y$%cC}(g{yRN_EXh zp>J{hCIu>GB7R@>&|Io;W6*I6D0iU-*q4yr^=GP=9$o*kBB^n>)3qQwwLQe|^V&C5 zY=pTVpu3bc$*^PlGHeQ;Qm$sTcWV-#GUjN2aSOt-VXV)G)GFEx{~c5M4}pub@yX#H zCtPa!G7)8zc$Wd{7yjXQF&c-n_G<~RU8oG6kgY)3gwsOET!`pKs}yz z^$T=Tl^ZhAd+{ZHSqSpOBqA7)Cgb;4_G+WwRI~5rT`V82zH8p=n(K$g3PMthk&b#2 zOnSIBGOxJ7GnLY9uN$_>8&fEf!Q)!6p=MV$8=T9vSXZWmE%ioE#`4fNlx0}oOdn`9HWaP4cHBHDI=J)H-R>Y5%!egJ0$z=h5-7#X;Y9EVBn41mk zAFiqnX$2Wk*N-6vV8MIm2wLXO$o6hCQ~u9Nl@vG@fZaH83OwyZxm-W|bC)E^(`La~ zy)e8dVJoZLoEj^RY?vqO;_VW*eW@Nx_crHJZ8^`3Z2J;{{4R%Jy}LmMdET{r61O?drl-vOOgW200iv*DJ0Lm*IY>;!uPLr_3t^QZ4NDIq$mh!B@;h(pi$)o#u_bxAN zyrKmd-;gtC=CAymdBxf0ab!Z0vhVp>FP+De0bhiY{Tl2%HiWzc)tIiR=~ix!(@ZxE zJDj;Dm;oEWmhdU_oFXeH8hgC=&%Ds+p|1;Jt8p9POrYPb7aR5%yI7HLUKuK8FWCA# za4HI~cAE?v376FTX(oHOJn5+<(O8j(w4<0>QmDm}GTU$+|C$U))kVlfvpo`(d|fRt zI}h5GzXd~TznE4|!zD9 zwp<f!&?%>Z znkx@EUg-8*6G?Ah)8w?jlu492@E&p*W|XNYTm)km1CHvkngUeq^CJ@gR{c1U2-E0q zz2lHd%;$?H>G{)hE**!a%_}A5Rnq&uXWA@?8R}C%QFHOGhE7m+Zw*V9GEHAFB+yO+ zpm-Ttj4$85G7^JFD>;FSiY2CGJ}cO}4y6-wIclxa$9k>9NnAZ8g5x_&Ku-g>N}!W3&{R?*t8bP0 zlFAIM)f9@#CjPXdK)50TZ-~UwNc_%Rn@Mq6-{OGY7NwL`2VSBA1zs3Mgn=KM8-&Nx z13hn_eca!22(vH-vkFCWQ)p}}?QmJIJB0-OhldAx4%X}GiSKGoBk@=crw#f2#RAFe zslQZ2iBQ|i1B^|Tppy(H$;iKmrNOF3t9xJeg*0{os01 z=FiUl8jtPUk`ybKiNa;7c~JE}rCmj34)H?9zdjv!8n*Rhn~jJFUBeapgdTG;!hOk> z{@*EFj&0&K248EPkFot*{E=z-6yWeYRMPdWks_sN%gUF%VrsV}3Vp@0WJ66mQ=ue{ zxUQFjSSioR@_4(X1eyS2L=b1-Hm|PqjWo#=%=IqJ%X?dI+C7f7qRGwr3B9DNQYC5U z&uFXu{$(QC}=*a?E%fw$lM2yWup)F z%Y%gizc)duDFhw!G2E-vZNFqrIR9gfkYGWrgO!^Uz&(n|U;)DZ>xv7Dwn~3%mK_I$ zvNX9l27N)NAlz4Y$wJnqt1(RTbg9tLD4iJ|bpV|f#mSNeNMSyEtCVA zUdawNp1|{zxSG0+6F-W#R!b20`r)Diz$tRsf>euIB5Z_|@~bpb1_==|fPD;g1(z{G zk@$N!K0&AR%09`T4Y%v?AU07g#6Xvc;X`o=@|Lx1^awz{ZYTW?K#Rl=|f=BX|;Xg5}+<&l9y3_P}vlD||>a!Mp#+~3*pa*`-18WTAXp-Op_L}=#fP9AfoulF4mj`_BO8>)H*mnwxg$TAg}FPfReA7~YSJ^3-Mm#iX^@2(M{+ovORBSLu zehj0{tk={rqGDIfDnnl#+|x>$TFp|=HbzXXrqUVotXIV5ieD@n7!p7EzcYJkeQPIN zT9~Wz$@46N0qYYhiwuj(r>`DAC4tf0slhyA*1q1!O0~=OD6AZG1Qvr^d0KEEmsbNy zXWC(~ao1pJlA45w^sa|RqdNr?R~{7E!M&^Hg;&G!=9;=R`q0NFuCat4$>Ch?`Yjuo z<=5Y#M1q<#ENW_yWwbzP&G2<+pMeB4`}Nn514n0kRavUghvv3zks1rfG91SeT=wLt zoIY(XQh?L;&|RzqLXVhiVSa8l5LnDzz%Uw_wHm7mpfi0hb}ccH1vFhl(~m~wE@Z*I z$HH6>Qw(Fn*PN5zo&A!F3H{w!P%%|L#_FD1i5Hl7&&iG=U$?sf>wTOkL`Zk;?GqB` zPMioihr_x@oWR}D9P>$29j4QYHKu@4P(&kpEfqV5!dlxZ1-?*^`(~jJlO|G~2sEf; z8`a+zB1sBkBu>ly$qzsT4hqQ1QLS;8AYV>kr3R0&c9%YLF*7svb`{N?5TIPBthxNO zmqf^jn>)tshCbD?8^jdDT1K3}bxJgJfGWC$Qcq~WlG>$QGG~zgKvanhP|$*JQt|io zHTkcnQQ;iULjvn7F*p9!H&L6c=$D991~vq;_hJ#Lydct-7#lIUpT-aC%}>it9|tAa zivwj*FVSPW13h1H6VU}i>!W-IMBP`mbnfDBNoa96M3;gVX|_%!|Y<^p{cMG z5snu;vUz>+BT;IvsPVT?kLjg>-Tyl{qVs4)Y<_L1De)-iZ4)g(H0aJ9Fy=KFB1?J7 z3Sh|q=t20Tc><05A$J&K;ZBP9^^6Et;(BLMl^7SIzp58hyN5}@fIPB#pDGsy=ottb zf1_b>0Ej)+)2t2kRiXnos$XYZ(d|3m6fRQ@_9R9h!uyywu2p@DA6+PHFHM zL+&91W=WB8S9~DJ#9uEZi6_y*O31S`&FepJwA;|wR?z%(9qH`ffcs-c_NN6)-gkah zzpXjE$7@Lh+U%g=e9N43G4-%6In3$u5RKer3V&z>rV+H?eQHACKH5WmtSUt*=%MA$ zv*-e=3L?w~7wUc+a+2mom!?0Xfs{lzjL^imnDF>K&ky!!tOPRfPNtDinb#R2P^@rlB4Nbs;2u=)HW^?R z&*AbspVI<>6p-5F@5#?>!eUe(%p);G%lppU(*LJxBF|FD7AxAz|32Tz_M8;zX@ ziW5CSO&inzR$3?{CocTjqV+d5DYkVWoKR>9PX{>B4 zngTP-LwMybfR#?63s6P$4bf$-;Fo`cQVn0FMz+%h)LIJwgi*4QO9aizb^^qfk1uN` zg`@sHqH)}}ZlbUT(twfpR~QOL=TDtozqx?$f3&!YXB!9WM9eA(hcorax9?<^u4xUT zFnPoG@85V1v#r^SG|2?IYwCg0GS*{DMmq|>re|Vqnw|ueFerv}2}XlR>$&|?%zNjT zS*jlaX6=)tZ@^AlFcc*Nw5r#j)>Fe|E}T2l>;MI`HrwYAM2hATSH^* zM>%w-E$i-Ba&iGBR?0z77j7@*eKsM&g6W$aTFB2SWI+|hjGRQ|Y=5h=$si)EH5wyx z<{f!}jqOusp#}zX6o79i%z}KZm1U5CIzG3^*&z)e1o9SZA4!71mxIq9iRwu>3Iib# z|a0Ni2JiM9IjOA2&D^&_1INWod4m<@1Kg7as9_e&HGoH+K^%n7Km zY(i^x2ra^JqlNz7(50lT3qXx{hQKxVCu9JD!U<7->V_*D5fb#rs@3f@^83TvfG28~ zbQIFw&x5PJ2M(MI|D%S%3-M5GI>_+7KSogW#2+iKP%Bm!+UaMS?L1lPJFg1m*u;JN z6p}aAU+af05%f$A;%`MVMRNM;N@0y{;ELVoVS#RufT=}D%B9t zknh@L^_XkTTSH4xLA1Qd^p+ZR^!J)?!5DOOC*8Fvg^teF-C~LmMjfNgGp)_dq{BDa zdPs0mF<1(VZ!0?;6aT5-Fy1uR-YHOjooZ9!NY8(wgX#1<(nc`lTbaz4P||AwIztHL zcMBF@Bp-3e`KZb2CZH9eBtYB)JJR}8|F}(Qwt)&GKEKSRx-0!2q9!>uuKs$FCoh~S zps{x~(>rN?;S5KPjh&f1%;_p587X2qD&UP9jqV-eLz9MekLBSAwWQ>pxPeZ zJycR6$Uo~+0iJiQt(bm0W!F(NCp$9-J#+K#XL6!dV`7!^&Fx|D z1iUisKdcz2;7XFL`p{!N?O|r6rtl`Ix9eoFl<+-*<9f_b@?{)lHT8D1aBjt|b+Z(3WQ&S_uSg6&`#b*S>g^#5uH!b*iwxjZ6SALN72kp+hDhZQ=Z$ay-3-InrUW2X3!Tn1H(mC>I zsLc4l{+06UD50^=hljJ76MJ9Zgk8+is<+v%o8jg+msv6sogtV81YEqbt^$q?i1$U( zfH)RuA^JX5y)?iuX9wJ|S!$zJXC26=JX+E#p=Ne(jZxaOsYyq?ph zyyT+)Q{xse>6d#^^`=HTC4lIKAeQYojHC_&8x5Wl0WErR#=VU$O64mpT__`A@%{0HaylvVe(oyqi#ed~9xsVXGI3y=-xZ$ygXrIkbl?x&ds;EL(o#W?^tl!6CKxkErJVa zLCcvJL*RWSyS>=%S?9Zr(H>elH49xs$OWlxac@_#oVO}IaL-ca-{dPPNs<1Z_=`h? z%pGUCxhU2yP#NNNx&CIkQ#cIzGf_AzKkAX#8I(7bo`6OvZRX;vl=|H9Jjg-CB z!@b|nS71dkd(#WQmsWe!#^gTRyPzJ659kSw<*6>ioKh&rZOn(AaTr|2Im83c?O@_n z?k2q<>8#01xLD%R^HlceYq`-P^-fNmk6MFTyUCVYrltvE!#=H5GrF5dK6}h39Z#Fh zaj>e0IHiJP27Nq-i?+ z&GK}=kncST+8T}sJ1fW9GzdC*5u5y#AJi0%7%dV3l)H0(n8#qLc~an(7Tv;1-Qjyz z$p&{N-kTaH1wPScuN;n*A}}E3&qnHwKce%K5K#8#@Y?Frm;7|Hl@aqwYNa{v%~zkk z&sEHr9+QOZLJ|rQCGK7M7_5!V>VK04?-yP6*dcj{k1b-d^|ZkBhhXKOKlvX*8~x@4 zJCNVp2zvN2P1htL#KI9)6D#GS&{!q|$D1fz)M$)BOIwowBfMk7fY% zQ4W*~FLaH*)?7Q}xT(sb^)C0TGMjvGgBEvIvNgf%^_-EApq_W6Alk9z^{hW1&f)VS zvC*wBloIb32x{%E|AiE!xWLSHEpD*!Vc?}4P_!q*Y2|YU;+Swx-6Hn)n0i6|r4&h| z&Pg9US<6F&B{qODOoj*f{V*782i$Qd!^+PPQnC&?u#f+nr%|2^%ku{4iO&#F8*O)N z$Z%6vi>P4fbIH55cD?3%S^*V!pfsH$4CFI_Y-6c^$X76kYx?72#=JVtyhSfdVmm=oBx6W zh}izS?Yn4{JVyXGB7X>g^0TU7H80!rC4`Wi3c{mu#gz(+P6;$t&o>Y;M&nRs75T6z zVm{*v4MJzXjQ^x)KLMq9Tpcny4?b%#0==@lYw(-&0~N4FBXF{}CkTdt8OJq%E5bze zN_{;A3r+pMH2VwTB?g~_J_>gd%B}4ZQXb?$mi*XnShx}wFZeq;)8BE}{S+V#O;Xk* zx4R`gF}V>(B10JO>g*@MeLjx9Gkrz2WO`13$sF?#=^QG|VZ?9L7~`wA)fa;%3h4}?KO%Y& zY&jG%i~j6jsP>U@uQF&qkAo+bz=6GkC=}yK5s+blC)S9KeP_Au2{2MhvuKy#<_ODY zwafTx|NLiRN~pc_gAAh;t;&W{oTUcRFrDq&${pO?gfM# zcaKF0BMweca9Ks=)|xyu5SU_Y^#Wg_{&w~s4C0S)kb56*AlZjX8~A+EyCylQgFmmEwdxAjWXR2H2Ng5T+ zinI3YQvP=es>M(4L7sCRqp(PhvkydXW%4!Lbt*ZYc>G;(=n~tleS&Gw#C}=<1-N^h zUA5g)VC#4jfX`q_RW;F%|t?h6;w5&ARr5ixcne z6b-vP=@$&zgco~6xG#tq0msgwM?T!aO2i z$vKFAJ|56ZARBSpYkmASz;OZvmIxr?oGI%Y|2Ln>l8>f>{O)bu=0$elbi9k{+&EZ^ zxcA%X>a+KWW?k@d+vVedjaawFZZz&sLmEc?Lbu zl!84pF{?~vxt;J!2TariA|YmEe7CJu1E6k2HNNgMtMOt5eLsq{6HPewikvFWx6lYW z$awgg;Qi+_JNt-0T!Celh+lw8R4)l4(2@<$uyH`46d1~`chhh@tV=6lu-G4P=E zj0hm2ZdRj>wGZjg?#~r0X3pCblHkJM_2tnmh16I|H|qr7)K`uebW{)eSGp2h#{OT0 zBQlI#+TH^HMH)~t&<>z+LV962-IX+HxlvFGxvR3Hfv~&S!^ugqWE0ejBCBi+cJ8%>1)Ogfpp#dN9@SYv1IOZeFlP8|#tCcLJbhJ{~>4V1>qAeFGSOT{0h{ z0(&}%2A9g;Yz1WNQHpK&|LdfvSsgEghsALs)fuG*^<=H$-jD$N7b!68dP^+?YEO4& z$%Dwn8)@12w*Fr?@}>y;&E+?Y>He#IU;M9u`$uiT)YU?xCf(S?m;Q8sJi&74%;1+> z(G%|5eqqI~M{=B(tfx0NFPV@#$^b=5WNRKfFVf5bgBNP@_NT-{vTy@W*@Et0Z4s7v zyIyO(h53O;w~r=y37C%cn}%?)$4DAcV`W2&W1Bh)TE^$(aKGK2H`~{;)E7BUHGH!t znCj&&{e7dxeIpEU2; ze1a)0g1{MBZggYGOpv$emP|T17;gSN{P!*NOQ46ZLFb|Gp-#{Uck~UJ{gwSkM;je= zY{*LT$Vy9o9d+#c$qzVC&`bRE&<(l@JE7mQvR5o#hTfmY@y})M>LvnyXPQdNQ}`%f z2)sCnctyYYs)8T2*-MpaCb~M1?@Mj4Eg$^!V4Y-Cc74f3<2ZUz+LYYmP;PfU2q~#5 zzF(zPMPVtE661ObBZ~)xj9)#}RW4g-b}rvH;g-1ee%MCrX*_hni$-cwj?(A#_oeZE zI)c^Sd=aH6jM6ORk`LZztM|`#$&D|Rot|zy`Tvp~K>hqtPfVRXioE~Bms;!fyb1~#*BgJ@-dbP$x&GvGJ z9l%u8?*3MOxeM=MLJ?2qvrgqv<2@^%>$fFRB52C0TYF}v6%Ck;=tjL>89jgV0~9^d zl?LG(KOzNxRhky)qAI_C=TTFAZbSnt`lDY@`1YH_7BkpE33UM|1#Q#Gz4VZ)dVUVK ztf7CCRs6Z{GYr7)O+H`N{rH>Uat|mv=OBte`zweJi?6SschueP5|k_#PDjBMXeC ze>^d6y>=}|J!fG4M_G!9`vmvVvwuoa;!e?gCiy7L9eD35yOUgn?Dg&VNiL8m0n00d z9c%R;Wu}28mGk&wH_51S2i*s*JY~KBvoN~dF0I22+v?$Xh!jrw;JKXNjSj-B4WFN6 z=DAbZ{idGz`1Tn{je_PdWBYjs`qS)d+MRyTH`D{@eR0YqL&+~&wyMwX8 zUd#7<7HDZ!hV$T8n)`n-Z;^rE1K8r7dn2tp#{h+ygGx9?`9{t^A(y!hXBc)NTRUQ^ zvT%t4wgJx1hO_(Jhs}Wia{}_(B?NYQmdjP+VNV-)BD`Q3~2-n2S}gTMCnUp z8Es@4c54C(Fu`j~1$<@4|F%Ac!%EiXn2a9+r($?{-I6Lb5wVa4TpZg?w7q!u<2%@q ziZmeSarE#@I13}|2gCI_W&8PQPvVT0c)fz-0EOo^n>6gg25A^bJXBgLVXUl0Gc7t&%dfo|9W zZV5}-Ndm8T5G@jg5d*LU_H%3wv#FzD5C z5!s98drbkmp=kvOMW4yC2PtrWu)_Y>9LynA`r@sB*J(lLvzjU&JP1Gb`5*Nf z=irkJP=7&2W3A!rS)%_wpNmeAXnyETK@4(7V88#xU%?1SG7~+5IF-Rdk7k&Q!EXHa zeKH&)67ea){1(9>{Dz@70fd_&1~7!q1$G3{WBw-`D)Bk#C7G>BADa&#LH-^RVP96j z$DMFrkV|tZBPgprp4BO_>B;hFPJAS%zSDKj2lAeQjV=#CQ82AAu)R$NPy6?~p)YZu zLejI7Ypm-`bqC6towm(}@o&qo-qeLAh~fPItX2%Ge{&~3pME6h{O=vQpl1Hf&XT2% za<(}ieAYpgxCv;!M1%~R$+DE|&v+|m7wk_F&~-I@b){!--U6S^at*|d(O}~#GD=%v zcP!dH(Cuzu)#%R-L3uqIU=+5^0Bmm|vEZk4>M-S^`t8YH>#BXWf>U?JfD00^{`Xru ze-~xZI$2(lT1bogI&kIgz=YBjQ z|GTp336dKB-441YZk-DsNWs0C$}pHEre5-=Bn_9OMPbkHw*AZx9CdYd4Ze8(6C4oZ z=EH#sSF83#H8M67TIxs73A;S2x944zHa-j!5f%7X#|4PaBDYj?^6=bRHU#yo)SlV- znI(Vy(~$%ea|FC7!@V1i6vC+#Qh*cOv!YddK2<_z?{Wbbb6S|3WiS?)z?+?(e=0FJ zd-CeO!Jt1yC-yev!qIql24L1{=iy~R0V2MM83XX+x@IY6P{j!Z<%X=!o%nbb~)P1Zv zqVMf6Y3<<}(~Rb7@vLGc_6|ukj_H>rJQyyrl=RUr-xlD@{(!XBz@xA^TdRE?*LmtlUS845N2B2p-a=7X}OsfA5H zWv|bNSNBXThNzyEmQ5B3ijcl>oQf}u$|2&ue1>X1n#+y8`V|p#cE01Q8yw7v)j>c} zgk2RhW-!sQNf@L1>Rs1dd9^ghS|C4c`cJtVP#%1+zN%N0n8+s~2-k7$KUK0|PjDPk zb#y_E?V0$;ZPS4{#KJ_vTv4-@qp^&oGnz7*U)uET+DyT3s)JY8v14AGb$RvM8TF>S zevbr6`kA{e^&|N7qxtpAETnmZoTPb82bU5jzvz}O@4sHY80fae!K`9!&E#R_*@fVD zoT!!LJwolSqGt-X)FpllH|ZG z_zpwz*fTvRrF=azY8efPW~A}b4hT3@DH_1yw7To((}7IZ@H(wI=E5gpoGt!P7NX{k z_zQixoxgX*4DZrK-W()J5`ec5hT`7|xJT}jJNht^MFNM7XNcn~9b}W)f6@X#!4&qd|LSBwJAW4iJa>o!sp{GS=?lzQam@m3e-nTO`gvo!RhzjCG|%u z$|0<|4f}uR;iEpLM~}YV%R%hT@yFuG=j3STB{>J_u2bmxt8nZS#9?PKKwE#kvzG=$ z|J(?=AKv?^+Vp?E^NRuGIxU$V=|V^UB=;A*Up{v6S+C#FKo3fEp4=b8{6Zs73W*73 z5f`tLP6Tr1%QEX;J$eMXpTpyjB4xJL=BcyrCM~N4Yo;Gjx>ep(zj7Hv3`kEyOG|y+ z8zpux&;2l*X~4`wascnle;YaTFW4Pd4_s840LX$DX%c3VyZOoU`*~cFKkc>~$ZpVk zJMOmmkR)Y2u8*-CC`zo(JqTYsYaR0_@O2nK=b9Iy3>t@6oLlIYf06KY4LpJ%=X6hn1^Q#;WNfVt;o0%2o2Wibr%Z9`gt*t?^6G!OI`bT=Q_D#d#?q{k#SP!qR@)c2ouFjCQgIgN0!j7`yEVSO#-$K zdbaL;uv9uE0W-Sccq0wJqYu@46`j*WJ9&F&f;tTcm=r_07@U6pPsI1?98M28^weqJ zqr+F~LosU4J^3)RqTi`bJ;nx_t1VTe&!miQvlA01S?Q{89y&Sc1L~YGg!2-?0Nt2z zV^k-zHOfX$I{O;3{o2~IkUhJ3T>5Hi@R+>1P<<**F0D$hMXPNaHF%tk)|I7S|OM`(Pc<+e*J`h|WJ3@Eq}pdxJu3gyr$8zyU5|I^0X=czQNM9mjR zEH!#k@k)?h^??gS2P~D(K%U$1H`%u;_$8UrH#!S6!@td^EN6I&puedMoJd7{^`bBc zw|K}3G#^8K>4r%N_TuYa=Eo%hEBcr@Z+|@-o*6XGaPXhiRUWV7L+g4VdwxUag z4S^y<7|d9Xjki1*_;!CFZ1}H-Yw)iOPTHd4d-HAz63qhCm-25*oBlnJ(|isOAK&$z z7!w(b!U+vLdjKIgn9|=}S|znH&t-5jb-FlWYk;Z4E@Uey!p9Ejn1b&TQD7Iiy zXzc?VxEz>k96LOy5Z|l@@)Mgg7S*&&0`6VUw#`3%=~A|^N3X}@=%q$Dht}Ds{zTJ? zqK^7Dbi^cMPL7EeIVTIeUhWR{G68Wv7=XN`rFea1)WUlFI_2P|-gfz`3$8DF7s~gC z!V)!A)e3o#NUeg|{{DlRVDG&*zdwb!zUKQ65lQ&m(p1`0I;WfS`W5eojqX0`kH#Bl zb{c4p`Mq7To@pt1m0px+#B|G`X#Lc{?n`t5S6#*Bx>814U0f0?j168m1Yqot-qB<1 zM856@{b+;{@Ex6x+Bz_ifIis$Oxm@F<%x-l{`&W7hrOh0rY3d6$llql4Yg1XwyX_p zu3C}kMJJAbSRA*xx_}DSR`^nZ#`+!?W(}gYRAV1hkVrD+(@>*HOtc>L-y17s^k(B; zy;n(`?~isKC~{CJGDe6T88dZS_sC!t*{UVCY4k~AN-3J%q~OP%Hy`!SKaeqm)W{a) z(P#Kg^&=Fjh%J)9xj~C7|2a2G@SjtcJ6BFIA3|m$C7wBdn=UDWg5jDB$)iigz9nBh z?^QB5=z0qLCHQ0M5Xv1lz|o>W=Y^JtsnZq}t({oUF648E9uj~Zw$p*O1?&6?=55CT z&~#|84W1Zmz+SkV@a&M&SSjRyXQ3K_y(_{hOwf%Z43#uT+5|TqxW9wnJ|2>I1vWu} zfDcz-!}uNKJB+X`#E3f%$??sGi2)`L303bnmhiO*8I`Ccz96lh0J^|Sox490S zs-Dm>8qmk7RK@+2UP@8n<@?K*F@NZ9?VjVgCx6S9^8Cw}-)emC7Wnqs zSBUdnro1DV_Uwcr-Q2T{q6CK(>CMFT{R=NpnpRfU)6z4oGl#yrloEdJi8B`?M>jZ3F!hXFBz;Ei7 zqTjUO&|mBD39M$0wDH; zAD}?y4cMIY>UbXb8TO;7_-AqqSV;pwL&U&P?=uC^I772}rHA2v)+e=x;M~b9OokGv zevSs%Hk)+#$vZ_NxG}o-$k+6U;D32?|8L$bfIS3j#9I@!_tn)kgN;nTS}ST z21WjvWu6W_tE(Sw-&W}T{pUkd|osyKEznm3O79{lJ>*O=OW&i$am>jo>?%TXJr;+BLZu;Q6TkViRdL21uRP3 zY4p8e;DNG?v|qAOf7?Rh6t8J#sVRZ3X8Fg&CI^0}XlumUHBJlt%&=dZ+a`Ao%@`+aA-SSsf$S)SFf8gPe)(|wu*YK{#;LP$R}xjSnePc%F3ISir-*L8yE(7Oj!wFw_@Q>#3y_d}~EbDzdBB^svvw ziviqmY(KcQH(!2~lPfVRk{qZeM`+_{-rD;kavOkE8D4>~w(?z?;#@4xN%rzF$3?qJ06c7Bcb z0OjG9dK9Y;5mek&c6k2U23pW-x%~K6<;)|6P~*C)Y<2wMN(xJr>_Ll%@rZlNn<%ve zL;G>2y2Er6y{geaoAxv?RPv^QCIN5nWVRDj>T*_BZl|eWveK%Y-*2^xMTG?0BqR0z zF!dHtQGMV0@EuA-K|xx=j|$Q%DJ2+mcZZUa(j_oppriuQjdZs(h=78CA+SxGzlWJO+Y)4+*XfE@z+!ZrqVL?lB=PrEt%qk~%OqB%ep#)*FK#ieM?KX?Nz_=uCzG)Gzg9W7KF#-Spi}RN}o%o!QTuT#|)0* zzFtl*dV^tpy*MbxQd)Go@$n_>d=zFqk5Bg|6W?0Rmd`e&<5ZKC@o~8gaA-}hU=6)X z+*Z82#P_pM2ptN-`W%DSlV67(UC*4SHtybPInbXzK&P+Fv$jabS<$?RILVXhSD^~! zpK(PKE;nmQVKzm83n=d`L$OgcoDM~y)$oT>Nx~kp!Dh3yj@V!g$f^@I26(D6gSeco zu2-w{LXHw)*`p}bDoUzeMy|zrOYQJc=KIp-KUEFKZ|rGEsSoD+TvDPh&dWOb1blbp zHEd{F*_}Npb#tHJH~WFc`i@YBtd_N&Bu0w<6(TmX!OW`_SQy#drTlOXHe4#$ZpOwh z>v4Rm6Vn=Vo+_@tKuhQ0bdzaJt<@`rLTYa=xZiK9abWP!31isK*5-dnvMUne__pCS zqqSF`mx}TAKe0FCvi+*4W$`iqJG`}8)6HV?6TEI_jJ5DNrD|)w4W%^1@+I#n)Y7#b zShe~2B%r?3Xr$h(@qjG##TOTu)RTj%nXIzFq_+Izv4k&)%`W+MlLAK#hY2V{4k%n9 zZ@A>`o-QFzZrE-ldeoeisuwzIn?S_E)s-{j*yQY6aT9#wZ!b&nH2vJ(g9(>3U{n zdFlRm_E8iazPX^F;(-+41m;)#hi6vREU4aWT5iuOdp8Xm9UD-I7ZJQrpU+W6o}i$F z=C+R-DfVx2h8{1 zaa?P`^hcO++LE(8*}ibop>lFpd`ByJxyT^Nwk+Y&nok6!fdO`gdJo580wMLBPc zm;TzNja$cz2f^XcnSKe0Xg~?&zJ0!+a8^0D+p_bqs0JVK+S#M_me%34oSy%tmJcib zG-LQ@pJyP4WJr|UZMe*;&LAQ?az zIx~3SxXovaXLWcm6&5*7wX1K1JzX0fgE=QSpJ+gwdL^oR51Z_)E@+6k+WAFjL2_N7A`uMD`omqG=$|vMk)ReT~Dk$84=I4 zdxub{>~%ma27(TqX@+o~vyY-U<9lh``^izpnJ+I*wJN{+q@^aRu;qU!>cgDews3#)!2Ok=YFW;wH603NiB}KI~D*U$I&XqrA8hW0Nt7 z?c7Gz1k;~8TLC8qKC>xN-SK6oDTYQ#yJDW0D{AqgDvnQpQT?L;-kN>!a*gU8Kf7=JVe<*I*yhTO17Bml zcnc9E6=1hOrVoGx)g>`fkrDl!y>WHk>yR+&n@dVlWGcT;v{Mr<%u037&L-tRHWinv zb>KVIK%P7@i82d%ydCT=RuaPM$GkU_a1x!5it zB9@lvOKep)nylN{zt>y2w^3%IwUd`EJ{j2R@A18xZvyQS7ROU2&FBs6&*x6reB{0L z%hNA9YJ8k~^(a7aJ8bvNX=48FRbj^`%t)$G*)OmgG=<%uu0+?lO2r0&fvcaC?)!e2 z@i<_xQjL*|j57K3k|LqD+d|msmtm%0zBRaaaMvgHL7z$lX3)!7Tf)ino;QHX()v>Y zKZ!066UV6^Cym-!8UZuVHVKTzG*JQs8JZxb1!mH`#T$T0Rvn~C$669oZI}R9CP$f8 zz{CF`IWO*6``pAUs{7T$|FB1`Ejid+)dKZGN%1Wc8}!1J$jSM;$sCX(JFOKcea=Y3 z=Sp>V$x^rHhrw=a-_n8i57?fKTJ}c^4HI@^W7Njy`G|N3NELkltlAtNc>sw;pi4&- z$|P$azB}lzpSRkte;y0urWs3 zW@dVskB=KSdj?kDzoZynL_Pd(=21;4Fe3m}v-5XRCLRW+7q)aJ5W~4^_9)|)$+B}k zf$_>WzW^Nnx7xy0g{s+-7f&{vT0KF+v?3yfZ2^YHoxl;eu>v!XI3?Ryb{ogn8!%BjQ3VgBCP<>L@a zs=RkrYGVY29y7zKU%6GSdr#xZL9&=k9qvyEjBoK+9EfEsIVcNd%!RX_%C3DxChg zg)g&63jfT+8&@w|_lWyz`?<}sM(2|VC;W1AQlohVdv(pq+CbohI}iQX(COL-?!1&2 z!7UzGx+3fL)@JaWsGgbUyMBocZ7jC*WOR5kZ+CV#Qjf-z!!(u?q%^@>y3h-5d4&4i zbo^fT-mn?g^xb3Qt$XMa-`RR+JvXiFRej>HZVSwU9N)+-Dc8(Zj(jTEfj95>Isbg4 zV&o1&1$6LXi&B~Rj`skyk+}F~!VQn9yK+g9zm-6fXpZL0W`!WG<#hqo;a@f>)?y^; z0B9adVR3!A78yMiASW-I+o6YMp8`$JpnB>+NZNMe$o*nloy5I|bkN)bWnlVe!}Pis zgJc~Ny2fY)E_H@OQlrRuII7J@XuuIYDQpX!Ko_Lh%E`g7XIBV=cpai?gQKKi7y|Et zB98j`yWmomGu(1W24f=s!j9wL4W+&C2*;qv@QGxO{6!tXoDo<8q#X=i9QOZgnHC%u zNbWDgGyH=kco0SSpZ}Kn1Pqr!K!CWfNw`hYVuaY{1)&qfb>>X}f6GA7B8cWFVHx#W zpWQJI(keYz+jzl-zzjA5e=Z_LUMYjNwkz-vuKqYkT{%cyyIozmT|VV0q{A7X z{TvA8l$vWc1@TzVYxKI;nDjU_ z^VF+NgVaaVrRQc{Pn!_`cFdjJmlz3Y$EK=q#k1)03Gs+03o_^NFo|<__jAQFM&C3D zdjD{cMS%_BfcF zwLdup2mk)Os=r-OVL9PW1bw>zV;s=u(=QbQJ>dsj0%Ll6!Y^uir|-&K7tII47<}`c z8o^ON2&>^g;NoX^WBFy$SiERNKEBd|@b3s2P6xJIPnqv{hoi-M!ri$ACb&^n9y^-7xg;M|E^!-*JQ&2BUuQzPT!qag3f4`d zQf@0ZQJF64XxG#&&E5mEen)gB<#ACL2&9s-bO9SMZHFW9xbNyv z+f}fzg`c(Y2X%5*_dI1Sny*q9*lSfkspOF*%pkP@3M>(<)(O4fP5oYwcFr%~_1DOI z&6gX+>(1)d)q3@NZ>e~PsYyGPyMwy#03*~>cO%@cxhRgv2(2&8UTD*0I}vf)H6uL(3^UC~1B>ev!xK0pEh(wpckrY3?4LyAVsLo_=kRn9#?tUD-X zH=`2^gQi_g#(-3rVf*Ecd2-uB8-dcP3=HG9@Xw9OAdO5NwA~{4W#II8+b-LJbJ3yO z{o+5}0AV^5?q(7}?w~6yWGQyOtKGwu5j~w@Y(3&mt@5_?AZ=aW&oQGo`&Vc&M)c%2+907w0Db=wgb02Dh$fZ+t>yb^(*2?~ zc%!ShB9zQ4XHNr$_!r$$L;0}|cJc-76vKDTkrp-|*Jp2{tZp9}j-Un%FGEc);Y604 zTtJF$(Z)s=Z0M;N$;HYlPPTKkNs&QhZYJ?yHVHVEE!)3TZYI*x`#nc!tkuBPWLU#o zpHJx15BaE7`uvQvmM2zKwX5{ddl7hN!gucV_%rl$c`yS>#-X1RBALNq{$eSAv%XLa)1eghF%1gpF?jyX<3>(dA$p|Ul7Wx`v zx}F3uhsjn1T=DZ4?0L=xI;`~~2W~0-JFrBC4Nytd;QP*)O@ej93nH?URX zwFdx@)y0(|$Gag+;?tYj?-f|La|l)U zfy2=_5hk<#f3y8Xkh4WI&hUx%W<`H9;}iO7NO@mKB6_54E&)hD{W2_px}2Bw6ZEad z*0DZ#j-E&jXkBhiB)RS{7D67v{-$}R11KOpDMjDeVwHixRhHr1f=KctYzddZ z5ze}q&=Pz-`V=C*I36p{Ve0$IuUq8CQ5UQ{ERW$LZt?W^Gcf{*p8i~VOq7dTY6`ys z?alp|z70v(^PCm+U)5aYfYh0EUE~TZWg9vTAzZ~XSgc!T)lBfCa0gd)Phbcak6r=& zP@w?lPDRh4Qcx7qsszmd+y~Rlj&pYZ{(hBgu0ipVvq&nz{TK!dNh&G*)`BoLX2_cg zE>6Bzv>9!QxHR+4jQ!W`?*61mM0$mQg{$kc;k$QK(ITK+1wk_Kqyl3ObI)yvkvcsnw_TEb3Y=s*}=|)EJl+khAHPLe^nrAv5$UP#$X-JuehLr2W`s+P%;v} zSOk<4ijt4|yT`gXFIMZy!?$W6Iyq?V39Lo~po3jkLqw_~yH8=5WUrNMVs=DjZ_XQF z*&oK7*R|P`fr3GyKm#+Z??o2r*e8-8C3`Cs#ksC2A?6IY6IDstI^cO?t&|DdSUyMg zMKExE@o)vMd-$$8(O3*(&I+D`3=Ns90T8FPdDOWu)RB85gB1LCQ#f3fh8L0YT1g}+63JCLkwc6a$mFtp_#ey*%iz24tJOlIvnv& z?+bI?j(@_4jOQ_^=md_D9)@Qjo5duG2)19#%;IiVZZ}8>QyhBSi556h`|bKL8@U!x z+h?GV`J%NOww!7%!ViqzSU zHL-!Py`a|PV13`a+odL_dDxFwT3805z9=iJW!UVL3=H;;6MURwDX-BS(6#RV9*+c+ z5wBRI@BUW-Hz7Y9m51j(t-F(!MYF2Z{#SlBZr1Mpgh*tw{%6ZL?sN_gQ2U8kO@3oG-@XGJ*^wB9|C6GY3FUwtjV&ZpvYed~l?~VK7;sOU$IDIOE zR*{2{(E#q%tKv$gvOWyPuA!giX185Sb{r3{aFiSPVVHly5}>&;*$^6#`kdpF{cZeb z3UNz3Rc;ZJETrA~T1glV$=QI<$*^8@kh>7?FtX|_@x`5*ej&th{EeJ!jqe7#Y3RQ4V3;~8nX?sCajV>DS6L75C!wZr zlILFsH(++@{G4X+{b0?LU47GQYYhCrh7>_$Ev=F)8Awhn9kIK%jn?KWVGvkeO*FVr z^F*uBxUT%kZV)o(nO5G)w~k9glp)NY<|9Ro-;q%hxY6+q&u%4^mN2KX`80zfm};u~ zsRo-5uaaEK+j6|BOY_JYqaKN8ylM4=E@))aA26Tv+tike`=YOB%TC_p8 z;GEK30V8knHtCvEx_S9;bt4gJY2!YiL%UUJu_B51_muC+ z@Y?u{^Z!j7uV~}(rQ)33->>Y$8tPB#_sZ9QnE67c)r{ zB7Y;-1<%Z@U#)p%!mxT^;e4Zn(^yky!(w1Sna9<-Shnu!f|He=fdKvXjMk;za}V#n z&f3qlFu(Qkkpfv(XI==k{@KW&?sq#u(J zmp!ze4!)gn?>SFKL||BB-Q06L=W1jV#S-Wn8Qh-1|EsuVH+$CZxbW``kN?`AU5_s= za&h~NxkL}2yq?E#3pcIP)!olcn|T7a^gn@27P`4l9&WeuS4HgiIH8K%17cBCpET`c zYEpenn~(D_C?#dE;!f2R*|n@1b=hM^%{E_@JCwCni8O8AOWmgp>^li$==N*WI5Lp4 zY1J(OEiGWdOy75z>{jHz$rtX{C@3*Y+8%It1< zpvhn=V(eA`_9?{7c3UN4zhPaAZtQ12Q;mkKjyTE#L~BQkK=|u7fkz!{5(55=%I^6$ z4|}DUmViE+kr91ou^tvs2`Cp88-N6)jeEgCPQa!N z!1$u>yok{)mcUQH*lmjJRP9Gtl7AW^8z`j#ioBkCmtGsOSIz=A*^OU zUZ_jWTcgpta}=cFdxoD%g+tl@BlAm^(75m z<_QjLZT}XtQ3cv$59hT8++N}Mej)4Dcg3rWs%txW@h~9JfS?-kyW`exM^14|r5ob< z0t&aASMX|pqQY@fW9s!~5C+kBtXSF?QeFO=?*WbHS1qFBO1 z!^WC<66}}CsSFg`AI#s6>FU=tT7uiFfEj6Ax{qmkL;ssNqYIwPw0L$TXVhLCSQQu8 z7)!QSx|^YbnZV_8_tEA1S^n%F14D!83}{(FP3-y(+=ey4@d0?de> ze}c;z1D50NElb zPd_1$64Ur^yFI@mSLrz@-xw`#ffi)T29?g<*d5yVlG$|}p{pAS4eQHJN@ z0GiFwR;goDV~zC$dP)#vKJHF5u(H0!yVhjMW%B1H&gwM>)Z;jID&(+AmazmZT{>u- z>L)93O!Tg)>5i$Lya~GL951GkhMlCyzpf^$QGtG4u;d~E43X`973duq?)_=KRb|S9 zC>JrA_LoUT{Z!WjBX{~$G{IQzaaA1XEHn>nCPNxzUCoyS$l5M_UhPryat_p3-e?^7 zN_A_e%$&noEZDiev}khEaud9;0vxJ(tY6;k5&h`nKGSX$y#Nd*Bvj0KttCb=^$^9wClGza}02|uG@P5DO^Opc`3jB2!Cw*jcOA8w2zh3 zD;^t7giUr5K&NlP&O-q(<=a@pcsOrP{IIyCg$|2-2wi8tQ>l_`Vb1jVc%mvZ^G|J)gOeSH3sqoc@PD4!94|o*u=zP8m=-d9 z2Uga#TISWq&y1MA96FX9sXiK-ik}^6OSixOkP?^D^Scb6lJon+C)jR0U=&NC<@=RE zH|7X(Tp6-gS!6^Vxfa?bnZG||_1ixsk~V$#L2Q`vMP6Ot<3m+5b6Ci1u#kgVrzI!d ziNYVf*MJ&@_zkDDMsj6w%Da@|no#Tnt5cxis{0sFlYB+^90>%Li^s+&YLotQgva(@D zgc&W7oivB+-%jz-CmZQD-)fov?}m302P2vu`{j$VbOu2g!IVz=UThx~={!s&Xt`ae z@aH?}*)$Y;bsa~GkAc^KkcA)%gxI31n6bM-KEMj)f9q$jlIn1N?576zs3OWi_Bj$m zb+X|opbQ*np&Weq-dy&8{quy9ye5vvh;pUQNJ#!`HqfctnewSTVNp+V_yI)on$?WL z8}~h3Kp?3A4g-qNF_?ig$oz5p9kmj(g7MLjM1pdgOpXq`Qm2dYGzOIimISH6K?qgj zNhYx(d)QTB@~Vd#vWO;4ev>Iuq<%OhWKV}59jB6Ej4{t%i{Z=v3v+=2nW7aL!$zpZl#+%5hEd^CY7PS*bVqq zWU3#CbveFm)i=>RCAmysx)+*)E~u@&>a*$T2>r%dbc< zz;E*6qHAY_Is$13AGcL?eY4&`pOFO^`Ky*;EFqA;#r}k&uk`^Jyy_Sj3w}5?y5-Un z&GG8qDOQI=$$0{q{`uRUYslG(mdDRd4{8}+s1YNt!&;hHGX1k)Io|0GEXiAj%5r!3 z^cReADSfmFjbFC$JIPhgOK5o~;r6~aEs(r+o7q;9l^6jTb)+z8Xn^R2>oU)#MezLR zV*ed7phN`iZ&&HlmKs3L;6DMBXj>52T0XL~SNPd+VF^&8%W*opk7{2A{gGm)ZbW97 zjbi)?sMFGFG||GIpnwLY!TY57TjysD90Y-k-3vyfl|f~w@wqnZ*9U=BJg@&m?#LOqq^ zj4l#s3H8RwlYTIq4*<>#lFY?qwcl?U04KpHh6AZz{n-Z%+!#UhpUb}x>GItfO89OQwcJE#mm;c`hh`dq#|`I z8B!;M@#8_{{MzQZWkAz?s2`MM+Q!Ss=|m*$JZt_g##`&2M&nkh=C?(M>3%*gNSz

=(i)-l2n11bpZs@S%ShS}op8ZfSGB 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 L*USA6;lKX}n(x*f literal 0 HcmV?d00001 diff --git a/assets/vikunja_logo.png b/assets/vikunja_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d891635d559cbb3b53884c33f11bb09f58a326e1 GIT binary patch literal 11501 zcmVNW0F!et!9*c)jv@#ILP$aglu^#DmO9;cPbqav z-PKjyRozw9=l{O{vyoa-_o;Kvz4zP`bUK8pF?6Wm+ffNAzl_ow2S&xSV<~6G=vh;A zym4)GJiC|jTr|UG)BhHBv52zXBlT=a&+GKY`}F57MKh*D^xvDJ;!TTU;@OX*7|3Z|W-ANVCiUz14a>+=>*I-A6T8fYqkZudtR5TqnFBr<4 zI6jrkoU@J0`)nVXJZlpfl#m=2MjV@%LQG2zlI?phlO?Nl^YLu zKR@gS*d+%7`5UctN09vDE2h6hO-J-Y3}cL@N^)0jMSo@Da*~l*K>Wd^_t$IE_y>{06xI=bTj2Q9)m6AVR%fL?uLEAbbz=6#__2LSO6 z;X5H`pgVzXmcgxoPDh?XD+oi-jItlogpw`6O5TC!Hf&=90o)8|(E-5c5(AsvA*C$N z4IG~Q?`RQW1M(ET#~k(!X2k1dJk6U zctjJ5zK`~yG{r1I>A$J0}b{`Vf=tGQ&wrx0W4m1#4mXiJgOu^MlF!?y;MP3 zH(H9;uJyPsJM7Y6H`{=_{q_zUkqTP91z5T1l;1Krc=Vbqi~Uyuk_|Z8VWSty)xvB$#s<_D;ipmEu2$F~QE13ogX=0O zQ9`o?wdw%&AGr~*e4u_n#`jnm$(RPAWhop6gW)S(DZG}DHNB*H{e_RKh}6h`SfN=5 zaO}*TfaL>;L?hl@DtDLTr3_>EI$D}?1AV*Hc%>x-+4oB{>j2JOzAuT4_8iIxLfNtL zJT@;?-1XkPe+=c8zjyUFk)qNXSscL4tVf!40RE;%_eGnfgA2X};XT(u>Nr}S5{#eT z+tLTpq69_$BzX^!3s5YhRR@rrTk7-kTbmk)t+mDH>mcbWc!N)j$#CpMD-6+jpJs2( zQBohi>$eL<8@8>bnK&H|pRa>$vQ{0yqvC3xpTFf{K55FmN7`%oUklG5sJp&+(`G0i zM~e(1Vn-Ri*VSWRF-kn@t>vO4|LrwZol0Hf+W?NAy`xzNAS7R+IsZN&q9eI2?-4Q2~{uXrXf6@6(>}a<}L5mxV>bum0dX>#ESOx=}6X{h7UK z*R(k+kOoeD?VOx8TOS8NWmb^KeccnzU&#&C=V_%Cri0N^r%FoT&b1Gel8yd~Nx3L{`8=IHoRgpWqtYqC-w(htl9l+F&w)l>jG&XpZ8+VIB z9jk)k0DW%=7NaHmXZ*=(P~cZ5tq_)_R#w8R#C%s<|z-hJ?@?@G1Gihvyev=-B%16aD|sPEm=lX9Q(gS?8qc>9A5 z3j4gKg=pdY0l#i}S@tVIVPB!LR9`+Ui-t)i^o&p{_<1%Boa z(9%6_``MXlRN(R_{J}eGbCXZy&b35p~!Vzfs6wqoZRDJtopJ?M0ro5fkfOTOx7A*75Bfqi$`x15ueR2B2 zJtcqkHri|Ocj3M5@9fyyrrL=%bX(4w!PaILq`Z6?ZQXcd>S|3o0O;)>NDcs>1Gs+c zp`t%KJ@z(7>W#k&OXD99m-M$ZN#co`l^23cy!Y2G6@NY*09AB8K)!(%9Y9T8bHFz! zokxH|wT@IT3cJze5ic8lKtFhn+Lag5O#?~(5#s<7#;0n|_y>+K`J9>rrP4y=XD;a< z1kAcutQJ|^j2XS)J7Hn`472;Iw3$b`78KZ54nWJJ0?8ae{8;Tx1xln&&1W9~p7d$A zYe1SS&=+@e)YC{6<`0C$q+-a8)`|kBpS&%J@(RfVP*hf%WaH8|^2bmtZGz?JsjE`3 z+k*uh6JXd`+P>~%jAOK2RG~mBkR22}AC<|( zq1kT3UEO>vT2f%XEI=_g06++K@j>D#xQbxvnq!g#0J&NK4=utDpSYz)xl|2cl76bK zpx?-ae+AJ_tts%GoZ^5p0DFR1rNz9)FnDB&<{W^p7z$+f36-DIZtwT=TlZX4XPdNm z_KKz^5YZ2{M~hcj5M+{K`^sHoJ>st^fQY%)D4 z`g@;jCF7^Bm%7rcA&(i?E*oNa2>FFNnS7^(K^zF*J}Vh+cN zHZZ_Kj051du{;ApJQ*K!)P)SePw7OW6&p@)v+`zv1ijS|d}d z#t+QNEA=__LzDxsdp8JJ#fQ>B;H-IHaHFtqXBYYIrypd1!zrz(<8tsJz&CE%8t-)! z@2r$AjoL#$#rnopjp&(ipGvp>#<^NHe(4=R4)1IL7&&gUJBZo<{Su+#FFExPiGO2B zkL=)l?rUV4P}w=G)_y+^14lKZYYaPDT}3{$%1KEx`{W{QwY@t4aYq0l(}C0u7ytst zrq4c4CnwKk`xu_mD69ymAm8K9Z`pN0OS;w+8<+B|DvbXHX3@83Prp2^8$Y)L;Bx>X z3W2>9PL-19DM`lnkprf;Uh>RA2trupGu{6IK|d%p&(6XgJW4F(A} zz$kEk8>v8`Qj2*LFdzrF{tDui8xI2B!gjW`&Lgsf>{Sdqb%=s804)~P*8qrMjVt_1xCENRLgqjpibcbDy`7x#}KIuHwOSCy8}&R@s`AbpsBz# z!q0pEPXmShnt;%_Oc?0iO@qPk73JLd>rETO&G>=azq}M!Dl6?5fUCcEK!Frr-h`*b zDM(=s2i;T52=Zus((~aI_;cmTjVJk6FdrR(y9=uU(a()}k*?p3e?59W=5bHh$Caa5aA5 z2Y=qdzlG%)Y1LBr04-bqV3*`E{kNl|UmXHeEryv6T4EBDeioW09}$M9!zJU-8^^u3 zhF^Ir%6WPK)}VC@+6CD9^#$;>{Z~^1P>FW|YeQ4&%a|sFv+)C=M3=9vwYP#Gh;GBs zP=qk_O{%gs_8+1$N2Ak|1<)SJu>Ty~)qjlPoAeKthPwj*mX>>OYGL)#70A~hP=p6( zT3ywf{L?3EvV`_0@V8-#78s>xcVf~{hC!rgT&}1OE7KE=MBs?C_u0mRDneGR7VUNEM5Sm|%(BuLkb;htW9HajpQ-lZVlmA8b$UprjDhIAJ|$k=yRqb|m?R+zdi=l1_L3b}u0-ipcww89W$ zU;1^_M{b^gX^A}d{&C5FKmqsX)Y+TS`V;`@0<6X1DWb0gSphaz|6o_|HPD^fG0s=dgl7=!AStJQlsy701hi=6!KvLrUkn=08?I| ztN%NR z2Vk@GH~?!y3HNXJKp+hcI&9p|z;3RkuPN?~6_~@b=fIdLt57%HxzxYAe?9vP6dpgJ z1-0xBz+vxo0IsCYfTO4H3EeGd5b4Jh6ZXKd%46YtElP)YH`_XlVe}HezqB;Z}CHm7o4Ue9cC$2YbI( z9F{!?@6&PZsFxm7gI9<${s9T|{vHJN9HAW6v9SVjYf`_SH|o_1&HCvT%p@^hj92Vi=D zf)YL&Oi6&de@_WP5Fm6|nmRKDy(JD&M*u$$y8_qa1UL+};PSP6)JuNu<&XZ;Nuwwv z;e2({3dI=#qy)Pb4|yXPHkVW2E1{^PMKul}C$ALslAm?F*MTwd#zYj71{#9WBp_Jv zJsCKh|6Q{L;hfJM3mS_1zn1Ggpq>UKWfgU(mp&VXB>x*v0MNJsg(RE?I+0fKfa*Yc zE!asb&+D9=Gk_J}(cYrUio#ZNJL;uR2Vk1am;RfLLK4o@wZ{lTS%A0<>LxFDdmj7s zvf&3XUkn8#oZI$XLW@%vUYUp;fqbO}d+YogiNX;_zR}=_(BSP4HlS|$;Gjg)-+Ac$ zZ+stxBaRuF1!!>!!))U&)JJmJ3mAHCo^IQmQMva z#@OD`L5`k0OOh6(a_{}Y!$-3J%`Lkwpnm#ht^4+0pY%KmMI4zomjuO#np;}Po0Dgf zfBj8V4}bOBXtFQusG^O(qOyv_kDloEzJLAuSaR{oHCg{IjtLhy)-EpPS=amj(I^yg zoH%ox{5d={Ip?iuAG#S)uM>zN=Pq4U=E~pR-p}~E`FzBSBq#TQY=8U2xx1*JVrK`^ z4nRpL6mguLv{QCN+I#4TMG8+qUNkP&0K_MT39AVqIC2|V^7;CnuRr&P!KA8M zIZZ&9ui51Gz9IMrK}?IKoqRNRe$UtcIGEwSCN&-xSEGK4y$PWIFrz@kaew*^Sq&+1 z>^nWi!o2ntcdm8?MAo~%zi7o;MHs)`Zs&F>-S2DC^x2&8yWVEJGvni)@9)}|Ci#1) zslyTB0(St9IpZJ57@k3ai0An$xw08j-h;v(Bl+FHI8t6w>G6tfSmGPpYa)k@bThP2 z;mn0AJ@0#P{A=6|hNmL}#4g}9ua2K8Ljcl>`YDX|hzP^ex=6k8S11heyqi-Zn<25E zE$_MRyOiO5r*S ze^RNQMx5O+x3!Vlx_U*tm$5h^To@U4Iz0lgsVEFT96)6~K`0ZG-d~S8DvT*`1lWp# z5YN(zI#0AqH>>g(04hai$G8iGy|v zw$q8iHrfr?MhAn~t!*3~w39H<>2#>-6HWPW6Y8iio`x*IdngFyTm#B)?@nT~G!si> zIccpaAWaqbD6@UCxiXiS>mHMKIx7I213Car@D}X_z?PsO#Pd#0v8wDIR(VU)6Kcr! z1sS|Awp2eLR)x+D96x<6>Zp(-fS!E_JAg_QhL#(GI_auiO`4zNNMiVX*;-pj910sE zk~lsUbyOJ3zyZ{uAjI?Rr5shP`e2}P7{1%_fI1f&9Yv-T40#2Ig9v0bIDi%ug!X0v zz^dF*l_$IL_wpXGnnRx((cWQ0{S?kdZ~*Nn2=UyTc1^)6e+L(|3!d@!vZFP$*P}Qf zR218EI1bD|ZryWHnJ0dSjRxrQLt^~hw7E+_7P{)k=DVPo50IE?C;yG}Hi8kr9DaHY`);v^{ z@rP;`Fa}G3#jp|_Kp6_cKW68aDr5Dh`TI&U{%%50GFWJ9>)=MVp>7Ip3|ayX;1LQ# z-8TVk4W){80KrTb&b;#o^->%Qzyai-ApGM@!*)eP{-w(AmxFB$WkHj~mfaUoFU9dL zbpXbTChiL08}dC+pwIRKC+V(W?%67+Nwu4$@*1` zNMZs*Vq;@DzA~gqpH4pVs zY&mc|y9SzqE0Px_RjpU_a!}>V_CSFf=Zdpk_nl-)O_ki#{ ze~u6ioBYS5xeNE9K8o)Nn5>Ip*jXqD^_B)hmmYtNGVAIwk}x9PqoI2u>>OYR;m_Za zyMs`xxt(*wsEeX|0=}<{(zD}H7=bZq(SB7X0NuNBip1;Vd>a4wH^-3b$C>_T1kyYO zIdSxK7V4p29f6E*=pq@@AQVPm9QNwMklhAAYpy^d{AZ5tB7+AH_Gai`n!JRBCihM$o?&X*92JPD-XVLyAbuy zPevxN|D+o_)bMTk4<`yFFixDgE;J6HDsTtTP=m1y{q~2EHfgS-|@BD|n_+pRoCmBBUJLngzAYcg{&VsrBezQW?4f>B8D3HLp zc-0Zr+ye9^B=@+k{@XXMkSvo>uI3=d#RpLD{3T<$+T#FVL=Xxka1I`sLTc-STLTXR zKBO?x%uDHR4ggYrCFu@C>lEZbUO_os{ZZ!v;4ar4fDr{E4cBcu6XaCjMoA3yMA{BF z2LKL1$vpvP8+W0;1y&0D=UxY(H;qK0NWe4{&t=P%|LK?}ecx zQsaJp8R}YqjM5uN^d13*8~+uBqTZI_oiqLdGgLV9yE=d;g*Ox%0DSM0t*B>#Iskh8 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 Tss?e>00000NkvXXu0mjfz%D^X literal 0 HcmV?d00001 diff --git a/assets/vikunja_logo_adaptive.png b/assets/vikunja_logo_adaptive.png new file mode 100644 index 0000000000000000000000000000000000000000..55d5b5275553e7a92b200e333df69a7228166a55 GIT binary patch literal 34093 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²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

6OyU}q2vQ$Q_kJsQ)-yht7WyAlLgC_I;ph-G( zc9i0>Ru4<(0Lbw7A;uQ~}2QENQ5E(|IgeZ^o@hIyfBV!CBa=k@KGN!wq)ol5w?sJ-6Iwp#z zsYtwuF(1}gkJ%KUje!cK<@xqydzHO<{#mF-h8)pkvn=Q^nm7_$0StO9kZ5s*>V21#s%^BRP`Sd7 z-$P^62P{w1Lx3=x62R)_MGWFgmw?V69#>kgt~!Q#Eh;QLD<%WUilpfgv>%RJSOW#H z3a@$)IA4_0d|~In+{Fk$k`;>y6}z!JLsnFcty`cJwg!P4>n^@WiAHVTm?NwmgpsQD z+hI{3)$B+Hh~B(Yx&%23~v+o){D09=>{x})njP_Gdt{dn!duK zi3`zm9ccPsH3Sl5~MADKPsn2v8Uc07_?d z5(o+r(B{}grnGPZyme?D9;qM9JzFZ~5sX+e!tPE#v*K4-y?S9c+UZ5sHn@XwkUt?g z{%=+~=z?A-(&_JLb8_7aVV`Qyujf!6@C8&~DK=UeVZ%}wAwxL15n(C8&_)XL4OA2h zlO2fHEw1y~WW${eHYQ9KVcixA+}eaQz@ZPX5K>n)M!+)diJtB&-b=NzAk|IL-=gS2 z{PZ($8^o6%F}%SOU#CmDLxVFrAwtW^BuCZV@{?egkTjovu7br_&LKZx7OGpv=&j`o zzpY7@DZWd&Jqa_VcH4c;Zv!yacLcD|*v3Kw^m~%5jeuku;>JZkbhH$y?JsIUw2V!2kT$2ZkQt_`nV1ib1rM}DdQB>d2+yV`{_x()TB z^4agFRVT8VP3fHx^$ust-WzEB;p-(RJbP3ERj$7FE5bQ=Z5Pc)^X4}tk@AO=5zB-7 znK5RieyiPX;|bwIqgOutTxJh$*iDL@)cs|!4UCU?HiV=Su8Bx}0D*Qzd_=jdFemm_ISZ=Z{M95G!Lov*WjiAprz;;VK_AV->fstRA=5=>$Y5^9Z`HtA8j4$_(>JQL z;V{Q1gi#KX=9mVT((X1=XiRJ9m^d7315<~I^A0n)CeMdY>mh^Ek1V3jN7xyn2%!nA z{@P(QI+QKNt({Q8Bm&h3#Ceh3a;$$HPw-+*LnSI5b~%g~un)#4u}sxAWUA`Pc__@O zMTSc0uYvY>%E2ymqR1!EjtVm*K;dX-lv0sN+{y!>ZO#Ec%NhFq!7S?0RvQcgw<vGUL*w7U6eM=GTB!TvanvyLO^Xqqr$-B zp=CSt4a&pGYHQrqM0z1%h6~FBL)tOp_Ofu|AO8zGFO0RF_b4kEGaG-37E1nK2=cmZ z%@O%odLCz(^)qcN{N$2e#jPRT+5?uz8{%_Vq}*upA)5apnN83Z;bvr)OQd*>@wpiP z(=1LS-($l+x46mZqynR+N~}gQwfyMBY}JR)B{6R>H5SWSd_A{d-A3^QUR{fxG6x4_ zLI*-D+ixv8LADMy)HsgR(OC!e5#J$_<=cbP%P7e=K66l6uixHrmJ{u8Rn>hJI3=ex zup?|by_^tng5GLc>Sf!#Pv{2}P=x;RxEa1$vbUpXfQi@6sHKbbyt$R;qJPNFQLIZF zW(%NBhxD790bJ7I4gnTU8d~u%mxdVk!HPo|uEXfo={=OSh@oF2}#iv&a z#m}h)8gN&BZ+t@ce@9SQVdjD>L7{Yaw(q)bwb|Hlt$!J^yeA$>UAC3{F_kj?oMgp1 zsTYIx=e`%Peg6$zpLy-w+1V-Xs~IT^_AjHkW41Y=@Ks<-5{R%pf%Zn{;$%Xqyk)zX zZSngN+J>Ubq`=Ly_m_V}qbhB_ub%dcSQBFdE)-VJR@q}X?EZ&U=2_}-$N-b?bNsjm zHJ>x@Px5z-_h#?#pqbRmCtQ{ScZ{Mhwa2ZpSp0cVdi9;k56 z?LQJ|WMR~zMuGu(za`5)v7{RfsP2hZ*7bn`6xX9`A_*-5Di_QapJpbocAG`ZjRX?( zKzH$>Y_A|}Q2h-2Q)yS;dL_&DJ1>4q= zAtPxg>-9p^|o!&))f*|!zZyOM0Ka8`fW6|i^=S&MXGGYXjrs z_LB1MZ|L{L|6KY(q6qsv=ETP3QG#l;4Td~}&h48=D{-saq0vh{Xl@+6_!C?G3b%aV zao~+HC5U9n6;RA^gI5hG5~glbL4EuW!GbD%L!_prKvk@^>JruJW(DpcX|zBh!4|Ac zy#gXS16liSao733%0j;=HeX3OlPGgI=fgzt~~%E)$%^<9BPMb6I{<)dWo8~0v%y&cn=bRlrPWVXyszV z1W-O|BLF1+OZ{~hyIe5mBcQ47b@!^z-yKBk)Ltw|*vh zs@zYcR}Q|>IuvJUhT+YTWZeT13d<{cce|T(Ti6FCp3}W~9$a1F3(75*Kk9e&dYg74 z-{ZK^0!E{jx;mkwDU6-J>SwfooAowEfY3j=8Qw!rt%u@y>gCmqbuc`G1z7h5rc(?z za~w3xHPU{O(*?JhP?OnLss+Cb%`Q!ZPzLlD16~QUua$RgVrsZCRCm|T@|jY74rRTd zYv*kVGX-}XE941f-o;Y+-DEaAL{(&vWRVY23eXGLa)d3r&}-tqPV~fVzpf#lK?0>L za&V#YcP*Lp1hM=WV);i=e-1pV29IvkOe?w7@{Rrc=b1x#hZusG=~d|r8txmOSEYj05Xq^%*JfZt1LEWGx&Lea#$+fGKr%J;OabJmxXGJ3s3WO3%XGrixTEhxp{ zxf;I_{5J}IH+syU!Z<&^4>nlw8z2gQP^%l^lXT7k1fBdI=9wpoVn!R0anjy&30t>Y ze$3~_DFw!kS$_P!7@3T{4xXb%|1ReY(*iqUGZmp8#IjOfeidTtevN*g`f$?ESlr0d z)?U3M&QqD=-3gN@!y4Hq)3lq}d7xCnY!wl8-euc>_;|u+iG;X5QK$fu{<@dS3In`I z`nce3Qlh2LDbzc;uIpM#^+z$%bM9+|`y#(pUkX1LLAoEZZykKyMcBtNW|v@-koWsv zJC|efAbLuv+L97|vekTZ%{88LF51cQmT$i)a`a?HO!v9^AG$a5ly8^JV>ke{Q*}l4 z&~8o~+gkrY)S-tB;wH!kD0%ARO2R$@ZkJ4-rzMAXGX_vC+2MYf z6-K;kV1?;$Z>uBm2A05?fO>Xp*$#}Kf%@v19SAW#tn>~?a%J_T&gW{43(`0&&{XnB zGjhA$XxF)PFRwMY%#C+4T5fMp3UC)E8nA+_FfnALw9m;w&HlOd5TC|&?b5s~pzR(n zpJ;Ve!YZ{uQKr*8dgz_hp`A+Xtn$m3O}$Y#tndcSMAAiH&r5>(NMrEQO+Am)jus0u z6ScxUJaYEdL*!GNIe$<)Z10wGuq_oyFk)h#%q<^ph4R8V@mQ@lURgQLnHwE2M~#t|Gih?zteM$asBvq* z@S6`Wau|jNik|N-*s)Yn;t;rO@momrSNhJum0t2jYJvG$v4M~G;=+5L5i9U4DkwnXxC~NsCi0oZ-`K+Q}HgM37ERj|Cn5im|Qq%g$?IqWI+Th ztKVqUVitAc-9D?s%X?`v;K*>S#79SXXb0@StO0I3U)o@S+wcs?~pyee&!6$#)+( z@Nf6lJbb2BQBFHFfNIf7N6_h&B9jSIOq6tD<^z|SRC9y(S8*ddC@B(UQ2JW*1Mc6| zzC2$~gi|5M_{sUcqT-mrUr4IIp~E0Pi?nCkcrM#|b^ncQqpsl{A{|yI%Ah2+=-&>~ z(XPMg2Ru#T7S#N={aZMtlfZJ^a{v*rSuYM}B+ut92c9uXI8QG=G#*prWn!8T&cS%U zw;1A`TO*7+cZH7ULbvgn^2~Ldh}s^;ZQa1%sP688+9vH+2DvdFx!fyX!%}cdU!a ze+#;~i@Lo|=)94&af=!0Q#6gk!;~J#di_8Ibpa)GX;eYox^jYpjI*eS=4N-WFc5qk zg|wHr-CwG?<7}zdS;(nJI_pDcdA(cIcC`+7cJCRv4%l{iz{`xN^VjpH&dTE#o<*Nh zNz!2`)8C+#8PEe~6Lu36&Z0d0hR<|!ObsNK8GFpdsnF#;OTR95t;QdARIN~Db|@`a z-+$2Ma86?bvq84bXO=m2@~`-4&&qoGEn`l2L(Cc2HXPg5&s5F9|692MbslHhQp>7G zZh!0Qh+UqHgpBUT!^ZQDy4UUhG-z=S5 zQOx&qkGxTf=*UanFM{Bb$bCpLT9h@QcfR?%@a4$jo;Ug)H>75!ER0QBEPI~?-XwK? zJtm(yITE<9jHd2{cr@A50n0e;;lW-8eiYf8*pg76M6*Z@77Qkw65Jc#_nXOS_;F0k zRUekGPBL{1N&TFR#T&|buJi}m@f&+C(dp(z+5bVfEKR7K)z<*Ul-Trg6QGrMh9(ao?Yg~ z_U{+fAei#{vwLfJQ+2(TLJk@A_asrd5wfFAj@rx{cQT*qoHn{Dy~7mqED-oE?0sP) z8E>dI$1L8jf!@kZWc^`SPnmeF`{U1b#f`M+lz z*tOsH(*+%InX_#3U$=;4tAdmGdJcY|6a5DXnio_`&obIPCM|9EbrN|y*BsUB#GRLy zaJV^yT4|S=9j_%uvU zY@>{#fW_+Wz!~8*C5`hj32t8RKi#_KnDiMccP*$--EBLJ5yy7QYAk0gavgm+Imx(& zw^mTGb^|6lk9aaY3~||#5Psn6P?8aYBcAlV#OAEIV_eX}&?G+aZBI|lweSi#&UsS> zV@u6vf>Sf9JpCnk?AZu-{>GayNgDgQwLDOIKv^)lQ9@2GkQNeKYnOJ8RJTZK?2|C3 zwqG-HtFp{$Y)lP7yK?!}1we_mFVBE}{M@^|7UFX=X_L^T+7RwG7PDG((@KE_@G4h0E(}mlU_|{)y>hH&97G`tT;ZGoG z*abhrR6?=i*XLJ1yjs7tqy73{Mswxtd*{wL&WeLD;19A!IAY{W@!>lYrL|U$FZ_FH zVf9X*cS(9qqyT1Nw-dvzY@ktbtcBiLx@Bal8t(}gIM<}%7&aLn=}t^ zt1~gKWZ<3<`r&!xu^9HCY6dijRJm;D^}NC=287XLGQ75i5ZoG@X*tR;e>d->yrhN{ z$e#tx5feA34R|cvYrytq#2@~-^6}Wqo@K7cXf4@#MSD}yhPRxC;0h3E&p;M>)y`KzGBJ!KC?B~V; z%^hEBUxd`9%PJ%pFFOA?%-dI`36gXL(F|p~?ia(|rY~MVcpzjiIM5|0zh_ACzUlz+Je=y^OuOE;44C%*%AjktR#Gm)}ywG38muuu)+I}?IV>z`l zQ>s}btdWbXl86WPv19Xr@r@B;T_%1L zlye)z-=xi2_@#{qtt(X}=B7TCY+kI1eXpFioknd+bXt#HYFcy?!78{wKRSB?vXyMEz2GwVL~2kCyY$~<2SDO#xZ799c@?1p%wV*!yqCUR%jd9%lYj!wBA<|Bj!Jea61 zt>MZ|%%AfRIw3vrMF$!v17IQX7G>M&E%u!^qdD{+%@vQ;rPWXkYCWjV;z@iGNmZeu zb=LL}B9@{f7W9uBvF_)Vn#NIl_MflhYQ?nX5Jq<)Y~dII7Pf<%7@B7!T~E7Q_p&}H zzOm1rtM;DM%hShB9i~#=N~~N!KCO8keEEib%8HD<7WHf`(|TlTmEMO1!{Tz$+p(!MS=TO+r_~2*6I$% zo0z5uj<3;<-kTvK>PE*hb$B@N>C`9Jm*1FukKiz}etiq9HZO``ul`zJ5lS$38|ivG z%VDz<`+g5?s5qiS$Px35f9*b6YHogv9}hgm4nVITI)`lJp;w|)bBU+f?i`t~tv?Bx zgqb3B-3u?K4yagH!d2K#;*7eMzcEY>L0Ye@5ixyZShOWi_U_FK$r70NeYDDE^epuL zt7-qOE~Zy+1x8+Gs~AO;9_!0thcAMg0{aypt{iM98yVbJYUw6D&^0A!rJxFTiZJsk zZZFr=FVfU$p$irtF9*z|dhgbS zyH&b!?qc}C820rT!*?ruOQ(JR(W?HZV;ff`W$J0hR+_i$PcfA=x_r+>^Z7jgE8|Zb z@-PTden%|dAjVqHpP6>sR{h81utsEfl5uE~OueE?=eIevXS`<-?(9l@n=!gJ?(6=7 z8%N%QH{@NGtXZ&xvl}-8>>Z&jU8xX>5pSX1p+p6|1>I;rP~j~rh*^x^?M>+9YpHxm z5jYjQ5yRH`>mJuOR_sr_I1+%XHj9CE z|FpImjzx=gM#cYR9J#X>c|`|=IVU$!Xv36#aFv78+|Ij&lDs_SYIeM|e08qfM6sH? zRkj!x}p59C%*ueMMbgoD@~3rzTgxIQ(08|2^D>%xS+H zk3D!`y#f0QVVpR_YFJdasiMr{lyc*qF6R33RlqCL2}7$ z8JVY$IXBHeik-MAfL*I(y5q>FUj)rt6aHkbfr4&WPJq6_8N2!We1z?o` zq85r6SVKELP6uKxsBv}^9lq%RXFz_ldd1NkG~}xZ!uNmotITL8-ygo;SSLZZ%2~78d;qk1aHbMU%RlDR0 literal 0 HcmV?d00001 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 916f2c4..9d9a55e 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -439,4 +439,4 @@ /* End XCConfigurationList section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; -} +} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..6b6010c078459e6533e4264fe9fe204aa97b048f 100644 GIT binary patch literal 47378 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%0AO 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 A1poj5 literal 11112 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index 28c6bf03016f6c994b70f38d1b7346e5831b531f..f7021d5dccafe09826ee6b71c36835765ce17436 100644 GIT binary patch delta 598 zcmV-c0;&D91nvZoBYy%lNkl%{e)<;z=5!-5B)7U&_=8iMhHrSeh+_M_a z;rns!neQBV_Tp_90YQiaNs{0=tdpaZz;#_P)?FqC!IFIu+<(1w1@|7lK;hY9Cx7Nt z7SpG5xOwM+81T~E2_(Y=t(LVTZ-g}*OZQ`HB888iS9=GJ4<}&Ns%TsGj(l{Fj&`Mt z;lYF$P@xjM0pi-_v$!!o14;x(1o&9eTx**nnPa)l&^;CfI{nS-~3G1gTV2;3Vt zVA~EJ7oKA7{4CEceOUI#itJPx(TI-CM!R>Qrpesc7tYPVYMOA`o0vG5f~XAw;u;+_92nPR{v&wt+{pBwRJ$)JZcm}VW)R&C+s z5*kgbt1b{&SXjjMtJ8clzOPkLH8-$YX(EyW?mv1JBnt*wmV=dI3AxOEWb!95nLP@s z8NAbP#b4q;Km0%HKbd%zAvD50Y3*7?Az;k22KS(>d2|Y*=!nHse$rf5@O=59>l%o< zy)A^dEKkc63D2V?Z?A=bAx%Lvs`GEZvwvfBBq{pPC}@c5Cj k|6z^|m)Xcn4h6~Z2hw`HD^|78_5c6?07*qoM6N<$f+Z0j$^ZZW delta 540 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 Z_dm1Ylv~=3YHI)h002ovPDHLkV1hr7WrY9$ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index f091b6b0bca859a3f474b03065bef75ba58a9e4c..edf17245eb9ebb5416f7c7f8468db9de4041a25b 100644 GIT binary patch delta 2084 zcmV+<2;29x46qQ8BYy|?NklZ)Mvs>Sf&%n9`T`L$c2^VVNww|BW*@Zsha z;PJTOgHLwBp<@@B>BgM!xG^=T>`Lre|KK%`o3|t*f^9=Vz5T{FmcfR1x5N2MH<{?i zlrYb8un85+Cx1)OKajE{M-aS&pS@l;ytQ^Iyu9IaP!!d+j!X$JoHq@7xR!oa9lM~ zPQdS@M>Qiu;?H&vn#KG+744#eu3?o9abTCro-6 zG!3L%oiJnS7$$l$BRsY#MxB$AN`aC{3|_a|y97ChMP3+zoJ>HhX)Kz$7m}&8Ej^hL zt{WAhM>#$)bP=bQN(fhl1N5lk&=?Zsf}kjj9KzvjujDI!i4?VpMefx|J`lj3@qd}rMdDmV@*C=+Ba3j+2nc&t zL(;O0P7UX1cesJAe2ZX4xL8Jma|^(Q1lr50q^E00aN^>4OQzm=%YN??Fe4m|1WG@^ zxv5FZarEXmw*rq}O-wyhUlwVS1tAfcU4JkmTpcYv4G~gqv4)byv+ULKdpHsn@o%>+ z9SIyKoJvV>wXFlDPHv&+g-)xG?CtIzjG5EW)My;%k+9!ztrD;!TqT-be`oU+ICJhi zYZM(e{aC5?)xdp7!{*tsg;cth(TSZjEdg%m`OSjD*`eu4B(f;M*PBV1LWU zpOqxM=ZF39>gpGvwPif)+Vdm4^xU%r_k*JO9B&oO2>ZMq!!=P1z}xFz0T0I4udP{C zviKh}8dIpT>LJA=;SfENDJh-2g8@m3=Br%jt=+!R zAldw9^T8riC1AHaEF+bpU;vWnZGS`3h0mtrJ>UsMK?pY%B{qpFO+5OXTCN<%FII`v8*oiB!^zjD_*F({ISh4&`Sbx53F?Cv+szFUG z3O=6~#Mnf`^9K&uFOS{}M+jeOyJdQvEDZy(@sR58gwY-{el_6SKJW!=(c}wPLnM%4 zk;A$dju0*tbrDY-hz?)tCAB6e;0WP#rgE=JQb4>AvAi#&TsT6Q=d7h-a{-4k(4|)& z(e#xH%B+GxXy(eVtl@~%+_ohWPHM6QoTqephBsL- zgo1*}llI{V;i_!PR>Q>r$wd!G*bLQG_KR_5aE5SL&u_VSpFSQ*NQtpDnU*+{@X-u4 z)yAv`3pi@hB)Z}QF*NHG{$g)u;)8^Tt2&S!cw}=6i){}1aDT>WQ5ixEyM0!v77z9B9(Ma^bvQ!UEM-eT zd%MgrOwdrI1ZxM5?U!bOmgYJpa`M5PFxiI{8>X;UE?OtnGm(=I=7gtBZDN)*C)nq;Zeu2sIpJCNjb|!va!cdLB|I9vYO&2N<$|u9 zG=;93NOEAxq{{Y$6a!Pjv$FriQVDWPM7jS4P3dxeJ-wH>7a4*kX^=K33YSf;bM=F9{D O0000c)UfJ<2uenUn3ARN>mf|M z+(eagCX~wv_9N9Br6dE4W@{R1X8yU75JVAXqB_2?1W&7xoYHg zkR5NEVWsUG^?wLzRHH9Aa#eCDK9NvdPE(De9-HaQc(6~^lpTe2pm3&x9G1K5Xawdi z4F*DRWI%>vgEBPFqaRR51|&E>B!fiay027YsK+Vrn=1PqDKdi{m<&P1nQ3_Gw<%cH zHU+slT8moWCbIKH=(W3t1j5BNfsIKQ#Mzi(J59kx zT!xVJ&SKqb4XjdxWQV7$IrZ-{l-x3`7M}qzHsPzP1S_$c=96h(q%b9ZXPvcV z;D5oPsau6Q(U`-YLD*G41z_cgz)a99av0W_U=aHAj?mj@2KZI50efIA zO8^kn_?FjaZ_hfbhSh@3^GzxJx*P{Jc7Hi*OHPZ!wvEV2a9XKq###zPPeRs75i0(W zU?doBGb9yqT58~qn?wQ4oCi3oWdc^W%JAgTVR)*l33@Ky3ip4Rqz14Wx_gwsGYGq) zMY~B;*z8j>WF8xV`^#!USYHDVZf}I{OZGzBnutHA1D(}!4{};5>;)mO27l7F zHh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG;P%vktHcXwTj~+IE(~px)3*MY z77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC(zYC$g|@+I+kY;dg_dE>scBf& zbP1Nc@Hz<3R)V`=AGkc;8CXqdi+`PV3Vc;#lxQO~AoO*}pfE+=*r3ffZ_YMC zflq>i%a-`Xw)YRuK;MUtq{SGa7vtY^gg0bKSp&F>y|A>h5qhqSvgdtV{(lh0c$xz5 z;*U?KQl%W)htLmD=yhL!@aldLHW(=H00^&qu7J0mA5v0IaX@pn_bKobsC(e>(nAjI zzjyto3Dmc!oOxjlw&JZqeL%+vsN0Zy8@1@rs~rRNAqO?umG&QV WYK#ibz}*4>00001BCp62$BboB!5{+L_t(|0lk*XYZFlv#=ko=nMaZ)Xh5w+4{eJ>P5 zH&%oysEC4y;=+~w2O_w0;lhoGAcAgG=)z4ws#uDxtuK7{MNQvrlBQ{1Gvl3`KD9Pe zGk5~Y+&PEy%RTqp?_S|R!*w11*#xtJ6{UV0K3Idh51u1DIe-0!|Iq$w439?e=3Tcn z(9%F5ZeBYLNwVSLla?i++iNROTV0NeSMDGrC9l5uD}K|GOKGDeX_kZ2h7 zv>LbXHRTT7yfJ|IP!RUOS|pR{C1acp8L3DZ>jU{&^O=Hrof4+UD2%pTDy6b_97mvO z^F5gFc0e1OfPW;~t$`9UlbiszZk$E2Kc6NS7<3{O#pmxqc-;!7Ms@rgjambZCsgo? z0$!47Q^|AhjoB7>^RTUsfpn^Kj=W zb7M^>;6%r)mwl@$U2~pi&v^@C{~79XDiDNB!dI>B`1tt?&Yw9s=kM+7$HT{sxODC` zoK6Rgm;aW^JXDhB%U8Q~6SmbsuK-ssUqCvY*}sNV<_wL;=VeclBnFC& z_b{kognt(y6;{Az%cPpJVof7d+y{q4DDrvOSWQhc;OmZ$h(w~;x3>=IL=-l~&HP_~ z4CD?qtf~0}PBrYw4CuBo%-)~y=NlOTe)=)F;HqIe<8*^jgpLp^RjM<xOL@4XzT2<23oe( z2bYN>tBM}rmO*Q_lr8JmQgIkp#maTXX4091R&Of#t4~)m_h8PZu&at0`vvCECKTVA RX`%oC002ovPDHLkV1g0Pv&H}b delta 1003 zcmV0sYywyRT@!HH?E|j zMhb#%s#4upT=)UH*V?AKa$!XfDp{yYMM4EjBZ*)|sUM-0QcIzVVEUzzCX>V@GwETqrXGsdu zA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnb zRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yIC*%Wgg22K|8E#!~c zTNYR~@Y9Kep?_ava@M;M8kmViU%_&qKVn19EJb6L%o<5ryPpl%8u^fhsfT?9!(e|z zYg7{msk{Fg=+Yccm!Y>{*q;KO>K8^PXf0r1U?zrb1;c^{Splu&<;=9>z4K+dat5se?oWZUF&sQo;?$JL1+gmMrdqaw4-)Uy6fE`VS`NRWHPm9hb$Oljeq3qzfzL34WA)&3E*EQj_ z#)s*NZh!yi@GmiUwp(6LfzxI2{CJ7UMd-?TP+;I{8J_M5c&a;WSjjcpVCBWnFDBgE zY1z>1fzN(l;@ioDEiIOtTMPkWDu!pahV1DHm#V&=)a||1#W682UO8Ff#AHHe&ajZc zxl(1kEaPYZ6hwubN6i<8QHgsu0oE)iJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+& zK7ZsKxz;@6=dLht@F-X3N(9#6>iA+L6@m3xzycB{LJO~c@)K`<_zg5y-Q>ju`fuOJ z$ZNaU+|lB5Y}R-@XC#dRJIOdB32iJUA<4bXt Z%s>0@A=V4gM}zoM^7g4liw74vQb24x%W+oA2y~ z6Q{3?di;!Z!i*LloB&l8g4F?vmLO&2`#&ie#}SrTY^2vtobuE-MeuL8tWjrD0dIUaZJfY~NoifFNr z1P&xbQGank5ZGi6kxH)77uGF?vJwwWnot1w`3_Dr2{h|Ye*juqJK<7eE03ZkGBeep zLw-}T+TaH3HwzM?7~*M2jFBA_Y)_cr6OYWvIL^XM5(5K#&8shmXVxs>&s8m9?&zLG ztCfd?WUlCucnu`r)uBpGLa_aceN z&vTIIM?zF)VV%oqGwkaR1|f$94@ip7B!5DbAe~}39N}^#NlJO1pSB#vtRsbxLUb(# zv-9=d@8R7KK8BrdZ-vDR9?CfWZbv7qdvP;VRaU@o*!}iV=I?IiEkpzuAc#Zf48pRX0?nDqMD}9D;~bg#{Bx5+O2^EiA~_$-*?yEJ%osrU0f!L(t!Ol?M*P5eeJ@tE(8SPOsrO z%y9$bCGqa)42;;1NqB$PH66($!hgNDK~i!+w(4C;cTYdtk;h2^`)+41-0A26uiH3l ziH5o%t|pX?u}unH2+q{S%gs<(Q3i@4bCWhAda22LE{Y%v7*3wP0;^WcHtf@4L#B7| zrxS4S$Z@ulTA^}k8Prr)B)+3Y496Zn)kvZr8PUVPoXbcQvzR1SE?WSdU4Pwhv9TG} zuX%L%mvrNL10gta>^zBnq=|RqUu{rXK0((fN~v*hiLaRDueqSeLq9Ld`dIm!eJ6Q| zh61FAOuP4~N zz=Lz`aTW)q_?6c)fV!qPFqJJbtBA(cQ6rOyi zmP@F7=Wvh{MVEjkY!siOc`Eii{xX6V#RFs;Tetea-Yo9RtrU%|KT(%jX9hpB(W0OR zI~h?QOV;Ubqa;C26lYS(BHO?^5@t18Bmkl%5dw~;#F8z@iMkxN>=b3G8m>_}*EcxM zZZ|HpnE^S`WXTi5K7W;^V6v-t#P8#-n+~cv(QuFx#WT@FVmWCd@s7us z8?k1t0~dMCU(QGeIZ;fa(}A;#gwcHxrB{?psZQs88ZaedDoagm^KF{a*>G|dJWRSe^I$DNW008I^+;Kjt z>9p3GNR^I;v>5_`+91i(*G;u5|L+Bu6M=(afLjtkya#yZ175|z$pU~>2#^Z_pCZ7o z1c6UNcv2B3?; zX%qdxCXQpdKRz=#b*q0P%b&o)5ZrNZt7$fiETSK_VaY=mb4GK`#~0K#~9^ zcY!`#Af+4h?UMR-gMKOmpuYeN5P*RKF!(tb`)oe0j2BH1l?=>y#S5pMqkx6i{*=V9JF%>N8`ewGhRE(|WohnD59R^$_36{4>S zDFlPC5|k?;SPsDo87!B{6*7eqmMdU|QZ84>6)Kd9wNfh90=y=TFQay-0__>=<4pk& zYDjgIhL-jQ9o>z32K)BgAH+HxamL{ZL~ozu)Qqe@a`FpH=oQRA8=L-m-1dam(Ix2V z?du;LdMO+ooBelr^_y4{|44tmgH^2hSzPFd;U^!1p>6d|o)(-01z{i&Kj@)z-yfWQ)V#3Uo!_U}q3u`(fOs`_f^ueFii1xBNUB z6MecwJN$CqV&vhc+)b(p4NzGGEgwWNs z@*lUV6LaduZH)4_g!cE<2G6#+hJrWd5(|p1Z;YJ7ifVHv+n49btR}dq?HHDjl{m$T z!jLZcGkb&XS2OG~u%&R$(X+Z`CWec%QKt>NGYvd5g20)PU(dOn^7%@6kQb}C(%=vr z{?RP(z~C9DPnL{q^@pVw@|Vx~@3v!9dCaBtbh2EdtoNHm4kGxp>i#ct)7p|$QJs+U z-a3qtcPvhihub?wnJqEt>zC@)2suY?%-96cYCm$Q8R%-8$PZYsx3~QOLMDf(piXMm zB=<63yQk1AdOz#-qsEDX>>c)EES%$owHKue;?B3)8aRd}m~_)>SL3h2(9X;|+2#7X z+#2)NpD%qJvCQ0a-uzZLmz*ms+l*N}w)3LRQ*6>|Ub-fyptY(keUxw+)jfwF5K{L9 z|Cl_w=`!l_o><384d&?)$6Nh(GAm=4p_;{qVn#hI8lqewW7~wUlyBM-4Z|)cZr?Rh z=xZ&Ol>4(CU85ea(CZ^aO@2N18K>ftl8>2MqetAR53_JA>Fal`^)1Y--Am~UDa4th zKfCYpcXky$XSFDWBMIl(q=Mxj$iMBX=|_CCB`U-1#g*s*hvgan+11Sky+ zN+2bKB+vpC6%r{zND)N6D6LRwMd6RC3j76?+CM6_rBD|G=hi%p$QG7Ih5P6 zx@2$r>w)dFzzIlTTKWVf(GjHCT`OTZ}eb;-^?SGq|Q{gL^0?Fzdn9lf$ zTodtyB3BdyP*iqOic|+)j}t~B31)Sc0?Wyr*-!=dt-leLceaDmX@{qN`DZx#zl%)j z-m-ZO+_`Eo>^*Q4w!OR?lBqP4dX2&|ab7Av$SHiyz9)n2K{6UU8x%aGH3V(KcwpmpsVn7tBY(ylJY{Y`w zl_gh|(~uq+0eeLdyhK!dPLTd3b^P-SJb zy-Q$odw*czyqVx2170#|u4=}WTzn`E>5(wq5UQe#9Zw|KJh0EJBUc#}HRLzhe-&J{ zGoY=d4vwAZV$xPVa3%Me=9;npiT=KvWfF|Ug3s$7`>&?6b;{952`4+y*amw<_d=0Fj@P%{J~Dd(0zFj&R)0z z$4*{?|9*BJ!jU*M)@S6qni{X#*<6{g=i;S)=Fd10+{i^T@Drs33&OZ_q9f}Ec>2lp zhU!Cu#P4&{t+}ZhmfbL$9+%0BJ8`O;=zqBx5+}Y$o5xE<z)%Xu6_;6^SIn@%fK zGzfw??i^Z8tY9Nw$h?lmv3)_z_IMNtq9nnmN6$e#!NyoA1g--bI%Vv3Hwd~<+~)C6 ztH~^g&g@qqc{A$Q!4FTE)}9_*$qkRhsQkp*oOi+}wG zKR2~a4P42^fv2%P1j48~B#;MZDH8I*J);3)mo8Fy`|iHOL{nhnGcE?MZ%Zp3O!vQk%=Gp&a3%K~QI`OfW z2cI2h6Jajcmgz0%P*G7>ioxRQJ3+!d&=%dgjpk`shL1K~9z4}Xzl!NIcnD#I(y>2!)K3i@j3v)_{^uWMr?ehV*DV(I%pl zc(DvQj1lN*<#I%X3Jzwufq!xsq--RY#o$)qpJv*E$L+|Ozcmp9gG1o=`Nm~F8U^}k zhr?kARR#-|3+RHEW`Y~JT1=}DUVn2ZJo~~n=v=Z0e)r-FV6zz~I2Mn?LytZQ$4{Js zXP(*$8`s^Dx9s#Ix5!`?4v)ZZUU~%{efU9m|AUX=jkkBhz3bN+u7Ce8e|wAQ(Q)|U z6OX}5FaH6)`SleL3|8bUt4}R86WquR6(RSH9lPOMYgWPIo4*H}2&q5)#S4bX#Z>SQLkk()22Q$ur813WNFMqN!cY<>I@!*$1^ zG5E>W$0@Oh?`*gWPJf&_Gv#|>1+Fo)LRfjrigEkb&YNSnZm-t^ORv9fY#(Lyyg9S; zme)f3W`i5KvaA#@lm`m2&XUnSNGBtsVR)5VZ=%fslFJVcPpBm44$B!sg}{y6#1zvt zQ?Wsa4PwIFL_%cp!crg;!c)-!@Pvr0wHf=|Bb=sAaU*vm5`QmVXaZ94Fd??M-xaO6 zX#ZL8R<{}I!F>ZGCEv?bz>VBXJp(0`SIFld8@yn=JRvw4=>w;)rfAtx?`5jsMlMEv z`$>-}rjlt$Mf=C)c;&)G?^r4}WQg38r+W-IfxvFkEC{e$ll(|R;}G9AyROyxmO?;vz_oA0zia3vQrU5t{e zIm|V55>lVv_IqNv?E|O7PDlLbe!gXl*z9#O^#|v}Ki}h%5Q5-J?#D+?!!Tyu_=?;1 z>I9MC@wnkfTONj|fAtbv?(Ks|9@+pi8)xLYGH;#e*ni z^dUW29~~MVftu=2&TD84PRv~|hIan=+Iywna2eoE?v=hU?Llj9yRKk4$rYdm#6%>L zDR4S-`+tQcXMVTlTe}Z&?X?I?(q3MF`$Iag6&lr%C_$9S05#sS!wmCCG&ZSxlpOO` z=XR3g3wd?>2j$)L6krLt=PzERYT4J8wB;>>#M@j!*t2UV*oX+JC8D4*=%>fKd#=El zb6wEaKM1{7`r&+64>(*tcw+0)oOR)s!fG~rDSxnRF^jkNd{U5Hgxg;O%a<*IH+SxX zKfSgShQrxOB2PWLjs7+_)x*l0m%`l}zMZ$89q;nf5cIH&+(Sps(A4=tzEvEYDr=kJ z{*8CQed|}lg|2S6d<88x6@tM4G}hNr4FU&0r#H7qxX{(dW&T4hSVk`DoTtxTrjxA; z!GGbYf;8qVkgcV;k#2ejf(=~3ro8eSb!)3&=>kGs-2+9*MbbQ#v#75j6(6PvA*lai zua+EMaCoZ}Gt|#$hSB{e#9_e@HNrh+C;R-*vU*YgoZja$_;}*@oD&(Sc(d z)p`3l`EGN;QgY=yQ&GzSC6^c<8o5yuUVorbSW2#BW0%y7#zq=bP6de?9~xw3>an|W zVJW#TSNS1s8J+4N&}2P2(uu_QaA$oFm==}dxKNuOmXfQ@&n*X-N~)$4nUqqeZ<1FG zbJWa`?M7fJx%$;S@UupFiMhC?fR-ZdHxxo1RnVwygB!&FrUH5CWRUsqNe+KM4o zz|tjN{XUm&U!c>X)Krwtf1oimq5;r=W1i@O5!BV@P9x<3%gFV(oix=`4?1nt;RTUw zbn%O!iUjEx?eod+EPoG)8-A!$en#nu2dv*(9z1TEq^^MBX_~v znZ*k+LdWa|Zf)sd3At{UgFG<5-qchdqSK>zOs3Yu5^}Gd+caryMl*p+6Sfo4z-!?k z4VI9Li(&FcM_c`ugIru&j5p?5Aa}Wwi*tbWYnPh`m9DR=C5y~yFT6688Q@Otl0_}1 zEo+6qusW`)kCOq>=_3U)q<>b20@QJi>+SLae{vVLm|DLQ4}(ewMu)rT&gPHd`$W0> z??b0dZC?-msn0u43<{!d@x`8mKq`n?0}C x>1g9?sc|KDZo7FSHjP#kiCDCAG`SJ~2dTjad4;699smFU07*qoL^fDmF(5(5$|?Cx}D zKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q?YG}tx;sY@GzV#^0C$Z`m}blr)&(OPMHT6T@%AxHOWYGG zm>@=0?<)?0r0XK9>leRXyD^j4O4bXT!@LESVI<~>`yB+S2b_f__vvyMHkwGyyXedq3usx&X*}E{O;}+nJ#G_xm zJbQX5 zuFrVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~ ztSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Yuz!}~S^-;|MX;9Py1im8!}VY-!u4P+ z!nLEvx?+Rogo+Kw9OBXy&lGIvJ51_7Hl6Q>*MAJa!lMDGGML530`Te&0ciU({DC7` z;RKg{uC>($*mdXnVQQBjiVyqYC7mf!Z%e-Q!?Oo{ufu`G3CAC=UjiTpU<94UTFz2KEDuNS@KKkg)K8!v1L8RUP$_! z({LG$Dy&JLEVpiNVe^G(HCbA*SpsX?292)#=JVQDUMp-cOJPl`+yTHTD!AOit-zAD zptXYa!q%OVLa^mo25b7^Z>kE`3rqgr-G4i;Lw<+P(8khESW8aaBmxfY`WS#6j<92Q z-++&Y z$gbH4#2sT0cU0SdFs=*W*4hKGpuR1QGacHFy;`# zR&NJkbTNp}Ee5f08HmLzK%D(q3@lH;Tzx$?VT;&xJq-KyHV__o3dD)?KrE<6*iXV0 z8;6<{IKw@dyDwJ90H5^3h;|9?twz{UGr|>1Pzhdn6W(r0ifeZd=JI+AAz<~yL(QJk zAWW))+=`8mGj|J!70oF@d4B;WxB=jBM1bWWRBb&1!ie3BUzOdm}yC-xA%SY``k$rbfk;CHqifhU*jfGM@DkYCec zD9&E@F9*za0?~OQZiDE|Cf;;0 z`uZ%H=IeGyG^H0ruev{yIVARgwZUG)j7>F#3~dh+8DOtPByR=(VDhz2enf#EjcXCI z=NUPYr4@S)GhX!?s(0Eh(nGe!y$#$r1B$||I~`wPhUuCQEo;#Xb$EXk=6HgBBRd#c ziK|jN$e~{zV~|;*E@Ij-Z(+tI^B8RW51ptE!nMnPyZ`_I07*qoM6N<$g3#}a{{R30 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 2ccbfd967d9697cd4b83225558af2911e9571c9b..7659453f645b8c7ac735fddc884cf72f443a2cee 100644 GIT binary patch delta 1303 zcmV+y1?c*N3aSc_B!BTqL_t(|0nM1%ZyQw<#y`)D$FszaohEe>vbkAWlr)J*DMGCZ z0YW@`!9CcYV(1m66G0 zkxXT5$EX@`^pz7h^YY`kF?9zYe){FE&%XQC^XNX*hz~yb0(V!V&I67NAH$nxPMO~` z*<9J@1AY}vK|elze+2J+^f?Tp@?B*cP;?7;?et0L8Cot1luDOhHntVA@fZ$=4&ssi z4*Yp}#yP-&zJE4&Yh=XdXW{nMBCTc1`lyNrxnvSrcojqaA!h-*I)cchQ^+OaCZML3 zpFx%+Iwew;d|I08Y{jz;SQn@>dM=I@B$^uo@Tw9xo}*dKBD@~Q?7|9`S0Zq^T+lTQoPS5c^4z+!fLWR`7LXaQs2J>P zpig^wNAeLA1y`uNR7?5{G?zL z`7R@6vzyokY;UaxCyM#sMvekA?zTa ze+zIU8pZXgX-v<|nSh1H6w41kU4*Kt7#chZo`1JGNR8^T70))HN8EC8yWMzu>~(5) z**uh?XU(EasZICZATX{d!#y6ivw(%YSC*uE&>}LaC{mHz79bh#Rv-sjsr3~DWisXU zE+*-^ktle2jGRA13pHXSwLZq6*=>h)D3F&lVMIL)Xn~XQ<&t1TaFFZlAic}BuBHwf8 zFGJVu9U^T5CX$*NXk_@&{1{I)aMJ>Q9}cy*SmVOhcr2d6SKt0>H(YgxrmxTbj+dSr zGBeZ!5fv=b-nzB0fYr4K#wV^J9FE|z6Ms)Zt+#x>`EJ}+f!-6~^4$&G_~#CKk61Is z%1EfY7txJ%JlqpPGMUCPD$cDPoq3<{f1Io)RQ2cLnfc{BATzgAi-Dn&=sg-Yg@dRD z=xWVycs+*2C3{MG&w#Oby688XMYmjQehN+3;Z;m|sIK5hh@TKE;BS0oT)6 z>czstt!Bwfl&E}?wM69vuF@pi1MCNO0)IV#%ludY7y^C(P8nmq zn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^ z0;J00)_^G=au=8Yo;1b`CV&@#=jIBojN^JNVfYSs)+kDdGe7`1&8!?MQYKS?D#s$vI-^)!+G(}fY0@GZE%Iy@h8^{To?*ybtdaV z#dGpubbrm88$G&G)t}RfNfHWj;miff!TI4N-053E5yn?^gn~>Efgal6v3aRQH6&5h z5RdxeaKF#Z3DF+wT}ipqw*r>6L_o>H)_@;IH+E!`$CjnG=I69xv5?4rFE5T<_4z9k zUE13=6Yl7M&)0VYdRh(na56)ifvXBQ9rBHSpMOyB?&C3B2(E?0{drE@DA2pu(A#El zY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEUghdWK)^71EWCP(@(=c4kfH1Y(4iugD z4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ!)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup z8Gny~yBS`4IM3Ejiyx@r7k6FNj3I&(u=gRCXSyuIdEq9`!w_5#8|1lh<}9zje~vrj zSvOi;kBKp1x_^6dt;HYDvVDC|!;npFnu?Iwkp16`aq;61 z(bxp^tR-32bxI*$q^qN~E=WtXi*Lvr13@UdTP>e%gS9JH6E0gj#d#qJ@j6<$^6L;U z96QH9<5?VA^D`+63@3jYg0zM}Vnuf+7mvTh#+B{(=`1atgKG`0V?kn3XB$_3zkkE- z<6kn8$>UfOK*JmOBy6`wGVJO*%iu3V&@!!@aV?BzS+#yS=il1R z>g7u?fH5<|9S}wLf|2wx@ELQ^JW3#kM*rj72*DX61F^` z1H57+xxlx;4(6i$CY4j99!ubU1ZbWz@uFLa`oyWZf~=MV)|yJn`M^$N%ul5);JuQv zaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$NIIaX+dr)NRWXcxoR{>fqI{SF Z_dm1Ylv~=3YHI)h002ovPDHLkV1hr7WrY9$ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..4bea30564f28014baff26d780c5a0b6b751798c7 100644 GIT binary patch delta 2895 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 tMHc&iYWk~u(R#SiPYTFQtfgmaf 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 it`(xUr^RR!3iAIXQoFh3q0M zFesq&64WThn3$;G69TfjsAv=f2G9}pgSx99+!YO}2Uveik)GA5ewEg1Va|1@=x;Pyj3t}zC)T-c zzoz+u9TyK|)jteh(` z;D6}gLagCR0hn*76kN#wCv*`b8GyswI1s7kNaT!{fEXv;5ofK|nu3vU_1cRKLBd@TQ@Ei6F6QJ?HM!O!+{x(L<6rNAv)=55QOzlPWhqI{ zjSR5c$#aW1xy}c;$06La(Y*xlX>0w3EDGGn02k}7*%ZplRLFsw%E3MJO@BuPkU#Ja zcbp(_BL!RxGHHe;wff^+2G>u>ah(dq7O)#K0ekx={yBF*$P%aJSOMmjHHmAxvW0cp zt8@K;ETVH`1(=8Ie(Z;Hy+9V#xv>Mxz*+%0w;aeKJ2#eqVJL7nrpksp7|5bKS2)0a zId?FSYb0>4P=MLsl6(J^Q-5;@54jg=+fq2sO~Hz-hVXEO0L<$0j+BKdGX;Npqt{os zJmk~Y_Q1L83|RfW)5G^!;(u>i7{EI*HIqAp9`Cbzna*hHhI2Lm9I{{?%y{Hgdzxli z7Fd?00Ed;L$qk&zI`y$@{Dn;5j(iW`=!aXNV*G=kjb8%Qi`UtJMSq7ZT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah-w13P)xT`>~eFoJC!>{2X zL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw>F+gN+i+VD?gMXwcIhn8 zrz`>e>J^TI3E-MW>VM=sWZual)ns9B%8_$25BcpOz+KP;+J(1(UiAp*Q=dc!FQL}*R43bTaVm7wy#IrC-VD&k-4FWYMd;wg6!1z8a3SP;O>P#-$->_l zEAM2>hI~v3$Y(TlIdJE^0@|6AK_7#uc{~E1^f2gGJ^}i)rGJ>FDPRt4F~}m-WGQZK zw?8N6;NJH#XeW;Webf!0kG=!+v2#G5xX^L14Y#o*Tz9&z7NjOib92f(6aq==Ntoo74a!u6w~r!$mq|FDi7h6+6fTa4$$0Y>@Y*O}J#< z8ic&ucAQ^e_cw)#3uFTLcly|p7IMmPAXha6205mSA%EQja0eR?DV=N%;eS$2zHI*MpiObUuA|j7`m5?j`@^G6SO!-;(G1aCOu{sGli$ zGck~Eqx{gt?U$`9P3JRJO>}Ku- zRew#6AKb$jGi@lro`A;#P%m@cnyJP&(r%f}Zq^V3mIc=hnLfVXHRn=pj;2#4v8WiM zav|%So5|ksmkM-bV7H;F_%f>b72G`eFJ!d@wTC-#ALO^GRCtHl=K|Y}dX%fTm0A$N zzc4;N3AGsYM~OOND&T_#%8wZzWYfL@by`|620=mAU7(LZ-At!cdlWCvu@AK#bt~#< z9;~k^d5}}7VXmK@h?&@_rUHYJ9zD=M%4AFQ`}k8OC$9ssPq=LnkwKG P00000NkvXXu0mjf*J>J% diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a6d6b8609df07bf62e5100a53a01510388bd2b22..a64a28dffc984ddbd57f89080dededcf2a506d18 100644 GIT binary patch literal 4548 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 it`(xUr^RR!3iAIXQoFh3q0M zFesq&64WThn3$;G69TfjsAv=f2G9}pgSx99+!YO}2Uveik)GA5ewEg1Va|1@=x;Pyj3t}zC)T-c zzoz+u9TyK|)jteh(` z;D6}gLagCR0hn*76kN#wCv*`b8GyswI1s7kNaT!{fEXv;5ofK|nu3vU_1cRKLBd@TQ@Ei6F6QJ?HM!O!+{x(L<6rNAv)=55QOzlPWhqI{ zjSR5c$#aW1xy}c;$06La(Y*xlX>0w3EDGGn02k}7*%ZplRLFsw%E3MJO@BuPkU#Ja zcbp(_BL!RxGHHe;wff^+2G>u>ah(dq7O)#K0ekx={yBF*$P%aJSOMmjHHmAxvW0cp zt8@K;ETVH`1(=8Ie(Z;Hy+9V#xv>Mxz*+%0w;aeKJ2#eqVJL7nrpksp7|5bKS2)0a zId?FSYb0>4P=MLsl6(J^Q-5;@54jg=+fq2sO~Hz-hVXEO0L<$0j+BKdGX;Npqt{os zJmk~Y_Q1L83|RfW)5G^!;(u>i7{EI*HIqAp9`Cbzna*hHhI2Lm9I{{?%y{Hgdzxli z7Fd?00Ed;L$qk&zI`y$@{Dn;5j(iW`=!aXNV*G=kjb8%Qi`UtJMSq7ZT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah-w13P)xT`>~eFoJC!>{2X zL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw>F+gN+i+VD?gMXwcIhn8 zrz`>e>J^TI3E-MW>VM=sWZual)ns9B%8_$25BcpOz+KP;+J(1(UiAp*Q=dc!FQL}*R43bTaVm7wy#IrC-VD&k-4FWYMd;wg6!1z8a3SP;O>P#-$->_l zEAM2>hI~v3$Y(TlIdJE^0@|6AK_7#uc{~E1^f2gGJ^}i)rGJ>FDPRt4F~}m-WGQZK zw?8N6;NJH#XeW;Webf!0kG=!+v2#G5xX^L14Y#o*Tz9&z7NjOib92f(6aq==Ntoo74a!u6w~r!$mq|FDi7h6+6fTa4$$0Y>@Y*O}J#< z8ic&ucAQ^e_cw)#3uFTLcly|p7IMmPAXha6205mSA%EQja0eR?DV=N%;eS$2zHI*MpiObUuA|j7`m5?j`@^G6SO!-;(G1aCOu{sGli$ zGck~Eqx{gt?U$`9P3JRJO>}Ku- zRew#6AKb$jGi@lro`A;#P%m@cnyJP&(r%f}Zq^V3mIc=hnLfVXHRn=pj;2#4v8WiM zav|%So5|ksmkM-bV7H;F_%f>b72G`eFJ!d@wTC-#ALO^GRCtHl=K|Y}dX%fTm0A$N zzc4;N3AGsYM~OOND&T_#%8wZzWYfL@by`|620=mAU7(LZ-At!cdlWCvu@AK#bt~#< z9;~k^d5}}7VXmK@h?&@_rUHYJ9zD=M%4AFQ`}k8OC$9ssPq=LnkwKG P00000NkvXXu0mjf*J>J% diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..615ac3bf4ad4aa034a79b6206e2802e7795a0771 100644 GIT binary patch literal 6954 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..4cf84ab14d187ffb5cce31cfc7773bc790e03e8d 100644 GIT binary patch delta 2756 zcmV;#3On`S4$BpgBYz5#Nkl7Lk>bnD2<>I zZ9+lNAT?4;B`A%k6rd7{RH<#G9z?WK5S6N;3bksLh(Cx5QB|ryODRDprG)|^XA>o9 zV#jBk_}KN{J3G_&z4cz+nLRx7CUV42TFvgxoA15-z3aQ)ihtX7{z8S%Q8mPy-GIf0 z&k3s$H-)gio+YrRZ#kSfKLqD5jvA7+x_2q8zikB^`TKF04aZGtp*}1n41e4+yS78m z%2xXM^56vQ{{9~f$^0IX*G=R-@a6Te_xV4<@Ys|YP1S{Egl*Zp3ij@K1Z<*^`_5() z$~;jWmb5j}YkzB?9`^s_QF!JD2Vf=?H7r*TmJrs}5r7{(yQ7FKL})fw!68 zxWKRNU!MCcN5UYu+`w@hBvY~>*-odFd!G!>056Ilx_>?J(ES@0FJarauBGH4kgVv? zAh(mWA1%27%aJObPe;>s+_ZpI|2d0EI zHD(&EDrr#S1uDecnwCnX4au+fxij*~h*FY?{0*{m7OER&f+=Ahw}W1lWU=~y>ls2$ z8zU^+A+$5pIj0Nh42~BJk6t}6B}|&r$Sm@FgZIKxMFQw zaDTe!HT#3Bg-A@Ru8tP^+VRzm`5Oh|Q8rHXa~DPy)aHt9U?O!6@kD0oaYEjP6kIOg z?RLFK76eYrk4}+T5ywvtLe!wyr3a>jg(DgN6er}Xks6xvQ`ICONeJu+UXtK%M^Bn6 zzo;%|k_jfRXLK)4%v8hMBoI9w)9c}FHh+-(&7@;^x;cFCp9`kfkp)x22CiPGUQn;c zL3-Z-j+R!_M^_g1re=CQ{jYOHJE_@VN?4lcThUm866Wq$$&4&SR`%VSR#6)>97$Ao zVqsuPSZ8|xTADMqq$XLYZkSA>T@qpA`jzlL8EGuQl(1z5wxkx)u_@qeWY@Gg%YT-u z741v?rphbCO%1ata)M~|B3W}%MEOh*rL&G~5XMywmQ$Z8VIyPH39GfI>D0?kKTfE5DrQmdTdain^a;bY>i4f4 zB9=e|p548RtYy`aGk$FXUi#fZ*nZ!=@TDzZ&@AKgE>^v7w}l*K4j`R|vLIqcS55$@=vR`-nBL9QN$p zR~2DHBcm`o8-@eFc@f_K;6r%*&qrYQuE$Esd0ghYj|#z*FsDO%!A_-8@ZBfA1#9|y z>E}I9KUtN$Fqyu;{P~YT6n{my@7^uM>}u95=g_Iw3@{~3)p1SRY&Q7f=Df$Wzqh;O zIaQJAPMHa6*r@j2-`kTbgP+%|?$wkpnUEEv2evM1xwfbfMw1fZ2}nh!32BATa$s}% z!0v4&n`q@G*II8aU`kjmk!_4!My9UhOr?2uAr+eeIS~Q3zXSLR_J3y3gfuEWFePky zCQ?;7oPyDrAsw;`$|)&QZkUi(-nTY>ZKkGn)&i!4VM=B-NGBtZPE;31R8lcWlb0yz z>sr;;yAUuX?8KP?I(jO(TX3pnkxI#M?8D=*v@HPLo$W+@_yjIo8h|Gs|2hq`A=0U6 zS;9`79W>_$Xn?tU=YPu8>lNdVs*?9=*lZ$r+%9--|I6TZxgZ*g!E--+I!6{QpVnU+ zuMXc}7Q{s`cObs~-YIzMiLaC`GhhAKe8(Di{F`5cgRj0pt`9@^%J%tB=*oKQA14;t z)T+Rqu%jp8+uyjSC|htoIIdK0+OW0{4%z<-4{p1sv^=k!R(}u-Md7V?7dc@VfyQ3n z`S4x(jj+3k+EDDB4G|NlzD_&G3(ITamDi3zJf70LXBI5+>Hq1?kKvIA?krk|iW-4_ zFx(glrlvw8N~L9aK_YsXqvZRMu_<`-ozF~bvmPuV?8f9Q9R256*uHh0=6&>gaW*fU zIe8o!8-3t!tbYfW!vT|1L8`S+2SYG1F-bO%QRwbl2b%+{N@TqLmybYE*dNTZENXP* z?ay=xL%4md)W-bnfx~eA;uWylB|?@AkL}(|H-(mfA0E1YE8MxM)CY#s{@r6|SvEfh z%LqGvX_RXIdOk8KfVBo z1lzSM3rpjY7cY+!m7z=bJ`$qHacK4fc@;YbMMoV-9&L9Ht3wQ0u#~W|iSjlcu4S&q zPGTyB$ty;~Zx}riBsY1vbS;KUm#?vCt|lxcteV4ENDA(nbmuICLX&H}LPwYhO9@Mv znAt1`hkrrzEd@EP<}w|vfTe`ZKY6wgD9I>w^JH~4md-*gSV~wmnbLYlqa{F0C?zpV zqv5=>A+x^myooKW3`+@f8;Is`f}KXf1(zRqTVB)0Q@u!9T49%USO`lAt1E~XrsE;< z!(BxQ!{xy1_`h)BN4e9%>b$!~VJTt0f}95>Hh(kcn>XGB%;C7@3B$w_T$coQfEw92 z-6{n)^ngch{x@KaE@mxZ1yhoD)`Jo!#&u|P&Qn2@RNt}%We*1Yb!IlREG#7~d%6vQ z#LyHcV)7taa%c=A8~`-IPQ@Wdcf)EBXubsrLxQyaS%4F2;_>9ABb(E=TCk3=Dzto59rVahM!=k~)vL^#CNycqUjBq!cV`Pz!u}7yvQn&@iTyVK0000< KMNUMnLSTZyr8#5( delta 1874 zcmV-Y2d((a72pn#BYy`cNklx~L`~4d z)Rspd&<9kFh{hn*KP1LP0~$;u(LfAup%fx&qLBcRHx$G|3q(bv@+b;o0*D|jwD-Q9 zuQR(l*ST}s+uPgQ-MeFwZ#GS?b332?&Tk$&_miXn3IGq)Ab;WSyQ!vAt)@Ccb&;xv z%AX@*_j-xyC{+_x1Jy90eS@gHl9`eOYAn?ns>{f~a)oLg)i}Mj8-?Z5uJ>q_5#bAD zs+e{qIS7a(wLvT!sO}RPqyuZB*5&w@L~|675r8qFZOn01hM)stdt z(}AUD*+MA1yMMAWR~H%&a`aj*kR~YHLIk%}CkzB^7}YeC>Z%YF3%$siy4gUWO|iV9 zyS{R3%u=2p$xI}(n6@d|Wn+c7k}2 z((AD!&VxpxR^A?&MN{;FY6cOn>|#gvx^pnz;el1jsvqQz}pGSF<`mq zEXRQ5sC4#BbwnB_4`c5bFE-Gb#JV3tox9fp-vVEN{(tOCpR zse`S+@)?%pz+zVJXSooTrNCUg`R6`hxwb{)D1R`!oJBH}D}dSIti0)xc5KlQ;k&Me z2>uPHr)yMQ5rWI~9($t>0^<$2oJD8x2jY(b@BSK5-ZeHH4q-;SalJr4Uv)5qxyQl^ zKr6bZWCj+~xn6>qN5aY*W~-eg!g}X;SotjbKlUcusA}8P7rC$h7*?ESRri+6cEyu7 zWPjzUS7|qw9as^i(e+yWM&5Yy?_fs@8h;Aox&})oF6feHdx&y#6|KggrRyvPD_!^2 zWf4|JL7&g++36T|jv*B^GqCDS!kUvMSQ$?%`k)a7T4g`bQq8k?qe61#uo|-n%aVy} zDyOB|R_2Xj$C20|!eLEyAuP+5M#)a&(0}Su>}T;t_0TyI3)n+9`|(su5H)S?gk|aC zJK1S$^ei(3izu+}-QvfnodFEr7Qo|sf`$eWJ7ShC+dG|f^kiM?ecBBp2AsuUJ+dQ! zhqedsFjcVuXm&d*>l=s{{6rb?j5v$K;z|Y0DOg$CqV8|;Jdm@J6^FLB5870RVSi=y zB?##U+(6Fi7nno`C<|#PVA%$Y z{}N-?(Gc$1%tr z4Pc}}hm~yY#fTOe!@v9s-ik$dX@ALH?I94Q-n;}RcAsCmWQ^Wv3|h(79tw+~Xv3fI zRWE{f+Db?hm*K^w`_(#S`=Qx-+$ov{v_4qp;j35(scH$l^-UN&qX|;^Qpcd#exS|> zw36>AtbIVy=YPOgHV@LIPvEUx1yAi~@YJorZ8O%Y(3aT`&5r3f6-*VjG1;+h4Tq418njAdPz!-tq zpPUVE>3kJZeKXbCeqnLh*?&D5Fvowz7S-k)Z70s-4mJwbt%Hw3@YJqO3G07OOBg*# zR)F2qStmOO?d(4o(m;x0Wlqr5?09S>x#%Qkt>?(&XjFRY}*L6BeQ3<6XEBh^S7>AbwGm@XP{R zkeEKj6@_o%oV?hDuUpUJ+r#JZO?!IUc;r0R?>mi)*ZpQ)#((dn=A#i+|E(0h@Z5l}YZL#eq00sELYLBA#NZ01}gr6>{OJDZ*4ElXLIz zghey84@Yi6Qy8!^TQ@Hv`Vy{v#0RPZg+>Hei&JH(<4#+s(~k?Gh~a3lkgC*^G94+s zzNW=AUQs^BwwPcH7PH0UZvX%Q diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 6a84f41e14e27f4b11f16f9ee39279ac98f8d5ac..efd7a04d6698a594bd42cd2dc803c9a7369d08b2 100644 GIT binary patch literal 5820 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 delta 3291 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 N002ovPDHLkV1gGIWt9K` literal 3612 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 iW8 runApp(new MyApp()); @@ -7,19 +8,9 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( - title: 'Flutter Demo', - theme: new ThemeData( - // This is the theme of your application. - // - // Try running your application with "flutter run". You'll see the - // application has a blue toolbar. Then, without quitting the app, try - // changing the primarySwatch below to Colors.green and then invoke - // "hot reload" (press "r" in the console where you ran "flutter run", - // or press Run > Flutter Hot Reload in IntelliJ). Notice that the - // counter didn't reset back to zero; the application is not restarted. - primarySwatch: Colors.blue, - ), - home: new MyHomePage(title: 'Flutter Demo Home Page'), + title: 'Vikunja', + theme: buildVikunjaTheme(), + home: new MyHomePage(title: 'Vikunja'), ); } } @@ -70,10 +61,47 @@ class _MyHomePageState extends State { // the App.build method, and use it to set our appbar title. title: new Text(widget.title), ), + drawer: Drawer( + child: ListView( + children: [ + new UserAccountsDrawerHeader( + decoration: BoxDecoration( + image: new DecorationImage( + image: AssetImage('assets/graphics/background.jpg'), + repeat: ImageRepeat.repeat + ), + ), + accountName: new Text( + 'Max Mustermann', + style: TextStyle(color: Colors.black), + ), + accountEmail: new Text( + 'max@try.vikunja.io', + style: TextStyle(color: Colors.black), + ), + otherAccountsPictures: [ + GestureDetector( + child: Semantics( + label: 'Switch to Fritz', + child: const CircleAvatar( + + ) + ), + ) + ], + ), + ListTile( + title: new Text('Namespace A'), + ) + ], + ) + ), body: new Center( // Center is a layout widget. It takes a single child and positions it // in the middle of the parent. - child: new Column( + child: new Container( + padding: EdgeInsets.only(left: 16.0), + child: new Column( // Column is also layout widget. It takes a list of children and // arranges them vertically. By default, it sizes itself to fit its // children horizontally, and tries to be as tall as its parent. @@ -87,22 +115,22 @@ class _MyHomePageState extends State { // center the children vertically; the main axis here is the vertical // axis because Columns are vertical (the cross axis would be // horizontal). - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, children: [ - new Text( - 'You have pushed the button this many times:', + new Container( + padding: EdgeInsets.only(top: 32.0), + child: new Text( + 'Welcome to Vikunja', + style: Theme.of(context).textTheme.headline, + ), ), new Text( - '$_counter', - style: Theme.of(context).textTheme.display1, + 'Please select a namespace by clicking the ☰ icon.', + style: Theme.of(context).textTheme.subhead ), ], - ), - ), - floatingActionButton: new FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: new Icon(Icons.add), + ) + ) ), // This trailing comma makes auto-formatting nicer for build methods. ); } diff --git a/lib/style.dart b/lib/style.dart new file mode 100644 index 0000000..fb7ce07 --- /dev/null +++ b/lib/style.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +const vBlue = Color(0xFF455486); +const vBlueLight = Color(0xFF7480b7); +const vBlueDark = Color(0xFF152c5a); +const vBlack = Color(0xFFFFFFFF); + +ThemeData buildVikunjaTheme() { + var base = ThemeData.light(); + return base.copyWith( + primaryColor: vBlue, + primaryColorLight: vBlueLight, + primaryColorDark: vBlueDark, + textTheme: base.textTheme.copyWith( + headline: base.textTheme.headline.copyWith( + fontFamily: 'Quicksand', + fontSize: 72.0, + ), + subhead: base.textTheme.subhead.copyWith( + fontFamily: 'Quicksand', + fontSize: 24.0, + ), + title: base.textTheme.title.copyWith( + fontFamily: 'Quicksand', + ), + body1: base.textTheme.body1.copyWith( + fontFamily: 'Quicksand', + ) + ) + ); +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index d204c66..2922856 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,6 +23,16 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + flutter_launcher_icons: "^0.6.1" + + +flutter_icons: + image_path: "assets/vikunja_logo.png" + image_path_ios: "assets/vikunja_ios.png" + android: true + ios: true + adaptive_icon_background: "#FF455486" + adaptive_icon_foreground: "assets/vikunja_logo_adaptive.png" # For information on the generic Dart part of this file, see the @@ -66,3 +76,10 @@ flutter: # # For details regarding fonts from package dependencies, # see https://flutter.io/custom-fonts/#from-packages + assets: + - assets/graphics/background.jpg + fonts: + - family: Quicksand + fonts: + - asset: assets/fonts/quicksand-v7-latin-regular.ttf + From f25b3ebc72e349f676276dc2da46eeb7031a1188 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 15 Sep 2018 16:12:38 +0200 Subject: [PATCH 03/99] Add gradle wrapper --- .gitignore | 2 +- android/gradle/wrapper/gradle-wrapper.jar | 0 .../gradle/wrapper/gradle-wrapper.properties | 3 +- android/gradlew | 100 ++++++++++-------- android/gradlew.bat | 14 +-- 5 files changed, 62 insertions(+), 57 deletions(-) create mode 100644 android/gradle/wrapper/gradle-wrapper.jar diff --git a/.gitignore b/.gitignore index c6e5cfc..9d87b27 100644 --- a/.gitignore +++ b/.gitignore @@ -177,7 +177,7 @@ fabric.properties ### AndroidStudio Patch ### -!/gradle/wrapper/gradle-wrapper.jar +!android/gradle/wrapper/gradle-wrapper.jar ### Dart ### # See https://www.dartlang.org/guides/libraries/private-files diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e69de29 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 9372d0f..933b647 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Fri Jun 23 08:50:38 CEST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip diff --git a/android/gradlew b/android/gradlew index 9d82f78..cccdd3d 100755 --- a/android/gradlew +++ b/android/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -6,42 +6,6 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" @@ -60,6 +24,46 @@ cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" cd "$SAVED" >/dev/null +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -150,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat index 8a0b282..f955316 100644 --- a/android/gradlew.bat +++ b/android/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line From e1d309c97a38d872ec2b06df74967ecf03d1e544 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 15 Sep 2018 16:47:37 +0200 Subject: [PATCH 04/99] Fix gradle wrapper --- android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54333 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..99340b4ad18d3c7e764794d300ffd35017036793 100644 GIT binary patch literal 54333 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 D&=%~j literal 0 HcmV?d00001 From e15f11325a89d2110aeeac0af7749804edd4b401 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 15 Sep 2018 17:01:45 +0200 Subject: [PATCH 05/99] Refactor drawer --- ios/Runner/Info.plist | 2 + lib/fragments/namespace.dart | 24 ++++++ lib/fragments/placeholder.dart | 23 ++++++ lib/main.dart | 130 ++------------------------------- lib/pages/home_page.dart | 77 +++++++++++++++++++ test/widget_test.dart | 4 +- 6 files changed, 133 insertions(+), 127 deletions(-) create mode 100644 lib/fragments/namespace.dart create mode 100644 lib/fragments/placeholder.dart create mode 100644 lib/pages/home_page.dart diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index a6b54e6..66b2447 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -4,6 +4,8 @@ CFBundleDevelopmentRegion en + CFBundleDisplayName + Vikunja CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/lib/fragments/namespace.dart b/lib/fragments/namespace.dart new file mode 100644 index 0000000..28ebaeb --- /dev/null +++ b/lib/fragments/namespace.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +class NamespaceFragment extends StatelessWidget { + final String namespace; + + NamespaceFragment({this.namespace}); + + @override + Widget build(BuildContext context) { + return new Center( + child: new Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + new Container( + child: new Text( + 'Namespace: $namespace', + style: Theme.of(context).textTheme.title, + ), + ), + new Text('You\'ve selected a namespace!') + ], + )); + } +} diff --git a/lib/fragments/placeholder.dart b/lib/fragments/placeholder.dart new file mode 100644 index 0000000..d203541 --- /dev/null +++ b/lib/fragments/placeholder.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +class PlaceholderFragment extends StatelessWidget { + @override + Widget build(BuildContext context) { + return new Container( + padding: EdgeInsets.only(left: 16.0), + child: new Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + new Container( + padding: EdgeInsets.only(top: 32.0), + child: new Text( + 'Welcome to Vikunja', + style: Theme.of(context).textTheme.headline, + ), + ), + new Text('Please select a namespace by clicking the ☰ icon.', + style: Theme.of(context).textTheme.subhead), + ], + )); + } +} diff --git a/lib/main.dart b/lib/main.dart index e7c0dcd..10d3914 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,137 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:fluttering_vikunja/pages/home_page.dart'; import 'package:fluttering_vikunja/style.dart'; -void main() => runApp(new MyApp()); +void main() => runApp(new VikunjaApp()); -class MyApp extends StatelessWidget { +class VikunjaApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new MaterialApp( title: 'Vikunja', theme: buildVikunjaTheme(), - home: new MyHomePage(title: 'Vikunja'), + home: new HomePage(), ); } -} - -class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - _MyHomePageState createState() => new _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return new Scaffold( - appBar: new AppBar( - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: new Text(widget.title), - ), - drawer: Drawer( - child: ListView( - children: [ - new UserAccountsDrawerHeader( - decoration: BoxDecoration( - image: new DecorationImage( - image: AssetImage('assets/graphics/background.jpg'), - repeat: ImageRepeat.repeat - ), - ), - accountName: new Text( - 'Max Mustermann', - style: TextStyle(color: Colors.black), - ), - accountEmail: new Text( - 'max@try.vikunja.io', - style: TextStyle(color: Colors.black), - ), - otherAccountsPictures: [ - GestureDetector( - child: Semantics( - label: 'Switch to Fritz', - child: const CircleAvatar( - - ) - ), - ) - ], - ), - ListTile( - title: new Text('Namespace A'), - ) - ], - ) - ), - body: new Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: new Container( - padding: EdgeInsets.only(left: 16.0), - child: new Column( - // Column is also layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Invoke "debug paint" (press "p" in the console where you ran - // "flutter run", or select "Toggle Debug Paint" from the Flutter tool - // window in IntelliJ) to see the wireframe for each widget. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - mainAxisAlignment: MainAxisAlignment.start, - children: [ - new Container( - padding: EdgeInsets.only(top: 32.0), - child: new Text( - 'Welcome to Vikunja', - style: Theme.of(context).textTheme.headline, - ), - ), - new Text( - 'Please select a namespace by clicking the ☰ icon.', - style: Theme.of(context).textTheme.subhead - ), - ], - ) - ) - ), // This trailing comma makes auto-formatting nicer for build methods. - ); - } -} +} \ No newline at end of file diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart new file mode 100644 index 0000000..064c837 --- /dev/null +++ b/lib/pages/home_page.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:fluttering_vikunja/fragments/namespace.dart'; +import 'package:fluttering_vikunja/fragments/placeholder.dart'; + +class HomePage extends StatefulWidget { + @override + State createState() => new HomePageState(); + +} + +class HomePageState extends State { + List namespaces = [ + "Jonas's namespace", + 'Another namespace' + ]; + int _selectedDrawerIndex = -1; + + _getDrawerItemWidget(int pos) { + if(pos == -1) { + return new PlaceholderFragment(); + } + return new NamespaceFragment(namespace: namespaces[pos]); + } + + _onSelectItem(int index) { + setState(() => _selectedDrawerIndex = index); + Navigator.of(context).pop(); + } + + _addNamespace() { + + } + + @override + Widget build(BuildContext context) { + List drawerOptions = []; + namespaces.asMap().forEach((i, namespace) => + drawerOptions.add(new ListTile( + leading: const Icon(Icons.folder), + title: new Text(namespace), + selected: i == _selectedDrawerIndex, + onTap: () => _onSelectItem(i), + )) + ); + return new Scaffold( + appBar: AppBar( + title: new Text(_selectedDrawerIndex == -1 ? + 'Vakunja' : + namespaces[_selectedDrawerIndex]), + ), + drawer: new Drawer( + child: new Column( + children: [ + new UserAccountsDrawerHeader( + accountEmail: const Text('jonas@try.vikunja.io'), + accountName: const Text('Jonas Franz'), + ), + new Column( + children: ListTile.divideTiles(context: context, tiles: drawerOptions).toList() + ), + new Expanded( + child: new Align( + alignment: FractionalOffset.bottomCenter, + child: new ListTile( + leading: const Icon(Icons.add), + title: const Text('Add namespace...'), + onTap: () => _addNamespace(), + ), + ), + ), + ] + ) + ), + body: _getDrawerItemWidget(_selectedDrawerIndex), + ); + } +} \ No newline at end of file diff --git a/test/widget_test.dart b/test/widget_test.dart index 6cf6986..1dac21a 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -7,12 +7,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:fluttering_vikunja/main.dart'; +import 'package:fluttering_vikunja/pages/home_page.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. - await tester.pumpWidget(new MyApp()); + await tester.pumpWidget(new HomePage()); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget); From 744dd0db940ff3feac008dea84db92f8276d28b8 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 15 Sep 2018 17:10:34 +0200 Subject: [PATCH 06/99] Add namespace --- lib/pages/home_page.dart | 48 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 064c837..f6e3409 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -28,7 +28,38 @@ class HomePageState extends State { } _addNamespace() { - + var textController = new TextEditingController(); + showDialog(context: context, child: new _SystemPadding( + child: new AlertDialog( + contentPadding: const EdgeInsets.all(4.0), + content: new Row( + children: [ + Expanded( + child: new TextField( + autofocus: true, + decoration: new InputDecoration( + labelText: 'Namespace', hintText: 'eg. Family Namespace' + ), + controller: textController, + ), + ) + ] + ), + actions: [ + new FlatButton( + child: const Text('CANCEL'), + onPressed: () => Navigator.pop(context), + ), + new FlatButton( + child: const Text('ADD'), + onPressed: () { + namespaces.add(textController.text); + Navigator.pop(context); + }, + ) + ], + ), + )); } @override @@ -74,4 +105,19 @@ class HomePageState extends State { body: _getDrawerItemWidget(_selectedDrawerIndex), ); } +} + +class _SystemPadding extends StatelessWidget { + final Widget child; + + _SystemPadding({Key key, this.child}) : super(key: key); + + @override + Widget build(BuildContext context) { + var mediaQuery = MediaQuery.of(context); + return new AnimatedContainer( + padding: mediaQuery.viewInsets, + duration: const Duration(milliseconds: 300), + child: child); + } } \ No newline at end of file From fb3c6e78ba0d3677ac85ceb240f169f0c97dae4c Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 15 Sep 2018 17:22:28 +0200 Subject: [PATCH 07/99] Reformat code Add "Add namespace" functionality --- lib/fragments/namespace.dart | 24 +++---- lib/main.dart | 2 +- lib/pages/home_page.dart | 122 ++++++++++++++++------------------- lib/style.dart | 34 ++++------ 4 files changed, 83 insertions(+), 99 deletions(-) diff --git a/lib/fragments/namespace.dart b/lib/fragments/namespace.dart index 28ebaeb..0848e5d 100644 --- a/lib/fragments/namespace.dart +++ b/lib/fragments/namespace.dart @@ -4,21 +4,21 @@ class NamespaceFragment extends StatelessWidget { final String namespace; NamespaceFragment({this.namespace}); - + @override Widget build(BuildContext context) { return new Center( child: new Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - new Container( - child: new Text( - 'Namespace: $namespace', - style: Theme.of(context).textTheme.title, - ), - ), - new Text('You\'ve selected a namespace!') - ], - )); + mainAxisAlignment: MainAxisAlignment.center, + children: [ + new Container( + child: new Text( + 'Namespace: $namespace', + style: Theme.of(context).textTheme.title, + ), + ), + new Text('You\'ve selected a namespace!') + ], + )); } } diff --git a/lib/main.dart b/lib/main.dart index 10d3914..d3319d9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,4 +14,4 @@ class VikunjaApp extends StatelessWidget { home: new HomePage(), ); } -} \ No newline at end of file +} diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index f6e3409..182a606 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -5,18 +5,14 @@ import 'package:fluttering_vikunja/fragments/placeholder.dart'; class HomePage extends StatefulWidget { @override State createState() => new HomePageState(); - } class HomePageState extends State { - List namespaces = [ - "Jonas's namespace", - 'Another namespace' - ]; + List namespaces = ["Jonas's namespace", 'Another namespace']; int _selectedDrawerIndex = -1; _getDrawerItemWidget(int pos) { - if(pos == -1) { + if (pos == -1) { return new PlaceholderFragment(); } return new NamespaceFragment(namespace: namespaces[pos]); @@ -29,79 +25,75 @@ class HomePageState extends State { _addNamespace() { var textController = new TextEditingController(); - showDialog(context: context, child: new _SystemPadding( - child: new AlertDialog( - contentPadding: const EdgeInsets.all(4.0), - content: new Row( - children: [ - Expanded( + showDialog( + context: context, + child: new _SystemPadding( + child: new AlertDialog( + contentPadding: const EdgeInsets.all(16.0), + content: new Row(children: [ + Expanded( child: new TextField( autofocus: true, decoration: new InputDecoration( - labelText: 'Namespace', hintText: 'eg. Family Namespace' - ), + labelText: 'Namespace', hintText: 'eg. Family Namespace'), controller: textController, + ), + ) + ]), + actions: [ + new FlatButton( + child: const Text('CANCEL'), + onPressed: () => Navigator.pop(context), ), - ) - ] - ), - actions: [ - new FlatButton( - child: const Text('CANCEL'), - onPressed: () => Navigator.pop(context), + new FlatButton( + child: const Text('ADD'), + onPressed: () { + if (textController.text.isNotEmpty) + setState(() => namespaces.add(textController.text)); + Navigator.pop(context); + }, + ) + ], ), - new FlatButton( - child: const Text('ADD'), - onPressed: () { - namespaces.add(textController.text); - Navigator.pop(context); - }, - ) - ], - ), - )); + )); } @override Widget build(BuildContext context) { List drawerOptions = []; - namespaces.asMap().forEach((i, namespace) => - drawerOptions.add(new ListTile( - leading: const Icon(Icons.folder), - title: new Text(namespace), - selected: i == _selectedDrawerIndex, - onTap: () => _onSelectItem(i), - )) - ); + namespaces.asMap().forEach((i, namespace) => drawerOptions.add(new ListTile( + leading: const Icon(Icons.folder), + title: new Text(namespace), + selected: i == _selectedDrawerIndex, + onTap: () => _onSelectItem(i), + ))); return new Scaffold( appBar: AppBar( - title: new Text(_selectedDrawerIndex == -1 ? - 'Vakunja' : - namespaces[_selectedDrawerIndex]), + title: new Text(_selectedDrawerIndex == -1 + ? 'Vakunja' + : namespaces[_selectedDrawerIndex]), ), drawer: new Drawer( - child: new Column( - children: [ - new UserAccountsDrawerHeader( - accountEmail: const Text('jonas@try.vikunja.io'), - accountName: const Text('Jonas Franz'), - ), - new Column( - children: ListTile.divideTiles(context: context, tiles: drawerOptions).toList() - ), - new Expanded( - child: new Align( - alignment: FractionalOffset.bottomCenter, - child: new ListTile( - leading: const Icon(Icons.add), - title: const Text('Add namespace...'), - onTap: () => _addNamespace(), - ), - ), - ), - ] - ) - ), + child: new Column(children: [ + new UserAccountsDrawerHeader( + accountEmail: const Text('jonas@try.vikunja.io'), + accountName: const Text('Jonas Franz'), + ), + new Expanded( + child: ListView( + padding: EdgeInsets.zero, + children: + ListTile.divideTiles(context: context, tiles: drawerOptions) + .toList())), + new Align( + alignment: FractionalOffset.bottomCenter, + child: new ListTile( + leading: const Icon(Icons.add), + title: const Text('Add namespace...'), + onTap: () => _addNamespace(), + ), + ), + ])), body: _getDrawerItemWidget(_selectedDrawerIndex), ); } @@ -120,4 +112,4 @@ class _SystemPadding extends StatelessWidget { duration: const Duration(milliseconds: 300), child: child); } -} \ No newline at end of file +} diff --git a/lib/style.dart b/lib/style.dart index fb7ce07..047173c 100644 --- a/lib/style.dart +++ b/lib/style.dart @@ -8,24 +8,16 @@ const vBlack = Color(0xFFFFFFFF); ThemeData buildVikunjaTheme() { var base = ThemeData.light(); return base.copyWith( - primaryColor: vBlue, - primaryColorLight: vBlueLight, - primaryColorDark: vBlueDark, - textTheme: base.textTheme.copyWith( - headline: base.textTheme.headline.copyWith( - fontFamily: 'Quicksand', - fontSize: 72.0, - ), - subhead: base.textTheme.subhead.copyWith( - fontFamily: 'Quicksand', - fontSize: 24.0, - ), - title: base.textTheme.title.copyWith( - fontFamily: 'Quicksand', - ), - body1: base.textTheme.body1.copyWith( - fontFamily: 'Quicksand', - ) - ) - ); -} \ No newline at end of file + primaryColor: vBlue, + primaryColorLight: vBlueLight, + primaryColorDark: vBlueDark, + textTheme: base.textTheme.copyWith( + headline: base.textTheme.headline.copyWith( + fontFamily: 'Quicksand', + fontSize: 72.0, + ), + title: base.textTheme.title.copyWith( + fontFamily: 'Quicksand', + ), + )); +} From e865fb904bce6215c8e867953fd5717171951e03 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 15 Sep 2018 18:21:48 +0200 Subject: [PATCH 08/99] Add ListPage --- lib/fragments/namespace.dart | 56 ++++++++++++++++++++++++++---------- lib/pages/list_page.dart | 26 +++++++++++++++++ 2 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 lib/pages/list_page.dart diff --git a/lib/fragments/namespace.dart b/lib/fragments/namespace.dart index 0848e5d..ad46bcb 100644 --- a/lib/fragments/namespace.dart +++ b/lib/fragments/namespace.dart @@ -1,24 +1,50 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:fluttering_vikunja/pages/list_page.dart'; -class NamespaceFragment extends StatelessWidget { +class NamespaceFragment extends StatefulWidget { final String namespace; + NamespaceFragment({this.namespace}) : super(key: Key(namespace)); - NamespaceFragment({this.namespace}); + @override + _NamespaceFragmentState createState() => new _NamespaceFragmentState(); +} + +class _NamespaceFragmentState extends State { + Set _lists = Set.from( + ["Cupertino List", "Material List", "Shopping List", "NAS List"]); @override Widget build(BuildContext context) { - return new Center( - child: new Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - new Container( - child: new Text( - 'Namespace: $namespace', - style: Theme.of(context).textTheme.title, - ), - ), - new Text('You\'ve selected a namespace!') - ], - )); + return new ListView( + padding: EdgeInsets.symmetric(vertical: 8.0), + children: ListTile.divideTiles( + context: context, + tiles: _lists.map((name) => Dismissible( + key: Key(name), + direction: DismissDirection.startToEnd, + child: ListTile( + title: new Text(name), + onTap: () => _openList(context, name), + trailing: Icon(Icons.arrow_right), + ), + background: Container( + color: Colors.red, + child: const ListTile( + leading: + Icon(Icons.delete, color: Colors.white, size: 36.0)), + ), + onDismissed: (direction) { + setState(() => _lists.remove(name)); + Scaffold.of(context) + .showSnackBar(SnackBar(content: Text("$name removed"))); + }, + ))).toList(), + ); + } + + _openList(BuildContext context, String name) { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => ListPage(listName: name))); } } diff --git a/lib/pages/list_page.dart b/lib/pages/list_page.dart new file mode 100644 index 0000000..59e204b --- /dev/null +++ b/lib/pages/list_page.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class ListPage extends StatefulWidget { + final String listName; + + ListPage({this.listName}) : super(key: Key(listName)); + + @override + _ListPageState createState() => _ListPageState(); +} + +class _ListPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: new Text(widget.listName), + ), + body: Center( + child: RaisedButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("Go back")), + ), + ); + } +} From 733b0e6ae246110a6e573f5e5a43c3e69171279c Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 15 Sep 2018 18:33:41 +0200 Subject: [PATCH 09/99] Fix alert for cupertino OS --- lib/pages/home_page.dart | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 182a606..74fb5eb 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -27,8 +27,7 @@ class HomePageState extends State { var textController = new TextEditingController(); showDialog( context: context, - child: new _SystemPadding( - child: new AlertDialog( + child: new AlertDialog( contentPadding: const EdgeInsets.all(16.0), content: new Row(children: [ Expanded( @@ -55,7 +54,7 @@ class HomePageState extends State { ) ], ), - )); + ); } @override @@ -98,18 +97,3 @@ class HomePageState extends State { ); } } - -class _SystemPadding extends StatelessWidget { - final Widget child; - - _SystemPadding({Key key, this.child}) : super(key: key); - - @override - Widget build(BuildContext context) { - var mediaQuery = MediaQuery.of(context); - return new AnimatedContainer( - padding: mediaQuery.viewInsets, - duration: const Duration(milliseconds: 300), - child: child); - } -} From 0155bcdf153da0693d57b5a244976469ba8a6ac8 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 15 Sep 2018 19:40:59 +0200 Subject: [PATCH 10/99] Add list support --- assets/graphics/hypnotize.png | Bin 0 -> 62237 bytes lib/pages/home_page.dart | 7 +++++ lib/pages/list_page.dart | 57 +++++++++++++++++++++++++++++++--- pubspec.yaml | 1 + 4 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 assets/graphics/hypnotize.png diff --git a/assets/graphics/hypnotize.png b/assets/graphics/hypnotize.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f513cea42808f6ebc59f34f6023245465a991e GIT binary patch literal 62237 zcmeFZbyS>7*6`c7ThL$u65JYhcX!tY8h7^~!4n9<-GaNjdvFMD!7V_5V8K3e&di({ zW+v;s_rCX!Z>{u#?%uU)?|SN2RlBMl=`clk2^2(pL;wJQA|)xR3;;m9|M?FO`Iv&X zoR#wUfnYDGXcBU5AU;w~< zAx*_hRb>x{?{ek4uuQ05tc;y9Hav;4aD*RLGzASQ0=jf4Y1TZpQYVI(7&O5^W++r- zq~BX?B|7AA#5uT4((K5S^+ave2v-~?HXKB@Aa2@c-@scb`Y<|dv z!o(O~0{eUV);1Xg{SjZ;1JL2CO-P;YUP1t_e0h0k$vWWL01)m|NbrCTxs(ndVaNm8 zzHpK*gx?#84(Di28F)V|fS_lja2`NV9KtUxkwOKK2@NnDGB(-(DAEHADPM0-0sPXg zlDr@QIuUvXfO~{ zjY{FtVzGlDLCJy)T^>o#nf+POzMKsM0GZL)kF`C!b00-58y#hjtV1=R-*1O~ATu)B zxZfHpwig5d)|`DO?&%n-@%?yU{cP^D$&aAT^^r1NE+b5<&;)A%nR^QwXZAnYh-JNR zoS)y?+?oVxjxU;_Y<-NT;|I)Vp%AZ-!Ujq8-OV{vs*<8Z04+w9J zmbRlLZtIaAZi%MIdZdgRHEFOml%6?6iYC83W6mWD6aGNmOFsEvvc5`p1I53}2B@&) zhwzG~FVHiFx{#qn*L3b!zXSkIo9#M3Q^7;|nFp?oxjh^U+(~4T1N=;-J~#jX`l7EG zR6kV<^uq%HqM80Q6+#5xJMri`U4&j5fq;5N8Lf+^O&N{R0? za;->X0SEpY@oc1V6KAI6D4ficamN~bzPIdIJLARXXbVyNBK^RQT|79J9%~>&U$<~2 zCmlkJ@lYjM3372Ceua7oRCCz5@mQrB^fQ044g_{+H(?SGv5=&utfu^&WC01`D^`pJ z1P%nKH%eWUWHALYH55%4*FAVf%uFGgl5{U;o<(6YqI-pk^l-d-7AC?>+4vq(s`8`i z{XEz+`nv<{Amak&?+R&5oPG zH^()j1r6;*dJ;}^*jX+4$thl8(w*$Y~J&! zi0A#PKn|vZ#GNFxBs(=tnmQV9?C4L3anf-VaRfAss)a>)MJq)}YG-Ogs!@gdDn4c6 zYAh-ng$SSHi`9zK6c1DgRLlx_3POs^3hYz`KKg3ig~4id%XTY>d{oM;G}vhABSA8L zUhPgtYK2l9?BdVXLs2<0@9j#{oOnmn9Klyqn8hW+BF&;vt$Y@1Dgd{U=x~+lERV25 zm7j3t8@_^dOubG`kjE<9$OP84DvD2t*DRJSRw|Y_Xk{-u%umZ}6>HYI@kbTvm!{OE zlrW1Lg-P2{nO9lPN6g2O?|V5zE2?L4icx)$3YZ7!``O*L)3YVp#vQu3MR(&l`O{6_g0`Qr2$ zv+jzMy1}}_`sWo}bFhnLbvAWAATuLev-;k$?xUF27@sDecXxbnC?WHx#YEafzD_lc zSlsH|E6Jm&M*=>*-{bcf%{0f*$L3fz>M)0>do0paQl=!#aLpQ>0?$Gt!ej!57!vpy zQV9B%2U<6!ozETg);uTA(^9Hax(*8#%a7QPERI5!GKN_*sMEDroW{EcM7}6(O$Z=m z!~v~VOMDeX6#UIIdqF z6uRxw4T4rhUcY=WdGLIg0Ob3TLzqE@`3w2$K;B$=dXu(C3UDuiFRJDbh2Ca13SkRH z1(XJCb(WHv4}5)JN_x4II2t`_ff}UfyE`)u2igWjbo(Mx289G^1Peskhic+aFeR|L zO)QBxt&08-jTc=>F=JBTDyNrbqv0=Nu;g9fXku*==wmR|8lKin)0DE7A>?A9DPy;_ zZd<)QJPTP*TSwaP!cAlx(6jf*8twWXl#f%$@QjW-UQjkvo-_8F5IRi(&Rgb}=DqMngB4sOt@`h5wE7CmB}aNe$} zHq|T*T$LGE!?b-Q>=RdfaXRhD;c)e*#rGVk#~BZY&$^zieW=R~meHUm(%fz>vE-`a zb?{h3+`xvR4OWLO;cW=7qp_J*C_dCkDD!Ql@RYOi*YErk&{+#%b%3OXxE17curzz9 zr=ZEGwOR}M5u8TAj~y0XhP8;Bfc<)oYRP?zAjIxdd(u*DO<{3Qqsf@*r0L%F3Vpf` zYJ5?`b^@v`%KSnN%Bp(J;rWHwB4fe`)napCok(L&J8we^IDc?-ghxR2qw06nAFAv} zlgqWB*(=+LBLc6M3)ZjGi#jcrcl?8Gi)s*Ra?_^M;2Wu%>PvyLu%f-I_!}F&Qh6JP z!+xkqs5`iqsCBcApQni?`BasoW@ry2Q2SrB-KQP9(W9`VsJ%<=TYqUU>an?ZiLiP} zjKaO(`qryt4Q}d%E0Gxyqor{2X|i~VO7e}4kxrAsF#p8N{)*?V#NrFIR90Rs59u@2 zL5qdGfT)3LW{acMrj4A)DBi`jKvJI14{mS}dzP3X>RlVT4MJ3K8sqq?UJ&Zkw2 zTbLRR8p-9{1~&W7`@HutQwsgfsm;k{jk;EiN1m;r!+oXAQzO^9i?@y@;5?>Kl~zS!5*N8C2(&cdYsUH#^;({0I(=s0H;O<~iUG8Oa}6oUQoCgnkxCqA90HB4XzVCShY> zr#EI|VJ6|=Vqjw9V&-I}BVh(Iu`>c$8JW1~nOL|V|5$+}e|wSfBR+oPbu=;MRu&ci zTXByPADOwcvpqK>qnn!>gBuHjouk>KITsfrkeQL0nf@^cy_1KnGsvCZ*6HP+PX6vk z6zpW|XkqVcVP{M7(=W)#&c&IJjO=GY|9JhaUN-jsD9G07Z|oi^GP;B88JQS>jQ_<* zPVU!cHa7p!(#cuO_3=plR}2QSXbcu}1=~8m{7(mAV*C$3_AZXr zfABFeW&~SLri2nIRZIjY*(S@Zwd%l_IwJ#L>Kdlef48wr&h$k@X6=eCNP zm+`6DUv2)EN3bZ!8O;A^%|Q?3q6c!QGBI%jIk;JXv_Q7U_kVKoXU-=+FMOe{?FkK=`vo|O{>rspzdW2Xm$*;tK0EI<$k2lF45{8#gTb1iCT z?DDfS{mr$>qia?cBQP5~GZQ_Cl?g=8Zo+Cx4+0vo(i^k0o3gPmn{oh|nEvkipUnTw zwSuF?V>AL;|5KiyNB{q{i2vZ`--?p7aC+=R9{<$09(&jy@kRyg@UN+VS6Ey85jX5X zj!xj8!;z2d@8j_wf#x4^N8BH#3WWZ@~W< zPKBr>j45{dXr$cBam5AV;u}*<+vhPvenF!@}0Y&dup@82;(- zUoD<`=4JdDoUJYXe`o_Ikn8`q7BFQ48nFS{nCZbFE>3!OE>>fDkP$lzJrgGrD?5h? z3o|qGV?Y1Dy#@a2yT;}qTQjf;KjYsk_4kDTn;PwZ7We+&HrjuP@c%o*=08ni|C90a zzt(zx4#a>1l373wN-!rl`f^jPCSvo?`u3sXvUK zYW}08)_=A9C(Yk1|Ljozv<&|v#Q&N4xX6FpUoie-gYj?C{~zrJpuA-@i(qt^Le8Ejq3@JUyHwS{hH4c?QdL9fc#qgjqBHZo@jsLdIIFv;%{8P z=JQ1R8`l#czZQSv`Zb>?+TXaI0Qt4}8`rP-JkkEf^#sVT#oxGo&F6{sH?Ai@el7mS z^=m#)w7+pZ0rG3{H?Cjvd7}M|>j{uwi@$OGn$HvMZ(L7+{962t>(_jqXn*5+0_4}? zFL5FM^~f&R_VGDgx5o!^dGfDx9v|i10O0!J@pBIVZ~+1U`-T7j zcOn3QYxlvRR~!H+F_aP&QgvVWsyCm!$XWhTo#*(W=pl7(#+Bidu*jUKr&aS*QzBzb z#WHgOnIaWnx{A)?SSub(*zZ8N;~`J2rq=sVTXxXBMsok*;p??`dR`dXZd2I-H`A#% zf7FI#cRYBnsqEP6%s2#u*I!w9P<(ItB6JbDfPH{Ss$n!jM?W!kT@@!WLa6hkN?Y*|jWV9i5DtT1a=6 zMRID=;A$V9ccbo=DJpD!EW^&3V%6EnDVpwOQPDyj+ryqW_q(q;j6;)khimp!$yBml zdb2i*bv9mOLmFIuy_Zu!z1MXv$-n58*SAVe~9P@Vm&St&eQL-= z-nQA{m|g=-j;_guyHdvO6x3>|Ogsi&n%d#PRuQ;PNE;v|cDEfYlnt$#HqdW-=*Po& zMNA>N=xI>bZg8F^lpWyP<5@HMN}MbM3iva|R)T@Ygedl&Nxh#A=hQ7%`&YqEGO1%g zGGgDT*0DgF%91l(XKX0X3W>_ffnJ55TMOq9U3xOx?M{ZnUmk zAk%>}w@=#GwBu`7)3DA=wserhnO(S*j(fn$9;OClA6#U+ehyeG&w{y>x2?SFYyK6e zg_cyqdWcQViI*5;Il&R)HFw#%SJma0jfBV}vYNZi+~2mwDu>&Ez>zh5j(%@mux`b= z>ZW8Ivh={5+k*Wfb;d7h2O(Xaa#W#zyw3*u7Poz(AHT?BxMP zMW{Xov$Lx@YS?-eo=J;!xnn)dUb9Gbr!C<5i1GcQ=xeiqLc7;+Un|LKCP8iP-x6%% zlqs}Ns394RM^{eVt&@X~uh$$;F7oGwztOjJ-mQ(h=xvX_ZaDXumv@|EO(*9^4yXbap zbs_>ers$NunKk(*E%AUulE%V`%s^)H$2nWben&oOqyDj5j9Hv=J{HDBM~ zYCZO#JqA$LL~-{q6sCp#s6E>C5149XL9UE31M$->BhTl}v=ZqguZu$r<a%NWeFs6p9~4up@4Cmg=~<9v?rrfWUPBzLc_qgK zI-e8AWWBrZD(|8zD}jbh zIu4W?#cGQ&qtNu2Q}ioRW~fDx)S|jGq;iyqYD+hZKT{;3^43)NvBjAb6jVrLCoe;m zXYq_*OmFsT=sOzpO&d(bRmn3W|gnb`*nJ6xZfhefD0sqt=e*q=PIS=LLDD*6!4mp zBX}_iAYA?e4JKTZnlgooBmiWp*oRbW&au{S#lMO<(DRZViU~QlB@UgOunMB!!h?3I z?wNV->y24<*iv79F9(s^zVdPdHT@;@KrwW0O4|ZhsEq-mG?w(oU~qn5g&3qh)r>v5 zNShTVw=re0KtZ~$^KgB(Lk!7!NeL02Fa*Z$uNfI&BG(ALd4?f)3iGaCZ&q%Dv$PwX z>HD0mjhO>%kLZ}$oB9<(Ay=37@*d_?Z$ou{Y!?>0T3T`xUZD;Caw}r#qV#=&6%(^u zVS3caL-BV^$OitSV5W`pFXdc-X_sXlbGFEhEpPq0Jhx$|UR;pTME8X=w?jDpeNjj^ zsK82S6ynQ>GmT1HCWplA4kJQnfjyU~fx)hUYN z18#bxdTD8FXD>1AK2SC#8l9qBGO7fjBA> zuCC;r*lL0xCi7<)^cp<|(}ym4H!^cBdU~?~7yStn2XIkQn%q&tmdSZG_;dt>B2?{= z!$k+4gc4WXjMWsJ376aa_<|3GEK@FewM{bk74W5RfLH7=BB%iRAVk;^oyHa^J*Z&Y zjuNBNZU$4ExUe%`bR@3B4yFa`jNtcaA=a5_%W*R|t{G6tJ?Gy~iQnsS2C0 zOr|i|`KBq5U)DlDE8H~)xJFJ6eiO;wXzXn+WD>aI7+QHWvA)V^rS$$q z$t;J*bA?VtRi^EGeB`_Uh+TC1SYizEJj{nfG4GjfZ;?2N4_XtVvOF2~PV&K};h&tX zLI<{oTkB_pQ+sF0OSu)_BM@ZmRRKOObgv0ADIspb4`S1tc^veM_^bK|y?v7&@xeFq z1|1U`_FbyPRn2kINC=EC2QRtW8c*hQS`r61{mU{UY|E=d6Osg}kZ3zeFJJ2KC@+%i z+$D}8CF$6rLl3G8%-`Nq5#^%TQj~g9n%ZoQ5m6wXDHP1OEU(#f5=R|gz)6a2<(1lz zYoI45m&EMwrc}dru9fec3%)q)H7Dool!Xz|4fHn~*5&KOD-})86mXA;s8&`@AAWyE zswS#14NaBrG%hA7&ykH)7Fjg7F5K7%SQ@`%Iq*Jhu zfDzjQ8x4OjdzI@gxA#n0wKsXvh93W$mXY4~<-Ui>SXMbYC~vL!nP;y?&b+CI6Sgr( z-yDaBA1rn$C7N|_FZHYVOAj-j!k~2&(-XS2(#Lk0>$fl<5 z5d>}wkG_FTg6Vj|* zS~F*ijxD@A5p7@cm<@c7z0z|)a>V3pwqgmHm-#58kzC# zc?cCQ$-W#?`LX8RriK#i4lLZ9Sd_?I*>h%|_pH`Eb(?n4tTT<)M7{47`!bg5TK29A zDzv+zBupr-eC<>D5s7+8lM;yoq(k?`@oM|Xk2&@^cDfI@!5oH#hRM%l$ooFKEPp<4 zpdr0#`8Kw;i)szfh~BHVOWN+bhqIk1b#2e{x%7NPOrn_YyLIBLNQ zd+^(>V3Nn_(p$i%M7L^^kKYq-wOO5OHZW`GWa!yr5|$#Y-Wy1~pC&*bhjZL2M`Z}lHv!L@CUs4i>Sc{sqPMS2Y5RvXNy>xEbK~9ktRzFJP3~6avjMFt; zMmEhpXrdrw40x;sgU+<2(L#`Ertgq0@j8?W5(6$m>O4Izxx3Pku>Wk&Wb|=?*lM{A zs@NXBVm()1N)Y`hmGWA5sU!DC1%#LnC)$_xv{jF*v&PJe_2HC6a6(<&)Q3p#Zf{h5 z^b2q!4>_TCiA(6A(OSy^L`t^C^UyrAC=CIHtR;wRou<(YkAO0G68O6La=aiRRhG`V&b_}nYtR- zZ;4kz6RI5cAGf*MVM^@?nC%{WN(#y2%ut`4e?a%Ig%PwsxPvq;#kelp$2hX%IH!~D z7e>E4tKqK1Pc$cR`DR0V*LBWbq4?1y^qH9G>u$wT{m&&+P;|aFs)$jheT<6%%E9J& zuZ-rO3F)`7lBrsxTq95Opf>E{0p>;1)aUaxpN%D#*4-!UeRpU;(4_gHM{ISmB~$?6 z^SED>P}n}ZX(^?=`h1k%X_z*p@(PC8%07eeRJ42C?c9VdU$_Ft6Z^_0OT*H1J8sba z9gUy4XMpgL-@Azys4nKOKNEsc`*Zs2y8RYhRoRT+dqeQXhwFfT)PIAhR&!WS@Oi+h z@f5n8+Jt(40o@qT>C7V6u4Al@ETZkVk3!M??P4j7mxnf_V}S@*nZ!CwJEJ|g@wIYB zSUOopR%xuN1D^+L0Q$g`3J4dq`%X@Dh%Wl<#v9r$4)Jk~vHbY!gNhZeh_xXW?$hP- zrz~8T_-xGdQkm^9zO*!e&c_KY&IpsX<3a~!D>J)jQi6oJ${C2s+F&&tnC6+~KGZB0vWRxI+ z=L`afhSsZzKfCR)^T@>RvqI210cvr-^Gc6_QtR|;WxSYc(%FVMQscqOn1VEc# z+0@^#qi6_8&g#`$NoM<8j)|{maV7bXIFlp7YVQOZU!}Q%G)ovs=9TNW`OTaAsfqAO zA?Bos6tB+LjM_fNmnwYI9GTdwG3K%fj0V6Q)8nZam-*@_R|TzMdj#8l!U}4w4c5p^ zz1Tzwq_j0F#>q+@nev4gimx9OPyF;mZyG|d7`PxOqRc697S;E7nle66HWYSN^y`Gh zXAlgZ`gD`Y?eTm!(GxzC_P$K~a0y>B*Rmdi8C$zH!q161Jfz&6yj+@VRrHP}&TU5^;yl#mc>?uhcTi86px~OPq-_8(B z{bFDo!sH}K6yDNO#m?)u`{8I?6nb(*6vUrl{3&}{=C<$!tUh{I?bmBvIW48_k+Y_Z zeM|4S7|Pvw^#KKRpY-srbYqZ`LE0f^hBIkgjn_irD-(UtbeN@+?0%B!bJL3=xF?&q zbU0iwuYHNA}ez0W=`=W;2rK6>xc=D@OF(&7I>~|4JD?Q2&@pdZg z!GuN)_~9Sx8K@O>3Zt-agzz#w+ogc!IL$6+Q>8Ab_5hfCfy<~Rf&~!?E2quCXlso4 zpaEx_4Kz?&HWbOSyn5WiRqtRj9rVw=<-MU(2b!ap5uvsv%Y0>o^2h>(UTa^-%|$N1 zSh~l)r%SS{Ypy3Egw`D3z+%i$feyGT5%i;R{&q{WPG5g~vfS_c)weCNEK+ONMbFL0 zKuygDEv8CFnD5p*T>0WNavJbJ97k|n`RU>+K@c6i@u{2QAx5|Lod)~Kd zcBDalSpo5;-`{8%=zxEKm@1L&w@HJdM&N zTl8-S-)Mjgq9&}gDoSDZt6_uX7-0{DAC7&6-7>SE$C8i8baxlGIU20;g-wHMiB z)f%AWhpN41uTURCqwFI*3b{A%f|OoNLZIqzI?kslZ+Gclt9qX8%99GQf{$3WRdZe$ zs5Mv^4Z%>XfO+t4eZIU8U+8S6Hz|r6x7bf^s7oZBHlKDQYNHcPbUT`x+^D|UaM5#8 z_F9tXZz8W@{T!qB{w(g8_!M`2QJB-swA1_WaO|vP5vSH>@$!yU&g`>dzLzlysRuD9 z+dz8!mNz#MYRGH&z=jXcwF5iaetv4uf1K ziC5~KgdOy&Ai@N;_GC}RSynI;oT+cO=5(@%n8Qt(YaW6h`8Xn$;9}jKtIlwVes;Q? zZ?P)1+?lsNOl|pVAOf#5(AO>Bswgjt=Isi-BPIQ$3laX?%ja;|95H^XjKjie-HpEE z#XnGnp9Ko_y|li3RnxTeM&0|xssd*++?)Hsm+h`{uU06hkvO4KiOP!v&7dU$OJ-g5 z<45=TNJYPwA-_%$%t2wDBF5p6U1Ysmd!HIy*)@s7gU1ut{X%*@@p&Ac>>9rIOifB?O4apq)6Md>q4 z<(5GwPC~zz+xwwFb3>3CDjkVvye0;2WdHq*R(XT4;=6SII!k`rWd7z`=vr#hjF@Ry?Z(_QA4@GwU#pLZYQOP~0z8rc)b$Qtok54mJRo5g4VN)Aw^HVFq zg7Q*Nna6xw<{a78K=c^{W8=^yVEs84mkzgyS!E5iDzdkmT?H z82zP%8JXo`CI<3s9F7J$SWD40fAj=RgjMLg`hbQIK%I}6AYmD~p;KLMV>ryhQ$^`xUfDq&6KyNlNWDYYQpGc2 zj11;BhF1s~$K{Q{<;g-_j9PKAMiv+EJkxH(SGn3Yt;M;T!lI&Tb)yAZQ3b}?y2CBU zq&iTWgh#+w2c2%|UI;(2SWqjuJ8tl|EKBWEDAKL6C~t)= zB@WQq;2a%tq@!N^F@c7~pc=j?OOo4OQjGYD+f^)cRHqJYY-7il{O*cX?u<37?yyWi zf1jXh^wU~(3z-}-K&&Nh%wG`Z2h;~CIWo!5_pGJB_l+E^n${N0-)1JMOQy#nQu~ms zAr+%3cTd!(Smib}x%xKKyk~gj%EJhJc~nozB=Pet&zGv>rmAGm-s&V=dHL&pi-WI& z6qqm}jd+~bIGiVnLcwEm*8(nXwKhYGuh6BJ{8-y%BJ~4mB7^i{ z60$7NytY47cE~yH-Uy}!9rBM=YvKGL=0S4kw)3R@(Jk)su6>O(x(Q0j|g%0n?! zL2o=qGijDY*s?>gGFXLsc$*>3gB}xfAVHU{g@B*pf05qlJL=@cm61>?>Js8$5*Gz| zw*TCdmg!15;O$FGFE3a1yqV5(<{xd!o{fY7+tO#P<6n0?VaBx1GQ)dDqWTN%b*AJZ zT(G`B@5K4+bnUG!PX)X{vD+@S9c{S=iQ_ObAYKQol!ZFNCsE<(sUlO_X8kyBf4EZW z+5UFK8cEk##V2UDwW!|I>Vj;)!8u8udhsJOiLzYv zkg`v4R;IHJgHNVG3cJ~m(OuS9pwyqJ8uD$u<$y3syk^ZHyzHI~0$^|?Re8sWMBrv^ zFp;YW(7L-F=M7V`%tu-W!)Dd`+8?})!ra0Wr1_6 zV-S%U@eAg*_bzo_RZ9>jxvDS0yd>6jJ=fkJ zAETdqD0oLx7mVAVBSwn32t&t`Mp>8LYH-^!OfXj39kKj23fu;og6AL7CAAsgHGa`k zXK$#vybTCIA>R|Bh)$?0kDJEdd6gdiB&fj+W8& zk=_rYLCV<|ZUQL6aAy&TtVS5%y?L!EPW_|mQr{PD1b}MWt#h)DfL0PDD6RId`in&t zs5nINd!O!%W*A}`yl5r8ER)4&$a(w4mRq&Yqx{%M28Xhw)wqs86GaHaG}%Zo8Pm5B za-F^%SxA--tB{%vGwvL*Z#G?O9o>SIK6Un*{NPK|kJB(d*lt)O;NPAfWi4spOtaA6 zvz<Fxdq-bKqqCLjf9T1fA0k5a#6khM7GJFtDFGD%l;P0g;5pU+G_M2Gm=FSAoljc@&-X)%6v_! zFGMj`1+?{q3mybc9cOO-KFX$;N%}s*c8b7d$GBc%oU)$UaiEq)jS-vSl)h-Nyl<82 zF_%$-*ZYWl5j0@@esi0ct{M#Zku~D-= z6INP5^`CkqanwIf3z-*C!ylBKA_5<79*5%_O9`s0mv1RLb?B+ps9{j#FmAE=WD3f( zz6$V1d5T2CR%1z_&wn0TJJGu4zRLEQcF|jP$**M^V>CR3#2G=Gh0XuEfL&@2ok?k( zLIKWK@5MGwf1}mK3$KsT0*=Alq~FM_60wC zpjy}B#Y&a%*TRZe%%SF^HgjQCuQ#DyCxWpwjQF&Qi;8CPO{2tU^$=okcO^^mJ%EG4 z{*5w@Ry|nrTv8C~3*p4fFYg{NI){i<2dV1&b+)9+4o|ANMeK9qso(?qyz6sfBeRq6gpPoG zTT~`HChfhxgLGA~MU@Rs`Lh;lsgtz1YHUEZ?S|;S*9&3XT41dqv8NSW;zp2PO}~Ah z9cQdP$qMWJOWkRavK>wx{$k8k9gl!*j$54JDgvq2k9EwOU%AdpMsACi75l2_rZ`dG zYQbC9?;PtDjl-6g+ANmY@YP|d*HK9$R1bN3u)1YhuJ5juL>Cl<1l5%iEAxC05t^gT zVZHG?M@`~*yynR)g4SQ+T3O11^()inHfl-ee34KVTf}d8)NUWA3FJ^U3{2eJq$M8z*i|-_JmpFdsfSOOl zEe8mvFT;%(A1@%{{a{#CbbpSCc+5XCx_&4;&^RPoOv1uYiD%@9NEH}Dque?+#9R$) zlnu`eBtPQ!n=5N1#Q&n`loU>q!&!d6x!lHMYUZ&N?Z$8*;t0F)uBi#Lq5`FYfk%!i zeMsjT5c^Vv-J_VX(NxXFB`todt8CS-r)2hfMPlAw*DcRD-?kk_I!Ruy2<;J9@>W=D zaPZAebT;8kw#QQ{Eoym`1z9N5FT;Tm&0b?uW_$7;+G5xO6oSaz@8iiU z7fe=w(frR8PxaGyL!pT0VgiijVhzVYNO|#>?}lqxQea<-%Nx9C%Wot&FIxMy+l19} z_k*#AcS&$#bZXDpGCBAo6M?vqmNqKf8E?+FlLM^_T?PBvQg)sBt`d^e*z~+HX4|i4 z&-t|W@CPd!?RlM9r8xuND<%Ox-uU$0y>livx*cF?(Y_Mh)u%K>qB?FZ)sI|rWD?WY zn{_~7OROT?D>Uq>Jln&O6{t`8a>EPkZuKZ@?1<``Q`q-KQ~&}Kj1(&B#>0Wd$K0cx za746#Hg9{y-Vp-p4|y#Z9*={Wi>c9s*Fw$FA>ysD;nH)~V_N;&*Y$zv4bLh9`ZrGI zxwyZikic!R!0yv)Hb>Gs7txR{e-AlhJLOj_$Iq}|xNc{=*1zbf8dq-sOmWIT?+w;n zv@E}|pw`xd%dgR4Keq7^vHzAkPa_`cqoXikHQk@qd{s389y&v!qHI^p(3l&mt|J-2 zy<>nPNE*V0&#d*AjieMq2AO#z_P(Ut+geu0uWdU>5l~=mLed8;LliXya{+D2zq=^{ zH}eGr7CBlPDQV|$^qbk>P&r?%wM@tvI&yTG$y!CGUteoWCu`NlbF;^go5xFTPlhai zCft?u$okCrYVwi~qg*rM@v6z24yKP9!ad`QVl|e{Ti|q|_01`m)uBj*DOFYOEz`44 zGS`-2F%sDI&EqtL-Ykzd1DuoQJmUh*e0Y{{_(jvS52e+e3sz*oHziH15a^<3c9F6+ zM|!F%`}!TrNRP-oglLd@^Ny2#yaj#1`?_Vc)=!Ftc<%c0_5v@(#3jpGYP$^_2N^mf zGwBV}W^glK6mWm@1dNzb(uDE=Zf@_=*p}23N+CvEEMW~j?zNKwIxnG*Re?*2Z}H0c zc!drCbz5~yMBKpsZqm4V$W1wChf_H-MZe_6%5eO0%KQtN(Ywk*JGQZkK*hQNo>Xne ztx_UL)E2bH9lXQ?6OdP>@iaEAy{{2YI}+t}?PqL!(lMT)(mk5p2sTw)F7*!4Re zCey+Vt`KC?nvUeap%_N{vIUdEH_xhzedEB=Br61$pP2Py2T6cZYK z5HBk+(_=70o^tsOHtp5USO&va6i}7$A1BJ+kOXb+J2twX0d6Ah!zM?*3-9i}@rAp0 zvB$pSM?0C&4^vMV%JpfWyyArkWC#}15vZuP9XG?CR&Ucf@Y7~J_lz&dq!REIPM^~3 z)vWOVyB2=IgLYdKp`Azy*vDP(e4@I-+dx66xrbMHR4EfDY<9 zgin`EZesB9rnG*~fLuh_IYx)=cL+98aS4sc-Rqs>G1nz2Ojg?Q7FKNVE$R7T%y7j; z;UmRhmw6+z@os}OUMyCRX1F?%#`Wi1D<2WAAx#x1`yt^FW(8YiD2grI@k#I@Z`ZrL zJbUuYoTmF@Ar+VIVliKEZBLq3M5%v+zP3`VO0mCuyrUqwu2K?*dT3dx$$lT`dAD9b zS(}VdJFW2b0GB@Ex#xylO+^4jpz%!hAf1Q)_l|WOE6RAy3RTfX1DG01TBk(z;xty9 zo0RTbYGNw&e%T~*zGITs29l->j~vW9$<(00ez|<2RiMH~j5krs^*d=UcZTg}GQEMe z**Y0v%(^Fr5xjMuYy0gT;3 zoFRZ6LyKKeAfo2??R}k5;24_E%0?kb-x}n9z&epRaty?$#XBm(+sKKdbu z?aVj{C59_(-1Tafx`Auy!zmOBc5%1qtz-nQv!kB+NAeh^hx*_pj_UcCzUmkMJ#SU2zzi$GR9>wR&z(8?sZ%o80nr35P8bHIn_@=cybyebB zDsn&5S<)Apr-PGc1Dl;sf$bQQ+4Td6tjKHs?E8bgJ6xIm|vH zEM|x2Y!60f;W`TVdDnm*j}fjNzub2)`gHVEXvf%!@+H)mKJb;=>&U5NJ08iN#pqtE zm!BJtiw+6gRKW>M(Q7fcHmT#18g#NVToSCoZJ1A731&&ZYb;P;x-G!qA-wyI@M z7T^Fgw9OeaK`m+-4qt}6yG!GLthIsiW=N-Auv)S30w(G{P^omoGzP+xKz?ryr~4r!+&w8&JSkx+eTi;`a4~geG#qoUCIg!{&|I$_TxM&gV)Q+9BFdmSTnRAUoiO^o{7^xRUY zl5|UF1H-JD)es_~9r1=KJ{$^1!-XCZv+}iX)|wB*0jz=|K(Vb6ON2n+wt_AaRa;4* zS$2xLqvU8Xu~$I`!xVx2b5^Jj#BI$obK9jqJA=v)Uwmj2=K z2BE8kIaNq)nY8Q-SHNhJv!4u^f;zv=HMJtno2SpO}<3dZJ0 zpU7f7y3|<263^$FP{($gbDq0(lP|4LFpwXwAzf>k#t`2lq*D&$_(N0aHyN#7-s+NK z4ZN8Q75O_@^u6Og zAt}6x&{J9B-`_i}G{1_4kn;B1z)tS4K`tozevN}e)3E&(n)e?@AhMKYF%7XcGMWM-F!~Lj+``-1D8Nx~; zxx<3aYM+Kw_nTRc^d21No9mk$kvpNXh9bA-jFmD&$wHyr4P+Wi1Z-r;(r<92jnY;i zgEJo7y=vP~f>S<+*GG|5zL{>j48&kEd~E&;Dvz-(QSP$P283=!U6(f!1R#Hr;weD4 z-(+;#6>rGSg_*skCuz%Y3R-Pxo8;wjDbc6pK7N8y_yv+CjKXT-4Dj|5G~2`E<+;f_ zHWVk&X+nNDd@_rZhiA1$ELW*o@#I2Fh;ckl0((jPN=sYV4rD)Z21iG#)D5PuE}Ey$ zZU>8R4doS#rb1CCy0ZYAaR7vN5A1&A@esmdOJ(%%muxXL`*z^VI#q)!4Pz^?m z6dCl*JS)mE^*e3PCf&D+#OBJ(FDe{OUtUEAp>)^1f!IAib$^i1={YmA9O)SGDP68& zwb7vrsoL5SoJ!W-I%#f^=5Q^=-OjP;goD#|{XDr9kp&mAE|<;_4U4pP-pk1T%K5{U ziCsnE*r~3nl4nh5oO?y|YbcmHHUP}%=?DEf1&sjCW|f+UYmX_h2`Id<20Q*r;9k|O zpw0ZW;r`9SjoC?UAjL+@%j;P~I6vo1ZmMtMVxO;MQUZI4h!f5+;wFp*3|^lYR>Vud zmJ4mpradp^cz=Y(i*0%r49Cno#-HJ*8oivR8HC`kCGZS&Wk$8f;z!l`#G9^a8ZP8_ z8@oyUUp`!Uc9#GZ3?ENg>qRYg>PL&T^fi=b7dttRnCD#9?Hbd-dWD8DFsBSHg%>7a zVcT;BlX4QhheY6dmKJj(Q`FBtk(NkiN&HcQ6;b~}l%QGQMauhgX~y?9e2=29UfbkR2T@6g()-0D z*&PXIUjbxW0#5HeLjLI7w4)}y_dcr`N-W5@g=g-KOeQfuX!f)zV~c6b>D#q1O;A%G z>jQ2t+LAFqeSZA9m&@9qqawN4R(}~XZ8h-OsW(eLcK$F~DALQW7M}C-oreuNY9M{K zdB}>uQ4JZ1WS-+NT%dOLH{PVFkZz&l*`l&*N(~(3llgv1r{ONf{U+P=ytDZBe)n?z ze8J)x=^Dog%W}rRo$Qs0H$onmMnQw$TBi6XkwjxGP%{I1!|=5-yoC_`un#V_?uryjBH)|Y)!=bVe3;&&gL9R}#4p@ofy@yc05&HRozjU}XWF`k$4oyG8@E3$HrQ1DWIoBBigno?fyxpy%UsN!?apXC*^!Did%KGrcYBi^Avac!b^khQnw=3s+xRn|} zTJ~Bj_z$?1Q(49D&9S^ML`UBMU4XE>^svT9DbhO;45X{(mzZvTo1HPVrJrgj%h%$O zlum7Gk>3d3eWgWF9>Yai2}}u~R7_>C^HTSbqnlWyD(@oemc0g+o1B>a>~r7uQv3F` zajA4$SY!5QtCn_b!`mbsp6v^DW-tb{wIi>Q)TPAqhZa8bmX1(c+aAYEZqz83)~>>< zLIn@(CMGYUA^A5)r3?BS=e@p*j@J{>d^)@HgRiZq$fi?M1Xd+;%uXLSw8ce(AfwpD zo!ZVfQ)$%yl4bb!>i3Lffer|c5-tQsu5B3}mR_)2F#O+|C1paDd-p_9&fAY{n$G{) zH{P=JP3EjUY;4BlgzxV!;m zw6#0RGGazj^E4}thzri?NZa7@WIL-);cd3Bg#?QK^s#U)7^zDY(3in}i5P%xc>n{R zE!B!e{mu|DKFQM0NT~NIY66XFxhY+M?f`r38v5%MWZlDgo?^>YEn>9v3@M2x^cvbc zcrT~)pPThGJRdvRdF@G_)w9P>MUdZp4c0t~#4WMcU9iYfVwVHSCj9*8>uZC`3cIs* zmuKNj5W#e3g5LmpHSG7R@xz^OX;#KCZj3Z-DfF#XA;8+51pme#X^un88oCbe&o!U+ zV-8S@(Fr(*N~_^F1@0ArnNJc!2=!7``tYe6ex2H;GGy_?bCVOCF*UDuxRk;Q{<%qq zpKlF18TgKW4Vp@||8o{`EsOz;=Ldd3f&iYr*BEy6-Nh@{>u|^e=4pLD21Bn3V_Nyk0Beba67L%6d;>Y9dYqR$t$Wsv@c(* z%UbO`P$O0^Yx-6W#9BurmPHHp7sIh(f6a}2FwI=5u}R7?TBKh zNSK}hcD7G8CHI`)K7yXmoHJ%9gcuvVc{ZV4zG|KYxi}gzuGV` zNi?@u6Ew#1s@UXdgE;zwP+A&uTRdSHltbIvE%*B(w(Pysuo-siXzoUbIAc$D`s36a1F;{}Q0kc^>>+mDk_+J#zb{sUpG*FXA|y%w+u7uPJK%#>5k-=e4Xk6# zZXDL+x7^eonyA@XjMs2kO9X!LM)kRPZBAFPXL{ti5{U;yEna(5L9UKPjnx`w9T@j@ ze5^SX$D{-oy3knc43oKxsLM?ZHF%!u&8vRMCALzAe{h4=5>a|@ACZ1U9etPNt{m^E zQS_5e>d@5DUiYBkuU^1?^)u(V{eB?#RM6h8_^U!^d(;3Q7!0b5(%Zfy^?!loQuLi! zVG>+jMxxa8RKbvUfI1KOcrhWU)5d>n*u1D5P-v~We_*^tpX}RvlC6vw_)7NFmGf*t z7VOn&LWa8#67ufaoYOS92@KD4~^vBVtMSmTHQETL2!u0bqEaYqo+1{6~h_VFNy- zDF;5sG=6CpVPfncq5E*QdYRk7c||jreU55K@a}*gs^;+(=Zbc&Tp2whvy(}ebxO_9 zjcegY%B`9eF!PlJO>p^2{Kb2gf$g;e{qVP?hYa%CjlKi2QAhz&H4J=+#cFyns#mb* zgXg_oi!J%q>eO7E94swVix6Vdi7oT?r*;vW^A4B$;BKcPZ2XI6oO7l9)cnKCT{a-F zVQJTDtAYXaG7XcqWv!#{ri@x!$rN_4)Oui~_)n=&0-VaeU(FR4Q`NeQx!1s@`uowC zhFOtF)5EAmSuBGMz0xUPc$tC@p2CB4FfHqrWAy{@nw*~DtBiUJ2V!L(ya(`3ma8atQVW!V zwsM-JMd^zpTYRXjM47yXxjiZFy@@{0pqQ*y?aMO@7_$AEL+)kbk69AKu7g<_Q~HeO z6;H=bX-?ho2DhH3LFNw)XaO+%bhI@PjddV380KIPWiCgA&30%FOWlGch$%5(0o{N2onlzdz?z6N2iJ%3?)TZ-2b&EPJHRh1X8cp!{ezdMzF;@>!0|v@scsP8bohXCI1zF1Kg}k zd=)k4t7Ew+!d`_PwTok{={Bb$ZRFT>H5H@6$Yk`LeU(?-i$1+}6PCpc_G1Up{tj}S zYXCLgj>Aj;LoiNb+&E*AOgfuj9x>^$@RrMmRF1=4&Is|1eA15i!3kkDfe*KOVt;$V zqqd0Y=qgMCRmY^{Xj6HTI(4w-!S5NW)gA6)zjKVbvMWz<}?=@poriV3%IJgZCmGZT3^_m}%Dss}2sF zw&V5I+cDUCS&Ye8pPEM9U#Y?9j2498Tw~nm6b)IA$NX#VZ&)3vPa>$ay)5VlYtjl8 z1jT=Kcn;7HS_ptVvMI#N&o}{ zQUpc|?ADg1aKo`RQknmqn2~y^9&3QPwy-!QT`ezl2C*M`aR$|%yGy&xY$sus8*m>i z?i>HE)Fv>FK8M6sz4V|;QZ)Cqcn357_16yt{Mo5Ff6mQTaf$L;1BdRbi#~Sv){8Yo zgmFN1(dHgM>BGc6^#`RaREef)?a8Q!W>i$z-FzTzP$bB$N%WhMg;OIHt8*3UiqEU; z_6=54AO+qVm_N0BhSA(vbRsG}C4O!Xc>nM)SxZ}UK zZsy$n2^KM#vYt;bc)v2A&JHQ?D63S)VDJ9*8?5s!?h0fSbEZB;#eRZfO0)A#C1*T)`Gv z`iTF*!m!^_1`*uoDf;3^F(q{45D_-N^ir7X4-fO}crv6tPmHSE*>Ci`&t|=%f=`rK z2S3%?8lT9r<(~zwuuAIEzxmk!GSO~^TrNg&OcBn4&YHY#gPUTsx<^RSNV;waJI&)=H!9ioyZ)zVWUx=QZi$1cBZ&5yzDW8O#n>3@Wc=+g7e+S-{#6K|WU ziU!4(g{gtmLVr5C3wo>OPc6PALsC|ctP=2P3VT3AhJ?IC1S{G-hW4a`hU-CBCww)d zLM6--MGf6J@xO%&`Q_`S1P)Y180g>K6v9iG+bCx^vqkT-D2L6K;75FJ}EFUpBZ}8TOmO zO5Q;)ZM?Z($sfLba}Q~6SfMeox!%G;rBN3dbkW3WkNaIrNmPA})2eU3;~zmuDq!}m z=G;blfB=<5Ix5wdR$tQh_C098GPfWfxRo7zI7p0|a!D2I5n8s;>_ek(X)_r)z1I5Q zBwUSp^I^jeO8%;I{bBTD;Gf;eHt~_U0tKjb>5uc&T~;Kjii)C4{NXZ3hGXK#+)RzH z`zyCjD)0t-S-g+^DVgN#$Oov66d6?WoCnP-0`Wn1*v4-n)0wsj2|i+Bv%~)mtv@2YcE z`s!x$AJiM$z86kFhtxG%3R8Xy32IcVVH|eaBQ_P6*r%nzo%!VqtVC-WOb#8O{)-Oj}!UmjI z0G!;tYNy>aeUxzi(N5$UlxMD8e)!9+dX`c-TXIutR>jm>57Rc`t(~1+A2ug(w_9wh z@+aoO+aa5#QH`}JuG)g{W0wE*4&U=5HDE(ZY;Ws%0`;W21BaGO2Rlx)Sn!E>q^7A1 zA2CX2U$c4w524kVCOV@;CDkVm{NZ6E_zJZqZdG9#G;)_Dul1Up3PTx2jWpyepVy93V8S1_Fp4gYOjigI z1S@f5VaP#Ui+%JZ{$qEDPn`TWVRDLfY$TTXIe1Go>Fnr>!kH>5ACLjr8*fOxt8T~8 zJgfA`5bTN(0cjl}iMT#YL`jdBa@zy+(L^ltkRyzh1^+p0WuPVEuQhCL1;oC!;I45zVA3sePGj-!q}^r&u`~6NJR%SZYzFr zS$grQJul6Q7xEkiu{n6cpV~{)56Sw~h7v8aj(f3pG3ZWrM1{|L?{11c3A(Y<_CaF% zn0wYh#G{o?F3j5eSI-%vkC?Umqd{cKttubbA(3HTw}~&H z8&qAV*Io`uB@*}29lEa_c~)zH({7Qzz#poWbT{paE-Nafw4nut^R~hnI8mZR74;WY zzxu19M78L8!HARo_GD2L3*sDxq=lj#zI;e!q=j}4pa`1KQOm;X5lMOoz0+%%L` z)r~-$ybvg8<+L^_)ZkA_mp6d-*#9G0t`+QsJ!wu z9>yqvNG4*sQX6w>`Ilx%dNCzh=TsX8Q`eEKc6NtA=NTEEN#}b%6T#~Bw7>d1bc+(T z>e||hC>U46@^nlfY1SggbpnOCAk!SFAf7K*B3f$u^3x_xMBy$(742URT*!t?YJ7Y0 zhM6fHp2d*q_6X?Mee-kYDKu^M!j7%B9y=F@q$(|n_m#jPu^jUWoOt=FX`Is0d29S3 zbY%4VpWx(?WTBg{bVNWIW$c0CY`wv7{8NeJrrD^fm3Zx-(c@912}n6yanW;gup+V}l4$ni?1wH*;>?6<=*CzC6huHL<0p+Q%R+G?vB4(dKSJ2^(5 zDIl47Oax#nx5pe1u7r2|MBOGFswdbctUOPK88PZ2e>xt`M-ca1+({(qdT<4*^d(`N z{Sf@Z{Nu-*Cr$|sLgN8YeJ=K?gE2W%3_jQ+j(5cUjVphxS>p>q05ZDnHOgrhHQYX+ z@R6>_&kvXI)UxNCyxY~^?AP4aVXs2%^hpEYeg2Jk=iUgcpLBzYZM;|v3*q{dUDl>2 zZ!lf$Kd5nw+DD-*Ux^X&x+Td&mfRDZBGqB6&J84|F}jHN+?)=?jdTknx8_ z#yHAdOrNl`u6es$J$93(-1KDlI5Jiea97HfU1HktX)S)iAA<1WV}4RW`0 z3_~N)kIEiYV!Ix-*us?~CfSf_T)^lLYc)GN$!L7Ts%k6znD>llxfST??R_yrqsq|> zfoLL|6EJVlJ#sXrH^+~6U{PcCrK-2`xD6=^Z{WFTv41wyYMwO==`E;pl(A`h86o~Y zCFH0!7+z3_f+MN^SYXlqi+{E)b#8_Mwd`wJ__}@E@VyeW#dNZ0SY+BtTz#T@){N(J zIVJjB6>)Is9XRwRscgzh9N8>5Lf|{}DMWdFi2(J_A%;7*r{5w2b7nqjBz zI%8u)E>HY^lCig0SQPXE`3WJOKbn4yO6l|fi!uMd7rbBTx z-id{lo+=_AG8xR*@dHW9!p!}+Z0p>6Z{jm)Jl?_GDJR+E#0bA%f4y+8YSgoz*f=iQ z&klO+*tV2w09F|IwUwx$MsUt-jXUbd?JvvZm3PP!bOG{)9-bAkcg|P%HypQrC7-1h z=oTsa4Wf&i%>7Dk)UUSCtbU+BpeUEBV!hK*+@MfPW*SYyz4(ctR#U9JH6m5tIxvTh z6x@TA==)jxDf6a|5sxmBP^Tt0Pkq&ifrJfKd@Bc~MIFbOx?~BiTjqu7GXo!VnvagK z0DVTkc)6_NJ(E8vk`M&qJF3Ybi#D3>DXjkDL9PXlJ?ZPQLJpV76G-u4o=jCOLmsBu zyHqv_x@FutCkLt~O0V{6)Q*B?zJD)(17Rk+%!u{2~|NRqJWv|1i%5FTH*IOFN$4Cig&T0*7Kl+Wi_*=EnfK z43KraqdI~jZmeJ(tgye#n-xLP__a!mW^rZS&*BtFOk27sFu0uckLq(x4Pe5uvk(P{ z5$0c2Iof*Q*DL5};EE+p7+qbJ~_@U>De{;6SOAi-beVP~ZoXUb^8 z;M6sLQ~AEyRYX#XIhgt#VB!g&v$|LeS>|vL5cRJ1@ODYM0fmn@_cYg{kWVx@nyh;| zbg(GCF#uk8*+}`&y9J5;7IIGaH_9lbCz4wEm+I|pP`#Peg9wFJV5yR52!5rio!K;U z1#C8a2<9?LvJg zthh;Rmi&@JeHhSYF(Lo#M-kMlm4O~GqVo;TZ&VZL@>`()J`r6ltV0X5b9sE+6WCkz z*5{XyzxoX|vlD7ISazc|)RsLO_(4$qv-3LeVEuY#9EVV+?fYpvpku}W@5S@>d>U$Lamv_#d|MsJ`FDdT3bd_31B)uep;w?5e*aObO}oBIlApQ- zFeHY;(Vv6#G6HJ#QTe}=P3Apf2{rQ{>{@vy_dE^D`oz}JP)FIorfcW~_Ut|a1H|Kh zaXfa(>Zidwln=o?__0@z6vm^MwRk@{c|~GW8fB^I`07(yt1nx z;n#8!)C`qOmEV7=OcxUiB(o_p!g?(+tdeM`ajP30w3nMQ^WDPuzFPr$4o}eDJyG?) zo%mm*YwJ)6x!*vGkg8&0@y7ASHs%UKTKh$#>P?O;EW^L>VE@8V~)V!?&(!t1r$Vp0p?CWE4 z%<87NS0BM&(qu`YN{};qeI9P36R)B3s7b%oVhho!&SG{N$kDXJ*#SUHCNy|A6_5@Ms}e! zyG9(^Oy%uRon5YRKJd3d?!;4MyC2N|;JQSa*mgk^{h04NRw8SheI)ADG;x}*SEqf2 zGR1xAmR6~5-sMm?bakgQik%MYn_UKDeaGJb8_IJt1{aWygs3vi0HvvFrWLkX4~t>!@{M~qyCZFf*hd*;&PU8#dXKkh_Bx9^VNO?{zl^}%eD z!~OsuhDp5e!>(807Rvl^d@yEdg6uCaSnE%0MG2ir_qFrHSS=^JIT@x|l^0`$r9<$! z)I>cRwU#<>-*FDxGpo@uwhNsMN8`*qj~SwP=ydz!6w_p9+v|W0ZERJe)#8Z)!iY1* znSPNoQH4v@vK(1i+B{0eVZPWbPy8oTDo>2fI(y73pI{1PxuL+vDGG{6J%i$el^MJp zd9!F~eGji%7TFYyifjmQMdm+$n^R)jYFKiAhWihuvySkgWT>R`2g$yGV~C)Rk9}5_ z?JWt6y&u4~yP!1W_^7k-ZGR%WGv{MJj-{WV^~uLR$Q>s`HZ%bUs`z++N!TWpTqZZR zLTeKk-v3=+;cR<+NsWRK1n74@sed6H3}HV8Lo&hH%hE4Dj#z*>FuA+)zz3A>a<*;( zv;l#5RNOBpWj+zovIyzAmifABB8obk=x1h!{LG!!+@-t?d)q7)pRGQr`QZlTekyZB zKHEEqMTpsIw=fk!^=%zld=Qbu?pvT!?#@ZQtZVQ*jA#GaeX}X;@NC9!C>VCJI$j|7 zjbihhB6wR{j}fZ_f$-9r9KF>iaw+E-ZM%+#uB_?rjACiPeYw`O3~qxnzF7@c#gZPb zNq}3Mp{LWbrJkwq^}h%oW|7dAu^TwEZ4W}tc6RaA?v-W8Qc`2Ea z@CA)B7|P*qAVHJl#}^-TuA_AqEQ8(#EF)wQu5Ozsk5r59N~0~NZ`>bZ6tRDWMp6K~ zyh&xQBj2D2N*Zr-Gfcm8+U?hTEf*)tC+e=mwf-vkk-EZK*B%dxmU0b$m#eSkK98rhsWwZO>8Z{vkWiwwOJYg>yQ}(#C^_ovoaFBPUsqy74dS0(}*ZXYg-P*9oPyU=U zsP}Cm4qLz&IJLq#T}2oCGOu@QNn4i_MQ|o9E!YF2+EWW7{jo-ZzH<7c#_{$jEKP%pyTktx&xr{U%(I_Cws;sCUSV6ZjV)W^T|1bZ|b!qvzqpHv+ zKJG`vJ)SVUKTs?)aDpAtb4yNTeRbmowq2>m$ZUTXb`g_PB@id}h-GCVAwUK#!ho{( zpRU24avP9xr*<7kzXGSIBZha+7PqA1Ic#~UyJ!pdhH#LMvm*X6%w3rj*g|e-Sh}z> z(E>?d(+*w5ro9f3L4$7iwRM-PPaRoz1Mb*oceNV}KMAh^iM9vc!N%>QyUrY$@m@O( zxx>1UR>`|^h}~VuwP?g}ffQxC(g`{o8TE3_Rk_EwJMICCI~FzT;Y;Y&*vivLL92%Y^Ycs@63e(7yg;}B%3b5G8u)TrY!d4Bi^GD0p z-W$c$2>ztLMRJKR z-WA))f2XUI;tu_%!3t;pj|OYqTEWCK@@ZOY;rDHtfHCjiY2f`z?Ddhqn0d|Ep+2f^M)Ej$ak=P{6w~ju#?W=sbR6hHfJq63F)jl6hVH0ldpZM~Ot5Ot6P>KJ3vxVE zRRQF@hztimL2#5pmM)Pfl@uOLRdHcn21+Fkt7+@e)~PgvDWlHcpQNzJe6tbxu)CNX zt=tUE6+s2B0!#7yrL@>1&Ij3THTHIq*9M|Tkeu8)by&hZvGhndishfiR`kbLv?;j! zwc~1~^{@H(A8{twG&5(%4TSt6Rf}IwYdc%15n}S^R5sMm5&k3%30aGb*DIYbFS8-D z=B6`w6Ciy5PLii$l~fKXmx}Ppl{&2N-yjjDP7`^iY;szn@2K$vhI(f`6+*Fv!#6E@ z*yzrah#P~Snsw>)5gUUw@Hahj7v6aAOC(TL)x@cm;i}(Rwy)`gneqQLGnVK4N}VCj z45X>pfQLY-pYXoCnz)_40y~&~pO_s@_eXXZvds&WIDCm`YztNii&Xr&49^-|znKQ63&Ds^|V$x|s_!X`=DfJFr8T-N;r2 z^Kwo9cqTwHO401--BoQ2g;+T)G&%#>2S~ntje{^zJ~C@{gvC;OVZvk>(nc|+FlZXm z-F0j{Z&w0nbVMG0;?)Da^Y8|dY2Jh9qQv= z!1mo*C`iY{*9g%A?j}wq0|&Qk8H0k-Z>Zae#S_3K=7XL?@;cmC25g)qqe+uh_|B2E1kIE){i=>!mpTCbt zY)yd(nf!fCwZiExS<-54l9wuCh)!6IkU#M0 zO@%0d$2n5(5E+8yDcH!Me?}&JochZ1p?}FJg!dP;mF%Os;&YB%&Kf;I;pvuw5L@0` zWhJC|Zs1H?(Z%xa7?{rV90%*)K~CtRi&;+O7J!bR*@soi^R4b_ebjxgrz>*WC&Q@> zZ!r@eX0Q>A%zrFXR;I)q6j`u|wp%o)SIEQ&tXhaOhXqvrF~V!0UCAmLO*W*J>&|yl zleFr?;LWJ2d4XZHo-ojZBb(S!`gAzR;4wE5c3M}&|HV*${ZsrKb9*7>8a4*n@*7yjNY5kamYSAT5YIsT z-R-UIO2L^2QCHhnY+YKd%>j*iTL6zlFdrDhV}w*d~wBM~Je5R4!GW`)dJF&>|1 z*CH-;=Gijw2jB`{P(CW8P_O!gM|Nn|@#bTkaQk0-@)+DkFbEWLN@WL4-@>)%s%aV1 z{b8Ygt<)G>PGO^#)vjXPTq=allSPQkyk#TV&ITO}a`l=SpRQ&fKWSvJPZ9%Wc8iDZ z;a$n&<=P0eQ-h;94M^h0_-rb20YQV)KC!*sCe$a{;(LZ_QAPiDb9eq+ji_@RluHlM z)6>4*fTSm_5ADC!>PP(bxz-lY1?%PH#&P7fKo^>(udc*jSZ42cHGnoOu_ zBk8*~L56+dKs1 zstBc`V8J)E<*FYXhKRijy!aDbO^-HAL#6RcIoa0>gT-YbSDJa1H`y9KC122}W1K$5 zbYa?~o)9{kAG`8e#&kGXT9}AVYM-l<%}e(2Y{?;=`@rej^RB*)dB+$IC4s_Bz8I)a z)15e>DHO>jF?7}UD*IYE-??H3*?E_BYB%dy(#-^f^qKT|=SS=y%&PTwy);`gS#%bp zVTR)nRrW3>V2oDKJ2})jZ4%po&ey+}sJpF0Ijaz_Gas&c-h-#>qLLy9`N;Xh*}l8NFTk&|6xx> zx}OQhH8>}3K?8H`7^-KZB#Em(m1`Gk)~s7Ih+!hsos@HD_BjnLw4!0gJhY)@ygwNm z7pTF(S@oDJtvAmL#81r3-@?1|`~>{G)vZWE-(kV0Uw(v}>%7ta)jQRJ40$SR;}>7x zzlNP)o5of0ZITY_Y36Q)t5&H(pj-Pw4qE@(MBk;Fi43~Mq)hQ(lbY&;!dpIJp%>&nJ)Bu==-k+2%Gd^=PSlO}mJWwv=D5Rzoh zev%Fd&S2n#Vvns=)B1Gq0OU38YJIWg&^^AxQwW;KYNj71p5?eR64je5$1;|X7|aUf za5Y${Ql@5ouiYA8D5Cmc=+cM=sbDG{9ZD`;^W|^OV5}N)_hYpTz zV!9FVt!hgAk(NavKbEABHIUyY<*voci~H&}fi95;1z&D!F(k6g{_?&Q=usM60Qul2 z$S7%p(##U;r|v>IDh>OWw!-IoDcbdj$3y6q5l8abftFc1Fx5&`yLoB`6trGUT~IXq z?Ox}v@FKsVo`JdSRt(OnbyK^47V2GUomU5bl@%>tfpY^bnTV8>usJ2kdi=J&X3_`I zmnF1E03>i<3DOH;(0=#838xKNisdm)8K!1dt(5<3`g{H98^{E@nw>qx+cG>@a;du;N= zuu(|1{hip#w{L@gn`7ZcS>7k#l=Rb-A~GcKZXF!HdS2y_Am~RlxR>ZtPd7 zeCqSJe9*jwlUKd?W9}8=ogV&HBNyj5`mVU-)sIdUiq80jP?x!vWUcr zvVZZGrlF(hu0qtdpA8uwb49i>!B;*h{S($(q?LJzgGX1V8y=e1A2>JPfO3&ONPMOo za_pf*XEg*`qVp=Pix_(2{easW#P~%l9V$Ych*w3o~v%04kQv3X)BM1!6b%5_;*ZG{XrneRK_5ZM_j)Ib3E{EaC zGNS;tq!OQ*|JsQR|r9Lt}<^u=!mQoH zwG@U*ceiQnA;Ta_zDZ=Y_Ekwe1=Bk`gkr1C3TdT2Otq-rGOqWpc@QbT#OOp(Mdx3= zR4S#gM(8*>4VQv@6fyR+d@~N;n4iZBlV$(MTirao1C?2r@Bj-h^nE#!Mh*P1kNe;(x3TR_jeB7BAJ-QY57{;~4u)pGN&h zuPt9jjUfSo2Xn@of98zP0S4euHzb$&3uX+f?}b?!Ab2gaY3|6!o6Zlv$ls{$b*Q;sx+a>S4|y+dh zm+;;1E*AS26PZNOFEFfz?+V>lJZ1k`|D3~wEC=JjFY?PunZj`di<=`l_>NhoF)+AS z_2g*pV$Sli7dx8-T#H{%cs!I14JHI^8X;W?6N1GcrxoajN2CsM$k%0V?GLd~YsKO_ ze&d-(8?RJm;=Up&7)Z86O%D98$cml!|1Yva5&i_bV8V9d3)Ogde|Ijk;duRTsI-E% z3>umet?Bu4rxE8>hBla&kT{Y;$#CkJ+LuGu4LfVXb{TZR*Ue|yx@)`kPuGN$L^~~r z>ax)HpL?P>8QMg;6X6=`D(Hkxp9Li;XPD^QX=NTH6Qv_8(SHju-gTq8xu3pY);KvpO>>jJBZ**7Ygh81iH^Nx1Haqle5^+~v*-asMrIiB3YLTJ-FM)Nf zrmX+O;qhmaqgQ~YzY^ZKr&wN3w9*v!v*T$hUtB$8(F(@W7h;ffpB!F+wpyF|3LpxZ zaqB>k45JsjwoUr4F*0~iDWLCIQyuPiW_!&*P-zoEo(MZ?qXY?^%vKXcUDcoR<@3>3 z4MI!o7Ug+Lj8R)>);jHtR$WJo0EUh4R)OC*{HVwjoQ`{TfGrYc%N`?8yf0P+qO7!@ zqDAcu$D}?P@b^dP@kO@U1O=(qY{=`;7#HXst0vbO|B_A;c+f)R5%3~QNQ;p&M|hNd zWS!kPS=UO=*P9!xyv+p{J;}8MV(;iMOrzFjeh4I_>q25%1MVQbKx$_~I;%ww)~NXT z)BoZlq&cSHJH3^CAi~8VNQEUUCIZDnoU{QcJQ8MPx4{B+BE@IhuzeV}h!UvUIJPlp zYS&s4o2*7>x=Z(&N5+7)izeSA|M%yJuA1{^TauW&pT|H`(K2OhK2>i%dug}ce!^KO zcX56AlH>?IDxt@zyrU=AHjz$`W(5etI{SYZR`sWVIL)o&MhoBb175>G{=oF(OW-&N z7IB*XBq%rkOC@IeAj~yR+2=c&d7jKT>YdHxAlqEKjh};ILo_V2qy6VmqXjYnB>wPM z>fW^u_!`Nwo@rLHWi;@u*YvbwR4log#z(}$#P|YrG#yrWybOKeHyVST58p$u8Sq_| z1F9h>1`}VMGBfbK@1O0~4jbg5KR&BM*2a+UPWyH8jaV$68IRdCE450ns*5UZY!Zq1 zBSHjLyL_MsWV}-#K9$SgYxe68Lx*+i1^qVYhENg&%3wX8InU=WyPN>H&LC?Qn1V9L ztc=iC!Bu|14FvrzwhivXbeXxl@@C2ln;PvCY%^qg%FXXvZf0eiO~b4jp-xj9A9i0? z7ftrthMZgKCy{2Q0!x&&wIMqSmIXpQ71x^~D{9ulpC}HI#b6uiVCOOYM50lsAQUTN zZX*KB(zlqjnL+Yv5r4l=vE; zr-Of%Z>9qW-J2Gh!X9WykWxZxxG(~55@pKljHp!GJu-C*k|wN<*7dY!j`91@^wM2# z?z}kRKzr_$?(VIu=qJW>MINk?eGB=yMYGQrNMtB4SV`a;OyR_t^M{_cEbBFs4!Im%|P~Af8#`iRi{0)DzGGi)0^8U;S>t z;(z_(w`89mjR(q-Ef#g--e0nEv~Ra{K}YdQF&$sGZaKU>cns$U1Ng1CUO7I+9KT6+ z=Wi;=2!<-*#jweM@bU=adxJ^hsN+V4P;!CyXk8F-c^jh(2?FeEp6}Gt_?a;JU9mj{ zZii8NbLLU~Y*i{Nw1^dUIXky>q_U~g1it)mEQb^@Uw3hR&g#DC9xXF1yoyiehs z4B2{4(`6Xf61{8wmTtFEoC~F-4?jR-1aASz?&Vr?_DtY?oUi zZhvs=9rjPqf0^|I4qw5C6aXY66?5ev&{U&t*$r+CLr9+mXhGJvO47o%-tU<CEgu>M0`(eFYn7F0AbM&28Gm-$V^uXF`!L zkHB@RC-m5R)7{(vN$vSYG5Awa!z=&I#C2t0@u&BPo{wS&xa$fBb{7HB{4i)+zS9(f z+bu5C?L>}qmG$Um+vf;jsO)(PIA)uQS|C37Rr}8IVm=l34coW}F=cwZ^JYV+b7k^T z_lT4)Zl__QeCha{I1v9@@CMj32|bu2Hy1%hQ~Mu=d$%e7l2KOwvp+$r-NYMIVqh!- z?d`e56QBO_y>fflV3Mi$GLx4H?$gn4`Ujt2hx2=(c&ABWhjyBY=+RX#U!K&c+B$=E zjSaWXDRX}peq`N}R3s7_diDq=ZR8W)+VjFx+zjmle|quCC&Fw@>gLTxRX&lBPRsdeXF{5|BD2q(Bf0ia) z2KYfr2A}8aZr$POc1|D~t8FzO&$7t0eV76+JlJgf&UI2$YtY(uY2Rx7j8eOwmz2)?OORSfm%%z9_kys}Mbv&^5qr?N1y>g)3LVh&9 zjYX6{#W$heQ5W_$xA;FihTj1A94bwEnc!Kv*`6Bd=vicl!!x!!x0~DJT2Ms7X@t)s zp2ACRg6!#{Kcv34JLrt*(J?`3$_V^rNT}&>Afre8)FohA_e2q%mMlHl&{4ncwjmxa5#y9N(|1eah55@6x(?yd>4aCdj8x%a;3+j+Uyy1?~UF>HD1Xj<*R8P?GLzZq6%s@5YrgA(Ya zJ01@b@|VDf(&Cmj=m05iYH_BpUHM<~NQGBuT6nXA`TM?_n#cR@8~Onsf4(vLn1fxyKtK`6cA6R05nh7i9%<=~=uV|uhD6NSy2 zvEH)Aa!FCkw|#3m%JU^92X#9eW>fOoC)@Dh)4Ekuxkj}~?tJt`SnB4x)bKjdYHrvS zKn_xg)X$05mf*O4%iL@kU*ykzU^6pNR-(m<(Eu){JevsI@o`+z%Hf!yLDe#{XKVjj z?7kKE@@RLhHB^Fr@i)clfKLigtmy9=Jb$q!4CvX+@DEbWTh2<=-ORHjbKedb*3D(n z^T#%q93)d;T1K+kn%F`+j$KPyMON(V{B`lvb&jy=Ob_%lW^WsLlUA>gO%Glmv}x{O zOXig@{7n0{%L}hUyE;CNJ0N+)Y?w!&b2i&XvBM(6WSB`Gu7>BJ95+d7ALf1jrKF_f z`o#qF_~$qUu?tKSqqafHo(eZcQk=o>%Wp>w)cxc+lt#{?Kbv6QI5HkIT)>U(Km0|o zuKqs>R-|i$mH;GGd5tu4VXZjeq;H0~DxrxPs5kvB4WFMqwjrGpCC17$WxiUB8Yb;D zBxpE{Xiv#-hlJBfv3A2^iu4QU_R4(Qe_owbx)$++VS;`Oard|BMn=+aG@k28xC^&( zjA4er7M65E2!qQlbg%rVUGEi*auE)mgp7;f^H58G*Xa1gZ#OT)4;a7p9(tIW z?P1GCM66%_Q(`@Lcrs|uGnS@3dMf$@YBhKx;FWGY7a1->FP@qOGo0S)GsA7vZ)l)- zok0<`R=#KYZT^9$)1V^io1s`|B4PCYnyh=1eyf(?(7}*zoQAGX=~4bd4gik;M8?W za{Rs&t}WYH?}>mT&7(}zyBQ-{$g4hpZDt7k2JIuhOzZ+W>ZtFwv$uOTpHs&R3I_%q ze;>1JWN}^_`t<><_-zqB5(plfn>DL~y0G)N}x2U&VNo;{bA{ z+M8K#@5hCBKN>20dm+Q=sJ{W$7!;oW23V~gaoBN>eA>m3B4Q9SiFA(q4~8=4)zsyN zHb&{d@~nZ_4CWKxC1%=p#^gPP0%MqFAVA$XE+mh;;Z?Or~zv_nvK(tMKda z9umplj+HgSqZ^9mf5i`Nz^QjT6F&})MLyk^9KM4W%U*b{#RZp#sV}l*-qyEM@ZYKN zWKke3&Z}R=R5Bm1^A;LH1C8Xn#HJk`?E9fFnSsADdBL} z;c{H1glIW7w2pGgX8B(}`f-?M6y~eJ@nvcoB1_97!T$jkgO-?{NpMl`873zHJO5+| zIi1=lDyyxF0_g^N1x`@&n4(kR@w z6iql7R59_AV6lv?sac5 zN*Y(fwbs`%eM+0lG2SK*BGse-?W6wog6Uxt4jp6T`5I|JJutgM?FCM>XkiBeOKdT_ z86qa0?(rhdWwoLmblTPe^J2ou6Ita{q=`6iesZ=QO17d4>)Z?oh#c8A7Kmug^+wgP zi8BjC!GEgOewP;d(A{msq|Sbqz4jeBf+z-Svo4a(nxqqbHKj$8;OX31b{h=kGvlPg zSja^$J|^r7q|3ZRtN2ICH0%7@b)BfX-=GeA6Xl72XorfAcR$_~=8GwK50CBt&Surf zMg)&+AqfJ$xpBPz6#3fh9jpy%3~m@c3iSOTSS2hy!#!4`UH|j+u_R%__Zzz5)`{ZG z)vY^Y_?le0_Ri5Z9OktJPHc_$)Tfn6wE9J!UZ7oqbAqZAzq<|vGobGqQwV6slnOfP zOY@K#5*13xLjz5;?ds!QIU?>-X6tB;T_i-ETcoH@ZlV4=lH@SoQ@OunUJDS0_HR16 zG2d3_aQrGurbmtv8Smc|=H>0PL~W2`0?GI1weLx@es;S$)9OuD`sIBrT}|bQVkuWeEy$BnUoR5 zlyE9$9RB<>uOpf6-FD&QH;%v!CP0ma0d6bkiqxP)Hmirb=V4u=@ zwyUV-k-P4!83f>q0q+M1H8}k)WodJNbY*+rUXcgOj^p&fjg9#Tes{;wDqG7D3)(Q` zWsQU{ozQ4N#4`ild-vTbxtxeUIGEU`$PEsgO-A*Gd$X_cXOEDP)?;UvvV{+q8 ze|L^IOXO&3=-pd_VQr^o4}q+S^t}MKYj-~*X~7s%jRO1tdE*kPZuB^=hEtn$N7HpB zly^R74xh{Wb|@y*zl2nQavPZrhj-ZsQ7}s#jc3`URW=O5Jvhvo>}%kSQ6ikhZ;Whi zZzKA`^5`x>d}i~t%ro;NSl%MaI2Pzyns}MoBL~%e}^#QI?S4$|8C6rkx(0*9mHiQR0tet%%{4t?UG|D)9C zr+kg3gz=HOA$j|xSh~qms*vr=gI6g?L+`n_J#eZzO${1yg~4RaIc~|4F^Z4Y&leZ% zfSXgHMi~xId*a%(*XE5^R*`1$FCBINPZ7<46pCHSK`sow$mzphI%;s>mW?&)#0s)knhLzGVlBHbo}*oIM-MG@Wv&({h3%TMwh>?5=C>64JT+}};rrN2 zIzZlTfjFed`W$l|WxLq=@UfQ~2TcA$N2MAoCqXU)CLeE(ct~mHKE?Qj>#!^GX=RvZ z6pWuG-t8>FAy*=`KQo!R3?Ua{W)8F#y2AGu;FabaS3Vg(`{Z|cM-S`IE> z^FcQZpwa(8)tXVX|Hz{N-}3qA!*bI0|65BqpFS`h z+KfNcMk_@0C*Kre7J(P)aE~8+63(Hc99bxV-D5jqyM2j%+@`%!)}VQW>b$kEE(ka) z;zt%NDkfYYGg->HbW*xvJwm-cIx=uFDAKgyRKCF1HWxkG7!2xNzeQ{xb9|MB=^FEmI}s&`Lfe8M-N*(cbx4n;e1)>Z?ZWF`k0f(pfoVM zL`m3Pw%3eaFSzkz|JKK;)>rBO_E$TFUH{8pC6U>>b@{iyDsREMv9P3at>*YGea<+1 zq?zBlH__t?%721wDg_<6%-&a5(;&9Hw`cuqe498hXKN2kn(33srLzZ~E*WC|24m8( zZ8k5obz)tM?Qu8Sw6Rmd(6Qmx{$t%WMtqO9%wXa9ul>Ex2*D#E7*EFx~=-z$m?(LZPo}CMo>+i-8!5esI0wN}<&40;EFH{c(tt4{9 z<|I*$a>f%rGm&9FhV2B$NdhC0FwZBLmh`Od?G?f~&Yh zsMq6#`XbFuqTo#%P$!y#JyTbDX3;3F0mXtDx8R*HG+msqOW^%7X_Z~L;$)h!K{lZ$ z0?6}*Xc1`**gshUV|@}vFE}+Z`TQ-%I`SLyI;j%p#)&a?l&gGrVm@WFTZKsxx>M?& zzFXgww_=E`Mt(2k2VYi_p=A?lV=|}7Q;x0PLsNDLc+ShVQjg1ttwN|L_mP3CPDg?7 zB=uDA(?@a2FPOT^fQ12XnN^apMk3aA{CH0W9}J@?0?y2zdxJG>C1SG7IdE+!H@FT$zt8=hr{i zrP@^~gdE%Msmn`|UwGw;Eu`_cQM14CQINo?v<@~A-t&labgNi(J%t zS_1knowV71&gM?LAmG(~`fI8GE-XR6psupw9vpiG;_F4bA8!)#`hY7o>0B54Aw5ba zJYGZ|;wGRfDo&P&wtq4=ZKuN`@|0%$%T#|?T>oY18A_P`ggj{W+*JrYTp3$6NJg|JX8ShXfZq>PH33HS8 z&8Cf8)o3mEm%o!c-fd);wXldf?QomsRH2i|5OJhazhCxInhBmO*^e9(hdgV^ z(yW0l+h}OPET514yfe zYJW?sZixR#t9O4%tDmrH0wpipb@+m3S)3{^5Vz%Y#yqOQQVf1C3T&w;nlEADuP8L} z0gUy;redlRBft3~2}TL9&{A5vj8!}2!%!t%4~BsGG|)&)a)f8mXXlLZCB`w+k?NSQ zf{Gh+s|>*}6Vt$)cRUhLor{6d{*f?3{9EuA)`eU%0C|yfM7q(*$Gl^4hpzP>5i8IuzY@Vd9!yo@j3ufJJWZUI3|Ag zRlY=(W4lu=x640zUDY>W%Zk?StJx zg#K30L`8$Y|52_RUw=bo4ad{#(mM@pzcCbV3;^D|zQ!x-j zkr1GbF@-0}9TerHplmEH?)1%bTM*4c?dhBa@l-Z_MvY~wxjH{X1 z2eTP|SST?X6?-9qPMT_17w(zVbcgTyZYto#UYm6sTM-`^B#M|j4_r6x)W;j+&- zwzj5+FsTm-HMY$6w=_ndwC;*IYZ;wrA6gG%6bHu-{v@+$aE7OMM{sJZz_DT~G)1UG z{joXbVGDE}E~ffguewhBO`+^<>Os0#xgB=QKLqN$5I~@!OQ!9&@?0C)SZ%lbUd86N z&e#Dm!xL+?SL5S3&eaijB~6}Mnl3_iUeR^m`~1kKohGE1Z0*vbwG0;Wj88LrqXuUx z>aVJxu&TAq^VW{*ITUh~QK#JFC9d=~0-VFG=1DOk`}bq8N?W}xh}o(#gJ4cXX67b7 zFu6IahXNbbc!7ra(;KlmkC)6StxG3t50KmtqIx~I_Y5z6ujGMGOsS?KP`Cb67ic!o zRI8OGm1O1Z>&?Bu5##QGRM!WHV(1#QQ2HlOT4jnwzJY3pb`Pv7i-U06;F*gz74G7n zt51J--UCjIJX7+s34G5y>+C1&`kL_l8d2C6Q;eS1zXYVw|3I@z+UJgJPydCY+OE(+ zb*(!O4%wnVJcvy8ju4AgD677bez%H!Al3{Bkf%%2Qo4(PV3VOEw)Fz-b6@D_X=~nq zr*{dI^4q~zV4vpfA+=~mHrdK5k-SY+4LkATylV(mJw*Cb9~?8}M`gL)7p<258W{ky zHKl`jXMJ+gmwI;Y%wTo zR;H%Bj39xdP={H@s!nU$7iMB{fQ3&`mH#f~-Tj{{~qp@%8@!S(gEj71EE=*iC?0 z-ApmxU9zS$Lv4u=gKQ{2ap>z%W50p-afxW?Qpx+zjyN97rqS;nJPo?rbFC087k<(v zC&F_OzU35_yx4hF;>X>$ppWm_PNc)VC-^z;V%+8Me_)c)ccL&sW`WgzFHUW+b+kZ^ zN4q|{sHM#g4SOo(HwB;25y7-u-q*bkIk?pu6)ACZDYd79ob9sh34hAUwq<6Vn-q`s z=0Cot_2dnbKAjPXmQOrJLb%RuLy^a+J&&08PuaD2YPHIy4P|st{AwA886(a(z_-;a z>|&BtL~zIRafV;XS=)?CyKIpa(Mh(PH5C#~^w+(2R96HtE-Fy2xGwWkmg%=MNHee8 zLtzKNHq&7&tQIo_U};oI zD{HOCl@85tH@Iw(u6xkb%FQJDV}^YUU`M4 zDzAJNyMHNA$A-(kl^F(&v}l`Ax^oU9BJuCX9_aN6RAkTj^vn@_jfbpgQ{DWVy43Zf zF3O$it`+AUfqcX(;P=th+pAnEQaf~WPI#S=n(ATcPOatsqz=!yH$oWBQ1|BOcJ6aJ zZvNO1()F=GgoSzmql@{X=n8jARZfwd6(N^1`lgV<{f^~nrB>APsH6OlTt>gXmqy4f zOsjOdIjP~H$eu~mW+AZ}5*n0+T&3YQS9{)s=P^h0e7hRNonKy3f7o1qJsftH^iD&R zTivrZrR@#a)t;%X$bi=*V|*B>_hEj%U}tx!zpk5rW)hKTZ;jnArU<7`y9*6wbV;F~ zoUyE2VPmHlQrJ$2v9ZtSFP+sH4tJ_WXV4TaT>fS8x_9!yOSDzZOkV?^McX|j*BtrV zD{ym%wM6C@Uu-}2T|#My;5g#Zp;S@GuA1|dEWa9SVznd42`vJGW;~t-~uRBl4f$4RWKCKWO99YX}Y6uCFQ;z0UamO=`ra|VIN1mJ9Qi=bh%k9{XBC>Rl^ ztS=#&g@m7$w4%3r#W2C9+D4074A%yczB-xs4Dpv}v9=L!g1sedZWPlCST&prJ}uUd zm0yY|;Y7J8Yb4{)uXRWHXQ0js#Tx~I1PzKhLbd-Vz6u6@_^7E&H1JyK3g^V{t8?_m zoCd}VxO-!qn)Vewf5drpcg6fS#;4pall{0+XKD$qVq5{qvOjc8z8H6pzP~O%R9jWq zItlK_YpN~CUOUBc0+W|DI5olt)7ZN@9slE_1}goBkNSQ?hv*fQ{k_Ic5X)>^K%&J* zcJ0xtf$d!eviitRT0pjTtMm?>I#^GGzqpF<6y-HG89DIQr`1iigruE<<64X>>uYjb zhNc9UgF)#}Qw_q+$u6CbQDoG`$lnk<_W3~s8sD^s#(<6n014Zs>tnugxsYlwGzdJ>xpFqk* z4|%~oLQA0LuSS@lO|9Krd=ZCjb{-}abq%4+G%PE6o-CdiS+MpCxs6N1~zU4c<&sc5H zIdpCswfkb*PB&OO4-`P6>Nw13c!1}Q7xtBY>E1ShQl3lP`ILCru+Co=^Rg4wdi6vw zYe&9KsbGC_rSom%haBh zhez$va;Ly`u{kE0J2CA3ibAOOWH)GH;`fSzkmO_Eq_EdKI>HI2A&q|J(M>n^W&Phy z>bn|B!e*d>_T`J^&HZz5Uq|C0>zhe=D_leP0r?Ws7sEHTmB}&Or<6RA{M9Qtyhi-< zzjDu}99;u}G9`Rn3n=^&>}Qk>wX!K-sOt#L+~!vQ+nuM`4eBr%&&(4g&J}IkA?=#W z)$22yGGYK6=1hBZ0c={F4RI0bc2PaJ)#T^FV!_SWo6(c^mt=fiD|FkQqBb4*y5w&TrdqBS4Ne1P4hE3~#`tW!Nl%OBR~{F0 zgjeco-&~Jq+wGc^NzSkqqRb5%{N7uUIH7SPn(C^_Th>cjE>DV=TI}<@!H1bg(Yf6o9wPndkU0UFsZEEm@cav(pR?w zCb&2{Z$|hR6fB(f@cW@!&ns|PniEi$#K#P7%N6u^54=}rr;ucxQB=q0n47P>8oasi zbSOW6g6;I4OEY1SV>T5SBz|kP!5)=CO%DgCIB8H1m>6O;+Y6<$dZw-Bm z>7K|Kv|5_s+;W%TtCICC?`xud8{Y`hJF*}ZWF$%@i^ z9&a3089d*lj3H4?`55QG3_o&{A&-ji(0Re^iX z1tQO>hCE%>V*0Sepm$;!rOmGd4r*?dekVh%KHne*wtC_AS&^WDo;=`p%jxFjc!{Qv zNvA#sH*Ux>%EZBNU;$!XYG%5}`|g<-*B7sj$zIjTI|uowsaYX^YcSDJZf7_t(C$=h z!|s*H(`oZ5|Lo?am9j?U(h@F!cA)wpO5UNAE?+akv&ZxH z=BP~nhy92ZjhLg(Lfsdl@ypLMnZIWHe16D5ZT=;q)-nHEL`7e1_1JDV6fLOD7V+P% zi>qy!iZ-Q^7cxZm_FsT>A5~9H$`G*ISLNc@be3u7Byp8GDZDY{+NQ|SN z@Kl#4ojA)kRehOeT$rjVQ>qu{=HG+6Bdd*XS)l2bWcCs(LJ_LIqj6a>Pi^|U4lJ96 zmo-tbsA>02J2!BP1|l~JwH0G$51sqV)V9?#fo*aG>T|EQ_;Rp42V7q0y!Tqojt}dx ztY=W#5fx#;+M6PV?DO6g)g^OJF_v9$`$GM2NFJ~t1mLLK7N|W?dO!BQU@Pe>3KEmC zesQ;i;=s2uQ1~`}X}X>i*{Tbzylmb1b=`9t!j~dxhgBur6aqK_=H_4L5Y+kj6Ia#1 z9TzR$PwGc=?F!Z!pM5e%Goiq_3z&iGYbPutuD(h0(4OK_l{OhK&W%|UC@7-F(^s9?JGV1Egi=)S@c}naoODgifgo`;Q!nWMD zA#sNTB0Bd=;Z$GKi3i4*)*7QP-gjZ*!ptYv-0g;;BJ0zY;N;I)b>`Y+v@)X^rzEhY z8O4+YT&U!xk+m}BSz)q11%9*MW(|TK`A#NLjr&K-BAt&0csfkQxLYJxXIfGlN981n zFFK+}1ehd{$a|CQtsS-s7KDfmO0OGER}`1!V^G)1b}wFE6y*8R%|u_=EY^#V#t&>_ z-KdIRsjwkwaLgTe^1D=?IE^$`Q z4;YpCYfGXSKMa3Li~1+fPmkQd0!zhDol%!c?@Z}|(NwIw+ksSjt-vUglyo#t!OJWU z+b)2>qEoJkpJWU4ym4_Vo83* zaJX*;E?BYROxkartFt5tH|`^5gb@i^$`Mb|$}@NVi$$FR@X+so5b!n#Q*1YR0azywqY5Gw1F+40+iJZB9$G& zcAr4#!|!DLYPk|F+=Fa3e05is_N9@y_Vkx}#HosoH8sJf4caYc>?|H-naQ&E`l3BO+tY{CndO;; z^VU=-#$!0B@TBVtUzO-^m)Pe@fnxIXcQUA(Is$)SD!jfL8lQ*IpmMSrS(=3KP2yW< zYGM?-`_t)q{Ao?rHo{};=ei@?Bg*iQce?_aH~se1nmMX3#p3psy#IZ~U|j zZAYRpzR`VdeCQT|&il2AhCVS}#fk7kaF*pSdLL)vfsaaW27GZUjjyISf-yh))xr2w zEjw*sw2vP6;9!MmM}f!l@<}!Kf7gN^-b03oKg;5;+9n!(owh^!ZdBy{Atzb8h&%9; z*dAU9LD7^HcgT^i>fMqrjC=2ecYY3e<>)I7q7Na0lfYz0a>ja-eD%l2_vf>fdICc;8=*1}jCP1vCxHMpn;L&_-uy|++viRYi0OD<$-xCc>y zKgy@2wlXulsq!;qkLAm~c6l-=9qDvF_DwQFq1r(lRQAJC{R{5Aj6E*)Lw7-+6GKr% zG94Xa0^94Ctn~}bIJN|a=(VhX?`knUNsW9WFoaQ>smCdG zve@|g28GbjM3d!6e(kk)E=LH1wJ;hGNp|V=I+$a{k=DyDvcDkk)Rb_1*62_gdX^PEjh^ zxRF`ZOT0Dt2g5A5%-GPMUo1Q!{*t zy~;;nQbf&lwCtEXD-7QD2@P?({TaiNiVZ=|KkG8JQW|aEk&U#Opw5`6s^RX~MB8Z+ z;tmngfETinC{nw`%*bkEh{mjwyN*0dF|`2)1ooKlR{tpbH`5w_RqJ#{PrQ~~_Y?qm zSDC%|FGn>i_xt%@j%s^{^6n+9o7X4!-JO%Gw&KsNu^=uY`wR8yl}kkCFCPS)IHnZ# z)`Jom{Np)d1AnBO_q4sA*~fvFhmF63Vv?N@>*DSLdO8Dmw=JeifyPVk&~7Pg>pr2> zebF6`91l+zN~h_>WP~WL9kjD|{y{(l+fo8wOCRpN6h+txtT_HwkPpmuZ3Ov!rd>)* zSOr5E(7y2p|KO{4ElU;|tky%Y7Ecr1+g;PM96FDifNeL?96r_VR1YycYY&Dhu)ELO zM!!P;_4?)Sr^iDj%BuDz>7tvpJY842m&(><(3zh|i_GJ++BO#`uF6+S4h2hCLc(#} zMeRlYWwe5IoTd-{htWzlu~HFsdEK;HwS({ql&3->v}i#Jo?7@h$=Jgq=Jydk{`38Z zSGH40vmR>*p>j@adN~}%jf(s@-r7Pta|^_Rc+jfPVdR;1{6H9AShhj(y#QFf5eXkd zCxwQ=O%wg@EOM7iV?D9{Yl^bemY_uxcI{bP*`p1w?zVU6j@)=J^Lm$v6rz!a;Z6bp z-)IwE$6CJ^p%d?-)T#Tc|_9&gS(%!X~r% zSppCu*~3bBmj=OHgRk+e`b_Gz$l*_A5;ktpyvsbmd4Gfi9vZ}8Qm3&+Y9D`Ew2C>sJQ#hkcjNm zGP%-a=sL*bv2a@5)hBxMbAx)NtIm7DLTF9%(CEF8-O|8eSP)wfgr$rAb!wm6qcBBe z2kb5|c~bbGC6G;?hu4J}RLUmAgi~{K&}B#1+(FtpFWA~>ecE=jaHE+Q*7c#zVacHY zsY*FDOWZK{gUte5%TO-4{0Xp`y|y;$I-0Xh8hAz3{N1c*PC(KOBCoO5x9bZyraL&B}15Y`U-8ctDEl%;c}To_0@Pm*@u@&b&JLZO?wO*_0+1) zXtVm4P7PU&P$ z`)F8)@Az3IQ|z3g)|)SCgsWv}^=UJd8e8k9iuN%gnkhFk;+vsZP^b`uj)t||^-lzW zuF}1O>e13rMZBcq+0QLoXXJdF3^BcT<05{};nr;ZbNm0;scgm%zWiC4l!-K9=ki;> z_MtX3BOFnV%@x^e}T^&6`A3F1|=@W5` z9lw64iSI#*@MtiHfhLZmsEE3gWJe)7s!6rF+lqA~K z)j59@z3}TV4wU|SL`m7; zjWl>wo&SZWuG~5kfu2)-aNR9AQMbW*t|o4{=Svchb=K%zL8(${z>?wJ&p6jGbX&-& zg=^ZOV)_?s9>E5~T!Q>90x6=$6w9J~${%`6O!m{y$Adz`uN`mj4zRj*8xu<%yv~dF zk^uDYw_>;Z`|}}#QF#U>8f$6V&Qyo(AIbEU(YHYoW{s4i-KumrI++?jYp0bScz2>T z(-W~D=;s-efoJ_Vq}VieomzISCdo%loWKk-)l`|+SIky`+7 zb>hvvD=0uaU@XA*u<4ReQEwvtK;=o@w2!MZ=ye}KQ=crwwCcc3)aeu6(EeR-%%{|Z zu-`_o(vZL9-j_0@-~Jh{6elAv{b`x|yV)WtbI~HxXUR(^^hsPo;VznqpapCAGaf{u zk6}($K0>d5wxJ~44-{P|g!~W;A*1Ep=;R7UDADk+lhY#1F;Sc7MTKe7Y|xEE1I))n zmZn-&bZTH_L_o1vNnNgXV zQzi|6JQfW#jQ{*p&Wj}A+xANZRpOVprG z`bv#7q6-CNN&24D_Y#g0aFgYXp?AC;G5G=&Qu(zhTZlc}`n+YX9=wm<> z{)MzAWLLsfEU4Y<*A8I}PqybdNckiS5Y2AY2oo~)F=HC$dZ0`)PT>3mA0-ptHGVKd za|-)>jb|6b)$hk(#G0BJ`vtio4qp{x)2r^j#aQJk0Aq?MdrPv0NKFBor^lck!(mVa4hs9Z99K5u7RDy|Nbk?7gyW?Bn z)-GHPo<2&8OpwVupDl^uXt^4RZsPB5Mk;>TVJ>x5dI9E#xAJJvEzmuHZpH8-^bf8Y z1_E$Z|IuauSN)^(H?F#zzUj4~&A#H0HHWq6NDoLQUbGUx|;!X5#Ml&m*Y)rG}|v=`tRU&8%5 zqO2QKYWH7XPfIp3%N{T%t48z`E0MPWWv(G$a-m8>X=*5)jbCc&KbyfgGE5E3_1G`v zQaIbNRWxF2jT`t16PL8GL2?}0Vtpe?rD?p2r&qCmGXo+O@x(3{Uh~0XeFOdj=@N3$ zAj&(Hb57NfT0ec9U&gza(>6Pi-f=M5Rb-$L11Vaq5{i8IHMiz+u`mvFP{859zdm zV`h=YzoFE0+zaJ^PdmWpqc&m}^I@G>fUkDnDOU)|Q5zb6q#9_{kikOHFkNw>RV_~LV zYMpL2>grR9s%L$Z;mD z{{sH0?uC_F?5sJ}3OYrqJgEeG5q0|t?!;H`m2?&JCU@`vatqgh#~h>tHfB8IiwCa| zH+mQQ-f=>P*?|%GJm7{=E@ueU+HUKwOv z4&?^v)~1YzCQKRYMU*H4dj-wR3M?&b9E`_s z&^m1&D~Evish=AjB32(eiKmu&m;`Cxz@>2(iqLe@-POjp`lmSLMQ$Zg4x7(Lj93sx zgzsmH$RB1~eDU&ML)y9g{)(%c&O#EM8Rcf-s*gkhx|u(*$R_{ns61-&8)R*g`j!tB zF$mu>{R7*b=T*UIV-|ZvR2ZdvUb&q(0htJ!LP6=o=n`Ep_|BlnMcAoDp_ehRw7_%fOP@p71;L^mwP^t@+=NM0TvF{6MzTdEQ^y4+`-k5^JME?;4x^jQoP U+PZG$p@1(r>5o$7?~OzM5BF{)-~a#s literal 0 HcmV?d00001 diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 74fb5eb..10e3269 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -77,6 +77,13 @@ class HomePageState extends State { new UserAccountsDrawerHeader( accountEmail: const Text('jonas@try.vikunja.io'), accountName: const Text('Jonas Franz'), + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/graphics/hypnotize.png"), + repeat: ImageRepeat.repeat, + colorFilter: ColorFilter.mode(Theme.of(context).primaryColor, BlendMode.multiply) + ), + ), ), new Expanded( child: ListView( diff --git a/lib/pages/list_page.dart b/lib/pages/list_page.dart index 59e204b..0297088 100644 --- a/lib/pages/list_page.dart +++ b/lib/pages/list_page.dart @@ -10,17 +10,66 @@ class ListPage extends StatefulWidget { } class _ListPageState extends State { + Map items = { + "Butter": true, + "Milch": false + }; + @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: new Text(widget.listName), ), - body: Center( - child: RaisedButton( - onPressed: () => Navigator.of(context).pop(), - child: const Text("Go back")), + body: ListView( + padding: EdgeInsets.symmetric(vertical: 8.0), + children: ListTile.divideTiles(context: context, + tiles: items.map((item, checked) => + MapEntry(item, CheckboxListTile( + title: Text(item), + controlAffinity: ListTileControlAffinity.leading, + value: checked, + onChanged: (bool value) => setState(() => items[item] = value), + )) + ).values + ).toList(), ), + floatingActionButton: FloatingActionButton(onPressed: () => _addItem(), child: Icon(Icons.add)), ); } + + _addItem() { + var textController = new TextEditingController(); + showDialog( + context: context, + child: new AlertDialog( + contentPadding: const EdgeInsets.all(16.0), + content: new Row(children: [ + Expanded( + child: new TextField( + autofocus: true, + decoration: new InputDecoration( + labelText: 'List Item', + hintText: 'eg. Milk'), + controller: textController, + ), + ) + ]), + actions: [ + new FlatButton( + child: const Text('CANCEL'), + onPressed: () => Navigator.pop(context), + ), + new FlatButton( + child: const Text('ADD'), + onPressed: () { + if (textController.text.isNotEmpty) + setState(() => items[textController.text] = false); + Navigator.pop(context); + }, + ) + ], + ), + ); + } } diff --git a/pubspec.yaml b/pubspec.yaml index 2922856..bd1d234 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -78,6 +78,7 @@ flutter: # see https://flutter.io/custom-fonts/#from-packages assets: - assets/graphics/background.jpg + - assets/graphics/hypnotize.png fonts: - family: Quicksand fonts: From 80d55a3518c0dc76d1e4d694a2503a7d030486ed Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sun, 16 Sep 2018 21:47:33 +0200 Subject: [PATCH 11/99] Add login view Add services and models Add mocks --- android/app/build.gradle | 2 +- lib/api/client.dart | 12 ++++ lib/components/GravatarImage.dart | 14 +++++ lib/global.dart | 99 +++++++++++++++++++++++++++++ lib/main.dart | 8 ++- lib/managers/user.dart | 24 +++++++ lib/models/namespace.dart | 25 ++++++++ lib/models/task.dart | 58 +++++++++++++++++ lib/models/user.dart | 18 ++++++ lib/pages/home_page.dart | 77 +++++++++++++---------- lib/pages/list_page.dart | 89 +++++++++++++------------- lib/pages/login_page.dart | 100 ++++++++++++++++++++++++++++++ lib/service/services.dart | 32 ++++++++++ pubspec.yaml | 2 + 14 files changed, 481 insertions(+), 79 deletions(-) create mode 100644 lib/api/client.dart create mode 100644 lib/components/GravatarImage.dart create mode 100644 lib/global.dart create mode 100644 lib/managers/user.dart create mode 100644 lib/models/namespace.dart create mode 100644 lib/models/task.dart create mode 100644 lib/models/user.dart create mode 100644 lib/pages/login_page.dart create mode 100644 lib/service/services.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 2eda7a0..f94225f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -39,7 +39,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "io.vikunja.flutteringvikunja" - minSdkVersion 16 + minSdkVersion 18 targetSdkVersion 27 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/lib/api/client.dart b/lib/api/client.dart new file mode 100644 index 0000000..033dda0 --- /dev/null +++ b/lib/api/client.dart @@ -0,0 +1,12 @@ +class Client { + final String _token; + + Client(this._token); + + bool operator ==(dynamic otherClient) { + return otherClient._token == _token; + } + + @override + int get hashCode => _token.hashCode; +} diff --git a/lib/components/GravatarImage.dart b/lib/components/GravatarImage.dart new file mode 100644 index 0000000..cab902c --- /dev/null +++ b/lib/components/GravatarImage.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; + +import 'package:crypto/crypto.dart'; + +class GravatarImageProvider extends NetworkImage { + GravatarImageProvider(String email) : super( + "https://secure.gravatar.com/avatar/" + md5.convert( + email + .trim() + .toLowerCase() + .codeUnits + ).toString() + ); +} diff --git a/lib/global.dart b/lib/global.dart new file mode 100644 index 0000000..d634c09 --- /dev/null +++ b/lib/global.dart @@ -0,0 +1,99 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:fluttering_vikunja/api/client.dart'; +import 'package:fluttering_vikunja/managers/user.dart'; +import 'package:fluttering_vikunja/models/user.dart'; +import 'package:fluttering_vikunja/service/mocked_services.dart'; +import 'package:fluttering_vikunja/service/services.dart'; + +class VikunjaGlobal extends StatefulWidget { + final Widget child; + final Widget login; + + VikunjaGlobal({this.child, this.login}); + + @override + VikunjaGlobalState createState() => VikunjaGlobalState(); + + static VikunjaGlobalState of(BuildContext context) { + var widget = context.inheritFromWidgetOfExactType(_VikunjaGlobalInherited) as _VikunjaGlobalInherited; + return widget.data; + } +} + +class VikunjaGlobalState extends State { + final FlutterSecureStorage _storage = new FlutterSecureStorage(); + + User _currentUser; + Client _client; + bool _loading = true; + + User get currentUser => _currentUser; + Client get client => _client; + + UserManager get userManager => new UserManager(_storage); + UserService get userService => new MockedUserService(); + + @override + void initState() { + super.initState(); + _loadCurrentUser(); + } + + void changeUser(User newUser, {String token}) async { + setState(() { + _loading = true; + }); + if (token == null) { + token = await _storage.read(key: newUser.id.toString()); + } else { + // Write new token to secure storage + await _storage.write(key: newUser.id.toString(), value: token); + } + // Set current user in storage + await _storage.write(key: 'currentUser', value: newUser.id.toString()); + setState(() { + _currentUser = newUser; + _client = Client(token); + _loading = false; + }); + } + + void _loadCurrentUser() async { + var currentUser = await _storage.read(key: 'currentUser'); + var token; + if (currentUser != null) { + token = await _storage.read(key: currentUser); + } + var loadedCurrentUser = await userService.get(int.tryParse(currentUser)); + setState(() { + _currentUser = loadedCurrentUser; + _client = token != null ? Client(token) : null; + _loading = false; + }); + } + + @override + Widget build(BuildContext context) { + if (_loading) { + return new Center(child: new CircularProgressIndicator()); + } + return new _VikunjaGlobalInherited( + data: this, + child: client == null ? widget.login : widget.child, + ); + } +} + +class _VikunjaGlobalInherited extends InheritedWidget { + final VikunjaGlobalState data; + + _VikunjaGlobalInherited({Key key, this.data, Widget child}) + : super(key: key, child: child); + + @override + bool updateShouldNotify(_VikunjaGlobalInherited oldWidget) { + return (data.currentUser != null && data.currentUser.id != oldWidget.data.currentUser.id) || + data.client != oldWidget.data.client; + } +} diff --git a/lib/main.dart b/lib/main.dart index d3319d9..0feae67 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,9 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:fluttering_vikunja/global.dart'; import 'package:fluttering_vikunja/pages/home_page.dart'; +import 'package:fluttering_vikunja/pages/login_page.dart'; import 'package:fluttering_vikunja/style.dart'; void main() => runApp(new VikunjaApp()); @@ -11,7 +15,7 @@ class VikunjaApp extends StatelessWidget { return new MaterialApp( title: 'Vikunja', theme: buildVikunjaTheme(), - home: new HomePage(), + home: VikunjaGlobal(child: new HomePage(), login: new LoginPage()), ); } -} +} \ No newline at end of file diff --git a/lib/managers/user.dart b/lib/managers/user.dart new file mode 100644 index 0000000..15fb315 --- /dev/null +++ b/lib/managers/user.dart @@ -0,0 +1,24 @@ +import 'dart:async'; + +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +class UserManager { + final FlutterSecureStorage _storage; + + UserManager(this._storage); + + Future> loadLocalUserIds() async { + return await _storage.readAll().then((userMap) { + userMap.keys + .where((id) => _isNumeric(id)) + .map((idString) => int.tryParse(idString)); + }); + } + + bool _isNumeric(String str) { + if (str == null) { + return false; + } + return double.tryParse(str) != null; + } +} diff --git a/lib/models/namespace.dart b/lib/models/namespace.dart new file mode 100644 index 0000000..e62c5be --- /dev/null +++ b/lib/models/namespace.dart @@ -0,0 +1,25 @@ +import 'package:fluttering_vikunja/models/user.dart'; +import 'package:meta/meta.dart'; + +class Namespace { + final int id; + final DateTime created, updated; + final String name, description; + final User owner; + + Namespace( + {@required this.id, + this.created, + this.updated, + @required this.name, + this.description, + this.owner}); + + Namespace.fromJson(Map json) + : name = json['name'], + description = json['description'], + id = json['id'], + created = DateTime.fromMillisecondsSinceEpoch(json['created']), + updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), + owner = User.fromJson(json['owner']); +} diff --git a/lib/models/task.dart b/lib/models/task.dart new file mode 100644 index 0000000..0b0b795 --- /dev/null +++ b/lib/models/task.dart @@ -0,0 +1,58 @@ +import 'package:fluttering_vikunja/models/user.dart'; +import 'package:meta/meta.dart'; + +class Task { + final int id; + final DateTime created, updated, reminder, due; + final String text, description; + final bool done; + final User owner; + + Task( + {@required this.id, + this.created, + this.updated, + this.reminder, + this.due, + @required this.text, + this.description, + this.done, + @required this.owner}); + + Task.fromJson(Map json) + : id = json['id'], + updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), + created = DateTime.fromMillisecondsSinceEpoch(json['created']), + reminder = DateTime.fromMillisecondsSinceEpoch(json['reminderDate']), + due = DateTime.fromMillisecondsSinceEpoch(json['dueDate']), + description = json['description'], + text = json['text'], + done = json['done'], + owner = User.fromJson(json['createdBy']); +} + +class TaskList { + final int id; + final String title, description; + final User owner; + final DateTime created, updated; + final List tasks; + + TaskList( + {@required this.id, + @required this.title, + this.description, + this.owner, + this.created, + this.updated, + @required this.tasks}); + + TaskList.fromJson(Map json) + : id = json['id'], + owner = User.fromJson(json['owner']), + description = json['description'], + title = json['title'], + updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), + created = DateTime.fromMillisecondsSinceEpoch(json['created']), + tasks = json['tasks'].map((taskJson) => Task.fromJson(taskJson)); +} diff --git a/lib/models/user.dart b/lib/models/user.dart new file mode 100644 index 0000000..b7b61c7 --- /dev/null +++ b/lib/models/user.dart @@ -0,0 +1,18 @@ +import 'package:meta/meta.dart'; + +class User { + final int id; + final String email, username; + + User(this.id, this.email, this.username); + User.fromJson(Map json) + : id = json['id'], + email = json['email'], + username = json['username']; +} + +class UserTokenPair { + final User user; + final String token; + UserTokenPair(this.user, this.token); +} \ No newline at end of file diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 10e3269..d8d2ce8 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:fluttering_vikunja/components/GravatarImage.dart'; import 'package:fluttering_vikunja/fragments/namespace.dart'; import 'package:fluttering_vikunja/fragments/placeholder.dart'; +import 'package:fluttering_vikunja/global.dart'; +import 'package:fluttering_vikunja/models/user.dart'; class HomePage extends StatefulWidget { @override @@ -26,39 +29,45 @@ class HomePageState extends State { _addNamespace() { var textController = new TextEditingController(); showDialog( - context: context, - child: new AlertDialog( - contentPadding: const EdgeInsets.all(16.0), - content: new Row(children: [ - Expanded( - child: new TextField( - autofocus: true, - decoration: new InputDecoration( - labelText: 'Namespace', hintText: 'eg. Family Namespace'), - controller: textController, - ), - ) - ]), - actions: [ - new FlatButton( - child: const Text('CANCEL'), - onPressed: () => Navigator.pop(context), - ), - new FlatButton( - child: const Text('ADD'), - onPressed: () { - if (textController.text.isNotEmpty) - setState(() => namespaces.add(textController.text)); - Navigator.pop(context); - }, - ) - ], + context: context, + child: new AlertDialog( + contentPadding: const EdgeInsets.all(16.0), + content: new Row(children: [ + Expanded( + child: new TextField( + autofocus: true, + decoration: new InputDecoration( + labelText: 'Namespace', hintText: 'eg. Family Namespace'), + controller: textController, + ), + ) + ]), + actions: [ + new FlatButton( + child: const Text('CANCEL'), + onPressed: () => Navigator.pop(context), ), - ); + new FlatButton( + child: const Text('ADD'), + onPressed: () { + if (textController.text.isNotEmpty) + setState(() => namespaces.add(textController.text)); + Navigator.pop(context); + }, + ) + ], + ), + ); + } + + @override + void initState() { + super.initState(); } @override Widget build(BuildContext context) { + var currentUser = VikunjaGlobal.of(context).currentUser; List drawerOptions = []; namespaces.asMap().forEach((i, namespace) => drawerOptions.add(new ListTile( leading: const Icon(Icons.folder), @@ -66,6 +75,7 @@ class HomePageState extends State { selected: i == _selectedDrawerIndex, onTap: () => _onSelectItem(i), ))); + return new Scaffold( appBar: AppBar( title: new Text(_selectedDrawerIndex == -1 @@ -75,14 +85,17 @@ class HomePageState extends State { drawer: new Drawer( child: new Column(children: [ new UserAccountsDrawerHeader( - accountEmail: const Text('jonas@try.vikunja.io'), - accountName: const Text('Jonas Franz'), + accountEmail: currentUser == null ? null : Text(currentUser.email), + accountName: currentUser == null ? null : Text(currentUser.username), + currentAccountPicture: currentUser == null ? null : CircleAvatar( + backgroundImage: GravatarImageProvider(currentUser.username) + ), decoration: BoxDecoration( image: DecorationImage( image: AssetImage("assets/graphics/hypnotize.png"), repeat: ImageRepeat.repeat, - colorFilter: ColorFilter.mode(Theme.of(context).primaryColor, BlendMode.multiply) - ), + colorFilter: ColorFilter.mode( + Theme.of(context).primaryColor, BlendMode.multiply)), ), ), new Expanded( diff --git a/lib/pages/list_page.dart b/lib/pages/list_page.dart index 0297088..fc29755 100644 --- a/lib/pages/list_page.dart +++ b/lib/pages/list_page.dart @@ -10,10 +10,7 @@ class ListPage extends StatefulWidget { } class _ListPageState extends State { - Map items = { - "Butter": true, - "Milch": false - }; + Map items = {"Butter": true, "Milch": false}; @override Widget build(BuildContext context) { @@ -23,53 +20,57 @@ class _ListPageState extends State { ), body: ListView( padding: EdgeInsets.symmetric(vertical: 8.0), - children: ListTile.divideTiles(context: context, - tiles: items.map((item, checked) => - MapEntry(item, CheckboxListTile( - title: Text(item), - controlAffinity: ListTileControlAffinity.leading, - value: checked, - onChanged: (bool value) => setState(() => items[item] = value), - )) - ).values - ).toList(), + children: ListTile.divideTiles( + context: context, + tiles: items + .map((item, checked) => MapEntry( + item, + CheckboxListTile( + title: Text(item), + controlAffinity: ListTileControlAffinity.leading, + value: checked, + onChanged: (bool value) => + setState(() => items[item] = value), + ))) + .values) + .toList(), ), - floatingActionButton: FloatingActionButton(onPressed: () => _addItem(), child: Icon(Icons.add)), + floatingActionButton: FloatingActionButton( + onPressed: () => _addItem(), child: Icon(Icons.add)), ); } _addItem() { var textController = new TextEditingController(); showDialog( - context: context, - child: new AlertDialog( - contentPadding: const EdgeInsets.all(16.0), - content: new Row(children: [ - Expanded( - child: new TextField( - autofocus: true, - decoration: new InputDecoration( - labelText: 'List Item', - hintText: 'eg. Milk'), - controller: textController, - ), - ) - ]), - actions: [ - new FlatButton( - child: const Text('CANCEL'), - onPressed: () => Navigator.pop(context), - ), - new FlatButton( - child: const Text('ADD'), - onPressed: () { - if (textController.text.isNotEmpty) - setState(() => items[textController.text] = false); - Navigator.pop(context); - }, - ) - ], + context: context, + child: new AlertDialog( + contentPadding: const EdgeInsets.all(16.0), + content: new Row(children: [ + Expanded( + child: new TextField( + autofocus: true, + decoration: new InputDecoration( + labelText: 'List Item', hintText: 'eg. Milk'), + controller: textController, + ), + ) + ]), + actions: [ + new FlatButton( + child: const Text('CANCEL'), + onPressed: () => Navigator.pop(context), ), - ); + new FlatButton( + child: const Text('ADD'), + onPressed: () { + if (textController.text.isNotEmpty) + setState(() => items[textController.text] = false); + Navigator.pop(context); + }, + ) + ], + ), + ); } } diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart new file mode 100644 index 0000000..cd229a2 --- /dev/null +++ b/lib/pages/login_page.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; +import 'package:fluttering_vikunja/global.dart'; +import 'package:fluttering_vikunja/main.dart'; + +class LoginPage extends StatefulWidget { + @override + _LoginPageState createState() => _LoginPageState(); +} + +final RegExp _url = new RegExp( + r'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)'); + +class _LoginPageState extends State { + final _formKey = GlobalKey(); + String _server, _username, _password; + bool _loading = false; + + @override + Widget build(BuildContext ctx) { + return Scaffold( + appBar: AppBar( + title: Text('Login to Vikunja'), + ), + body: Builder( + builder: (BuildContext context) => SafeArea( + top: false, + bottom: false, + child: Form( + autovalidate: true, + key: _formKey, + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Image( + image: AssetImage('assets/vikunja_logo.png'), + height: 128.0, + semanticLabel: 'Vikunja Logo', + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: TextFormField( + onSaved: (serverAddress) => _server = serverAddress, + validator: (address) { + var hasMatch = _url.hasMatch(address); + return hasMatch ? null : 'Invalid URL'; + }, + decoration: new InputDecoration( + labelText: 'Server Address'), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextFormField( + onSaved: (username) => _username = username, + decoration: + new InputDecoration(labelText: 'Username'), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextFormField( + onSaved: (password) => _password = password, + decoration: + new InputDecoration(labelText: 'Password'), + obscureText: true, + ), + ), + ButtonTheme( + height: _loading ? 55.0 : 36.0, + child: RaisedButton( + onPressed: !_loading + ? () { + if (_formKey.currentState.validate()) { + _loginUser(context); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : Text('Login'), + )) + ], + )), + ), + )); + } + + _loginUser(BuildContext context) async { + setState(() => _loading = true); + var vGlobal = VikunjaGlobal.of(context); + var newUser = await vGlobal.userService.login(_username, _password); + vGlobal.changeUser(newUser.user, token: newUser.token); + setState(() { + _loading = false; + }); + } +} diff --git a/lib/service/services.dart b/lib/service/services.dart new file mode 100644 index 0000000..82428ee --- /dev/null +++ b/lib/service/services.dart @@ -0,0 +1,32 @@ +import 'dart:async'; + +import 'package:fluttering_vikunja/models/namespace.dart'; +import 'package:fluttering_vikunja/models/task.dart'; +import 'package:fluttering_vikunja/models/user.dart'; + +abstract class NamespaceService { + Future> getAll(); + Future get(int namespaceId); + Future create(Namespace ns); + Future update(Namespace ns); + Future delete(int namespaceId); +} + +abstract class ListService { + Future> getAll(); + Future get(int listId); + Future> getByNamespace(int namespaceId); + Future create(TaskList tl); + Future update(TaskList tl); + Future delete(int listId); +} + +abstract class TaskService { + Future update(Task task); + Future delete(int taskId); +} + +abstract class UserService { + Future login(String username, password); + Future get(int userId); +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index bd1d234..586f860 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,6 +19,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 + flutter_secure_storage: 3.1.1 dev_dependencies: flutter_test: @@ -79,6 +80,7 @@ flutter: assets: - assets/graphics/background.jpg - assets/graphics/hypnotize.png + - assets/vikunja_logo.png fonts: - family: Quicksand fonts: From 03fda04afac81d05c8a05cbe5f0f9128a3eec536 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sun, 16 Sep 2018 21:47:53 +0200 Subject: [PATCH 12/99] Reformatted code --- lib/components/GravatarImage.dart | 11 +++-------- lib/global.dart | 6 ++++-- lib/main.dart | 2 +- lib/models/user.dart | 2 +- lib/pages/home_page.dart | 7 ++++--- lib/service/services.dart | 2 +- 6 files changed, 14 insertions(+), 16 deletions(-) diff --git a/lib/components/GravatarImage.dart b/lib/components/GravatarImage.dart index cab902c..a3f4efc 100644 --- a/lib/components/GravatarImage.dart +++ b/lib/components/GravatarImage.dart @@ -3,12 +3,7 @@ import 'package:flutter/material.dart'; import 'package:crypto/crypto.dart'; class GravatarImageProvider extends NetworkImage { - GravatarImageProvider(String email) : super( - "https://secure.gravatar.com/avatar/" + md5.convert( - email - .trim() - .toLowerCase() - .codeUnits - ).toString() - ); + GravatarImageProvider(String email) + : super("https://secure.gravatar.com/avatar/" + + md5.convert(email.trim().toLowerCase().codeUnits).toString()); } diff --git a/lib/global.dart b/lib/global.dart index d634c09..79e5fe7 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -16,7 +16,8 @@ class VikunjaGlobal extends StatefulWidget { VikunjaGlobalState createState() => VikunjaGlobalState(); static VikunjaGlobalState of(BuildContext context) { - var widget = context.inheritFromWidgetOfExactType(_VikunjaGlobalInherited) as _VikunjaGlobalInherited; + var widget = context.inheritFromWidgetOfExactType(_VikunjaGlobalInherited) + as _VikunjaGlobalInherited; return widget.data; } } @@ -93,7 +94,8 @@ class _VikunjaGlobalInherited extends InheritedWidget { @override bool updateShouldNotify(_VikunjaGlobalInherited oldWidget) { - return (data.currentUser != null && data.currentUser.id != oldWidget.data.currentUser.id) || + return (data.currentUser != null && + data.currentUser.id != oldWidget.data.currentUser.id) || data.client != oldWidget.data.client; } } diff --git a/lib/main.dart b/lib/main.dart index 0feae67..86eeff1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,4 +18,4 @@ class VikunjaApp extends StatelessWidget { home: VikunjaGlobal(child: new HomePage(), login: new LoginPage()), ); } -} \ No newline at end of file +} diff --git a/lib/models/user.dart b/lib/models/user.dart index b7b61c7..d136ebc 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -15,4 +15,4 @@ class UserTokenPair { final User user; final String token; UserTokenPair(this.user, this.token); -} \ No newline at end of file +} diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index d8d2ce8..c0196bc 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -87,9 +87,10 @@ class HomePageState extends State { new UserAccountsDrawerHeader( accountEmail: currentUser == null ? null : Text(currentUser.email), accountName: currentUser == null ? null : Text(currentUser.username), - currentAccountPicture: currentUser == null ? null : CircleAvatar( - backgroundImage: GravatarImageProvider(currentUser.username) - ), + currentAccountPicture: currentUser == null + ? null + : CircleAvatar( + backgroundImage: GravatarImageProvider(currentUser.username)), decoration: BoxDecoration( image: DecorationImage( image: AssetImage("assets/graphics/hypnotize.png"), diff --git a/lib/service/services.dart b/lib/service/services.dart index 82428ee..2a0a4ff 100644 --- a/lib/service/services.dart +++ b/lib/service/services.dart @@ -29,4 +29,4 @@ abstract class TaskService { abstract class UserService { Future login(String username, password); Future get(int userId); -} \ No newline at end of file +} From 5af3e4cac7f191201e19ef4c96c77d23c2d0b5bd Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sun, 16 Sep 2018 22:13:50 +0200 Subject: [PATCH 13/99] Add mocked services --- lib/service/mocked_services.dart | 143 +++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 lib/service/mocked_services.dart diff --git a/lib/service/mocked_services.dart b/lib/service/mocked_services.dart new file mode 100644 index 0000000..c0cab91 --- /dev/null +++ b/lib/service/mocked_services.dart @@ -0,0 +1,143 @@ +import 'dart:async'; + +import 'package:fluttering_vikunja/models/namespace.dart'; +import 'package:fluttering_vikunja/models/task.dart'; +import 'package:fluttering_vikunja/models/user.dart'; +import 'package:fluttering_vikunja/service/services.dart'; + +// Data for mocked services +var _users = {1: User(1, 'test@testuser.org', 'test1')}; + +var _namespaces = { + 1: Namespace( + id: 1, + name: 'Test 1', + created: DateTime.now(), + updated: DateTime.now(), + description: 'A namespace for testing purposes', + owner: _users[1], + ) +}; + +var _nsLists = { + 1: [1] +}; + +var _lists = { + 1: TaskList( + id: 1, + title: 'List 1', + tasks: _tasks.values, + owner: _users[1], + description: 'A nice list', + created: DateTime.now(), + updated: DateTime.now()) +}; + +var _tasks = { + 1: Task( + id: 1, + text: 'Task 1', + owner: _users[1], + updated: DateTime.now(), + created: DateTime.now(), + description: 'A descriptive task', + done: false, + ) +}; + +// Mocked services + +class MockedNamespaceService implements NamespaceService { + @override + Future create(Namespace ns) { + _namespaces[ns.id] = ns; + return Future.value(ns); + } + + @override + Future delete(int namespaceId) { + _namespaces.remove(namespaceId); + return Future.value(); + } + + @override + Future get(int namespaceId) { + return Future.value(_namespaces[namespaceId]); + } + + @override + Future> getAll() { + return Future.value(_namespaces.values.toList()); + } + + @override + Future update(Namespace ns) { + if (!_namespaces.containsKey(ns.id)) + throw Exception('Namespace ${ns.id} does not exsists'); + return create(ns); + } +} + +class MockedListService implements ListService { + @override + Future create(TaskList tl) { + return Future.value(_lists[tl.id] = tl); + } + + @override + Future delete(int listId) { + _lists.remove(listId); + return Future.value(); + } + + @override + Future get(int listId) { + return Future.value(_lists[listId]); + } + + @override + Future> getAll() { + return Future.value(_lists.values.toList()); + } + + @override + Future> getByNamespace(int namespaceId) { + return Future.value( + _nsLists[namespaceId].map((listId) => _lists[listId]).toList()); + } + + @override + Future update(TaskList tl) { + if (!_lists.containsKey(tl)) + throw Exception('TaskList ${tl.id} does not exists'); + return create(tl); + } +} + +class MockedTaskService implements TaskService { + @override + Future delete(int taskId) { + _lists.forEach( + (_, list) => list.tasks.removeWhere((task) => task.id == taskId)); + _tasks.remove(taskId); + return Future.value(); + } + + @override + Future update(Task task) { + return Future.value(_tasks[task.id] = task); + } +} + +class MockedUserService implements UserService { + @override + Future login(String username, password) { + return Future.value(UserTokenPair(_users[1], 'abcdefg')); + } + + @override + Future get(int userId) { + return Future.value(_users[userId]); + } +} From e59001784dc7f67982a86117a1034fdcc8b8f01f Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sun, 16 Sep 2018 22:19:43 +0200 Subject: [PATCH 14/99] Fix a bug causing to not-start at new devices --- lib/global.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/global.dart b/lib/global.dart index 79e5fe7..069b278 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -63,10 +63,11 @@ class VikunjaGlobalState extends State { void _loadCurrentUser() async { var currentUser = await _storage.read(key: 'currentUser'); var token; + var loadedCurrentUser; if (currentUser != null) { token = await _storage.read(key: currentUser); + loadedCurrentUser = await userService.get(int.tryParse(currentUser)); } - var loadedCurrentUser = await userService.get(int.tryParse(currentUser)); setState(() { _currentUser = loadedCurrentUser; _client = token != null ? Client(token) : null; From bedacfdcad6dd429df1f0cedf69a8773d5ae6b7d Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Mon, 17 Sep 2018 15:35:57 +0200 Subject: [PATCH 15/99] Add working login implementation --- ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Runner.xcodeproj/project.pbxproj | 81 ++++++++++++++++++- .../contents.xcworkspacedata | 3 + lib/api/client.dart | 55 ++++++++++++- lib/api/user_implementation.dart | 27 +++++++ lib/global.dart | 38 ++++++--- lib/pages/login_page.dart | 60 +++++++++----- lib/service/mocked_services.dart | 4 +- lib/service/services.dart | 2 +- 10 files changed, 235 insertions(+), 37 deletions(-) create mode 100644 lib/api/user_implementation.dart diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..e8efba1 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee..399e934 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 9d9a55e..43e80ee 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + ACA854A11123D371B9168194 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C102A622A93B95B5704BDD24 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -53,6 +54,7 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C102A622A93B95B5704BDD24 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,12 +64,28 @@ files = ( 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + ACA854A11123D371B9168194 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 4D8888AA13EBD37D6777D23F /* Frameworks */ = { + isa = PBXGroup; + children = ( + C102A622A93B95B5704BDD24 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 7CACC4C503C5D851EB73C215 /* Pods */ = { + isa = PBXGroup; + children = ( + ); + name = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -88,6 +106,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, + 7CACC4C503C5D851EB73C215 /* Pods */, + 4D8888AA13EBD37D6777D23F /* Frameworks */, ); sourceTree = ""; }; @@ -129,12 +149,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 3185B6CCDCA9C2025E57C488 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 85082CB7F9EE2F3E7985BDB9 /* [CP] Embed Pods Frameworks */, + 7C22F5DE30AEBAB42040EB3F /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -156,6 +179,7 @@ TargetAttributes = { 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = Z48VLBM2R7; LastSwiftMigration = 0910; }; }; @@ -195,6 +219,24 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 3185B6CCDCA9C2025E57C488 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + 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"; + showEnvVarsInLog = 0; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -209,6 +251,41 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; }; + 7C22F5DE30AEBAB42040EB3F /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 85082CB7F9EE2F3E7985BDB9 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -367,6 +444,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = Z48VLBM2R7; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -395,6 +473,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = Z48VLBM2R7; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -439,4 +518,4 @@ /* End XCConfigurationList section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; -} \ No newline at end of file +} diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/lib/api/client.dart b/lib/api/client.dart index 033dda0..01aab8e 100644 --- a/lib/api/client.dart +++ b/lib/api/client.dart @@ -1,7 +1,17 @@ -class Client { - final String _token; +import 'dart:async'; +import 'dart:convert'; +import 'package:http/http.dart' as http; - Client(this._token); +class Client { + final JsonDecoder _decoder = new JsonDecoder(); + final JsonEncoder _encoder = new JsonEncoder(); + final String _token; + final String _base; + + String get base => _base; + + Client(this._token, String base) + : _base = base.endsWith('/api/v1') ? base : '$base/api/v1'; bool operator ==(dynamic otherClient) { return otherClient._token == _token; @@ -9,4 +19,43 @@ class Client { @override int get hashCode => _token.hashCode; + + get _headers => { + 'Authorization': _token != null ? 'Bearer $_token' : '', + 'Content-Type': 'application/json' + }; + + Future get(String url) { + return http + .get('${this.base}$url', headers: _headers) + .then(_handleResponse); + } + + Future post(String url, {dynamic body}) { + return http + .post('${this.base}$url', + headers: _headers, body: _encoder.convert(body)) + .then(_handleResponse); + } + + dynamic _handleResponse(http.Response response) { + if (response.statusCode < 200 || + response.statusCode > 400 || + json == null) { + throw new ApiException( + response.statusCode, response.request.url.toString()); + } + return _decoder.convert(response.body); + } +} + +class ApiException implements Exception { + final int errorCode; + final String path; + ApiException(this.errorCode, this.path); + + @override + String toString() { + return "Can't fetch data from server. (Error-Code: $errorCode)"; + } } diff --git a/lib/api/user_implementation.dart b/lib/api/user_implementation.dart new file mode 100644 index 0000000..35cc438 --- /dev/null +++ b/lib/api/user_implementation.dart @@ -0,0 +1,27 @@ +import 'dart:async'; + +import 'package:fluttering_vikunja/api/client.dart'; +import 'package:fluttering_vikunja/models/user.dart'; +import 'package:fluttering_vikunja/service/services.dart'; + +class UserAPIService implements UserService { + final Client _client; + + UserAPIService(this._client); + + @override + Future login(String username, password) async { + var token = await _client.post('/login', body: { + 'username': username, + 'password': password + }).then((map) => map['token']); + return UserAPIService(Client(token, _client.base)) + .getCurrentUser() + .then((user) => UserTokenPair(user, token)); + } + + @override + Future getCurrentUser() { + return _client.get('/user').then((map) => User.fromJson(map)); + } +} diff --git a/lib/global.dart b/lib/global.dart index 069b278..8328dfe 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:fluttering_vikunja/api/client.dart'; +import 'package:fluttering_vikunja/api/user_implementation.dart'; import 'package:fluttering_vikunja/managers/user.dart'; import 'package:fluttering_vikunja/models/user.dart'; import 'package:fluttering_vikunja/service/mocked_services.dart'; @@ -33,7 +34,8 @@ class VikunjaGlobalState extends State { Client get client => _client; UserManager get userManager => new UserManager(_storage); - UserService get userService => new MockedUserService(); + UserService get userService => new UserAPIService(_client); + UserService newLoginService(base) => new UserAPIService(Client(null, base)); @override void initState() { @@ -41,7 +43,7 @@ class VikunjaGlobalState extends State { _loadCurrentUser(); } - void changeUser(User newUser, {String token}) async { + void changeUser(User newUser, {String token, String base}) async { setState(() { _loading = true; }); @@ -51,27 +53,43 @@ class VikunjaGlobalState extends State { // Write new token to secure storage await _storage.write(key: newUser.id.toString(), value: token); } + if (base == null) { + base = await _storage.read(key: "${newUser.id.toString()}_base"); + } else { + // Write new base to secure storage + await _storage.write(key: "${newUser.id.toString()}_base", value: base); + } // Set current user in storage await _storage.write(key: 'currentUser', value: newUser.id.toString()); setState(() { _currentUser = newUser; - _client = Client(token); + _client = Client(token, base); _loading = false; }); } void _loadCurrentUser() async { var currentUser = await _storage.read(key: 'currentUser'); - var token; - var loadedCurrentUser; - if (currentUser != null) { - token = await _storage.read(key: currentUser); - loadedCurrentUser = await userService.get(int.tryParse(currentUser)); + if (currentUser == null) { + setState(() { + _loading = false; + }); + return; + } + var token = await _storage.read(key: currentUser); + var base = await _storage.read(key: '${currentUser}_base'); + if (token == null || base == null) { + setState(() { + _loading = false; + }); + return; } + setState(() { + _client = Client(token, base); + }); + var loadedCurrentUser = await userService.getCurrentUser(); setState(() { _currentUser = loadedCurrentUser; - _client = token != null ? Client(token) : null; - _loading = false; }); } diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index cd229a2..232fa7c 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -68,20 +68,23 @@ class _LoginPageState extends State { obscureText: true, ), ), - ButtonTheme( - height: _loading ? 55.0 : 36.0, - child: RaisedButton( - onPressed: !_loading - ? () { - if (_formKey.currentState.validate()) { - _loginUser(context); - } - } - : null, - child: _loading - ? CircularProgressIndicator() - : Text('Login'), - )) + Builder( + builder: (context) => ButtonTheme( + height: _loading ? 55.0 : 36.0, + child: RaisedButton( + onPressed: !_loading + ? () { + if (_formKey.currentState + .validate()) { + Form.of(context).save(); + _loginUser(context); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : Text('Login'), + ))), ], )), ), @@ -90,11 +93,28 @@ class _LoginPageState extends State { _loginUser(BuildContext context) async { setState(() => _loading = true); - var vGlobal = VikunjaGlobal.of(context); - var newUser = await vGlobal.userService.login(_username, _password); - vGlobal.changeUser(newUser.user, token: newUser.token); - setState(() { - _loading = false; - }); + try { + var vGlobal = VikunjaGlobal.of(context); + var newUser = + await vGlobal.newLoginService(_server).login(_username, _password); + vGlobal.changeUser(newUser.user, token: newUser.token, base: _server); + } catch (ex) { + print(ex); + showDialog( + context: context, + builder: (context) => new AlertDialog( + title: + const Text('Login failed! Please check you credentials.'), + actions: [ + FlatButton( + onPressed: () => Navigator.pop(context), + child: const Text('CLOSE')) + ], + )); + } finally { + setState(() { + _loading = false; + }); + } } } diff --git a/lib/service/mocked_services.dart b/lib/service/mocked_services.dart index c0cab91..77d5d5c 100644 --- a/lib/service/mocked_services.dart +++ b/lib/service/mocked_services.dart @@ -137,7 +137,7 @@ class MockedUserService implements UserService { } @override - Future get(int userId) { - return Future.value(_users[userId]); + Future getCurrentUser() { + return Future.value(_users[1]); } } diff --git a/lib/service/services.dart b/lib/service/services.dart index 2a0a4ff..910bc69 100644 --- a/lib/service/services.dart +++ b/lib/service/services.dart @@ -28,5 +28,5 @@ abstract class TaskService { abstract class UserService { Future login(String username, password); - Future get(int userId); + Future getCurrentUser(); } From a62abc0b354e87d93d9f2b2e73939b069f9e54de Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Mon, 17 Sep 2018 18:16:50 +0200 Subject: [PATCH 16/99] Add API implementations of List, Namespace, Task, User Use Services in order to retrieve data --- lib/api/client.dart | 13 +++ lib/api/list_implementation.dart | 46 +++++++++ lib/api/namespace_implementation.dart | 42 +++++++++ lib/api/service.dart | 19 ++++ lib/api/task_implementation.dart | 29 ++++++ lib/api/user_implementation.dart | 13 ++- lib/fragments/namespace.dart | 131 ++++++++++++++++++++------ lib/global.dart | 29 +++++- lib/main.dart | 9 +- lib/models/namespace.dart | 8 ++ lib/models/task.dart | 28 +++++- lib/models/user.dart | 2 + lib/pages/home_page.dart | 59 ++++++++---- lib/pages/list_page.dart | 88 +++++++++++++---- lib/service/mocked_services.dart | 21 ++++- lib/service/services.dart | 3 +- 16 files changed, 454 insertions(+), 86 deletions(-) create mode 100644 lib/api/list_implementation.dart create mode 100644 lib/api/namespace_implementation.dart create mode 100644 lib/api/service.dart create mode 100644 lib/api/task_implementation.dart diff --git a/lib/api/client.dart b/lib/api/client.dart index 01aab8e..f347d38 100644 --- a/lib/api/client.dart +++ b/lib/api/client.dart @@ -31,6 +31,12 @@ class Client { .then(_handleResponse); } + Future delete(String url) { + return http + .delete('${this.base}$url', headers: _headers) + .then(_handleResponse); + } + Future post(String url, {dynamic body}) { return http .post('${this.base}$url', @@ -38,6 +44,13 @@ class Client { .then(_handleResponse); } + Future put(String url, {dynamic body}) { + return http + .put('${this.base}$url', + headers: _headers, body: _encoder.convert(body)) + .then(_handleResponse); + } + dynamic _handleResponse(http.Response response) { if (response.statusCode < 200 || response.statusCode > 400 || diff --git a/lib/api/list_implementation.dart b/lib/api/list_implementation.dart new file mode 100644 index 0000000..9742687 --- /dev/null +++ b/lib/api/list_implementation.dart @@ -0,0 +1,46 @@ +import 'dart:async'; + +import 'package:fluttering_vikunja/api/client.dart'; +import 'package:fluttering_vikunja/api/service.dart'; +import 'package:fluttering_vikunja/models/task.dart'; +import 'package:fluttering_vikunja/service/services.dart'; + +class ListAPIService extends APIService implements ListService { + ListAPIService(Client client) : super(client); + + @override + Future create(namespaceId, TaskList tl) { + return client + .put('/namespaces/$namespaceId/lists', body: tl.toJSON()) + .then((map) => TaskList.fromJson(map)); + } + + @override + Future delete(int listId) { + return client.delete('/lists/$listId').then((_) {}); + } + + @override + Future get(int listId) { + return client.get('/lists/$listId').then((map) => TaskList.fromJson(map)); + } + + @override + Future> getAll() { + return client.get('/lists').then( + (list) => convertList(list, (result) => TaskList.fromJson(result))); + } + + @override + Future> getByNamespace(int namespaceId) { + return client.get('/namespaces/$namespaceId/lists').then( + (list) => convertList(list, (result) => TaskList.fromJson(result))); + } + + @override + Future update(TaskList tl) { + return client + .put('/lists/${tl.id}', body: tl.toJSON()) + .then((map) => TaskList.fromJson(map)); + } +} diff --git a/lib/api/namespace_implementation.dart b/lib/api/namespace_implementation.dart new file mode 100644 index 0000000..72e7899 --- /dev/null +++ b/lib/api/namespace_implementation.dart @@ -0,0 +1,42 @@ +import 'dart:async'; + +import 'package:fluttering_vikunja/api/client.dart'; +import 'package:fluttering_vikunja/api/service.dart'; +import 'package:fluttering_vikunja/models/namespace.dart'; +import 'package:fluttering_vikunja/service/services.dart'; + +class NamespaceAPIService extends APIService implements NamespaceService { + NamespaceAPIService(Client client) : super(client); + + @override + Future create(Namespace ns) { + return client + .put('/namespaces', body: ns.toJSON()) + .then((map) => Namespace.fromJson(map)); + } + + @override + Future delete(int namespaceId) { + return client.delete('/namespaces/$namespaceId'); + } + + @override + Future get(int namespaceId) { + return client + .get('/namespaces/$namespaceId') + .then((map) => Namespace.fromJson(map)); + } + + @override + Future> getAll() { + return client.get('/namespaces').then( + (list) => convertList(list, (result) => Namespace.fromJson(result))); + } + + @override + Future update(Namespace ns) { + return client + .post('/namespaces/${ns.id}', body: ns.toJSON()) + .then((map) => Namespace.fromJson(map)); + } +} diff --git a/lib/api/service.dart b/lib/api/service.dart new file mode 100644 index 0000000..c65c863 --- /dev/null +++ b/lib/api/service.dart @@ -0,0 +1,19 @@ +import 'package:fluttering_vikunja/api/client.dart'; +import 'package:meta/meta.dart'; + +class APIService { + final Client _client; + + @protected + Client get client => _client; + + APIService(this._client); + + @protected + List convertList(dynamic value, Mapper mapper) { + if (value == null) return []; + return (value as List).map((map) => mapper(map)).toList(); + } +} + +typedef T Mapper(Map json); diff --git a/lib/api/task_implementation.dart b/lib/api/task_implementation.dart new file mode 100644 index 0000000..d0861c5 --- /dev/null +++ b/lib/api/task_implementation.dart @@ -0,0 +1,29 @@ +import 'dart:async'; + +import 'package:fluttering_vikunja/api/client.dart'; +import 'package:fluttering_vikunja/api/service.dart'; +import 'package:fluttering_vikunja/models/task.dart'; +import 'package:fluttering_vikunja/service/services.dart'; + +class TaskAPIService extends APIService implements TaskService { + TaskAPIService(Client client) : super(client); + + @override + Future add(int listId, Task task) { + return client + .put('/lists/$listId', body: task.toJSON()) + .then((map) => Task.fromJson(map)); + } + + @override + Future delete(int taskId) { + return client.delete('/tasks/$taskId'); + } + + @override + Future update(Task task) { + return client + .post('/tasks/${task.id}', body: task.toJSON()) + .then((map) => Task.fromJson(map)); + } +} diff --git a/lib/api/user_implementation.dart b/lib/api/user_implementation.dart index 35cc438..a8789c3 100644 --- a/lib/api/user_implementation.dart +++ b/lib/api/user_implementation.dart @@ -1,27 +1,26 @@ import 'dart:async'; import 'package:fluttering_vikunja/api/client.dart'; +import 'package:fluttering_vikunja/api/service.dart'; import 'package:fluttering_vikunja/models/user.dart'; import 'package:fluttering_vikunja/service/services.dart'; -class UserAPIService implements UserService { - final Client _client; - - UserAPIService(this._client); +class UserAPIService extends APIService implements UserService { + UserAPIService(Client client) : super(client); @override Future login(String username, password) async { - var token = await _client.post('/login', body: { + var token = await client.post('/login', body: { 'username': username, 'password': password }).then((map) => map['token']); - return UserAPIService(Client(token, _client.base)) + return UserAPIService(Client(token, client.base)) .getCurrentUser() .then((user) => UserTokenPair(user, token)); } @override Future getCurrentUser() { - return _client.get('/user').then((map) => User.fromJson(map)); + return client.get('/user').then((map) => User.fromJson(map)); } } diff --git a/lib/fragments/namespace.dart b/lib/fragments/namespace.dart index ad46bcb..78ff810 100644 --- a/lib/fragments/namespace.dart +++ b/lib/fragments/namespace.dart @@ -1,50 +1,121 @@ +import 'dart:async'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:fluttering_vikunja/global.dart'; +import 'package:fluttering_vikunja/models/namespace.dart'; +import 'package:fluttering_vikunja/models/task.dart'; import 'package:fluttering_vikunja/pages/list_page.dart'; class NamespaceFragment extends StatefulWidget { - final String namespace; - NamespaceFragment({this.namespace}) : super(key: Key(namespace)); + final Namespace namespace; + NamespaceFragment({this.namespace}) + : super(key: Key(namespace.id.toString())); @override _NamespaceFragmentState createState() => new _NamespaceFragmentState(); } class _NamespaceFragmentState extends State { - Set _lists = Set.from( - ["Cupertino List", "Material List", "Shopping List", "NAS List"]); + List _lists = []; @override Widget build(BuildContext context) { - return new ListView( - padding: EdgeInsets.symmetric(vertical: 8.0), - children: ListTile.divideTiles( - context: context, - tiles: _lists.map((name) => Dismissible( - key: Key(name), - direction: DismissDirection.startToEnd, - child: ListTile( - title: new Text(name), - onTap: () => _openList(context, name), - trailing: Icon(Icons.arrow_right), - ), - background: Container( - color: Colors.red, - child: const ListTile( - leading: - Icon(Icons.delete, color: Colors.white, size: 36.0)), - ), - onDismissed: (direction) { - setState(() => _lists.remove(name)); - Scaffold.of(context) - .showSnackBar(SnackBar(content: Text("$name removed"))); - }, - ))).toList(), + return Scaffold( + body: new ListView( + padding: EdgeInsets.symmetric(vertical: 8.0), + children: ListTile.divideTiles( + context: context, + tiles: _lists.map((ls) => Dismissible( + key: Key(ls.id.toString()), + direction: DismissDirection.startToEnd, + child: ListTile( + title: new Text(ls.title), + onTap: () => _openList(context, ls), + trailing: Icon(Icons.arrow_right), + ), + background: Container( + color: Colors.red, + child: const ListTile( + leading: Icon(Icons.delete, + color: Colors.white, size: 36.0)), + ), + onDismissed: (direction) { + _removeList(ls).then((_) => Scaffold.of(context) + .showSnackBar( + SnackBar(content: Text("${ls.title} removed")))); + }, + ))).toList(), + ), + floatingActionButton: FloatingActionButton( + onPressed: () => _addListDialog(), child: const Icon(Icons.add)), ); } - _openList(BuildContext context, String name) { + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _updateLists(); + } + + Future _removeList(TaskList list) { + return VikunjaGlobal.of(context) + .listService + .delete(list.id) + .then((_) => _updateLists()); + } + + _updateLists() { + VikunjaGlobal.of(context) + .listService + .getByNamespace(widget.namespace.id) + .then((lists) => setState(() => this._lists = lists)); + } + + _openList(BuildContext context, TaskList list) { Navigator.of(context).push( - MaterialPageRoute(builder: (context) => ListPage(listName: name))); + MaterialPageRoute(builder: (context) => ListPage(taskList: list))); + } + + _addListDialog() { + var textController = new TextEditingController(); + showDialog( + context: context, + child: new AlertDialog( + contentPadding: const EdgeInsets.all(16.0), + content: new Row(children: [ + Expanded( + child: new TextField( + autofocus: true, + decoration: new InputDecoration( + labelText: 'List Name', hintText: 'eg. Shopping List'), + controller: textController, + ), + ) + ]), + actions: [ + new FlatButton( + child: const Text('CANCEL'), + onPressed: () => Navigator.pop(context), + ), + new FlatButton( + child: const Text('ADD'), + onPressed: () { + if (textController.text.isNotEmpty) { + _addList(textController.text); + } + Navigator.pop(context); + }, + ) + ], + ), + ); + } + + _addList(String name) { + VikunjaGlobal.of(context) + .listService + .create(widget.namespace.id, TaskList(id: null, title: name, tasks: [])) + .then((_) => setState(() {})); } } diff --git a/lib/global.dart b/lib/global.dart index 8328dfe..8cf2a90 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:fluttering_vikunja/api/client.dart'; +import 'package:fluttering_vikunja/api/list_implementation.dart'; +import 'package:fluttering_vikunja/api/namespace_implementation.dart'; +import 'package:fluttering_vikunja/api/task_implementation.dart'; import 'package:fluttering_vikunja/api/user_implementation.dart'; import 'package:fluttering_vikunja/managers/user.dart'; import 'package:fluttering_vikunja/models/user.dart'; @@ -36,6 +39,9 @@ class VikunjaGlobalState extends State { UserManager get userManager => new UserManager(_storage); UserService get userService => new UserAPIService(_client); UserService newLoginService(base) => new UserAPIService(Client(null, base)); + NamespaceService get namespaceService => new NamespaceAPIService(client); + TaskService get taskService => new TaskAPIService(client); + ListService get listService => new ListAPIService(client); @override void initState() { @@ -84,12 +90,27 @@ class VikunjaGlobalState extends State { }); return; } + var client = Client(token, base); + var loadedCurrentUser; + try { + loadedCurrentUser = await UserAPIService(client).getCurrentUser(); + } on ApiException catch (e) { + if (e.errorCode ~/ 100 == 4) { + setState(() { + _client = null; + _currentUser = null; + _loading = false; + }); + return; + } + loadedCurrentUser = User(int.tryParse(currentUser), "", ""); + } catch (otherExceptions) { + loadedCurrentUser = User(int.tryParse(currentUser), "", ""); + } setState(() { - _client = Client(token, base); - }); - var loadedCurrentUser = await userService.getCurrentUser(); - setState(() { + _client = client; _currentUser = loadedCurrentUser; + _loading = false; }); } diff --git a/lib/main.dart b/lib/main.dart index 86eeff1..3b79801 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,16 +6,21 @@ import 'package:fluttering_vikunja/pages/home_page.dart'; import 'package:fluttering_vikunja/pages/login_page.dart'; import 'package:fluttering_vikunja/style.dart'; -void main() => runApp(new VikunjaApp()); +void main() => runApp(VikunjaGlobal( + child: new VikunjaApp(home: HomePage()), + login: new VikunjaApp(home: LoginPage()))); class VikunjaApp extends StatelessWidget { + final Widget home; + + const VikunjaApp({Key key, this.home}) : super(key: key); // This widget is the root of your application. @override Widget build(BuildContext context) { return new MaterialApp( title: 'Vikunja', theme: buildVikunjaTheme(), - home: VikunjaGlobal(child: new HomePage(), login: new LoginPage()), + home: this.home, ); } } diff --git a/lib/models/namespace.dart b/lib/models/namespace.dart index e62c5be..34bafdd 100644 --- a/lib/models/namespace.dart +++ b/lib/models/namespace.dart @@ -22,4 +22,12 @@ class Namespace { created = DateTime.fromMillisecondsSinceEpoch(json['created']), updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), owner = User.fromJson(json['owner']); + + toJSON() => { + "created": created?.millisecondsSinceEpoch, + "updated": updated?.millisecondsSinceEpoch, + "name": name, + "owner": owner?.toJSON(), + "description": description + }; } diff --git a/lib/models/task.dart b/lib/models/task.dart index 0b0b795..63c2fc9 100644 --- a/lib/models/task.dart +++ b/lib/models/task.dart @@ -16,7 +16,7 @@ class Task { this.due, @required this.text, this.description, - this.done, + @required this.done, @required this.owner}); Task.fromJson(Map json) @@ -29,6 +29,18 @@ class Task { text = json['text'], done = json['done'], owner = User.fromJson(json['createdBy']); + + toJSON() => { + 'id': id, + 'updated': updated?.millisecondsSinceEpoch, + 'created': created?.millisecondsSinceEpoch, + 'reminderDate': reminder?.millisecondsSinceEpoch, + 'dueDate': due?.millisecondsSinceEpoch, + 'description': description, + 'text': text, + 'done': done ?? false, + 'createdBy': owner?.toJSON() + }; } class TaskList { @@ -54,5 +66,17 @@ class TaskList { title = json['title'], updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), created = DateTime.fromMillisecondsSinceEpoch(json['created']), - tasks = json['tasks'].map((taskJson) => Task.fromJson(taskJson)); + tasks = (json['tasks'] as List) + ?.map((taskJson) => Task.fromJson(taskJson)) + ?.toList(); + + toJSON() { + return { + "created": this.created?.millisecondsSinceEpoch, + "updated": this.updated?.millisecondsSinceEpoch, + "id": this.id, + "title": this.title, + "owner": this.owner?.toJSON() + }; + } } diff --git a/lib/models/user.dart b/lib/models/user.dart index d136ebc..ce8fdeb 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -9,6 +9,8 @@ class User { : id = json['id'], email = json['email'], username = json['username']; + + toJSON() => {"id": this.id, "email": this.email, "username": this.username}; } class UserTokenPair { diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index c0196bc..61efb38 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -3,6 +3,8 @@ import 'package:fluttering_vikunja/components/GravatarImage.dart'; import 'package:fluttering_vikunja/fragments/namespace.dart'; import 'package:fluttering_vikunja/fragments/placeholder.dart'; import 'package:fluttering_vikunja/global.dart'; +import 'package:fluttering_vikunja/models/namespace.dart'; +import 'package:fluttering_vikunja/models/task.dart'; import 'package:fluttering_vikunja/models/user.dart'; class HomePage extends StatefulWidget { @@ -11,14 +13,18 @@ class HomePage extends StatefulWidget { } class HomePageState extends State { - List namespaces = ["Jonas's namespace", 'Another namespace']; + List _namespaces = []; + Namespace get _currentNamespace => + _selectedDrawerIndex >= 0 && _selectedDrawerIndex < _namespaces.length + ? _namespaces[_selectedDrawerIndex] + : null; int _selectedDrawerIndex = -1; _getDrawerItemWidget(int pos) { if (pos == -1) { return new PlaceholderFragment(); } - return new NamespaceFragment(namespace: namespaces[pos]); + return new NamespaceFragment(namespace: _namespaces[pos]); } _onSelectItem(int index) { @@ -26,7 +32,7 @@ class HomePageState extends State { Navigator.of(context).pop(); } - _addNamespace() { + _addNamespaceDialog() { var textController = new TextEditingController(); showDialog( context: context, @@ -50,8 +56,9 @@ class HomePageState extends State { new FlatButton( child: const Text('ADD'), onPressed: () { - if (textController.text.isNotEmpty) - setState(() => namespaces.add(textController.text)); + if (textController.text.isNotEmpty) { + _addNamespace(textController.text); + } Navigator.pop(context); }, ) @@ -60,28 +67,42 @@ class HomePageState extends State { ); } + _addNamespace(String name) { + VikunjaGlobal.of(context) + .namespaceService + .create(Namespace(id: null, name: name)) + .then((_) => _updateNamespaces()); + } + + _updateNamespaces() { + VikunjaGlobal.of(context).namespaceService.getAll().then((result) { + setState(() { + _namespaces = result; + }); + }); + } + @override - void initState() { - super.initState(); + void didChangeDependencies() { + super.didChangeDependencies(); + _updateNamespaces(); } @override Widget build(BuildContext context) { var currentUser = VikunjaGlobal.of(context).currentUser; List drawerOptions = []; - namespaces.asMap().forEach((i, namespace) => drawerOptions.add(new ListTile( - leading: const Icon(Icons.folder), - title: new Text(namespace), - selected: i == _selectedDrawerIndex, - onTap: () => _onSelectItem(i), - ))); + _namespaces + .asMap() + .forEach((i, namespace) => drawerOptions.add(new ListTile( + leading: const Icon(Icons.folder), + title: new Text(namespace.name), + selected: i == _selectedDrawerIndex, + onTap: () => _onSelectItem(i), + ))); return new Scaffold( - appBar: AppBar( - title: new Text(_selectedDrawerIndex == -1 - ? 'Vakunja' - : namespaces[_selectedDrawerIndex]), - ), + appBar: AppBar(title: new Text(_currentNamespace?.name ?? 'Vakunja')), drawer: new Drawer( child: new Column(children: [ new UserAccountsDrawerHeader( @@ -110,7 +131,7 @@ class HomePageState extends State { child: new ListTile( leading: const Icon(Icons.add), title: const Text('Add namespace...'), - onTap: () => _addNamespace(), + onTap: () => _addNamespaceDialog(), ), ), ])), diff --git a/lib/pages/list_page.dart b/lib/pages/list_page.dart index fc29755..3aa3e88 100644 --- a/lib/pages/list_page.dart +++ b/lib/pages/list_page.dart @@ -1,46 +1,82 @@ import 'package:flutter/material.dart'; +import 'package:fluttering_vikunja/global.dart'; +import 'package:fluttering_vikunja/models/task.dart'; class ListPage extends StatefulWidget { - final String listName; + final TaskList taskList; - ListPage({this.listName}) : super(key: Key(listName)); + ListPage({this.taskList}) : super(key: Key(taskList.id.toString())); @override _ListPageState createState() => _ListPageState(); } class _ListPageState extends State { - Map items = {"Butter": true, "Milch": false}; + TaskList items; + + @override + void initState() { + items = TaskList( + id: widget.taskList.id, title: widget.taskList.title, tasks: []); + super.initState(); + } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: new Text(widget.listName), + title: new Text(items.title), ), body: ListView( padding: EdgeInsets.symmetric(vertical: 8.0), children: ListTile.divideTiles( context: context, - tiles: items - .map((item, checked) => MapEntry( - item, - CheckboxListTile( - title: Text(item), + tiles: items?.tasks?.map((task) => CheckboxListTile( + title: Text(task.text), controlAffinity: ListTileControlAffinity.leading, - value: checked, - onChanged: (bool value) => - setState(() => items[item] = value), - ))) - .values) + value: task.done ?? false, + subtitle: task.description == null + ? null + : Text(task.description), + onChanged: (bool value) => _updateTask(task, value), + )) ?? + []) .toList(), ), floatingActionButton: FloatingActionButton( - onPressed: () => _addItem(), child: Icon(Icons.add)), + onPressed: () => _addItemDialog(), child: Icon(Icons.add)), ); } - _addItem() { + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _updateList(); + } + + _updateTask(Task task, bool checked) { + // TODO use copyFrom + VikunjaGlobal.of(context) + .taskService + .update(Task( + id: task.id, + done: checked, + text: task.text, + description: task.description, + owner: null, + )) + .then((_) => _updateList()); + } + + _updateList() { + VikunjaGlobal.of(context).listService.get(widget.taskList.id).then((tasks) { + setState(() { + items = tasks; + }); + }); + } + + _addItemDialog() { var textController = new TextEditingController(); showDialog( context: context, @@ -64,8 +100,7 @@ class _ListPageState extends State { new FlatButton( child: const Text('ADD'), onPressed: () { - if (textController.text.isNotEmpty) - setState(() => items[textController.text] = false); + if (textController.text.isNotEmpty) _addItem(textController.text); Navigator.pop(context); }, ) @@ -73,4 +108,21 @@ class _ListPageState extends State { ), ); } + + _addItem(String name) { + var globalState = VikunjaGlobal.of(context); + globalState.taskService + .add( + items.id, + Task( + id: null, + text: name, + owner: globalState.currentUser, + done: false)) + .then((task) { + setState(() { + items.tasks.add(task); + }); + }).then((_) => _updateList()); + } } diff --git a/lib/service/mocked_services.dart b/lib/service/mocked_services.dart index 77d5d5c..fb6dc5d 100644 --- a/lib/service/mocked_services.dart +++ b/lib/service/mocked_services.dart @@ -27,7 +27,7 @@ var _lists = { 1: TaskList( id: 1, title: 'List 1', - tasks: _tasks.values, + tasks: _tasks.values.toList(), owner: _users[1], description: 'A nice list', created: DateTime.now(), @@ -81,7 +81,8 @@ class MockedNamespaceService implements NamespaceService { class MockedListService implements ListService { @override - Future create(TaskList tl) { + Future create(namespaceId, TaskList tl) { + _nsLists[namespaceId].add(tl.id); return Future.value(_lists[tl.id] = tl); } @@ -111,7 +112,7 @@ class MockedListService implements ListService { Future update(TaskList tl) { if (!_lists.containsKey(tl)) throw Exception('TaskList ${tl.id} does not exists'); - return create(tl); + return Future.value(_lists[tl.id] = tl); } } @@ -126,8 +127,22 @@ class MockedTaskService implements TaskService { @override Future update(Task task) { + _lists.forEach((_, list) { + if (list.tasks.where((t) => t.id == task.id).length > 0) { + list.tasks.removeWhere((t) => t.id == task.id); + list.tasks.add(task); + } + }); return Future.value(_tasks[task.id] = task); } + + @override + Future add(int listId, Task task) { + var id = _tasks.keys.last + 1; + _tasks[id] = task; + _lists[listId].tasks.add(task); + return Future.value(task); + } } class MockedUserService implements UserService { diff --git a/lib/service/services.dart b/lib/service/services.dart index 910bc69..9eb5f0c 100644 --- a/lib/service/services.dart +++ b/lib/service/services.dart @@ -16,7 +16,7 @@ abstract class ListService { Future> getAll(); Future get(int listId); Future> getByNamespace(int namespaceId); - Future create(TaskList tl); + Future create(int namespaceId, TaskList tl); Future update(TaskList tl); Future delete(int listId); } @@ -24,6 +24,7 @@ abstract class ListService { abstract class TaskService { Future update(Task task); Future delete(int taskId); + Future add(int listId, Task task); } abstract class UserService { From bbdd63782f2c357aa77de7f95229bd2e9f4fcd70 Mon Sep 17 00:00:00 2001 From: konrad Date: Sat, 22 Sep 2018 20:56:16 +0000 Subject: [PATCH 17/99] Cleanup (#1) --- .gitignore | 458 ++++---------------------- Makefile | 30 ++ README.md | 8 +- ios/Runner/Info.plist | 2 +- lib/api/list_implementation.dart | 8 +- lib/api/namespace_implementation.dart | 8 +- lib/api/service.dart | 2 +- lib/api/task_implementation.dart | 8 +- lib/api/user_implementation.dart | 8 +- lib/fragments/namespace.dart | 8 +- lib/global.dart | 18 +- lib/main.dart | 8 +- lib/models/namespace.dart | 2 +- lib/models/task.dart | 2 +- lib/pages/home_page.dart | 14 +- lib/pages/list_page.dart | 4 +- lib/pages/login_page.dart | 4 +- lib/service/mocked_services.dart | 8 +- lib/service/services.dart | 6 +- pubspec.yaml | 8 +- test/widget_test.dart | 28 +- 21 files changed, 159 insertions(+), 483 deletions(-) create mode 100644 Makefile diff --git a/.gitignore b/.gitignore index 9d87b27..5be27ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,397 +1,71 @@ -# Created by https://www.gitignore.io/api/dart,swift,xcode,kotlin,android,flutter,intellij,androidstudio,visualstudiocode - -### Android ### -# Built application files -*.apk -*.ap_ - -# Files for the ART/Dalvik VM -*.dex - -# Java class files +# Miscellaneous *.class +*.lock +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ -# Generated files -bin/ -gen/ -out/ +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ -# Gradle files -.gradle/ +# Visual Studio Code related +.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ build/ -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# IntelliJ -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/assetWizardSettings.xml -.idea/dictionaries -.idea/libraries -.idea/caches - -# Keystore files -# Uncomment the following line if you do not want to check your keystore files in. -#*.jks - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild - -# Google Services (e.g. APIs or Firebase) -google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md - -### Android Patch ### -gen-external-apklibs - -### AndroidStudio ### -# Covers files to be ignored for android development using Android Studio. - -# Built application files - -# Files for the ART/Dalvik VM - -# Java class files - -# Generated files - -# Gradle files -.gradle - -# Signing files -.signing/ - -# Local configuration file (sdk path, etc) - -# Proguard folder generated by Eclipse - -# Log Files - -# Android Studio -/*/build/ -/*/local.properties -/*/out -/*/*/build -/*/*/production -*.ipr -*~ -*.swp - -# Android Patch - -# External native build folder generated in Android Studio 2.2 and later - -# NDK -obj/ - -# IntelliJ IDEA -*.iws -/out/ - -# User-specific configurations -.idea/caches/ -.idea/libraries/ -.idea/shelf/ -.idea/.name -.idea/compiler.xml -.idea/copyright/profiles_settings.xml -.idea/encodings.xml -.idea/misc.xml -.idea/modules.xml -.idea/scopes/scope_settings.xml -.idea/vcs.xml -.idea/jsLibraryMappings.xml -.idea/datasources.xml -.idea/dataSources.ids -.idea/sqlDataSources.xml -.idea/dynamic.xml -.idea/uiDesigner.xml - -# OS-specific files -.DS_Store -.DS_Store? -._* -.Spotlight-V100 -.Trashes -ehthumbs.db -Thumbs.db - -# Legacy Eclipse project files -.classpath -.project -.cproject -.settings/ - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.war -*.ear - -# virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml) -hs_err_pid* - -## Plugin-specific files: - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Mongo Explorer plugin -.idea/mongoSettings.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -### AndroidStudio Patch ### - -!android/gradle/wrapper/gradle-wrapper.jar - -### Dart ### -# See https://www.dartlang.org/guides/libraries/private-files - -# Files and directories created by pub -.dart_tool/ -.packages -# If you're building an application, you may want to check-in your pubspec.lock -pubspec.lock - -# Directory created by dartdoc -# If you don't generate documentation locally you can remove this line. -doc/api/ - -# Avoid committing generated Javascript files: -*.dart.js -*.info.json # Produced by the --dump-info flag. -*.js # When generated by dart2js. Don't specify *.js if your - # project includes source files written in JavaScript. -*.js_ -*.js.deps -*.js.map - -### Flutter ### -.flutter-plugins - -### Intellij ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/modules.xml -# .idea/*.iml -# .idea/modules - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format - -# IntelliJ - -# mpeltonen/sbt-idea plugin - -# JIRA plugin - -# Cursive Clojure plugin -.idea/replstate.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) - -# Editor-based Rest Client -.idea/httpRequests - -### Intellij Patch ### -# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 - -# *.iml -# modules.xml -# .idea/misc.xml -# *.ipr - -# Sonarlint plugin -.idea/sonarlint - -### Kotlin ### -# Compiled class file - -# Log file - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) - -# Package Files # -*.jar -*.nar -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml - -### Swift ### -# Xcode -# -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - -## Build generated -DerivedData/ - -## Various settings -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata/ - -## Other -*.moved-aside -*.xccheckout -*.xcscmblueprint - -## Obj-C/Swift specific -*.hmap -*.ipa -*.dSYM.zip -*.dSYM - -## Playgrounds -timeline.xctimeline -playground.xcworkspace - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -# Package.pins -# Package.resolved -.build/ - -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# Pods/ -# -# Add this line if you want to avoid checking in source code from the Xcode workspace -# *.xcworkspace - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/#source-control - -fastlane/screenshots/**/*.png - -# Code Injection -# -# After new code Injection tools there's a generated folder /iOSInjectionProject -# https://github.com/johnno1962/injectionforxcode - -iOSInjectionProject/ - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -### Xcode ### -# Xcode -# -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - -## User settings - -## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) - -## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) - -### Xcode Patch ### -*.xcodeproj/* -!*.xcodeproj/project.pbxproj -!*.xcodeproj/xcshareddata/ -!*.xcworkspace/contents.xcworkspacedata -/*.gcno - - -# End of https://www.gitignore.io/api/dart,swift,xcode,kotlin,android,flutter,intellij,androidstudio,visualstudiocode - +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..681101e --- /dev/null +++ b/Makefile @@ -0,0 +1,30 @@ +GIT_LAST_COMMIT := $(shell git describe --tags --always | sed 's/-/+/' | sed 's/^v//') + +ifneq ($(DRONE_TAG),) + VERSION ?= $(subst v,,$(DRONE_TAG))-$(GIT_LAST_COMMIT) +else + ifneq ($(DRONE_BRANCH),) + VERSION ?= $(subst release/v,,$(DRONE_BRANCH))-$(GIT_LAST_COMMIT) + else + VERSION ?= master-$(GIT_LAST_COMMIT) + endif +endif + +.PHONY: test +test: + flutter test + +.PHONY: build-all +build-all: build-release build-debug build-profile + +.PHONY: build-release +build-release: + flutter build apk --release --build-name=$(VERSION) + +.PHONY: build-debug +build-debug: + flutter build apk --debug --build-name=$(VERSION) + +.PHONY: build-profile +build-profile: + flutter build apk --profile --build-name=$(VERSION) \ No newline at end of file diff --git a/README.md b/README.md index 9e2cba1..42d99af 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ -# FlutteringVikunja +# Vikunja Cross-Plattform app -Vikunja as Flutter cross platform app \ No newline at end of file +[![Build Status](https://drone.kolaente.de/api/badges/vikunja/app/status.svg)](https://drone.kolaente.de/vikunja/app) +[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) +[![Download](https://img.shields.io/badge/download-v0.1-brightgreen.svg)](https://storage.kolaente.de/minio/vikunja-app/) + +Vikunja as Flutter cross platform app. \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 66b2447..514e512 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -13,7 +13,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - fluttering_vikunja + vikunja_app CFBundlePackageType APPL CFBundleShortVersionString diff --git a/lib/api/list_implementation.dart b/lib/api/list_implementation.dart index 9742687..eff3121 100644 --- a/lib/api/list_implementation.dart +++ b/lib/api/list_implementation.dart @@ -1,9 +1,9 @@ import 'dart:async'; -import 'package:fluttering_vikunja/api/client.dart'; -import 'package:fluttering_vikunja/api/service.dart'; -import 'package:fluttering_vikunja/models/task.dart'; -import 'package:fluttering_vikunja/service/services.dart'; +import 'package:vikunja_app/api/client.dart'; +import 'package:vikunja_app/api/service.dart'; +import 'package:vikunja_app/models/task.dart'; +import 'package:vikunja_app/service/services.dart'; class ListAPIService extends APIService implements ListService { ListAPIService(Client client) : super(client); diff --git a/lib/api/namespace_implementation.dart b/lib/api/namespace_implementation.dart index 72e7899..b5d5508 100644 --- a/lib/api/namespace_implementation.dart +++ b/lib/api/namespace_implementation.dart @@ -1,9 +1,9 @@ import 'dart:async'; -import 'package:fluttering_vikunja/api/client.dart'; -import 'package:fluttering_vikunja/api/service.dart'; -import 'package:fluttering_vikunja/models/namespace.dart'; -import 'package:fluttering_vikunja/service/services.dart'; +import 'package:vikunja_app/api/client.dart'; +import 'package:vikunja_app/api/service.dart'; +import 'package:vikunja_app/models/namespace.dart'; +import 'package:vikunja_app/service/services.dart'; class NamespaceAPIService extends APIService implements NamespaceService { NamespaceAPIService(Client client) : super(client); diff --git a/lib/api/service.dart b/lib/api/service.dart index c65c863..c7d837e 100644 --- a/lib/api/service.dart +++ b/lib/api/service.dart @@ -1,4 +1,4 @@ -import 'package:fluttering_vikunja/api/client.dart'; +import 'package:vikunja_app/api/client.dart'; import 'package:meta/meta.dart'; class APIService { diff --git a/lib/api/task_implementation.dart b/lib/api/task_implementation.dart index d0861c5..1d85b1d 100644 --- a/lib/api/task_implementation.dart +++ b/lib/api/task_implementation.dart @@ -1,9 +1,9 @@ import 'dart:async'; -import 'package:fluttering_vikunja/api/client.dart'; -import 'package:fluttering_vikunja/api/service.dart'; -import 'package:fluttering_vikunja/models/task.dart'; -import 'package:fluttering_vikunja/service/services.dart'; +import 'package:vikunja_app/api/client.dart'; +import 'package:vikunja_app/api/service.dart'; +import 'package:vikunja_app/models/task.dart'; +import 'package:vikunja_app/service/services.dart'; class TaskAPIService extends APIService implements TaskService { TaskAPIService(Client client) : super(client); diff --git a/lib/api/user_implementation.dart b/lib/api/user_implementation.dart index a8789c3..61f3a99 100644 --- a/lib/api/user_implementation.dart +++ b/lib/api/user_implementation.dart @@ -1,9 +1,9 @@ import 'dart:async'; -import 'package:fluttering_vikunja/api/client.dart'; -import 'package:fluttering_vikunja/api/service.dart'; -import 'package:fluttering_vikunja/models/user.dart'; -import 'package:fluttering_vikunja/service/services.dart'; +import 'package:vikunja_app/api/client.dart'; +import 'package:vikunja_app/api/service.dart'; +import 'package:vikunja_app/models/user.dart'; +import 'package:vikunja_app/service/services.dart'; class UserAPIService extends APIService implements UserService { UserAPIService(Client client) : super(client); diff --git a/lib/fragments/namespace.dart b/lib/fragments/namespace.dart index 78ff810..e7b0f1b 100644 --- a/lib/fragments/namespace.dart +++ b/lib/fragments/namespace.dart @@ -2,10 +2,10 @@ import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:fluttering_vikunja/global.dart'; -import 'package:fluttering_vikunja/models/namespace.dart'; -import 'package:fluttering_vikunja/models/task.dart'; -import 'package:fluttering_vikunja/pages/list_page.dart'; +import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/models/namespace.dart'; +import 'package:vikunja_app/models/task.dart'; +import 'package:vikunja_app/pages/list_page.dart'; class NamespaceFragment extends StatefulWidget { final Namespace namespace; diff --git a/lib/global.dart b/lib/global.dart index 8cf2a90..f75de00 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -1,14 +1,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:fluttering_vikunja/api/client.dart'; -import 'package:fluttering_vikunja/api/list_implementation.dart'; -import 'package:fluttering_vikunja/api/namespace_implementation.dart'; -import 'package:fluttering_vikunja/api/task_implementation.dart'; -import 'package:fluttering_vikunja/api/user_implementation.dart'; -import 'package:fluttering_vikunja/managers/user.dart'; -import 'package:fluttering_vikunja/models/user.dart'; -import 'package:fluttering_vikunja/service/mocked_services.dart'; -import 'package:fluttering_vikunja/service/services.dart'; +import 'package:vikunja_app/api/client.dart'; +import 'package:vikunja_app/api/list_implementation.dart'; +import 'package:vikunja_app/api/namespace_implementation.dart'; +import 'package:vikunja_app/api/task_implementation.dart'; +import 'package:vikunja_app/api/user_implementation.dart'; +import 'package:vikunja_app/managers/user.dart'; +import 'package:vikunja_app/models/user.dart'; +import 'package:vikunja_app/service/mocked_services.dart'; +import 'package:vikunja_app/service/services.dart'; class VikunjaGlobal extends StatefulWidget { final Widget child; diff --git a/lib/main.dart b/lib/main.dart index 3b79801..f343c10 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,10 +1,10 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:fluttering_vikunja/global.dart'; -import 'package:fluttering_vikunja/pages/home_page.dart'; -import 'package:fluttering_vikunja/pages/login_page.dart'; -import 'package:fluttering_vikunja/style.dart'; +import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/pages/home_page.dart'; +import 'package:vikunja_app/pages/login_page.dart'; +import 'package:vikunja_app/style.dart'; void main() => runApp(VikunjaGlobal( child: new VikunjaApp(home: HomePage()), diff --git a/lib/models/namespace.dart b/lib/models/namespace.dart index 34bafdd..700d2d7 100644 --- a/lib/models/namespace.dart +++ b/lib/models/namespace.dart @@ -1,4 +1,4 @@ -import 'package:fluttering_vikunja/models/user.dart'; +import 'package:vikunja_app/models/user.dart'; import 'package:meta/meta.dart'; class Namespace { diff --git a/lib/models/task.dart b/lib/models/task.dart index 63c2fc9..d011603 100644 --- a/lib/models/task.dart +++ b/lib/models/task.dart @@ -1,4 +1,4 @@ -import 'package:fluttering_vikunja/models/user.dart'; +import 'package:vikunja_app/models/user.dart'; import 'package:meta/meta.dart'; class Task { diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 61efb38..98e74bc 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:fluttering_vikunja/components/GravatarImage.dart'; -import 'package:fluttering_vikunja/fragments/namespace.dart'; -import 'package:fluttering_vikunja/fragments/placeholder.dart'; -import 'package:fluttering_vikunja/global.dart'; -import 'package:fluttering_vikunja/models/namespace.dart'; -import 'package:fluttering_vikunja/models/task.dart'; -import 'package:fluttering_vikunja/models/user.dart'; +import 'package:vikunja_app/components/GravatarImage.dart'; +import 'package:vikunja_app/fragments/namespace.dart'; +import 'package:vikunja_app/fragments/placeholder.dart'; +import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/models/namespace.dart'; +import 'package:vikunja_app/models/task.dart'; +import 'package:vikunja_app/models/user.dart'; class HomePage extends StatefulWidget { @override diff --git a/lib/pages/list_page.dart b/lib/pages/list_page.dart index 3aa3e88..50661b6 100644 --- a/lib/pages/list_page.dart +++ b/lib/pages/list_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:fluttering_vikunja/global.dart'; -import 'package:fluttering_vikunja/models/task.dart'; +import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/models/task.dart'; class ListPage extends StatefulWidget { final TaskList taskList; diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 232fa7c..88bbc4a 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:fluttering_vikunja/global.dart'; -import 'package:fluttering_vikunja/main.dart'; +import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/main.dart'; class LoginPage extends StatefulWidget { @override diff --git a/lib/service/mocked_services.dart b/lib/service/mocked_services.dart index fb6dc5d..01e914a 100644 --- a/lib/service/mocked_services.dart +++ b/lib/service/mocked_services.dart @@ -1,9 +1,9 @@ import 'dart:async'; -import 'package:fluttering_vikunja/models/namespace.dart'; -import 'package:fluttering_vikunja/models/task.dart'; -import 'package:fluttering_vikunja/models/user.dart'; -import 'package:fluttering_vikunja/service/services.dart'; +import 'package:vikunja_app/models/namespace.dart'; +import 'package:vikunja_app/models/task.dart'; +import 'package:vikunja_app/models/user.dart'; +import 'package:vikunja_app/service/services.dart'; // Data for mocked services var _users = {1: User(1, 'test@testuser.org', 'test1')}; diff --git a/lib/service/services.dart b/lib/service/services.dart index 9eb5f0c..60363c1 100644 --- a/lib/service/services.dart +++ b/lib/service/services.dart @@ -1,8 +1,8 @@ import 'dart:async'; -import 'package:fluttering_vikunja/models/namespace.dart'; -import 'package:fluttering_vikunja/models/task.dart'; -import 'package:fluttering_vikunja/models/user.dart'; +import 'package:vikunja_app/models/namespace.dart'; +import 'package:vikunja_app/models/task.dart'; +import 'package:vikunja_app/models/user.dart'; abstract class NamespaceService { Future> getAll(); diff --git a/pubspec.yaml b/pubspec.yaml index 586f860..51a8d31 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,12 +1,6 @@ -name: fluttering_vikunja +name: vikunja_app description: Vikunja as Flutter cross platform app -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# Read more about versioning at semver.org. version: 1.0.0+1 environment: diff --git a/test/widget_test.dart b/test/widget_test.dart index 1dac21a..687b69b 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,29 +1,3 @@ -// This is a basic Flutter widget test. -// To perform an interaction with a widget in your test, use the WidgetTester utility that Flutter -// provides. For example, you can send tap and scroll gestures. You can also use WidgetTester to -// find child widgets in the widget tree, read text, and verify that the values of widget properties -// are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:fluttering_vikunja/pages/home_page.dart'; - void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(new HomePage()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); + // Tests go here. } From 7842855d779301e773efdc150956c44ff25eed38 Mon Sep 17 00:00:00 2001 From: konrad Date: Sun, 23 Sep 2018 10:41:28 +0000 Subject: [PATCH 18/99] Added drone (#2) --- .drone.yml | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ pubspec.yaml | 2 +- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 .drone.yml diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..6f0fd26 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,57 @@ +workspace: + base: /app + +clone: + git: + image: plugins/git + depth: 50 + tags: true + +pipeline: + test: + image: nathansamson/flutter-builder-docker:v0.6.0 + pull: true + commands: + - make test + when: + event: [ push, tag, pull_request ] + + build: + image: nathansamson/flutter-builder-docker:v0.6.0 + pull: true + commands: + - flutter packages get + - make build-all + - mkdir apks + - mv build/app/outputs/apk/*/*.apk apks + when: + event: [ push, tag ] + + # Push the releases to our pseudo-s3-bucket + release: + image: plugins/s3:1 + pull: true + secrets: [ aws_access_key_id, aws_secret_access_key ] + bucket: vikunja-app + endpoint: https://storage.kolaente.de + path_style: true + strip_prefix: apks/ + source: apks/* + target: /${DRONE_TAG##v} + when: + event: [ tag ] + + # Push the releases to our pseudo-s3-bucket + release: + image: plugins/s3:1 + pull: true + secrets: [ aws_access_key_id, aws_secret_access_key ] + bucket: vikunja-app + endpoint: https://storage.kolaente.de + path_style: true + strip_prefix: apks/ + source: apks/* + target: /master + when: + event: [ push ] + branch: [ master ] diff --git a/pubspec.yaml b/pubspec.yaml index 51a8d31..96eb8d8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ description: Vikunja as Flutter cross platform app version: 1.0.0+1 environment: - sdk: ">=2.0.0-dev.68.0 <3.0.0" + sdk: ">=2.0.0-dev.63.0 <3.0.0" dependencies: flutter: From 7705151f172080ab5241cb73f4792d7cf487edb0 Mon Sep 17 00:00:00 2001 From: konrad Date: Sun, 23 Sep 2018 15:38:02 +0000 Subject: [PATCH 19/99] added fdroid flavour (#3) --- android/app/build.gradle | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/android/app/build.gradle b/android/app/build.gradle index f94225f..ed3a151 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -44,6 +44,24 @@ android { versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + + flavorDimensions "deploy" + + productFlavors { + fdroid { + dimension "deploy" + signingConfig null + } + } + + android.applicationVariants.all { variant -> + if (variant.flavorName == "fdroid") { + variant.outputs.all { output -> + output.outputFileName = "app-fdroid-release.apk" + } + } } buildTypes { From 6bb3942302051e6d9233b2ab90b1334c349dfba5 Mon Sep 17 00:00:00 2001 From: konrad Date: Sun, 23 Sep 2018 16:04:00 +0000 Subject: [PATCH 20/99] Fixed build (#4) --- .drone.yml | 2 +- Makefile | 6 +++--- android/app/build.gradle | 10 +++++++++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.drone.yml b/.drone.yml index 6f0fd26..a504da8 100644 --- a/.drone.yml +++ b/.drone.yml @@ -23,7 +23,7 @@ pipeline: - flutter packages get - make build-all - mkdir apks - - mv build/app/outputs/apk/*/*.apk apks + - mv build/app/outputs/apk/*/*/*.apk apks when: event: [ push, tag ] diff --git a/Makefile b/Makefile index 681101e..b14bbd2 100644 --- a/Makefile +++ b/Makefile @@ -19,12 +19,12 @@ build-all: build-release build-debug build-profile .PHONY: build-release build-release: - flutter build apk --release --build-name=$(VERSION) + flutter build apk --release --build-name=$(VERSION) --flavor main .PHONY: build-debug build-debug: - flutter build apk --debug --build-name=$(VERSION) + flutter build apk --debug --build-name=$(VERSION) --flavor unsigned .PHONY: build-profile build-profile: - flutter build apk --profile --build-name=$(VERSION) \ No newline at end of file + flutter build apk --profile --build-name=$(VERSION) --flavor unsigned diff --git a/android/app/build.gradle b/android/app/build.gradle index ed3a151..f8df111 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -38,7 +38,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "io.vikunja.flutteringvikunja" + applicationId "io.vikunja.app" minSdkVersion 18 targetSdkVersion 27 versionCode flutterVersionCode.toInteger() @@ -54,6 +54,14 @@ android { dimension "deploy" signingConfig null } + unsigned { + dimension "deploy" + signingConfig null + } + main { + dimension "deploy" + signingConfig signingConfigs.debug // TODO add signing key + } } android.applicationVariants.all { variant -> From 02bcadfa24ea93382c983e94422e1b4bdea68ca1 Mon Sep 17 00:00:00 2001 From: konrad Date: Sun, 23 Sep 2018 16:23:53 +0000 Subject: [PATCH 21/99] Removed .idea folder (#7) --- .idea/runConfigurations/main_dart.xml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .idea/runConfigurations/main_dart.xml diff --git a/.idea/runConfigurations/main_dart.xml b/.idea/runConfigurations/main_dart.xml deleted file mode 100644 index aab7b5c..0000000 --- a/.idea/runConfigurations/main_dart.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file From e68944116cb5af5ebb9abaab49db2915e3d81fff Mon Sep 17 00:00:00 2001 From: konrad Date: Sun, 23 Sep 2018 16:39:20 +0000 Subject: [PATCH 22/99] Fixed version (#8) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 96eb8d8..de541af 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: vikunja_app description: Vikunja as Flutter cross platform app -version: 1.0.0+1 +version: 0.0.1 environment: sdk: ">=2.0.0-dev.63.0 <3.0.0" From b87a9a4633aec9d1ce9fe1813fb03442c1c493d1 Mon Sep 17 00:00:00 2001 From: konrad Date: Tue, 25 Sep 2018 12:06:41 +0000 Subject: [PATCH 23/99] Fixed url regex (#11) --- lib/pages/login_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 88bbc4a..307245d 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -8,7 +8,7 @@ class LoginPage extends StatefulWidget { } final RegExp _url = new RegExp( - r'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)'); + r'https?:\/\/[a-zA-Z0-9.]+(:[0-9]+)?'); class _LoginPageState extends State { final _formKey = GlobalKey(); From 08fa9167a27e00145c18f4e58da5fc6ffef671d5 Mon Sep 17 00:00:00 2001 From: JonasFranz Date: Thu, 27 Sep 2018 15:55:56 +0000 Subject: [PATCH 24/99] Add improved loading indicators (#9) --- lib/components/AddDialog.dart | 39 +++++++++ lib/components/TaskTile.dart | 89 ++++++++++++++++++++ lib/fragments/namespace.dart | 99 ++++++++++------------ lib/pages/home_page.dart | 59 +++++-------- lib/pages/list_page.dart | 154 ++++++++++++++++------------------ lib/pages/login_page.dart | 1 - 6 files changed, 262 insertions(+), 179 deletions(-) create mode 100644 lib/components/AddDialog.dart create mode 100644 lib/components/TaskTile.dart diff --git a/lib/components/AddDialog.dart b/lib/components/AddDialog.dart new file mode 100644 index 0000000..6cb56ca --- /dev/null +++ b/lib/components/AddDialog.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; + +class AddDialog extends StatelessWidget { + final ValueChanged onAdd; + final InputDecoration decoration; + + const AddDialog({Key key, this.onAdd, this.decoration}) : super(key: key); + + @override + Widget build(BuildContext context) { + var textController = TextEditingController(); + return new AlertDialog( + contentPadding: const EdgeInsets.all(16.0), + content: new Row(children: [ + Expanded( + child: new TextField( + autofocus: true, + decoration: this.decoration, + controller: textController, + ), + ) + ]), + actions: [ + new FlatButton( + child: const Text('CANCEL'), + onPressed: () => Navigator.pop(context), + ), + new FlatButton( + child: const Text('ADD'), + onPressed: () { + if (this.onAdd != null && textController.text.isNotEmpty) + this.onAdd(textController.text); + Navigator.pop(context); + }, + ) + ], + ); + } +} diff --git a/lib/components/TaskTile.dart b/lib/components/TaskTile.dart new file mode 100644 index 0000000..470f437 --- /dev/null +++ b/lib/components/TaskTile.dart @@ -0,0 +1,89 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/models/task.dart'; + +class TaskTile extends StatefulWidget { + final Task task; + final VoidCallback onEdit; + final bool loading; + + const TaskTile( + {Key key, @required this.task, this.onEdit, this.loading = false}) + : assert(task != null), + super(key: key); + + @override + TaskTileState createState() { + return new TaskTileState(this.task, this.loading); + } +} + +class TaskTileState extends State { + bool _loading; + Task _currentTask; + + TaskTileState(this._currentTask, this._loading) + : assert(_currentTask != null), + assert(_loading != null); + + @override + Widget build(BuildContext context) { + if (_loading) { + return ListTile( + leading: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: Checkbox.width, + width: Checkbox.width, + child: CircularProgressIndicator( + strokeWidth: 2.0, + )), + ), + title: Text(_currentTask.text), + subtitle: + _currentTask.description == null || _currentTask.description.isEmpty + ? null + : Text(_currentTask.description), + trailing: IconButton(icon: Icon(Icons.settings), onPressed: null), + ); + } + return CheckboxListTile( + title: Text(_currentTask.text), + controlAffinity: ListTileControlAffinity.leading, + value: _currentTask.done ?? false, + subtitle: + _currentTask.description == null || _currentTask.description.isEmpty + ? null + : Text(_currentTask.description), + secondary: + IconButton(icon: Icon(Icons.settings), onPressed: widget.onEdit), + onChanged: _change, + ); + } + + void _change(bool value) async { + setState(() { + this._loading = true; + }); + Task newTask = await _updateTask(_currentTask, value); + setState(() { + this._currentTask = newTask; + this._loading = false; + }); + } + + Future _updateTask(Task task, bool checked) { + // TODO use copyFrom + return VikunjaGlobal.of(context).taskService.update(Task( + id: task.id, + done: checked, + text: task.text, + description: task.description, + owner: null, + )); + } +} + +typedef Future TaskChanged(Task task, bool newValue); diff --git a/lib/fragments/namespace.dart b/lib/fragments/namespace.dart index e7b0f1b..afde431 100644 --- a/lib/fragments/namespace.dart +++ b/lib/fragments/namespace.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/models/namespace.dart'; import 'package:vikunja_app/models/task.dart'; @@ -18,35 +19,41 @@ class NamespaceFragment extends StatefulWidget { class _NamespaceFragmentState extends State { List _lists = []; + bool _loading = true; @override Widget build(BuildContext context) { return Scaffold( - body: new ListView( - padding: EdgeInsets.symmetric(vertical: 8.0), - children: ListTile.divideTiles( - context: context, - tiles: _lists.map((ls) => Dismissible( - key: Key(ls.id.toString()), - direction: DismissDirection.startToEnd, - child: ListTile( - title: new Text(ls.title), - onTap: () => _openList(context, ls), - trailing: Icon(Icons.arrow_right), - ), - background: Container( - color: Colors.red, - child: const ListTile( - leading: Icon(Icons.delete, - color: Colors.white, size: 36.0)), - ), - onDismissed: (direction) { - _removeList(ls).then((_) => Scaffold.of(context) - .showSnackBar( - SnackBar(content: Text("${ls.title} removed")))); - }, - ))).toList(), - ), + body: !this._loading + ? RefreshIndicator( + child: new ListView( + padding: EdgeInsets.symmetric(vertical: 8.0), + children: ListTile.divideTiles( + context: context, + tiles: _lists.map((ls) => Dismissible( + key: Key(ls.id.toString()), + direction: DismissDirection.startToEnd, + child: ListTile( + title: new Text(ls.title), + onTap: () => _openList(context, ls), + trailing: Icon(Icons.arrow_right), + ), + background: Container( + color: Colors.red, + child: const ListTile( + leading: Icon(Icons.delete, + color: Colors.white, size: 36.0)), + ), + onDismissed: (direction) { + _removeList(ls).then((_) => Scaffold.of(context) + .showSnackBar(SnackBar( + content: Text("${ls.title} removed")))); + }, + ))).toList(), + ), + onRefresh: _updateLists, + ) + : Center(child: CircularProgressIndicator()), floatingActionButton: FloatingActionButton( onPressed: () => _addListDialog(), child: const Icon(Icons.add)), ); @@ -65,11 +72,14 @@ class _NamespaceFragmentState extends State { .then((_) => _updateLists()); } - _updateLists() { - VikunjaGlobal.of(context) + Future _updateLists() { + return VikunjaGlobal.of(context) .listService .getByNamespace(widget.namespace.id) - .then((lists) => setState(() => this._lists = lists)); + .then((lists) => setState(() { + this._lists = lists; + this._loading = false; + })); } _openList(BuildContext context, TaskList list) { @@ -78,37 +88,12 @@ class _NamespaceFragmentState extends State { } _addListDialog() { - var textController = new TextEditingController(); showDialog( context: context, - child: new AlertDialog( - contentPadding: const EdgeInsets.all(16.0), - content: new Row(children: [ - Expanded( - child: new TextField( - autofocus: true, - decoration: new InputDecoration( - labelText: 'List Name', hintText: 'eg. Shopping List'), - controller: textController, - ), - ) - ]), - actions: [ - new FlatButton( - child: const Text('CANCEL'), - onPressed: () => Navigator.pop(context), - ), - new FlatButton( - child: const Text('ADD'), - onPressed: () { - if (textController.text.isNotEmpty) { - _addList(textController.text); - } - Navigator.pop(context); - }, - ) - ], - ), + builder: (_) => AddDialog( + onAdd: _addList, + decoration: new InputDecoration( + labelText: 'List Name', hintText: 'eg. Shopping List')), ); } diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 98e74bc..05e2e17 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,4 +1,7 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/components/GravatarImage.dart'; import 'package:vikunja_app/fragments/namespace.dart'; import 'package:vikunja_app/fragments/placeholder.dart'; @@ -19,6 +22,7 @@ class HomePageState extends State { ? _namespaces[_selectedDrawerIndex] : null; int _selectedDrawerIndex = -1; + bool _loading = true; _getDrawerItemWidget(int pos) { if (pos == -1) { @@ -33,38 +37,13 @@ class HomePageState extends State { } _addNamespaceDialog() { - var textController = new TextEditingController(); showDialog( - context: context, - child: new AlertDialog( - contentPadding: const EdgeInsets.all(16.0), - content: new Row(children: [ - Expanded( - child: new TextField( - autofocus: true, + context: context, + builder: (_) => AddDialog( + onAdd: _addNamespace, decoration: new InputDecoration( - labelText: 'Namespace', hintText: 'eg. Family Namespace'), - controller: textController, - ), - ) - ]), - actions: [ - new FlatButton( - child: const Text('CANCEL'), - onPressed: () => Navigator.pop(context), - ), - new FlatButton( - child: const Text('ADD'), - onPressed: () { - if (textController.text.isNotEmpty) { - _addNamespace(textController.text); - } - Navigator.pop(context); - }, - ) - ], - ), - ); + labelText: 'Namespace', hintText: 'eg. Personal Namespace'), + )); } _addNamespace(String name) { @@ -74,9 +53,10 @@ class HomePageState extends State { .then((_) => _updateNamespaces()); } - _updateNamespaces() { - VikunjaGlobal.of(context).namespaceService.getAll().then((result) { + Future _updateNamespaces() { + return VikunjaGlobal.of(context).namespaceService.getAll().then((result) { setState(() { + _loading = false; _namespaces = result; }); }); @@ -121,11 +101,16 @@ class HomePageState extends State { ), ), new Expanded( - child: ListView( - padding: EdgeInsets.zero, - children: - ListTile.divideTiles(context: context, tiles: drawerOptions) - .toList())), + child: this._loading + ? Center(child: CircularProgressIndicator()) + : RefreshIndicator( + child: ListView( + padding: EdgeInsets.zero, + children: ListTile.divideTiles( + context: context, tiles: drawerOptions) + .toList()), + onRefresh: _updateNamespaces, + )), new Align( alignment: FractionalOffset.bottomCenter, child: new ListTile( diff --git a/lib/pages/list_page.dart b/lib/pages/list_page.dart index 50661b6..4ff9a96 100644 --- a/lib/pages/list_page.dart +++ b/lib/pages/list_page.dart @@ -1,4 +1,8 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:vikunja_app/components/AddDialog.dart'; +import 'package:vikunja_app/components/TaskTile.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/models/task.dart'; @@ -12,117 +16,99 @@ class ListPage extends StatefulWidget { } class _ListPageState extends State { - TaskList items; + TaskList _items; + List _loadingTasks = []; + bool _loading = true; @override void initState() { - items = TaskList( + _items = TaskList( id: widget.taskList.id, title: widget.taskList.title, tasks: []); super.initState(); } - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: new Text(items.title), - ), - body: ListView( - padding: EdgeInsets.symmetric(vertical: 8.0), - children: ListTile.divideTiles( - context: context, - tiles: items?.tasks?.map((task) => CheckboxListTile( - title: Text(task.text), - controlAffinity: ListTileControlAffinity.leading, - value: task.done ?? false, - subtitle: task.description == null - ? null - : Text(task.description), - onChanged: (bool value) => _updateTask(task, value), - )) ?? - []) - .toList(), - ), - floatingActionButton: FloatingActionButton( - onPressed: () => _addItemDialog(), child: Icon(Icons.add)), - ); - } - @override void didChangeDependencies() { super.didChangeDependencies(); _updateList(); } - _updateTask(Task task, bool checked) { - // TODO use copyFrom - VikunjaGlobal.of(context) - .taskService - .update(Task( - id: task.id, - done: checked, - text: task.text, - description: task.description, - owner: null, - )) - .then((_) => _updateList()); + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: new Text(_items.title), + actions: [ + IconButton( + icon: Icon(Icons.edit), + onPressed: () => {/* TODO add edit list functionality */}, + ) + ], + ), + body: !this._loading + ? RefreshIndicator( + child: ListView( + padding: EdgeInsets.symmetric(vertical: 8.0), + children: + ListTile.divideTiles(context: context, tiles: _listTasks()) + .toList(), + ), + onRefresh: _updateList, + ) + : Center(child: CircularProgressIndicator()), + floatingActionButton: FloatingActionButton( + onPressed: () => _addItemDialog(), child: Icon(Icons.add)), + ); } - _updateList() { - VikunjaGlobal.of(context).listService.get(widget.taskList.id).then((tasks) { + List _listTasks() { + var tasks = (_items?.tasks?.map(_buildTile) ?? []).toList(); + tasks.addAll(_loadingTasks.map(_buildLoadingTile)); + return tasks; + } + + TaskTile _buildTile(Task task) { + return TaskTile(task: task, loading: false); + } + + TaskTile _buildLoadingTile(Task task) { + return TaskTile( + task: task, + loading: true, + ); + } + + Future _updateList() { + return VikunjaGlobal.of(context) + .listService + .get(widget.taskList.id) + .then((tasks) { setState(() { - items = tasks; + _loading = false; + _items = tasks; }); }); } _addItemDialog() { - var textController = new TextEditingController(); showDialog( - context: context, - child: new AlertDialog( - contentPadding: const EdgeInsets.all(16.0), - content: new Row(children: [ - Expanded( - child: new TextField( - autofocus: true, - decoration: new InputDecoration( - labelText: 'List Item', hintText: 'eg. Milk'), - controller: textController, - ), - ) - ]), - actions: [ - new FlatButton( - child: const Text('CANCEL'), - onPressed: () => Navigator.pop(context), - ), - new FlatButton( - child: const Text('ADD'), - onPressed: () { - if (textController.text.isNotEmpty) _addItem(textController.text); - Navigator.pop(context); - }, - ) - ], - ), - ); + context: context, + builder: (_) => AddDialog( + onAdd: _addItem, + decoration: new InputDecoration( + labelText: 'List Item', hintText: 'eg. Milk'))); } _addItem(String name) { var globalState = VikunjaGlobal.of(context); - globalState.taskService - .add( - items.id, - Task( - id: null, - text: name, - owner: globalState.currentUser, - done: false)) - .then((task) { + var newTask = + Task(id: null, text: name, owner: globalState.currentUser, done: false); + setState(() => _loadingTasks.add(newTask)); + globalState.taskService.add(_items.id, newTask).then((task) { setState(() { - items.tasks.add(task); + _items.tasks.add(task); }); - }).then((_) => _updateList()); + }).then((_) => _updateList() + .then((_) => setState(() => _loadingTasks.remove(newTask)))); } } diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 307245d..8db0f52 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -99,7 +99,6 @@ class _LoginPageState extends State { await vGlobal.newLoginService(_server).login(_username, _password); vGlobal.changeUser(newUser.user, token: newUser.token, base: _server); } catch (ex) { - print(ex); showDialog( context: context, builder: (context) => new AlertDialog( From 51265630dc1d58c805048e77ea516a74865b7b09 Mon Sep 17 00:00:00 2001 From: konrad Date: Thu, 27 Sep 2018 16:04:37 +0000 Subject: [PATCH 25/99] Improved regex (#12) --- lib/pages/login_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 8db0f52..17bbd33 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -8,7 +8,7 @@ class LoginPage extends StatefulWidget { } final RegExp _url = new RegExp( - r'https?:\/\/[a-zA-Z0-9.]+(:[0-9]+)?'); + r'https?:\/\/((([a-zA-Z0-9.\-\_]+)\.[a-zA-Z]+)|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))(:[0-9]+)?'); class _LoginPageState extends State { final _formKey = GlobalKey(); From 302dba2df6f2cdb5ca0549e812e854f4e1b22a4e Mon Sep 17 00:00:00 2001 From: konrad Date: Tue, 2 Oct 2018 15:53:57 +0000 Subject: [PATCH 26/99] Fix Typo (#14) --- lib/pages/home_page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 05e2e17..471aa79 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -82,7 +82,7 @@ class HomePageState extends State { ))); return new Scaffold( - appBar: AppBar(title: new Text(_currentNamespace?.name ?? 'Vakunja')), + appBar: AppBar(title: new Text(_currentNamespace?.name ?? 'Vikunja')), drawer: new Drawer( child: new Column(children: [ new UserAccountsDrawerHeader( From cc38133acac47d4f30b16e9e442d5a29c51dc1b0 Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 8 Oct 2018 14:26:01 +0000 Subject: [PATCH 27/99] Added register (#13) --- lib/api/user_implementation.dart | 10 ++ lib/global.dart | 3 +- lib/pages/login_page.dart | 24 +++-- lib/pages/register_page.dart | 152 +++++++++++++++++++++++++++++++ lib/service/mocked_services.dart | 5 + lib/service/services.dart | 1 + lib/utils/validator.dart | 13 +++ 7 files changed, 199 insertions(+), 9 deletions(-) create mode 100644 lib/pages/register_page.dart create mode 100644 lib/utils/validator.dart diff --git a/lib/api/user_implementation.dart b/lib/api/user_implementation.dart index 61f3a99..a07bb2e 100644 --- a/lib/api/user_implementation.dart +++ b/lib/api/user_implementation.dart @@ -19,6 +19,16 @@ class UserAPIService extends APIService implements UserService { .then((user) => UserTokenPair(user, token)); } + @override + Future register(String username, email, password) async { + var newUser = await client.post('/register', body: { + 'username': username, + 'email': email, + 'password': password + }).then((resp) => resp['username']); + return login(newUser, password); + } + @override Future getCurrentUser() { return client.get('/user').then((map) => User.fromJson(map)); diff --git a/lib/global.dart b/lib/global.dart index f75de00..622ef19 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -37,8 +37,7 @@ class VikunjaGlobalState extends State { Client get client => _client; UserManager get userManager => new UserManager(_storage); - UserService get userService => new UserAPIService(_client); - UserService newLoginService(base) => new UserAPIService(Client(null, base)); + UserService newUserService(base) => new UserAPIService(Client(null, base)); NamespaceService get namespaceService => new NamespaceAPIService(client); TaskService get taskService => new TaskAPIService(client); ListService get listService => new ListAPIService(client); diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 17bbd33..eb65be0 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -1,15 +1,13 @@ import 'package:flutter/material.dart'; import 'package:vikunja_app/global.dart'; -import 'package:vikunja_app/main.dart'; +import 'package:vikunja_app/pages/register_page.dart'; +import 'package:vikunja_app/utils/validator.dart'; class LoginPage extends StatefulWidget { @override _LoginPageState createState() => _LoginPageState(); } -final RegExp _url = new RegExp( - r'https?:\/\/((([a-zA-Z0-9.\-\_]+)\.[a-zA-Z]+)|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))(:[0-9]+)?'); - class _LoginPageState extends State { final _formKey = GlobalKey(); String _server, _username, _password; @@ -44,8 +42,7 @@ class _LoginPageState extends State { child: TextFormField( onSaved: (serverAddress) => _server = serverAddress, validator: (address) { - var hasMatch = _url.hasMatch(address); - return hasMatch ? null : 'Invalid URL'; + return isUrl(address) ? null : 'Invalid URL'; }, decoration: new InputDecoration( labelText: 'Server Address'), @@ -85,6 +82,19 @@ class _LoginPageState extends State { ? CircularProgressIndicator() : Text('Login'), ))), + Builder( + builder: (context) => ButtonTheme( + height: _loading ? 55.0 : 36.0, + child: RaisedButton( + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + RegisterPage())), + child: _loading + ? CircularProgressIndicator() + : Text('Register'), + ))), ], )), ), @@ -96,7 +106,7 @@ class _LoginPageState extends State { try { var vGlobal = VikunjaGlobal.of(context); var newUser = - await vGlobal.newLoginService(_server).login(_username, _password); + await vGlobal.newUserService(_server).login(_username, _password); vGlobal.changeUser(newUser.user, token: newUser.token, base: _server); } catch (ex) { showDialog( diff --git a/lib/pages/register_page.dart b/lib/pages/register_page.dart new file mode 100644 index 0000000..8a0433a --- /dev/null +++ b/lib/pages/register_page.dart @@ -0,0 +1,152 @@ +import 'package:flutter/material.dart'; +import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/utils/validator.dart'; + +class RegisterPage extends StatefulWidget { + @override + _RegisterPageState createState() => _RegisterPageState(); +} + +class _RegisterPageState extends State { + final _formKey = GlobalKey(); + final passwordController = TextEditingController(); + String _server, _username, _email, _password; + bool _loading = false; + + @override + Widget build(BuildContext ctx) { + return Scaffold( + appBar: AppBar( + title: Text('Register to Vikunja'), + ), + body: Builder( + builder: (BuildContext context) => SafeArea( + top: false, + bottom: false, + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Image( + image: AssetImage('assets/vikunja_logo.png'), + height: 128.0, + semanticLabel: 'Vikunja Logo', + ), + ), + Padding( + padding: EdgeInsets.all(8.0), + child: TextFormField( + onSaved: (serverAddress) => _server = serverAddress, + validator: (address) { + return isUrl(address) ? null : 'Invalid URL'; + }, + decoration: new InputDecoration( + labelText: 'Server Address'), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextFormField( + onSaved: (username) => _username = username.trim(), + validator: (username) { + return username.trim().isNotEmpty ? null : 'Please specify a username'; + }, + decoration: + new InputDecoration(labelText: 'Username'), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextFormField( + onSaved: (email) => _email = email, + validator: (email) { + return isEmail(email) + ? null + : 'Email adress is invalid'; + }, + decoration: + new InputDecoration(labelText: 'Email Address'), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextFormField( + controller: passwordController, + onSaved: (password) => _password = password, + validator: (password) { + return password.length >= 8 ? null : 'Please use at least 8 characters'; + }, + decoration: + new InputDecoration(labelText: 'Password'), + obscureText: true, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: TextFormField( + validator: (password) { + return passwordController.text == password + ? null + : 'Passwords don\'t match.'; + }, + decoration: new InputDecoration( + labelText: 'Repeat Password'), + obscureText: true, + ), + ), + Builder( + builder: (context) => ButtonTheme( + height: _loading ? 55.0 : 36.0, + child: RaisedButton( + onPressed: !_loading + ? () { + if (_formKey.currentState + .validate()) { + Form.of(context).save(); + _registerUser(context); + } else { + print("awhat"); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : Text('Register'), + ))), + ], + )), + ), + )); + } + + _registerUser(BuildContext context) async { + setState(() => _loading = true); + try { + var vGlobal = VikunjaGlobal.of(context); + var newUserLoggedIn = await vGlobal + .newUserService(_server) + .register(_username, _email, _password); + vGlobal.changeUser(newUserLoggedIn.user, + token: newUserLoggedIn.token, base: _server); + } catch (ex) { + showDialog( + context: context, + builder: (context) => new AlertDialog( + title: const Text( + 'Registration failed! Please check your server url and credentials.'), + actions: [ + FlatButton( + onPressed: () => Navigator.pop(context), + child: const Text('CLOSE')) + ], + )); + } finally { + setState(() { + _loading = false; + }); + } + } +} diff --git a/lib/service/mocked_services.dart b/lib/service/mocked_services.dart index 01e914a..df52b6b 100644 --- a/lib/service/mocked_services.dart +++ b/lib/service/mocked_services.dart @@ -151,6 +151,11 @@ class MockedUserService implements UserService { return Future.value(UserTokenPair(_users[1], 'abcdefg')); } + @override + Future register(String username, email, password) { + return Future.value(UserTokenPair(_users[1], 'abcdefg')); + } + @override Future getCurrentUser() { return Future.value(_users[1]); diff --git a/lib/service/services.dart b/lib/service/services.dart index 60363c1..be9f7b8 100644 --- a/lib/service/services.dart +++ b/lib/service/services.dart @@ -29,5 +29,6 @@ abstract class TaskService { abstract class UserService { Future login(String username, password); + Future register(String username, email, password); Future getCurrentUser(); } diff --git a/lib/utils/validator.dart b/lib/utils/validator.dart new file mode 100644 index 0000000..a363bb6 --- /dev/null +++ b/lib/utils/validator.dart @@ -0,0 +1,13 @@ +final RegExp _emailRegex = new RegExp( + r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'); + +bool isEmail(email) { + return _emailRegex.hasMatch(email); +} + +final RegExp _url = new RegExp( + r'https?:\/\/((([a-zA-Z0-9.\-\_]+)\.[a-zA-Z]+)|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))(:[0-9]+)?'); + +bool isUrl(url) { + return _url.hasMatch(url); +} From 0b2b9a1d223be57d862799b085e6035417f473c2 Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 15 Oct 2018 17:16:47 +0000 Subject: [PATCH 28/99] Added formatting check to makefile and ci (#17) --- .drone.yml | 23 ++++++++++++----------- Makefile | 23 +++++++++++++++++++---- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/.drone.yml b/.drone.yml index a504da8..a1b2801 100644 --- a/.drone.yml +++ b/.drone.yml @@ -8,6 +8,18 @@ clone: tags: true pipeline: + build: + image: nathansamson/flutter-builder-docker:v0.6.0 + pull: true + commands: + - flutter packages get + - make format-check + - make build-all + - mkdir apks + - mv build/app/outputs/apk/*/*/*.apk apks + when: + event: [ push, tag ] + test: image: nathansamson/flutter-builder-docker:v0.6.0 pull: true @@ -16,17 +28,6 @@ pipeline: when: event: [ push, tag, pull_request ] - build: - image: nathansamson/flutter-builder-docker:v0.6.0 - pull: true - commands: - - flutter packages get - - make build-all - - mkdir apks - - mv build/app/outputs/apk/*/*/*.apk apks - when: - event: [ push, tag ] - # Push the releases to our pseudo-s3-bucket release: image: plugins/s3:1 diff --git a/Makefile b/Makefile index b14bbd2..36134c0 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ GIT_LAST_COMMIT := $(shell git describe --tags --always | sed 's/-/+/' | sed 's/^v//') +FLUTTER ?= flutter ifneq ($(DRONE_TAG),) VERSION ?= $(subst v,,$(DRONE_TAG))-$(GIT_LAST_COMMIT) @@ -12,19 +13,33 @@ endif .PHONY: test test: - flutter test + $(FLUTTER) test .PHONY: build-all build-all: build-release build-debug build-profile .PHONY: build-release build-release: - flutter build apk --release --build-name=$(VERSION) --flavor main + $(FLUTTER) build apk --release --build-name=$(VERSION) --flavor main .PHONY: build-debug build-debug: - flutter build apk --debug --build-name=$(VERSION) --flavor unsigned + $(FLUTTER) build apk --debug --build-name=$(VERSION) --flavor unsigned .PHONY: build-profile build-profile: - flutter build apk --profile --build-name=$(VERSION) --flavor unsigned + $(FLUTTER) build apk --profile --build-name=$(VERSION) --flavor unsigned + +.PHONY: format +format: + $(FLUTTER) format lib + +.PHONY: format-check +format-check: + @diff=$$(flutter format -n lib); \ + if [ -n "$$diff" ]; then \ + echo "The following files are not formatted correctly:"; \ + echo "$${diff}"; \ + echo "Please run 'make format' and commit the result."; \ + exit 1; \ + fi; \ No newline at end of file From 3e7b6d4fd09e661f68d94910823a922edcf7f6ac Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 5 Nov 2018 15:43:30 +0000 Subject: [PATCH 29/99] Fix build (#18) --- .drone.yml | 4 ++-- lib/pages/register_page.dart | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.drone.yml b/.drone.yml index a1b2801..89cbe4d 100644 --- a/.drone.yml +++ b/.drone.yml @@ -9,7 +9,7 @@ clone: pipeline: build: - image: nathansamson/flutter-builder-docker:v0.6.0 + image: jonasfranz/flutter:master pull: true commands: - flutter packages get @@ -21,7 +21,7 @@ pipeline: event: [ push, tag ] test: - image: nathansamson/flutter-builder-docker:v0.6.0 + image: jonasfranz/flutter:master pull: true commands: - make test diff --git a/lib/pages/register_page.dart b/lib/pages/register_page.dart index 8a0433a..3587eaf 100644 --- a/lib/pages/register_page.dart +++ b/lib/pages/register_page.dart @@ -52,7 +52,9 @@ class _RegisterPageState extends State { child: TextFormField( onSaved: (username) => _username = username.trim(), validator: (username) { - return username.trim().isNotEmpty ? null : 'Please specify a username'; + return username.trim().isNotEmpty + ? null + : 'Please specify a username'; }, decoration: new InputDecoration(labelText: 'Username'), @@ -77,7 +79,9 @@ class _RegisterPageState extends State { controller: passwordController, onSaved: (password) => _password = password, validator: (password) { - return password.length >= 8 ? null : 'Please use at least 8 characters'; + return password.length >= 8 + ? null + : 'Please use at least 8 characters'; }, decoration: new InputDecoration(labelText: 'Password'), From d757b2df6971cb1c624c5a4f869c5ca441c5c3cc Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 3 Dec 2018 21:26:00 +0000 Subject: [PATCH 30/99] Fixed app not working with the newest api change which has multiple reminders (#19) --- lib/models/task.dart | 12 ++++++++---- pubspec.yaml | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/models/task.dart b/lib/models/task.dart index d011603..c96a583 100644 --- a/lib/models/task.dart +++ b/lib/models/task.dart @@ -3,7 +3,8 @@ import 'package:meta/meta.dart'; class Task { final int id; - final DateTime created, updated, reminder, due; + final DateTime created, updated, due; + final List reminders; final String text, description; final bool done; final User owner; @@ -12,7 +13,7 @@ class Task { {@required this.id, this.created, this.updated, - this.reminder, + this.reminders, this.due, @required this.text, this.description, @@ -23,7 +24,9 @@ class Task { : id = json['id'], updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), created = DateTime.fromMillisecondsSinceEpoch(json['created']), - reminder = DateTime.fromMillisecondsSinceEpoch(json['reminderDate']), + reminders = (json['reminderDates'] as List) + ?.map((milli) => DateTime.fromMillisecondsSinceEpoch(milli)) + ?.toList(), due = DateTime.fromMillisecondsSinceEpoch(json['dueDate']), description = json['description'], text = json['text'], @@ -34,7 +37,8 @@ class Task { 'id': id, 'updated': updated?.millisecondsSinceEpoch, 'created': created?.millisecondsSinceEpoch, - 'reminderDate': reminder?.millisecondsSinceEpoch, + 'reminderDates': + reminders?.map((date) => date.millisecondsSinceEpoch)?.toList(), 'dueDate': due?.millisecondsSinceEpoch, 'description': description, 'text': text, diff --git a/pubspec.yaml b/pubspec.yaml index de541af..08b2456 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 flutter_secure_storage: 3.1.1 + http: 0.12.0 dev_dependencies: flutter_test: From ae6d9f0222450290bf9d9929499dea33ccbbbf5a Mon Sep 17 00:00:00 2001 From: konrad Date: Sun, 10 Mar 2019 21:41:55 +0000 Subject: [PATCH 31/99] Cleanup pubspec (#24) --- pubspec.yaml | 44 +------------------------------------------- 1 file changed, 1 insertion(+), 43 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 08b2456..b6f5b97 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: vikunja_app description: Vikunja as Flutter cross platform app -version: 0.0.1 +version: 0.1.0 environment: sdk: ">=2.0.0-dev.63.0 <3.0.0" @@ -21,7 +21,6 @@ dev_dependencies: sdk: flutter flutter_launcher_icons: "^0.6.1" - flutter_icons: image_path: "assets/vikunja_logo.png" image_path_ios: "assets/vikunja_ios.png" @@ -30,48 +29,8 @@ flutter_icons: adaptive_icon_background: "#FF455486" adaptive_icon_foreground: "assets/vikunja_logo_adaptive.png" - -# For information on the generic Dart part of this file, see the -# following page: https://www.dartlang.org/tools/pub/pubspec - -# The following section is specific to Flutter. flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. uses-material-design: true - - # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.io/assets-and-images/#resolution-aware. - - # For details regarding adding assets from package dependencies, see - # https://flutter.io/assets-and-images/#from-packages - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.io/custom-fonts/#from-packages assets: - assets/graphics/background.jpg - assets/graphics/hypnotize.png @@ -80,4 +39,3 @@ flutter: - family: Quicksand fonts: - asset: assets/fonts/quicksand-v7-latin-regular.ttf - From 0b870f8f62c8dda88ba7d264d9f55cf5842ade69 Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 11 Mar 2019 20:29:15 +0000 Subject: [PATCH 32/99] List edit (#21) --- lib/api/list_implementation.dart | 4 +- lib/components/TaskTile.dart | 6 +- lib/fragments/namespace.dart | 1 + lib/models/list.dart | 42 +++++++++++ lib/models/task.dart | 38 ---------- lib/pages/list_edit_page.dart | 119 +++++++++++++++++++++++++++++++ lib/pages/list_page.dart | 26 ++++--- lib/service/mocked_services.dart | 1 + lib/service/services.dart | 1 + 9 files changed, 187 insertions(+), 51 deletions(-) create mode 100644 lib/models/list.dart create mode 100644 lib/pages/list_edit_page.dart diff --git a/lib/api/list_implementation.dart b/lib/api/list_implementation.dart index eff3121..38228d7 100644 --- a/lib/api/list_implementation.dart +++ b/lib/api/list_implementation.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:vikunja_app/api/client.dart'; import 'package:vikunja_app/api/service.dart'; -import 'package:vikunja_app/models/task.dart'; +import 'package:vikunja_app/models/list.dart'; import 'package:vikunja_app/service/services.dart'; class ListAPIService extends APIService implements ListService { @@ -40,7 +40,7 @@ class ListAPIService extends APIService implements ListService { @override Future update(TaskList tl) { return client - .put('/lists/${tl.id}', body: tl.toJSON()) + .post('/lists/${tl.id}', body: tl.toJSON()) .then((map) => TaskList.fromJson(map)); } } diff --git a/lib/components/TaskTile.dart b/lib/components/TaskTile.dart index 470f437..348e6e2 100644 --- a/lib/components/TaskTile.dart +++ b/lib/components/TaskTile.dart @@ -46,7 +46,11 @@ class TaskTileState extends State { _currentTask.description == null || _currentTask.description.isEmpty ? null : Text(_currentTask.description), - trailing: IconButton(icon: Icon(Icons.settings), onPressed: null), + trailing: IconButton( + icon: Icon(Icons.settings), + onPressed: () { + null; + }), ); } return CheckboxListTile( diff --git a/lib/fragments/namespace.dart b/lib/fragments/namespace.dart index afde431..ccdbcac 100644 --- a/lib/fragments/namespace.dart +++ b/lib/fragments/namespace.dart @@ -4,6 +4,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/models/list.dart'; import 'package:vikunja_app/models/namespace.dart'; import 'package:vikunja_app/models/task.dart'; import 'package:vikunja_app/pages/list_page.dart'; diff --git a/lib/models/list.dart b/lib/models/list.dart new file mode 100644 index 0000000..38ef0af --- /dev/null +++ b/lib/models/list.dart @@ -0,0 +1,42 @@ +import 'package:meta/meta.dart'; +import 'package:vikunja_app/models/task.dart'; +import 'package:vikunja_app/models/user.dart'; + +class TaskList { + final int id; + final String title, description; + final User owner; + final DateTime created, updated; + final List tasks; + + TaskList( + {@required this.id, + @required this.title, + this.description, + this.owner, + this.created, + this.updated, + this.tasks}); + + TaskList.fromJson(Map json) + : id = json['id'], + owner = User.fromJson(json['owner']), + description = json['description'], + title = json['title'], + updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), + created = DateTime.fromMillisecondsSinceEpoch(json['created']), + tasks = (json['tasks'] as List) + ?.map((taskJson) => Task.fromJson(taskJson)) + ?.toList(); + + toJSON() { + return { + "id": this.id, + "title": this.title, + "description": this.description, + "owner": this.owner?.toJSON(), + "created": this.created?.millisecondsSinceEpoch, + "updated": this.updated?.millisecondsSinceEpoch, + }; + } +} diff --git a/lib/models/task.dart b/lib/models/task.dart index c96a583..897f63e 100644 --- a/lib/models/task.dart +++ b/lib/models/task.dart @@ -46,41 +46,3 @@ class Task { 'createdBy': owner?.toJSON() }; } - -class TaskList { - final int id; - final String title, description; - final User owner; - final DateTime created, updated; - final List tasks; - - TaskList( - {@required this.id, - @required this.title, - this.description, - this.owner, - this.created, - this.updated, - @required this.tasks}); - - TaskList.fromJson(Map json) - : id = json['id'], - owner = User.fromJson(json['owner']), - description = json['description'], - title = json['title'], - updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), - created = DateTime.fromMillisecondsSinceEpoch(json['created']), - tasks = (json['tasks'] as List) - ?.map((taskJson) => Task.fromJson(taskJson)) - ?.toList(); - - toJSON() { - return { - "created": this.created?.millisecondsSinceEpoch, - "updated": this.updated?.millisecondsSinceEpoch, - "id": this.id, - "title": this.title, - "owner": this.owner?.toJSON() - }; - } -} diff --git a/lib/pages/list_edit_page.dart b/lib/pages/list_edit_page.dart new file mode 100644 index 0000000..c81ffc9 --- /dev/null +++ b/lib/pages/list_edit_page.dart @@ -0,0 +1,119 @@ +import 'package:flutter/material.dart'; +import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/models/list.dart'; + +class ListEditPage extends StatefulWidget { + final TaskList list; + + ListEditPage({this.list}) : super(key: Key(list.toString())); + + @override + State createState() => _ListEditPageState(); +} + +class _ListEditPageState extends State { + final _formKey = GlobalKey(); + bool _loading = false; + String _title, _description; + + @override + Widget build(BuildContext ctx) { + return Scaffold( + appBar: AppBar( + title: Text('Edit List'), + ), + body: Builder( + builder: (BuildContext context) => SafeArea( + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.list.title, + onSaved: (title) => _title = title, + validator: (title) { + if (title.length < 3 || title.length > 250) { + return 'The title needs to have between 3 and 250 characters.'; + } + return null; + }, + decoration: + new InputDecoration(labelText: 'Title'), + ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.list.description, + onSaved: (description) => + _description = description, + validator: (description) { + if (description.length > 1000) { + return 'The description can have a maximum of 1000 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Description'), + ), + ), + Builder( + builder: (context) => RaisedButton( + padding: + EdgeInsets.symmetric(vertical: 10.0), + onPressed: !_loading + ? () { + if (_formKey.currentState + .validate()) { + Form.of(context) + .save(); // Why does this not work? + _saveList(context); + } else { + print( + "sdf"); // TODO: handle error + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : Text('Save'), + )), + ])), + ))); + } + + _saveList(BuildContext context) async { + setState(() => _loading = true); + // FIXME: is there a way we can update the list without creating a new list object? + // aka updating the existing list we got from context (setters?) + TaskList updatedList = TaskList( + id: widget.list.id, title: _title, description: _description); + + VikunjaGlobal.of(context).listService.update(updatedList) + .then((_) { + setState(() => _loading = false); + final scaffold = Scaffold.of(context); + scaffold.showSnackBar(SnackBar( + content: Text('The list was updated successfully!'), + )); + }) + .catchError((err) { + setState(() => _loading = false); + final scaffold = Scaffold.of(context); + scaffold.showSnackBar( + SnackBar( + content: Text('Something went wrong: ' + err.toString()), + action: SnackBarAction( + label: 'CLOSE', onPressed: scaffold.hideCurrentSnackBar), + ), + ); + }); + } +} diff --git a/lib/pages/list_page.dart b/lib/pages/list_page.dart index 4ff9a96..4a5a57e 100644 --- a/lib/pages/list_page.dart +++ b/lib/pages/list_page.dart @@ -4,7 +4,9 @@ import 'package:flutter/material.dart'; import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/components/TaskTile.dart'; import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/models/list.dart'; import 'package:vikunja_app/models/task.dart'; +import 'package:vikunja_app/pages/list_edit_page.dart'; class ListPage extends StatefulWidget { final TaskList taskList; @@ -16,13 +18,13 @@ class ListPage extends StatefulWidget { } class _ListPageState extends State { - TaskList _items; + TaskList _list; List _loadingTasks = []; bool _loading = true; @override void initState() { - _items = TaskList( + _list = TaskList( id: widget.taskList.id, title: widget.taskList.title, tasks: []); super.initState(); } @@ -37,12 +39,16 @@ class _ListPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: new Text(_items.title), + title: new Text(_list.title), actions: [ IconButton( - icon: Icon(Icons.edit), - onPressed: () => {/* TODO add edit list functionality */}, - ) + icon: Icon(Icons.edit), + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ListEditPage( + list: _list, + )))) ], ), body: !this._loading @@ -62,7 +68,7 @@ class _ListPageState extends State { } List _listTasks() { - var tasks = (_items?.tasks?.map(_buildTile) ?? []).toList(); + var tasks = (_list?.tasks?.map(_buildTile) ?? []).toList(); tasks.addAll(_loadingTasks.map(_buildLoadingTile)); return tasks; } @@ -85,7 +91,7 @@ class _ListPageState extends State { .then((tasks) { setState(() { _loading = false; - _items = tasks; + _list = tasks; }); }); } @@ -104,9 +110,9 @@ class _ListPageState extends State { var newTask = Task(id: null, text: name, owner: globalState.currentUser, done: false); setState(() => _loadingTasks.add(newTask)); - globalState.taskService.add(_items.id, newTask).then((task) { + globalState.taskService.add(_list.id, newTask).then((task) { setState(() { - _items.tasks.add(task); + _list.tasks.add(task); }); }).then((_) => _updateList() .then((_) => setState(() => _loadingTasks.remove(newTask)))); diff --git a/lib/service/mocked_services.dart b/lib/service/mocked_services.dart index df52b6b..35d5fbb 100644 --- a/lib/service/mocked_services.dart +++ b/lib/service/mocked_services.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:vikunja_app/models/list.dart'; import 'package:vikunja_app/models/namespace.dart'; import 'package:vikunja_app/models/task.dart'; import 'package:vikunja_app/models/user.dart'; diff --git a/lib/service/services.dart b/lib/service/services.dart index be9f7b8..54f8c51 100644 --- a/lib/service/services.dart +++ b/lib/service/services.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:vikunja_app/models/list.dart'; import 'package:vikunja_app/models/namespace.dart'; import 'package:vikunja_app/models/task.dart'; import 'package:vikunja_app/models/user.dart'; From ee89f8b6cd4afb27253d9642408a694177833fa6 Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 11 Mar 2019 20:37:25 +0000 Subject: [PATCH 33/99] Added better error messages to login and register (#25) --- lib/pages/login_page.dart | 5 ++--- lib/pages/register_page.dart | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index eb65be0..457c64d 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -112,12 +112,11 @@ class _LoginPageState extends State { showDialog( context: context, builder: (context) => new AlertDialog( - title: - const Text('Login failed! Please check you credentials.'), + title: Text('Login failed! Please check your server url and credentials. ' + ex.toString()), actions: [ FlatButton( onPressed: () => Navigator.pop(context), - child: const Text('CLOSE')) + child: const Text('Close')) ], )); } finally { diff --git a/lib/pages/register_page.dart b/lib/pages/register_page.dart index 3587eaf..f78b5f7 100644 --- a/lib/pages/register_page.dart +++ b/lib/pages/register_page.dart @@ -139,12 +139,11 @@ class _RegisterPageState extends State { showDialog( context: context, builder: (context) => new AlertDialog( - title: const Text( - 'Registration failed! Please check your server url and credentials.'), + title: Text('Registration failed! Please check your server url and credentials. ' + ex.toString()), actions: [ FlatButton( onPressed: () => Navigator.pop(context), - child: const Text('CLOSE')) + child: const Text('Close')) ], )); } finally { From cf90a090e1ec18659b55de72ed6c7d167958ccf0 Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 11 Mar 2019 20:38:05 +0000 Subject: [PATCH 34/99] Theme update (#23) --- assets/graphics/background.jpg | Bin 128618 -> 0 bytes lib/main.dart | 4 +-- lib/pages/list_page.dart | 2 +- lib/pages/login_page.dart | 38 +++++++++++++++-------------- lib/pages/register_page.dart | 40 +++++++++++++++++------------- lib/style.dart | 23 ------------------ lib/theme/button.dart | 43 +++++++++++++++++++++++++++++++++ lib/theme/buttonText.dart | 19 +++++++++++++++ lib/theme/constants.dart | 25 +++++++++++++++++++ lib/theme/fancyAppBar.dart | 37 ++++++++++++++++++++++++++++ lib/theme/theme.dart | 34 ++++++++++++++++++++++++++ pubspec.yaml | 1 - 12 files changed, 203 insertions(+), 63 deletions(-) delete mode 100644 assets/graphics/background.jpg delete mode 100644 lib/style.dart create mode 100644 lib/theme/button.dart create mode 100644 lib/theme/buttonText.dart create mode 100644 lib/theme/constants.dart create mode 100644 lib/theme/fancyAppBar.dart create mode 100644 lib/theme/theme.dart diff --git a/assets/graphics/background.jpg b/assets/graphics/background.jpg deleted file mode 100644 index 9be978cea901b2e8ecd27b13a835d8762246245b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128618 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 B2D1PF diff --git a/lib/main.dart b/lib/main.dart index f343c10..81393ab 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,10 +1,8 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/pages/home_page.dart'; import 'package:vikunja_app/pages/login_page.dart'; -import 'package:vikunja_app/style.dart'; +import 'package:vikunja_app/theme/theme.dart'; void main() => runApp(VikunjaGlobal( child: new VikunjaApp(home: HomePage()), diff --git a/lib/pages/list_page.dart b/lib/pages/list_page.dart index 4a5a57e..d9ae197 100644 --- a/lib/pages/list_page.dart +++ b/lib/pages/list_page.dart @@ -102,7 +102,7 @@ class _ListPageState extends State { builder: (_) => AddDialog( onAdd: _addItem, decoration: new InputDecoration( - labelText: 'List Item', hintText: 'eg. Milk'))); + labelText: 'Task Name', hintText: 'eg. Milk'))); } _addItem(String name) { diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 457c64d..4d0673a 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/pages/register_page.dart'; +import 'package:vikunja_app/theme/button.dart'; +import 'package:vikunja_app/theme/buttonText.dart'; +import 'package:vikunja_app/theme/constants.dart'; import 'package:vikunja_app/utils/validator.dart'; class LoginPage extends StatefulWidget { @@ -30,7 +33,7 @@ class _LoginPageState extends State { padding: const EdgeInsets.symmetric(horizontal: 16.0), children: [ Padding( - padding: const EdgeInsets.all(8.0), + padding: vStandardVerticalPadding, child: Image( image: AssetImage('assets/vikunja_logo.png'), height: 128.0, @@ -38,37 +41,40 @@ class _LoginPageState extends State { ), ), Padding( - padding: EdgeInsets.all(8.0), + padding: vStandardVerticalPadding, child: TextFormField( onSaved: (serverAddress) => _server = serverAddress, validator: (address) { return isUrl(address) ? null : 'Invalid URL'; }, decoration: new InputDecoration( + border: OutlineInputBorder(), labelText: 'Server Address'), ), ), Padding( - padding: const EdgeInsets.all(8.0), + padding: vStandardVerticalPadding, child: TextFormField( onSaved: (username) => _username = username, decoration: - new InputDecoration(labelText: 'Username'), + new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Username'), ), ), Padding( - padding: const EdgeInsets.all(8.0), + padding: vStandardVerticalPadding, child: TextFormField( onSaved: (password) => _password = password, decoration: - new InputDecoration(labelText: 'Password'), + new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Password'), obscureText: true, ), ), Builder( - builder: (context) => ButtonTheme( - height: _loading ? 55.0 : 36.0, - child: RaisedButton( + builder: (context) => FancyButton( onPressed: !_loading ? () { if (_formKey.currentState @@ -80,21 +86,17 @@ class _LoginPageState extends State { : null, child: _loading ? CircularProgressIndicator() - : Text('Login'), - ))), + : VikunjaButtonText('Login'), + )), Builder( - builder: (context) => ButtonTheme( - height: _loading ? 55.0 : 36.0, - child: RaisedButton( + builder: (context) => FancyButton( onPressed: () => Navigator.push( context, MaterialPageRoute( builder: (context) => RegisterPage())), - child: _loading - ? CircularProgressIndicator() - : Text('Register'), - ))), + child: VikunjaButtonText('Register'), + )), ], )), ), diff --git a/lib/pages/register_page.dart b/lib/pages/register_page.dart index f78b5f7..17a9d49 100644 --- a/lib/pages/register_page.dart +++ b/lib/pages/register_page.dart @@ -1,5 +1,8 @@ import 'package:flutter/material.dart'; import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/theme/button.dart'; +import 'package:vikunja_app/theme/buttonText.dart'; +import 'package:vikunja_app/theme/constants.dart'; import 'package:vikunja_app/utils/validator.dart'; class RegisterPage extends StatefulWidget { @@ -29,7 +32,7 @@ class _RegisterPageState extends State { padding: const EdgeInsets.symmetric(horizontal: 16.0), children: [ Padding( - padding: const EdgeInsets.all(8.0), + padding: vStandardVerticalPadding, child: Image( image: AssetImage('assets/vikunja_logo.png'), height: 128.0, @@ -37,18 +40,19 @@ class _RegisterPageState extends State { ), ), Padding( - padding: EdgeInsets.all(8.0), + padding: vStandardVerticalPadding, child: TextFormField( onSaved: (serverAddress) => _server = serverAddress, validator: (address) { return isUrl(address) ? null : 'Invalid URL'; }, decoration: new InputDecoration( + border: OutlineInputBorder(), labelText: 'Server Address'), ), ), Padding( - padding: const EdgeInsets.all(8.0), + padding: vStandardVerticalPadding, child: TextFormField( onSaved: (username) => _username = username.trim(), validator: (username) { @@ -56,12 +60,13 @@ class _RegisterPageState extends State { ? null : 'Please specify a username'; }, - decoration: - new InputDecoration(labelText: 'Username'), + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Username'), ), ), Padding( - padding: const EdgeInsets.all(8.0), + padding: vStandardVerticalPadding, child: TextFormField( onSaved: (email) => _email = email, validator: (email) { @@ -69,12 +74,13 @@ class _RegisterPageState extends State { ? null : 'Email adress is invalid'; }, - decoration: - new InputDecoration(labelText: 'Email Address'), + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Email Address'), ), ), Padding( - padding: const EdgeInsets.all(8.0), + padding: vStandardVerticalPadding, child: TextFormField( controller: passwordController, onSaved: (password) => _password = password, @@ -83,13 +89,14 @@ class _RegisterPageState extends State { ? null : 'Please use at least 8 characters'; }, - decoration: - new InputDecoration(labelText: 'Password'), + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Password'), obscureText: true, ), ), Padding( - padding: const EdgeInsets.all(8.0), + padding: vStandardVerticalPadding, child: TextFormField( validator: (password) { return passwordController.text == password @@ -97,14 +104,13 @@ class _RegisterPageState extends State { : 'Passwords don\'t match.'; }, decoration: new InputDecoration( + border: OutlineInputBorder(), labelText: 'Repeat Password'), obscureText: true, ), ), Builder( - builder: (context) => ButtonTheme( - height: _loading ? 55.0 : 36.0, - child: RaisedButton( + builder: (context) => FancyButton( onPressed: !_loading ? () { if (_formKey.currentState @@ -118,8 +124,8 @@ class _RegisterPageState extends State { : null, child: _loading ? CircularProgressIndicator() - : Text('Register'), - ))), + : VikunjaButtonText('Register'), + )), ], )), ), diff --git a/lib/style.dart b/lib/style.dart deleted file mode 100644 index 047173c..0000000 --- a/lib/style.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:flutter/material.dart'; - -const vBlue = Color(0xFF455486); -const vBlueLight = Color(0xFF7480b7); -const vBlueDark = Color(0xFF152c5a); -const vBlack = Color(0xFFFFFFFF); - -ThemeData buildVikunjaTheme() { - var base = ThemeData.light(); - return base.copyWith( - primaryColor: vBlue, - primaryColorLight: vBlueLight, - primaryColorDark: vBlueDark, - textTheme: base.textTheme.copyWith( - headline: base.textTheme.headline.copyWith( - fontFamily: 'Quicksand', - fontSize: 72.0, - ), - title: base.textTheme.title.copyWith( - fontFamily: 'Quicksand', - ), - )); -} diff --git a/lib/theme/button.dart b/lib/theme/button.dart new file mode 100644 index 0000000..a49812b --- /dev/null +++ b/lib/theme/button.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:vikunja_app/theme/constants.dart'; + +class FancyButton extends StatelessWidget { + final double width; + final double height; + final Function onPressed; + final Widget child; + + const FancyButton({ + Key key, + @required this.child, + this.width = double.infinity, + this.height = 35, + this.onPressed, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: vStandardVerticalPadding, + child: Container( + width: width, + height: height, + decoration: BoxDecoration(boxShadow: [ + BoxShadow( + color: vButtonShadow, + offset: Offset(-5, 5), + blurRadius: 10, + ), + ]), + child: Material( + borderRadius: BorderRadius.circular(3), + color: vButtonColor, + child: InkWell( + onTap: onPressed, + child: Center( + child: child, + )), + ), + )); + } +} diff --git a/lib/theme/buttonText.dart b/lib/theme/buttonText.dart new file mode 100644 index 0000000..c8010c5 --- /dev/null +++ b/lib/theme/buttonText.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:vikunja_app/theme/constants.dart'; + +class VikunjaButtonText extends StatelessWidget { + final String text; + + const VikunjaButtonText( + this.text, { + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Text( + text, + style: TextStyle(color: vButtonTextColor, fontWeight: FontWeight.w600), + ); + } +} diff --git a/lib/theme/constants.dart b/lib/theme/constants.dart new file mode 100644 index 0000000..8272190 --- /dev/null +++ b/lib/theme/constants.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +///////// +// Colors +////// +const vBlue = Color(0xFF7F23FF); +const vBlueLight = Color(0xFF7480b7); +const vBlueDark = Color(0xFF152c5a); +const vPrimary = Color(0xFF0c86ff); +const vPrimaryDark = Color(0xFF1A73E8); +const vRed = Color(0xFFff4136); +const vOrange = Color(0xFFff851b); +const vWhite = Color(0xFFffffff); +const vGreen = Color(0xFF00CE6E); + +const vButtonColor = vPrimary; +const vButtonTextColor = vWhite; +const vButtonShadow = Color(0xFFb2d9ff); + +/////////// +// Paddings +//////// +const vStandardVerticalPadding = EdgeInsets.symmetric(vertical: 5.0); +const vStandardHorizontalPadding = EdgeInsets.symmetric(horizontal: 5.0); +const vStandardPadding = EdgeInsets.symmetric(horizontal: 5.0, vertical: 5.0); diff --git a/lib/theme/fancyAppBar.dart b/lib/theme/fancyAppBar.dart new file mode 100644 index 0000000..2c241e7 --- /dev/null +++ b/lib/theme/fancyAppBar.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +class FancyAppBar extends StatelessWidget { + final String title; + final double barHeight = 80.0; + + FancyAppBar(this.title); + + @override + Widget build(BuildContext context) { + return new Container( + height: barHeight, + width: double.infinity, + decoration: new BoxDecoration(color: Colors.blue), + child: new Padding( + padding: EdgeInsets.symmetric(vertical: 38, horizontal: 10), + child: new Text(title, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.w600, + fontFamily: 'Quicksand', + fontSize: 21)), + ), + ); + } +} + +/* +Usage: +return new Scaffold( + body: new Column( + children: [ + new FancyAppBar('Login to Vikunja'), + ], + ), + ); + */ diff --git a/lib/theme/theme.dart b/lib/theme/theme.dart new file mode 100644 index 0000000..55ba656 --- /dev/null +++ b/lib/theme/theme.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:vikunja_app/theme/constants.dart'; + +ThemeData buildVikunjaTheme() { + var base = ThemeData.light(); + return base.copyWith( + errorColor: vRed, + primaryColor: vPrimaryDark, + primaryColorLight: vPrimary, + primaryColorDark: vBlueDark, + buttonTheme: base.buttonTheme.copyWith( + buttonColor: vPrimary, + textTheme: ButtonTextTheme.normal, + colorScheme: base.buttonTheme.colorScheme.copyWith( + // Why does this not work? + onSurface: vWhite, + onSecondary: vWhite, + background: vBlue, + ), + ), + textTheme: base.textTheme.copyWith( + headline: base.textTheme.headline.copyWith( + fontFamily: 'Quicksand', + ), + title: base.textTheme.title.copyWith( + fontFamily: 'Quicksand', + ), + button: base.textTheme.button.copyWith( + color: + vWhite, // This does not work, looks like a bug in Flutter: https://github.com/flutter/flutter/issues/19623 + ), + ), + ); +} diff --git a/pubspec.yaml b/pubspec.yaml index b6f5b97..8774e4b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,7 +32,6 @@ flutter_icons: flutter: uses-material-design: true assets: - - assets/graphics/background.jpg - assets/graphics/hypnotize.png - assets/vikunja_logo.png fonts: From 3c0a1812ce5738ac4f31bea240ab375591dbbf66 Mon Sep 17 00:00:00 2001 From: konrad Date: Thu, 14 Mar 2019 21:12:02 +0000 Subject: [PATCH 35/99] Login page design improvements (#26) --- assets/vikunja_logo_full.png | Bin 0 -> 59736 bytes lib/pages/login_page.dart | 173 ++++++++++++++++++----------------- lib/pages/register_page.dart | 12 +-- pubspec.yaml | 1 + 4 files changed, 94 insertions(+), 92 deletions(-) create mode 100644 assets/vikunja_logo_full.png diff --git a/assets/vikunja_logo_full.png b/assets/vikunja_logo_full.png new file mode 100644 index 0000000000000000000000000000000000000000..57e4652083f12810358623228a9d4d692b3de21f GIT binary patch literal 59736 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 { @override Widget build(BuildContext ctx) { return Scaffold( - appBar: AppBar( - title: Text('Login to Vikunja'), - ), - body: Builder( - builder: (BuildContext context) => SafeArea( - top: false, - bottom: false, - child: Form( - autovalidate: true, - key: _formKey, - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - children: [ - Padding( - padding: vStandardVerticalPadding, - child: Image( - image: AssetImage('assets/vikunja_logo.png'), - height: 128.0, - semanticLabel: 'Vikunja Logo', - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - onSaved: (serverAddress) => _server = serverAddress, - validator: (address) { - return isUrl(address) ? null : 'Invalid URL'; - }, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Server Address'), - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - onSaved: (username) => _username = username, - decoration: - new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Username'), - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - onSaved: (password) => _password = password, - decoration: - new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Password'), - obscureText: true, - ), - ), - Builder( - builder: (context) => FancyButton( - onPressed: !_loading - ? () { - if (_formKey.currentState - .validate()) { - Form.of(context).save(); - _loginUser(context); - } - } - : null, - child: _loading - ? CircularProgressIndicator() - : VikunjaButtonText('Login'), - )), - Builder( - builder: (context) => FancyButton( - onPressed: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - RegisterPage())), - child: VikunjaButtonText('Register'), - )), - ], - )), + body: Center( + child: SingleChildScrollView( + padding: const EdgeInsets.all(16.0), + child: Builder( + builder: (BuildContext context) => Form( + autovalidate: true, + key: _formKey, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 30), + child: Image( + image: AssetImage('assets/vikunja_logo_full.png'), + height: 85.0, + semanticLabel: 'Vikunja Logo', + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + enabled: !_loading, + onSaved: (serverAddress) => + _server = serverAddress, + validator: (address) { + return isUrl(address) + ? null + : 'Invalid URL'; + }, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Server Address'), + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + enabled: !_loading, + onSaved: (username) => _username = username, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Username'), + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + enabled: !_loading, + onSaved: (password) => _password = password, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Password'), + obscureText: true, + ), + ), + Builder( + builder: (context) => FancyButton( + onPressed: !_loading + ? () { + if (_formKey.currentState + .validate()) { + Form.of(context).save(); + _loginUser(context); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : VikunjaButtonText('Login'), + )), + Builder( + builder: (context) => FancyButton( + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + RegisterPage())), + child: VikunjaButtonText('Register'), + )), + ], + ), ), - )); + ), + ), + ), + ), + ); } _loginUser(BuildContext context) async { @@ -114,7 +121,9 @@ class _LoginPageState extends State { showDialog( context: context, builder: (context) => new AlertDialog( - title: Text('Login failed! Please check your server url and credentials. ' + ex.toString()), + title: Text( + 'Login failed! Please check your server url and credentials. ' + + ex.toString()), actions: [ FlatButton( onPressed: () => Navigator.pop(context), diff --git a/lib/pages/register_page.dart b/lib/pages/register_page.dart index 17a9d49..3e5c201 100644 --- a/lib/pages/register_page.dart +++ b/lib/pages/register_page.dart @@ -20,7 +20,7 @@ class _RegisterPageState extends State { Widget build(BuildContext ctx) { return Scaffold( appBar: AppBar( - title: Text('Register to Vikunja'), + title: Text('Register'), ), body: Builder( builder: (BuildContext context) => SafeArea( @@ -29,16 +29,8 @@ class _RegisterPageState extends State { child: Form( key: _formKey, child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 16.0), + padding: const EdgeInsets.all(16), children: [ - Padding( - padding: vStandardVerticalPadding, - child: Image( - image: AssetImage('assets/vikunja_logo.png'), - height: 128.0, - semanticLabel: 'Vikunja Logo', - ), - ), Padding( padding: vStandardVerticalPadding, child: TextFormField( diff --git a/pubspec.yaml b/pubspec.yaml index 8774e4b..ee58330 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -34,6 +34,7 @@ flutter: assets: - assets/graphics/hypnotize.png - assets/vikunja_logo.png + - assets/vikunja_logo_full.png fonts: - family: Quicksand fonts: From 2c5e78b5208539b97b67d293819ca737b32a16b5 Mon Sep 17 00:00:00 2001 From: konrad Date: Thu, 14 Mar 2019 21:25:57 +0000 Subject: [PATCH 36/99] List edit design improvements (#27) --- lib/pages/list_edit_page.dart | 140 ++++++++++++++++++---------------- 1 file changed, 73 insertions(+), 67 deletions(-) diff --git a/lib/pages/list_edit_page.dart b/lib/pages/list_edit_page.dart index c81ffc9..501714e 100644 --- a/lib/pages/list_edit_page.dart +++ b/lib/pages/list_edit_page.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/models/list.dart'; +import 'package:vikunja_app/theme/button.dart'; +import 'package:vikunja_app/theme/buttonText.dart'; class ListEditPage extends StatefulWidget { final TaskList list; @@ -19,74 +21,78 @@ class _ListEditPageState extends State { @override Widget build(BuildContext ctx) { return Scaffold( - appBar: AppBar( - title: Text('Edit List'), + appBar: AppBar( + title: Text('Edit List'), + ), + body: Builder( + builder: (BuildContext context) => SafeArea( + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.list.title, + onSaved: (title) => _title = title, + validator: (title) { + if (title.length < 3 || title.length > 250) { + return 'The title needs to have between 3 and 250 characters.'; + } + return null; + }, + decoration: + new InputDecoration( + labelText: 'Title', + border: OutlineInputBorder(), + ), + ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.list.description, + onSaved: (description) => _description = description, + validator: (description) { + if (description.length > 1000) { + return 'The description can have a maximum of 1000 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Description', + border: OutlineInputBorder(), + ), + ), + ), + Builder( + builder: (context) => Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: FancyButton( + onPressed: !_loading ? () { + if (_formKey.currentState.validate()) { + Form.of(context).save(); + _saveList(context); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : VikunjaButtonText('Save'), + ) + ) + ), + ] + ), + ), ), - body: Builder( - builder: (BuildContext context) => SafeArea( - child: Form( - key: _formKey, - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - children: [ - Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: TextFormField( - maxLines: null, - keyboardType: TextInputType.multiline, - initialValue: widget.list.title, - onSaved: (title) => _title = title, - validator: (title) { - if (title.length < 3 || title.length > 250) { - return 'The title needs to have between 3 and 250 characters.'; - } - return null; - }, - decoration: - new InputDecoration(labelText: 'Title'), - ), - ), - Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: TextFormField( - maxLines: null, - keyboardType: TextInputType.multiline, - initialValue: widget.list.description, - onSaved: (description) => - _description = description, - validator: (description) { - if (description.length > 1000) { - return 'The description can have a maximum of 1000 characters.'; - } - return null; - }, - decoration: new InputDecoration( - labelText: 'Description'), - ), - ), - Builder( - builder: (context) => RaisedButton( - padding: - EdgeInsets.symmetric(vertical: 10.0), - onPressed: !_loading - ? () { - if (_formKey.currentState - .validate()) { - Form.of(context) - .save(); // Why does this not work? - _saveList(context); - } else { - print( - "sdf"); // TODO: handle error - } - } - : null, - child: _loading - ? CircularProgressIndicator() - : Text('Save'), - )), - ])), - ))); + ), + ); } _saveList(BuildContext context) async { From f38179322bf242b2e4bec720d2df461a95cef227 Mon Sep 17 00:00:00 2001 From: konrad Date: Thu, 14 Mar 2019 21:27:13 +0000 Subject: [PATCH 37/99] Reload items after adding it (#28) --- lib/fragments/namespace.dart | 11 +++++++---- lib/pages/list_page.dart | 6 ++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/fragments/namespace.dart b/lib/fragments/namespace.dart index ccdbcac..2cc815c 100644 --- a/lib/fragments/namespace.dart +++ b/lib/fragments/namespace.dart @@ -6,11 +6,11 @@ import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/models/list.dart'; import 'package:vikunja_app/models/namespace.dart'; -import 'package:vikunja_app/models/task.dart'; import 'package:vikunja_app/pages/list_page.dart'; class NamespaceFragment extends StatefulWidget { final Namespace namespace; + NamespaceFragment({this.namespace}) : super(key: Key(namespace.id.toString())); @@ -100,8 +100,11 @@ class _NamespaceFragmentState extends State { _addList(String name) { VikunjaGlobal.of(context) - .listService - .create(widget.namespace.id, TaskList(id: null, title: name, tasks: [])) - .then((_) => setState(() {})); + .listService + .create(widget.namespace.id, TaskList(id: null, title: name, tasks: [])) + .then((_) { + setState(() {}); + _updateLists(); + }); } } diff --git a/lib/pages/list_page.dart b/lib/pages/list_page.dart index d9ae197..9004e18 100644 --- a/lib/pages/list_page.dart +++ b/lib/pages/list_page.dart @@ -114,7 +114,9 @@ class _ListPageState extends State { setState(() { _list.tasks.add(task); }); - }).then((_) => _updateList() - .then((_) => setState(() => _loadingTasks.remove(newTask)))); + }).then((_) { + _updateList(); + setState(() => _loadingTasks.remove(newTask)); + }); } } From 863d2995c2bb1c6b8c3b9cbf88d7078a9412fdce Mon Sep 17 00:00:00 2001 From: konrad Date: Fri, 15 Mar 2019 06:52:50 +0000 Subject: [PATCH 38/99] Snackbars for all actions (#30) --- lib/fragments/namespace.dart | 17 ++++++++++++----- lib/pages/home_page.dart | 23 +++++++++++++++-------- lib/pages/list_edit_page.dart | 8 +++----- lib/pages/list_page.dart | 24 ++++++++++++++---------- 4 files changed, 44 insertions(+), 28 deletions(-) diff --git a/lib/fragments/namespace.dart b/lib/fragments/namespace.dart index 2cc815c..f77d68a 100644 --- a/lib/fragments/namespace.dart +++ b/lib/fragments/namespace.dart @@ -55,8 +55,10 @@ class _NamespaceFragmentState extends State { onRefresh: _updateLists, ) : Center(child: CircularProgressIndicator()), - floatingActionButton: FloatingActionButton( - onPressed: () => _addListDialog(), child: const Icon(Icons.add)), + floatingActionButton: Builder( + builder: (context) => FloatingActionButton( + onPressed: () => _addListDialog(context), child: const Icon(Icons.add)) + ), ); } @@ -88,23 +90,28 @@ class _NamespaceFragmentState extends State { MaterialPageRoute(builder: (context) => ListPage(taskList: list))); } - _addListDialog() { + _addListDialog(BuildContext context) { showDialog( context: context, builder: (_) => AddDialog( - onAdd: _addList, + onAdd: (name) => _addList(name, context), decoration: new InputDecoration( labelText: 'List Name', hintText: 'eg. Shopping List')), ); } - _addList(String name) { + _addList(String name, BuildContext context) { VikunjaGlobal.of(context) .listService .create(widget.namespace.id, TaskList(id: null, title: name, tasks: [])) .then((_) { setState(() {}); _updateLists(); + Scaffold.of(context).showSnackBar( + SnackBar( + content: Text('The list was successfully created!'), + ), + ); }); } } diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 471aa79..cb001d3 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -36,21 +36,26 @@ class HomePageState extends State { Navigator.of(context).pop(); } - _addNamespaceDialog() { + _addNamespaceDialog(BuildContext context) { showDialog( context: context, builder: (_) => AddDialog( - onAdd: _addNamespace, + onAdd: (name) => _addNamespace(name, context), decoration: new InputDecoration( labelText: 'Namespace', hintText: 'eg. Personal Namespace'), )); } - _addNamespace(String name) { + _addNamespace(String name, BuildContext context) { VikunjaGlobal.of(context) .namespaceService .create(Namespace(id: null, name: name)) - .then((_) => _updateNamespaces()); + .then((_) { + _updateNamespaces(); + Scaffold.of(context).showSnackBar(SnackBar( + content: Text('The namespace was created successfully!'), + )); + }); } Future _updateNamespaces() { @@ -113,10 +118,12 @@ class HomePageState extends State { )), new Align( alignment: FractionalOffset.bottomCenter, - child: new ListTile( - leading: const Icon(Icons.add), - title: const Text('Add namespace...'), - onTap: () => _addNamespaceDialog(), + child: Builder( + builder: (context) => ListTile( + leading: const Icon(Icons.add), + title: const Text('Add namespace...'), + onTap: () => _addNamespaceDialog(context), + ), ), ), ])), diff --git a/lib/pages/list_edit_page.dart b/lib/pages/list_edit_page.dart index 501714e..683d9ad 100644 --- a/lib/pages/list_edit_page.dart +++ b/lib/pages/list_edit_page.dart @@ -105,19 +105,17 @@ class _ListEditPageState extends State { VikunjaGlobal.of(context).listService.update(updatedList) .then((_) { setState(() => _loading = false); - final scaffold = Scaffold.of(context); - scaffold.showSnackBar(SnackBar( + Scaffold.of(context).showSnackBar(SnackBar( content: Text('The list was updated successfully!'), )); }) .catchError((err) { setState(() => _loading = false); - final scaffold = Scaffold.of(context); - scaffold.showSnackBar( + Scaffold.of(context).showSnackBar( SnackBar( content: Text('Something went wrong: ' + err.toString()), action: SnackBarAction( - label: 'CLOSE', onPressed: scaffold.hideCurrentSnackBar), + label: 'CLOSE', onPressed: Scaffold.of(context).hideCurrentSnackBar), ), ); }); diff --git a/lib/pages/list_page.dart b/lib/pages/list_page.dart index 9004e18..1f63cd5 100644 --- a/lib/pages/list_page.dart +++ b/lib/pages/list_page.dart @@ -32,7 +32,7 @@ class _ListPageState extends State { @override void didChangeDependencies() { super.didChangeDependencies(); - _updateList(); + _loadList(); } @override @@ -59,12 +59,13 @@ class _ListPageState extends State { ListTile.divideTiles(context: context, tiles: _listTasks()) .toList(), ), - onRefresh: _updateList, + onRefresh: _loadList, ) : Center(child: CircularProgressIndicator()), - floatingActionButton: FloatingActionButton( - onPressed: () => _addItemDialog(), child: Icon(Icons.add)), - ); + floatingActionButton: Builder( + builder: (context) => FloatingActionButton( + onPressed: () => _addItemDialog(context), child: Icon(Icons.add)), + )); } List _listTasks() { @@ -84,7 +85,7 @@ class _ListPageState extends State { ); } - Future _updateList() { + Future _loadList() { return VikunjaGlobal.of(context) .listService .get(widget.taskList.id) @@ -96,16 +97,16 @@ class _ListPageState extends State { }); } - _addItemDialog() { + _addItemDialog(BuildContext context) { showDialog( context: context, builder: (_) => AddDialog( - onAdd: _addItem, + onAdd: (name) => _addItem(name, context), decoration: new InputDecoration( labelText: 'Task Name', hintText: 'eg. Milk'))); } - _addItem(String name) { + _addItem(String name, BuildContext context) { var globalState = VikunjaGlobal.of(context); var newTask = Task(id: null, text: name, owner: globalState.currentUser, done: false); @@ -115,8 +116,11 @@ class _ListPageState extends State { _list.tasks.add(task); }); }).then((_) { - _updateList(); + _loadList(); setState(() => _loadingTasks.remove(newTask)); + Scaffold.of(context).showSnackBar(SnackBar( + content: Text('The task was added successfully!'), + )); }); } } From 56de1c2a56b23b5574b6ea407ff7f3038ca568dd Mon Sep 17 00:00:00 2001 From: konrad Date: Fri, 15 Mar 2019 22:14:37 +0000 Subject: [PATCH 39/99] Fix the build and update drone (#33) --- .drone.yml | 153 +++++++++++++++------- .gitignore | 1 + README.md | 2 +- lib/fragments/namespace.dart | 24 ++-- lib/pages/home_page.dart | 16 +-- lib/pages/list_edit_page.dart | 160 ++++++++++++----------- lib/pages/list_page.dart | 56 ++++---- lib/pages/login_page.dart | 153 +++++++++++----------- lib/pages/register_page.dart | 4 +- pubspec.lock | 232 ++++++++++++++++++++++++++++++++++ 10 files changed, 544 insertions(+), 257 deletions(-) create mode 100644 pubspec.lock diff --git a/.drone.yml b/.drone.yml index 89cbe4d..caa2d57 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,58 +1,117 @@ +kind: pipeline +name: testing + workspace: base: /app clone: - git: - image: plugins/git - depth: 50 - tags: true + depth: 50 -pipeline: - build: - image: jonasfranz/flutter:master - pull: true - commands: - - flutter packages get - - make format-check - - make build-all - - mkdir apks - - mv build/app/outputs/apk/*/*/*.apk apks - when: - event: [ push, tag ] +steps: + - name: build + image: adamantium/flutter + pull: true + commands: + - apt-get update && apt-get install make # We do this here to not have to deal with updating the image itself + - flutter packages get + - make format-check + - make build-debug - test: - image: jonasfranz/flutter:master - pull: true - commands: - - make test - when: - event: [ push, tag, pull_request ] - - # Push the releases to our pseudo-s3-bucket - release: + - name: test + image: adamantium/flutter + pull: true + commands: + - apt-get update && apt-get install make # We do this here to not have to deal with updating the image itself + - flutter packages get + - make test + +--- +kind: pipeline +name: release-latest + +depends_on: + - testing + +trigger: + branch: + - master + event: + - push + +workspace: + base: /app + +clone: + depth: 50 + +steps: + # Because drone separates the pipelines, we have to add the build step to this pipeline. This is double code, we should change it at some point if possible. + - name: build + image: adamantium/flutter + pull: true + commands: + - apt-get update && apt-get install make # We do this here to not have to deal with updating the image itself + - flutter packages get + - make build-all + - mkdir apks + - mv build/app/outputs/apk/*/*/*.apk apks + + # Push the releases to our pseudo-s3-bucket + - name: release image: plugins/s3:1 pull: true - secrets: [ aws_access_key_id, aws_secret_access_key ] - bucket: vikunja-app - endpoint: https://storage.kolaente.de - path_style: true - strip_prefix: apks/ - source: apks/* - target: /${DRONE_TAG##v} - when: - event: [ tag ] + settings: + bucket: vikunja-app + access_key: + from_secret: aws_access_key_id + secret_key: + from_secret: aws_secret_access_key + endpoint: https://storage.kolaente.de + path_style: true + strip_prefix: apks/ + source: apks/* + target: /master - # Push the releases to our pseudo-s3-bucket - release: +--- +kind: pipeline +name: release-version + +depends_on: + - testing + +trigger: + event: + - tag + +workspace: + base: /app + +clone: + depth: 50 + +steps: + # Because drone separates the pipelines, we have to add the build step to this pipeline. This is double code, we should change it at some point if possible. + - name: build + image: adamantium/flutter + pull: true + commands: + - apt-get update && apt-get install make # We do this here to not have to deal with updating the image itself + - flutter packages get + - make build-all + - mkdir apks + - mv build/app/outputs/apk/*/*/*.apk apks + # Push the releases to our pseudo-s3-bucket + - name: release image: plugins/s3:1 pull: true - secrets: [ aws_access_key_id, aws_secret_access_key ] - bucket: vikunja-app - endpoint: https://storage.kolaente.de - path_style: true - strip_prefix: apks/ - source: apks/* - target: /master - when: - event: [ push ] - branch: [ master ] + settings: + bucket: vikunja-app + access_key: + from_secret: aws_access_key_id + secret_key: + from_secret: aws_secret_access_key + endpoint: https://storage.kolaente.de + path_style: true + strip_prefix: apks/ + source: apks/* + target: /${DRONE_TAG##v} diff --git a/.gitignore b/.gitignore index 5be27ae..816ad73 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ .pub-cache/ .pub/ build/ +!pubspec.lock # Android related **/android/**/gradle-wrapper.jar diff --git a/README.md b/README.md index 42d99af..af1e2eb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Vikunja Cross-Plattform app -[![Build Status](https://drone.kolaente.de/api/badges/vikunja/app/status.svg)](https://drone.kolaente.de/vikunja/app) +[![Build Status](https://drone1.kolaente.de/api/badges/vikunja/app/status.svg)](https://drone1.kolaente.de/vikunja/app) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Download](https://img.shields.io/badge/download-v0.1-brightgreen.svg)](https://storage.kolaente.de/minio/vikunja-app/) diff --git a/lib/fragments/namespace.dart b/lib/fragments/namespace.dart index f77d68a..64817c7 100644 --- a/lib/fragments/namespace.dart +++ b/lib/fragments/namespace.dart @@ -57,8 +57,8 @@ class _NamespaceFragmentState extends State { : Center(child: CircularProgressIndicator()), floatingActionButton: Builder( builder: (context) => FloatingActionButton( - onPressed: () => _addListDialog(context), child: const Icon(Icons.add)) - ), + onPressed: () => _addListDialog(context), + child: const Icon(Icons.add))), ); } @@ -102,16 +102,16 @@ class _NamespaceFragmentState extends State { _addList(String name, BuildContext context) { VikunjaGlobal.of(context) - .listService - .create(widget.namespace.id, TaskList(id: null, title: name, tasks: [])) - .then((_) { - setState(() {}); - _updateLists(); - Scaffold.of(context).showSnackBar( - SnackBar( - content: Text('The list was successfully created!'), - ), - ); + .listService + .create(widget.namespace.id, TaskList(id: null, title: name, tasks: [])) + .then((_) { + setState(() {}); + _updateLists(); + Scaffold.of(context).showSnackBar( + SnackBar( + content: Text('The list was successfully created!'), + ), + ); }); } } diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index cb001d3..55562bb 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -51,10 +51,10 @@ class HomePageState extends State { .namespaceService .create(Namespace(id: null, name: name)) .then((_) { - _updateNamespaces(); - Scaffold.of(context).showSnackBar(SnackBar( - content: Text('The namespace was created successfully!'), - )); + _updateNamespaces(); + Scaffold.of(context).showSnackBar(SnackBar( + content: Text('The namespace was created successfully!'), + )); }); } @@ -120,10 +120,10 @@ class HomePageState extends State { alignment: FractionalOffset.bottomCenter, child: Builder( builder: (context) => ListTile( - leading: const Icon(Icons.add), - title: const Text('Add namespace...'), - onTap: () => _addNamespaceDialog(context), - ), + leading: const Icon(Icons.add), + title: const Text('Add namespace...'), + onTap: () => _addNamespaceDialog(context), + ), ), ), ])), diff --git a/lib/pages/list_edit_page.dart b/lib/pages/list_edit_page.dart index 683d9ad..7b0682f 100644 --- a/lib/pages/list_edit_page.dart +++ b/lib/pages/list_edit_page.dart @@ -26,71 +26,68 @@ class _ListEditPageState extends State { ), body: Builder( builder: (BuildContext context) => SafeArea( - child: Form( - key: _formKey, - child: ListView( - padding: const EdgeInsets.all(16.0), - children: [ - Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: TextFormField( - maxLines: null, - keyboardType: TextInputType.multiline, - initialValue: widget.list.title, - onSaved: (title) => _title = title, - validator: (title) { - if (title.length < 3 || title.length > 250) { - return 'The title needs to have between 3 and 250 characters.'; - } - return null; - }, - decoration: - new InputDecoration( - labelText: 'Title', - border: OutlineInputBorder(), + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.list.title, + onSaved: (title) => _title = title, + validator: (title) { + if (title.length < 3 || title.length > 250) { + return 'The title needs to have between 3 and 250 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Title', + border: OutlineInputBorder(), + ), + ), ), - ), - ), - Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: TextFormField( - maxLines: null, - keyboardType: TextInputType.multiline, - initialValue: widget.list.description, - onSaved: (description) => _description = description, - validator: (description) { - if (description.length > 1000) { - return 'The description can have a maximum of 1000 characters.'; - } - return null; - }, - decoration: new InputDecoration( - labelText: 'Description', - border: OutlineInputBorder(), - ), - ), - ), - Builder( - builder: (context) => Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: FancyButton( - onPressed: !_loading ? () { - if (_formKey.currentState.validate()) { - Form.of(context).save(); - _saveList(context); - } - } - : null, - child: _loading - ? CircularProgressIndicator() - : VikunjaButtonText('Save'), - ) - ) - ), - ] + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.list.description, + onSaved: (description) => _description = description, + validator: (description) { + if (description.length > 1000) { + return 'The description can have a maximum of 1000 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Description', + border: OutlineInputBorder(), + ), + ), + ), + Builder( + builder: (context) => Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: FancyButton( + onPressed: !_loading + ? () { + if (_formKey.currentState.validate()) { + Form.of(context).save(); + _saveList(context); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : VikunjaButtonText('Save'), + ))), + ]), + ), ), - ), - ), ), ); } @@ -99,25 +96,24 @@ class _ListEditPageState extends State { setState(() => _loading = true); // FIXME: is there a way we can update the list without creating a new list object? // aka updating the existing list we got from context (setters?) - TaskList updatedList = TaskList( - id: widget.list.id, title: _title, description: _description); + TaskList updatedList = + TaskList(id: widget.list.id, title: _title, description: _description); - VikunjaGlobal.of(context).listService.update(updatedList) - .then((_) { - setState(() => _loading = false); - Scaffold.of(context).showSnackBar(SnackBar( - content: Text('The list was updated successfully!'), - )); - }) - .catchError((err) { - setState(() => _loading = false); - Scaffold.of(context).showSnackBar( - SnackBar( - content: Text('Something went wrong: ' + err.toString()), - action: SnackBarAction( - label: 'CLOSE', onPressed: Scaffold.of(context).hideCurrentSnackBar), - ), - ); - }); + VikunjaGlobal.of(context).listService.update(updatedList).then((_) { + setState(() => _loading = false); + Scaffold.of(context).showSnackBar(SnackBar( + content: Text('The list was updated successfully!'), + )); + }).catchError((err) { + setState(() => _loading = false); + Scaffold.of(context).showSnackBar( + SnackBar( + content: Text('Something went wrong: ' + err.toString()), + action: SnackBarAction( + label: 'CLOSE', + onPressed: Scaffold.of(context).hideCurrentSnackBar), + ), + ); + }); } } diff --git a/lib/pages/list_page.dart b/lib/pages/list_page.dart index 1f63cd5..a99efb9 100644 --- a/lib/pages/list_page.dart +++ b/lib/pages/list_page.dart @@ -38,34 +38,34 @@ class _ListPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: new Text(_list.title), - actions: [ - IconButton( - icon: Icon(Icons.edit), - onPressed: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => ListEditPage( - list: _list, - )))) - ], - ), - body: !this._loading - ? RefreshIndicator( - child: ListView( - padding: EdgeInsets.symmetric(vertical: 8.0), - children: - ListTile.divideTiles(context: context, tiles: _listTasks()) - .toList(), - ), - onRefresh: _loadList, - ) - : Center(child: CircularProgressIndicator()), - floatingActionButton: Builder( - builder: (context) => FloatingActionButton( - onPressed: () => _addItemDialog(context), child: Icon(Icons.add)), - )); + appBar: AppBar( + title: new Text(_list.title), + actions: [ + IconButton( + icon: Icon(Icons.edit), + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ListEditPage( + list: _list, + )))) + ], + ), + body: !this._loading + ? RefreshIndicator( + child: ListView( + padding: EdgeInsets.symmetric(vertical: 8.0), + children: ListTile.divideTiles( + context: context, tiles: _listTasks()) + .toList(), + ), + onRefresh: _loadList, + ) + : Center(child: CircularProgressIndicator()), + floatingActionButton: Builder( + builder: (context) => FloatingActionButton( + onPressed: () => _addItemDialog(context), child: Icon(Icons.add)), + )); } List _listTasks() { diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index ab718b0..a7f119d 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -24,86 +24,83 @@ class _LoginPageState extends State { padding: const EdgeInsets.all(16.0), child: Builder( builder: (BuildContext context) => Form( - autovalidate: true, - key: _formKey, - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: EdgeInsets.symmetric(vertical: 30), - child: Image( - image: AssetImage('assets/vikunja_logo_full.png'), - height: 85.0, - semanticLabel: 'Vikunja Logo', - ), + autovalidate: true, + key: _formKey, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 30), + child: Image( + image: AssetImage('assets/vikunja_logo_full.png'), + height: 85.0, + semanticLabel: 'Vikunja Logo', + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + enabled: !_loading, + onSaved: (serverAddress) => _server = serverAddress, + validator: (address) { + return isUrl(address) ? null : 'Invalid URL'; + }, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Server Address'), + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + enabled: !_loading, + onSaved: (username) => _username = username, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Username'), + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + enabled: !_loading, + onSaved: (password) => _password = password, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Password'), + obscureText: true, + ), + ), + Builder( + builder: (context) => FancyButton( + onPressed: !_loading + ? () { + if (_formKey.currentState + .validate()) { + Form.of(context).save(); + _loginUser(context); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : VikunjaButtonText('Login'), + )), + Builder( + builder: (context) => FancyButton( + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + RegisterPage())), + child: VikunjaButtonText('Register'), + )), + ], ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - enabled: !_loading, - onSaved: (serverAddress) => - _server = serverAddress, - validator: (address) { - return isUrl(address) - ? null - : 'Invalid URL'; - }, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Server Address'), - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - enabled: !_loading, - onSaved: (username) => _username = username, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Username'), - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - enabled: !_loading, - onSaved: (password) => _password = password, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Password'), - obscureText: true, - ), - ), - Builder( - builder: (context) => FancyButton( - onPressed: !_loading - ? () { - if (_formKey.currentState - .validate()) { - Form.of(context).save(); - _loginUser(context); - } - } - : null, - child: _loading - ? CircularProgressIndicator() - : VikunjaButtonText('Login'), - )), - Builder( - builder: (context) => FancyButton( - onPressed: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - RegisterPage())), - child: VikunjaButtonText('Register'), - )), - ], + ), ), - ), - ), ), ), ), diff --git a/lib/pages/register_page.dart b/lib/pages/register_page.dart index 3e5c201..7d48285 100644 --- a/lib/pages/register_page.dart +++ b/lib/pages/register_page.dart @@ -137,7 +137,9 @@ class _RegisterPageState extends State { showDialog( context: context, builder: (context) => new AlertDialog( - title: Text('Registration failed! Please check your server url and credentials. ' + ex.toString()), + title: Text( + 'Registration failed! Please check your server url and credentials. ' + + ex.toString()), actions: [ FlatButton( onPressed: () => Navigator.pop(context), diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..8024014 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,232 @@ +# Generated by pub +# See https://www.dartlang.org/tools/pub/glossary#lockfile +packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.1" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.14.11" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2" + dart_config: + dependency: transitive + description: + path: "." + ref: HEAD + resolved-ref: a7ed88a4793e094a4d5d5c2d88a89e55510accde + url: "https://github.com/MarkOSullivan94/dart_config.git" + source: git + version: "0.5.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.1" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + http: + dependency: "direct main" + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.0" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.3" + image: + dependency: transitive + description: + name: image + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.7" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.3+1" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.2" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.3" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.8" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.1" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.1" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.15" +sdks: + dart: ">=2.0.0 <3.0.0" From 7bd35fda22aaf0d95868acc75d9e266a22fa993e Mon Sep 17 00:00:00 2001 From: konrad Date: Sat, 16 Mar 2019 13:29:00 +0000 Subject: [PATCH 40/99] Refactor (#31) --- lib/components/TaskTile.dart | 2 +- lib/global.dart | 1 - lib/main.dart | 4 ++-- lib/models/user.dart | 2 -- lib/pages/{home_page.dart => home.dart} | 18 ++++++++---------- lib/pages/{list_page.dart => list/list.dart} | 2 +- .../list_edit.dart} | 0 .../namespace}/namespace.dart | 13 +++++++------ lib/{fragments => pages}/placeholder.dart | 4 ++-- lib/pages/{login_page.dart => user/login.dart} | 2 +- .../{register_page.dart => user/register.dart} | 0 11 files changed, 22 insertions(+), 26 deletions(-) rename lib/pages/{home_page.dart => home.dart} (89%) rename lib/pages/{list_page.dart => list/list.dart} (98%) rename lib/pages/{list_edit_page.dart => list/list_edit.dart} (100%) rename lib/{fragments => pages/namespace}/namespace.dart (91%) rename lib/{fragments => pages}/placeholder.dart (82%) rename lib/pages/{login_page.dart => user/login.dart} (99%) rename lib/pages/{register_page.dart => user/register.dart} (100%) diff --git a/lib/components/TaskTile.dart b/lib/components/TaskTile.dart index 348e6e2..c49ea45 100644 --- a/lib/components/TaskTile.dart +++ b/lib/components/TaskTile.dart @@ -49,7 +49,7 @@ class TaskTileState extends State { trailing: IconButton( icon: Icon(Icons.settings), onPressed: () { - null; + null; // TODO: implement edit task }), ); } diff --git a/lib/global.dart b/lib/global.dart index 622ef19..818d4ac 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -7,7 +7,6 @@ import 'package:vikunja_app/api/task_implementation.dart'; import 'package:vikunja_app/api/user_implementation.dart'; import 'package:vikunja_app/managers/user.dart'; import 'package:vikunja_app/models/user.dart'; -import 'package:vikunja_app/service/mocked_services.dart'; import 'package:vikunja_app/service/services.dart'; class VikunjaGlobal extends StatefulWidget { diff --git a/lib/main.dart b/lib/main.dart index 81393ab..c60fe13 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:vikunja_app/global.dart'; -import 'package:vikunja_app/pages/home_page.dart'; -import 'package:vikunja_app/pages/login_page.dart'; +import 'package:vikunja_app/pages/home.dart'; +import 'package:vikunja_app/pages/user/login.dart'; import 'package:vikunja_app/theme/theme.dart'; void main() => runApp(VikunjaGlobal( diff --git a/lib/models/user.dart b/lib/models/user.dart index ce8fdeb..464d897 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -1,5 +1,3 @@ -import 'package:meta/meta.dart'; - class User { final int id; final String email, username; diff --git a/lib/pages/home_page.dart b/lib/pages/home.dart similarity index 89% rename from lib/pages/home_page.dart rename to lib/pages/home.dart index 55562bb..710d0c4 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home.dart @@ -3,12 +3,10 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/components/GravatarImage.dart'; -import 'package:vikunja_app/fragments/namespace.dart'; -import 'package:vikunja_app/fragments/placeholder.dart'; +import 'package:vikunja_app/pages/namespace/namespace.dart'; +import 'package:vikunja_app/pages/placeholder.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/models/namespace.dart'; -import 'package:vikunja_app/models/task.dart'; -import 'package:vikunja_app/models/user.dart'; class HomePage extends StatefulWidget { @override @@ -26,9 +24,9 @@ class HomePageState extends State { _getDrawerItemWidget(int pos) { if (pos == -1) { - return new PlaceholderFragment(); + return new PlaceholderPage(); } - return new NamespaceFragment(namespace: _namespaces[pos]); + return new NamespacePage(namespace: _namespaces[pos]); } _onSelectItem(int index) { @@ -51,14 +49,14 @@ class HomePageState extends State { .namespaceService .create(Namespace(id: null, name: name)) .then((_) { - _updateNamespaces(); + _loadNamespaces(); Scaffold.of(context).showSnackBar(SnackBar( content: Text('The namespace was created successfully!'), )); }); } - Future _updateNamespaces() { + Future _loadNamespaces() { return VikunjaGlobal.of(context).namespaceService.getAll().then((result) { setState(() { _loading = false; @@ -70,7 +68,7 @@ class HomePageState extends State { @override void didChangeDependencies() { super.didChangeDependencies(); - _updateNamespaces(); + _loadNamespaces(); } @override @@ -114,7 +112,7 @@ class HomePageState extends State { children: ListTile.divideTiles( context: context, tiles: drawerOptions) .toList()), - onRefresh: _updateNamespaces, + onRefresh: _loadNamespaces, )), new Align( alignment: FractionalOffset.bottomCenter, diff --git a/lib/pages/list_page.dart b/lib/pages/list/list.dart similarity index 98% rename from lib/pages/list_page.dart rename to lib/pages/list/list.dart index a99efb9..f0a3a4e 100644 --- a/lib/pages/list_page.dart +++ b/lib/pages/list/list.dart @@ -6,7 +6,7 @@ import 'package:vikunja_app/components/TaskTile.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/models/list.dart'; import 'package:vikunja_app/models/task.dart'; -import 'package:vikunja_app/pages/list_edit_page.dart'; +import 'package:vikunja_app/pages/list/list_edit.dart'; class ListPage extends StatefulWidget { final TaskList taskList; diff --git a/lib/pages/list_edit_page.dart b/lib/pages/list/list_edit.dart similarity index 100% rename from lib/pages/list_edit_page.dart rename to lib/pages/list/list_edit.dart diff --git a/lib/fragments/namespace.dart b/lib/pages/namespace/namespace.dart similarity index 91% rename from lib/fragments/namespace.dart rename to lib/pages/namespace/namespace.dart index 64817c7..b4a7d65 100644 --- a/lib/fragments/namespace.dart +++ b/lib/pages/namespace/namespace.dart @@ -6,22 +6,23 @@ import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/models/list.dart'; import 'package:vikunja_app/models/namespace.dart'; -import 'package:vikunja_app/pages/list_page.dart'; +import 'package:vikunja_app/pages/list/list.dart'; -class NamespaceFragment extends StatefulWidget { +class NamespacePage extends StatefulWidget { final Namespace namespace; - NamespaceFragment({this.namespace}) - : super(key: Key(namespace.id.toString())); + NamespacePage({this.namespace}) : super(key: Key(namespace.id.toString())); @override - _NamespaceFragmentState createState() => new _NamespaceFragmentState(); + _NamespacePageState createState() => new _NamespacePageState(); } -class _NamespaceFragmentState extends State { +class _NamespacePageState extends State { List _lists = []; bool _loading = true; + ///// + // This essentially shows the lists. @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/fragments/placeholder.dart b/lib/pages/placeholder.dart similarity index 82% rename from lib/fragments/placeholder.dart rename to lib/pages/placeholder.dart index d203541..2e9f0b6 100644 --- a/lib/fragments/placeholder.dart +++ b/lib/pages/placeholder.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -class PlaceholderFragment extends StatelessWidget { +class PlaceholderPage extends StatelessWidget { @override Widget build(BuildContext context) { return new Container( @@ -15,7 +15,7 @@ class PlaceholderFragment extends StatelessWidget { style: Theme.of(context).textTheme.headline, ), ), - new Text('Please select a namespace by clicking the ☰ icon.', + new Text('Please select a namespace by tapping the ☰ icon.', style: Theme.of(context).textTheme.subhead), ], )); diff --git a/lib/pages/login_page.dart b/lib/pages/user/login.dart similarity index 99% rename from lib/pages/login_page.dart rename to lib/pages/user/login.dart index a7f119d..411d92f 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/user/login.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:vikunja_app/global.dart'; -import 'package:vikunja_app/pages/register_page.dart'; +import 'package:vikunja_app/pages/user/register.dart'; import 'package:vikunja_app/theme/button.dart'; import 'package:vikunja_app/theme/buttonText.dart'; import 'package:vikunja_app/theme/constants.dart'; diff --git a/lib/pages/register_page.dart b/lib/pages/user/register.dart similarity index 100% rename from lib/pages/register_page.dart rename to lib/pages/user/register.dart From 496d97b2beecf3976ec701fc59ba319c5d81516d Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 18 Mar 2019 15:30:54 +0000 Subject: [PATCH 41/99] Fixed namespaces loading every time a widget was loaded (#34) --- lib/main.dart | 1 - lib/pages/home.dart | 93 +++++++++++++++--------------- lib/pages/namespace/namespace.dart | 24 ++++---- pubspec.lock | 7 +++ pubspec.yaml | 1 + 5 files changed, 68 insertions(+), 58 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index c60fe13..c7b2f6c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -12,7 +12,6 @@ class VikunjaApp extends StatelessWidget { final Widget home; const VikunjaApp({Key key, this.home}) : super(key: key); - // This widget is the root of your application. @override Widget build(BuildContext context) { return new MaterialApp( diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 710d0c4..652adb0 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:after_layout/after_layout.dart'; + import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/components/GravatarImage.dart'; import 'package:vikunja_app/pages/namespace/namespace.dart'; @@ -13,7 +15,7 @@ class HomePage extends StatefulWidget { State createState() => new HomePageState(); } -class HomePageState extends State { +class HomePageState extends State with AfterLayoutMixin { List _namespaces = []; Namespace get _currentNamespace => _selectedDrawerIndex >= 0 && _selectedDrawerIndex < _namespaces.length @@ -22,52 +24,8 @@ class HomePageState extends State { int _selectedDrawerIndex = -1; bool _loading = true; - _getDrawerItemWidget(int pos) { - if (pos == -1) { - return new PlaceholderPage(); - } - return new NamespacePage(namespace: _namespaces[pos]); - } - - _onSelectItem(int index) { - setState(() => _selectedDrawerIndex = index); - Navigator.of(context).pop(); - } - - _addNamespaceDialog(BuildContext context) { - showDialog( - context: context, - builder: (_) => AddDialog( - onAdd: (name) => _addNamespace(name, context), - decoration: new InputDecoration( - labelText: 'Namespace', hintText: 'eg. Personal Namespace'), - )); - } - - _addNamespace(String name, BuildContext context) { - VikunjaGlobal.of(context) - .namespaceService - .create(Namespace(id: null, name: name)) - .then((_) { - _loadNamespaces(); - Scaffold.of(context).showSnackBar(SnackBar( - content: Text('The namespace was created successfully!'), - )); - }); - } - - Future _loadNamespaces() { - return VikunjaGlobal.of(context).namespaceService.getAll().then((result) { - setState(() { - _loading = false; - _namespaces = result; - }); - }); - } - @override - void didChangeDependencies() { - super.didChangeDependencies(); + void afterFirstLayout(BuildContext context) { _loadNamespaces(); } @@ -128,4 +86,47 @@ class HomePageState extends State { body: _getDrawerItemWidget(_selectedDrawerIndex), ); } + + _getDrawerItemWidget(int pos) { + if (pos == -1) { + return new PlaceholderPage(); + } + return new NamespacePage(namespace: _namespaces[pos]); + } + + _onSelectItem(int index) { + setState(() => _selectedDrawerIndex = index); + Navigator.of(context).pop(); + } + + _addNamespaceDialog(BuildContext context) { + showDialog( + context: context, + builder: (_) => AddDialog( + onAdd: (name) => _addNamespace(name, context), + decoration: new InputDecoration( + labelText: 'Namespace', hintText: 'eg. Personal Namespace'), + )); + } + + _addNamespace(String name, BuildContext context) { + VikunjaGlobal.of(context) + .namespaceService + .create(Namespace(id: null, name: name)) + .then((_) { + _loadNamespaces(); + Scaffold.of(context).showSnackBar(SnackBar( + content: Text('The namespace was created successfully!'), + )); + }); + } + + Future _loadNamespaces() { + return VikunjaGlobal.of(context).namespaceService.getAll().then((result) { + setState(() { + _loading = false; + _namespaces = result; + }); + }); + } } diff --git a/lib/pages/namespace/namespace.dart b/lib/pages/namespace/namespace.dart index b4a7d65..85b6f36 100644 --- a/lib/pages/namespace/namespace.dart +++ b/lib/pages/namespace/namespace.dart @@ -2,6 +2,8 @@ import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:after_layout/after_layout.dart'; + import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/models/list.dart'; @@ -17,10 +19,16 @@ class NamespacePage extends StatefulWidget { _NamespacePageState createState() => new _NamespacePageState(); } -class _NamespacePageState extends State { +class _NamespacePageState extends State + with AfterLayoutMixin { List _lists = []; bool _loading = true; + @override + void afterFirstLayout(BuildContext context) { + _loadLists(); + } + ///// // This essentially shows the lists. @override @@ -53,7 +61,7 @@ class _NamespacePageState extends State { }, ))).toList(), ), - onRefresh: _updateLists, + onRefresh: _loadLists, ) : Center(child: CircularProgressIndicator()), floatingActionButton: Builder( @@ -63,20 +71,14 @@ class _NamespacePageState extends State { ); } - @override - void didChangeDependencies() { - super.didChangeDependencies(); - _updateLists(); - } - Future _removeList(TaskList list) { return VikunjaGlobal.of(context) .listService .delete(list.id) - .then((_) => _updateLists()); + .then((_) => _loadLists()); } - Future _updateLists() { + Future _loadLists() { return VikunjaGlobal.of(context) .listService .getByNamespace(widget.namespace.id) @@ -107,7 +109,7 @@ class _NamespacePageState extends State { .create(widget.namespace.id, TaskList(id: null, title: name, tasks: [])) .then((_) { setState(() {}); - _updateLists(); + _loadLists(); Scaffold.of(context).showSnackBar( SnackBar( content: Text('The list was successfully created!'), diff --git a/pubspec.lock b/pubspec.lock index 8024014..f0ea579 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://www.dartlang.org/tools/pub/glossary#lockfile packages: + after_layout: + dependency: "direct main" + description: + name: after_layout + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.7" archive: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ee58330..f5b5eb4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: cupertino_icons: ^0.1.2 flutter_secure_storage: 3.1.1 http: 0.12.0 + after_layout: ^1.0.7 dev_dependencies: flutter_test: From 5fff81250112cc5ce642fbb5ff06241db76d1289 Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 18 Mar 2019 16:56:15 +0000 Subject: [PATCH 42/99] Logout (#35) :C --- lib/global.dart | 19 +++++++++++++++ lib/pages/home.dart | 59 +++++++++++++++++++++++++++++++++------------ 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/lib/global.dart b/lib/global.dart index 818d4ac..061ae99 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -33,12 +33,17 @@ class VikunjaGlobalState extends State { bool _loading = true; User get currentUser => _currentUser; + Client get client => _client; UserManager get userManager => new UserManager(_storage); + UserService newUserService(base) => new UserAPIService(Client(null, base)); + NamespaceService get namespaceService => new NamespaceAPIService(client); + TaskService get taskService => new TaskAPIService(client); + ListService get listService => new ListAPIService(client); @override @@ -72,6 +77,20 @@ class VikunjaGlobalState extends State { }); } + void logoutUser(BuildContext context) { + _storage.deleteAll().then((_) { + Navigator.pop(context); + setState(() { + _client = null; + _currentUser = null; + }); + }).catchError((err) { + Scaffold.of(context).showSnackBar(SnackBar( + content: Text('An error occured while logging out!'), + )); + }); + } + void _loadCurrentUser() async { var currentUser = await _storage.read(key: 'currentUser'); if (currentUser == null) { diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 652adb0..a8be62b 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -17,31 +17,59 @@ class HomePage extends StatefulWidget { class HomePageState extends State with AfterLayoutMixin { List _namespaces = []; + Namespace get _currentNamespace => _selectedDrawerIndex >= 0 && _selectedDrawerIndex < _namespaces.length ? _namespaces[_selectedDrawerIndex] : null; int _selectedDrawerIndex = -1; bool _loading = true; + bool _showUserDetails = false; @override void afterFirstLayout(BuildContext context) { _loadNamespaces(); } - @override - Widget build(BuildContext context) { - var currentUser = VikunjaGlobal.of(context).currentUser; - List drawerOptions = []; + Widget _namespacesWidget() { + List namespacesList = []; _namespaces .asMap() - .forEach((i, namespace) => drawerOptions.add(new ListTile( + .forEach((i, namespace) => namespacesList.add(new ListTile( leading: const Icon(Icons.folder), title: new Text(namespace.name), selected: i == _selectedDrawerIndex, onTap: () => _onSelectItem(i), ))); + return this._loading + ? Center(child: CircularProgressIndicator()) + : RefreshIndicator( + child: ListView( + padding: EdgeInsets.zero, + children: ListTile.divideTiles( + context: context, tiles: namespacesList) + .toList()), + onRefresh: _loadNamespaces, + ); + } + + Widget _userDetailsWidget(BuildContext context) { + return ListView(padding: EdgeInsets.zero, children: [ + ListTile( + title: Text('Logout'), + leading: Icon(Icons.exit_to_app), + onTap: () { + VikunjaGlobal.of(context).logoutUser(context); + }, + ), + ]); + } + + @override + Widget build(BuildContext context) { + var currentUser = VikunjaGlobal.of(context).currentUser; + return new Scaffold( appBar: AppBar(title: new Text(_currentNamespace?.name ?? 'Vikunja')), drawer: new Drawer( @@ -49,6 +77,11 @@ class HomePageState extends State with AfterLayoutMixin { new UserAccountsDrawerHeader( accountEmail: currentUser == null ? null : Text(currentUser.email), accountName: currentUser == null ? null : Text(currentUser.username), + onDetailsPressed: () { + setState(() { + _showUserDetails = !_showUserDetails; + }); + }, currentAccountPicture: currentUser == null ? null : CircleAvatar( @@ -61,17 +94,11 @@ class HomePageState extends State with AfterLayoutMixin { Theme.of(context).primaryColor, BlendMode.multiply)), ), ), - new Expanded( - child: this._loading - ? Center(child: CircularProgressIndicator()) - : RefreshIndicator( - child: ListView( - padding: EdgeInsets.zero, - children: ListTile.divideTiles( - context: context, tiles: drawerOptions) - .toList()), - onRefresh: _loadNamespaces, - )), + new Builder( + builder: (BuildContext context) => Expanded( + child: _showUserDetails + ? _userDetailsWidget(context) + : _namespacesWidget())), new Align( alignment: FractionalOffset.bottomCenter, child: Builder( From 614b5565e16ec0e48455b25e0d29d59262ee1589 Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 18 Mar 2019 17:00:34 +0000 Subject: [PATCH 43/99] Namespace edit (#36) --- lib/pages/home.dart | 17 +++- lib/pages/namespace/namespace_edit.dart | 125 ++++++++++++++++++++++++ 2 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 lib/pages/namespace/namespace_edit.dart diff --git a/lib/pages/home.dart b/lib/pages/home.dart index a8be62b..54210cc 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -6,6 +6,7 @@ import 'package:after_layout/after_layout.dart'; import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/components/GravatarImage.dart'; import 'package:vikunja_app/pages/namespace/namespace.dart'; +import 'package:vikunja_app/pages/namespace/namespace_edit.dart'; import 'package:vikunja_app/pages/placeholder.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/models/namespace.dart'; @@ -71,7 +72,21 @@ class HomePageState extends State with AfterLayoutMixin { var currentUser = VikunjaGlobal.of(context).currentUser; return new Scaffold( - appBar: AppBar(title: new Text(_currentNamespace?.name ?? 'Vikunja')), + appBar: AppBar( + title: new Text(_currentNamespace?.name ?? 'Vikunja'), + actions: _currentNamespace == null + ? null + : [ + IconButton( + icon: Icon(Icons.edit), + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => NamespaceEditPage( + namespace: _currentNamespace, + )))) + ], + ), drawer: new Drawer( child: new Column(children: [ new UserAccountsDrawerHeader( diff --git a/lib/pages/namespace/namespace_edit.dart b/lib/pages/namespace/namespace_edit.dart new file mode 100644 index 0000000..d27cca1 --- /dev/null +++ b/lib/pages/namespace/namespace_edit.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; +import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/models/namespace.dart'; +import 'package:vikunja_app/theme/button.dart'; +import 'package:vikunja_app/theme/buttonText.dart'; + +class NamespaceEditPage extends StatefulWidget { + final Namespace namespace; + + NamespaceEditPage({this.namespace}) : super(key: Key(namespace.toString())); + + @override + State createState() => _NamespaceEditPageState(); +} + +class _NamespaceEditPageState extends State { + final _formKey = GlobalKey(); + bool _loading = false; + String _name, _description; + + @override + Widget build(BuildContext ctx) { + return Scaffold( + appBar: AppBar( + title: Text('Edit Namespace'), + ), + body: Builder( + builder: (BuildContext context) => SafeArea( + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.namespace.name, + onSaved: (name) => _name = name, + validator: (name) { + if (name.length < 3 || name.length > 250) { + return 'The name needs to have between 3 and 250 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Name', + border: OutlineInputBorder(), + ), + ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.namespace.description, + onSaved: (description) => _description = description, + validator: (description) { + if (description.length > 1000) { + return 'The description can have a maximum of 1000 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Description', + border: OutlineInputBorder(), + ), + ), + ), + Builder( + builder: (context) => Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: FancyButton( + onPressed: !_loading + ? () { + if (_formKey.currentState.validate()) { + Form.of(context).save(); + _saveNamespace(context); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : VikunjaButtonText('Save'), + ))), + ]), + ), + ), + ), + ); + } + + _saveNamespace(BuildContext context) async { + setState(() => _loading = true); + // FIXME: is there a way we can update the namespace without creating a new namespace object? + // aka updating the existing namespace we got from context (setters?) + Namespace updatedNamespace = Namespace( + id: widget.namespace.id, + name: _name, + description: _description, + owner: widget.namespace.owner); + + VikunjaGlobal.of(context) + .namespaceService + .update(updatedNamespace) + .then((_) { + setState(() => _loading = false); + Scaffold.of(context).showSnackBar(SnackBar( + content: Text('The namespace was updated successfully!'), + )); + }).catchError((err) { + setState(() => _loading = false); + Scaffold.of(context).showSnackBar( + SnackBar( + content: Text('Something went wrong: ' + err.toString()), + action: SnackBarAction( + label: 'CLOSE', + onPressed: Scaffold.of(context).hideCurrentSnackBar), + ), + ); + }); + } +} From 666f90345ea64d95e81b1f6ed08d0c39622553c3 Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 18 Mar 2019 17:05:32 +0000 Subject: [PATCH 44/99] Show a message if a list or namespace is empty (#29) --- lib/models/list.dart | 2 +- lib/pages/list/list.dart | 18 +++++---- lib/pages/namespace/namespace.dart | 60 +++++++++++++++++------------- pubspec.lock | 15 ++++++-- 4 files changed, 57 insertions(+), 38 deletions(-) diff --git a/lib/models/list.dart b/lib/models/list.dart index 38ef0af..cf9a5ad 100644 --- a/lib/models/list.dart +++ b/lib/models/list.dart @@ -25,7 +25,7 @@ class TaskList { title = json['title'], updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), created = DateTime.fromMillisecondsSinceEpoch(json['created']), - tasks = (json['tasks'] as List) + tasks = (json['tasks'] == null ? [] : json['tasks'] as List) ?.map((taskJson) => Task.fromJson(taskJson)) ?.toList(); diff --git a/lib/pages/list/list.dart b/lib/pages/list/list.dart index f0a3a4e..f963a2a 100644 --- a/lib/pages/list/list.dart +++ b/lib/pages/list/list.dart @@ -53,12 +53,14 @@ class _ListPageState extends State { ), body: !this._loading ? RefreshIndicator( - child: ListView( - padding: EdgeInsets.symmetric(vertical: 8.0), - children: ListTile.divideTiles( - context: context, tiles: _listTasks()) - .toList(), - ), + child: _list.tasks.length > 0 + ? ListView( + padding: EdgeInsets.symmetric(vertical: 8.0), + children: ListTile.divideTiles( + context: context, tiles: _listTasks()) + .toList(), + ) + : Center(child: Text('This list is empty.')), onRefresh: _loadList, ) : Center(child: CircularProgressIndicator()), @@ -89,10 +91,10 @@ class _ListPageState extends State { return VikunjaGlobal.of(context) .listService .get(widget.taskList.id) - .then((tasks) { + .then((list) { setState(() { _loading = false; - _list = tasks; + _list = list; }); }); } diff --git a/lib/pages/namespace/namespace.dart b/lib/pages/namespace/namespace.dart index 85b6f36..07f6f87 100644 --- a/lib/pages/namespace/namespace.dart +++ b/lib/pages/namespace/namespace.dart @@ -36,31 +36,35 @@ class _NamespacePageState extends State return Scaffold( body: !this._loading ? RefreshIndicator( - child: new ListView( - padding: EdgeInsets.symmetric(vertical: 8.0), - children: ListTile.divideTiles( - context: context, - tiles: _lists.map((ls) => Dismissible( - key: Key(ls.id.toString()), - direction: DismissDirection.startToEnd, - child: ListTile( - title: new Text(ls.title), - onTap: () => _openList(context, ls), - trailing: Icon(Icons.arrow_right), - ), - background: Container( - color: Colors.red, - child: const ListTile( - leading: Icon(Icons.delete, - color: Colors.white, size: 36.0)), - ), - onDismissed: (direction) { - _removeList(ls).then((_) => Scaffold.of(context) - .showSnackBar(SnackBar( - content: Text("${ls.title} removed")))); - }, - ))).toList(), - ), + child: _lists.length > 0 + ? new ListView( + padding: EdgeInsets.symmetric(vertical: 8.0), + children: ListTile.divideTiles( + context: context, + tiles: _lists.map((ls) => Dismissible( + key: Key(ls.id.toString()), + direction: DismissDirection.startToEnd, + child: ListTile( + title: new Text(ls.title), + onTap: () => _openList(context, ls), + trailing: Icon(Icons.arrow_right), + ), + background: Container( + color: Colors.red, + child: const ListTile( + leading: Icon(Icons.delete, + color: Colors.white, size: 36.0)), + ), + onDismissed: (direction) { + _removeList(ls).then((_) => Scaffold.of( + context) + .showSnackBar(SnackBar( + content: + Text("${ls.title} removed")))); + }, + ))).toList(), + ) + : Center(child: Text('This namespace is empty.')), onRefresh: _loadLists, ) : Center(child: CircularProgressIndicator()), @@ -71,6 +75,12 @@ class _NamespacePageState extends State ); } + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _loadLists(); + } + Future _removeList(TaskList list) { return VikunjaGlobal.of(context) .listService diff --git a/pubspec.lock b/pubspec.lock index f0ea579..3e86bc3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -146,6 +146,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.6.2" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" petitparser: dependency: transitive description: @@ -171,7 +178,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.4.1" + version: "1.5.4" stack_trace: dependency: transitive description: @@ -199,14 +206,14 @@ packages: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.1.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.1" + version: "0.2.2" typed_data: dependency: transitive description: @@ -236,4 +243,4 @@ packages: source: hosted version: "2.1.15" sdks: - dart: ">=2.0.0 <3.0.0" + dart: ">=2.1.0 <3.0.0" From d1eb3fbc37831917942eb444e959f376cd1fdc46 Mon Sep 17 00:00:00 2001 From: konrad Date: Thu, 25 Apr 2019 19:35:52 +0200 Subject: [PATCH 45/99] Updated dockerimage to use the vikunja one for building apps --- .drone.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.drone.yml b/.drone.yml index caa2d57..b42ef20 100644 --- a/.drone.yml +++ b/.drone.yml @@ -9,19 +9,17 @@ clone: steps: - name: build - image: adamantium/flutter + image: vikunja/flutter-build pull: true commands: - - apt-get update && apt-get install make # We do this here to not have to deal with updating the image itself - flutter packages get - make format-check - make build-debug - name: test - image: adamantium/flutter + image: vikunja/flutter-build pull: true commands: - - apt-get update && apt-get install make # We do this here to not have to deal with updating the image itself - flutter packages get - make test @@ -47,10 +45,9 @@ clone: steps: # Because drone separates the pipelines, we have to add the build step to this pipeline. This is double code, we should change it at some point if possible. - name: build - image: adamantium/flutter + image: vikunja/flutter-build pull: true commands: - - apt-get update && apt-get install make # We do this here to not have to deal with updating the image itself - flutter packages get - make build-all - mkdir apks @@ -92,10 +89,9 @@ clone: steps: # Because drone separates the pipelines, we have to add the build step to this pipeline. This is double code, we should change it at some point if possible. - name: build - image: adamantium/flutter + image: vikunja/flutter-build pull: true commands: - - apt-get update && apt-get install make # We do this here to not have to deal with updating the image itself - flutter packages get - make build-all - mkdir apks From edbadd9913942d60182f6fd9d53dc6965342dbe4 Mon Sep 17 00:00:00 2001 From: konrad Date: Sun, 12 Jan 2020 12:59:28 +0000 Subject: [PATCH 46/99] Make it build again (#38) Fix parsing of user model if email is not present Use user avatar hash instead of calculating it from the email Format Replace GravatarImageProvider Set min sdk version to 19 Change target api version to 28 Limit drone pipeline execution to master or pr Remove drone debug Use username instead of id Format "Fix" clone permissions Drone debug Fix drone permissions with different flutter build docker image Switch CI build image Bump Gradle sdk version Fix formatting Update packages for support for androidX Update gitignore AndroidX Make GravatarImageProvider work again Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/app/pulls/38 --- .drone.yml | 47 ++++-- .gitignore | 1 + android/app/build.gradle | 8 +- android/build.gradle | 2 - android/gradle.properties | 3 + android/settings_aar.gradle | 1 + ios/Flutter/flutter_export_environment.sh | 10 ++ lib/components/GravatarImage.dart | 9 - lib/global.dart | 4 +- lib/models/user.dart | 13 +- lib/pages/home.dart | 18 +- lib/pages/list/list_edit.dart | 120 +++++++------- lib/pages/namespace/namespace_edit.dart | 120 +++++++------- lib/pages/user/login.dart | 148 ++++++++--------- lib/pages/user/register.dart | 193 +++++++++++----------- lib/service/mocked_services.dart | 2 +- pubspec.lock | 48 +++--- pubspec.yaml | 11 +- 18 files changed, 387 insertions(+), 371 deletions(-) create mode 100644 android/settings_aar.gradle create mode 100755 ios/Flutter/flutter_export_environment.sh delete mode 100644 lib/components/GravatarImage.dart diff --git a/.drone.yml b/.drone.yml index b42ef20..9422ffe 100644 --- a/.drone.yml +++ b/.drone.yml @@ -2,16 +2,27 @@ kind: pipeline name: testing workspace: - base: /app + base: /home/cirrus/app clone: depth: 50 +# Only run on prs or pushes to master +trigger: + branch: + include: + - master + event: + include: + - push + - pull_request + steps: - name: build - image: vikunja/flutter-build + image: cirrusci/flutter:stable pull: true commands: + - sudo chown cirrus . -R # The clone step clones everything as root, this is our "fix" until we find a better solution - flutter packages get - make format-check - make build-debug @@ -32,12 +43,12 @@ depends_on: trigger: branch: - - master + - master event: - - push + - push workspace: - base: /app + base: /home/cirrus/app clone: depth: 50 @@ -45,13 +56,14 @@ clone: steps: # Because drone separates the pipelines, we have to add the build step to this pipeline. This is double code, we should change it at some point if possible. - name: build - image: vikunja/flutter-build + image: cirrusci/flutter:stable pull: true commands: - - flutter packages get - - make build-all - - mkdir apks - - mv build/app/outputs/apk/*/*/*.apk apks + - sudo chown cirrus . -R # The clone step clones everything as root, this is our "fix" until we find a better solution + - flutter packages get + - make build-all + - mkdir apks + - mv build/app/outputs/apk/*/*/*.apk apks # Push the releases to our pseudo-s3-bucket - name: release @@ -78,10 +90,10 @@ depends_on: trigger: event: - - tag + - tag workspace: - base: /app + base: /home/cirrus/app clone: depth: 50 @@ -89,13 +101,14 @@ clone: steps: # Because drone separates the pipelines, we have to add the build step to this pipeline. This is double code, we should change it at some point if possible. - name: build - image: vikunja/flutter-build + image: cirrusci/flutter:stable pull: true commands: - - flutter packages get - - make build-all - - mkdir apks - - mv build/app/outputs/apk/*/*/*.apk apks + - sudo chown cirrus . -R # The clone step clones everything as root, this is our "fix" until we find a better solution + - flutter packages get + - make build-all + - mkdir apks + - mv build/app/outputs/apk/*/*/*.apk apks # Push the releases to our pseudo-s3-bucket - name: release image: plugins/s3:1 diff --git a/.gitignore b/.gitignore index 816ad73..b0658dd 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ .pub/ build/ !pubspec.lock +.flutter-plugins-dependencies # Android related **/android/**/gradle-wrapper.jar diff --git a/android/app/build.gradle b/android/app/build.gradle index f8df111..9e084af 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 27 + compileSdkVersion 28 sourceSets { main.java.srcDirs += 'src/main/kotlin' @@ -37,14 +37,12 @@ android { } defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "io.vikunja.app" - minSdkVersion 18 - targetSdkVersion 27 + minSdkVersion 19 + targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } flavorDimensions "deploy" diff --git a/android/build.gradle b/android/build.gradle index 830798d..cfc1d0e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -21,8 +21,6 @@ allprojects { rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { project.evaluationDependsOn(':app') } diff --git a/android/gradle.properties b/android/gradle.properties index 8bd86f6..38c8d45 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1 +1,4 @@ org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/settings_aar.gradle b/android/settings_aar.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/android/settings_aar.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 0000000..ba8483e --- /dev/null +++ b/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/nix/store/nyvp7jf7sfxsbc6jsm1y4fc18631ap26-flutter-stable-1.12.13+hotfix.5-unwrapped" +export "FLUTTER_APPLICATION_PATH=/home/konrad/www/vikunja/app2" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "SYMROOT=${SOURCE_ROOT}/../build/ios" +export "FLUTTER_FRAMEWORK_DIR=/home/konrad/.cache/flutter/artifacts/engine/ios" +export "FLUTTER_BUILD_NAME=0.1.0" +export "FLUTTER_BUILD_NUMBER=0.1.0" diff --git a/lib/components/GravatarImage.dart b/lib/components/GravatarImage.dart deleted file mode 100644 index a3f4efc..0000000 --- a/lib/components/GravatarImage.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:crypto/crypto.dart'; - -class GravatarImageProvider extends NetworkImage { - GravatarImageProvider(String email) - : super("https://secure.gravatar.com/avatar/" + - md5.convert(email.trim().toLowerCase().codeUnits).toString()); -} diff --git a/lib/global.dart b/lib/global.dart index 061ae99..0f8081a 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -120,9 +120,9 @@ class VikunjaGlobalState extends State { }); return; } - loadedCurrentUser = User(int.tryParse(currentUser), "", ""); + loadedCurrentUser = User(int.tryParse(currentUser), "", "", ""); } catch (otherExceptions) { - loadedCurrentUser = User(int.tryParse(currentUser), "", ""); + loadedCurrentUser = User(int.tryParse(currentUser), "", "", ""); } setState(() { _client = client; diff --git a/lib/models/user.dart b/lib/models/user.dart index 464d897..17f7639 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -1,14 +1,19 @@ class User { final int id; - final String email, username; + final String email, username, avatarHash; - User(this.id, this.email, this.username); + User(this.id, this.email, this.username, this.avatarHash); User.fromJson(Map json) : id = json['id'], - email = json['email'], - username = json['username']; + email = json.containsKey('email') ? json['email'] : '', + username = json['username'], + avatarHash = json['avatarUrl']; toJSON() => {"id": this.id, "email": this.email, "username": this.username}; + + String avatarUrl() { + return "https://secure.gravatar.com/avatar/" + this.avatarHash; + } } class UserTokenPair { diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 54210cc..e37c07e 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:after_layout/after_layout.dart'; import 'package:vikunja_app/components/AddDialog.dart'; -import 'package:vikunja_app/components/GravatarImage.dart'; import 'package:vikunja_app/pages/namespace/namespace.dart'; import 'package:vikunja_app/pages/namespace/namespace_edit.dart'; import 'package:vikunja_app/pages/placeholder.dart'; @@ -90,8 +89,10 @@ class HomePageState extends State with AfterLayoutMixin { drawer: new Drawer( child: new Column(children: [ new UserAccountsDrawerHeader( - accountEmail: currentUser == null ? null : Text(currentUser.email), - accountName: currentUser == null ? null : Text(currentUser.username), + accountEmail: + currentUser?.email == null ? null : Text(currentUser.email), + accountName: + currentUser?.username == null ? null : Text(currentUser.username), onDetailsPressed: () { setState(() { _showUserDetails = !_showUserDetails; @@ -100,7 +101,8 @@ class HomePageState extends State with AfterLayoutMixin { currentAccountPicture: currentUser == null ? null : CircleAvatar( - backgroundImage: GravatarImageProvider(currentUser.username)), + backgroundImage: NetworkImage(currentUser.avatarUrl()), + ), decoration: BoxDecoration( image: DecorationImage( image: AssetImage("assets/graphics/hypnotize.png"), @@ -118,10 +120,10 @@ class HomePageState extends State with AfterLayoutMixin { alignment: FractionalOffset.bottomCenter, child: Builder( builder: (context) => ListTile( - leading: const Icon(Icons.add), - title: const Text('Add namespace...'), - onTap: () => _addNamespaceDialog(context), - ), + leading: const Icon(Icons.add), + title: const Text('Add namespace...'), + onTap: () => _addNamespaceDialog(context), + ), ), ), ])), diff --git a/lib/pages/list/list_edit.dart b/lib/pages/list/list_edit.dart index 7b0682f..b151e96 100644 --- a/lib/pages/list/list_edit.dart +++ b/lib/pages/list/list_edit.dart @@ -26,68 +26,68 @@ class _ListEditPageState extends State { ), body: Builder( builder: (BuildContext context) => SafeArea( - child: Form( - key: _formKey, - child: ListView( - padding: const EdgeInsets.all(16.0), - children: [ - Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: TextFormField( - maxLines: null, - keyboardType: TextInputType.multiline, - initialValue: widget.list.title, - onSaved: (title) => _title = title, - validator: (title) { - if (title.length < 3 || title.length > 250) { - return 'The title needs to have between 3 and 250 characters.'; - } - return null; - }, - decoration: new InputDecoration( - labelText: 'Title', - border: OutlineInputBorder(), - ), - ), + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.list.title, + onSaved: (title) => _title = title, + validator: (title) { + if (title.length < 3 || title.length > 250) { + return 'The title needs to have between 3 and 250 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Title', + border: OutlineInputBorder(), ), - Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: TextFormField( - maxLines: null, - keyboardType: TextInputType.multiline, - initialValue: widget.list.description, - onSaved: (description) => _description = description, - validator: (description) { - if (description.length > 1000) { - return 'The description can have a maximum of 1000 characters.'; - } - return null; - }, - decoration: new InputDecoration( - labelText: 'Description', - border: OutlineInputBorder(), - ), - ), + ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.list.description, + onSaved: (description) => _description = description, + validator: (description) { + if (description.length > 1000) { + return 'The description can have a maximum of 1000 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Description', + border: OutlineInputBorder(), ), - Builder( - builder: (context) => Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: FancyButton( - onPressed: !_loading - ? () { - if (_formKey.currentState.validate()) { - Form.of(context).save(); - _saveList(context); - } - } - : null, - child: _loading - ? CircularProgressIndicator() - : VikunjaButtonText('Save'), - ))), - ]), - ), - ), + ), + ), + Builder( + builder: (context) => Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: FancyButton( + onPressed: !_loading + ? () { + if (_formKey.currentState.validate()) { + Form.of(context).save(); + _saveList(context); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : VikunjaButtonText('Save'), + ))), + ]), + ), + ), ), ); } diff --git a/lib/pages/namespace/namespace_edit.dart b/lib/pages/namespace/namespace_edit.dart index d27cca1..a9d21cd 100644 --- a/lib/pages/namespace/namespace_edit.dart +++ b/lib/pages/namespace/namespace_edit.dart @@ -26,68 +26,68 @@ class _NamespaceEditPageState extends State { ), body: Builder( builder: (BuildContext context) => SafeArea( - child: Form( - key: _formKey, - child: ListView( - padding: const EdgeInsets.all(16.0), - children: [ - Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: TextFormField( - maxLines: null, - keyboardType: TextInputType.multiline, - initialValue: widget.namespace.name, - onSaved: (name) => _name = name, - validator: (name) { - if (name.length < 3 || name.length > 250) { - return 'The name needs to have between 3 and 250 characters.'; - } - return null; - }, - decoration: new InputDecoration( - labelText: 'Name', - border: OutlineInputBorder(), - ), - ), + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.namespace.name, + onSaved: (name) => _name = name, + validator: (name) { + if (name.length < 3 || name.length > 250) { + return 'The name needs to have between 3 and 250 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Name', + border: OutlineInputBorder(), ), - Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: TextFormField( - maxLines: null, - keyboardType: TextInputType.multiline, - initialValue: widget.namespace.description, - onSaved: (description) => _description = description, - validator: (description) { - if (description.length > 1000) { - return 'The description can have a maximum of 1000 characters.'; - } - return null; - }, - decoration: new InputDecoration( - labelText: 'Description', - border: OutlineInputBorder(), - ), - ), + ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.namespace.description, + onSaved: (description) => _description = description, + validator: (description) { + if (description.length > 1000) { + return 'The description can have a maximum of 1000 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Description', + border: OutlineInputBorder(), ), - Builder( - builder: (context) => Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: FancyButton( - onPressed: !_loading - ? () { - if (_formKey.currentState.validate()) { - Form.of(context).save(); - _saveNamespace(context); - } - } - : null, - child: _loading - ? CircularProgressIndicator() - : VikunjaButtonText('Save'), - ))), - ]), - ), - ), + ), + ), + Builder( + builder: (context) => Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: FancyButton( + onPressed: !_loading + ? () { + if (_formKey.currentState.validate()) { + Form.of(context).save(); + _saveNamespace(context); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : VikunjaButtonText('Save'), + ))), + ]), + ), + ), ), ); } diff --git a/lib/pages/user/login.dart b/lib/pages/user/login.dart index 411d92f..aca7e76 100644 --- a/lib/pages/user/login.dart +++ b/lib/pages/user/login.dart @@ -24,83 +24,81 @@ class _LoginPageState extends State { padding: const EdgeInsets.all(16.0), child: Builder( builder: (BuildContext context) => Form( - autovalidate: true, - key: _formKey, - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: EdgeInsets.symmetric(vertical: 30), - child: Image( - image: AssetImage('assets/vikunja_logo_full.png'), - height: 85.0, - semanticLabel: 'Vikunja Logo', - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - enabled: !_loading, - onSaved: (serverAddress) => _server = serverAddress, - validator: (address) { - return isUrl(address) ? null : 'Invalid URL'; - }, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Server Address'), - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - enabled: !_loading, - onSaved: (username) => _username = username, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Username'), - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - enabled: !_loading, - onSaved: (password) => _password = password, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Password'), - obscureText: true, - ), - ), - Builder( - builder: (context) => FancyButton( - onPressed: !_loading - ? () { - if (_formKey.currentState - .validate()) { - Form.of(context).save(); - _loginUser(context); - } - } - : null, - child: _loading - ? CircularProgressIndicator() - : VikunjaButtonText('Login'), - )), - Builder( - builder: (context) => FancyButton( - onPressed: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - RegisterPage())), - child: VikunjaButtonText('Register'), - )), - ], + autovalidate: true, + key: _formKey, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 30), + child: Image( + image: AssetImage('assets/vikunja_logo_full.png'), + height: 85.0, + semanticLabel: 'Vikunja Logo', + ), ), - ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + enabled: !_loading, + onSaved: (serverAddress) => _server = serverAddress, + validator: (address) { + return isUrl(address) ? null : 'Invalid URL'; + }, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Server Address'), + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + enabled: !_loading, + onSaved: (username) => _username = username, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Username'), + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + enabled: !_loading, + onSaved: (password) => _password = password, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Password'), + obscureText: true, + ), + ), + Builder( + builder: (context) => FancyButton( + onPressed: !_loading + ? () { + if (_formKey.currentState.validate()) { + Form.of(context).save(); + _loginUser(context); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : VikunjaButtonText('Login'), + )), + Builder( + builder: (context) => FancyButton( + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => RegisterPage())), + child: VikunjaButtonText('Register'), + )), + ], ), + ), + ), ), ), ), diff --git a/lib/pages/user/register.dart b/lib/pages/user/register.dart index 7d48285..fb9c0a7 100644 --- a/lib/pages/user/register.dart +++ b/lib/pages/user/register.dart @@ -24,103 +24,102 @@ class _RegisterPageState extends State { ), body: Builder( builder: (BuildContext context) => SafeArea( - top: false, - bottom: false, - child: Form( - key: _formKey, - child: ListView( - padding: const EdgeInsets.all(16), - children: [ - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - onSaved: (serverAddress) => _server = serverAddress, - validator: (address) { - return isUrl(address) ? null : 'Invalid URL'; - }, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Server Address'), - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - onSaved: (username) => _username = username.trim(), - validator: (username) { - return username.trim().isNotEmpty - ? null - : 'Please specify a username'; - }, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Username'), - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - onSaved: (email) => _email = email, - validator: (email) { - return isEmail(email) - ? null - : 'Email adress is invalid'; - }, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Email Address'), - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - controller: passwordController, - onSaved: (password) => _password = password, - validator: (password) { - return password.length >= 8 - ? null - : 'Please use at least 8 characters'; - }, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Password'), - obscureText: true, - ), - ), - Padding( - padding: vStandardVerticalPadding, - child: TextFormField( - validator: (password) { - return passwordController.text == password - ? null - : 'Passwords don\'t match.'; - }, - decoration: new InputDecoration( - border: OutlineInputBorder(), - labelText: 'Repeat Password'), - obscureText: true, - ), - ), - Builder( - builder: (context) => FancyButton( - onPressed: !_loading - ? () { - if (_formKey.currentState - .validate()) { - Form.of(context).save(); - _registerUser(context); - } else { - print("awhat"); - } - } - : null, - child: _loading - ? CircularProgressIndicator() - : VikunjaButtonText('Register'), - )), - ], - )), - ), + top: false, + bottom: false, + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.all(16), + children: [ + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + onSaved: (serverAddress) => _server = serverAddress, + validator: (address) { + return isUrl(address) ? null : 'Invalid URL'; + }, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Server Address'), + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + onSaved: (username) => _username = username.trim(), + validator: (username) { + return username.trim().isNotEmpty + ? null + : 'Please specify a username'; + }, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Username'), + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + onSaved: (email) => _email = email, + validator: (email) { + return isEmail(email) + ? null + : 'Email adress is invalid'; + }, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Email Address'), + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + controller: passwordController, + onSaved: (password) => _password = password, + validator: (password) { + return password.length >= 8 + ? null + : 'Please use at least 8 characters'; + }, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Password'), + obscureText: true, + ), + ), + Padding( + padding: vStandardVerticalPadding, + child: TextFormField( + validator: (password) { + return passwordController.text == password + ? null + : 'Passwords don\'t match.'; + }, + decoration: new InputDecoration( + border: OutlineInputBorder(), + labelText: 'Repeat Password'), + obscureText: true, + ), + ), + Builder( + builder: (context) => FancyButton( + onPressed: !_loading + ? () { + if (_formKey.currentState.validate()) { + Form.of(context).save(); + _registerUser(context); + } else { + print("awhat"); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : VikunjaButtonText('Register'), + )), + ], + )), + ), )); } diff --git a/lib/service/mocked_services.dart b/lib/service/mocked_services.dart index 35d5fbb..98913e1 100644 --- a/lib/service/mocked_services.dart +++ b/lib/service/mocked_services.dart @@ -7,7 +7,7 @@ import 'package:vikunja_app/models/user.dart'; import 'package:vikunja_app/service/services.dart'; // Data for mocked services -var _users = {1: User(1, 'test@testuser.org', 'test1')}; +var _users = {1: User(1, 'test@testuser.org', 'test1', '')}; var _namespaces = { 1: Namespace( diff --git a/pubspec.lock b/pubspec.lock index 3e86bc3..a781b71 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,5 +1,5 @@ # Generated by pub -# See https://www.dartlang.org/tools/pub/glossary#lockfile +# See https://dart.dev/tools/pub/glossary#lockfile packages: after_layout: dependency: "direct main" @@ -7,35 +7,35 @@ packages: name: after_layout url: "https://pub.dartlang.org" source: hosted - version: "1.0.7" + version: "1.0.7+2" archive: dependency: transitive description: name: archive url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.0.11" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.5.1" + version: "1.5.2" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.4.0" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "1.0.5" charcode: dependency: transitive description: @@ -63,14 +63,14 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.0.6" + version: "2.1.3" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "0.1.2" + version: "0.1.3" dart_config: dependency: transitive description: @@ -98,7 +98,7 @@ packages: name: flutter_secure_storage url: "https://pub.dartlang.org" source: hosted - version: "3.1.1" + version: "3.3.1+1" flutter_test: dependency: "direct dev" description: flutter @@ -110,7 +110,7 @@ packages: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.12.0" + version: "0.12.0+3" http_parser: dependency: transitive description: @@ -124,49 +124,49 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "2.0.7" + version: "2.1.4" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.3+1" + version: "0.12.6" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.1.8" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.6.2" + version: "1.6.4" pedantic: dependency: transitive description: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.4.0" + version: "1.8.0+1" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.4.0" quiver: dependency: transitive description: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.5" sky_engine: dependency: transitive description: flutter @@ -178,7 +178,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.4" + version: "1.5.5" stack_trace: dependency: transitive description: @@ -192,14 +192,14 @@ packages: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "1.6.8" + version: "2.0.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "1.0.5" term_glyph: dependency: transitive description: @@ -213,7 +213,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.2" + version: "0.2.11" typed_data: dependency: transitive description: @@ -234,13 +234,13 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "3.3.1" + version: "3.5.0" yaml: dependency: transitive description: name: yaml url: "https://pub.dartlang.org" source: hosted - version: "2.1.15" + version: "2.2.0" sdks: - dart: ">=2.1.0 <3.0.0" + dart: ">=2.4.0 <3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index f5b5eb4..067ec71 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,17 +4,14 @@ description: Vikunja as Flutter cross platform app version: 0.1.0 environment: - sdk: ">=2.0.0-dev.63.0 <3.0.0" + sdk: ">=2.1.0 <3.0.0" dependencies: flutter: sdk: flutter - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^0.1.2 - flutter_secure_storage: 3.1.1 - http: 0.12.0 + cupertino_icons: ^0.1.3 + flutter_secure_storage: 3.3.1+1 + http: 0.12.0+3 after_layout: ^1.0.7 dev_dependencies: From 6974befb6ebc43f0bf3379765d4ce8b2cb258d26 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 15 Jan 2020 23:38:02 +0100 Subject: [PATCH 47/99] Use the same image for building and testing in ci --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 9422ffe..b3722d7 100644 --- a/.drone.yml +++ b/.drone.yml @@ -28,7 +28,7 @@ steps: - make build-debug - name: test - image: vikunja/flutter-build + image: cirrusci/flutter:stable pull: true commands: - flutter packages get From 236cf4e186b5d2a65bb1a2ca82c3eecd21712d61 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 1 Mar 2020 22:56:05 +0100 Subject: [PATCH 48/99] Change release bucket --- .drone.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.drone.yml b/.drone.yml index b3722d7..55aefb3 100644 --- a/.drone.yml +++ b/.drone.yml @@ -70,7 +70,7 @@ steps: image: plugins/s3:1 pull: true settings: - bucket: vikunja-app + bucket: vikunja access_key: from_secret: aws_access_key_id secret_key: @@ -79,7 +79,7 @@ steps: path_style: true strip_prefix: apks/ source: apks/* - target: /master + target: /app/master --- kind: pipeline @@ -114,7 +114,7 @@ steps: image: plugins/s3:1 pull: true settings: - bucket: vikunja-app + bucket: vikunja access_key: from_secret: aws_access_key_id secret_key: @@ -123,4 +123,4 @@ steps: path_style: true strip_prefix: apks/ source: apks/* - target: /${DRONE_TAG##v} + target: /app/${DRONE_TAG##v} From f973d3940f9d6eeeae2f9e8c00d0c98b66b2adc2 Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 27 Apr 2020 17:02:55 +0200 Subject: [PATCH 49/99] Fix date format --- lib/global.dart | 4 ++-- lib/models/list.dart | 8 ++++---- lib/models/namespace.dart | 8 ++++---- lib/models/task.dart | 16 ++++++++-------- lib/models/user.dart | 14 ++++++++------ lib/pages/home.dart | 2 +- lib/service/mocked_services.dart | 2 +- 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/lib/global.dart b/lib/global.dart index 0f8081a..061ae99 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -120,9 +120,9 @@ class VikunjaGlobalState extends State { }); return; } - loadedCurrentUser = User(int.tryParse(currentUser), "", "", ""); + loadedCurrentUser = User(int.tryParse(currentUser), "", ""); } catch (otherExceptions) { - loadedCurrentUser = User(int.tryParse(currentUser), "", "", ""); + loadedCurrentUser = User(int.tryParse(currentUser), "", ""); } setState(() { _client = client; diff --git a/lib/models/list.dart b/lib/models/list.dart index cf9a5ad..4578c4d 100644 --- a/lib/models/list.dart +++ b/lib/models/list.dart @@ -23,8 +23,8 @@ class TaskList { owner = User.fromJson(json['owner']), description = json['description'], title = json['title'], - updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), - created = DateTime.fromMillisecondsSinceEpoch(json['created']), + updated = DateTime.parse(json['updated']), + created = DateTime.parse(json['created']), tasks = (json['tasks'] == null ? [] : json['tasks'] as List) ?.map((taskJson) => Task.fromJson(taskJson)) ?.toList(); @@ -35,8 +35,8 @@ class TaskList { "title": this.title, "description": this.description, "owner": this.owner?.toJSON(), - "created": this.created?.millisecondsSinceEpoch, - "updated": this.updated?.millisecondsSinceEpoch, + "created": this.created?.toIso8601String(), + "updated": this.updated?.toIso8601String(), }; } } diff --git a/lib/models/namespace.dart b/lib/models/namespace.dart index 700d2d7..f271914 100644 --- a/lib/models/namespace.dart +++ b/lib/models/namespace.dart @@ -19,13 +19,13 @@ class Namespace { : name = json['name'], description = json['description'], id = json['id'], - created = DateTime.fromMillisecondsSinceEpoch(json['created']), - updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), + created = DateTime.parse(json['created']), + updated = DateTime.parse(json['updated']), owner = User.fromJson(json['owner']); toJSON() => { - "created": created?.millisecondsSinceEpoch, - "updated": updated?.millisecondsSinceEpoch, + "created": created?.toIso8601String(), + "updated": updated?.toIso8601String(), "name": name, "owner": owner?.toJSON(), "description": description diff --git a/lib/models/task.dart b/lib/models/task.dart index 897f63e..0a83f7a 100644 --- a/lib/models/task.dart +++ b/lib/models/task.dart @@ -22,12 +22,12 @@ class Task { Task.fromJson(Map json) : id = json['id'], - updated = DateTime.fromMillisecondsSinceEpoch(json['updated']), - created = DateTime.fromMillisecondsSinceEpoch(json['created']), + updated = DateTime.parse(json['updated']), + created = DateTime.parse(json['created']), reminders = (json['reminderDates'] as List) - ?.map((milli) => DateTime.fromMillisecondsSinceEpoch(milli)) + ?.map((r) => DateTime.parse(r)) ?.toList(), - due = DateTime.fromMillisecondsSinceEpoch(json['dueDate']), + due = DateTime.parse(json['dueDate']), description = json['description'], text = json['text'], done = json['done'], @@ -35,11 +35,11 @@ class Task { toJSON() => { 'id': id, - 'updated': updated?.millisecondsSinceEpoch, - 'created': created?.millisecondsSinceEpoch, + 'updated': updated?.toIso8601String(), + 'created': created?.toIso8601String(), 'reminderDates': - reminders?.map((date) => date.millisecondsSinceEpoch)?.toList(), - 'dueDate': due?.millisecondsSinceEpoch, + reminders?.map((date) => date.toIso8601String())?.toList(), + 'dueDate': due?.toIso8601String(), 'description': description, 'text': text, 'done': done ?? false, diff --git a/lib/models/user.dart b/lib/models/user.dart index 17f7639..08b0280 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -1,18 +1,20 @@ +import 'package:flutter/cupertino.dart'; +import 'package:vikunja_app/global.dart'; + class User { final int id; - final String email, username, avatarHash; + final String email, username; - User(this.id, this.email, this.username, this.avatarHash); + User(this.id, this.email, this.username); User.fromJson(Map json) : id = json['id'], email = json.containsKey('email') ? json['email'] : '', - username = json['username'], - avatarHash = json['avatarUrl']; + username = json['username']; toJSON() => {"id": this.id, "email": this.email, "username": this.username}; - String avatarUrl() { - return "https://secure.gravatar.com/avatar/" + this.avatarHash; + String avatarUrl(BuildContext context) { + return VikunjaGlobal.of(context).client.base + "/" + this.username + "/avatar"; } } diff --git a/lib/pages/home.dart b/lib/pages/home.dart index e37c07e..089cf07 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -101,7 +101,7 @@ class HomePageState extends State with AfterLayoutMixin { currentAccountPicture: currentUser == null ? null : CircleAvatar( - backgroundImage: NetworkImage(currentUser.avatarUrl()), + backgroundImage: NetworkImage(currentUser.avatarUrl(context)), ), decoration: BoxDecoration( image: DecorationImage( diff --git a/lib/service/mocked_services.dart b/lib/service/mocked_services.dart index 98913e1..35d5fbb 100644 --- a/lib/service/mocked_services.dart +++ b/lib/service/mocked_services.dart @@ -7,7 +7,7 @@ import 'package:vikunja_app/models/user.dart'; import 'package:vikunja_app/service/services.dart'; // Data for mocked services -var _users = {1: User(1, 'test@testuser.org', 'test1', '')}; +var _users = {1: User(1, 'test@testuser.org', 'test1')}; var _namespaces = { 1: Namespace( From df003106c8fc42f7c79921d7f3bac086d3dc934c Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 27 Apr 2020 17:09:33 +0200 Subject: [PATCH 50/99] Format --- lib/models/user.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/models/user.dart b/lib/models/user.dart index 08b0280..56e21fa 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -14,7 +14,10 @@ class User { toJSON() => {"id": this.id, "email": this.email, "username": this.username}; String avatarUrl(BuildContext context) { - return VikunjaGlobal.of(context).client.base + "/" + this.username + "/avatar"; + return VikunjaGlobal.of(context).client.base + + "/" + + this.username + + "/avatar"; } } From 67945366eb17b952d8a76f7b8e9ce82bec1d32cc Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 15 Jun 2020 23:42:12 +0200 Subject: [PATCH 51/99] Rename namespace name and task text to title --- lib/components/TaskTile.dart | 6 +++--- lib/models/namespace.dart | 8 ++++---- lib/models/task.dart | 8 ++++---- lib/pages/home.dart | 6 +++--- lib/pages/list/list.dart | 2 +- lib/pages/namespace/namespace_edit.dart | 4 ++-- lib/service/mocked_services.dart | 4 ++-- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/components/TaskTile.dart b/lib/components/TaskTile.dart index c49ea45..3d307d5 100644 --- a/lib/components/TaskTile.dart +++ b/lib/components/TaskTile.dart @@ -41,7 +41,7 @@ class TaskTileState extends State { strokeWidth: 2.0, )), ), - title: Text(_currentTask.text), + title: Text(_currentTask.title), subtitle: _currentTask.description == null || _currentTask.description.isEmpty ? null @@ -54,7 +54,7 @@ class TaskTileState extends State { ); } return CheckboxListTile( - title: Text(_currentTask.text), + title: Text(_currentTask.title), controlAffinity: ListTileControlAffinity.leading, value: _currentTask.done ?? false, subtitle: @@ -83,7 +83,7 @@ class TaskTileState extends State { return VikunjaGlobal.of(context).taskService.update(Task( id: task.id, done: checked, - text: task.text, + title: task.title, description: task.description, owner: null, )); diff --git a/lib/models/namespace.dart b/lib/models/namespace.dart index f271914..e851761 100644 --- a/lib/models/namespace.dart +++ b/lib/models/namespace.dart @@ -4,19 +4,19 @@ import 'package:meta/meta.dart'; class Namespace { final int id; final DateTime created, updated; - final String name, description; + final String title, description; final User owner; Namespace( {@required this.id, this.created, this.updated, - @required this.name, + @required this.title, this.description, this.owner}); Namespace.fromJson(Map json) - : name = json['name'], + : title = json['title'], description = json['description'], id = json['id'], created = DateTime.parse(json['created']), @@ -26,7 +26,7 @@ class Namespace { toJSON() => { "created": created?.toIso8601String(), "updated": updated?.toIso8601String(), - "name": name, + "title": title, "owner": owner?.toJSON(), "description": description }; diff --git a/lib/models/task.dart b/lib/models/task.dart index 0a83f7a..7f4d800 100644 --- a/lib/models/task.dart +++ b/lib/models/task.dart @@ -5,7 +5,7 @@ class Task { final int id; final DateTime created, updated, due; final List reminders; - final String text, description; + final String title, description; final bool done; final User owner; @@ -15,7 +15,7 @@ class Task { this.updated, this.reminders, this.due, - @required this.text, + @required this.title, this.description, @required this.done, @required this.owner}); @@ -29,7 +29,7 @@ class Task { ?.toList(), due = DateTime.parse(json['dueDate']), description = json['description'], - text = json['text'], + title = json['title'], done = json['done'], owner = User.fromJson(json['createdBy']); @@ -41,7 +41,7 @@ class Task { reminders?.map((date) => date.toIso8601String())?.toList(), 'dueDate': due?.toIso8601String(), 'description': description, - 'text': text, + 'title': title, 'done': done ?? false, 'createdBy': owner?.toJSON() }; diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 089cf07..eeeb4b3 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -37,7 +37,7 @@ class HomePageState extends State with AfterLayoutMixin { .asMap() .forEach((i, namespace) => namespacesList.add(new ListTile( leading: const Icon(Icons.folder), - title: new Text(namespace.name), + title: new Text(namespace.title), selected: i == _selectedDrawerIndex, onTap: () => _onSelectItem(i), ))); @@ -72,7 +72,7 @@ class HomePageState extends State with AfterLayoutMixin { return new Scaffold( appBar: AppBar( - title: new Text(_currentNamespace?.name ?? 'Vikunja'), + title: new Text(_currentNamespace?.title ?? 'Vikunja'), actions: _currentNamespace == null ? null : [ @@ -156,7 +156,7 @@ class HomePageState extends State with AfterLayoutMixin { _addNamespace(String name, BuildContext context) { VikunjaGlobal.of(context) .namespaceService - .create(Namespace(id: null, name: name)) + .create(Namespace(id: null, title: name)) .then((_) { _loadNamespaces(); Scaffold.of(context).showSnackBar(SnackBar( diff --git a/lib/pages/list/list.dart b/lib/pages/list/list.dart index f963a2a..d5640c2 100644 --- a/lib/pages/list/list.dart +++ b/lib/pages/list/list.dart @@ -111,7 +111,7 @@ class _ListPageState extends State { _addItem(String name, BuildContext context) { var globalState = VikunjaGlobal.of(context); var newTask = - Task(id: null, text: name, owner: globalState.currentUser, done: false); + Task(id: null, title: name, owner: globalState.currentUser, done: false); setState(() => _loadingTasks.add(newTask)); globalState.taskService.add(_list.id, newTask).then((task) { setState(() { diff --git a/lib/pages/namespace/namespace_edit.dart b/lib/pages/namespace/namespace_edit.dart index a9d21cd..b77abb8 100644 --- a/lib/pages/namespace/namespace_edit.dart +++ b/lib/pages/namespace/namespace_edit.dart @@ -36,7 +36,7 @@ class _NamespaceEditPageState extends State { child: TextFormField( maxLines: null, keyboardType: TextInputType.multiline, - initialValue: widget.namespace.name, + initialValue: widget.namespace.title, onSaved: (name) => _name = name, validator: (name) { if (name.length < 3 || name.length > 250) { @@ -98,7 +98,7 @@ class _NamespaceEditPageState extends State { // aka updating the existing namespace we got from context (setters?) Namespace updatedNamespace = Namespace( id: widget.namespace.id, - name: _name, + title: _name, description: _description, owner: widget.namespace.owner); diff --git a/lib/service/mocked_services.dart b/lib/service/mocked_services.dart index 35d5fbb..1980e31 100644 --- a/lib/service/mocked_services.dart +++ b/lib/service/mocked_services.dart @@ -12,7 +12,7 @@ var _users = {1: User(1, 'test@testuser.org', 'test1')}; var _namespaces = { 1: Namespace( id: 1, - name: 'Test 1', + title: 'Test 1', created: DateTime.now(), updated: DateTime.now(), description: 'A namespace for testing purposes', @@ -38,7 +38,7 @@ var _lists = { var _tasks = { 1: Task( id: 1, - text: 'Task 1', + title: 'Task 1', owner: _users[1], updated: DateTime.now(), created: DateTime.now(), From a0f5540b7b6f44cf64d8350ef3fe2d5e8e5b827f Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 15 Jun 2020 23:46:10 +0200 Subject: [PATCH 52/99] Fix all json fields being snake_case --- lib/models/task.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/models/task.dart b/lib/models/task.dart index 7f4d800..09af50d 100644 --- a/lib/models/task.dart +++ b/lib/models/task.dart @@ -24,25 +24,25 @@ class Task { : id = json['id'], updated = DateTime.parse(json['updated']), created = DateTime.parse(json['created']), - reminders = (json['reminderDates'] as List) + reminders = (json['reminder_dates'] as List) ?.map((r) => DateTime.parse(r)) ?.toList(), - due = DateTime.parse(json['dueDate']), + due = json['due_date'] != null ? DateTime.parse(json['due_date']): null, description = json['description'], title = json['title'], done = json['done'], - owner = User.fromJson(json['createdBy']); + owner = User.fromJson(json['created_by']); toJSON() => { 'id': id, 'updated': updated?.toIso8601String(), 'created': created?.toIso8601String(), - 'reminderDates': + 'reminder_dates': reminders?.map((date) => date.toIso8601String())?.toList(), - 'dueDate': due?.toIso8601String(), + 'due_date': due?.toIso8601String(), 'description': description, 'title': title, 'done': done ?? false, - 'createdBy': owner?.toJSON() + 'created_by': owner?.toJSON() }; } From 857c02375fd1ccbc910cabb3a185256cac0420e9 Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 15 Jun 2020 23:48:15 +0200 Subject: [PATCH 53/99] Format --- lib/models/task.dart | 3 ++- lib/pages/list/list.dart | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/models/task.dart b/lib/models/task.dart index 09af50d..f9a398e 100644 --- a/lib/models/task.dart +++ b/lib/models/task.dart @@ -27,7 +27,8 @@ class Task { reminders = (json['reminder_dates'] as List) ?.map((r) => DateTime.parse(r)) ?.toList(), - due = json['due_date'] != null ? DateTime.parse(json['due_date']): null, + due = + json['due_date'] != null ? DateTime.parse(json['due_date']) : null, description = json['description'], title = json['title'], done = json['done'], diff --git a/lib/pages/list/list.dart b/lib/pages/list/list.dart index d5640c2..6a943c3 100644 --- a/lib/pages/list/list.dart +++ b/lib/pages/list/list.dart @@ -110,8 +110,8 @@ class _ListPageState extends State { _addItem(String name, BuildContext context) { var globalState = VikunjaGlobal.of(context); - var newTask = - Task(id: null, title: name, owner: globalState.currentUser, done: false); + var newTask = Task( + id: null, title: name, owner: globalState.currentUser, done: false); setState(() => _loadingTasks.add(newTask)); globalState.taskService.add(_list.id, newTask).then((task) { setState(() { From 45d324884d5a6fe4a2ec6c0bef42bb42ed28d027 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 16 Jun 2020 00:18:09 +0200 Subject: [PATCH 54/99] Don't try to run tests in pipeline --- .drone.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.drone.yml b/.drone.yml index 55aefb3..a254cb6 100644 --- a/.drone.yml +++ b/.drone.yml @@ -27,12 +27,13 @@ steps: - make format-check - make build-debug - - name: test - image: cirrusci/flutter:stable - pull: true - commands: - - flutter packages get - - make test +# Don't run tests until we have to not break the pipeline +# - name: test +# image: cirrusci/flutter:stable +# pull: true +# commands: +# - flutter packages get +# - make test --- kind: pipeline From 6b3cca0fd983a319aad814ffeada782ac80597b0 Mon Sep 17 00:00:00 2001 From: JonasFranz Date: Wed, 17 Jun 2020 15:37:42 +0000 Subject: [PATCH 55/99] Add sentry (#43) Refactor DSN to constants Use correct import Add sentry Co-authored-by: Jonas Franz Reviewed-on: https://kolaente.dev/vikunja/app/pulls/43 Reviewed-by: konrad --- lib/constants.dart | 2 ++ lib/main.dart | 42 +++++++++++++++++++++++++++++++++++++++--- pubspec.lock | 44 +++++++++++++++++++++++++++++--------------- pubspec.yaml | 5 +++-- 4 files changed, 73 insertions(+), 20 deletions(-) create mode 100644 lib/constants.dart diff --git a/lib/constants.dart b/lib/constants.dart new file mode 100644 index 0000000..edf467d --- /dev/null +++ b/lib/constants.dart @@ -0,0 +1,2 @@ +const SENTRY_DSN = + 'https://ab786a1feac7418d87187465b6f30ee0@sentry.k8s.jfdev.de/2'; diff --git a/lib/main.dart b/lib/main.dart index c7b2f6c..5775d04 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,12 +1,48 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:sentry/sentry.dart'; +import 'package:vikunja_app/constants.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/pages/home.dart'; import 'package:vikunja_app/pages/user/login.dart'; import 'package:vikunja_app/theme/theme.dart'; -void main() => runApp(VikunjaGlobal( - child: new VikunjaApp(home: HomePage()), - login: new VikunjaApp(home: LoginPage()))); +void main() { + var sentry = new SentryClient(dsn: SENTRY_DSN); + + FlutterError.onError = (details, {bool forceReport = false}) { + try { + sentry.captureException( + exception: details.exception, + stackTrace: details.stack, + ); + } catch (e) { + print('Sending report to sentry.io failed: $e'); + } finally { + // Also use Flutter's pretty error logging to the device's console. + FlutterError.dumpErrorToConsole(details, forceReport: forceReport); + } + }; + + runZoned( + () => runApp(VikunjaGlobal( + child: new VikunjaApp(home: HomePage()), + login: new VikunjaApp(home: LoginPage()))), + onError: (Object error, StackTrace stackTrace) { + try { + sentry.captureException( + exception: error, + stackTrace: stackTrace, + ); + print('Error sent to sentry.io: $error'); + } catch (e) { + print('Sending report to sentry.io failed: $e'); + print('Original error: $error'); + } + }, + ); +} class VikunjaApp extends StatelessWidget { final Widget home; diff --git a/pubspec.lock b/pubspec.lock index a781b71..af02983 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,42 +14,42 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "2.0.13" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.5.2" + version: "1.6.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.4.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "2.0.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.1.3" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" + version: "1.14.12" convert: dependency: transitive description: @@ -63,7 +63,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "2.1.4" cupertino_icons: dependency: "direct main" description: @@ -98,7 +98,7 @@ packages: name: flutter_secure_storage url: "https://pub.dartlang.org" source: hosted - version: "3.3.1+1" + version: "3.3.3" flutter_test: dependency: "direct dev" description: flutter @@ -110,7 +110,7 @@ packages: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.12.0+3" + version: "0.12.1" http_parser: dependency: transitive description: @@ -124,7 +124,7 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "2.1.12" matcher: dependency: transitive description: @@ -166,7 +166,14 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.1.3" + sentry: + dependency: "direct main" + description: + name: sentry + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" sky_engine: dependency: transitive description: flutter @@ -178,7 +185,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.7.0" stack_trace: dependency: transitive description: @@ -213,7 +220,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.11" + version: "0.2.15" typed_data: dependency: transitive description: @@ -221,6 +228,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.6" + usage: + dependency: transitive + description: + name: usage + url: "https://pub.dartlang.org" + source: hosted + version: "3.4.1" vector_math: dependency: transitive description: @@ -234,7 +248,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "3.5.0" + version: "3.6.1" yaml: dependency: transitive description: @@ -243,4 +257,4 @@ packages: source: hosted version: "2.2.0" sdks: - dart: ">=2.4.0 <3.0.0" + dart: ">=2.6.0 <3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 067ec71..2ee8255 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,9 +10,10 @@ dependencies: flutter: sdk: flutter cupertino_icons: ^0.1.3 - flutter_secure_storage: 3.3.1+1 - http: 0.12.0+3 + flutter_secure_storage: ^3.3.3 + http: ^0.12.1 after_layout: ^1.0.7 + sentry: ^3.0.1 dev_dependencies: flutter_test: From e371c55a52af725a04681518fa856436f9b854a5 Mon Sep 17 00:00:00 2001 From: JonasFranz Date: Wed, 17 Jun 2020 15:54:19 +0000 Subject: [PATCH 56/99] Provide build for iOS (#42) Remove pipeline for feature/ios Merge branch 'master' of ssh://git.kolaente.de:9022/vikunja/app into feature/ios Fix CI Add keychain pw ensure keychain Disable code signing while building Fix CI Merge branch 'feature/ios' of ssh://git.kolaente.de:9022/vikunja/app into feature/ios Add keychain password Merge branch 'master' into feature/ios Add compliance Add secrets Remove build app step Use other version Set Utf8 Fix CI Fix CI Fix beta deployment Add deploy step Fix CI Fix CI Fix ci fix ci fix ci test ci fix ci Fix keychain Fix keychain Use custom keychain Add security unlock Add MATCH_PASSWORD Add match Add fastlane Add ios pipeline to build Add ios pipeline to build Co-authored-by: Jonas Franz Co-authored-by: Buildslave Reviewed-on: https://kolaente.dev/vikunja/app/pulls/42 Reviewed-by: konrad --- .drone.yml | 51 +++++++++++ .gitignore | 6 +- Makefile | 20 ++--- ios/Flutter/Flutter.podspec | 18 ++++ ios/Flutter/flutter_export_environment.sh | 7 +- ios/Gemfile | 3 + ios/Podfile | 87 +++++++++++++++++++ ios/Runner.xcodeproj/project.pbxproj | 51 ++++------- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++ ios/Runner/Info.plist | 2 + ios/fastlane/Appfile | 8 ++ ios/fastlane/Fastfile | 29 +++++++ ios/fastlane/Matchfile | 13 +++ 13 files changed, 253 insertions(+), 50 deletions(-) create mode 100644 ios/Flutter/Flutter.podspec create mode 100644 ios/Gemfile create mode 100644 ios/Podfile create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/fastlane/Appfile create mode 100644 ios/fastlane/Fastfile create mode 100644 ios/fastlane/Matchfile diff --git a/.drone.yml b/.drone.yml index a254cb6..3a468e3 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,4 +1,5 @@ kind: pipeline +type: docker name: testing workspace: @@ -37,6 +38,7 @@ steps: --- kind: pipeline +type: docker name: release-latest depends_on: @@ -84,6 +86,7 @@ steps: --- kind: pipeline +type: docker name: release-version depends_on: @@ -125,3 +128,51 @@ steps: strip_prefix: apks/ source: apks/* target: /app/${DRONE_TAG##v} + +--- +kind: pipeline +type: exec +name: release-ios + + +trigger: + event: + - push + branch: + - master + +platform: + os: darwin + arch: amd64 + + +steps: + - name: build + commands: + - make build-ios + environment: + HOME: /Users/buildslave + - name: deploy + environment: + HOME: /Users/buildslave + LC_ALL: en_US.UTF-8 + LANG: en_US.UTF-8 + FASTLANE_SKIP_UPDATE_CHECK: true + FASTLANE_HIDE_CHANGELOG: true + MATCH_PASSWORD: + from_secret: match_password + FASTLANE_PASSWORD: + from_secret: fastlane_password + FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: + from_secret: fastlane_apple_password + FASTLANE_SESSION: + from_secret: fastlane_session + KEYCHAIN_PASSWORD: + from_secret: keychain_password + commands: + - cd ios + - fastlane ios signing + - fastlane ios beta + +depends_on: + - testing \ No newline at end of file diff --git a/.gitignore b/.gitignore index b0658dd..ab3e5ac 100644 --- a/.gitignore +++ b/.gitignore @@ -70,4 +70,8 @@ build/ !**/ios/**/default.mode2v3 !**/ios/**/default.pbxuser !**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages \ No newline at end of file +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +ios/fastlane/README.md +ios/fastlane/report.xml +ios/Runner.ipa +ios/Runner.app.dSYM.zip diff --git a/Makefile b/Makefile index 36134c0..b7c2c4b 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,10 @@ GIT_LAST_COMMIT := $(shell git describe --tags --always | sed 's/-/+/' | sed 's/^v//') FLUTTER ?= flutter -ifneq ($(DRONE_TAG),) - VERSION ?= $(subst v,,$(DRONE_TAG))-$(GIT_LAST_COMMIT) +ifneq ($(DRONE_BUILD_NUMBER),) + VERSION ?= $(DRONE_BUILD_NUMBER) else - ifneq ($(DRONE_BRANCH),) - VERSION ?= $(subst release/v,,$(DRONE_BRANCH))-$(GIT_LAST_COMMIT) - else - VERSION ?= master-$(GIT_LAST_COMMIT) - endif + VERSION ?= 1 endif .PHONY: test @@ -20,15 +16,19 @@ build-all: build-release build-debug build-profile .PHONY: build-release build-release: - $(FLUTTER) build apk --release --build-name=$(VERSION) --flavor main + $(FLUTTER) build apk --release --build-number=$(VERSION) --flavor main .PHONY: build-debug build-debug: - $(FLUTTER) build apk --debug --build-name=$(VERSION) --flavor unsigned + $(FLUTTER) build apk --debug --build-number=$(VERSION) --flavor unsigned .PHONY: build-profile build-profile: - $(FLUTTER) build apk --profile --build-name=$(VERSION) --flavor unsigned + $(FLUTTER) build apk --profile --build-number=$(VERSION) --flavor unsigned + +.PHONY: build-ios +build-ios: + $(FLUTTER) build ios --release --build-number=$(VERSION) --no-codesign .PHONY: format format: diff --git a/ios/Flutter/Flutter.podspec b/ios/Flutter/Flutter.podspec new file mode 100644 index 0000000..5ca3041 --- /dev/null +++ b/ios/Flutter/Flutter.podspec @@ -0,0 +1,18 @@ +# +# NOTE: This podspec is NOT to be published. It is only used as a local source! +# + +Pod::Spec.new do |s| + s.name = 'Flutter' + s.version = '1.0.0' + s.summary = 'High-performance, high-fidelity mobile apps.' + s.description = <<-DESC +Flutter provides an easy and productive way to build and deploy high-performance mobile apps for Android and iOS. + DESC + s.homepage = 'https://flutter.io' + s.license = { :type => 'MIT' } + s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } + s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } + s.ios.deployment_target = '8.0' + s.vendored_frameworks = 'Flutter.framework' +end diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh index ba8483e..e22f24c 100755 --- a/ios/Flutter/flutter_export_environment.sh +++ b/ios/Flutter/flutter_export_environment.sh @@ -1,10 +1,11 @@ #!/bin/sh # This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/nix/store/nyvp7jf7sfxsbc6jsm1y4fc18631ap26-flutter-stable-1.12.13+hotfix.5-unwrapped" -export "FLUTTER_APPLICATION_PATH=/home/konrad/www/vikunja/app2" +export "FLUTTER_ROOT=/opt/flutter" +export "FLUTTER_APPLICATION_PATH=/home/jonasfranz/Projects/vikunja/app" export "FLUTTER_TARGET=lib/main.dart" export "FLUTTER_BUILD_DIR=build" export "SYMROOT=${SOURCE_ROOT}/../build/ios" -export "FLUTTER_FRAMEWORK_DIR=/home/konrad/.cache/flutter/artifacts/engine/ios" +export "OTHER_LDFLAGS=$(inherited) -framework Flutter" +export "FLUTTER_FRAMEWORK_DIR=/opt/flutter/bin/cache/artifacts/engine/ios" export "FLUTTER_BUILD_NAME=0.1.0" export "FLUTTER_BUILD_NUMBER=0.1.0" diff --git a/ios/Gemfile b/ios/Gemfile new file mode 100644 index 0000000..7a118b4 --- /dev/null +++ b/ios/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..6697f0a --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,87 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def parse_KV_file(file, separator='=') + file_abs_path = File.expand_path(file) + if !File.exists? file_abs_path + return []; + end + generated_key_values = {} + skip_line_start_symbols = ["#", "/"] + File.foreach(file_abs_path) do |line| + next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } + plugin = line.split(pattern=separator) + if plugin.length == 2 + podname = plugin[0].strip() + path = plugin[1].strip() + podpath = File.expand_path("#{path}", file_abs_path) + generated_key_values[podname] = podpath + else + puts "Invalid plugin specification: #{line}" + end + end + generated_key_values +end + +target 'Runner' do + use_frameworks! + use_modular_headers! + + # Flutter Pod + + copied_flutter_dir = File.join(__dir__, 'Flutter') + copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') + copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') + unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) + # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. + # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. + # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. + + generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') + unless File.exist?(generated_xcode_build_settings_path) + raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) + cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; + + unless File.exist?(copied_framework_path) + FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) + end + unless File.exist?(copied_podspec_path) + FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) + end + end + + # Keep pod path relative so it can be checked into Podfile.lock. + pod 'Flutter', :path => 'Flutter' + + # Plugin Pods + + # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock + # referring to absolute paths on developers' machines. + system('rm -rf .symlinks') + system('mkdir -p .symlinks/plugins') + plugin_pods = parse_KV_file('../.flutter-plugins') + plugin_pods.each do |name, path| + symlink = File.join('.symlinks', 'plugins', name) + File.symlink(path, symlink) + pod name, :path => File.join(symlink, 'ios') + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['ENABLE_BITCODE'] = 'NO' + end + end +end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 43e80ee..cea2653 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,13 +8,8 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; @@ -29,8 +24,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -40,21 +33,20 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; + 1CD140BF817CCDA821C9152F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C102A622A93B95B5704BDD24 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CA78C9A9831542FDDB6FB31E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,8 +54,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, ACA854A11123D371B9168194 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -82,6 +72,8 @@ 7CACC4C503C5D851EB73C215 /* Pods */ = { isa = PBXGroup; children = ( + CA78C9A9831542FDDB6FB31E /* Pods-Runner.debug.xcconfig */, + 1CD140BF817CCDA821C9152F /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -89,10 +81,7 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, - 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 9740EEB31CF90195004384FC /* Generated.xcconfig */, @@ -157,7 +146,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 85082CB7F9EE2F3E7985BDB9 /* [CP] Embed Pods Frameworks */, - 7C22F5DE30AEBAB42040EB3F /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -181,6 +169,7 @@ CreatedOnToolsVersion = 7.3.1; DevelopmentTeam = Z48VLBM2R7; LastSwiftMigration = 0910; + ProvisioningStyle = Manual; }; }; }; @@ -189,6 +178,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, Base, ); @@ -211,7 +201,6 @@ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -249,22 +238,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; - }; - 7C22F5DE30AEBAB42040EB3F /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 85082CB7F9EE2F3E7985BDB9 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -272,8 +246,8 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${PODS_ROOT}/../Flutter/Flutter.framework", "${BUILT_PRODUCTS_DIR}/flutter_secure_storage/flutter_secure_storage.framework", ); name = "[CP] Embed Pods Frameworks"; @@ -283,7 +257,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 9740EEB61CF901F6004384FC /* Run Script */ = { @@ -443,6 +417,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = Z48VLBM2R7; ENABLE_BITCODE = NO; @@ -458,6 +433,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = io.vikunja.flutteringVikunja; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "match Development io.vikunja.flutteringVikunja 1592303885"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_SWIFT3_OBJC_INFERENCE = On; @@ -472,6 +448,8 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = Z48VLBM2R7; ENABLE_BITCODE = NO; @@ -487,6 +465,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = io.vikunja.flutteringVikunja; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "match AppStore io.vikunja.flutteringVikunja 1592303767"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_SWIFT3_OBJC_INFERENCE = On; SWIFT_VERSION = 4.0; diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 514e512..00504bd 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + ITSAppUsesNonExemptEncryption + CFBundleDevelopmentRegion en CFBundleDisplayName diff --git a/ios/fastlane/Appfile b/ios/fastlane/Appfile new file mode 100644 index 0000000..157727d --- /dev/null +++ b/ios/fastlane/Appfile @@ -0,0 +1,8 @@ +app_identifier("io.vikunja.flutteringVikunja") # The bundle identifier of your app +apple_id("email@jfdev.de") # Your Apple email address + +itc_team_id("117734679") # App Store Connect Team ID +team_id("Z48VLBM2R7") # Developer Portal Team ID + +# For more information about the Appfile, see: +# https://docs.fastlane.tools/advanced/#appfile diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile new file mode 100644 index 0000000..f490ff1 --- /dev/null +++ b/ios/fastlane/Fastfile @@ -0,0 +1,29 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +default_platform(:ios) + +platform :ios do + desc "Push a new beta build to TestFlight" + lane :beta do + match(type: "appstore", readonly: true) + gym + upload_to_testflight + end + lane :signing do + match(type: "appstore", readonly: true) + match(type: "development", readonly: true) + end +end diff --git a/ios/fastlane/Matchfile b/ios/fastlane/Matchfile new file mode 100644 index 0000000..ee96f21 --- /dev/null +++ b/ios/fastlane/Matchfile @@ -0,0 +1,13 @@ +git_url("git@git.jfdev.de:JonasFranzDEV/match.git") + +storage_mode("git") + +type("development") # The default type, can be: appstore, adhoc, enterprise or development + +# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"]) +# username("user@fastlane.tools") # Your Apple Developer Portal username + +# For all available options run `fastlane match --help` +# Remove the # in the beginning of the line to enable the other options + +# The docs are available on https://docs.fastlane.tools/actions/match From 84ab307e5f045245e1d5f899fe688eb93a32b1a3 Mon Sep 17 00:00:00 2001 From: JonasFranz Date: Wed, 17 Jun 2020 16:51:23 +0000 Subject: [PATCH 57/99] Improve error handling (#45) Improve error handling Co-authored-by: Jonas Franz Reviewed-on: https://kolaente.dev/vikunja/app/pulls/45 Reviewed-by: konrad --- lib/api/client.dart | 20 +++++++++++++++++++- lib/components/ErrorDialog.dart | 20 ++++++++++++++++++++ lib/main.dart | 14 +++++++++++--- lib/pages/home.dart | 4 +++- 4 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 lib/components/ErrorDialog.dart diff --git a/lib/api/client.dart b/lib/api/client.dart index f347d38..fca43e5 100644 --- a/lib/api/client.dart +++ b/lib/api/client.dart @@ -53,8 +53,15 @@ class Client { dynamic _handleResponse(http.Response response) { if (response.statusCode < 200 || - response.statusCode > 400 || + response.statusCode >= 400 || json == null) { + if (response.statusCode ~/ 100 == 4) { + Map error = _decoder.convert(response.body); + throw new InvalidRequestApiException( + response.statusCode, + response.request.url.toString(), + error["message"] ?? "Unknown Error"); + } throw new ApiException( response.statusCode, response.request.url.toString()); } @@ -62,6 +69,17 @@ class Client { } } +class InvalidRequestApiException extends ApiException { + final String message; + InvalidRequestApiException(int errorCode, String path, this.message) + : super(errorCode, path); + + @override + String toString() { + return this.message; + } +} + class ApiException implements Exception { final int errorCode; final String path; diff --git a/lib/components/ErrorDialog.dart b/lib/components/ErrorDialog.dart new file mode 100644 index 0000000..640c3c1 --- /dev/null +++ b/lib/components/ErrorDialog.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; + +class ErrorDialog extends StatelessWidget { + final dynamic error; + + ErrorDialog({this.error}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + content: Text(error.toString()), + actions: [ + FlatButton( + child: Text('Close'), + onPressed: () => Navigator.of(context).maybePop(), + ) + ], + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index 5775d04..440a37a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:sentry/sentry.dart'; import 'package:vikunja_app/constants.dart'; @@ -9,6 +10,11 @@ import 'package:vikunja_app/pages/user/login.dart'; import 'package:vikunja_app/theme/theme.dart'; void main() { + if (!kReleaseMode) { + // only log errors in release mode + _startApp(); + return; + } var sentry = new SentryClient(dsn: SENTRY_DSN); FlutterError.onError = (details, {bool forceReport = false}) { @@ -26,9 +32,7 @@ void main() { }; runZoned( - () => runApp(VikunjaGlobal( - child: new VikunjaApp(home: HomePage()), - login: new VikunjaApp(home: LoginPage()))), + _startApp, onError: (Object error, StackTrace stackTrace) { try { sentry.captureException( @@ -44,6 +48,10 @@ void main() { ); } +_startApp() => runApp(VikunjaGlobal( + child: new VikunjaApp(home: HomePage()), + login: new VikunjaApp(home: LoginPage()))); + class VikunjaApp extends StatelessWidget { final Widget home; diff --git a/lib/pages/home.dart b/lib/pages/home.dart index eeeb4b3..0879f16 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:after_layout/after_layout.dart'; import 'package:vikunja_app/components/AddDialog.dart'; +import 'package:vikunja_app/components/ErrorDialog.dart'; import 'package:vikunja_app/pages/namespace/namespace.dart'; import 'package:vikunja_app/pages/namespace/namespace_edit.dart'; import 'package:vikunja_app/pages/placeholder.dart'; @@ -162,7 +163,8 @@ class HomePageState extends State with AfterLayoutMixin { Scaffold.of(context).showSnackBar(SnackBar( content: Text('The namespace was created successfully!'), )); - }); + }).catchError((error) => showDialog( + context: context, builder: (context) => ErrorDialog(error: error))); } Future _loadNamespaces() { From 826acc26f8f853ce45d1f08d48b110753c120460 Mon Sep 17 00:00:00 2001 From: JonasFranz Date: Wed, 17 Jun 2020 17:41:40 +0000 Subject: [PATCH 58/99] Add dark mode (#46) Merge branch 'master' into feature/dark-mode Add white logo in dark mode Make button shadow dark Format Add dark mode Co-authored-by: kolaente Co-authored-by: Jonas Franz Reviewed-on: https://kolaente.dev/vikunja/app/pulls/46 Reviewed-by: konrad --- assets/vikunja_logo_full.png | Bin 59736 -> 57218 bytes assets/vikunja_logo_full_white.png | Bin 0 -> 52285 bytes lib/main.dart | 1 + lib/pages/user/login.dart | 4 +++- lib/theme/button.dart | 4 +++- lib/theme/constants.dart | 1 + lib/theme/theme.dart | 12 ++++++++++-- pubspec.yaml | 1 + 8 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 assets/vikunja_logo_full_white.png diff --git a/assets/vikunja_logo_full.png b/assets/vikunja_logo_full.png index 57e4652083f12810358623228a9d4d692b3de21f..7fd28cf2aff4f3fa6b7d48e9712fa03f567da3ea 100644 GIT binary patch literal 57218 zcmY&<1z3~s_cs!vpeQOJ2#89j63Q59!6>QGAySU+(IEnY5{{A>p(8iCK|&Ca)=`o} zYK)rF41xc{SM>M3_jP%RbI*CsIrllAlSF8!E1suep&=t9I}cHMs6|G08bd}#PIl%r z@X1b_8V~RnrQ3ao&KcnNow0lc{QIo4l7Sl;8N1l=pHmIBP65D&%C5@!GMV&d1+XUxUGH#n#D5y*=yGOiC<5M%uwDoV4CFo4@k>-}X9@(jmL-m;h`bWtN#ptU++$O~~hp!J-hT;aPCGy>ZrJ&xRI>XO{pa}4aTNX+t+~2Vn z^&VxS&i}5WKl$+kSd-hBg?fF6M!o9TEcq(kgH;!1nX8fxb_whgyY%-Gn*-?pbsQgg zq}1(42`&1);#uIVPC9-$Mv) zt{Am)$5Dt?sM(o(a#R09iA zD##9Gj1v|INlhEb`3kdG4sfW!mpcx+$^Ipg0Fcluth65qF%*O)tEx~C9*PMi4qSrt zHqH*^eNA3VbXQ#5q=vwi4E3%KAusrkt!|{9KY9A17>z*Yxq*@Ia|@XpO^Vh6hFO?*mC{y!}oQ;APco(t;I)IX(Ij&+?>lN!2@WLA12nk!~y zc$4oZ+xeJzRAJUYaoXlD zwpk&~ynC+LffiP%kFY>p1aED8aO&id=r=7i=k10wJ?2%P+{@kILh=wE{u0yduL9+! zT9I(gn@y?UE#E?qETYEA6J(BkAA;RY?HrORqz+! zjPz+crmo(fn*7frL66&deFpEi$)Md+sC=qanK}uA5CdF(tl_mZ!ea4a2j>FUK z(ovqgBkDy9jfd63{P0`5Z=r~E2kayDrC-Ri5-`=A>)>1`CJO)XA-$9D#tPC141Vl` z-UXj=k3iv7e8N!H{ckm#(hi?ut91tNRZV7^LHhg@|1#rq-#j#Bu(FF$GMA}~K!xZ_ zxU$>#GR&n3<@AMc%?Q58LrM`K{bQvvx`jr0sgXkhd18Oe=lor@|L{5~J_!C6lj&*QqH ztCW$DxZJsT)2&Wbz5i`~C!8}=b=i{itbKE@_g)RPU--#A1yy_~xo^99Zj{;DCkmCM zk}?mza53aPikM0eTQ%@^n^l~6N0k4ok;hkbf7<@1yBr6TC~Q(7|G@|m^|f5KVZUom?i5+gp6&I zav^qRoV6AorKUDwH{rPW!;Rskd4x{vfSy>^q2or!qyrSmeDa1%z#T;PTrYu9<)YQ< zl(FJC@AqA&v3n}ncsb3wMVH%n^Zr zx4Bc7Z!e&TVOdkPtEYFm3;O=v?^)o|419FQRIMt0dg;<+9 zvZ?j5i03vT#7E)jc~ZGb=nSrgm9#EhZMI(j3o7`J4@6%(sp@oW^u;>XykB3IBl!~= zaPjx$aK4cOe@Kx@M77X#h}(S~D_7U+bT3?by4_V zapL0ucWH5^K2`3MTv$xBCEjNs2_&s zByXgbDI?T+eSss2krg|yVMJ6DD-i=!JaGf3jXmjUdgPX%MQksoMLI1+-X;1^L46h zTGZ~>yT6VZ9nnIw#8PH88M2M!_*o!kej-#HJm?3#6V=_pQgsCeIesCnVS_lh-z{a7HDVaxsT5#4D7 zY~V*tpSIe71(C3Tg-7!UUJNIUz)C3BQ@@hO=lsHrWV;i4@T@NuIr|S>SR-2s=nG3! zcY+GLz~@!!l(kfIcXmf`LjD^fC~f?H_ifQNCr6ze8(UY4j3EL4T`fN6&R$K%f#fVg zV!FcqIlR#cQYz8Xpid7}cJ-~K7iM%3W)aq;zRS4-OiD)qQG>{*dm51;S9B$K2oC$g zvJXgsB1)doqEy@_iJi-RYYO#-0)n&Pi+|(`YJY4##Iay%K2RUNa#{Fmzm?PgJiP{4 ztxqBiVJq(9AgFI2iIlvG!rDl;jv~LXP1h&mI_#}Fkn1by`9{9F<8l6f@%w8HFJ@`d zkhYF`wd+~=-L48PEyKIquX~wkQT@hzm3Q~lMSnEEJ0_-Rx3xe@O;XC0$@1Aq=ppFP zdbo|m`q$ZH4-IvxoM^r>xTPSvm#sv*&U29wa!)B`0sQ1r;-=D(C~u|2zWO@P1>y#h zZ2p~2+xv15kN?sZwkLY2*Wff>wYU-!R!?o8O}u?ViiI{5%9i3ARk?lcJB|tI=z#?_ zZg5)ZhHtiIx!Y5C<%RQNY`akWNl2LiR7`^|4Yq#RB_&Pvo6Pg0AsI`U@r4uP%B0iO zA4*Oi+Mb(v7vP}ogoplr_5M*OnJY~hW29)KU$I8k`KR% zJ#`wU>HcR`nT-IMh~y+A#r{kar!2?BiqG(LRD)fpyLtxkieh_WP-S+C5jp!(FOy2H z$WJjiGk5ZUudg*=2B(Zx{u)#e>5(~<+UNADK`rB?BQ_JY=_t+^r;@0WB-;j${NU@= z1n4@vxP?FIt*m?g;1cZ6^__ba=pe`UYtc8u+5W#dTN}>Tp%1}c%RsKJ3ddv(BsUJoJk1~)z~cVLMJg{w%W;k2ZiDaF z!(K>6oK9+W`7OhM7n?I;{<*xp&!^zz@!dO#K`|+!5W@{Y9N$f6pGvE(?jnKJhd9j> zl?<}epsy^mm*iea-7@(*k&5=|pi^8H?o2xd0rWvZ6WE7hBe%j7V|AGBE9`(;K9^ zk?ePZ{2Mn6?Y=;>PB`dNG*1v6&>f3kQ}8#zQmb|C_07h)VN*r6k?*A~sBmXBiYn5~ zxAOFmJZg?x$eX9ti|HP31_H>=`A-Ve^-yS}JKd;(5NI;zG>-hI<`b}{RDSz#5*zCd z;LWyb-)ICNOV8h$>fExaN_YynxM(92vaN+vIAH>HEflH@-0MAG{4-|_>UHzd%NnJe%f+6~6)V+Z(6gy}yXVi>~hynWz9TEuQw95W< zM5?&*F3$YqmUjVU;}R38j!riqJ+U#I1*@bWOXUr33ygy39R1~I>){84%hvoWs z1DfGV+(2`NhJFw%EZ4Y|O4OE=)%{lE;S)V%0c!XXwU{d-;Lu3qJ)!+OtEAvXZOCw{ z-8T_6pJ<{WZ0E&Gr>`+<-*bMaPsZ%~na{}!&c>8-JylC))i&Q++=D9ak9}F#xBT(# zx|=wywX(m7CSvF`5Ar=GU`ou=X1DJ|;msFl&@VkMjP5-m;1P+teF)D{`8vr@LSNh2 zeSXG_ld%^`O0jgaegJHhuarU8+^eTJe0El?hb?NSanhAyHTcY3z zy9F^V{0cxWb3eI}2Np&Ytejqvh3P7aTHtrqzI}fHjwX2s%*E6y=jZ^6$d<_w!|1fQ z<(35EG-(Gcyh&xs&m)yS@-+0iJGjru}oSf{+$| zN1%3Luh>x`W$qG<5^a!|j^61CE=^PHsCfRqe}nb)+K32osGoAwyN@I_fQh!iqE^$BFC+#jHyorX+?Z${!r@6IgHtw!K((SOEDoo@l_x zZkrjtzOwK^B!M$ebar z&#rJ)UK1xy;A$)%e4i^E71;A@vOXSHT|L*4WN6RUtpFHo{BB*v_sw zS7I2X8)L5CFBDB^$}OzmYb-yZsYDkFJqKin;`iQPSMo^&ZfNOa+plP*g$JjLnmN=cM>WzW4N*<`dw_vuvZ``UQRE$;$6Zeow*VF0>K-EpnZ}U66i5e8dE`}c`+*%^mo=R@H9b&_~MaZ|^A-wuP7=1Q+>2?_2H~=?=V26`le9<0Ch4m4d ze8X1G{R?3aADBbmgC2OQUtHWr`o=HuNF# z7PYeBsZy)-KL|{`Il^wvNl@w9EDC=bm%R*!w9XJ6i7(EYLd-Q~KNQ&@cW zXHk=elvPoZ=Kp5~>l*rOkMR89{6+T-(cO99X-sZv{6PiUs zy{&ki_cQ>;LIV~?<_!J!8V8{-(k!6l1HW$%?f^9rCYtIG4O`04A@hZzGEm!_Mv;ht zXP2sOhaI(q9_(A1U-i#a1nK?C2Ef5YVY0el)nb$N zc|+A9&Og+GH~}@ix5@7HLtzZ3!78`(ueK_`{XHe~jT-duWux+kFt@Y*PZs%Uue*e z?|isLx|;1ctH)nHTg>>zPN4PldJn}T|HpPwa>Nr>uFRfJM*#?nNo(XH7~>3BAcI1u zX!o}hD?$woZemK_|EHbrmr5i(Z<9E}`G4%ODz2U0TwhxyDdKLNXqc5PG@*x$cQK=9 z(;Ww4={-xYr{C68ryPmZk17YkXoN+!mW#VM@O(+h%a%w6-2@k(2S9n8K>S-dL}Px? zqSsC}XsZ`*BR_mobwuvIdhg}TnSMJa(lsbSvbA9NvkRk+%U~;w01dh;d1_M3GHE~h z)E@?>f3eh+EHRgibP*gH-NfII#(glkzRjeI z%}Qyi_kb3%&F9ps6vG-rrgnh(i5S3wRmb$>22dt$99h@m-q zMOU-07=gM|MTub^7{5g%W8U9`BIaJq0y@1R$v&|8b<+$;Q*!>LDcs`5=0lb3)}VoE zPPGkW_FIp~6PHT7e#%QL&@q&rxeCO*-o+Fa|2Lev`kib?Tp-(TVRDAg4GzZ37}~Ef z{k`Akc`deU62mN4w$$7V=fEl-UYE6WwP^g<_3|@6d?j@1+9T;u=p_M6^bw+m2Ca`g z`e|Pkb|MNk(}f0I$#|t>^HE&iHX9Xo<%|HP-EMV5tOn;p6aGc2tizWJq6=#c*X(1b_z zALY%VVp6vlb=yLIIZP?d%T)aECnm;X@ZgH>Bt?}LcBs*9`U!Wn zZh*s`d{$92+g^u4ltZWfm)Pygmm>P_5~ob^t8*{o`|Scg^LWIJiMKiBav)As-h z4_8tNk<|+mo!C{ZW*eFi3e+0_P)6t3=rdgA#k{ygi*ES!B=I#FoYmC$U>Gf7upJDwM73d8EErVG%Q1jpFN(}n(U4L%K zOYxGprhfKku1SizcKAt!koj%U!F;H}T6NMWeEI0I+* zLVCv|?uHir9zD}nT+SH!OC`>p70a!q-@IP1-WANBVO9?}x#UCuu<}&H$czo)#?7bXRrh zcY!Dk8t5ey^iruG9gkK1;l^Nj9WSPi+P)Ul&<&@H=f0L*Qf6tC#VddTF!Sz1ARCAP zN)x_;`{oJO+-ffBW?yMu|6DrpuW9|VMv8|+-i4L0hi377EuBhvIlz+$$56p@R_44+ z@wj-$@V^pdboJzd2j+?x8JTn@dlZoNj1)$f-BDdU?7os;Drle&b-e@Vnv-U2PU=asB2 z_8AVOQKuw;DJXfFqD-i{Wj)uDJZ0C9s)=u_RuEOIiB+p_+v8+jtkf*1CZ)I~ zm^snwPP3`y)XtYW%-pe`+WY>D9%}8Qh!2{qIhb9;|Btnt99nddf^R7#X|FGM{h?GV z{|}*4TzoxDS9CP=)gnvUi`^nCo>#fItV9ScGxjDf^r!LW<){|;O>lzly>;k9MTiz& zxv&;jMNC}tR;u$2cORjH&3Y2nsCgobP>)9GG=N0flZ4`+*ac0jZ;tO zL5k}wEf-7`@ZzjJRQ=M#iNDOo#cmej_zw;P2s^1fvcpbq*V}d%Vhr^SZXEhw6cfr$ z`q0!Q2fV&9bd=Fw1IzHQ5ZFT9rA1dJR<4rtKx!LoRP(QgK~QtK3Yy$S*%tl}RASlX z`>1l?>^S_BcmhhKzoI6}_z?6`Q9m3m<6#Li z@q3!scUN{2h}F?PJ;N-!MkDmzqeb`8tr{dZ1#*#Ua$thhzmZxqXgb=XFrvYT7Z#7S8l5odURedI*Cn#wJH1uE?0P{NS;?5F3BsmenC6_n^C0Jkwd_12!zuwfu8T^5oAVWRvT!Q{%qKj5Bk@Xcf zHZkZd@yt7zBcFF0E!M_1b@RPg_7me9lZR6gM-4wM`7W#44_t+i3s8s^W@ngf1;X3p zTcalkBK|SOzJqE{g^kkRPWa44_hDNvHVd4kXf zdHL1Fbbg_C3@)+nGJJ(op&+X*8p+O8Qku5)C2GwdywBE@%dMnG0!krWOtZ-Azg*R?zw@v3AoZQtz+k~3 zldcSUWwUwnF%EPw<83Jrq}ToO?Uy-g&%NGtw(M)$pAfJCH)oWwJtZaQ*lYm7{3M5z zFI4t0ue1-9;QNYK1zM9Yc2QL&wnQa+`@vKAXOoO2X$-p6m>35`&M&AW_Y0#y8gdc? zY&8pL(I(}acjMHzkrcloE4ZHappEI6^+%&S&qhT76(fywQYY_oM`1!Kcw2e-ZilE) zL346ZhTPME{}EBMrA346R&*dvzW^d&N#SIur-PONrfhYU##L~xwX~Kay@h{#*mT{Z z37&dIcX#8(l2|^NxOt%wSep6oRB~sBCe%LDylx}VOuCXHo>IIrhU$A~n<6Fi)G-SK%v-M*(+rT-@3L57H~mI533BoKiW2Z~LjU`V%^7yWhRba*%hYzC?c-+y1+}CknzoM;FBKWVRErI8@(bA8rqE^YSg^D%g0!7d!lH$*!c~trQ z7%9C`h`QlCm>O{pfoLi4_O!vwW;Igvx?IuCcA)lps!IA%_hsNyF)VSY-aq{0owf>* zGy-l4nK8;UJu#;>T+A6PIq}arV;$_YJ+%mElb{F&UHbGuVU3*6_z8HR(Vp@{RM&F- z=~c)-wqZ#rEd{E_4G{8~);%OFK7 zLxI34%W)O3h(ot9A-5GE5$}QpnS}UM5>GZJE|4l`)_KP0 z1QfnD)(6e!IODD+bgJ8?N~#p9CMOOfGV1NA^^>HG%6(FaC*uxzLvIm`;2=&pva#cu zZC4SH54@K#0c^Mw84`MWF3mNLC&}NS>O;jUnNx$&SWUyq4^4_5LIKcpdGSvK7H=Vp zRQQS@Bx$#YOpblRXs=S3sn8yC zZsKN*$i&SkruV4(=f5bCuKjbWieK9Lg(Yv2r)I4jQ7zF8S~oB&W0875Ud1|o>L#~> zc6o|TpVT1*QoCq&*T$6L0pYb=#Eq+3{mJPg zqzHDl+@2VnnD8Ukc`WZ5u>rQK5nMowy1T<-Cln29KzR?PUn8s&60jK=hNG3#YqiVo zxIWEF=5B{Ja3OC|#<$W?vDM&(LqmVlH_5`L$gRf5qQQNy<#-R=A4~uoWev2A7sGJ? zc9LnBB?=i0%O>_WHG|+0J?Z?g1x@z40m!}ZK7WB8d{e-P34Ar*y3cTMd>q^j+7WeI zyU7ErV?7T~aeV6@7uN_96|b15jQV|WDym>96uJ{+!qc(G7CW^rO(>8+1%!bCTo1Q&v7vVUjKRJF@&yBcJk0-IM5Iy50* z?^9}!%Bfbk@KGrj*mNO%w-c!MbnoztBKqZ_I_fwy_FEbeRaO-I3Ak!K>gzQ}cQWi& zlRr$%%{EOG{*K>V#c?K_gIQzks{DKWr{Hv%tN?Gh0%r~dWBcyHN>QWguG|cB69+V{ zV9rS`LB=Lu;4&uhU=iDnmQdPU%kt6JoHA{wI4&VqEi`Ac+kV<8w^)5|Pk=t}l>p~{ znVmNzwKVpI*Gx^=WPc4sGc{;|%)*4nwUOc@FV2eSg?~uHfS?D6Yuc#Q_w2=(Xwqn*`pMVI;`52v)N~m?s3TtfvsWZac?al z)(=;gh{Qky#3_E$FTs>%{z@7QjXn@PBgh#;82X`Xsh|~pm@B@s#~dN7P#vx`c?J@`@6fl=UvwlT%urDXO0F- zFRxv=OVn8ubchB`u(Nk{)7*(1f=Yhw$MN+RXR7e8;Bw#gb_5Q1=6E2+(o5voJ)0g< zl-(W-_PyIlL#38dEuTC*JZtJUnUvi>X&maTB&2I_qxaa;;`{M>Dn6-@0e-d)h@3=u z*7<99f8TBQ%5$M*5>CtLoSzaYXL@v%JKilr;7yDfd}k8w6eDDOesOix!BgSqc}Tzd z^T<>qBSYc3)v9qiPVoR+A>$h7fY{!{X2?N=>hwf^drC@rD`PN#H%Z5WdnWh5(>6a- zhT*PB?!4Gq9y#I-E)5<$Qy`(~mWO_55Ze0N?}61wt^L|=%vthE&whF#l;a$t4nFO zJOJ1by%pCRAW{mfAocXYn6K@7K6%oQ`n&+3AGFf>M+=_<_Xh540u&(*65rpRX?vZK z_H|dDUuXWb0lspWdjLB0j<#~%hJjI6VQn`Qy0M~8rDlbUIQNjz(v2o1RmEpT?ns}d zmnW54!W=T<`KZC1_HzNi(|ynmEhM*1(moDCTwWy}@ko3>?<}ngNMIP($O%(^)7ls7 zhFdZDxO@Iibh6>W!GTkB)(Tjd$7B$PJK9F!A@q9ZTKkm^5t|RWk>LD>g8@iC5ZMcE zez7h$OLX^X*{BG!#_89&!{99&WK%lXC9c#Gyf9sfh5HV*-VK%vY0rO%GS^NoKEdS> z#0JGZd|q10udjJE!^u&haZ~)v-3o7M0A%P#xZx59-+taz_c1Xu!|}9TS_~Vk_WD(? z>JyIGI|SQo2TvUy+FiN|mS7Yz@j*ZWO$zr^eeBH4%+lsPY`3J?9g+wJjgV{72h3Zi_r=k@@csx{h zbepcSXYEZaONA-d#~m#^#LF*j z3Y+@X_Dm&iN~`;r5og-^ReadZj7xWKKss=a9J0*#iG8$W1`{A)`P@W(flP7Sq06Ti zRQAXVWb#pl700f!9nTMfEs^Zc~ld|a!#(2E!=kSq079Kur;aE!LtX3zITv{t&PX4FE)s_K6)yRL?>=**?1*m&4t z)4UPrF7+gN!6K^!26l6-fm_%LGm!APsHKP#dJ*cFnRo*x%6qRiFf74wZW*zIT5TYk zm)1n|jNcGFCE8DIHO&`UTpM=`lH5Ed1iJv9LW3%M=5Qi8nT7?Uu(4ztB*{1B5c2WV z#Vy`%;QdMF23_oBL>fhW-Jt*^$^3AWVt{w$eS{R#a znM|EOQ5iUG@I1$8)F@%k#n4;JB7o{}FqR|9w-lvowo%V94d)v~&e5P55?!!n+;?S{ zx+2^JjI0pL?=U&}1M_7bd-Y;0pPR+}dE^b>ZC0c!fJfkT;^`VJh*8e#ZeW7YGZ9>! zHP$0N$CHNq`Xl?BX>K<8%0`~-ZG(kI)x&D1ym*F@|I8kblT3jvu8NB_UUfq!}r$bLC5K>JZvGuZ(ST1 zu)0}_CX4@;IsHoQW+)VI3pT*+LEc1>Hu!PGM`T*lZ8nfX*2<`}3hl7tcU>U{+K3Tq zc?3`9OoJb=rn$-X>!*BqdUp~YRwHCoWnUnjF5~iQ;_zVK zJ6xQMOya$VpIl|S$iB~p-y*Ft^9B947cweHz) z=ALve<@wKP;7<5yNV0KhO&9#kXFET?-!x`6AK1E3asD>1LO}Qiojduxz#F5YqjLzj z{8spJl3P~syB3+qDlhm<1XDNsT``jJMuhZBGTY#EpSfe*V0<^0XN^t7@G>vvWFAbo)*83N!xR}_w_%9DN^zz* z6`#=locKN+*=N4Pg3LT9qGmJ*@f&n+F<7n+XyJ4?&`7sHoW2@aI%5O_@t80#zsoZ!RKsdB?yH|db{h@mM2zDuu;V59aI%o*cnKxQ=Zc;A5OPR`vp2#`b+A~B zQK=V%;|p>Jp+^8wmGjVkit-0;SYaG9or@0u`v#2I8 zlgI6wlsti1izt$L#49iG$@>y=cALHXe5vV1en0y|a};nlG;nF7#r`&u@emOM0F~{5 zsykU*9h9xsXR-k9$VwZP!u?qY?_e5t_}1+H$k-z5PMUN-oSefSn9=h%r!s~+=ZqZx zjs^gF0Sq*u*Oh7f@sbbSxZ}K$#EW@7KxrUwyx~22``$j?MOu9ON5$C3{x$%IN+E9y zrT}{?i=QK#xujyg^(Cqzsr?QkOY7iW*yDQQmClk94qDnqi_EYsPm+32eDccU&6@zv zO>2$&YrwBXbikt@B#T%0?YXMgVHCKt9aK8Lf_B(&H=fal`T8lwR*W1QU{L&bJh=JR z?mqL9vS4TeIFm^wg|$Qf`8oeBuLo1AZ3keT?;FjZI~rFJ*@W}Uc?|w0jh8tb(%fr_ z=klD?N%6#U;e^q8II*qqL8dg2A>mb|+ThV0&TH*J-sSX*?G~ega}4p!!h}iV@$Uhk zJ^^`WL!+3I)Hr8-A$4Y<=F@g_{dFC0`p;4^n_MG(b zUM*y2!mZzN?})9dY;=X~7^)(T^*xHJE^{KUKVTG(9o6>Zd8H>AApc`GxFb+j?q+Af z^)nI<+{@5kUPZjXB~vbq6jo2Az_D`seJ;E_GX9+iuH&9FR?zfgO$Q2p{At|UWKDp- zKQPV82cp$!vgfvxR}BwOzVkQbMPtV{Ci@g>UO^<9RTJ^2V1PekeW~ zRKCo`;E#XR4V22BQUq?NQ#}C{j+1oj@az?)OQ$Lf)waZDLKNgn_K2bUZ2?+cl^#+n8 zY+O^)H*7VM0hE{$AiOCN++j{pfpN_s7=tLLS3Y}@3wsQpRNQa-XiHo4{q}+(( z;B{_o@aKp8n7XRve$L+4e6%b|Dg{%4*LvSpk;kJlYab|F?xpA&0rrx~VDo9hJIGU8 zLg!j5kUInEotCDvV9IC*jE26sRuYjl+!dR&_Hm=H4y@{~tk{vnHAysI+Rv@14s2`v z2R8qp0maoHU%8`h`3RljnvVn3O2o_cTqgizQNws>XCu@=C2I+DKuK+ z4vhe7!obEc*5dAHG~IQa@QOo?`{5;fY)hLQ3qY_h@UT{fkm=b*G0q=vHx{OJw<3C{ z0+tJ_b8Ndc071piyqIo9+|~0Qd+)Zk3QfP97a0k3RUh1KRqcN*c8*0+gQpsa@tVVp zhfHvGw*3@=Wnpgn3<^AV65;^D=a+x=n?h;T5`Vk+FkoyKL$Jy>hqYFM~ZQHlmrwxxN@ttwY3So zlqR2`<7YI8Vp6h=zC+9M#S6J9q9}mqd5tEzgFO4VnwgmQqsv$MGo z=Us^^p>aFTcThim{5ZNz_yA2=gYWqr*75gJ>6pv|xj?qdX$6b?)NAXWbL5@t)KKXf zm9k5L)zv>^My_l-Ld}Vcp%(k>ZvKGhwT0x@1-^R8YT3%hIu4UTJ467uXtq3DI4**h z#RJ@^)_MJ!Y2(@L3+_k>T<;vXLMgHV;H8mU?ZiF5aHTQQ)^hcgkm*{)HkV{?UR-+M z4q(Em)5on!5A)fdKd+^2WA?S{fa?h>d1@lRLmdYk14IhO(J& z;~#IOCxzCP!#@LRL?)ZAfGL)Y?wpY=a2HxW-?O5OyYW-McXqZoX_ONOqO-#C3>O;d zi8w_`<*31@ywN?v@fBjhKX$15WNd)?dx5eYSmDo8Y&+QBX}XVvUuFrkyBgL%*ZVLJ z&cL9XIP{v+%A)VZ=`xFABIU0$WkOO5pr6)dE$>=N4*gq>avwCH{?1(%2Y=)ew*8!R;{Cq8M%=o8`Z^Lgtjyvj7*}h*Bfw>FG zx-WZ`HIuopu+ScYymVaby^XJOU}=(-mi`??yf{>K+<8)~ofs9}4@A&CylUG6AO+UT4;dFY!=buLV?fku5+XR_KhM;u1WLVF_s z$GABLe5v}v%6Ro4WTfC@Qz}Hu6q|%}Uk^KfZR(@<#)1#Xm`bv!ta_{bjj3^`M{`zK zHKa|WOQ)h;#L76+UNH&qSB7XsZ|&vM(z*hdiCQ2B93;nA+{c3b@$x1DDVq?UgF+%l zxMV|h_0CGvwR?vX@Yu&y&%eDl1;Mib1le270TX}c6E8M8j8(wGQPs*m`#=MspDsHW zTpp)t_!O%Ham70FOkPu7P8&T^O_$!YIacPBlPiF6q>V4vf)6#Z)cgDUM?F310{C?P z{3qBSMCCvYtccZi!~LwEL-oW)U*F0Na+rqauQ~F<5^=UqQ7PhyNo)Q}hLYoO#Jd{# z#E!`v_Jik59I26sdR7~MaLEt|x?6|Iff$nUuly$Ws#5v57d^2h;Q5?3`3#ik7c zyLvUNm)9;dhGYg%VRL~(AH|3>U}vEG6w65?5c7gVzmTSy@ku0ThaShQl~V)QW`+_e z;=gTA4Hv+R>Jg0skpKE(Qw{aqpnC?`MK8PMzJ13g|0LWid8v4)zDHrHf$rcQBvip- z@8G~gM_;Ce3RIiO7w*??X|9QYY<~$)n@cmks3iPu7q58b0{dQnPJ~<81btH&X?W!-=2BhWQ+& z#CfuPuO@c?8Kh-;LF&$z9|%bAIi1S`Oy52>(Qjbf}he5t*SeehS0hlYne^C7^% zPclCF;4)qquthTYRRMH~YnCvC{|rliFPx+vD{5UfvpXxh`eNm?XYlhg)f)O)(kgYw zGl`3NPRG$CepBE-2lzDKopiks4=(srdkRNScloq}bI6||OwgjTFlNEjqR`cz`ql2l zMr=hyuixRKl2rm{t+8$Nc?E{w&PXC)(HIqf^w1soa!ITp;1iw#fZUUVU${XUElsd5mR|pp=DPh>*m3TFBPTH57 ztJ-UO2c?jSN&CA-)(aEKdmqh;KPu%+>~|t2lWXz5eN5p-HknwS!{xF96CfGDV;;n( zYWN>WleuBsHaVLQO7-m{Jm_xzcUWo_m@uM9NwVfVY3m#Oc1zj&4aiC8{G)>kzB3F| z46M(P!O9tU?`jHtbL0me`eY|$)`ZgC<&NULq2W`nUZprK@c-Qfcm*8Zd#6oGTv<&o zewauti}E19KB|>{Kdfqqm7yA9QFvK{o;0^vOz>L1s56G>v`iwqXMkUX1Rnt5-^K{f z%k)+W#d!0OhA>S3)J{K)CpO4pz`N)Cl8W*9@Hb1v7WOS zfGCY;j!Ue^8Gip{)ddzZgJo73t8#;;)m)u2>1i~XU!~K#SHDk_`Nl;Yv-nE+b0&>$ zrP7HHAQA1&#xSI8+$goeEo(kHBLZ%;g+45wcBR?>`y=>E$ z)(OAj%^3AqAj_xDBU;u_y1%|nijw}nGv5c$0bl;RVbi8NL25hMIxH88KV2^CG`q*;6_xOY}(tH~_E=Sx)~`|usHLV;nYhf|yAvE`9Bx^?~nCsgd&}uN1W#<&Dgv+fabLhd!&WUM7VhefL8; z=mc1Vx18U3oaU!3xH)1FzW9ifl_pfyf$f7%=>4o1`K`;tAd;6fd(1t<@V`Qj*?!{x z8cji_!^Ao{a`I75p@zt7 z`+a`PVIkaCm!bYVxvlAJl1KpTZsm~M*RQJ2!WquTkzY@BO;oSyQ^Nx<@@O=%IN!5iu!~ZQ)jyi8g02W^e?;mEu$${lC&l0 zQhHmK$JS+MQq*pZmwFClaA|yNI7&D(Z52MThcaaxjjsISi3z1dPwTuP=Pb$6AF6AU zL4Q7bjv!s(F+Qx%lX-K2k}~7;Pn%^99g=uzgEA}roPEAf%}>_;jXv_9Y|9+kDEjkAE?iVd6BErmRXmu%E3py0|3*I`IHJESWz9?m03cfSmvTVyX z*a$W1)vL`ayAOiWleOzoEK^rQnKjK;B6D8QKMf}3Juim3o?cSumU9N(3t% zG%(6Qr=hU4)Fr{=+)e&Bb#-;Iz|8f*ocHIB4^{fSO?@!ZFYOfg^ zpu3-s^(C%F!SrEJj_F2T#hd)4!$%Zx@?0-0suiDZR$a6~UzV=^l7BUH`a9p`BlNe+ z^bOVa{xv-uOzCY*3lj?tKrEaIb$S9-Z-7!n?)D)(L zx=)+#Q)R7}9e6EMwzcIKC^)CG(dQ+f%YC+)Nvn1VbHBt|lw2atS4J_7gZu-}`)8^7 zlWir_)9COS%8QufbIwNvAAiW|ij&Xm=FNsGj{{RlG4crjCSzh=-p_iXAI|G3X46aa zU~6C)6|e9zF`f`sD0BdMTB4J~PrLxZ%afFL+@3?N-1A_lDp z4nubjAP%B}s0`iBNOuVD!O!=1y?@B%Ma`LW_St*wwbs7*Y>M+@Hn@AE6WzmjuOg0I zj?vQ6RssJQ;w{GW6qD}Cg-tVqvor{GD|2#asHoDyjMgR4&bH4yCep;F7+s+);EI6i zci;SU~oDzsIHB|wtxO`oogXPsKPls zM75J}QgM_K6k^;gREMzIVI*a0lq$bR(8ae+%&HOSmkAn<%9!~gFZK$|dWV`wI^LcmLCYoEzZ}$_ zvBH9aS^_9Ov)aP!Sc~zWp6-cp#!7s|vB7;EH@D>lMZT=lQs?Oy$7g~a;56(MM(GaN z84H@FU%e6&VAiWceQ#CHrpCHi)x=yoXCoU+$M1rZ=oq z0P|2!P%Lvd6#Mz=>u)V-m#v2$@Rh%ETlhRO%J#Tp)0;V&mTBP$rVsJl)x{+M4H#`c zqI^KC);noyYwKUk^eZ#IW8}~@gz`r?eA*QK{rD%upV@yIK{7_?VT-#=P>nT?y}3>k zyRJ80gG>HGmA{mSSBN~hEb$?p49UOoNMDdRFff2&4bBinpJrtJzQMYt=-cqpb<Wd*t1IrQw5-*8-~hTbQ(9?MBN z-9`{Vyj&TWbhW1TNR^o-Xl7B(op;O#>&yy1WcOINCW;iiikaH{-rp5O zlrIQ;YQ2m82iJZmKKe7TSkkz0a|o$ZMpL)K1OHat-K%baIlJx~SciUQ&jJ8R!`0W} zIsUazR$aK-=IA)2XvNPY&rkRrKZFevEn7HMDNb<{Zdngt@+ zmrdM}gP|YogX)tg>@0)-iG>vt=t{LhwX+Wh8i;jfv&N0QvlaK2t&+b7ljB#Qdw%%a zR0T%1ZPZMoG`1h%w=~cnqmOv-aaC1S3_#BL7BA<^SXbPT6dOo^r6L=!!$f_66b0}_ z%gf6?^!E(ZTE_WvysEI5;;JBQ6zA*vwx;RSyoZlT>>9^UdT!z6LrQhkI&NdWz9~tj z!+GiNQ%AKsU!OsOs{OI^$``Zv*^>(eaT+^5sI1EFUcz#W?-2mH9sKOH2`Q=*fd!dl zwj0b@%_gBP;fY@64h|0H=!J4yr}kX4Dz%%K(W!M`htQt4OriRMo{cuib!wb$|LKEe#Yk#Sb)-fbEb z$_j!10*OXFj@A_2APfFbChb1fXzS&*sSW+fM`VR93BhiQd&J8?C8BExjpN?2pBsDn z4KF?OikpMo*Bft<%h?w6a7+Xl{~b(JSn>U?N>Lje@=W)2Nq~GTXQaPjZtKCOJigJK zC=z|NxTuL=AF;^Pn#v9oc1l{xETVRR-DrUh3pWP1UKb1L5! zM&z$}&3$_iYP+Tj2?VzY;fpvpIGkm#U8|hqw=f@&e7Q1Do1O&Qi9FAqoG<-W>B8&V zm%rYr|EX_kT9d*?eMB>A9WK!KCpw)gu0yL)*txy7L_l-KY`NJ?AswNij0@`&SZi!h zKqAj=44ZxOWRKO*W$r7KEN5&;I4;igxq0>Vkt7u%SM8N@(7|3;S64X4UOGf|xa9Sy z23(oz+rh>`rK%+tLc!r((YV~!X>)j&A)0r5V1R3Ncjfre$g!)EC5A!(d8HRR*TOvD zq;-8SKq4=CzXD<0GL=nVqNI7?pTx6ynOB!J}lsUk&$j8!M zt3O5XanmD7D@`_@9c&Ya>%K?%>OoV0>j?u?#EGItGyR0rnqKn5TNdPdZ=*-p<2o|o z+978w_-E=(X(d$%1nV;%>FPW@JmcTiA3q3R{FQG?Rftse6MkcTYlHFVp3UZm898RY_`$WosH+@xUC8h(&3CVda{;+<#mldOdkn#*1 zd2V?6&CK-5kt1gcA=}ve14j_B7YT$*$YRopK;ovHrzH*!X@_Rj79Uo$D%<&As}GW6 z-9O%#o6BRaqZB47ifbzflqks{qgEGp~fV|EJ<^urhYFbjahKU{7K?X5Y7N6 z$ECO3%F7AXhI@BVqc6Bo*X*-3-u&Ny009;)LnDX(6k6RWDC(8+5EA)4<05LF`^qIF zwCk3Ukr68*$#Q<7Wo%Y|V2A|4wv>WwLGy zL*EIRe&c4SMjP|Krm<$tDaR}R#7$da_BU@zyk4*f z@iLz0NYpsvk1ZjSBg4xOb3AQdz=hx5U>W2H88h;C^;nK#ShLe}tYEt9}^N187>p=(g1sORG zU=#uV${vs>#(#_YwAwoOc^Pf8@nsZpeRh*NGi~tnsGDZjxQkw>PUsFSoA+hK@W|*( z(DvSck}KC81Z^l43K|+1tPd+@y%Vl04oHLx&Fo+6%Uo(ICUt+?^a~W?PB6J=>@N06 z`3kMoQvHf@ko&kbIHqAGhij9E9r&f1*gZCa(MkxAZ`d1cj&G%nPQ^ zF6I|vlOIBl3eb5LBUor7s*P+r1I{!2@}@mH>qH!V)8*Jq*?0X;04;WDRo0tN<6SRz zKU(6u|6N!09PBHtPzGZPj8wWR|2famuLB0JdB6sw@b$GNl$-p0L8@|yOwOETcgSxik$RTD;&xNbZpw~M#QFn(JQ?UG?9c^dE0>|1T`;Vq)o z$uawa2u`^0j8J9M_2f$vp$<32Zwr6I^G&TYkqU6I%Oo=nTVyhyWF zVe91dj#N*uBL!IfJ&y^qHZq*J-H#@P9tZP_#D2Jx8T)I-@D=sV7tX^TabDaPC`9WY zmKLHJMOD<2d0$zT4Hq^=Jv=}?Y5FmrH#Pg~ z3MS}IIin<3=KNo-h}FFU%jQ783!f7Y#&G5p-k47F2;~w;<&}cZBN3kiS5_Pr$+myq zr|v98un0Cp&gO%bp99lkHou^`U8*B^wH;jM-~IjWbQ55>%irLRAZrYv$YJm0H2YERqL#%3 zBa`S|<@02FHrQsH*UAo`<3(r#TW4kvHZt-hJ;1snk%JNYCToyU4cPh~j-y7(PjmJv z_~P75$fc*J(dF#+vYx|m+)l(h}piD6q z^J^a=R8lpvj*K^=D2XxWs;OXxF$BSea8j;!vU8_|ArsD|-6XAdYzf`V=U;LvXf``~ zufRbqWP!Gc^3;&N2%afTR#s)Q{*k;-21DxXR7p}_U*EE$Z}2!x#Px>C%1TA1WE+Uf zAtRrf8Y3mh>??(`IT>WAphWzBfd z`MUuXu*D~ofIDN{84l1(Kj|}Kc_Tk6<49w^vD2{Ep0)DHsON~yg;+fNAX&(jq0gn z?A49~95{eah4lvqqmzEa78y37%k7gML5O5C$JEdxH+AP!_g&o5EzPl-?ow%lC-fT^ zd0r>~*CA}L&=_(7Ju+?es*|!3K-Ckcd`aZljhn{1Ro$v@2lYZjqORw#J^wQEj%as; zD=vO?RUvCh%^;`~JvttM*j4XybuEwmGv3hN z6*?<>HZ^AXCeF6X|GPzc@R-lq_qfZgw@R9uKLRk3Id3;vAu$nWlbJ+yF1St7>4CoS zi0@Z7xus819zB1Vwna@~qY=3CM>AIgH*;^rHa8>)z(j<|dqJhseM^;+L|uwUs_W6- z=2G&;wR|2wORI^{hSvICX;3`Uy_iBO^4d!UF5Yj*@aR|0{2{de(wU|az&Qp9=FS76 zeWR{=B~DHGcOTWbGtv#CL;N|N$EQ~F89c|?lHSj2t6!pr9r zST*r2;T-h+HWXJSAQN!kZ=iarx+geuk>f~p8*XYV_l(vajZanG(3*6FjOlF$D8R69 z9w$ZL_GEhV@S&Z0j#I_p1L9f59y&|sPBFryoYVFtL(Im89IX8MPBsp ztE;`Q{n;rQD$r1FVoHksZRU)bj;~34=KNptSHE?(35=@b-qvY?F72L@g}+L8IQBx# zF$_&9R!qvgkhsYNi3g^=Tn`ev*I1zGXKZYMCv$J9a2@Ee zsqp5zY_m4Zdr>sra8X0h1{A&5hJ6&ovj+vZPDkAuM!P(*3}qV3_|640C<{Hs()$v0 zblBo22PGXcl%-LmGZJ@?64BI%T*Ng^-g%LJ^llmB^;zeGt;K1=@861spH@}wKa=6W z!Os@sKODWaf>RVKtOPN~eE3fQ8Ht^GZetZwj1txUc=H#w&&6Z73t;~_w29yoJA zjcMNw}@JJ=WXpmN+w>Qy~G;B%a3;j z`cAAmje}-`0(aEm;BgCXTqdZ&HQ~esI=qIr6wy(EcjUco2NR2c}X-mT9TEW$UHp1 zw7cGNGR-G<(AlnUZcrT8Sc5BS;sXWpI44ez%zV5H$IGsg zlfPn`&;{h-%*SpZ7N$+h1&iHdHBga>hl$U1i$*LR`TF!ru&^Xpxe+(dy#*|*@~xNR zlg@X#;y|~T5v|CmnyGiOZeL%1e*xj{D!n8bgxRA1Hw- zmuHXY=bYOT#H?breqp8QWU|rmlK1Y&iKK;vWsUDiQuA)YoeoimnT6N?2dsAXKupqU z!~3uD{LuKxm3jHi2a3C8xx6gRpHs@r#EI}e70|e9ZX1DCIT0Oy9pIBHC{TLUI&|K? zY~U+VKKj1xf0C5U@IbL-9gy$CqYFMgg>!H)opuyJCG!XUw~`v~{FUfG4>KZYU5r|9 zLj6~%Q={xJn>AGlM}F2YYS~TTHcluE_WN>%?mr>EkZaBUOEG`Pb{i}oY0G>K`h3WJ z-)icC5MPo2(}`=#u4bFmRm5oF&Da$mt$*f(Yrx^leWn)Cx3~419{4d6PrB;T{HtB zElsiwf18+0Ch9nAYisjET6!@b{&U|A7#G?}kMrs|+Q9TM^?%3zcM_o1vO8+5aTw{= z4#0A>Fy%2!69s*7-1vz(4*Y*!02Su_D0Jdo-ud?rDxCF76O-LR7G%ZdpUVB1T`@7S zRiK4xSe~ls|2XJvW1l&FS7DRC-+=OI5ObIXSTT@mL>WK=DB_a#-?D~w%DS)1@InKR zn;+3(+Vh21W2@S+@7}R7sqCOyc7u+8gs;`9D_8V6L{kTEHM!ePJzal0>T}Z0n>Y6B zWqsjAU9P08z>{H*^dgB7`31~hkG)o^N8X2R&Y9;uerIRJJGaJqYET#f?FWW|A1@Uc z@L9jUnc>POFkb(2aT>Z^2FmC*0|SEy$U(nV&J;#R-`CN&Oc!zed`+TShkK9Q?jSg_xNXEU0oeN=MB|A$KbPJ@6b@Bc4nY|#W0_?$0Acp-15acyjx|>n^hIEV$9xohM-D1Yo%8(57=qS zSEisL1oW!DopBd#21I-zgN&pxBdVK;&}Na;Rx;(9<^R7-F40eqkL3Uv>V^x~U-z`$ zeXGysi(^eyq=K$8n%*@!c9Y^R*y!t~3GW}5!(+Q{9xV}0hF9<2Ad~-7L1kZ(6#Ty5 z4QMRBQ;YLjFUnAgdkZNGfBp;su#mo{8ED^Ar;a4K%F~nit=|w3_6*V=>gzB}8&KPJQNb^yo?3hL6;PUwKkSPmI4=?eG zME!&n3Pm0;y3_Wxgpp*H_o3x6Cg4xCShu``FWXyXpHAme!lQfIiavrS3JpATebS6?uoC2Z0PIWb>?59yzV9V&0wm_>7~bXjM_-ag zK8%3Tv8>C85E%2wQuxOiG$#%pXZ9kbW9X8nsS3r5cgjB0iGSNB+m+`|n~fWU^P{Bd z<5>II4|WE;aZ_LJ*0`xSDOerz;+u3!yxS`XIW^q?q+QH*5M;Ze8_4}8y9tG0ZfgtZEzp~;cU6in%q@)Yn z;xGkVr^?j&UIp`dpSYEQQc-nv^^3?dN^-e&q{ja-mfu0H`O6t+3}kU30%*bX%%k{2 z;xrIc)N5!G?~DXbNxfH}^sKcLi?>;kS>3~5t4VS*ziRgsY}Ad7jk^<7zA{W6h)Hy~ z7auAiCXqT2bQ zF%90yIOS((YAP$uO#RKc&yV>vl`UiJX6~^zAd$YrXiQxs@z1E7Te}7QD)O4aP$l=H z&^ZOizvw6(p6dz$J6XRi6EkhZX9_sX)Y!+MPfyJ;WY2Zo?gC(Bt+kyRYCoQxwYjol zXKZc|3W_ie9baD7ukBNlI3Wfa!MgY0gYvJDk&%`9mG4U>EX)o4ef_JWzX$g8Nc;j< zyofl-@E@W|Ya~l%PJ5{XuN41TEq?-ey>$Ck;FvIoO!Yu#! z@3Q^zGqztGJ(VzNvPbn45F)uVUfiP;61u+4CXi&M7`A}_bVtFQW!3<5(j6W7ltQda zq;-eL5`D0t=pHK9y^jeQOF&{bVeIHu(P!T?=}wB;nud@NOBuL~FPLZ>FCkhUxw|yj zol59+%E4D(TTxEjgiPy!HVPkyd2k)=2D?ka|BR%5NvHK5`bBxl*k5*kbQgoz+Z|2{ z5%X{`*6dgYwXks0FV{@GntXIzwqFa8tYfk*2-BsI{4Z;Mn@osrtB321sN0waF_k&> zN+S9DbXISploQaWUWATSKN>gzy_Mq$vT4PKs`mR{M*~QKK;K- zG7f}Dwz7fLePNSrjwC|Xoln!+!f+XTCe*s~9giWVSOFFrOXp&FPAt zwPqstHm{WRJ?Z_+;KzU@2J~&jc4G#G9Gj}wg&v#xi76eYKE!k7BlgMnb+ChWnsx6B z(mg{H%M#Uor~S{8r)jc%jl|rZs++H;wL8}o?8y-+%NiB!`Lsh6k(=INu2iB7@ZxTl zSjl_3ppDO;Kg+VM@2SB9VfdfdvqE%G`9&^nN<<{(U|~tgxCu(4y88-wT(-Y2;@r5> z*|<@f>7Hv}9LvSdC5`{+9Xn?@!2=P^=e}@i<2m|KT;gUd40oja&l@CC)H(mRua8LH zQ^0h9K9Y3;XKzh`#X6fiFT9g}`+dxwFRUQ_-{Bfvf(KqVD`=UxEBU=*TWGVU^ z%Y+F@oQ$Q<{hgdP-hk0barJt(@Ehl=@FT^Ho6Dy=Udi~YADG&a&)4@#esOSY>oJ`gpvUjMkio(FfxOOd2NW1Rk>FrKaEV%2;mz%^#tf~%fMSju;ssz7=_i3*Vmz4nR zjiBi<3kTULK=RZMm2GnMPV!Ye<|K(Lb=a4^^i>Rg?wu6TeQ4HZ_h!0&MW{&qSq5N9 zblE0A%M`v=51mgSOpjZGvFUvDt59*b`@SHH@sjnugW*cMQ^XPh=;Vk7MnVL_h>^}@ z#>l#_PxkuzQ6NK|@-^-HA`=bYxT*JwxNe|i{>9Ko&hW&F5TIWDM0UOuoL;x2ctw?U zw{{2ft4Qh@pAgrPGUg$PmyBg1v6@J10)U!CG>-(aJd*LmQ|!*j`G#fQiklf6&c=C%oz5EGe#r!p40@ehGjr|%ehl$2e^xGbFW(QWlP2hIozAM9E?EWk0$E71C zwon~tioE`Whq{dhbv<3R^?6#{rN0vV+%imTMFPxjG50D=W2OTK!H(VC?WAp4rs-}HgKL~+Z{NIm4z$B`&VmA8O6)J(=9VP3zK|pg z$pWO?#+pnAp)BSH!f>(a>Cqj>j(m>qW#T1|%1QOB!fRwC#dZ$%R^Pj9dDj6JvAp|% zZV;tVzL>aT^SV3TMB@_;o(6>gQ%Rv+z0|10P&VPNze_>kDsM&lU+|gCIDp<_9QXxc zctTOdmWTZ{?xxb59J?y?vrxd2h{AMFb4jPdsn$f|(wL3>cQ<2cJQjG|8+-5ZIToA} z7rMgiNDbck2T%%b6V%x<+g2>DwpihYrta<{*3~#!>iK{AxFwNuNj87#i$y)k&@X}7 zw;oITUq+R#esK9Bhc*eW^#b$D3QJDOcYOH!nz{L0(sIz6 z^hIJ*3lI09!OD_dVL?%$!0$pfM#+F>@i*WbP1VhE<#TZ1CCD@4*-y=$9t=?Pp@1m= zzssWY-dbt3z*n*PC$h`qzmzX0)N7i1B&ES)P(=Xofzr=cM^~bwkEz#+9L0A6NWA;Z zNrVt#{E7KI7b8`y8%|x{Z{fD3kT4VWoZ)g|?|~iMP3-NDzJm*mx6^K%k$8LEloWN} z^0fvj>c)EoVpx!R`26}UP5Fzb_sHG2b%GC4E(I|FZNlV;@|3xwXaByxCH49(PMtZG z?cWM-p?dUycatcuB?`jCxOp5k&% z_Z3tkwU&8Q_QsEnFyp%){TCjZhY~riJSldO5i@j)Nn0HG;g_n49qms^4Sbi^j)bN1 zc5soXHOL;^zpo>*rU0<+?>_bHE``VU$1#Mr_Q3Q7sPQmFO-_pq<{%`{h${ zTH6G$yB*W(&(B)cOwN;lmsn;4qh2JXZwKN;9d;W?a7n|@*L@AV&odZbJ=X%^-H7s$ zZ3dXP-}Kc=+eJgJW?Z^|C>dHzk3k>@Rw#g_rNUt8gHCEUC_lQ>o^G_LoWAY&J9P z&by#K*2)q;p1akx&G^A5LPI8(wM^+aZQZ}rdy~jf4>k7Q=pFZif#u7XL$EuK2fmqC zv=J{Hcv}0gVy6GO{#6|Q$8&VSPVsJ?5MBZhAFL$ax@zCvTyj*1eTGAL3dRo`|cI4O!(nNRvY){02OoQ&6_tSzL`E( zW3wybDa1s%R_sz0tS|AzDK@`(bd|u0xyx zsX?K9CNHS0-e1>L*C+;b8DS6D38stGU1#c7<|kSh;!7lI*10tzK7%+h7<=+S=8y;M z0dbJ%tpshx-J}ith9sL!BGoIv2Yw;7nc}W~{H;m6aFkuq^miDt2UoO>QB3qz@wMz` zcjT6oCSk})r>dx&@wx1h(~o9<8j!R|!p(RkoG??ZPDE^E^a#Ce6FM=IU5Q>nla$T(s&PiqP?mMiOy5#pK)Oc34FEkphic~Ub$Hi2~l~1>x-Y;*tgN8$OXZeY|vLYS#ifs$#}E-B8NPWvPBs+#OMJOg5q@QDX%e3T(T_Z!U8j1&TQ8pDJU$R}&4Z60t0otuqxKa~D!_W_38u&GQ%^?s0L z4c)|w9N5#r3roAJE7=_X5s#h)uex#?h5se%h_l+}0PAkzm}JVRh9K)%G5iga`SGxR zfH*3M7ou;noLaI+}j`Zq_**Rx(Cf}AVAyvc4{i!H`>l8mQs@&Rl7c0< z2~41_yF)MkF@912qPvtY+%oQ|lv{mCUHYLZZ&rrHtC9DwShqb!WmRuK}n zebssG*QU|kf@q1IA>)Zz5R#2(Mim!}%7sgNIliM&WSBIKkG68G9v;8HX1}|w5OsB#gqGP1Ip zeCG@pQ?HlZ3|&3lfsVGv>6*l|v|xtOiBI3!p4Z{|`o0JOSnsvzN*mCL48ab3*<8Me zG)w1&IFNgU6Xkg5H3@HgCY^o})dKUpf~0Gr+9AJM?R1m zi5Ic}w?2b-Ay&;ue1{s72jIVbYb>qkP9_?DLV9Q&b33+z?a)xd(&W&usp%&upNLr( zWsZ+v*Dh$RoJxPefCSLZ(UmzhLqdtdzxOFMXIcTu7(h}Q(Ab^w32Sd~WUn5l*FFxT z`8=P`%hoge71>V7ByL?_`3tF$tRKCHtt9~1%??H@PD^4{@O{4a8pCCm2`5A1722?I zu@?a6n1QKC}MpwRfRueArf1`2N}I@+E!iC`0!RDXvL z8WE17y*LfKBZf2DGphIEyJ|hR$`L3rT6ShBbw_$Po=Whm^T7p$f+%F=q^`kBrlX;G2U9+pqNYJKch<=>1pK0~GcUwKVup*y zci1=Lkti&anf5?uXm&f2JT;9=LHi(eN*Ld2pm~~8V;k*-5VHx{qeytKPGwEa2@M{! zEdWBw)T^Y=Zt_y_D9Py*4Z7}}0mQFk5&*%X-lB%pS51S$ee+r)$AULYcc^=%@BCXefhF zrErP626j!A1IW;m_ZFsLenk|Zm}{2xaoHe&HclcqL@6?TE(OZOUM}I&PxJ~NOH{fI znmCth0xTT7r+HE1cM4Xwq8q}0y;mV&5hbj3i-&tGN^hsk6H27YZS!}c`O%T_OJ==X zWW`#V{xxbb_`BKfyhcDtiNZiWr8yqf*!=-4f$1f}Ppo~OLxj15T7fN%U%8s@fb>Hs z{BP;^c%89maws94{7N8v&pti(9Vl+_TTU3$G>iPTq}$GmXYOtQ`{_fz3lin$)`o_G z$AkCF*Sed;)UdlOj@m z&BvC@uU6)OyArfDgUP)A11_qGS7#$Tvp{QXayqJ-#k?O&sy|62Opo*@g5ev;wh;{( zyH$7Ve|ve^x?bi_y&L2yzZBdVCTb@1rxZb!)c7SVHEmIJpl)bb;Q~CKJN0eTu%*SY z$4R^1bWHw9MD@-wo%^sZZ<2e~u2b~PN88jpv$M4(+%IA0J#2YqlRc7YQ@M@^Q;G6Ocu9XJV!C6J6)_&3)3Hdo>kl$klGto*UM>Y@`_6;#9}|~HV2DdbbH&9IC1^V z5$)tUCFoO@P_GE-`y7BZh2um@XjbiA-3iY6}5n ztoV0CtaiF2$#(lqkJ|&=1&rzJAp2!a~ zj-X1XoX~FfE5~Ni+gd#mNO(5?c!rb3?Tg&w^h3bz0%otIl2ILOd;}+uI)M|<@78tE z)TBdu^ODXa~1S&pz&>tqq>Xqj!Ahv1V2CBZG3bElpZmK3w$M<$fyKIXE}6 zy8**Uid3ZbdJe$2R)w^btK@5;0B)1Zd994pwOiN~V4dfXJ=8_|eGQ-wNG|z~npnAi z?P1F;S#a4otoWHFSBv2opyO9sItzQlD=nNouEHN>-oAG(=od1SZ~LmB((!^p-(FW* z;-@4DBvJKj`o@a;-{SU&9W9^Vp4^~c;yR6KDLr|A z!CtDO7qlixO%#rsMlFIvI)osoIPk;sUtr)YtkWIzvSsSGZhbwW-@XAd6E~t^PT+?J zjfeHs*WyKI8v&PnnD^_!3R+u30~J|5i1YK|fKaBUUWp^rewh9KAH5Lp_RW9yY0xHn z`R+Q0<-I?R0+*Zi0t27yT2uZ__el%EWLfQ4rk^xrO-HJXL?k9&S~c!7;-8o}s%U+_$2UgkzF6w*a0WSt^j+8ladpAQ^u;gSSg}!U_h}F(1(mj2=p=A zMp;`&xPMbQo0Yk{enH8-BTBvS;<OI)6n$w;I;m=BDMkHEja}OOS*p>rw6_{U~YD=;dlRJbol)2 z>;RcaL>Xqc3GR6Fok9Fj0>Ebv5<5Xd@%C|g1?AxnTgg3RC{*#o*{f8ib#M7&xc~q2 z0ZN9gLGh}FD5ZQ60km90L3LD?CR@yzp}iAnE0y12?zss zGP}&LB0?y`m;^}3Cr*q=B@+Hvx5>+AMo*;wN+LX6pZ4@@%rQJnoMtgUxUkm63eJI1 zV?7jHt3bA75>9ICiYRblmse5ACvIv&DVyh=*Pa5G#I>tZ9JOxXc_(Tlevk!F%q}=G zXrLFVdgW9RID>sxb^()@4lo9V@UT#*Id~^#Ab6vbQ|Y*eg=!ABCoQfy zW{2LC(mXNEM&#fdfHb{Pl$$$s4+7T9t@rrBy;W5BC8c}8p;Pq4p{1pzVL;j$^d4@N z&&`Q}{{o3v?UlQ{U?~1JsFUJvzenPvARYzW3ktFFzAf0A$!qJIRV(z|N?7jkS0Sue ztY}nF{9wb=$G=&!zSvSFk!BdM$v~UmVJDmxbapiuEBtiJkeVO8B$xI{r z5+rhpx$x>Y4~%LEuk(48aPzuD-tcaP&6B}DmVGHq&57;XHKrKpMqV9?+*8VfDYqU{ zw)`%sPn85EZ*W;kUDW$X*;8-iCip1mGw7vKvI+hE zqD(Ow_Q`NP(8*3eJ2>#KSxq=)WGNEMs4F!QOhEVR07PWLdve&w;CPSPX@oJr8yzxW z*b1Bgd!02naUNO|HE-}{agQj@`Tas_!uAWK7H$!EBdrnPt8bKMZ)FkUGlI&KazdKp z)i+86*Om;yPHV9nn>_;3j=szj^Zgh{#no@kvdBa)B<5kbqUHO+Kc^0bf-Pam3nahY zJ8zW&!q8{Hi+9nf+(v%{C3Dz3O4tM*_!CK13Vf9W@?^b{<3@B?+q#jn{=XEbi~mG3 z?7CeR#aAi8IN;L*f6vXE4BIW+EpjZ>>1q5sffc&X6g381yx?Q`Qv=L2c(NNlI?1_3rz1UfS` zOYcGfjU&UNMTc&TDk-T{CT1TMJS+`J@<{JD6MFG3eTh`W z!{~dQdUrO?oE>V0_nUsLQ`YUQpP>HrK_+Rh+E4p?+XJC2RNI>)Io*AwY`>1IouFd2 z)L2?1jwkx&9pe(Xxrje?Lsj#%L?5SL#u5WE^ zjYpGdEaBM1<*^R#YKDOiNDv}75a;4z$z)rC*4D4C5>pqlpyFL?`$;~Fj}4nlV^K$D%Vxooh zXixiCJjpk)uQq}lJoRJ>!)ao+zUV?5J^B}a$#^ZSnXR}?SFY`)n}Sy0@NWYX8}rB4 zSya1R(qdQtp6hfh5-S+;xTT6U!TLv_+b07jq!6Am%($jdubdyEBua!RlpIWYsu;ns zH$MGRJjOhVyl<(mumbY@z|uVK=pW)B%K9`k_3y-U5V%;EA~xtLGcCovJwrxd8Mz8o z6e%$J2HSRURtW2uj9TwoexP`4Tjh3G%rY+Ha`2n=4uiXEQvr}v+D(mIaVvx4tI~H z_~|Lax}LcF$09$paZD7XcD@tqu`R`t%79K+6<1^K+qIB=!A3FWJnB)(Nompr)+1;5 zHZ(x=$SFl1JSnFYNqAVvVX`?#dGE(@qyGEGYE;Wib=Ub%hLZA(=WpgL<*EKKG1r91 zAIAMhW%g)PRU_pczTdDopo~=SqrQEMs5Je8nB^^0grZiN)0+N1;(AWvnFBh?WlTLOvc=- z^yxe0FCEcY;nEN11dHCm${|B_j59-pv`U^9M5*3dmH?BfNv6FJC zhc5d+7+6vhq+N)P5c!lOJxn<~oRjpURAYvY$PlHlVDm;8Z*0OYUML!vYFu#9Og;Pf zIGM^MfuVIM*nRwE?Cg5b{5s=AvkZwAYadd>$Y1^voz5|#e@{;R%~xv|aM#(SewNY> z?1mW#vdS~4Vn3O)UBsq=bE`4)A&WuDG3&XLH&ulq{zQ# zfC}$pu1#+Kb*kfQHg_$R5o1VIn#4!L?2&c$A9Wq|xxQiEiN@o?WQEz_4|evGFYP56 zSo_AIVa8IEyWR+pK?2U;`G|b5Cl1=$+7u`6HBoh1JSKe4bOgOsw;iE|TQ8)|StyQo zYyZ1tPrML1DYp}l7~RN%F>~gU`+|ffJx(izkZN09)`0l&97G1S z>FBl9rv>!0QaB`jvrz`79KB)ggj9O*b@X%i&)vWM`3}1*- zfYxMhAVd}J+_{qkTc}zYSiNM`q||68?v23sSo+Y<|KK=X4SZpafGG+n5{nfwROmp$ zpl98V$zSe81zEbeF(B+n%MCXCIn>vaZ5e(~LE5Eb0g)0EDWyX?1*t_~5fKCdk& z(ZMNanQ+7=xpR{HC|*S2&u`1WY9NQD3V1fr#iyTuiQSfY4OY1P_>d05A*yGv73r_c z7#%Ps-ppHuPUl-i8lzJ&?BZbK4w z6s%5W6_UfXys|Quhm9F#A10{3lBgN;{#{B0ULJLu5aj2|3dun>w&vrDg>9sqXqIf{U$A5m)E=*f==d1pNwjaUdDrcncd z>|}h|G0a`b>&KPZADHR{UIlL3*>E{o>9eVgGFGy!Sy(ZYGFXR?OF&8w;!%V&SzQ4e zk(5i2p=O5L!}}+hrq`+U17T7?VF|~5f72WULmZN!df?Fq#WI|A_ilcX{}@%Qd~dRH zdP}sdELbtENpG*B+&2`}5lCf9OiiQxw3x_I_)eSzFos3L7n08Zg86^P+!eY0ULCjD zE($Aj@(WH4*?MF)8_8uLGla|31CLMOhO?!zMnyh ze<%v;77Su=lCU^VGcUF*IGZVrzFA2{*@-CnHZZe-t{NabAhJqH1|T$d=mnyQnVwtP z=2_ZmwAQRRa~WnAyiI81`jkQ!1!tq!^F*_HK}X7K%en9%KUEng_A~66bAbO4n(bh1 zdkx7L1thbOHu14Ge&3)Dy z;=Ld|VyP|b|Ic3DQ#|=K5C94BbjDe_rCFP-v@u z#mmWI8id;5#Kf^9L}{3vx8U&ED#rg#s=!Q?5?HquUkf+(jPXdBF!!()+%DqZC*Kx= zS7#x^#)WN2tkt*+2xSoAKZ%*=qFU!f($XYKO}mv>IWvEXT)y?A14uOwYIk=8;vI&% z(HzTcnwQi~jV_=tkJxr^w?bQsrJ6i5d=rQnZCZ73N~*QU!(A8V#<+i#rSor8yja{(BXuif${v?KuY%n zSDzVppjFIe*xmpODpT|B-JoeWy}F~LW4vr{1@ya;k}op@>9-aacn;~Ry-N@?$%3=< z8Ao(`^CNbB7zhyJK{(%m;Ne9gV+dDBhZehf!X+0v*FK41hIX2wRJ=IbvuY7}8a1o+ z&K8fgiKc=lQrBVES!bSvG~L<%HXeLy7!zX88HatuewF@4?7SsuR?6^4Tya@hQ$Nr* z*No?E86a7WjecBouoGdlXx{scHxVK(X79aUqpk@ylppb+#a3gNikit|ckoxA;k`&( z(S?ZAQp!ch7t2^&r>0?uf(VzfKIL`4Sz5EZGkl?a@Y~p-HMLwH=I;Ba0rw~Nf5Vvw z$Da#7ma&VY{!r8NVBf{Qkaf!`weHa++s|ZG4Qyi*s9=?O$4SN+8OuI(=*xMSaE?AG z4dN)Ax-+SN1#Yr2eLW*0q-)=$x_%u~TWc54A;+-jA*qV+Ka+`O6m@t@Dag$*V=_!b zOgAGTx^=)*roeZRG1^K5djy;}?(M==O#1Kz5T5)tKJJH)E*oZVqb@uZ=Xh>1H~Ne= zx;>Dmm^XmBSg-y=RM)pQj?EFV)u_1$>F?=5Ce||B*y2Vz4^pkY(YKB=Vu!O*ru&bm z;5CMtfoEIw$GWP+b>&=Rx-XpF@fy}L1oR~7F&{A52!DO6`@n-~9qOMtt%NMT8=88| zPmggrcP*zR-lLJbe5+5}NHkwm{!3+0CYslA_fVgZ8tpXd&85X|7L95 zM7VMolS^>gSx^&cFH*jGN?xo|g<}qHkGrvu51i+)va6b{JMUZ67A_65hr4lYS0@b* zQ<;T7yAF0Nj%1ZJ}JyUOzYPxi(?-)o+)Id~S3} z`opR>ta7_21KNg)(?S$gcKQleE9N)gOP#I@@jvWvORwGTeltxq)BO^mRzv7MiaD}7ceAB|%0Q|p{Np2k>wt#%{x#IYRt zzSZcMnLb^|pKo>%Joy!v^_;arAB#};?!*KaS^~&|DO1HjC3K&89evn}J4Eq*T*P*g zX5JpiD8@5*lY{VJ#`_2n>%p-VPoDUoS{=dslQZXXV*q&|+D0=&SF^iY;r#I7Z&jhh z!$wpe6u1us5i3%9H45Uso7Qpmzusw- zmDzdm#Cw?%Q`iB!I!nPS6G-&>OC7y^El%(a4Y4sd=W_>=hXU88E%G)4aWD!d0JcP9xCCSr3V)tL=0;(ncl3{e~ZZNx94p zqA9kA?}}c@=h0}#o`JX&G-j=DGFIQ2)Gh*Mn>$yG^ZPmE{ zVcpyFd)@VmG`G^no;);6x$I;vk&?=yZ$YPVHGn;*pQP4_(}$T4B4+j5m&l^aDBsV}QVvla`4eq=TzB6U^iFzHld112#^qmDOeGjNIC_;KEa-0pF zmIZ|f;SKfWNxY6fk9MW1c;U25Oe(}ii&}tlUp*shO+P~h8%$hjj^BK@#;I0%T1>0Q$;&>iwM+}JY0)DZD=K2wWt!8LN(hk~m~ilU%ZRR(%s$Nc^kQfO4~rv(Td;gg)M)P?07 z?ttjXG*HyZpi9-7-lKg8fSb>oO`oMf?6MSz089si92Is`H;^!&EZ+P}u@{ZbZCW+toz5 zN?QJB_9v2Wj%roT?6x$>T>E8Io{u|Q$Bg6Nx7e4YX|5NJN^H&Ux3FFcTHb=7Q=Zzm zBxn94%J})NoJ;;?eA@}IM2i5qV*JjQHxoMSlOSO>wh2J*wFiBB5+QWkJSJ&z1kb+Vz<$s&I@k!^oWq%NfpLE`Ov~!iv;zW!DMAuVXaVO zQyFUg`=;R7{{X-RpC#>_bU;L^aG%2=)}Z$B<_HSdSwY6>{XV7+9~Jbq)ui`D!}zl7 z@B*MIsM_bYItUJ`i_1Y`&{;YaWmq)$^#WklB0-X3O=a%@hMd8tsp&EC&Mv z*rJL`F~RrvZK=1;dM{254}M1v==w2DZ4HmiQh7~1S5es{IPA7*PmJJdwuesb{TP`u z;(yOP>-zIW-F4OnM2BP^e8dymZ%~B&aY(m16u$oJBT}>rq_BqaHGSOf&X3-v9+cH8 zExec-@YOhQW&F6dNzj7BO274N+H;1DD=xl1u10BH2B%LPh!Q{%&32Pl)TAIf$QeWg z*U}Mn#}=r@bSCsvtIUQ{Yis>oBTa*$$r@^t& zWfm|EG$Djhz?Bxs{k?9wWd108&9Ic1kvC!nd(=;s_I65*em?>J#Jy5ypfr~|k-VhOP+#FRtyzL81h!Z%nTG~X8;)WvVC1vHO$;VfPPu(7}85T&!{Jt!uT@Ah9k>tEG z^4yGxnnG(p4!J=05s?Qf!c`Y84ztILziF7LIX9`V0WyaY$MZ~+YvTpIpmfdRxdN_! zV+8^D(@YG)t7UH4^v`(VZ~HW-cPkG*5Cc=K5<$0WO^!Wcan8$ z!TKy#x{mJlk}o-BY`y5g$0LUvQ}G}%Mlo3yvgfbEHOQ9cU;Xyrp8r0!fwd9q^xVhy zGWsU*40)4wy!>Sh_<+UUo%bEU*3m(_P`R_L04lQfJTkKgI_JTu-`zUsgB&-a$QExd(8#>De3-6=peM*!vSNAkN5 zwK18n8aRr{V;u*HBs0iBs8LWjgem&L_N zrcKBxDO&df21kanv$H8Fc2V&?oJIl$(Kk*8bEa~sapsOzs*;NO$Nj($HYi+)fp1$u zs>>`sE$feFLaO}7W)fV(H;P7g7XG2Bc^rq=0b^Mn8KRf z(AX6#i2B_?$ZMJz37}`n0n6#X09}n4pk(hhAr7h+9NzTRdjX|)OYF%slfsii>X)p+ z8R;M>aZ!gvO1s_1UI+12&pQ0|k%=z51Yjr*4@uzi-~I){4TF;GVOcJX8NGP>HQc_NW`^zjz{|Cx=pu)#sKIer_)wJY z%^P1uG71IQ5Ry0)e7XMB@M8a4Q_rnj?uvd@%>I_9S*h_h-|mzS-ZMI`j~wG^A= z8wgUCM;0ysjX(-#GWS~03YK`TwD(<8Y4vm8gDaf0Ht{GD_B+XtjddJOEOjUXfiO-< zO;r&+&s5yw-w0;t`;_IrHRuaM0c08u`UA)dOVq?pe!b$=3rO4V4n3i&oHN&x9p-)$>j z^)wF$jz;LYQUceAo-tr^hehvQ+z1|e=TvWvo@{@{E%c8&1`zYq#a=kbA%Fk)P;wo!+Zw)bw%{BZ~I+RI% zxwbHG5amjQ8gc3KUK$?d(`+@iIR9`6dBrCNMMR@7 zXAbUp`|*fx=Ng1`l~Jf{E6tYB=(yaJ8xi*FRw8*Rf^AUO0hzYMIoc%BO;BdRq%CsY_rG`y6XpRK z+?9wGOcAr@2Uk%_ssH994K6cQpwLhGg{gHm=#U4j?JTpaBuD;)plV&idSmWe3J&HOu!ks)M=9u{%6+0O(g1xJoT$5fQ9(^X2F2 zQiX^Jp_}ly@A@W&9xowYrgeH-F^)Eb5Xw5jH&?#Cz0heiyHzC>Q{6AVQ;&6`VJ?5D z-d4&CM;VqG@-0O62H54&5K_1B(Hw28l_H;MFpV!un520IIDH z_CoL)xqkLNckCytVFqdSIC;r0mQN0s$!MYm$7&I)`YQ9LgSythJ-+Pp`dL9njTjfp z@Y9S@??L&HLUR&Vkmk1?qzXHD=g&aHWjDojXA1Pzv%INJA}Yg&i4+uX;BR`ZzL+g^ z7-}ky)8uOr#*WUY=6$UK1u&?|owBQ4F$A_2cc<%I#No{@r!`o&wBnPaf-S(=%V6!~ z#nu{-Kc<7etD!e`HpE_Wx7~$d^1uuVo+P- zi;%0MeiMY#pOclX~_b6{Oqgro&)Ufa;z_yqP;~-T_do40vfzyI5bCFEh;C z8$tQ#d`Cq5vf#(M`Iga@7S6vqJ1H1gKL3Qs9mNelyfn6tnV0Op`F1E(;z0-ljegSR zsF&;o4?*L`1Pe2pA=(~{xt?8$PaIRZb?USBUDfpwEBRT@E74zN?Jlq6_f|xx4MEp| z7(gDzPDe*-K0FWNlYY(KZNBjpWJ0%gO^FK~+E0)PH+X!ZkE(Hy$_~_I)G-d&K)2A%IFVpS60eMKV^^(4nkMDnJbN8?+(PO4WzZ(r%gs3 zKJ3V<^$~MmvEw$7p_onKd*YZvU6k(r@$7?C49SQzw}A=;;BdWhMXxiiN2Dxv9r`l6 z8ep%2JD)U{5)A7RnYx@_l% z%w<4;OyUPA)||lBu@t_gxFHtdKZ=>Rfp5#K5@`V-Q7)_&{Y>TkJE!7E!yOp#BC03_ z?Q$HN%oS5V-wSk_u;H^Z8F6OeGH7a37mC>1+bg%{*(M?s(;z%!GrE)C7$xu`?W=J2 z`AKPpN{ZgKZ@p5CL>in9>uWFcKfM54(@;#&_1wTiJRlZm%)?9ab3wZUOgVvLc!Sz< zEK=GY)K0I0UA5^xlA4|6(kIrDcDfBn!C2b0(VO9yb7(;tWn2KeQL4aIg{K(wX5|Sw zyp;7y_E(UKY|nz1l(8aqK|R17AjaL2vcdogZ`O54IGl& zDL=~CbsTXQF8(ZGb%7g;4{m@Pe>7_I@NB7a6901Z*{ji}qC0CUBP(pz7bq$@Lz1hl z@cg@Ie4_6^DO6UR&7&5Yh>8e_DY;Wf?H$NK7)ST%%v^@rNZ6=mDyl*z`Lm_ngenn$ z@1RvJuvI@g&tgz)SWD*kM*DJz)^baOrc|X-C&`Yl&aL>$W<6^MYzT-RJg8K8wbnEb;zvAfoMH4 z6`SyV(is7;#_=nUT=aICK*L014^B6q;GkisiJ`uKWvcy$&(yTd!E_D8vG~5l+jCa{ zxf=k%h$tX-&AX3?^@S2Kmy&xpsN%X?hm6B%mziep4o-!~#>Yp@myj=UI2;su+V^ws zf=X&xR5;v=XWaTjWH$STz%RPcqoik1{(Wmx#Z2atE*SS%O{0eae@yU@xMepXVTVCd42|2HBsHH^{`BURzy{DR}ugl`7~ii79Dliwr{pIfPFU zC^8yT?b*mr?@BoJ#J&~WT$u%RYP_jEbIHIl8!FFj3ZOumBprV$_5!)(mZalmdggQ9 zB#(RPq9us!0*F6RQvz~{x28z2bGLGdmHMhxSSvoB)4RAcT>ntikG}bAk#@Rz%{yaX zrVnK;jP1}XyY#Ebx4Bb6X(T{5&pDih9!Pq*YLUsa(BPz0IpWM7bjBO~KHIuNI+6aSIHm|i?+%rg=Bi|i?4Q615Y&t>$1wR}I|Z0+Ub zbG&Y7Ghv*8GR;(c&x1<>vnQnodM6_2N1t&5-zu8V9wL{`WQ*=?GeUcX7nK-HUu)*! zzz^N8K)++t;prC45|%oY&WK?+xFyMQ5)KXsl&h~CXgt#{K?Ft}SfQuZetv!?ML4F% z0BPZ7M5(|ih0&$LU&OYc+N@}h1ISt&sDM3c$uydu5dv2uU0=uq_)^dBU6K3oIuT^G zs%V`{3h~kcYa3I!{;mXB=c4|NNna7aVv=hDHAZQ@El<$+V&x~lkU3?U|VpfC{(l0(Dj9bMp zsl7p#ba3|N4_I1B=>W6o*oEqILzqKE!aFN#4`2%!tNMrcj}bnjMsX^dhDB>X z@rksy3_#_D=g{7)F*x}6s(~~~G$d1CF95kf4lIPwUO=HgI4OoB7v=@_y4Z#;fxB4z zqJ5vEw_bkMq8B*yv4Z&zpsbW5@a!Mh|5Sk}>Ma}{TcLw~_z2P^-{SLA963oV6w{kY zh18nLFofWNYb1XC-uY4Eol%#TdC}9LypgupgmH%hrYHxDk}Yz%Yq!qntGjdR|O^=2!&}s1rHQ5_!$pg9uQPW?G z?JHu1T>ZdZASRTj)i;5EWF=??@wO2p{DyNFeTR;^<6)$zb!$D{A zX|)=A1xgavEmz`M+Ps&aSqTn!_MEo#?S-((N_~y*Nk%B&pS!TdB~g!kjN;C88gO+{ zk58%whK8hMk%k^ocvKAYhj@x??rC&ZBV|wdi=ul0{{YY182H$6ho_(MCZ5gtvkT=b zLCR@oCL;Pg)1M@ zo=xKYTLrYo6f?RVJdPGE~dCA9)bkhuSmGC{zbN9p$EX0ePUWl3x&cAlh~~ivmnPA@eS$HZy7+ls@R_5~0?gE-^6h|U%lg)S$HWsd|fRi2O-j#-O zn-Lx%F2K~94Y*{b5v6PFOWJs)1Yhq@CWhaJI_t-seYs!l0n)9NAi?()C9$f0Fnk_6@IwM|)(zh_8|j8RN{&&66|*9up#` zWh1)}@FrfwBAUk%Zvc>8%P^2&*$C?d=*DRu?`MRrFoEyT4z3c=?GQ7o;!5jjzKWPC z!lptcFZ|%)b}uNL>Ytu&!8A6e`c)>xfrt={p@FveQtD4BdT(Q7-=5;ee%PZD+Har| z54lQ+JLNL>zz52_(;+Sk=SNX=uWVyN(!=$+#EbB-hDo@E$q z8-h};uD+c1XlvH(lMO-fX0_@Si51!DIYzXkKB(>HEk0z3c+aG2mBA@Z5I5~8wts>Y z+O@xY)MX~Z2w-)Z1+e3gC)>xBw;?UY(`SL;NJ)RWVh+H)4|37VUqz}A&hXA3e0>6$ zb_55d#o6)h7m;7jU$;`&eA~$SB31=2;^Nua(@%Ga5yKz$&tNmHwJGsmPGO-T{pc_#hw`qFRPaqjJbNAlom+tpzwu?LyF zl%>Tw0*uj3rW&_}j{>EA1QDmu;$4mRc6E5VQ7iE*FeNiOm=Zw4@}%Di^oeZ0b1AIT z2cn~PIz5nS9M_#MDShf+TG36&YT6@b@f_vXD6k=<1N#fod}H!k-qKfP3eV(%5*Fb6j^hZ6;TV;myfOFj!OXAZS>M_5(@Q}P*mXui-3L!0o3$3-g=njpx+07gIk7vQ z`T@LXUdRKIuZ37KNGhQ>B{rbgw_?f1skTNkDU6J17~Fp{PXlA;Zw@MrV!Mb{jQE1y z=tJLVg6u*vg2wcM)Af4P?kS+xVUL*Nmgr5H@P-%NZRiP$~HW5vMz9&eR~Zhd?I1 z7?Blt0hBL{ZTQhmdI5~F1H8q3hs`a`03b-1q^+p`yoJ}7FJ6umdlU8%@`Xs8?C7+i zHqyZW!O;_@?&bNeMk#&+MJ8Q|hitH6g2UrZ0@7fmFGb= zQl07LpQqB5gaN==$e&k46n=;KPbCNtl)(J7b0W#M5K{6sc&u3us>1rXSg4FF&+GjE z3?z&&NKQop?Fd;D{Dq3-gMSG&Lg}+F#>}7HyWydAvue>PB~;-&_48+FX3tz&a%nW) zi<(&qYZmKAJh?W?9ozN%0nseguDV2MTgxP;50#4BhxumfBz)m3JW-3X*7a`%LAU5X z!zgU4B_x%KvzuF%PJ=muCWhF=)QG6({)^Q~yj|<>xw`85PXL_El?axHFKRYUF3vY! zsw3dJ+W75ieeeJKLS)podtjf?O}zRV<`F&?stjAB3+@5qloyPl=pWxYaiat(lT;93 zSlPCeiQ{jq*KefG!i1|l7Hb{vSNuQP7SXRS`tQ2wzb)5Js1UCs5D5yTOwpn`lkVXj zsbhGZ-UpYd^!TV1LHG1Y&V0+R{q;LE41IdvTit>8_Gjc62#sMK1`@Yr>8Ti24-vm3 zTy2c@t|=r7S?f6MJW-Ct*R9IJQuLL*-~cM~f4{Wy^x@o$U;BIIep42QQZoCh<1g4Z z%D2>qG#h@KAi z!N(gf=mmYKBOlTYf8xl0x&^{K%UgbYe>W}9^{q>#U^MHGr&|<|4#uO~i17I&bn6Ti z?wYgB2wBj~lbI*0T(c}U1Yok<5hTa}Y~Kgn{WjfwZD&&>844Zkfj1br${YiOnT#0W zMYaFY0ZyjDX*w(PdFECVa|kEX37EJD)G&Iauq!?`C0rX{xim@khQE2zy53EC@O(}+ z4>MH{w5%(<#?>KT^+WtwGAF6_AuZy!q5rsi@PAy|skudL43Yk^InZExtO6m^bW_Q} zum8}Mk;x%&AaxZrz!fJ?BED>d%$>bpk5s2}G3VVk12NP;!%VQ}sfo$WYv_&Sh1-ZD zjSs5tcrKc;B;HWF#8jLLE2wSA8etj|)9r zEX4bIb&6kr#j%X6@S9x7S*`P5wu6Oyqb!9y8hdK}B|Yp6uky{{e*VgprhW{18;*y4 zKsaQY!e1ZFt*?yOI-(F>r1{GhEN16L+Z}GVm+&vSp*4!-31fG@1yI?t8uY}R=pYvJ z7Vw29MC6nVTLeSSM1MCG6@ylAz>C%CMHqYTPvq!hipcpVT^_ zvgpaYtW}P$6k3L>&;lRo2P&CiWxs?=A&?yS;k4d_okvhH(E#A`n{!Ll44=6Otn2=+ zgNe;+!mZ=Uhgnv7?W zMlX>wEZs!KmV{QedCFCOGH~Dvo_@W3aMdqvb^PgChBo?;@I4J7Mc>;TyvD2}mQh>w z|Cm@6?3=&!?sG^Nj)BVvbPWo{E`tTS)1*;xP+!;3>kKw34^oiyTDYUylNZPO-Kd^b zf5tV8f#HQrfH1gd_CE=PU}-uUpdi`%g7l}8v$GD!iZi7A#yWK0uQCgEvGCHnPXo;# zWcp#Aq6L)9^KD8?TcgjQ1R18mV0~*s#{r?=p??hplt0Z?9ih=%je8|9 z>GgwAzn%0W76vo~L1s;FR@dc{2G@~qYn^0p9s^?15qjJMdRfq75YKlbdfSifUxMrF z{nK`)r}PPPmp0IaT@^{*%4`b#*`SUyn2}zkEGCyAlfU4BBey18?8H{tw za<(Nx(XsFGqPwQk1cwQcy$HA7*u|=j|G6vXlz}Y6zT| zUL+TNeMJJ2=;_DS0_ZI5t$!_E4umEyx0IF7{wowfQK=zs1^Zv9U4k`e1zVeeuM}E< z2}fW7+H=Ut#gRT@Rw1MBf}2ZpMubo?oEi7}F#8{RKNesps&fXc6PN&ED^6xU3M~lls6)brBJae8GK83|KS#nmWl)jB?E;u~!@Cgw+hIA@wGkFbgq?-p&&Q zYlpf2EJu=j`cfm)Cc%L}JPx#^aS7F8fqu1_7dmFfPJ*cdA4oHvrs!y2&weVx$pVaaWyuwjw&g2QmnDbBPT9$Lk0BgQ3h>{H|{@LCCM=$J;1`gzgHg?+|*vB1b48cK;qz5mgiOxO3Si4 zdHh(V%1>Io`u934AG~DW`RN0qEZ~cEV>u^6A8jP5BL{eZzwe`;Hne+jmR9S(ecn;5 zV8=?Y#wxBEOrO<(XhGmAHF()E&^ppRpQxaUk0#X?vuBn}*srP6JW2fl>HT?Cc(?jI z@?tq{Y%eC!b+q_meH^Cx+~2~JB!xZY(G~4)`fR5CrUWf(X1r&1>Hq1ry9N;x57;k1 zeFrH3ZM-cO;nax+X5^)=%?CmUJP?jMx_47cKmu3IYfD49myGZ8rr%Tz4#QypgWhANj%sbp4CTfzU6(9>s@V&wO+k zh>iDt=!niq$0JF5$KF}i{?+^XpbWW*2@4X{ZOnRcLA#0@GJwAryB>f%aO#730|8^8 zT`RQ(`vC#DD8Yx!4C+Aj(juSs1t&JxGryX$u~LJgdOjs?Tl`%!3lqbP<1kJ5C@*&0 z@bf|$n9#V(!6s~{-K4z(x>lo;J(J=fZb~wwtx^A5;D&(tL9`>~iXB;y6$=w+Vrcux z0-M$P>vTv4fT9bO{IO8=9d%U5e^G6^bsCDnJkKv;9^yzcrT zu|6bW@|;=96EX!{Q&Gf(hDE)VERl3&*S$eDl;wf?hu`TgQu&q`@sVs&;F`+6f+Rbe zbC;BXZ2CXLer~wJs&N3^-2{oQE*fW#s{`nx4@^u(vRY3f@d`wMBRX@>?J1tpFgv}X zv2ZCRuWJqkiA;}Ly$^@_Kc1-S)8D!}1hhq=h6A#5LkUZ!ujjE*l-tP$2>C9nfStE1-kSF{LYMGemwt5 zRxx$?YApckK6qjYk`f3Vv2RYbg`IiaHutZ*p0If1N1a$xWn~L^#`tpp1XM|?wO)~; z7B0QUy?sngrbB{WJM$o>jiNleyyB6Vc)7e14$*73^EJNt?XL-em7FX5C7%KkS0VHs zo|QEIkVUp{%Hio{kf~^7Gp30tePm+FUg;)%8sz82!LwvF?Q?vxj_ZGRt>C^zotmeJ zbnQae3sto*P97J&BobDYCPNr#zuZ@^5;VDA&0EVQ=n_{Gqo{P7m%2)|DpEZuRrL{G z^e6>2iFC3P3G+o%UuV_*Nr@EPQeDs&lJQRY2l)j-0q?DitR$p5BwQMK&MtGFWh_yR z;AUS#b$cdrdcSUk4heq5QZMuLl?dg>>Xnn%Hr(itGZhR;-*q_Fz){|O$#e7NJ6Bxu z5$-uO^E^$R5a-p2+s7$$Ul%bpH$D{G zy&uR$`GYd<-`Nh;`Y4PcfLhA5K`$Dwu8#dD3Imzl*isye--eV=_hW@G8^q#C-EU{d{4i;$My$?QEA z^MuAMlqP;#Lb&eE*Eb3F904ziP8#hw8Zz%}Q@6iuqo+H1$TrqC7z+N)XXcsCoy6oc ze0^vA02lYl6)NZkN6Dw@AGjBPmVA@f3;Q7wdEr)ti%!)A?>jh_nhu-iCy`&cQ?A*-S~G~PV((^O`&TT<=FfX zYy7<*&ia18zLA#9Yepv-n1SFJnd_mTCLo5^!~U1U){VqvW|TAy!tc;H4z`7n(F@A> z`v1=3P@Tb13i;$5>j(Fy_}V#{6DBiwm%lVNI=G!&#QOTXO?o7fQQxdN_FK+ul2!Ex z1=1$(4C8BnJsn(F+@GMP`r-WFe(3j60n)`Cgrj8^abG_O?{8mxm2>O<^2+j(dHclK z%C#bOpMyt2-NQ6_999R6U(H>}zDK9@%oM*pqnYkzhyTMPJi8^$%%u>AA@3kq?GoSVz6SF(kD9OCSJnv zj^fKN8?XLLnH8@9Dbu$SDIHTUZdcn!RPfaEc*ROu4;1A0=99n4AuaMbrb84ZZ#;k1 z$3k2(6?ZW4-C^pr!k^zZ;GCr0tZ(9s2-RrSLcg65H4xS)QVhr`e&6}l0V-#@`;@@z zma#X(curiS#=kE#-~_C9SEfTrBXWswt#1-u)L42uqfu3~vXS6Ypp73}=YKSMXl@N2 zotJ5^OC_w}l1*yVD2q41;q78-gguz-Gbj`2Oa_a$2L974FFC%|g)(3ddbYv@yp?9Y z^k0O#GZl`M?Ixiog=LLlx8FKS;yTm+Y`}8dp>HK#Vaz9M+T-L2c88d%&_u@XV~Kjp zM`!MydGHw-&*vY@8m|7!(md&%){S_(ao#en0XWK@O#ae$U%Pn0&gKPHNYkDP|0nxz zt}oe0<=$TOGTdBhP>@vNB^It}eQMM|Cdo=#3qYgK61e`|f0Q_JNoJ&EZMY0xP;w)} zW637Z^ZQSmAt^ZXg_2K=?p}WcKwgTtBz*ir&o-9{)VeD@N6x*{fc23)zgKYY*Ko(B z?Y;jL*h`(h)|I7mNzsw?7Tk=P5KU3iH7#NnvrKJNEr<`%9W>eTt=0Iu4d0gKOqHSn z6z-hOz{NWHi&tgA!_o?-C`=y}`;VbV(bsU)|1R~W-KW+S9$W)A$F2LfN&NY}qI)gD z!xUns>#}1-v=inW3-|Z^#rfRp{#&yLrE!6HtrAWcCU)`QHjXhJTxSWkf|HyA`^l(5 z_;JWbla$RWtC5cW3BiAv;^l*m))mQ5F0o2Ius$g6%Vf@gg>*ur>dA+3JkKO_P)f=| z*uK%c9**(PnyQyfK!>2e-wQTFip720LVxj%R3 zN#fZ3?oShhc+G=oVMR0EKbxpRTw=!3BDaU6?ISpq^NQAaH_@u;ROLfKj&wKqRnu~b z>hO!uzt0w#$eQ-FHs!vpQ2e~(_HISC`zauaH92zTgH(g?;c!QCg3oCA>b(8mWt7d@ zNL_E7;-sQ)QzSbGpAhwp;4dB2vG9*IqU0=+@m{2=>$vy7r{`^?sOC3f+O)bXZ_ed5 zSP;-u4$>JrDDEQgQZt!hp-!Qbec{I-!qsXnUG z?~p6X>cRBuIlZL`Yh+!ODDXA@Y>|1N^+w%?Ui;ya_i-O78VnCdR~Q<|23^4XIV9fW z-)~r^Dj@!S_S*-yN{81scKZ+5XV}sFkSnIEHhIzteuC$co>QPrWNB3LN&ByGiHZ=H zFqW9ieb-^VC&XNi*&XATQ9qEu} zRQdT$Wc;^egCp>0*4wxP=c12!*p>z7W#WuV14>F`(cRI{SCWVSzoHrIZgmJ=pW@LvWW>uW8h_%zKLzG`%vX0v=k zwCM|-aaXoMNROk3$>W*_JX5zhBc~r&NV<3Y`P8nq)?z34Q1M$)T9s;%^mv?PjFpOTrWBah_A??SPwpRUbq{N3Ue#S8#%v)lijCbAnn z*0_D*4X=e94g>Y7|~*G+%4KNkE&~J^3w0(Kc^_tyBlT zmHk6p7m&!R!SIg?M~S(Repho)xO3?ZQ+Z3uv~H^(+8wONErY)_VRSgAflR)az||>0 z()r7O7N}^)=R@&4qB!Og3Tgt`Uo2l{1We&fY5aUM)Zlf&;QtoV`wT3k*l2#I2Py_V zRrb;;B{SyRPg0UfCE7>nd6}mwOtta$z>xp>CSXg}ke`TbjG-mf3+|@5D7%z|h^h)WupAA;_J9~ z51Sx2c?MmXI9x^NezN33;+vVjD3=?s9^21U7$oEqcC>4eF3*-;9=?RM9Iv_!e-h>c z)aMu{UCpX0w@;hsUSh@wk&Yh1+qHc|!)o4kGN$CF`qz+;P^VqziF5aBFfyjFO`@}b z1GN~5=zY8DmOcz56I|{2v-CT$tYcYva4N{t<{owmc^f{xjni%cDTUGPCig57WZK+X zv|BSwB~?+J0N7kUs)n$CfkHw!pdPN7f^Yv(x@o8i5ooxE`{Kj(wdXC@0sK1d z&3>__DXimT?^Q(@raSqk-c|cG1V3jW8T#JLN2#h_{_LS2FTNhkZLt;u7#C8*2e(wr zSH6$I!32$fj7E7*O9#t8hF+Ra;zH`4q+W@0ujou=1>ZnS-4fTm1BGg|rGEhRFAs5* zX_I24!=Kvo-b&Gc{^FR4v%4a;{U9&KbrTNPcGNu2blnxXhHuznJ+=~gs49i`iWx|c zn)KHqYbp1 z%uv|`-Yy{^oHH%~&QjM#$2tjAxI)d5pT7&@xeO+CCnmqJU-GV!>MV)1P@R^8KE zP!RfaUp9We(e^>CZAOTf6LhPweH6VpAN602qrXFR9`1?QC&QzfrCIG%O zg@_n}+HVUZY_Ip|Zp@cxGpGeD*X6kHaz_oy%1^!Qko z9rGh;m$dsXw9aOu_S0N6%<)&yLx*7D=d{ILR`JnfE{GrfW%PbQHqVS{7}}(E#3>0e zBIWyLgTJ{;`@jmUcv9UQ2g4nYps*Q8yat79`tO&u5%}|mgZ6{~I@j9QSg0kgr}W3F zm%}_8{JGfbPDAy17uBYzSheMQ zkT%ciPV%k_iNxy0O;j6VccwWGSbvhgLqWE4LK`Wj7G`-yVbsZgFZ;n;(N|LO0Le*pV? zhHRB+6ylBL=qe#KG2n&S_fJAT-Zie;A?S-of5fK+H_Via?G5ZvqZtJQT*vYTm4fZk z4Pc@mnYIG&mA0?wYb?rhjIz6t=jAf3ENuhx3QbP)MX;p>hTPhrk%nK}Kqa6%s>+%U2A>qF-v#-&4+#FhT10T+88f#wt_ z?nXl%h%}A~Rty?H45)DFOE#i&0UA}68oiE!!uTl9--c?m?Rn> zgSl)nO|?l*bUxxXYp}ew5}Rno4%8}F|FmLwYttb= zzKT^QFeaG%@yvOx?fmxkTXsGz@+tb4qUhBl$6uOO8s=cG$Ic0CGJVv-NsLo7^-ayY z=O4CODFuOoPA!zyH=G=+WD?_j$#ibgAc|mP1|;wEc;U_6I)C-Qp_{B6D08`{rTnj~ zJ;0dY5yGg!qVc}yD!V`iar1A_icZI^dKMDP@rhaQ{Y8_DP(i7EwcT8fM|YNrXe;Sg zKvivTdpWvz?4|>13k%whiu}eZ$yzgC(ltJowmx*yK>hC0R5^VX#P;A#& zfpVuz&88vxivDzp_WbcuN4!3I01JdJqU=mlmUS9Ah^9hK= z!}5TbH7S7`2~1mA_Gpv}W8ubOR+*A&8rY|JvNjukQ0K3c*_D37!byI+d_m0M*y35q zNWhkV@=@Dp_Q1ZiW~}qL&xJsvDjJodCxG(2(5qozo@shJ>fG8DIPGCob|T`{aAnI! z6iw}{-K?yHGv|QfhUK-KU0*___<~mV@Se9t>!Q9Cae;9mFkS-ATK%}EbGZ|tIZq3C zjU-d!Kg278P1Vny?%lp_1d8SB5Jxi_xhvMuA;Qq!S0hD(7^}q21e4;k1dg^otQ5uA zSi~)Qa%$OJaD;h%Z!{rG3`D-XoNib?^3cDO?=T(9dw3%KWYfe3i5Lb=dY4pXxafdQ6Q;l~a>?~hE`Rpr?6$YReM5G$l1m*( zBU$Q-mRoWcubY^x)$rSry@wYEMu37+lFzq*#qQU7v@+ciYEt}^w1F%^me%W4Y+k!< zQBPpYt5XTlBBzTN3T1#epXIu`J39EYba%AVu7nh@zJCQ5D$rhe6+_+R zg7PC`O!m&c=1Q)`n19+aF`6ZpK%}FjiS7>%7*<{5y9I8%>|D+f^}Q4JV#mcRK$YE^ z<>IM`0#i%`Mm$?42^c_96Pb4t47wRX>B)P8#Y;7&jpcOxj$_KCMXG`dW{F|7@YF*i zcl7xs88#<37S87EExL0=qQ#f~fMVZi7gG-(G{c!?O>gq>n%|6lG^`MvHXXtzGC47_ zl3a#u1I%u9!T9n*n4c2%cQfG1w4PzMb!WmHX!Uuw#TFHG*FDJr$TN`BErYmVh!Gb% z-fs+$MauN{4zo*CNd~0-f|1;&QE)3lMR{B?Q@lZ65ikxap<;nB0$1pqYs^zS`a_9Q zVWrp0q7n)Z7-B%-$2%U}43yw;m|TAZ+a%23IzI5ltW z0|ypX&hUo1m*sNd_oU$GmIkB!CS&4%GtEm`k3R)FQqX&$-OC7^gcR;8Xp7V^cnX;N QKni$(Uq@P29rM2O9|hJ$DgXcg literal 59736 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 W-?%t)Riu*y_@kz(1x4MqeDQxLsK)pJ literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index 440a37a..89cc5c4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -61,6 +61,7 @@ class VikunjaApp extends StatelessWidget { return new MaterialApp( title: 'Vikunja', theme: buildVikunjaTheme(), + darkTheme: buildVikunjaDarkTheme(), home: this.home, ); } diff --git a/lib/pages/user/login.dart b/lib/pages/user/login.dart index aca7e76..fbcae00 100644 --- a/lib/pages/user/login.dart +++ b/lib/pages/user/login.dart @@ -34,7 +34,9 @@ class _LoginPageState extends State { Padding( padding: EdgeInsets.symmetric(vertical: 30), child: Image( - image: AssetImage('assets/vikunja_logo_full.png'), + image: Theme.of(context).brightness == Brightness.dark + ? AssetImage('assets/vikunja_logo_full_white.png') + : AssetImage('assets/vikunja_logo_full.png'), height: 85.0, semanticLabel: 'Vikunja Logo', ), diff --git a/lib/theme/button.dart b/lib/theme/button.dart index a49812b..79b70a4 100644 --- a/lib/theme/button.dart +++ b/lib/theme/button.dart @@ -24,7 +24,9 @@ class FancyButton extends StatelessWidget { height: height, decoration: BoxDecoration(boxShadow: [ BoxShadow( - color: vButtonShadow, + color: Theme.of(context).brightness == Brightness.dark + ? vButtonShadowDark + : vButtonShadow, offset: Offset(-5, 5), blurRadius: 10, ), diff --git a/lib/theme/constants.dart b/lib/theme/constants.dart index 8272190..dbd1a3f 100644 --- a/lib/theme/constants.dart +++ b/lib/theme/constants.dart @@ -15,6 +15,7 @@ const vGreen = Color(0xFF00CE6E); const vButtonColor = vPrimary; const vButtonTextColor = vWhite; +const vButtonShadowDark = Color(0xFF0b2a4a); const vButtonShadow = Color(0xFFb2d9ff); /////////// diff --git a/lib/theme/theme.dart b/lib/theme/theme.dart index 55ba656..f342a1e 100644 --- a/lib/theme/theme.dart +++ b/lib/theme/theme.dart @@ -1,8 +1,16 @@ import 'package:flutter/material.dart'; import 'package:vikunja_app/theme/constants.dart'; -ThemeData buildVikunjaTheme() { - var base = ThemeData.light(); +ThemeData buildVikunjaTheme() => _buildVikunjaTheme(ThemeData.light()); + +ThemeData buildVikunjaDarkTheme() { + ThemeData base = _buildVikunjaTheme(ThemeData.dark()); + return base.copyWith( + accentColor: vWhite, + ); +} + +ThemeData _buildVikunjaTheme(ThemeData base) { return base.copyWith( errorColor: vRed, primaryColor: vPrimaryDark, diff --git a/pubspec.yaml b/pubspec.yaml index 2ee8255..9ce7b6f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -34,6 +34,7 @@ flutter: - assets/graphics/hypnotize.png - assets/vikunja_logo.png - assets/vikunja_logo_full.png + - assets/vikunja_logo_full_white.png fonts: - family: Quicksand fonts: From 239ff62fc518ef005af8b838ce05b37ca9664297 Mon Sep 17 00:00:00 2001 From: JonasFranz Date: Wed, 24 Jun 2020 08:37:29 +0000 Subject: [PATCH 59/99] Publish iOS Version into Testers group automatically (#47) Update 'lib/constants.dart' Remove test branch from pipeline Add push Add beta dist Co-authored-by: Jonas Franz Co-authored-by: Jonas Franz Reviewed-on: https://kolaente.dev/vikunja/app/pulls/47 Reviewed-by: konrad --- .drone.yml | 8 ++++++++ ios/Runner.xcodeproj/project.pbxproj | 4 ++++ ios/Runner/Runner.entitlements | 8 ++++++++ ios/fastlane/Fastfile | 18 +++++++++++++++++- lib/constants.dart | 2 +- 5 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 ios/Runner/Runner.entitlements diff --git a/.drone.yml b/.drone.yml index 3a468e3..f33ddec 100644 --- a/.drone.yml +++ b/.drone.yml @@ -169,6 +169,14 @@ steps: from_secret: fastlane_session KEYCHAIN_PASSWORD: from_secret: keychain_password + CONTACT_EMAIL: + from_secret: contact_email + CONTACT_FIRST_NAME: + from_secret: contact_first_name + CONTACT_LAST_NAME: + from_secret: contact_last_name + CONTACT_PHONE: + from_secret: contact_phone commands: - cd ios - fastlane ios signing diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index cea2653..4715037 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -45,6 +45,7 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BD0C880424A0CB4300291E83 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; C102A622A93B95B5704BDD24 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CA78C9A9831542FDDB6FB31E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -111,6 +112,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + BD0C880424A0CB4300291E83 /* Runner.entitlements */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, @@ -417,6 +419,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEVELOPMENT_TEAM = Z48VLBM2R7; @@ -448,6 +451,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..903def2 --- /dev/null +++ b/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile index f490ff1..959662a 100644 --- a/ios/fastlane/Fastfile +++ b/ios/fastlane/Fastfile @@ -20,7 +20,23 @@ platform :ios do lane :beta do match(type: "appstore", readonly: true) gym - upload_to_testflight + upload_to_testflight( + beta_app_feedback_email: "hello@vikunja.io", + beta_app_description: "Automated Vikunja App Build", + demo_account_required: true, + distribute_external: true, + groups: ["PublicBeta"], + changelog: "Automated Vikunja Build", + beta_app_review_info: { + contact_email: ENV["CONTACT_EMAIL"], + contact_first_name: ENV["CONTACT_FIRST_NAME"], + contact_last_name: ENV["CONTACT_LAST_NAME"], + contact_phone: ENV["CONTACT_PHONE"], + demo_account_name: "demo", + demo_account_password: "demo", + notes: "Please use https://try.vikunja.io as URL" + } + ) end lane :signing do match(type: "appstore", readonly: true) diff --git a/lib/constants.dart b/lib/constants.dart index edf467d..fb17b2a 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -1,2 +1,2 @@ const SENTRY_DSN = - 'https://ab786a1feac7418d87187465b6f30ee0@sentry.k8s.jfdev.de/2'; + 'https://b070ed4bd1d043428db6fe7d1ce57908@sentry.kolaente.de/5'; From d18b049fb62015237364cf973f002d37af16b7a3 Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 10 Jul 2020 10:32:16 +0200 Subject: [PATCH 60/99] Revert "Add sentry (#43)" This reverts commit 9c2622e7 --- lib/constants.dart | 2 -- lib/main.dart | 46 +--------------------------------------------- pubspec.lock | 44 +++++++++++++++----------------------------- pubspec.yaml | 5 ++--- 4 files changed, 18 insertions(+), 79 deletions(-) delete mode 100644 lib/constants.dart diff --git a/lib/constants.dart b/lib/constants.dart deleted file mode 100644 index fb17b2a..0000000 --- a/lib/constants.dart +++ /dev/null @@ -1,2 +0,0 @@ -const SENTRY_DSN = - 'https://b070ed4bd1d043428db6fe7d1ce57908@sentry.kolaente.de/5'; diff --git a/lib/main.dart b/lib/main.dart index 89cc5c4..c3d0704 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,54 +1,10 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:sentry/sentry.dart'; -import 'package:vikunja_app/constants.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/pages/home.dart'; import 'package:vikunja_app/pages/user/login.dart'; import 'package:vikunja_app/theme/theme.dart'; -void main() { - if (!kReleaseMode) { - // only log errors in release mode - _startApp(); - return; - } - var sentry = new SentryClient(dsn: SENTRY_DSN); - - FlutterError.onError = (details, {bool forceReport = false}) { - try { - sentry.captureException( - exception: details.exception, - stackTrace: details.stack, - ); - } catch (e) { - print('Sending report to sentry.io failed: $e'); - } finally { - // Also use Flutter's pretty error logging to the device's console. - FlutterError.dumpErrorToConsole(details, forceReport: forceReport); - } - }; - - runZoned( - _startApp, - onError: (Object error, StackTrace stackTrace) { - try { - sentry.captureException( - exception: error, - stackTrace: stackTrace, - ); - print('Error sent to sentry.io: $error'); - } catch (e) { - print('Sending report to sentry.io failed: $e'); - print('Original error: $error'); - } - }, - ); -} - -_startApp() => runApp(VikunjaGlobal( +void main() => runApp(VikunjaGlobal( child: new VikunjaApp(home: HomePage()), login: new VikunjaApp(home: LoginPage()))); diff --git a/pubspec.lock b/pubspec.lock index af02983..a781b71 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,42 +14,42 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "2.0.13" + version: "2.0.11" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.6.0" + version: "1.5.2" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.1" + version: "2.4.0" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "1.0.5" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.3" + version: "1.1.2" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.12" + version: "1.14.11" convert: dependency: transitive description: @@ -63,7 +63,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "2.1.3" cupertino_icons: dependency: "direct main" description: @@ -98,7 +98,7 @@ packages: name: flutter_secure_storage url: "https://pub.dartlang.org" source: hosted - version: "3.3.3" + version: "3.3.1+1" flutter_test: dependency: "direct dev" description: flutter @@ -110,7 +110,7 @@ packages: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.12.1" + version: "0.12.0+3" http_parser: dependency: transitive description: @@ -124,7 +124,7 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "2.1.12" + version: "2.1.4" matcher: dependency: transitive description: @@ -166,14 +166,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" - sentry: - dependency: "direct main" - description: - name: sentry - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.1" + version: "2.0.5" sky_engine: dependency: transitive description: flutter @@ -185,7 +178,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.5.5" stack_trace: dependency: transitive description: @@ -220,7 +213,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.15" + version: "0.2.11" typed_data: dependency: transitive description: @@ -228,13 +221,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.6" - usage: - dependency: transitive - description: - name: usage - url: "https://pub.dartlang.org" - source: hosted - version: "3.4.1" vector_math: dependency: transitive description: @@ -248,7 +234,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "3.6.1" + version: "3.5.0" yaml: dependency: transitive description: @@ -257,4 +243,4 @@ packages: source: hosted version: "2.2.0" sdks: - dart: ">=2.6.0 <3.0.0" + dart: ">=2.4.0 <3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9ce7b6f..62274f9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,10 +10,9 @@ dependencies: flutter: sdk: flutter cupertino_icons: ^0.1.3 - flutter_secure_storage: ^3.3.3 - http: ^0.12.1 + flutter_secure_storage: 3.3.1+1 + http: 0.12.0+3 after_layout: ^1.0.7 - sentry: ^3.0.1 dev_dependencies: flutter_test: From bbcd24447a67e92577b3b331847299c6b7a022b6 Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 10 Jul 2020 10:34:58 +0200 Subject: [PATCH 61/99] Update dependencies --- pubspec.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index a781b71..3e1c259 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -14,42 +14,42 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "2.0.13" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.5.2" + version: "1.6.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.4.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "2.0.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.1.3" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" + version: "1.14.12" convert: dependency: transitive description: @@ -63,7 +63,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "2.1.4" cupertino_icons: dependency: "direct main" description: @@ -124,7 +124,7 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "2.1.12" matcher: dependency: transitive description: @@ -166,7 +166,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.1.3" sky_engine: dependency: transitive description: flutter @@ -178,7 +178,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.7.0" stack_trace: dependency: transitive description: @@ -213,7 +213,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.11" + version: "0.2.15" typed_data: dependency: transitive description: @@ -234,7 +234,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "3.5.0" + version: "3.6.1" yaml: dependency: transitive description: @@ -243,4 +243,4 @@ packages: source: hosted version: "2.2.0" sdks: - dart: ">=2.4.0 <3.0.0" + dart: ">=2.6.0 <3.0.0" From 05c9a96a50fa26efb2d3219d9db52ec5c2672e06 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 3 Sep 2020 21:29:23 +0200 Subject: [PATCH 62/99] Use the updated logo --- assets/vikunja_ios.png | Bin 44859 -> 42360 bytes assets/vikunja_logo.png | Bin 11501 -> 13808 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/vikunja_ios.png b/assets/vikunja_ios.png index a5938bcbce7965414a80e6df44bdccd6978218f6..c9f72bb3f2da7b70471dc1a926b95ba3155b76d1 100644 GIT binary patch literal 42360 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 KdCo@8ng0RIu%3+o literal 44859 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

=(i)-l2n11bpZs@S%ShS}op8ZfSGB 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 L*USA6;lKX}n(x*f diff --git a/assets/vikunja_logo.png b/assets/vikunja_logo.png index d891635d559cbb3b53884c33f11bb09f58a326e1..ee9eb158395df57c0d891241f35aeb3e9b89c270 100644 GIT binary patch literal 13808 zcmW-o1y~ea7sqFp2BoBt5b5qNk(TaGDd}!lKqREQL0USO?h-+|LzeEAu5aIOpJ$%g zxU;ur&iUWpIX6N@N#->=2|54(ujOPV)c^nle+vRok>Mu;mr_gk3DH$TP6HMG@&eibwK@kfFMNs@7Ta9-<5_Pln+ z3mK*4k10(!!WBx1@C6fK{{D3=NcGJ;6ZBB0u?=ktB$gCL%D1JrBXX&4>iK z%;PEWZ8$iO=tDSybI=DxB1v-<6Ko<$A`OWq^ctGddW%cXSxmkcBMM(tBT`smdPs_# zwTuvoY*vV*GinWTB_>XQ-a4p%fAKtA1KKp+Qc!gyN% z(}A&5!Ws=RFA{>okjM!J`b2EKF_XOPHCi?>AS2ApvW$OFhcZb@7}qsmvcDf(iBuvV z2Dbh}#>n&o^IF?^OS9;A*>Y^%DpCfh{II>6g5St8ci)W;AU=O{YC`k8uG-~T6LKOj z2HxhIH!@3mQS@@+4Xt<0x756D*6bOqau?qE9`tl;EKh3lRMB9=F{b52;FL6fokWz0 z6i}4@n185u}zj(C5}xD z@tFTwlEy6K%*wuI>-#%N6_#4O5!PWlYi>lU9(4zZit+Uz6xj%zH`+_F&%h) zcJoJoM+DQr5wRuz)VGY!3gHu;F<@C|3qvqguc=Nn%yz~za6x87?s1D|~>AR4tV1SMu|W35hY_G1(%oM0m>^k?0XK$&2;8yS6?P zQXhESWrUUqU2;sEM?^S#d=b~Ae{%nZM)-{Pe0tvAN{Tn2iEnODe@DkS5+Sw!!`mJ* z?^cn3AgDE*4Q|>zgNfPUtoS=Sgiz%D95nJp552oeM-hWm^>~UQpNddbpJXJRRa)b- zHC89MUVQn9NUsk{>(a}BUw#8o?6y(5@myMWI+Q}gqSU6{yk1n7b>r6Q(wc`o?9vh_ zUVi=&Oe&;3;&0DHEhEPo@LL&}3!m#$)5`3%?Y5HrJnWoQ9~1IA_p3aHXN#MpyqjlR z5pUZeQ?OH?i*@yQmm`kSB+v6)t=@B!Y0K8T@c}tqwC>?@>6ZJ?6_H2?7)fi)R z?EoTfQZ0RG?CzTMJ2mzAC)=f+9_2CR@DH7+h&ZC!IIz%|*^B2#eP;6CAAyulHLgVl zc6)Xb&I$UfCu{KwOXy2@Y&vB^z^njyjHnxq-`y*HMH`vsM%Tv2GS?Qb>@R=t<&A(P zt=}AEAl`@#c?01vW8z?nTrBtG>jtYdc7uF!@hUKIHk`P=@N`svR`7nXjldGWzl zpH*018<>;Lb4{+8#0x~e_H27#%LRSXJF;~g;!mUTA?akq0!`or*QX|=;^LkVy zL}QF4N-yiPVauxlOWMB@Vnj~}Zw1NUE(rKI@}E-sE;DQ1P*m81ip^Eu7~Hb@+R62z zM6)ZqS0ptF&4q*|WdRNF=}H=;#r@f2Aj8mn@&20m{?BLTFOI&UU&%aAU-;27>Q@wh z1&7j~oEp&B>d?lVlC;PTqlzyR7PguvKN|EzL#*C$m5?E$2*#07a@quDhDsE@2CLu) zCztH3DUrAZReM66#)I+IIPWOrC4imkl%gg6*aX>uZDRQzDa=s3_2gkA}aB6KmYBNSMq?;dD8oUto2z=c|wPP@q(7W-r-!Hfe>pn3`lZz!onHmhWS3B zM47}{)kk|yMiCbD=Y0Ir#il+Vmq3~*L+?WjbhvaBQPSCBh_NML4WrO{x}C5HXz>3~wyfWRzmAK( zC24L;mgObxQ5}JK&DDAQnl=oX%ScG|H`t`dp0E#~oLbAge)4(H$4yT%*lJe|dC=FA zYb)sW4~NABi4&aeY{7uZXHj6o{5^3sn*|o-CZ71`lvKR^ zLpcF5)Pt5>=qNtY5Hc*nOjtuh13Uqhz{EuM`U)Ox3A7|282ILiy`QV3WG-Dm{l%uZ zSYsYY`rZDz`Qbz?G2(T8vP?U3?N%d{|oiyq9coIQ4A}UaaMki*WHmj z6;QzgPqgTX25+zi1q)YsUj#)6>C*Od6Q3?+xJ`~{jZy+MBq(uz9s`v(3JUr?>~b$} z+sh;`@MBS#23W|LXr#XN_2$En@?0DJB);b2y9|((v+iz9bhCN}vYHi+U*oV$ex}rd z0_tc0H33qhNZ`M}cRI;@f{}-US|i#bjlEzb7T~ztq6k&2KeUkS&M7K%+S-yi#p6nF zTFd085~#us6q&9E^s^^)R?Dys_tCduvpO2HX#3bp3!-ZQg4(|avRRK)-EeIz)?P{Ty*7gv?ArJN`yL^k(XgNMA_zfgR(;+hUyTXCo-mWx5I`my@e-R^gYK7;Be?WszRts<& zGw<=aZ|c>#u~|mH$BuDWz6K$v^6h%^EB!)XXKO`Z$_R-Xh&w}E(jJ~~hnmwOy$6n& zwhdJM=52-QEOK8N*WE6Z7U{ewfc_L6fVefRI%(CTB+G0ov7p)u;>S_@WMs3&<<+y7@l~}P0P3KrTK)U3 z$N_tfJ7D_SMot}f)?4@uBt>(o%IzdyeC%RZqL|ZoP?8{Bn5!Q*wG8;IhuFXf$Y(xi zV&Zoy>z1dl{Dn#g>sS4g1PBbMlRwgES>GD06V^9KdBeA6a?F(-N zcQOv|Q!wpvp+jggHnge}BAeL&TS>0`6{<7d`3GqFj)L)Dxd*ko!Reu1Jeog^#4hyV zI)sq!mHuGzY}8Tmfpc?Y()PWjtESR|)DZ~R>d8FX6mo4i^=hV)xA!;ersl??ulf1! zr%B|w(anyr=7U{R<0F~FfYY84pG z^dGS`%T~~aCnQ|OqW(UP8GB3luD~qk!kK)Ds!+wnoynZyNc~&nS}%;#PxgEhfW38(HWU`eqU zflV5dTwFyttEsv?xHYoB>q--??QjZlSd#Y5a!kD3fQz%Rj;JWz z1doES#PILVzo5*GK z2`*Orux3Dn&5DjF;!$OAw%AO{3mipXeR0_MnCYYhchlmho0dVZ+O`KiEunYo9sxSu ziVwm>Bq2@52#(8a@&7L3LgzRS7UbCDnqBGId^5qB52n*vw}-Z8zednhWuXDJHE6vy z;BKzt$Wh7aG$z2mZ^HKKt=4)SdzCX8Y@z4f5Mo|It|RK(O^t_8WvHn&qYd}6gM&eO z8W*99)AwRr-jh{9Lpsx4{>M8hxVl|=cxAVSPxdtTN=~R=_v0kf?wD0hK;Oj(1_@4z zdsR~4sa|!!iR42J+z)&aQ2WXzIO*}u)T-2GgEghK=P9!8OoK}5#y3{>k;t-_Y2lXW zZR)%Dvh9x=K_*i~kU+cPfu&wa?kc$SUzxuVna#XAII1xOF!gAEyjz#1TViFb(+Cr9 z3>_tsimB>Bd!P&8bgYjaWfFnroXC;q{Ky-V^o4SnH61+&qK0ZFB7`Snz2 zMzQN|;ty@YlXZ7G*|q?Qi)sI1*_~%)h2F$WSN1Xpj;Zbt;~ihya-$}&V@w&waGQ{A zPr$ipqt%{l*^v}9g@Bmg7e7L5F^M2c3&gf(EmYEfm}AvrclR-{h|QStvcnPupXQDl|#fl(yR4Fz^ml3i0uX&q~GT|CmH2rTLAV!pM}_8sW< zYGr^(5fT*Pe6emA%EOhQ(Opy$FUL#6xnZ+Fz;P;lkM}vCQzu3Y+ zBc!Qu^N{BiF_xgErKIl#!#gjYBAQ?2#9c~6?40B}qqlgRgtUkE!F0Q}lC_+1AAkg@ zQbjRBDizK99zpcUSdKk9*3Pq#9m+9?wX1l)1<*gb<5-3_q^ivG3Um z-xc?TAu1u2%PlmYq--DFY8zKqWF&(2BIaSInTFgI?4{g_7iBzY^?)1Hg_S04>pdy- zRiW~15mMs#X)-yb&S~3=mP!zSe_YS?IrLyRa`)TAN?mC;_Sm5g4a(O2MHZsT@KBLN ze|8j2r~)@~^-W2D(I@!0XJ%Foq1|FvRK8!y;t#9<2ML_KKz}4)J`aDb!b{!0-^l6= zjh7!oAlO;5VL0zE|C#%VU^HJ_1N-9iS@(^D!#fqjj~2eWS)n}?Pd~X6i}j?wV(sXe zG5dmaSU(iWzm!&Mk_QM}x%#q#85Ila%!4SdGv8}s5WXo*H~eJBiPmthWi5^9I`?uIyyWLcEH#pbWJ zNY=@*wcG^VdcIJ%AF5QdoPn$>Lkg}hmLh}mjI{km4+c^Y^ITh)C6cA(9NPo}0^vm# z|D5Yq2c^==H^=dq+1Tl~{(4mx=`wziiD(#tU{Jn!kQniiz}x;qPfbI8ta_zEn(lwL z^^I==Ruajln2R-=O%PLhp z=fw`Kt%jLV+OABkYU-o)k5@>N{mh4r;Q6`Fks%?RMcB$O_*z*Ow$}lfV<#Hj5aE1#daZ zBp22PQx!AUArW$Zg@h{fiZcC(I3^B7e_RZi=nD$-QdD|5Q--DNG~^B|OR~Uwv=oC_ zpOr^4KaSn};3lgy8}CmGPIJai{2W3dj*+@H+!rz2zps$1+u+%da8W2J55m^ji4rO5 z!!SJgSD?+CH{XyKTBhQIJ#!MP7*t#UHf?}K&9W6uNNjuFpB0f~SPYF|$IqAx`~;YF zXdcuo-Je}dO%RQa-AmY5bV7|*CGx5gO`arzUw=pAWv1eH1O+X5%tV2zk;*N@CGXA_ znBe_Pvpx&b_|YRr!3}e>Qe-5XDnfKkOlNvw)XDKRjm7(ArD~1p=63CDP`9hLO8fYh ziGU%=o{qyz{YBfy`(&lHmPNlJ{Osg&>^Ket$|lQm<}t*=h_iH2HD>vSE7kVTg+lzY zM&?~cofJ*i&v6{UKT91Db1jn6!=QdwG*x1V^S&-bqYVK!7I*EA_I#anba>_=%}jy7 zP+V30&ff2HpDBjcuSXGzEFmP>b;eujl16c1fJLLvflquxb)&#PoH)}po0wP$5tEoB zsy1Mwpu-ipl_;@4tSut;pNYbeQ=gx{^|c7Zjb1%h2)a9(p)k;OoB1+_ikv6<@pF|v zy-2vxEQBKmRVhyA>+Kk;24&W*s-W2*yLtWTJ??kx*sDA+egwO@;!xBmy^oG0NU9Sk zw3-*}zT%?D+y-&8rD7sIw0_aVnbyHtQ+ zo1E~r{6%*{4FU!rQ@A1R`K-=@6H#=?O~nNbixe&B8hP^?d8fbm8+=#A_upycHO~e6 zgMLL#d7*G2nv6?{8v}KD^zv#9_Fvdf1#Yd3OH_K$;oZ_}hVCJYQM-V?KI%Xe+Rb;^ z)WJ1d55Bmi>H1U9XX)ZgKLs=hZp_(W#>RlL8>6rvRyTMU5m-a`m2vI!pSenu zKpSOrDn_IPYRc2{jIV_-l3d0S*cI1L6@BtP3ElsA&-b@3{xrb#^(p_eeazJ%27FOM zSP^%(T&3wqi`>zpFU(uI=d_6(7k;)~9q2j-TYI|QUb`m`^rp6`(^ig9QW_(E1Zs7% z#sjZhasr22W<)N3a}mnVh361mww>MwL@zTtZxWpycXfrKko$1&yB6EH?BlB{1|^?VZ{d3Uh=@==)Fv(Pc{bvMa3>cMv8JZ|{B4eYaY>oAYqR6m^`iR$ZH z+vHTenh|5~Z#{H$nTumy>@=t2dpt_5C)aPtOKe@*e`-lJ@{ZPjKJ}2fzbOIcR7SA@ zbvP*|C@BFvpVvk2?@@{a0(TisVO7R!zbG8r(v`D?467|R?LDW&U=jf?-&ZaU*Ki{g za%qJh`c8K}yB^VQR-ZA({Kkb!$h+VTrY30=TbIpd1GLg}!1N14`udSrB}g#srd5us zm!_j8ENz2(8i^jtAaTfe#Vw*$;O&#RS*QQy;BpqvAk{b1v%sd8fP4f|iw|2;iFBiMTr8M_z)|P-FBuz|#xIjL34kOauUBu?JyY_2ff=9Tf?BU1bEUf<83*B%5n@W1_GOOop6z;haS+BRiWp0x3sC)Ek2 ze_c>E^&I{1`-1s<91l7{861o9Ag!IjS^wrbPfg*#v&ZYcyrw|N*fsA1sb^e71Zsi# zW<8XlW8>=xtWmVOk{p5&|RG2RyfWtJ!011!4A)_H6>xoh{>CZ1Ld(Z!-Xn(Iq z{+|kdkQ13t4g1c6XiGufJ4pUq@9t?miur&h-<#=h4gp?qJ3k?+#WprGl72WZD=3hZ zxt|EZ|5~PxszqRA*8giIAzXC$Cl+M@4a|U^9E6=;@T3rfxy5~^ZrV?!aJ2Ay>y|S4 za;E@ag)HdU9PVYgzjEU}7t3Mdg#c;NQMEnu5i$Q31#hj)6k@n|&lqddk)%W{We&=A zMeEUQ!r?apJHh!<@V~S{>dla9a|J;$5=jMGXx9fjzqU<(3o}m4Hv{Su3$_v@u+xkk z@pryJF~{%%>@bZr^*U$ajy7@g?+)$W>b}j*fV3(Y)g7E>4%_uDU9CiE!7Am2( z2pJjSeNq$s^(|=zNDY!-Qn=c1#hcTFtBjV`jqVSXtnbUZaOG-n%6WHqizG|e;PWqm=XG>?jR83e= zLiiwHa3dA{$d$o~mggLalFsN*v4WovJwAICZ^>>9o~qon(G~8&aVW9;+AvzC_P;)#!ZN2JB~ZLm;@520 z;a})!+j$Fhyt%#4NmFr@n^rm3i-E^0p7~ZrG(1T#YN+o6y%V`VQa;D-1%h5rxD@vE z;)Z2-0>bjPt_a@=-KXZJzN)#pW+^I2Hb0%9G@k~^5R=Q< zu|b=7U01}&99BhB5h-y)!Z3Q@GckSxi?1J%;lJ|~-L3?Pq&*Ohth!o5hF-2mD~6Wz zGX?g)76@DwnwS2pl90Rb82bLhy7pWJT_hE%z(|BhADwiQ9B4HsY<4p)ENmU?+5 zK8G3tQY89E23fi5o5ud`s~sf~b)>Z@)^z`t-0xPds%u}1);z+xBc~G-;C#5cavp{v zaM_T!_-|!I_~~fH?}_4R!dIt`{(i)Dh$ZONk=%F@huu7BPZR3wXMC`z)&iUAze+ddJC$D>&-OUyX#?0MWQK5`Z%YQ z4T~G@Zj1|Jga59Y&3%+z3L-;CZn558)X?0HN0?Y=&YoX8wZ1GG)q0)CVx+HnbVPJH zh4jbKspBdEahhrW3ASM=`3|{VA>R|(XpZ=N~=^& zKIEYdhFN1TmBguq0tEIH2K7_z|2?$zuLVj~U1vXtiZScUZ zXs~+c%;zbxE%UV4Gg>Q317yG`N*m(ojFp?q9dIhXj2>Qbg+KsWy30(QB^G(Av+T9y zIRo7S6Gp!;O9&HQ{iLq)saLE%pq}5}^hFk(>`1ek^(eM4u$Zjn$f4IVC(q+uHnxe| zqkU~JTvySPABBH(XZk47{O%a1g;uPHGenzcp7aRK`fefb9giO;d1)()&AALt$@QRiTPK-7DPkaKivv@Mz4yKAUD-2uC&W&Gmf>Ez5+g5S%jJ{KA+JGZE1~ zx+d!rzVDxY9KQ+dCG5Pm-5r}esjy_~`1`3yb&!h>Hec&Ls$@LryO$v;y* zbvXy}T{#TXS7f8m+9zDRIc06tn=n@NocoXBYi_>T=@lJiS9JuIKd&3OdEokJb)&o@ ziwquP_3{ur9oEVE+X=cy{=Qm0G zqWY6AI1eor)c{r{SEM)!iH_~DdY;XG?rmggf0%h=ZQ}s@mizqe2bs{Wfx4#V2lFRk zl7mC*((3m_uSO#fye@w3dYy026BCnJeRi{pp`Nn>6V;~e^mb&^q-OVh_w_ufFWch_3E4L zvfY!=iSHoABQKW~n?(!|euh$XTOo9vgoP!Fm729~6u7z^}WbDoIdYt_4=zkqD z&+E83JKr?5D%9N#^PrlPqot+#Pll;$%K7_~{fWM6XyUE4HkJ8}E)mC{OoY1Z8tlYp zWU0?8hZneT`9lDlM=VSU$`{}9n-oo1Y`{mB&Rcx$bC#P7Nk(Ma!TCOFi1<}9Ik)J6 z*>Yd>yZt_!!MwvKxXj3OdU1vF>Yhk8Osw#93j8oPB%Nu#{T>80k9=@G!gnW&(cS`~ zYVs`y5UihTn?C659QrX+3A4Mt1oFw5%iyodoh|K=+T}%;o^UTy#^cCP7U{~<^t*mZK(c5Qu zs4=yy{Cm^fvKQm5HvWX{Z&B@Bh^9u<(Z}Xu{2~{M2A|T%vf_@?3gfu>{XRFl6J=_h zt6DUcD;*_&v%al)Yd;J+x;Tq(rnHf|%uqHpUZ$iew0S6Ql?^Qc84WpEPg+(tcRs`6 z4Fd~=yh0pH6Q?3AjKC?t^;hMaB#YouqNZXW&LZHSK{>ByMFL%q*xS!^`Y0W5APh;; zHTe!&j2t+wF{t#4eHc%HwaZtmp9qj*-R)Hv#?^{%*1zi8HIN;+bzA9;>-Q=u7(e>lg~ZOSrR^)BftWgc~zj~-8nrn48`Eh z=Y)E){^TC4N&{;-pmn~CC32<*QFIOsr32bcdM(UK$pDU}^}AWaDS%nUC#S+ zR5+fBI{&cIx0*JoI{NEq#fVW#_WW~;QvA^-+kYuiT5Mw{++j}cb33=A`EP{*F5XS* z*fgTekhH{U5Vky4F&@MPTQ+R?OOz!IAY#9QY&W*UBU;bk4Z{9FJ1rx$pZs&=Tk_+> zCZ)VrV_WW;c^FocIO=Il>}(I(gT8h`wH;g3;r8}CK>Wqdejq2_~w@j8fHg7SWa zz8*E>qb;3kdzy-+-1~j-MLa?@Q-$5rAL_$u^QN9yA+R5@6T`5(jjD~Y66QGjd!cwQ zvqq(jpI9eMBC>f<1P*hPj8bu@6Au`9Qn0vB|IRnjfRtmogCj0MI~9(iW~#&aJ77ZP zxDn~D0F0krji!ZLYL8N+;)9A`@r(bq=LT?*g4J2^l~wSmy2|fQ;crUA8V!u}Pm+QG z>vcV_JDD~9*%u`vv8u%U29hE=Py7aSZZ@Eb2BXjEf&b1a@ zJLF|-ztKX;91Rr?vOex5U+wW!A|42$&bY&C{#gA*wx!oG*;|vBSeG`G&FUq{Jiv2Cgt0`-&o16k4~UQZxYKbq{Y_JL+0hKLq!~#ef)8}K{aP@`QYxpZ)z1xIAf=_rH@j6R z7x}`-0Vi>MJr}RxtLDvG+5$)8AIm}7;+V-4j7}62v_9?@`Zehb0!Yr`jB9u7g?-6e z>slS6nXD|Ow`r_)P>pjD$S7*XX@{0bqN5Pht~rf1l~LB{+ng2pp(m7>HIQ6NI1;~H zLU+(^e#5|0<|7nU{Is!bT*JUjM!!hmli`jnW$gfzG(v`Ddyllr43xC-sSWpf zC))lUp$LmXn6Z{Hiz30Pot{^5IVF+#b~1fe!CzYp^bC}?xh1}BDBI4LXwKv_xko`T zgAJ4s_>m!C1mO_fi_;7ZV*?l>z)a$cP?pcO6BhG6SNUoN7FL->lCA{b^?lqgEAG1B zfRgA?IbCr+D#lE~E_X?U-cs*?a*qN%BLr33ty+D2d9nCdb^f*gBVXk1kwX*SFH3hJ z=L822;SK=-CBJ4{ZI|f%ObDFbQm=-;dPA|VnCa3+G=bMJehH6XYz|~Vp7^wvkzk9_ zUvLLn(9JxW43B24h>Dk&hC+d&p$?E7UN;P%B_VYH%%Ce0>hj{xJD z+l0Vb-T8!Ro_={%NM_8?{YCs~7Vmi^0{T7O0253jnTNpA5cWVxn?NNiyD>n)KXZc7 ztuXgFahHwst&rE^^k5(eOK>)TBjJ*PuV|t?6IaIRqvq$bC4KbxknB!?8k_v!WLLf< z!}Db8io_y=gaYLom!Tf!*ASI>t2&ILu!(Yg)Hyb4mFY;MSvX{t%`0}Fn=@r#M!Y8n z=oc7z7Z;1~ek04Mv;BJ(@2L8Uk$qI4Q`&Tim#0>0LZjDAz+&(nT`M2Vb#WAt&a0`- z0jmZ-<1}ZLuEI;>89a57^nY|fB7h?qk zM}$dK7#xm_s$G6xB)+bqHlFJ9L%+==^~Y!ANuS=^4x5??o@RvG5srfWL%Yn$cu9}7 zNl`dg$0SW7+irhNf5y$B)iRmN1g?RL%XhRCz;C)Nd#qsAto=#GLo094;4P&kcMF|~ zv<%0fl^sP!D8A5yR<3NG+BZ8s_vcEu_ZauHd2YTYxPkkx%*a@T&?`mP2nYrk4z+zW zFDr(k&fjgk?})fCsCAAyKkoN%SjN{AKE6Io4&~X$w4VD|@(ES7m+rnwwYqioM>)xI zo7O65TUV#QvMrsUOrqK*9sdLUIh?Cg4qA&@x)E6t9B80-v=gGZ48hj5%`*hEPH7lNnmImN0Kv({_aOucpG+e9jISaU3!3>Q(1pq ztuA8bL{ihoM7mO_pxtn37O+1Aew9gL^$-4w5ix9kzHV3WDhoFyxo`M`1r1sAICDya zmwk{ceYj0z;Nery(pC{!&RS~gT)8ijs6<2w!Mt!_$@ka}eYpGMc!jsy-lDa-+xQOY zyz$7W#35Nyur?tYr$z(2--_U}tZw{=3LSL$igNw3bQ&O5nOiI5Z-;Vp3dCSqlJVYQ5 zZXop-I@cS?Jk<5Qf;^;p0*;OJO|Z~ePmQY4S<#^|co}$&t+<^>@G@$<|7^N(x4V&y z^y9?9wykqNKXpLg6C*JIfZ^e+CMpv{eCUTRW-o`g+-tTN7ZNH4GxbU>`5DmtG2VA9lX?J@XRz|^>F47`WWlA$-Az{F3`O-i*=;Xyq2E;e;e&`Mi&HC7s439^%Kyjo*Oocq029!*r(1oZ;f#s$e9*}9 zlRj~jH%84w2&7CbDC1GB+2n06+lki!0B-gwj-~u`;23SSVI(nR%0NuUxNM-PSryAQ zEAwYtc7I|PM5)FW^Sbsr*`-a*4nW`OY-<*{j3%>@GcvbL)~s%BXK*U%%(o+ zXMDjmHp+cGHzC2+cGA@rqqEa5F>>zkB&3%E0VV~U@VmaeA9mb*X_T(2hQ=biW5S0d zexB9sYBEW;w2jJO^Bx}tz+h^=N2mNcp4Ll*- zKHI0rmZb#DQd5e8kM`q7z-B6G`HI%mS!EQ(^>bxgvekY#Pgsb;% zwesx|*0YTtC~cU;;<`ecv~BY(wG*p1dQUHH<`E+f+_OY2{v`Xez;F4PE<6G*0HPEN z?af~>Q7w0y92R-bZVrvAd26Kc{eyLd7#87G3=J~b6c69Up%!W?(_w3dr&B()h?MI>es!g%ntP6;l%_80QZ z3~gtxRx6LnVXt6+?Tp~wnj1GWrU#cRMnFK+>g+K2ie4nGw(=EDkTQDK^6a2~>s%S> zV^1#m8bVDk{ORa9g{-+(rMw^5k|??j7hiHLX9Kt}V6Y=#lABMwztf?z_+3ItC=V!I+Ze zH_Q%?;^(W2IqhoJ+?#nKir%Q0&+SUpb~Q%_`cbPoZ^p z!L5G=#1cP>x-)hetc*T`I{p#r(~!Rt<&AU6ss2Z)XYsN3s!4WKocHEZkNdYf3fqoe zk%ndH`7ki0=maQPujm>6wnTkzyo2+nfKOGJiru>hj81%1iF8weh&588G zyg&Fiafrn!(zaI~GS*WHi)CeguxcTdUro3O;nJoM{^{gP7=b6^inf=H^WU>j$UMWr@ zxmc=lDJtx;8~7GJ^E%4OY#j411*VIFI?H#`a)yIV$>pK6y~SbMNjdV2wO@|<2VSxa zjnlSmez><_6z5oYd3Rs?Oyw`|T|#P-h3E^8yND0&$FPZC)DPdd2{gaj{KTBZ##GhCp)??tr>IPe zIF~cqRHce1GEa1t&gZy)?+itBH!@(44V;<3;H=SP;ISJw-r1ymp-588t}Y!pO@r^w O0_3EWB&#G$g8v63C39N< literal 11501 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%0DSM0t*B>#Iskh8 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 Tss?e>00000NkvXXu0mjfz%D^X From fffb759fc910c7a1e367a4c43f60bfab9f2d355a Mon Sep 17 00:00:00 2001 From: JonasFranz Date: Sat, 24 Oct 2020 10:47:00 +0000 Subject: [PATCH 63/99] Remove chown to fix ci (#49) Remove chown to fix ci Reviewed-on: https://kolaente.dev/vikunja/app/pulls/49 Reviewed-by: konrad Co-Authored-By: JonasFranz Co-Committed-By: JonasFranz --- .drone.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.drone.yml b/.drone.yml index f33ddec..2ce450b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -23,7 +23,6 @@ steps: image: cirrusci/flutter:stable pull: true commands: - - sudo chown cirrus . -R # The clone step clones everything as root, this is our "fix" until we find a better solution - flutter packages get - make format-check - make build-debug @@ -62,7 +61,6 @@ steps: image: cirrusci/flutter:stable pull: true commands: - - sudo chown cirrus . -R # The clone step clones everything as root, this is our "fix" until we find a better solution - flutter packages get - make build-all - mkdir apks @@ -108,7 +106,6 @@ steps: image: cirrusci/flutter:stable pull: true commands: - - sudo chown cirrus . -R # The clone step clones everything as root, this is our "fix" until we find a better solution - flutter packages get - make build-all - mkdir apks From 5779daed833a3d1582761193a853b268936866a0 Mon Sep 17 00:00:00 2001 From: renovate Date: Thu, 24 Dec 2020 14:17:01 +0000 Subject: [PATCH 64/99] Configure Renovate (#51) Add renovate.json Reviewed-on: https://kolaente.dev/vikunja/app/pulls/51 Co-Authored-By: renovate Co-Committed-By: renovate --- renovate.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..39a2b6e --- /dev/null +++ b/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:base" + ] +} From b56c40a88135458bd0772effbac3f4de1f1c1f31 Mon Sep 17 00:00:00 2001 From: renovate Date: Fri, 25 Dec 2020 11:42:11 +0000 Subject: [PATCH 65/99] Update dependency flutter_launcher_icons to ^0.8.0 (#52) Update dependency flutter_launcher_icons to ^0.8.0 Reviewed-on: https://kolaente.dev/vikunja/app/pulls/52 Reviewed-by: konrad Co-Authored-By: renovate Co-Committed-By: renovate --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 62274f9..323da08 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_launcher_icons: "^0.6.1" + flutter_launcher_icons: "^0.8.0" flutter_icons: image_path: "assets/vikunja_logo.png" From a539e13acaf9c2d77f99401c3dfea77763cc9808 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 26 Dec 2020 18:42:53 +0100 Subject: [PATCH 66/99] Fix s3 release bucket credentials --- .drone.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.drone.yml b/.drone.yml index 2ce450b..95451ee 100644 --- a/.drone.yml +++ b/.drone.yml @@ -71,12 +71,13 @@ steps: image: plugins/s3:1 pull: true settings: - bucket: vikunja + bucket: vikunja-releases access_key: from_secret: aws_access_key_id secret_key: from_secret: aws_secret_access_key - endpoint: https://storage.kolaente.de + endpoint: https://s3.fr-par.scw.cloud + region: fr-par path_style: true strip_prefix: apks/ source: apks/* @@ -115,12 +116,13 @@ steps: image: plugins/s3:1 pull: true settings: - bucket: vikunja + bucket: vikunja-releases access_key: from_secret: aws_access_key_id secret_key: from_secret: aws_secret_access_key - endpoint: https://storage.kolaente.de + endpoint: https://s3.fr-par.scw.cloud + region: fr-par path_style: true strip_prefix: apks/ source: apks/* @@ -180,4 +182,4 @@ steps: - fastlane ios beta depends_on: - - testing \ No newline at end of file + - testing From 6f9c8f7149d91e5e61e45cf7553c9c7acba80ab0 Mon Sep 17 00:00:00 2001 From: renovate Date: Sat, 26 Dec 2020 17:53:48 +0000 Subject: [PATCH 67/99] Update dependency flutter_secure_storage to v3.3.5 (#53) Update dependency flutter_secure_storage to v3.3.5 Reviewed-on: https://kolaente.dev/vikunja/app/pulls/53 Reviewed-by: konrad Co-Authored-By: renovate Co-Committed-By: renovate --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 323da08..54cc62a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter cupertino_icons: ^0.1.3 - flutter_secure_storage: 3.3.1+1 + flutter_secure_storage: 3.3.5 http: 0.12.0+3 after_layout: ^1.0.7 From cacdb9996cee9b1c624e27ac2ebd1343656b1d54 Mon Sep 17 00:00:00 2001 From: renovate Date: Sat, 26 Dec 2020 17:54:01 +0000 Subject: [PATCH 68/99] Update dependency gradle to v4.10.3 (#54) Update dependency gradle to v4.10.3 Reviewed-on: https://kolaente.dev/vikunja/app/pulls/54 Co-Authored-By: renovate Co-Committed-By: renovate --- android/gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 933b647..1d5b29f 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip From 0a141f6e11b1dec1b204874df50098cc2ff59843 Mon Sep 17 00:00:00 2001 From: JonasFranz Date: Sun, 10 Jan 2021 20:41:44 +0000 Subject: [PATCH 69/99] Fix iOS build (#58) Co-authored-by: Jonas Franz Reviewed-on: https://kolaente.dev/vikunja/app/pulls/58 Reviewed-by: konrad Co-authored-by: JonasFranz Co-committed-by: JonasFranz --- ios/Flutter/flutter_export_environment.sh | 11 ---- ios/Podfile | 76 +++++------------------ ios/Runner.xcodeproj/project.pbxproj | 2 - pubspec.lock | 70 +++++++++++---------- 4 files changed, 53 insertions(+), 106 deletions(-) delete mode 100755 ios/Flutter/flutter_export_environment.sh diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh deleted file mode 100755 index e22f24c..0000000 --- a/ios/Flutter/flutter_export_environment.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -# This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=/opt/flutter" -export "FLUTTER_APPLICATION_PATH=/home/jonasfranz/Projects/vikunja/app" -export "FLUTTER_TARGET=lib/main.dart" -export "FLUTTER_BUILD_DIR=build" -export "SYMROOT=${SOURCE_ROOT}/../build/ios" -export "OTHER_LDFLAGS=$(inherited) -framework Flutter" -export "FLUTTER_FRAMEWORK_DIR=/opt/flutter/bin/cache/artifacts/engine/ios" -export "FLUTTER_BUILD_NAME=0.1.0" -export "FLUTTER_BUILD_NUMBER=0.1.0" diff --git a/ios/Podfile b/ios/Podfile index 6697f0a..1e8c3c9 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -10,78 +10,32 @@ project 'Runner', { 'Release' => :release, } -def parse_KV_file(file, separator='=') - file_abs_path = File.expand_path(file) - if !File.exists? file_abs_path - return []; +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" end - generated_key_values = {} - skip_line_start_symbols = ["#", "/"] - File.foreach(file_abs_path) do |line| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } - plugin = line.split(pattern=separator) - if plugin.length == 2 - podname = plugin[0].strip() - path = plugin[1].strip() - podpath = File.expand_path("#{path}", file_abs_path) - generated_key_values[podname] = podpath - else - puts "Invalid plugin specification: #{line}" - end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches end - generated_key_values + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" end +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + target 'Runner' do use_frameworks! use_modular_headers! - # Flutter Pod - - copied_flutter_dir = File.join(__dir__, 'Flutter') - copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') - copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') - unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) - # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. - # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. - # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. - - generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') - unless File.exist?(generated_xcode_build_settings_path) - raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) - cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; - - unless File.exist?(copied_framework_path) - FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) - end - unless File.exist?(copied_podspec_path) - FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) - end - end - - # Keep pod path relative so it can be checked into Podfile.lock. - pod 'Flutter', :path => 'Flutter' - - # Plugin Pods - - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock - # referring to absolute paths on developers' machines. - system('rm -rf .symlinks') - system('mkdir -p .symlinks/plugins') - plugin_pods = parse_KV_file('../.flutter-plugins') - plugin_pods.each do |name, path| - symlink = File.join('.symlinks', 'plugins', name) - File.symlink(path, symlink) - pod name, :path => File.join(symlink, 'ios') - end + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end post_install do |installer| installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['ENABLE_BITCODE'] = 'NO' - end + flutter_additional_ios_build_settings(target) end end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 4715037..69f7f54 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -312,7 +312,6 @@ /* Begin XCBuildConfiguration section */ 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -366,7 +365,6 @@ }; 97C147041CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; diff --git a/pubspec.lock b/pubspec.lock index 3e1c259..43ffc80 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -28,28 +28,42 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.1" + version: "2.5.0-nullsafety.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0-nullsafety.1" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0-nullsafety.3" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.3" + version: "1.2.0-nullsafety.1" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0-nullsafety.1" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.12" + version: "1.15.0-nullsafety.3" convert: dependency: transitive description: @@ -71,15 +85,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.3" - dart_config: + fake_async: dependency: transitive description: - path: "." - ref: HEAD - resolved-ref: a7ed88a4793e094a4d5d5c2d88a89e55510accde - url: "https://github.com/MarkOSullivan94/dart_config.git" - source: git - version: "0.5.0" + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0-nullsafety.1" flutter: dependency: "direct main" description: flutter @@ -91,14 +103,14 @@ packages: name: flutter_launcher_icons url: "https://pub.dartlang.org" source: hosted - version: "0.6.1" + version: "0.8.1" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage url: "https://pub.dartlang.org" source: hosted - version: "3.3.1+1" + version: "3.3.5" flutter_test: dependency: "direct dev" description: flutter @@ -131,21 +143,21 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.6" + version: "0.12.10-nullsafety.1" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.8" + version: "1.3.0-nullsafety.3" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.6.4" + version: "1.8.0-nullsafety.1" pedantic: dependency: transitive description: @@ -160,13 +172,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" - quiver: - dependency: transitive - description: - name: quiver - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.3" sky_engine: dependency: transitive description: flutter @@ -178,56 +183,56 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.8.0-nullsafety.2" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.9.3" + version: "1.10.0-nullsafety.1" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0-nullsafety.1" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.1.0-nullsafety.1" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0-nullsafety.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.15" + version: "0.2.19-nullsafety.2" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.3.0-nullsafety.3" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.0-nullsafety.3" xml: dependency: transitive description: @@ -243,4 +248,5 @@ packages: source: hosted version: "2.2.0" sdks: - dart: ">=2.6.0 <3.0.0" + dart: ">=2.10.0-110 <2.11.0" + flutter: ">=1.20.0 <2.0.0" From 00fdc3eeda2eb975310921b5b56673dde74318bf Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 16 Jan 2021 18:10:34 +0100 Subject: [PATCH 70/99] Use bundle install --- .drone.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 95451ee..d0cb1b4 100644 --- a/.drone.yml +++ b/.drone.yml @@ -178,8 +178,9 @@ steps: from_secret: contact_phone commands: - cd ios - - fastlane ios signing - - fastlane ios beta + - bundle install + - bundle exec fastlane ios signing + - bundle exec fastlane ios beta depends_on: - testing From 405bfb4e818086bc3d91773bac0cb5e9af2a7f3b Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 16 Jan 2021 18:15:34 +0100 Subject: [PATCH 71/99] Use local bundle path --- .drone.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.drone.yml b/.drone.yml index d0cb1b4..5ca9bea 100644 --- a/.drone.yml +++ b/.drone.yml @@ -178,6 +178,7 @@ steps: from_secret: contact_phone commands: - cd ios + - bundle config set --local path '.vendor/bundle' - bundle install - bundle exec fastlane ios signing - bundle exec fastlane ios beta From 5d3d9fe0db5ad4aa2fb00bc9d364c7063cf474d6 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 16 Jan 2021 19:01:36 +0100 Subject: [PATCH 72/99] Add rbenv --- .drone.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.drone.yml b/.drone.yml index 5ca9bea..904c24d 100644 --- a/.drone.yml +++ b/.drone.yml @@ -177,6 +177,7 @@ steps: CONTACT_PHONE: from_secret: contact_phone commands: + - rbenv shell 2.5.0 - cd ios - bundle config set --local path '.vendor/bundle' - bundle install From db998736199538fe2d49c17b3daa5221662e88a7 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 16 Jan 2021 19:07:10 +0100 Subject: [PATCH 73/99] rbenv fix --- .drone.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.drone.yml b/.drone.yml index 904c24d..ce5c4d9 100644 --- a/.drone.yml +++ b/.drone.yml @@ -177,6 +177,7 @@ steps: CONTACT_PHONE: from_secret: contact_phone commands: + - eval "$(rbenv init -)" - rbenv shell 2.5.0 - cd ios - bundle config set --local path '.vendor/bundle' From d38bad52204f13580b119a473a884b44191ff154 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sat, 16 Jan 2021 19:07:30 +0100 Subject: [PATCH 74/99] Remove depenedncy --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index ce5c4d9..23790b1 100644 --- a/.drone.yml +++ b/.drone.yml @@ -185,5 +185,5 @@ steps: - bundle exec fastlane ios signing - bundle exec fastlane ios beta -depends_on: - - testing +#depends_on: +# - testing From 08f7b6a60fc7a985860ad9e7178cdc68acb75e59 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Sun, 17 Jan 2021 15:52:04 +0100 Subject: [PATCH 75/99] Re-enable dependencies for iOS build --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 23790b1..ce5c4d9 100644 --- a/.drone.yml +++ b/.drone.yml @@ -185,5 +185,5 @@ steps: - bundle exec fastlane ios signing - bundle exec fastlane ios beta -#depends_on: -# - testing +depends_on: + - testing From 9892d4d1ad0ff7358e4742ea527a4d3bcfae3333 Mon Sep 17 00:00:00 2001 From: JonasFranz Date: Sun, 17 Jan 2021 15:03:10 +0000 Subject: [PATCH 76/99] Fix badges (#59) Co-authored-by: Jonas Franz Reviewed-on: https://kolaente.dev/vikunja/app/pulls/59 Reviewed-by: konrad Co-authored-by: JonasFranz Co-committed-by: JonasFranz --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index af1e2eb..df9e72f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # Vikunja Cross-Plattform app -[![Build Status](https://drone1.kolaente.de/api/badges/vikunja/app/status.svg)](https://drone1.kolaente.de/vikunja/app) +[![Build Status](https://drone.kolaente.de/api/badges/vikunja/app/status.svg)](https://drone.kolaente.de/vikunja/app) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Download](https://img.shields.io/badge/download-v0.1-brightgreen.svg)](https://storage.kolaente.de/minio/vikunja-app/) +[![TestFlight Beta](https://img.shields.io/badge/TestFlight-Beta-026CBB)](https://testflight.apple.com/join/KxOaAraq) Vikunja as Flutter cross platform app. \ No newline at end of file From da80f1853cfc1329f1f11a3cdefc07d2e3e4c9f3 Mon Sep 17 00:00:00 2001 From: JonasFranz Date: Mon, 18 Jan 2021 13:20:32 +0000 Subject: [PATCH 77/99] Upgrade android embedding to v2 (#60) Co-authored-by: Jonas Franz Reviewed-on: https://kolaente.dev/vikunja/app/pulls/60 Reviewed-by: konrad Co-authored-by: JonasFranz Co-committed-by: JonasFranz --- android/app/src/main/AndroidManifest.xml | 11 +++-------- .../io/vikunja/flutteringvikunja/MainActivity.kt | 12 ++---------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 80612ca..6446b53 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -13,7 +13,6 @@ additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> - - + \ No newline at end of file diff --git a/android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt b/android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt index f4538bf..805f665 100644 --- a/android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt +++ b/android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt @@ -1,13 +1,5 @@ package io.vikunja.flutteringvikunja -import android.os.Bundle +import io.flutter.embedding.android.FlutterActivity -import io.flutter.app.FlutterActivity -import io.flutter.plugins.GeneratedPluginRegistrant - -class MainActivity(): FlutterActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - GeneratedPluginRegistrant.registerWith(this) - } -} +class MainActivity : FlutterActivity() From 493d965562edd32ae1657d3f07aefd44598c7e29 Mon Sep 17 00:00:00 2001 From: Aleksandr Borisenko Date: Mon, 8 Mar 2021 09:06:07 +0300 Subject: [PATCH 78/99] Fixes for Flutter 2.0 --- .metadata | 6 +- android/app/build.gradle | 14 +---- android/app/src/main/AndroidManifest.xml | 27 ++++++-- .../vikunja/flutteringvikunja/MainActivity.kt | 3 +- .../res/drawable-v21/launch_background.xml | 12 ++++ android/app/src/main/res/values/styles.xml | 10 +++ android/build.gradle | 4 +- android/gradle.properties | 1 - .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle | 18 +++--- ios/Flutter/Flutter.podspec | 18 ------ ios/Flutter/flutter_export_environment.sh | 13 ++++ lib/global.dart | 3 +- pubspec.lock | 62 +++++++++---------- pubspec.yaml | 12 ++-- 15 files changed, 115 insertions(+), 90 deletions(-) create mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml delete mode 100644 ios/Flutter/Flutter.podspec create mode 100644 ios/Flutter/flutter_export_environment.sh diff --git a/.metadata b/.metadata index 1634cfb..80206eb 100644 --- a/.metadata +++ b/.metadata @@ -4,5 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: 3b309bda072a6b326e8aa4591a5836af600923ce - channel: beta + revision: c5a4b4029c0798f37c4a39b479d7cb75daa7b05c + channel: stable + +project_type: app diff --git a/android/app/build.gradle b/android/app/build.gradle index 9e084af..4dd75a2 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 28 + compileSdkVersion 30 sourceSets { main.java.srcDirs += 'src/main/kotlin' @@ -39,10 +39,9 @@ android { defaultConfig { applicationId "io.vikunja.app" minSdkVersion 19 - targetSdkVersion 28 + targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } flavorDimensions "deploy" @@ -56,10 +55,6 @@ android { dimension "deploy" signingConfig null } - main { - dimension "deploy" - signingConfig signingConfigs.debug // TODO add signing key - } } android.applicationVariants.all { variant -> @@ -84,8 +79,5 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 6446b53..27950ff 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -19,16 +19,35 @@ android:name=".MainActivity" android:launchMode="singleTop" android:theme="@style/LaunchTheme" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density" + android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> + + + + - + + \ No newline at end of file diff --git a/android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt b/android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt index 805f665..3d4adbc 100644 --- a/android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt +++ b/android/app/src/main/kotlin/io/vikunja/flutteringvikunja/MainActivity.kt @@ -2,4 +2,5 @@ package io.vikunja.flutteringvikunja import io.flutter.embedding.android.FlutterActivity -class MainActivity : FlutterActivity() +class MainActivity : FlutterActivity() { +} diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 00fa441..dea49fe 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,8 +1,18 @@ + + + diff --git a/android/build.gradle b/android/build.gradle index cfc1d0e..fdc219a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,12 +1,12 @@ buildscript { - ext.kotlin_version = '1.2.30' + ext.kotlin_version = '1.4.31' repositories { google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:4.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/android/gradle.properties b/android/gradle.properties index 38c8d45..94adc3a 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,4 +1,3 @@ org.gradle.jvmargs=-Xmx1536M -android.enableR8=true android.useAndroidX=true android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 1d5b29f..3c9d085 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index 5a2f14f..f860b76 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,15 +1,11 @@ include ':app' -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" \ No newline at end of file diff --git a/ios/Flutter/Flutter.podspec b/ios/Flutter/Flutter.podspec deleted file mode 100644 index 5ca3041..0000000 --- a/ios/Flutter/Flutter.podspec +++ /dev/null @@ -1,18 +0,0 @@ -# -# NOTE: This podspec is NOT to be published. It is only used as a local source! -# - -Pod::Spec.new do |s| - s.name = 'Flutter' - s.version = '1.0.0' - s.summary = 'High-performance, high-fidelity mobile apps.' - s.description = <<-DESC -Flutter provides an easy and productive way to build and deploy high-performance mobile apps for Android and iOS. - DESC - s.homepage = 'https://flutter.io' - s.license = { :type => 'MIT' } - s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } - s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } - s.ios.deployment_target = '8.0' - s.vendored_frameworks = 'Flutter.framework' -end diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh new file mode 100644 index 0000000..babf0d3 --- /dev/null +++ b/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=C:\Android\flutter" +export "FLUTTER_APPLICATION_PATH=C:\Users\Aleksandr\AndroidStudioProjects\vikunja" +export "FLUTTER_TARGET=lib\main.dart" +export "FLUTTER_BUILD_DIR=build" +export "SYMROOT=${SOURCE_ROOT}/../build\ios" +export "FLUTTER_BUILD_NAME=0.1.0" +export "FLUTTER_BUILD_NUMBER=0.1.0" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=false" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.packages" diff --git a/lib/global.dart b/lib/global.dart index 061ae99..3886075 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -19,8 +19,7 @@ class VikunjaGlobal extends StatefulWidget { VikunjaGlobalState createState() => VikunjaGlobalState(); static VikunjaGlobalState of(BuildContext context) { - var widget = context.inheritFromWidgetOfExactType(_VikunjaGlobalInherited) - as _VikunjaGlobalInherited; + var widget = context.dependOnInheritedWidgetOfExactType<_VikunjaGlobalInherited>(); return widget.data; } } diff --git a/pubspec.lock b/pubspec.lock index 43ffc80..111c151 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: after_layout url: "https://pub.dartlang.org" source: hosted - version: "1.0.7+2" + version: "1.0.7" archive: dependency: transitive description: @@ -28,42 +28,42 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.5.0-nullsafety.1" + version: "2.5.0" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.1" + version: "2.1.0" characters: dependency: transitive description: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.3" + version: "1.1.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0" clock: dependency: transitive description: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.1" + version: "1.1.0" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0-nullsafety.3" + version: "1.15.0" convert: dependency: transitive description: @@ -77,21 +77,21 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "2.1.5" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "1.0.2" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0" flutter: dependency: "direct main" description: flutter @@ -110,7 +110,7 @@ packages: name: flutter_secure_storage url: "https://pub.dartlang.org" source: hosted - version: "3.3.5" + version: "4.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -122,56 +122,56 @@ packages: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.12.0+3" + version: "0.12.2" http_parser: dependency: transitive description: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "3.1.3" + version: "3.1.4" image: dependency: transitive description: name: image url: "https://pub.dartlang.org" source: hosted - version: "2.1.12" + version: "2.1.19" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10-nullsafety.1" + version: "0.12.10" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.3" + version: "1.3.0" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.1" + version: "1.8.0" pedantic: dependency: transitive description: name: pedantic url: "https://pub.dartlang.org" source: hosted - version: "1.8.0+1" + version: "1.11.0" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "3.1.0" sky_engine: dependency: transitive description: flutter @@ -183,70 +183,70 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.2" + version: "1.8.0" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.10.0-nullsafety.1" + version: "1.10.0" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.1" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.1" + version: "1.1.0" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.19-nullsafety.2" + version: "0.2.19" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.3" + version: "1.3.0" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.3" + version: "2.1.0" xml: dependency: transitive description: name: xml url: "https://pub.dartlang.org" source: hosted - version: "3.6.1" + version: "4.5.1" yaml: dependency: transitive description: name: yaml url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "2.2.1" sdks: - dart: ">=2.10.0-110 <2.11.0" - flutter: ">=1.20.0 <2.0.0" + dart: ">=2.12.0-29.10.beta <3.0.0" + flutter: ">=1.26.0-17.6.pre" diff --git a/pubspec.yaml b/pubspec.yaml index 54cc62a..e57c224 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,20 +4,20 @@ description: Vikunja as Flutter cross platform app version: 0.1.0 environment: - sdk: ">=2.1.0 <3.0.0" + sdk: ">=2.7.0 <3.0.0" dependencies: flutter: sdk: flutter - cupertino_icons: ^0.1.3 - flutter_secure_storage: 3.3.5 - http: 0.12.0+3 - after_layout: ^1.0.7 + cupertino_icons: 1.0.2 + flutter_secure_storage: 4.0.0 + http: 0.12.2 + after_layout: 1.0.7 dev_dependencies: flutter_test: sdk: flutter - flutter_launcher_icons: "^0.8.0" + flutter_launcher_icons: 0.8.1 flutter_icons: image_path: "assets/vikunja_logo.png" From 59d5907b2956fb1625bf87a89807aaeaa1a154ad Mon Sep 17 00:00:00 2001 From: Aleksandr Borisenko Date: Mon, 15 Mar 2021 10:31:38 +0300 Subject: [PATCH 79/99] Fixes for API calls --- .gitignore | 67 ++---- android/.gitignore | 17 +- android/app/build.gradle | 20 +- lib/api/client.dart | 28 +-- lib/api/list_implementation.dart | 8 +- lib/global.dart | 2 +- lib/main.dart | 16 +- lib/models/list.dart | 21 +- lib/models/namespace.dart | 2 +- lib/models/user.dart | 4 +- lib/pages/home.dart | 138 ++++++------ lib/pages/list/list.dart | 32 ++- lib/pages/list/list_edit.dart | 4 +- lib/pages/namespace/namespace.dart | 9 +- lib/pages/namespace/namespace_edit.dart | 4 +- lib/pages/user/login.dart | 4 +- pubspec.lock | 270 +++++++++++++++++++++++- pubspec.yaml | 5 +- 18 files changed, 444 insertions(+), 207 deletions(-) diff --git a/.gitignore b/.gitignore index ab3e5ac..0fa6b67 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ # Miscellaneous *.class -*.lock *.log *.pyc *.swp @@ -16,62 +15,32 @@ *.iws .idea/ -# Visual Studio Code related -.vscode/ +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ # Flutter/Dart/Pub related **/doc/api/ +**/ios/Flutter/.last_build_id .dart_tool/ .flutter-plugins +.flutter-plugins-dependencies .packages .pub-cache/ .pub/ -build/ -!pubspec.lock -.flutter-plugins-dependencies +/build/ -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java +# Web related +lib/generated_plugin_registrant.dart -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* +# Symbolication related +app.*.symbols -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages -ios/fastlane/README.md -ios/fastlane/report.xml -ios/Runner.ipa -ios/Runner.app.dSYM.zip +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/android/.gitignore b/android/.gitignore index 65b7315..0a741cb 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -1,10 +1,11 @@ -*.iml -*.class -.gradle +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat /local.properties -/.idea/workspace.xml -/.idea/libraries -.DS_Store -/build -/captures GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties diff --git a/android/app/build.gradle b/android/app/build.gradle index 4dd75a2..312d819 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -46,16 +46,16 @@ android { flavorDimensions "deploy" - productFlavors { - fdroid { - dimension "deploy" - signingConfig null - } - unsigned { - dimension "deploy" - signingConfig null - } - } + //productFlavors { + // fdroid { + // dimension "deploy" + // signingConfig null + // } + // unsigned { + // dimension "deploy" + // signingConfig null + // } + //} android.applicationVariants.all { variant -> if (variant.flavorName == "fdroid") { diff --git a/lib/api/client.dart b/lib/api/client.dart index fca43e5..63ef8f3 100644 --- a/lib/api/client.dart +++ b/lib/api/client.dart @@ -26,29 +26,29 @@ class Client { }; Future get(String url) { - return http - .get('${this.base}$url', headers: _headers) - .then(_handleResponse); + return http.get(Uri.parse('${this.base}$url'), + headers: _headers, + ).then(_handleResponse); } Future delete(String url) { - return http - .delete('${this.base}$url', headers: _headers) - .then(_handleResponse); + return http.delete(Uri.parse('${this.base}$url'), + headers: _headers, + ).then(_handleResponse); } Future post(String url, {dynamic body}) { - return http - .post('${this.base}$url', - headers: _headers, body: _encoder.convert(body)) - .then(_handleResponse); + return http.post(Uri.parse('${this.base}$url'), + headers: _headers, + body: _encoder.convert(body), + ).then(_handleResponse); } Future put(String url, {dynamic body}) { - return http - .put('${this.base}$url', - headers: _headers, body: _encoder.convert(body)) - .then(_handleResponse); + return http.put(Uri.parse('${this.base}$url'), + headers: _headers, + body: _encoder.convert(body), + ).then(_handleResponse); } dynamic _handleResponse(http.Response response) { diff --git a/lib/api/list_implementation.dart b/lib/api/list_implementation.dart index 38228d7..4a4e21f 100644 --- a/lib/api/list_implementation.dart +++ b/lib/api/list_implementation.dart @@ -22,7 +22,13 @@ class ListAPIService extends APIService implements ListService { @override Future get(int listId) { - return client.get('/lists/$listId').then((map) => TaskList.fromJson(map)); + return client.get('/lists/$listId').then((map) { + if (map.containsKey('id')) { + return client.get("/lists/$listId/tasks").then((tasks) => TaskList.fromJson( + map, tasksJson: tasks)); + } + return TaskList.fromJson(map); + }); } @override diff --git a/lib/global.dart b/lib/global.dart index 3886075..52e56c6 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -84,7 +84,7 @@ class VikunjaGlobalState extends State { _currentUser = null; }); }).catchError((err) { - Scaffold.of(context).showSnackBar(SnackBar( + ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text('An error occured while logging out!'), )); }); diff --git a/lib/main.dart b/lib/main.dart index c3d0704..482b901 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,22 +3,32 @@ import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/pages/home.dart'; import 'package:vikunja_app/pages/user/login.dart'; import 'package:vikunja_app/theme/theme.dart'; +import 'package:alice/alice.dart'; void main() => runApp(VikunjaGlobal( child: new VikunjaApp(home: HomePage()), login: new VikunjaApp(home: LoginPage()))); -class VikunjaApp extends StatelessWidget { +class VikunjaApp extends StatefulWidget { final Widget home; - const VikunjaApp({Key key, this.home}) : super(key: key); + VikunjaApp({Key key, this.home}) : super(key: key); + + @override + _VikunjaAppState createState() => _VikunjaAppState(); +} + +class _VikunjaAppState extends State { + Alice alice = Alice(showNotification: true); + @override Widget build(BuildContext context) { return new MaterialApp( + navigatorKey: alice.getNavigatorKey(), title: 'Vikunja', theme: buildVikunjaTheme(), darkTheme: buildVikunjaDarkTheme(), - home: this.home, + home: this.widget.home, ); } } diff --git a/lib/models/list.dart b/lib/models/list.dart index 4578c4d..1721a1e 100644 --- a/lib/models/list.dart +++ b/lib/models/list.dart @@ -9,23 +9,24 @@ class TaskList { final DateTime created, updated; final List tasks; - TaskList( - {@required this.id, - @required this.title, - this.description, - this.owner, - this.created, - this.updated, - this.tasks}); + TaskList({ + @required this.id, + @required this.title, + this.description, + this.owner, + this.created, + this.updated, + this.tasks, + }); - TaskList.fromJson(Map json) + TaskList.fromJson(Map json, {tasksJson}) : id = json['id'], owner = User.fromJson(json['owner']), description = json['description'], title = json['title'], updated = DateTime.parse(json['updated']), created = DateTime.parse(json['created']), - tasks = (json['tasks'] == null ? [] : json['tasks'] as List) + tasks = (tasksJson == null ? [] : tasksJson as List) ?.map((taskJson) => Task.fromJson(taskJson)) ?.toList(); diff --git a/lib/models/namespace.dart b/lib/models/namespace.dart index e851761..19f9bb5 100644 --- a/lib/models/namespace.dart +++ b/lib/models/namespace.dart @@ -21,7 +21,7 @@ class Namespace { id = json['id'], created = DateTime.parse(json['created']), updated = DateTime.parse(json['updated']), - owner = User.fromJson(json['owner']); + owner = json['owner'] == null ? null : User.fromJson(json['owner']); toJSON() => { "created": created?.toIso8601String(), diff --git a/lib/models/user.dart b/lib/models/user.dart index 56e21fa..f39b3c3 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -15,9 +15,7 @@ class User { String avatarUrl(BuildContext context) { return VikunjaGlobal.of(context).client.base + - "/" + - this.username + - "/avatar"; + "/avatar/${this.username}"; } } diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 0879f16..8bea3fe 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -1,28 +1,26 @@ import 'dart:async'; -import 'package:flutter/material.dart'; import 'package:after_layout/after_layout.dart'; - +import 'package:flutter/material.dart'; import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/components/ErrorDialog.dart'; +import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/models/namespace.dart'; import 'package:vikunja_app/pages/namespace/namespace.dart'; import 'package:vikunja_app/pages/namespace/namespace_edit.dart'; import 'package:vikunja_app/pages/placeholder.dart'; -import 'package:vikunja_app/global.dart'; -import 'package:vikunja_app/models/namespace.dart'; class HomePage extends StatefulWidget { @override - State createState() => new HomePageState(); + State createState() => HomePageState(); } class HomePageState extends State with AfterLayoutMixin { List _namespaces = []; - Namespace get _currentNamespace => - _selectedDrawerIndex >= 0 && _selectedDrawerIndex < _namespaces.length - ? _namespaces[_selectedDrawerIndex] - : null; + Namespace get _currentNamespace => _selectedDrawerIndex >= 0 && _selectedDrawerIndex < _namespaces.length + ? _namespaces[_selectedDrawerIndex] + : null; int _selectedDrawerIndex = -1; bool _loading = true; bool _showUserDetails = false; @@ -34,23 +32,19 @@ class HomePageState extends State with AfterLayoutMixin { Widget _namespacesWidget() { List namespacesList = []; - _namespaces - .asMap() - .forEach((i, namespace) => namespacesList.add(new ListTile( - leading: const Icon(Icons.folder), - title: new Text(namespace.title), - selected: i == _selectedDrawerIndex, - onTap: () => _onSelectItem(i), - ))); + _namespaces.asMap().forEach((i, namespace) => namespacesList.add(ListTile( + leading: const Icon(Icons.folder), + title: Text(namespace.title), + selected: i == _selectedDrawerIndex, + onTap: () => _onSelectItem(i), + ))); return this._loading ? Center(child: CircularProgressIndicator()) : RefreshIndicator( child: ListView( padding: EdgeInsets.zero, - children: ListTile.divideTiles( - context: context, tiles: namespacesList) - .toList()), + children: ListTile.divideTiles(context: context, tiles: namespacesList).toList()), onRefresh: _loadNamespaces, ); } @@ -71,9 +65,9 @@ class HomePageState extends State with AfterLayoutMixin { Widget build(BuildContext context) { var currentUser = VikunjaGlobal.of(context).currentUser; - return new Scaffold( + return Scaffold( appBar: AppBar( - title: new Text(_currentNamespace?.title ?? 'Vikunja'), + title: Text(_currentNamespace?.title ?? 'Vikunja'), actions: _currentNamespace == null ? null : [ @@ -84,59 +78,62 @@ class HomePageState extends State with AfterLayoutMixin { MaterialPageRoute( builder: (context) => NamespaceEditPage( namespace: _currentNamespace, - )))) + ) + ) + ) + ), ], ), - drawer: new Drawer( - child: new Column(children: [ - new UserAccountsDrawerHeader( - accountEmail: - currentUser?.email == null ? null : Text(currentUser.email), - accountName: - currentUser?.username == null ? null : Text(currentUser.username), - onDetailsPressed: () { - setState(() { - _showUserDetails = !_showUserDetails; - }); - }, - currentAccountPicture: currentUser == null - ? null - : CircleAvatar( - backgroundImage: NetworkImage(currentUser.avatarUrl(context)), - ), - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/graphics/hypnotize.png"), - repeat: ImageRepeat.repeat, - colorFilter: ColorFilter.mode( - Theme.of(context).primaryColor, BlendMode.multiply)), - ), - ), - new Builder( - builder: (BuildContext context) => Expanded( - child: _showUserDetails - ? _userDetailsWidget(context) - : _namespacesWidget())), - new Align( - alignment: FractionalOffset.bottomCenter, - child: Builder( - builder: (context) => ListTile( - leading: const Icon(Icons.add), - title: const Text('Add namespace...'), - onTap: () => _addNamespaceDialog(context), + drawer: Drawer( + child: Column(children: [ + UserAccountsDrawerHeader( + accountEmail: currentUser?.email == null ? null : Text(currentUser.email), + accountName: currentUser?.username == null ? null : Text(currentUser.username), + onDetailsPressed: () { + setState(() { + _showUserDetails = !_showUserDetails; + }); + }, + currentAccountPicture: currentUser == null + ? null + : CircleAvatar( + backgroundImage: NetworkImage(currentUser.avatarUrl(context)), + ), + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/graphics/hypnotize.png"), + repeat: ImageRepeat.repeat, + colorFilter: ColorFilter.mode(Theme.of(context).primaryColor, BlendMode.multiply), + ), ), ), - ), - ])), + Builder( + builder: (BuildContext context) => + Expanded( + child: _showUserDetails ? _userDetailsWidget(context) : _namespacesWidget(), + ) + ), + Align( + alignment: FractionalOffset.bottomCenter, + child: Builder( + builder: (context) => ListTile( + leading: const Icon(Icons.add), + title: const Text('Add namespace...'), + onTap: () => _addNamespaceDialog(context), + ), + ), + ), + ]), + ), body: _getDrawerItemWidget(_selectedDrawerIndex), ); } _getDrawerItemWidget(int pos) { if (pos == -1) { - return new PlaceholderPage(); + return PlaceholderPage(); } - return new NamespacePage(namespace: _namespaces[pos]); + return NamespacePage(namespace: _namespaces[pos]); } _onSelectItem(int index) { @@ -149,22 +146,17 @@ class HomePageState extends State with AfterLayoutMixin { context: context, builder: (_) => AddDialog( onAdd: (name) => _addNamespace(name, context), - decoration: new InputDecoration( - labelText: 'Namespace', hintText: 'eg. Personal Namespace'), + decoration: InputDecoration(labelText: 'Namespace', hintText: 'eg. Personal Namespace'), )); } _addNamespace(String name, BuildContext context) { - VikunjaGlobal.of(context) - .namespaceService - .create(Namespace(id: null, title: name)) - .then((_) { + VikunjaGlobal.of(context).namespaceService.create(Namespace(id: null, title: name)).then((_) { _loadNamespaces(); - Scaffold.of(context).showSnackBar(SnackBar( + ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text('The namespace was created successfully!'), )); - }).catchError((error) => showDialog( - context: context, builder: (context) => ErrorDialog(error: error))); + }).catchError((error) => showDialog(context: context, builder: (context) => ErrorDialog(error: error))); } Future _loadNamespaces() { diff --git a/lib/pages/list/list.dart b/lib/pages/list/list.dart index 6a943c3..f882b46 100644 --- a/lib/pages/list/list.dart +++ b/lib/pages/list/list.dart @@ -24,8 +24,7 @@ class _ListPageState extends State { @override void initState() { - _list = TaskList( - id: widget.taskList.id, title: widget.taskList.title, tasks: []); + _list = TaskList(id: widget.taskList.id, title: widget.taskList.title, tasks: []); super.initState(); } @@ -39,7 +38,7 @@ class _ListPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: new Text(_list.title), + title: Text(_list.title), actions: [ IconButton( icon: Icon(Icons.edit), @@ -48,7 +47,10 @@ class _ListPageState extends State { MaterialPageRoute( builder: (context) => ListEditPage( list: _list, - )))) + ) + ) + ), + ), ], ), body: !this._loading @@ -56,9 +58,7 @@ class _ListPageState extends State { child: _list.tasks.length > 0 ? ListView( padding: EdgeInsets.symmetric(vertical: 8.0), - children: ListTile.divideTiles( - context: context, tiles: _listTasks()) - .toList(), + children: ListTile.divideTiles(context: context, tiles: _listTasks()).toList(), ) : Center(child: Text('This list is empty.')), onRefresh: _loadList, @@ -66,7 +66,8 @@ class _ListPageState extends State { : Center(child: CircularProgressIndicator()), floatingActionButton: Builder( builder: (context) => FloatingActionButton( - onPressed: () => _addItemDialog(context), child: Icon(Icons.add)), + onPressed: () => _addItemDialog(context), child: Icon(Icons.add), + ), )); } @@ -88,10 +89,7 @@ class _ListPageState extends State { } Future _loadList() { - return VikunjaGlobal.of(context) - .listService - .get(widget.taskList.id) - .then((list) { + return VikunjaGlobal.of(context).listService.get(widget.taskList.id).then((list) { setState(() { _loading = false; _list = list; @@ -104,14 +102,14 @@ class _ListPageState extends State { context: context, builder: (_) => AddDialog( onAdd: (name) => _addItem(name, context), - decoration: new InputDecoration( - labelText: 'Task Name', hintText: 'eg. Milk'))); + decoration: InputDecoration(labelText: 'Task Name', hintText: 'eg. Milk'), + ), + ); } _addItem(String name, BuildContext context) { var globalState = VikunjaGlobal.of(context); - var newTask = Task( - id: null, title: name, owner: globalState.currentUser, done: false); + var newTask = Task(id: null, title: name, owner: globalState.currentUser, done: false); setState(() => _loadingTasks.add(newTask)); globalState.taskService.add(_list.id, newTask).then((task) { setState(() { @@ -120,7 +118,7 @@ class _ListPageState extends State { }).then((_) { _loadList(); setState(() => _loadingTasks.remove(newTask)); - Scaffold.of(context).showSnackBar(SnackBar( + ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text('The task was added successfully!'), )); }); diff --git a/lib/pages/list/list_edit.dart b/lib/pages/list/list_edit.dart index b151e96..88a0e65 100644 --- a/lib/pages/list/list_edit.dart +++ b/lib/pages/list/list_edit.dart @@ -101,12 +101,12 @@ class _ListEditPageState extends State { VikunjaGlobal.of(context).listService.update(updatedList).then((_) { setState(() => _loading = false); - Scaffold.of(context).showSnackBar(SnackBar( + ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text('The list was updated successfully!'), )); }).catchError((err) { setState(() => _loading = false); - Scaffold.of(context).showSnackBar( + ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Something went wrong: ' + err.toString()), action: SnackBarAction( diff --git a/lib/pages/namespace/namespace.dart b/lib/pages/namespace/namespace.dart index 07f6f87..19776a7 100644 --- a/lib/pages/namespace/namespace.dart +++ b/lib/pages/namespace/namespace.dart @@ -56,11 +56,8 @@ class _NamespacePageState extends State color: Colors.white, size: 36.0)), ), onDismissed: (direction) { - _removeList(ls).then((_) => Scaffold.of( - context) - .showSnackBar(SnackBar( - content: - Text("${ls.title} removed")))); + _removeList(ls).then((_) => ScaffoldMessenger.of(context) + .showSnackBar(SnackBar(content: Text("${ls.title} removed")))); }, ))).toList(), ) @@ -120,7 +117,7 @@ class _NamespacePageState extends State .then((_) { setState(() {}); _loadLists(); - Scaffold.of(context).showSnackBar( + ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('The list was successfully created!'), ), diff --git a/lib/pages/namespace/namespace_edit.dart b/lib/pages/namespace/namespace_edit.dart index b77abb8..7e5fde2 100644 --- a/lib/pages/namespace/namespace_edit.dart +++ b/lib/pages/namespace/namespace_edit.dart @@ -107,12 +107,12 @@ class _NamespaceEditPageState extends State { .update(updatedNamespace) .then((_) { setState(() => _loading = false); - Scaffold.of(context).showSnackBar(SnackBar( + ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text('The namespace was updated successfully!'), )); }).catchError((err) { setState(() => _loading = false); - Scaffold.of(context).showSnackBar( + ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Something went wrong: ' + err.toString()), action: SnackBarAction( diff --git a/lib/pages/user/login.dart b/lib/pages/user/login.dart index fbcae00..8d307fb 100644 --- a/lib/pages/user/login.dart +++ b/lib/pages/user/login.dart @@ -24,7 +24,7 @@ class _LoginPageState extends State { padding: const EdgeInsets.all(16.0), child: Builder( builder: (BuildContext context) => Form( - autovalidate: true, + autovalidateMode: AutovalidateMode.always, key: _formKey, child: Center( child: Column( @@ -122,7 +122,7 @@ class _LoginPageState extends State { 'Login failed! Please check your server url and credentials. ' + ex.toString()), actions: [ - FlatButton( + TextButton( onPressed: () => Navigator.pop(context), child: const Text('Close')) ], diff --git a/pubspec.lock b/pubspec.lock index 111c151..1ef1efe 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,14 @@ packages: name: after_layout url: "https://pub.dartlang.org" source: hosted - version: "1.0.7" + version: "1.0.7+2" + alice: + dependency: "direct main" + description: + name: alice + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.12" archive: dependency: transitive description: @@ -29,6 +36,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.5.0" + better_player: + dependency: transitive + description: + name: better_player + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.61" boolean_selector: dependency: transitive description: @@ -50,6 +64,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + chopper: + dependency: transitive + description: + name: chopper + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.6" clock: dependency: transitive description: @@ -78,6 +99,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.5" + csslib: + dependency: transitive + description: + name: csslib + url: "https://pub.dartlang.org" + source: hosted + version: "0.16.2" cupertino_icons: dependency: "direct main" description: @@ -85,6 +113,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + dio: + dependency: transitive + description: + name: dio + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.10" fake_async: dependency: transitive description: @@ -92,6 +127,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.0" flutter: dependency: "direct main" description: flutter @@ -104,18 +153,51 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.8.1" + flutter_local_notifications: + dependency: transitive + description: + name: flutter_local_notifications + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.1+2" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0+1" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.1.0" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_widget_from_html_core: + dependency: transitive + description: + name: flutter_widget_from_html_core + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.2+1" + html: + dependency: transitive + description: + name: html + url: "https://pub.dartlang.org" + source: hosted + version: "0.14.0+4" http: dependency: "direct main" description: @@ -137,6 +219,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.19" + import_js_library: + dependency: transitive + description: + name: import_js_library + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.3" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "0.11.4" matcher: dependency: transitive description: @@ -151,6 +254,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.7" + open_file: + dependency: transitive + description: + name: open_file + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + package_info: + dependency: transitive + description: + name: package_info + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.3+4" path: dependency: transitive description: @@ -158,6 +282,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.27" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+2" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4+8" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.5" pedantic: dependency: transitive description: @@ -165,6 +324,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.11.0" + permission_handler: + dependency: transitive + description: + name: permission_handler + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0+2" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" petitparser: dependency: transitive description: @@ -172,6 +345,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.1.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.1.0" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.25.0" + sensors: + dependency: transitive + description: + name: sensors + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.2+6" + share: + dependency: transitive + description: + name: share + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.5+4" sky_engine: dependency: transitive description: flutter @@ -219,6 +434,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.19" + timezone: + dependency: transitive + description: + name: timezone + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.1" typed_data: dependency: transitive description: @@ -233,6 +455,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + visibility_detector: + dependency: transitive + description: + name: visibility_detector + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.5" + wakelock: + dependency: transitive + description: + name: wakelock + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.1+1" + wakelock_platform_interface: + dependency: transitive + description: + name: wakelock_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0+1" + wakelock_web: + dependency: transitive + description: + name: wakelock_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0+3" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2" xml: dependency: transitive description: @@ -248,5 +512,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.12.0-29.10.beta <3.0.0" + dart: ">=2.12.0 <3.0.0" flutter: ">=1.26.0-17.6.pre" diff --git a/pubspec.yaml b/pubspec.yaml index e57c224..4f0f2a2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,9 +10,10 @@ dependencies: flutter: sdk: flutter cupertino_icons: 1.0.2 - flutter_secure_storage: 4.0.0 + flutter_secure_storage: 4.1.0 http: 0.12.2 - after_layout: 1.0.7 + after_layout: 1.0.7+2 + alice: ^0.1.12 dev_dependencies: flutter_test: From 50e17b045adcf3e50f4f2ee41d73a88b59f502e8 Mon Sep 17 00:00:00 2001 From: Aleksandr Borisenko Date: Fri, 19 Mar 2021 18:13:38 +0300 Subject: [PATCH 80/99] Minor fixes; Added signing config for Android --- android/app/build.gradle | 18 +++++++++++++ lib/components/TaskTile.dart | 36 ++++++++++++------------- lib/models/task.dart | 5 ++-- lib/pages/home.dart | 11 +++++--- lib/pages/namespace/namespace.dart | 2 +- lib/pages/namespace/namespace_edit.dart | 2 +- 6 files changed, 48 insertions(+), 26 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 312d819..0b37f58 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -25,6 +25,12 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + android { compileSdkVersion 30 @@ -44,6 +50,15 @@ android { versionName flutterVersionName } + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile file(keystoreProperties['storeFile']) + storePassword keystoreProperties['storePassword'] + } + } + flavorDimensions "deploy" //productFlavors { @@ -69,6 +84,9 @@ android { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.release + } + debug { signingConfig signingConfigs.debug } } diff --git a/lib/components/TaskTile.dart b/lib/components/TaskTile.dart index 3d307d5..ec25632 100644 --- a/lib/components/TaskTile.dart +++ b/lib/components/TaskTile.dart @@ -9,8 +9,7 @@ class TaskTile extends StatefulWidget { final VoidCallback onEdit; final bool loading; - const TaskTile( - {Key key, @required this.task, this.onEdit, this.loading = false}) + const TaskTile({Key key, @required this.task, this.onEdit, this.loading = false}) : assert(task != null), super(key: key); @@ -42,27 +41,26 @@ class TaskTileState extends State { )), ), title: Text(_currentTask.title), - subtitle: - _currentTask.description == null || _currentTask.description.isEmpty - ? null - : Text(_currentTask.description), + subtitle: _currentTask.description == null || _currentTask.description.isEmpty + ? null + : Text(_currentTask.description), trailing: IconButton( - icon: Icon(Icons.settings), - onPressed: () { - null; // TODO: implement edit task - }), + icon: Icon(Icons.settings), + onPressed: () {}, // TODO: implement edit task + ), ); } return CheckboxListTile( title: Text(_currentTask.title), controlAffinity: ListTileControlAffinity.leading, value: _currentTask.done ?? false, - subtitle: - _currentTask.description == null || _currentTask.description.isEmpty - ? null - : Text(_currentTask.description), - secondary: - IconButton(icon: Icon(Icons.settings), onPressed: widget.onEdit), + subtitle: _currentTask.description == null || _currentTask.description.isEmpty + ? null + : Text(_currentTask.description), + secondary: IconButton( + icon: Icon(Icons.settings), + onPressed: widget.onEdit, + ), onChanged: _change, ); } @@ -80,13 +78,15 @@ class TaskTileState extends State { Future _updateTask(Task task, bool checked) { // TODO use copyFrom - return VikunjaGlobal.of(context).taskService.update(Task( + return VikunjaGlobal.of(context).taskService.update( + Task( id: task.id, done: checked, title: task.title, description: task.description, owner: null, - )); + ) + ); } } diff --git a/lib/models/task.dart b/lib/models/task.dart index f9a398e..983cce7 100644 --- a/lib/models/task.dart +++ b/lib/models/task.dart @@ -27,12 +27,11 @@ class Task { reminders = (json['reminder_dates'] as List) ?.map((r) => DateTime.parse(r)) ?.toList(), - due = - json['due_date'] != null ? DateTime.parse(json['due_date']) : null, + due = json['due_date'] != null ? DateTime.parse(json['due_date']) : null, description = json['description'], title = json['title'], done = json['done'], - owner = User.fromJson(json['created_by']); + owner = json['created_by'] != null ? User.fromJson(json['created_by']) : null; toJSON() => { 'id': id, diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 8bea3fe..6bf02b6 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -32,19 +32,24 @@ class HomePageState extends State with AfterLayoutMixin { Widget _namespacesWidget() { List namespacesList = []; - _namespaces.asMap().forEach((i, namespace) => namespacesList.add(ListTile( + _namespaces.asMap().forEach((i, namespace) => namespacesList.add( + ListTile( leading: const Icon(Icons.folder), title: Text(namespace.title), selected: i == _selectedDrawerIndex, onTap: () => _onSelectItem(i), - ))); + ) + )); return this._loading ? Center(child: CircularProgressIndicator()) : RefreshIndicator( child: ListView( padding: EdgeInsets.zero, - children: ListTile.divideTiles(context: context, tiles: namespacesList).toList()), + children: ListTile.divideTiles( + context: context, + tiles: namespacesList).toList(), + ), onRefresh: _loadNamespaces, ); } diff --git a/lib/pages/namespace/namespace.dart b/lib/pages/namespace/namespace.dart index 19776a7..023b435 100644 --- a/lib/pages/namespace/namespace.dart +++ b/lib/pages/namespace/namespace.dart @@ -26,7 +26,7 @@ class _NamespacePageState extends State @override void afterFirstLayout(BuildContext context) { - _loadLists(); + //_loadLists(); // NOTE: goes right after didChangeDependencies } ///// diff --git a/lib/pages/namespace/namespace_edit.dart b/lib/pages/namespace/namespace_edit.dart index 7e5fde2..a8f0f9a 100644 --- a/lib/pages/namespace/namespace_edit.dart +++ b/lib/pages/namespace/namespace_edit.dart @@ -117,7 +117,7 @@ class _NamespaceEditPageState extends State { content: Text('Something went wrong: ' + err.toString()), action: SnackBarAction( label: 'CLOSE', - onPressed: Scaffold.of(context).hideCurrentSnackBar), + onPressed: ScaffoldMessenger.of(context).hideCurrentSnackBar), ), ); }); From 7bb04473a375bb388b4aaac78bf04c5330e6d229 Mon Sep 17 00:00:00 2001 From: Aleksandr Borisenko Date: Fri, 19 Mar 2021 21:13:44 +0300 Subject: [PATCH 81/99] Null aware handler for the owner field --- lib/models/list.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/models/list.dart b/lib/models/list.dart index 1721a1e..6801e85 100644 --- a/lib/models/list.dart +++ b/lib/models/list.dart @@ -21,7 +21,7 @@ class TaskList { TaskList.fromJson(Map json, {tasksJson}) : id = json['id'], - owner = User.fromJson(json['owner']), + owner = json['owner'] == null ? null : User.fromJson(json['owner']), description = json['description'], title = json['title'], updated = DateTime.parse(json['updated']), From 74f77566268d4c110247cf78ec04558b0415fd0e Mon Sep 17 00:00:00 2001 From: Aleksandr Borisenko Date: Fri, 4 Jun 2021 12:34:25 +0300 Subject: [PATCH 82/99] Merged and fixed PRs 37 & 39 --- ios/Flutter/flutter_export_environment.sh | 1 + lib/api/client.dart | 49 ++- lib/api/label_task.dart | 30 ++ lib/api/label_task_bulk.dart | 20 + lib/api/labels.dart | 41 ++ lib/api/list_implementation.dart | 17 +- lib/api/namespace_implementation.dart | 10 +- lib/api/response.dart | 9 + lib/api/task_implementation.dart | 18 +- lib/api/user_implementation.dart | 6 +- lib/components/TaskTile.dart | 48 +-- lib/components/datetimePicker.dart | 51 +++ lib/components/label.dart | 52 +++ lib/components/string_extension.dart | 4 + lib/global.dart | 10 + lib/main.dart | 6 +- lib/models/label.dart | 43 +++ lib/models/labelTask.dart | 18 + lib/models/labelTaskBulk.dart | 15 + lib/models/task.dart | 88 +++-- lib/pages/home.dart | 40 +- lib/pages/list/list.dart | 136 ++++++- lib/pages/list/task_edit.dart | 437 ++++++++++++++++++++++ lib/pages/namespace/namespace.dart | 14 +- lib/pages/placeholder.dart | 22 +- lib/pages/user/register.dart | 2 +- lib/service/mocked_services.dart | 15 +- lib/service/services.dart | 25 ++ lib/stores/list_store.dart | 54 +++ lib/theme/constants.dart | 7 + lib/utils/datetime_to_unix.dart | 11 + lib/utils/repeat_after_parse.dart | 66 ++++ pubspec.lock | 415 +++++++++++--------- pubspec.yaml | 20 +- test/parse_label_color.dart | 22 ++ test/parse_repeat_after_test.dart | 76 ++++ test/task_json_decode_test.dart | 52 +++ 37 files changed, 1637 insertions(+), 313 deletions(-) create mode 100644 lib/api/label_task.dart create mode 100644 lib/api/label_task_bulk.dart create mode 100644 lib/api/labels.dart create mode 100644 lib/api/response.dart create mode 100644 lib/components/datetimePicker.dart create mode 100644 lib/components/label.dart create mode 100644 lib/components/string_extension.dart create mode 100644 lib/models/label.dart create mode 100644 lib/models/labelTask.dart create mode 100644 lib/models/labelTaskBulk.dart create mode 100644 lib/pages/list/task_edit.dart create mode 100644 lib/stores/list_store.dart create mode 100644 lib/utils/datetime_to_unix.dart create mode 100644 lib/utils/repeat_after_parse.dart create mode 100644 test/parse_label_color.dart create mode 100644 test/parse_repeat_after_test.dart create mode 100644 test/task_json_decode_test.dart diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh index babf0d3..7e0d072 100644 --- a/ios/Flutter/flutter_export_environment.sh +++ b/ios/Flutter/flutter_export_environment.sh @@ -2,6 +2,7 @@ # This is a generated file; do not edit or check into version control. export "FLUTTER_ROOT=C:\Android\flutter" export "FLUTTER_APPLICATION_PATH=C:\Users\Aleksandr\AndroidStudioProjects\vikunja" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_TARGET=lib\main.dart" export "FLUTTER_BUILD_DIR=build" export "SYMROOT=${SOURCE_ROOT}/../build\ios" diff --git a/lib/api/client.dart b/lib/api/client.dart index 63ef8f3..1fc7158 100644 --- a/lib/api/client.dart +++ b/lib/api/client.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'dart:convert'; import 'package:http/http.dart' as http; +import 'package:vikunja_app/api/response.dart'; +import 'package:vikunja_app/components/string_extension.dart'; class Client { final JsonDecoder _decoder = new JsonDecoder(); @@ -25,33 +27,46 @@ class Client { 'Content-Type': 'application/json' }; - Future get(String url) { - return http.get(Uri.parse('${this.base}$url'), + Future get(String url, + [Map> queryParameters]) { + // TODO: This could be moved to a seperate function + var uri = Uri.parse('${this.base}$url'); + // Because these are all final values, we can't just add the queryParameters and must instead build a new Uri Object every time this method is called. + var newUri = Uri( + scheme: uri.scheme, + userInfo: uri.userInfo, + host: uri.host, + port: uri.port, + path: uri.path, + query: uri.query, + queryParameters: queryParameters, + // Because dart takes a Map here, it is only possible to sort by one parameter while the api supports n parameters. + fragment: uri.fragment); + return http.get(newUri, headers: _headers) + .then(_handleResponse); + } + + Future delete(String url) { + return http.delete('${this.base}$url'.toUri(), headers: _headers, ).then(_handleResponse); } - Future delete(String url) { - return http.delete(Uri.parse('${this.base}$url'), - headers: _headers, - ).then(_handleResponse); - } - - Future post(String url, {dynamic body}) { - return http.post(Uri.parse('${this.base}$url'), + Future post(String url, {dynamic body}) { + return http.post('${this.base}$url'.toUri(), headers: _headers, body: _encoder.convert(body), ).then(_handleResponse); } - Future put(String url, {dynamic body}) { - return http.put(Uri.parse('${this.base}$url'), + Future put(String url, {dynamic body}) { + return http.put('${this.base}$url'.toUri(), headers: _headers, body: _encoder.convert(body), ).then(_handleResponse); } - dynamic _handleResponse(http.Response response) { + Response _handleResponse(http.Response response) { if (response.statusCode < 200 || response.statusCode >= 400 || json == null) { @@ -65,12 +80,17 @@ class Client { throw new ApiException( response.statusCode, response.request.url.toString()); } - return _decoder.convert(response.body); + return Response( + _decoder.convert(response.body), + response.statusCode, + response.headers + ); } } class InvalidRequestApiException extends ApiException { final String message; + InvalidRequestApiException(int errorCode, String path, this.message) : super(errorCode, path); @@ -83,6 +103,7 @@ class InvalidRequestApiException extends ApiException { class ApiException implements Exception { final int errorCode; final String path; + ApiException(this.errorCode, this.path); @override diff --git a/lib/api/label_task.dart b/lib/api/label_task.dart new file mode 100644 index 0000000..e29011f --- /dev/null +++ b/lib/api/label_task.dart @@ -0,0 +1,30 @@ +import 'package:vikunja_app/api/client.dart'; +import 'package:vikunja_app/api/service.dart'; +import 'package:vikunja_app/models/label.dart'; +import 'package:vikunja_app/models/labelTask.dart'; +import 'package:vikunja_app/service/services.dart'; + +class LabelTaskAPIService extends APIService implements LabelTaskService { + LabelTaskAPIService(Client client) : super(client); + + @override + Future