Compare commits

...

32 Commits

Author SHA1 Message Date
HammyHavoc 47ae5ea8c7 Fixed a typo in title
:- )
2022-01-27 08:06:36 +00:00
JonasFranz fd33172250 Upgrade android embedding to v2 (#60)
Co-authored-by: Jonas Franz <info@jonasfranz.software>
Reviewed-on: vikunja/app#60
Reviewed-by: konrad <konrad@kola-entertainments.de>
Co-authored-by: JonasFranz <email@jfdev.de>
Co-committed-by: JonasFranz <email@jfdev.de>
2021-01-18 13:20:32 +00:00
JonasFranz 5d0b424217 Fix badges (#59)
Co-authored-by: Jonas Franz <info@jonasfranz.software>
Reviewed-on: vikunja/app#59
Reviewed-by: konrad <konrad@kola-entertainments.de>
Co-authored-by: JonasFranz <email@jfdev.de>
Co-committed-by: JonasFranz <email@jfdev.de>
2021-01-17 15:03:10 +00:00
Jonas Franz 09b15a249c
Re-enable dependencies for iOS build 2021-01-17 15:52:04 +01:00
Jonas Franz 7fa0835063
Remove depenedncy 2021-01-16 19:07:30 +01:00
Jonas Franz dbc3a77105
rbenv fix 2021-01-16 19:07:10 +01:00
Jonas Franz 50cb3318d4
Add rbenv 2021-01-16 19:01:36 +01:00
Jonas Franz f422b73414
Use local bundle path 2021-01-16 18:15:34 +01:00
Jonas Franz 89f790c38c
Use bundle install 2021-01-16 18:10:34 +01:00
JonasFranz 5ffa78c97c Fix iOS build (#58)
Co-authored-by: Jonas Franz <info@jonasfranz.software>
Reviewed-on: vikunja/app#58
Reviewed-by: konrad <konrad@kola-entertainments.de>
Co-authored-by: JonasFranz <email@jfdev.de>
Co-committed-by: JonasFranz <email@jfdev.de>
2021-01-10 20:41:44 +00:00
renovate 3adfe3c860 Update dependency gradle to v4.10.3 (#54)
Update dependency gradle to v4.10.3

Reviewed-on: vikunja/app#54
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-12-26 17:54:01 +00:00
renovate 442251f636 Update dependency flutter_secure_storage to v3.3.5 (#53)
Update dependency flutter_secure_storage to v3.3.5

Reviewed-on: vikunja/app#53
Reviewed-by: konrad <konrad@kola-entertainments.de>
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-12-26 17:53:48 +00:00
kolaente 2fc3aabae3
Fix s3 release bucket credentials 2020-12-26 18:42:53 +01:00
renovate 648e9c5748 Update dependency flutter_launcher_icons to ^0.8.0 (#52)
Update dependency flutter_launcher_icons to ^0.8.0

Reviewed-on: vikunja/app#52
Reviewed-by: konrad <konrad@kola-entertainments.de>
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-12-25 11:42:11 +00:00
renovate 99f1e1aed4 Configure Renovate (#51)
Add renovate.json

Reviewed-on: vikunja/app#51
Co-Authored-By: renovate <renovatebot@kolaente.de>
Co-Committed-By: renovate <renovatebot@kolaente.de>
2020-12-24 14:17:01 +00:00
JonasFranz 23c048b3f4 Remove chown to fix ci (#49)
Remove chown to fix ci

Reviewed-on: vikunja/app#49
Reviewed-by: konrad <konrad@kola-entertainments.de>
Co-Authored-By: JonasFranz <email@jfdev.de>
Co-Committed-By: JonasFranz <email@jfdev.de>
2020-10-24 10:47:00 +00:00
kolaente 0bbc552945
Use the updated logo 2020-09-03 21:29:23 +02:00
kolaente de77bd2565
Update dependencies 2020-07-10 10:34:58 +02:00
kolaente 8f595c340f
Revert "Add sentry (#43)"
This reverts commit 9c2622e7
2020-07-10 10:32:16 +02:00
JonasFranz 2abdcc4ca9 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 <email@jfdev.de>
Co-authored-by: Jonas Franz <info@jonasfranz.software>
Reviewed-on: vikunja/app#47
Reviewed-by: konrad <konrad@kola-entertainments.de>
2020-06-24 08:37:29 +00:00
JonasFranz 3ecf6cd9dd 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 <k@knt.li>
Co-authored-by: Jonas Franz <info@jonasfranz.software>
Reviewed-on: vikunja/app#46
Reviewed-by: konrad <konrad@kola-entertainments.de>
2020-06-17 17:41:40 +00:00
JonasFranz 8993999a68 Improve error handling (#45)
Improve error handling

Co-authored-by: Jonas Franz <info@jonasfranz.software>
Reviewed-on: vikunja/app#45
Reviewed-by: konrad <konrad@kola-entertainments.de>
2020-06-17 16:51:23 +00:00
JonasFranz 6c0762d458 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 <info@jonasfranz.software>
Co-authored-by: Buildslave <buildslave@macmini.fritz.box>
Reviewed-on: vikunja/app#42
Reviewed-by: konrad <konrad@kola-entertainments.de>
2020-06-17 15:54:19 +00:00
JonasFranz 9c2622e77f Add sentry (#43)
Refactor DSN to constants

Use correct import

Add sentry

Co-authored-by: Jonas Franz <info@jonasfranz.software>
Reviewed-on: vikunja/app#43
Reviewed-by: konrad <konrad@kola-entertainments.de>
2020-06-17 15:37:42 +00:00
kolaente 4adee85d62
Don't try to run tests in pipeline 2020-06-16 00:18:09 +02:00
kolaente 020cfa2bde
Format 2020-06-15 23:48:15 +02:00
kolaente 9973816dde
Fix all json fields being snake_case 2020-06-15 23:46:10 +02:00
kolaente 68d3ffd30d
Rename namespace name and task text to title 2020-06-15 23:42:12 +02:00
kolaente 46fc580b7b
Format 2020-04-27 17:09:33 +02:00
kolaente 361057aa9f
Fix date format 2020-04-27 17:02:55 +02:00
kolaente 14300266ef
Change release bucket 2020-03-01 22:56:05 +01:00
kolaente a2f53ce711
Use the same image for building and testing in ci 2020-01-15 23:38:02 +01:00
42 changed files with 436 additions and 191 deletions

View File

@ -1,4 +1,5 @@
kind: pipeline
type: docker
name: testing
workspace:
@ -22,20 +23,21 @@ 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
- name: test
image: vikunja/flutter-build
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
type: docker
name: release-latest
depends_on:
@ -59,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
@ -70,19 +71,21 @@ steps:
image: plugins/s3:1
pull: true
settings:
bucket: vikunja-app
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/*
target: /master
target: /app/master
---
kind: pipeline
type: docker
name: release-version
depends_on:
@ -104,7 +107,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
@ -114,13 +116,74 @@ steps:
image: plugins/s3:1
pull: true
settings:
bucket: vikunja-app
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/*
target: /${DRONE_TAG##v}
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
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:
- eval "$(rbenv init -)"
- rbenv shell 2.5.0
- cd ios
- bundle config set --local path '.vendor/bundle'
- bundle install
- bundle exec fastlane ios signing
- bundle exec fastlane ios beta
depends_on:
- testing

6
.gitignore vendored
View File

@ -70,4 +70,8 @@ build/
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
!/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

View File

@ -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:

View File

@ -1,7 +1,8 @@
# Vikunja Cross-Plattform app
# Vikunja Cross-Platform 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.
Vikunja as Flutter cross-platform app.

View File

@ -13,7 +13,6 @@
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<application
android:name="io.flutter.app.FlutterApplication"
android:label="Vikunja"
android:icon="@mipmap/ic_launcher">
<activity
@ -23,17 +22,13 @@
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- This keeps the window background of the activity showing
until Flutter renders its first frame. It can be removed if
there is no splash screen (such as the default splash screen
defined in @style/LaunchTheme). -->
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</activity>
</application>
</manifest>

View File

@ -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()

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -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

View File

@ -1,10 +0,0 @@
#!/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"

3
ios/Gemfile Normal file
View File

@ -0,0 +1,3 @@
source "https://rubygems.org"
gem "fastlane"

41
ios/Podfile Normal file
View File

@ -0,0 +1,41 @@
# 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 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
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
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_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end

View File

@ -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,21 @@
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
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 = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = "<group>"; };
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 = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
BD0C880424A0CB4300291E83 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
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 = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -62,8 +55,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 +73,8 @@
7CACC4C503C5D851EB73C215 /* Pods */ = {
isa = PBXGroup;
children = (
CA78C9A9831542FDDB6FB31E /* Pods-Runner.debug.xcconfig */,
1CD140BF817CCDA821C9152F /* Pods-Runner.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
@ -89,10 +82,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 */,
@ -122,6 +112,7 @@
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
BD0C880424A0CB4300291E83 /* Runner.entitlements */,
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
@ -157,7 +148,6 @@
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
85082CB7F9EE2F3E7985BDB9 /* [CP] Embed Pods Frameworks */,
7C22F5DE30AEBAB42040EB3F /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@ -181,6 +171,7 @@
CreatedOnToolsVersion = 7.3.1;
DevelopmentTeam = Z48VLBM2R7;
LastSwiftMigration = 0910;
ProvisioningStyle = Manual;
};
};
};
@ -189,6 +180,7 @@
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
Base,
);
@ -211,7 +203,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 +240,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 +248,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 +259,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 */ = {
@ -336,7 +312,6 @@
/* Begin XCBuildConfiguration section */
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
@ -390,7 +365,6 @@
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
@ -443,6 +417,8 @@
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;
ENABLE_BITCODE = NO;
@ -458,6 +434,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 +449,9 @@
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)";
DEVELOPMENT_TEAM = Z48VLBM2R7;
ENABLE_BITCODE = NO;
@ -487,6 +467,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;

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
</dict>
</plist>

8
ios/fastlane/Appfile Normal file
View File

@ -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

45
ios/fastlane/Fastfile Normal file
View File

@ -0,0 +1,45 @@
# 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(
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)
match(type: "development", readonly: true)
end
end

13
ios/fastlane/Matchfile Normal file
View File

@ -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

View File

@ -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<String, dynamic> 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;

View File

@ -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: <Widget>[
FlatButton(
child: Text('Close'),
onPressed: () => Navigator.of(context).maybePop(),
)
],
);
}
}

View File

@ -41,7 +41,7 @@ class TaskTileState extends State<TaskTile> {
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<TaskTile> {
);
}
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<TaskTile> {
return VikunjaGlobal.of(context).taskService.update(Task(
id: task.id,
done: checked,
text: task.text,
title: task.title,
description: task.description,
owner: null,
));

View File

@ -120,9 +120,9 @@ class VikunjaGlobalState extends State<VikunjaGlobal> {
});
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;

View File

@ -17,6 +17,7 @@ class VikunjaApp extends StatelessWidget {
return new MaterialApp(
title: 'Vikunja',
theme: buildVikunjaTheme(),
darkTheme: buildVikunjaDarkTheme(),
home: this.home,
);
}

View File

@ -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<dynamic>)
?.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(),
};
}
}

View File

@ -4,29 +4,29 @@ 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<String, dynamic> json)
: name = json['name'],
: title = json['title'],
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,
"name": name,
"created": created?.toIso8601String(),
"updated": updated?.toIso8601String(),
"title": title,
"owner": owner?.toJSON(),
"description": description
};

View File

@ -5,7 +5,7 @@ class Task {
final int id;
final DateTime created, updated, due;
final List<DateTime> reminders;
final String text, description;
final String title, description;
final bool done;
final User owner;
@ -15,34 +15,35 @@ class Task {
this.updated,
this.reminders,
this.due,
@required this.text,
@required this.title,
this.description,
@required this.done,
@required this.owner});
Task.fromJson(Map<String, dynamic> json)
: id = json['id'],
updated = DateTime.fromMillisecondsSinceEpoch(json['updated']),
created = DateTime.fromMillisecondsSinceEpoch(json['created']),
reminders = (json['reminderDates'] as List<dynamic>)
?.map((milli) => DateTime.fromMillisecondsSinceEpoch(milli))
updated = DateTime.parse(json['updated']),
created = DateTime.parse(json['created']),
reminders = (json['reminder_dates'] as List<dynamic>)
?.map((r) => DateTime.parse(r))
?.toList(),
due = DateTime.fromMillisecondsSinceEpoch(json['dueDate']),
due =
json['due_date'] != null ? DateTime.parse(json['due_date']) : null,
description = json['description'],
text = json['text'],
title = json['title'],
done = json['done'],
owner = User.fromJson(json['createdBy']);
owner = User.fromJson(json['created_by']);
toJSON() => {
'id': id,
'updated': updated?.millisecondsSinceEpoch,
'created': created?.millisecondsSinceEpoch,
'reminderDates':
reminders?.map((date) => date.millisecondsSinceEpoch)?.toList(),
'dueDate': due?.millisecondsSinceEpoch,
'updated': updated?.toIso8601String(),
'created': created?.toIso8601String(),
'reminder_dates':
reminders?.map((date) => date.toIso8601String())?.toList(),
'due_date': due?.toIso8601String(),
'description': description,
'text': text,
'title': title,
'done': done ?? false,
'createdBy': owner?.toJSON()
'created_by': owner?.toJSON()
};
}

View File

@ -1,18 +1,23 @@
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<String, dynamic> 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";
}
}

View File

@ -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';
@ -37,7 +38,7 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
.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 +73,7 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
return new Scaffold(
appBar: AppBar(
title: new Text(_currentNamespace?.name ?? 'Vikunja'),
title: new Text(_currentNamespace?.title ?? 'Vikunja'),
actions: _currentNamespace == null
? null
: <Widget>[
@ -101,7 +102,7 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
currentAccountPicture: currentUser == null
? null
: CircleAvatar(
backgroundImage: NetworkImage(currentUser.avatarUrl()),
backgroundImage: NetworkImage(currentUser.avatarUrl(context)),
),
decoration: BoxDecoration(
image: DecorationImage(
@ -156,13 +157,14 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
_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(
content: Text('The namespace was created successfully!'),
));
});
}).catchError((error) => showDialog(
context: context, builder: (context) => ErrorDialog(error: error)));
}
Future<void> _loadNamespaces() {

View File

@ -110,8 +110,8 @@ class _ListPageState extends State<ListPage> {
_addItem(String name, BuildContext context) {
var globalState = VikunjaGlobal.of(context);
var newTask =
Task(id: null, text: 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(() {

View File

@ -36,7 +36,7 @@ class _NamespaceEditPageState extends State<NamespaceEditPage> {
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<NamespaceEditPage> {
// 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);

View File

@ -34,7 +34,9 @@ class _LoginPageState extends State<LoginPage> {
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',
),

View File

@ -7,12 +7,12 @@ 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(
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(),

View File

@ -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,
),

View File

@ -15,6 +15,7 @@ const vGreen = Color(0xFF00CE6E);
const vButtonColor = vPrimary;
const vButtonTextColor = vWhite;
const vButtonShadowDark = Color(0xFF0b2a4a);
const vButtonShadow = Color(0xFFb2d9ff);
///////////

View File

@ -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,

View File

@ -14,42 +14,56 @@ 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.5.0-nullsafety.1"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.5"
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.2"
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.11"
version: "1.15.0-nullsafety.3"
convert:
dependency: transitive
description:
@ -63,7 +77,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:
@ -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
@ -124,28 +136,28 @@ packages:
name: image
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.4"
version: "2.1.12"
matcher:
dependency: transitive
description:
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.0.5"
sky_engine:
dependency: transitive
description: flutter
@ -178,63 +183,63 @@ packages:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.5.5"
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.11"
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:
name: xml
url: "https://pub.dartlang.org"
source: hosted
version: "3.5.0"
version: "3.6.1"
yaml:
dependency: transitive
description:
@ -243,4 +248,5 @@ packages:
source: hosted
version: "2.2.0"
sdks:
dart: ">=2.4.0 <3.0.0"
dart: ">=2.10.0-110 <2.11.0"
flutter: ">=1.20.0 <2.0.0"

View File

@ -10,14 +10,14 @@ 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
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"
@ -33,6 +33,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:

6
renovate.json Normal file
View File

@ -0,0 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base"
]
}