diff --git a/CHANGELOG.md b/CHANGELOG.md
index acf2aaf..c04250d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,8 @@
- Added sorting by oldest
- Moved search into three-dot menu
- Make search case-insensitive
+- Added titles above graphs
+- Some extra optimization for iOS
# 1.0.0-alpha+5
- Add tests
- Add searching through entries to homepage
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
index 9625e10..7c56964 100644
--- a/ios/Flutter/AppFrameworkInfo.plist
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -21,6 +21,6 @@
CFBundleVersion
1.0
MinimumOSVersion
- 11.0
+ 12.0
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
index 592ceee..ec97fc6 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..c4855bf 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/Podfile b/ios/Podfile
new file mode 100644
index 0000000..d97f17e
--- /dev/null
+++ b/ios/Podfile
@@ -0,0 +1,44 @@
+# Uncomment this line to define a global platform for your project
+# platform :ios, '12.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__))
+ target 'RunnerTests' do
+ inherit! :search_paths
+ end
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ end
+end
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
new file mode 100644
index 0000000..1a1ff10
--- /dev/null
+++ b/ios/Podfile.lock
@@ -0,0 +1,77 @@
+PODS:
+ - Flutter (1.0.0)
+ - flutter_file_dialog (0.0.1):
+ - Flutter
+ - flutter_keyboard_visibility (0.0.1):
+ - Flutter
+ - flutter_tesseract_ocr (0.3.4):
+ - Flutter
+ - SwiftyTesseract
+ - fluttertoast (0.0.2):
+ - Flutter
+ - Toast
+ - integration_test (0.0.1):
+ - Flutter
+ - path_provider_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - shared_preferences_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - SwiftyTesseract (3.1.3)
+ - Toast (4.1.0)
+ - url_launcher_ios (0.0.1):
+ - Flutter
+
+DEPENDENCIES:
+ - Flutter (from `Flutter`)
+ - flutter_file_dialog (from `.symlinks/plugins/flutter_file_dialog/ios`)
+ - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`)
+ - flutter_tesseract_ocr (from `.symlinks/plugins/flutter_tesseract_ocr/ios`)
+ - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
+ - integration_test (from `.symlinks/plugins/integration_test/ios`)
+ - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
+ - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
+ - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
+
+SPEC REPOS:
+ trunk:
+ - SwiftyTesseract
+ - Toast
+
+EXTERNAL SOURCES:
+ Flutter:
+ :path: Flutter
+ flutter_file_dialog:
+ :path: ".symlinks/plugins/flutter_file_dialog/ios"
+ flutter_keyboard_visibility:
+ :path: ".symlinks/plugins/flutter_keyboard_visibility/ios"
+ flutter_tesseract_ocr:
+ :path: ".symlinks/plugins/flutter_tesseract_ocr/ios"
+ fluttertoast:
+ :path: ".symlinks/plugins/fluttertoast/ios"
+ integration_test:
+ :path: ".symlinks/plugins/integration_test/ios"
+ path_provider_foundation:
+ :path: ".symlinks/plugins/path_provider_foundation/darwin"
+ shared_preferences_foundation:
+ :path: ".symlinks/plugins/shared_preferences_foundation/darwin"
+ url_launcher_ios:
+ :path: ".symlinks/plugins/url_launcher_ios/ios"
+
+SPEC CHECKSUMS:
+ Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+ flutter_file_dialog: 4c014a45b105709a27391e266c277d7e588e9299
+ flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069
+ flutter_tesseract_ocr: c01971df9e5817a08563298b8ce571fa10e164f1
+ fluttertoast: 31b00dabfa7fb7bacd9e7dbee580d7a2ff4bf265
+ integration_test: 13825b8a9334a850581300559b8839134b124670
+ path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
+ shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
+ SwiftyTesseract: 1f3d96668ae92dc2208d9842c8a59bea9fad2cbb
+ Toast: ec33c32b8688982cecc6348adeae667c1b9938da
+ url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812
+
+PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796
+
+COCOAPODS: 1.13.0
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index fbfbb86..be7a38d 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -8,12 +8,14 @@
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 27C13A219C72D10CF1B85F6B /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 994C9DA5FEE9CD99D93E4648 /* Pods_Runner.framework */; };
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 4A5BC0C55FF0637EADEA4623 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E794546B4010524D367E1DF /* Pods_RunnerTests.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
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 */; };
- 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -40,11 +42,18 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
+ 0E9CD450BDF6FBBDD2648144 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
+ 13828E8DFD40CA39D8C8CB47 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
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 = ""; };
+ 17ABB7090CB6BE30852FCD6C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 5E794546B4010524D367E1DF /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
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 = ""; };
+ 77C260DE7FCBF4A81053C399 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
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 = ""; };
@@ -53,21 +62,48 @@
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 = ""; };
- 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
- 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 994C9DA5FEE9CD99D93E4648 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ B68E4862A35101CA30515D78 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
+ E5D806F9D018078A8C462DC6 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
+ 718F82C14172C3E11888290F /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 4A5BC0C55FF0637EADEA4623 /* Pods_RunnerTests.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 27C13A219C72D10CF1B85F6B /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ 331C8082294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C807B294A618700263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 4BAAA9A11BE10483369792BF /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 994C9DA5FEE9CD99D93E4648 /* Pods_Runner.framework */,
+ 5E794546B4010524D367E1DF /* Pods_RunnerTests.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
@@ -79,14 +115,6 @@
name = Flutter;
sourceTree = "";
};
- 331C8082294A63A400263BE5 /* RunnerTests */ = {
- isa = PBXGroup;
- children = (
- 331C807B294A618700263BE5 /* RunnerTests.swift */,
- );
- path = RunnerTests;
- sourceTree = "";
- };
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
@@ -94,6 +122,8 @@
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
+ B47522B456F585175CCE9181 /* Pods */,
+ 4BAAA9A11BE10483369792BF /* Frameworks */,
);
sourceTree = "";
};
@@ -121,6 +151,19 @@
path = Runner;
sourceTree = "";
};
+ B47522B456F585175CCE9181 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 17ABB7090CB6BE30852FCD6C /* Pods-Runner.debug.xcconfig */,
+ 77C260DE7FCBF4A81053C399 /* Pods-Runner.release.xcconfig */,
+ E5D806F9D018078A8C462DC6 /* Pods-Runner.profile.xcconfig */,
+ 0E9CD450BDF6FBBDD2648144 /* Pods-RunnerTests.debug.xcconfig */,
+ B68E4862A35101CA30515D78 /* Pods-RunnerTests.release.xcconfig */,
+ 13828E8DFD40CA39D8C8CB47 /* Pods-RunnerTests.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -128,9 +171,10 @@
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
+ C2D4A53BE26B74B847987117 /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */,
- 331C807E294A63A400263BE5 /* Frameworks */,
331C807F294A63A400263BE5 /* Resources */,
+ 718F82C14172C3E11888290F /* Frameworks */,
);
buildRules = (
);
@@ -146,12 +190,14 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
+ FE41F3D3363ED41B1220D8E1 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ E32B5E26E58AE86205FDFCFA /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -169,7 +215,7 @@
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
- LastUpgradeCheck = 1430;
+ LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
331C8080294A63A400263BE5 = {
@@ -254,6 +300,67 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
+ C2D4A53BE26B74B847987117 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-RunnerTests-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;
+ };
+ E32B5E26E58AE86205FDFCFA /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ FE41F3D3363ED41B1220D8E1 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ 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;
+ };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -345,7 +452,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -358,15 +465,19 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
+ ARCHS = x86_64;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = Prasule;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
+ ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = cafe.caras.prasule;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -377,7 +488,7 @@
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */;
+ baseConfigurationReference = 0E9CD450BDF6FBBDD2648144 /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -395,7 +506,7 @@
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */;
+ baseConfigurationReference = B68E4862A35101CA30515D78 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -411,7 +522,7 @@
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */;
+ baseConfigurationReference = 13828E8DFD40CA39D8C8CB47 /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -472,7 +583,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -521,7 +632,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -536,11 +647,14 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
+ ARCHS = x86_64;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = Prasule;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -558,15 +672,19 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
+ ARCHS = x86_64;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = Prasule;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
+ ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = cafe.caras.prasule;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index 87131a0..8e3ca5d 100644
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
+
+
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 03b56bc..cb4ba33 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -2,6 +2,8 @@
+ CADisableMinimumFrameDurationOnPhone
+
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleDisplayName
@@ -24,6 +26,12 @@
$(FLUTTER_BUILD_NUMBER)
LSRequiresIPhoneOS
+ NSCameraUsageDescription
+ Used for data import from pictures
+ NSPhotoLibraryUsageDescription
+ Used for data import from pictures
+ UIApplicationSupportsIndirectInputEvents
+
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
@@ -41,13 +49,16 @@
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
- CADisableMinimumFrameDurationOnPhone
-
- UIApplicationSupportsIndirectInputEvents
-
- NSPhotoLibraryUsageDescription
- Used for data import from pictures
- NSCameraUsageDescription
- Used for data import from pictures
+ UTExportedTypeDeclarations
+
+
+ UTTypeDescription
+
+ UTTypeIconFiles
+
+ UTTypeTagSpecification
+
+
+
diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb
index f7074e0..51525c0 100644
--- a/lib/l10n/app_cs.arb
+++ b/lib/l10n/app_cs.arb
@@ -110,5 +110,8 @@
"sortNewest":"Nejnovější první",
"sortOldest":"Nejstarší první",
"sort":"Seřadit",
- "search":"Prohledat"
+ "search":"Prohledat",
+ "expensesPerYear":"Měsíční výdaje v roce {year}",
+ "expensesPerMonth":"Denní výdaje během měsíce {monthYear}",
+ "expensesPerCategory":"Total expenses per category"
}
\ No newline at end of file
diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb
index 89e1ddb..0105718 100644
--- a/lib/l10n/app_en.arb
+++ b/lib/l10n/app_en.arb
@@ -226,5 +226,26 @@
"sortNewest":"Newest first",
"sortOldest":"Oldest first",
"sort":"Sort",
- "search":"Search"
+ "search":"Search",
+ "expensesPerYear":"Expenses per month in {year}",
+ "@expensesPerYear":{
+ "placeholders": {
+ "year":{
+ "description": "The year of the monthly expense sum",
+ "example": "2024",
+ "type": "int"
+ }
+ }
+ },
+ "expensesPerMonth":"Expenses per day during {monthYear}",
+ "@expensesPerMonth":{
+ "placeholders": {
+ "monthYear":{
+ "description": "Month and year formatted through DateFormat class",
+ "example": "June, 2024",
+ "type": "String"
+ }
+ }
+ },
+ "expensesPerCategory":"Total expenses per category"
}
\ No newline at end of file
diff --git a/lib/util/graphs.dart b/lib/util/graphs.dart
index 1fba13e..89696e7 100644
--- a/lib/util/graphs.dart
+++ b/lib/util/graphs.dart
@@ -71,6 +71,7 @@ class ExpensesLineChart extends StatelessWidget {
LineChartData(
lineTouchData: LineTouchData(
touchTooltipData: LineTouchTooltipData(
+ tooltipBgColor: Theme.of(context).colorScheme.secondaryContainer,
getTooltipItems: (spots) => List.generate(
spots.length,
(index) => LineTooltipItem(
@@ -439,7 +440,9 @@ class _CategoriesPieChartState extends State {
const SizedBox(
height: 5,
),
- Expanded(
+ LimitedBox(
+ maxHeight: MediaQuery.of(context).size.height * 0.23,
+ maxWidth: MediaQuery.of(context).size.width * 0.9,
child: PieChart(
PieChartData(
centerSpaceRadius: double.infinity,
diff --git a/lib/views/graph_view.dart b/lib/views/graph_view.dart
index c5b8108..da86f5b 100644
--- a/lib/views/graph_view.dart
+++ b/lib/views/graph_view.dart
@@ -96,18 +96,8 @@ class _GraphViewState extends State {
return Scaffold(
floatingActionButton: Tooltip(
message: AppLocalizations.of(context).changeDate,
- child: PlatformButton(
- style: ButtonStyle(
- backgroundColor: MaterialStateProperty.all(
- Theme.of(context).colorScheme.primary,
- ),
- foregroundColor: MaterialStateProperty.all(
- Theme.of(context).colorScheme.onPrimary,
- ),
- ),
- text: yearly
- ? DateFormat.y(locale).format(_selectedDate)
- : DateFormat.yMMMM(locale).format(_selectedDate),
+ child: FloatingActionButton(
+ child: const Icon(Icons.calendar_month),
onPressed: () async {
final firstDate = (selectedWallet!.entries
..sort(
@@ -266,6 +256,23 @@ class _GraphViewState extends State {
padding: const EdgeInsets.all(8),
child: Column(
children: [
+ Text(
+ yearly
+ ? AppLocalizations.of(context)
+ .expensesPerYear(_selectedDate.year)
+ : AppLocalizations.of(context)
+ .expensesPerMonth(
+ DateFormat.yMMMM()
+ .format(_selectedDate),
+ ),
+ style: const TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.bold,
+ ),
+ ),
+ const SizedBox(
+ height: 15,
+ ),
SizedBox(
width: MediaQuery.of(context).size.width * 0.9,
height:
@@ -328,14 +335,28 @@ class _GraphViewState extends State {
Theme.of(context).colorScheme.secondaryContainer,
),
width: MediaQuery.of(context).size.width * 0.95,
- height: MediaQuery.of(context).size.height * 0.35,
- child: Padding(
- padding: const EdgeInsets.all(8),
- child: CategoriesPieChart(
- symbol: selectedWallet!.currency.symbol,
- entries: selectedWallet!.entries,
- categories: selectedWallet!.categories,
- ),
+ height: MediaQuery.of(context).size.height * 0.4,
+ child: Column(
+ children: [
+ const SizedBox(
+ height: 10,
+ ),
+ Text(
+ AppLocalizations.of(context).expensesPerCategory,
+ style: const TextStyle(
+ fontSize: 16,
+ fontWeight: FontWeight.bold,
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.all(8),
+ child: CategoriesPieChart(
+ symbol: selectedWallet!.currency.symbol,
+ entries: selectedWallet!.entries,
+ categories: selectedWallet!.categories,
+ ),
+ ),
+ ],
),
),
],
diff --git a/lib/views/home.dart b/lib/views/home.dart
index 222ac1c..0b6078b 100644
--- a/lib/views/home.dart
+++ b/lib/views/home.dart
@@ -318,6 +318,11 @@ class _HomeViewState extends State {
TextSpan(
text: AppLocalizations.of(context)
.balanceStatusA,
+ style: TextStyle(
+ color: Theme.of(context)
+ .colorScheme
+ .onBackground,
+ ),
),
TextSpan(
style: TextStyle(
@@ -363,6 +368,11 @@ class _HomeViewState extends State {
TextSpan(
text: AppLocalizations.of(context)
.balanceStatusB,
+ style: TextStyle(
+ color: Theme.of(context)
+ .colorScheme
+ .onBackground,
+ ),
),
],
),
diff --git a/lib/views/settings/settings.dart b/lib/views/settings/settings.dart
index 92e0ba0..47ea3d1 100644
--- a/lib/views/settings/settings.dart
+++ b/lib/views/settings/settings.dart
@@ -107,190 +107,192 @@ class _SettingsViewState extends State {
),
],
),
- SettingsSection(
- title: Text(AppLocalizations.of(context).settingsData),
- tiles: [
- SettingsTile.navigation(
- title: Text(AppLocalizations.of(context).exportSingle),
- description:
- Text(AppLocalizations.of(context).exportSingleDesc),
- onPressed: (ctx) async {
- final all = await WalletManager.listWallets();
- if (!ctx.mounted) return;
- final w = await showAdaptiveDialog(
- context: ctx,
- builder: (ctx) => AlertDialog.adaptive(
- title: Text(
- AppLocalizations.of(context).selectExportWallet,
- ),
- actions: [
- PlatformButton(
- text: AppLocalizations.of(context).cancel,
- onPressed: () => Navigator.of(ctx).pop(),
+ if (!Platform.isIOS)
+ SettingsSection(
+ //! TODO: Find a replacement for iOS
+ title: Text(AppLocalizations.of(context).settingsData),
+ tiles: [
+ SettingsTile.navigation(
+ title: Text(AppLocalizations.of(context).exportSingle),
+ description:
+ Text(AppLocalizations.of(context).exportSingleDesc),
+ onPressed: (ctx) async {
+ final all = await WalletManager.listWallets();
+ if (!ctx.mounted) return;
+ final w = await showAdaptiveDialog(
+ context: ctx,
+ builder: (ctx) => AlertDialog.adaptive(
+ title: Text(
+ AppLocalizations.of(context).selectExportWallet,
),
- ],
- content: SizedBox(
- width: MediaQuery.of(context).size.width * 0.7,
- height: MediaQuery.of(context).size.height * 0.3,
- child: ListView.builder(
- itemBuilder: (con, i) => InkWell(
- onTap: () => Navigator.of(ctx).pop(all[i].name),
- child: Padding(
- padding: const EdgeInsets.all(8),
- child: Text(
- all[i].name,
- textAlign: TextAlign.center,
+ actions: [
+ PlatformButton(
+ text: AppLocalizations.of(context).cancel,
+ onPressed: () => Navigator.of(ctx).pop(),
+ ),
+ ],
+ content: SizedBox(
+ width: MediaQuery.of(context).size.width * 0.7,
+ height: MediaQuery.of(context).size.height * 0.3,
+ child: ListView.builder(
+ itemBuilder: (con, i) => InkWell(
+ onTap: () => Navigator.of(ctx).pop(all[i].name),
+ child: Padding(
+ padding: const EdgeInsets.all(8),
+ child: Text(
+ all[i].name,
+ textAlign: TextAlign.center,
+ ),
+ ),
+ ),
+ shrinkWrap: true,
+ itemCount: all.length,
+ ),
+ ),
+ ),
+ );
+ if (w == null) return;
+ try {
+ await WalletManager.exportWallet(name: w);
+ } catch (e) {
+ if (!context.mounted) return;
+ unawaited(
+ showAdaptiveDialog(
+ context: context,
+ builder: (ctx) => AlertDialog.adaptive(
+ title: Text(
+ AppLocalizations.of(context).exportError,
+ ),
+ content: SingleChildScrollView(
+ child: Flexible(
+ child: Text(e.toString()),
),
),
),
- shrinkWrap: true,
- itemCount: all.length,
),
- ),
- ),
- );
- if (w == null) return;
- try {
- await WalletManager.exportWallet(name: w);
- } catch (e) {
- if (!context.mounted) return;
- unawaited(
- showAdaptiveDialog(
- context: context,
- builder: (ctx) => AlertDialog.adaptive(
- title: Text(
- AppLocalizations.of(context).exportError,
- ),
- content: SingleChildScrollView(
- child: Flexible(
- child: Text(e.toString()),
- ),
- ),
- ),
- ),
- );
- logger.e(e);
- return;
- }
- if (!ctx.mounted) return;
- unawaited(
- showMessage(
- AppLocalizations.of(ctx).exportCompleted,
- ctx,
- ),
- );
- },
- ),
- SettingsTile.navigation(
- title: Text(AppLocalizations.of(context).exportArchive),
- description:
- Text(AppLocalizations.of(context).exportArchiveDesc),
- onPressed: (ctx) async {
- try {
- await WalletManager.exportAllWallets();
- } catch (e) {
+ );
+ logger.e(e);
+ return;
+ }
if (!ctx.mounted) return;
unawaited(
- showAdaptiveDialog(
- context: context,
- builder: (ctx) => AlertDialog.adaptive(
- title: Text(
- AppLocalizations.of(context).exportError,
- ),
- content: SingleChildScrollView(
- child: Flexible(
- child: Text(e.toString()),
+ showMessage(
+ AppLocalizations.of(ctx).exportCompleted,
+ ctx,
+ ),
+ );
+ },
+ ),
+ SettingsTile.navigation(
+ title: Text(AppLocalizations.of(context).exportArchive),
+ description:
+ Text(AppLocalizations.of(context).exportArchiveDesc),
+ onPressed: (ctx) async {
+ try {
+ await WalletManager.exportAllWallets();
+ } catch (e) {
+ if (!ctx.mounted) return;
+ unawaited(
+ showAdaptiveDialog(
+ context: context,
+ builder: (ctx) => AlertDialog.adaptive(
+ title: Text(
+ AppLocalizations.of(context).exportError,
+ ),
+ content: SingleChildScrollView(
+ child: Flexible(
+ child: Text(e.toString()),
+ ),
),
),
),
- ),
- );
- logger.e(e);
- return;
- }
- if (!ctx.mounted) return;
- unawaited(
- showMessage(
- AppLocalizations.of(ctx).exportCompleted,
- context,
- ),
- );
- },
- ),
- SettingsTile.navigation(
- title: Text(AppLocalizations.of(context).importSingle),
- description:
- Text(AppLocalizations.of(context).importSingleDesc),
- onPressed: (ctx) async {
- try {
- await WalletManager.importWallet();
- } catch (e) {
+ );
+ logger.e(e);
+ return;
+ }
if (!ctx.mounted) return;
unawaited(
- showAdaptiveDialog(
- context: context,
- builder: (ctx) => AlertDialog.adaptive(
- title: Text(
- AppLocalizations.of(context).exportError,
- ),
- content: SingleChildScrollView(
- child: Flexible(
- child: Text(e.toString()),
+ showMessage(
+ AppLocalizations.of(ctx).exportCompleted,
+ context,
+ ),
+ );
+ },
+ ),
+ SettingsTile.navigation(
+ title: Text(AppLocalizations.of(context).importSingle),
+ description:
+ Text(AppLocalizations.of(context).importSingleDesc),
+ onPressed: (ctx) async {
+ try {
+ await WalletManager.importWallet();
+ } catch (e) {
+ if (!ctx.mounted) return;
+ unawaited(
+ showAdaptiveDialog(
+ context: context,
+ builder: (ctx) => AlertDialog.adaptive(
+ title: Text(
+ AppLocalizations.of(context).exportError,
+ ),
+ content: SingleChildScrollView(
+ child: Flexible(
+ child: Text(e.toString()),
+ ),
),
),
),
- ),
- );
- logger.e(e);
- return;
- }
- if (!ctx.mounted) return;
- unawaited(
- showMessage(
- AppLocalizations.of(ctx).importCompleted,
- context,
- ),
- );
- },
- ),
- SettingsTile.navigation(
- title: Text(AppLocalizations.of(context).importArchive),
- description:
- Text(AppLocalizations.of(context).importArchiveDesc),
- onPressed: (ctx) async {
- try {
- await WalletManager.importArchive();
- } catch (e) {
+ );
+ logger.e(e);
+ return;
+ }
if (!ctx.mounted) return;
unawaited(
- showAdaptiveDialog(
- context: context,
- builder: (ctx) => AlertDialog.adaptive(
- title: Text(
- AppLocalizations.of(context).exportError,
- ),
- content: SingleChildScrollView(
- child: Flexible(
- child: Text(e.toString()),
+ showMessage(
+ AppLocalizations.of(ctx).importCompleted,
+ context,
+ ),
+ );
+ },
+ ),
+ SettingsTile.navigation(
+ title: Text(AppLocalizations.of(context).importArchive),
+ description:
+ Text(AppLocalizations.of(context).importArchiveDesc),
+ onPressed: (ctx) async {
+ try {
+ await WalletManager.importArchive();
+ } catch (e) {
+ if (!ctx.mounted) return;
+ unawaited(
+ showAdaptiveDialog(
+ context: context,
+ builder: (ctx) => AlertDialog.adaptive(
+ title: Text(
+ AppLocalizations.of(context).exportError,
+ ),
+ content: SingleChildScrollView(
+ child: Flexible(
+ child: Text(e.toString()),
+ ),
),
),
),
+ );
+ logger.e(e);
+ return;
+ }
+ if (!ctx.mounted) return;
+ unawaited(
+ showMessage(
+ AppLocalizations.of(ctx).importCompleted,
+ context,
),
);
- logger.e(e);
- return;
- }
- if (!ctx.mounted) return;
- unawaited(
- showMessage(
- AppLocalizations.of(ctx).importCompleted,
- context,
- ),
- );
- },
- ),
- ],
- ),
+ },
+ ),
+ ],
+ ),
],
),
);