From 8933493dd1c18f62bc710a584ba83e1dcfe5ba44 Mon Sep 17 00:00:00 2001 From: baldeau Date: Tue, 8 Oct 2024 16:22:54 +0200 Subject: [PATCH] initial commit --- .gitignore | 46 ++ .metadata | 10 + .vscode/launch.json | 15 + README.md | 17 + analysis_options.yaml | 29 + android/.gitignore | 13 + android/app/build.gradle | 68 ++ android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 35 ++ .../pet_activity_tracker/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../app/src/main/res/drawable/app_icon.png | Bin 0 -> 33273 bytes .../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 .../app/src/main/res/values-night/styles.xml | 18 + android/app/src/main/res/values/styles.xml | 18 + android/app/src/profile/AndroidManifest.xml | 7 + android/build.gradle | 31 + android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + android/settings.gradle | 11 + assets/data/rest.json | 57 ++ assets/icon/icon.png | Bin 0 -> 33273 bytes ios/.gitignore | 34 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 2 + ios/Flutter/Release.xcconfig | 2 + ios/Podfile | 41 ++ ios/Podfile.lock | 52 ++ ios/Runner.xcodeproj/project.pbxproj | 554 ++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + ios/Runner/AppDelegate.swift | 18 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 85023 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 741 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1519 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 2408 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1072 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 2314 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 3476 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1519 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 3262 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 4923 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 4923 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 7780 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 2992 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 6409 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 7198 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 | 68 ++ ios/Runner/Runner-Bridging-Header.h | 1 + lib/db/dbprovider.dart | 81 +++ lib/db/models.dart | 48 ++ lib/main.dart | 99 +++ lib/pages/daily_activity_chart.dart | 87 +++ lib/pages/daily_activity_series.dart | 11 + lib/pages/daily_activity_time_chart.dart | 79 +++ lib/pages/daily_activity_time_series.dart | 12 + lib/pages/dashboard_page.dart | 534 ++++++++++++++++ lib/pages/settings_page.dart | 18 + lib/pages/weekly_activity_chart.dart | 166 +++++ lib/pages/weekly_activity_series.dart | 17 + lib/shared/notification_service.dart | 95 +++ lib/shared/variables.dart | 43 ++ macos/.gitignore | 7 + macos/Flutter/Flutter-Debug.xcconfig | 2 + macos/Flutter/Flutter-Release.xcconfig | 2 + macos/Flutter/GeneratedPluginRegistrant.swift | 18 + macos/Podfile | 40 ++ macos/Runner.xcodeproj/project.pbxproj | 572 +++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + macos/Runner/AppDelegate.swift | 9 + .../AppIcon.appiconset/Contents.json | 68 ++ .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 46993 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 3276 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 1429 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 5933 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1243 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 14800 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 1874 bytes macos/Runner/Base.lproj/MainMenu.xib | 343 ++++++++++ macos/Runner/Configs/AppInfo.xcconfig | 14 + macos/Runner/Configs/Debug.xcconfig | 2 + macos/Runner/Configs/Release.xcconfig | 2 + macos/Runner/Configs/Warnings.xcconfig | 13 + macos/Runner/DebugProfile.entitlements | 12 + macos/Runner/Info.plist | 32 + macos/Runner/MainFlutterWindow.swift | 15 + macos/Runner/Release.entitlements | 8 + ml-data/rest.csv | 7 + pubspec.lock | 594 ++++++++++++++++++ pubspec.yaml | 101 +++ web/favicon.png | Bin 0 -> 917 bytes web/icons/Icon-192.png | Bin 0 -> 5292 bytes web/icons/Icon-512.png | Bin 0 -> 8252 bytes web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes web/index.html | 104 +++ web/manifest.json | 35 ++ windows/.gitignore | 17 + windows/CMakeLists.txt | 95 +++ windows/flutter/CMakeLists.txt | 103 +++ .../flutter/generated_plugin_registrant.cc | 11 + windows/flutter/generated_plugin_registrant.h | 15 + windows/flutter/generated_plugins.cmake | 15 + windows/runner/CMakeLists.txt | 17 + windows/runner/Runner.rc | 121 ++++ windows/runner/flutter_window.cpp | 61 ++ windows/runner/flutter_window.h | 33 + windows/runner/main.cpp | 43 ++ windows/runner/resource.h | 16 + windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes windows/runner/runner.exe.manifest | 20 + windows/runner/utils.cpp | 64 ++ windows/runner/utils.h | 19 + windows/runner/win32_window.cpp | 245 ++++++++ windows/runner/win32_window.h | 98 +++ 136 files changed, 5961 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 .vscode/launch.json create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/com/example/pet_activity_tracker/MainActivity.kt create mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 android/app/src/main/res/drawable/app_icon.png 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-night/styles.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 assets/data/rest.json create mode 100644 assets/icon/icon.png 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/Podfile create mode 100644 ios/Podfile.lock create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings 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/db/dbprovider.dart create mode 100644 lib/db/models.dart create mode 100644 lib/main.dart create mode 100644 lib/pages/daily_activity_chart.dart create mode 100644 lib/pages/daily_activity_series.dart create mode 100644 lib/pages/daily_activity_time_chart.dart create mode 100644 lib/pages/daily_activity_time_series.dart create mode 100644 lib/pages/dashboard_page.dart create mode 100644 lib/pages/settings_page.dart create mode 100644 lib/pages/weekly_activity_chart.dart create mode 100644 lib/pages/weekly_activity_series.dart create mode 100644 lib/shared/notification_service.dart create mode 100644 lib/shared/variables.dart create mode 100644 macos/.gitignore create mode 100644 macos/Flutter/Flutter-Debug.xcconfig create mode 100644 macos/Flutter/Flutter-Release.xcconfig create mode 100644 macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 macos/Podfile create mode 100644 macos/Runner.xcodeproj/project.pbxproj create mode 100644 macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 macos/Runner/AppDelegate.swift create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 macos/Runner/Base.lproj/MainMenu.xib create mode 100644 macos/Runner/Configs/AppInfo.xcconfig create mode 100644 macos/Runner/Configs/Debug.xcconfig create mode 100644 macos/Runner/Configs/Release.xcconfig create mode 100644 macos/Runner/Configs/Warnings.xcconfig create mode 100644 macos/Runner/DebugProfile.entitlements create mode 100644 macos/Runner/Info.plist create mode 100644 macos/Runner/MainFlutterWindow.swift create mode 100644 macos/Runner/Release.entitlements create mode 100644 ml-data/rest.csv create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 web/favicon.png create mode 100644 web/icons/Icon-192.png create mode 100644 web/icons/Icon-512.png create mode 100644 web/icons/Icon-maskable-192.png create mode 100644 web/icons/Icon-maskable-512.png create mode 100644 web/index.html create mode 100644 web/manifest.json create mode 100644 windows/.gitignore create mode 100644 windows/CMakeLists.txt create mode 100644 windows/flutter/CMakeLists.txt create mode 100644 windows/flutter/generated_plugin_registrant.cc create mode 100644 windows/flutter/generated_plugin_registrant.h create mode 100644 windows/flutter/generated_plugins.cmake create mode 100644 windows/runner/CMakeLists.txt create mode 100644 windows/runner/Runner.rc create mode 100644 windows/runner/flutter_window.cpp create mode 100644 windows/runner/flutter_window.h create mode 100644 windows/runner/main.cpp create mode 100644 windows/runner/resource.h create mode 100644 windows/runner/resources/app_icon.ico create mode 100644 windows/runner/runner.exe.manifest create mode 100644 windows/runner/utils.cpp create mode 100644 windows/runner/utils.h create mode 100644 windows/runner/win32_window.cpp create mode 100644 windows/runner/win32_window.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0fa6b67 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# 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/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..0a999ee --- /dev/null +++ b/.metadata @@ -0,0 +1,10 @@ +# 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: db747aa1331bd95bc9b3874c842261ca2d302cd5 + channel: stable + +project_type: app diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..7a9dfa0 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "pwa-chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:8080", + "webRoot": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..c19f9a4 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# pet_activity_tracker + +Switched from the discontinued google/charts +to https://pub.dev/packages/community_charts_flutter. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..61b6c4d --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..ba59a38 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,68 @@ +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 flutter.compileSdkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.pet_activity_tracker" + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + 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-jdk7:$kotlin_version" +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..e4197f1 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..f5bd8a4 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/example/pet_activity_tracker/MainActivity.kt b/android/app/src/main/kotlin/com/example/pet_activity_tracker/MainActivity.kt new file mode 100644 index 0000000..56db198 --- /dev/null +++ b/android/app/src/main/kotlin/com/example/pet_activity_tracker/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.pet_activity_tracker + +import io.flutter.embedding.android.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/drawable/app_icon.png b/android/app/src/main/res/drawable/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..823c0767c636617504abe43e3f0f16f7d42ca7f6 GIT binary patch literal 33273 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 IUo!CiU$^A6n*aa+ literal 0 HcmV?d00001 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-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..3db14bb --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + 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..d460d1e --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..e4197f1 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..4256f91 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.6.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +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..94adc3a --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..bc6a58a --- /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-6.7-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..44e62bc --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +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" diff --git a/assets/data/rest.json b/assets/data/rest.json new file mode 100644 index 0000000..d9d6746 --- /dev/null +++ b/assets/data/rest.json @@ -0,0 +1,57 @@ +{ + "protected": { + "ver": "v1", + "alg": "HS256" + }, + "signature": "0000000000000000000000000000000000000000000000000000000000000000", + "payload": { + "device_type": "EDGE_IMPULSE_UPLOADER", + "interval_ms": 20, + "sensors": [ + { + "name": "accX", + "units": "N/A" + }, + { + "name": "accY", + "units": "N/A" + }, + { + "name": "accZ", + "units": "N/A" + } + ], + "values": [ + [ + 4.2208284737736, + 1.88004729202911, + -16.8922898132324 + ], + [ + 4.47177073527873, + 2.00170251775533, + -17.8870800185055 + ], + [ + 4.31928972478658, + 2.49535668029785, + -18.9261635390133 + ], + [ + 4.64879231278747, + 2.95833571859151, + -18.5336641043514 + ], + [ + 4.77373971192688, + 2.71966374059469, + -18.8000196235657 + ], + [ + 4.65387999131531, + 2.68659383016378, + -19.9830551034123 + ] + ] + } +} \ No newline at end of file diff --git a/assets/icon/icon.png b/assets/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..823c0767c636617504abe43e3f0f16f7d42ca7f6 GIT binary patch literal 33273 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 IUo!CiU$^A6n*aa+ literal 0 HcmV?d00001 diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..7c56964 --- /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 + 12.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +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 new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +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..279576f --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,41 @@ +# 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__)) +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..b222a46 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,52 @@ +PODS: + - Flutter (1.0.0) + - flutter_blue (0.0.1): + - Flutter + - flutter_blue/Protos (= 0.0.1) + - flutter_blue/Protos (0.0.1): + - Flutter + - Protobuf (~> 3.11.4) + - flutter_local_notifications (0.0.1): + - Flutter + - Protobuf (3.11.4) + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - sqflite_darwin (0.0.4): + - Flutter + - FlutterMacOS + +DEPENDENCIES: + - Flutter (from `Flutter`) + - flutter_blue (from `.symlinks/plugins/flutter_blue/ios`) + - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) + +SPEC REPOS: + trunk: + - Protobuf + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + flutter_blue: + :path: ".symlinks/plugins/flutter_blue/ios" + flutter_local_notifications: + :path: ".symlinks/plugins/flutter_local_notifications/ios" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + sqflite_darwin: + :path: ".symlinks/plugins/sqflite_darwin/darwin" + +SPEC CHECKSUMS: + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_blue: eeb381dc4727a0954dede73515f683865494b370 + flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 + Protobuf: 176220c526ad8bd09ab1fb40a978eac3fef665f7 + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + sqflite_darwin: a553b1fd6fe66f53bbb0fe5b4f5bab93f08d7a13 + +PODFILE CHECKSUM: c4c93c5f6502fe2754f48404d3594bf779584011 + +COCOAPODS: 1.13.0 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..58b5077 --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,554 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 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 */; }; + B879BCEAA725F64453CC0A79 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F690376549F8683B0E05AFBA /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + 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 = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; 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 = ""; }; + 83C7C45F5A9E1FE447699BF5 /* 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 = ""; }; + 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 = ""; }; + 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 = ""; }; + B633C7D96C073F6E14F5A6B3 /* 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 = ""; }; + F4477CC4A73F68AB428C3174 /* 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 = ""; }; + F690376549F8683B0E05AFBA /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B879BCEAA725F64453CC0A79 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 22561A1D2E18703E522BF63C /* Frameworks */ = { + isa = PBXGroup; + children = ( + F690376549F8683B0E05AFBA /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + C66B6A395375C71B9591B1DB /* Pods */, + 22561A1D2E18703E522BF63C /* Frameworks */, + ); + 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 */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + C66B6A395375C71B9591B1DB /* Pods */ = { + isa = PBXGroup; + children = ( + 83C7C45F5A9E1FE447699BF5 /* Pods-Runner.debug.xcconfig */, + F4477CC4A73F68AB428C3174 /* Pods-Runner.release.xcconfig */, + B633C7D96C073F6E14F5A6B3 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + E4DFAD72B07B4BC00227892D /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 3FA4DA0C75B71011F3A0017A /* [CP] Embed Pods Frameworks */, + ); + 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 = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + 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 */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 3FA4DA0C75B71011F3A0017A /* [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; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + 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"; + }; + E4DFAD72B07B4BC00227892D /* [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 */ + 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 */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + 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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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 = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 4PX92JJ6GC; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.crazykoder.petActivityTracker; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + 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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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 = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + 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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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 = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + 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)"; + DEVELOPMENT_TEAM = 4PX92JJ6GC; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.crazykoder.petActivityTracker; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.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)"; + DEVELOPMENT_TEAM = 4PX92JJ6GC; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.crazykoder.petActivityTracker; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.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 */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + 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..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..5e31d3d --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + 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.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..f802cc0 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,18 @@ +import UIKit +import Flutter + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + + if #available(iOS 10.0, *) { + UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate + } + + 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..c853d554f570323d8236ea1f5c553aad282be6ee GIT binary patch literal 85023 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⪚$*5WA7}yNDyn#>j~0-6K;TT- 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 PoM%zgd|Le2{Pq6=^eV6Q 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..572cc130630279dad09e406931b1a34a292a7790 GIT binary patch literal 741 zcmVF2-ss8{;Sqxe*-}VIr*!~T?;WVgs07iNuxULW&P2W*y0U8mZkj5f# zQap@+0E=z`3T9RCq7}xS*We%rV1k*xz9G<=D#(qT04sdn;(cz^v(uP4W=6pN-`?ke zVZiYZVE^zefXomLk_Z=!WpO~yFHg`?J&)^$mir27xTVE|ti$k2c{~AA!yv z0q5-p*Ea(>yMcsQ`>yH~xVRdklShzdUb<)dU$uk2`~WYB9S4kb=?@2F?2rBWm4`rU z8I1fa?>4uug`uBismH++eyvQR!lrO&aYG=s~Z0zdlz6*Nxl z0>wpvK6QB>%3Py>bM0y;hoWuLn-0j=9?M9ybBiZsqGNBsIZm z6$_&wCC5BlGYJ?U1A2P_^5h*@IU)__>@pA7gmr!g?L7ys%mv&Uvvn0{UYH+1(^N9F zXFW)DCxT9uoBYI?HfGRif@DVrTgx)51_WhC3pQ-Hq}N| z5xLhP5AtTIucBl-=V044E_9COr))Z>1g;1 X3Yqc$x6LnV00000NkvXXu0mjf4IfSh literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f66db7c76a245aa7f02e4ad1418a0b9f84ae0138 GIT binary patch literal 1519 zcmV7%XUdv7O=+p6 zqEwb^fl_AT?=+N3O(IY?jUP>v;Y8q`b9(Rn_W5zS_q*RkrJB!n$Im_IJVg5lmH$T{TJ{os2~f_097oHYV0?qR5QYs;%4*5^Z*mVi~)de?3(0Jao>=cR#l2!+xr1ea_# zlhaXK2W8R^BTvrc~xEvsICL)KR5Q5Uakk7fhy9R_8)X zOZ2|~bPq&XrM+x=r!E`|9v5Zr7Pn1s#}P;}aX_J4_JI*W1Dp2+_A@TPwjBf(jdyph zYk~!*o!^tj)QW2Guy#PvS!WaOKh+8Z%PJ5wp`Wb+?jwRiI!9`0WpG(OxF&f0X7Dw2 z4Unp09Pa2}Ze;o3nxL+kU}zs=q>!L_&W$V|ToddT4R*ZDdCjApfUrjs%py}(0YuIqL3vNnlQX3ao|g{x`U?=tzO)jI zc@QFXl>h(JheD-&yrkT!MfzYK{Qy)dnPS&*|M^$1LrI}(bUq8BZ5zKV6Tv_Jf;d}g z6?))z%KlWMGN(a3Q3h?-3ID#1?I5--fF$3$wT}*9+ZO=C-hsH%q}-8dxo(XN(p*z= zKIn=eKj+W(44}bF*P3tfV_iN}>RiOmx1sJh3{IqFR0P=6!C)~DSwHHjIH-Dk-n19| z!ez)lJ-{aQhjQ@>#EPAP{j;jZ{I`i<;W2i;3$slXy#xd*u67U-C1>iu-p8@FTqI#!}ks{LMbQ{x|+{65%j2r894QLwgjn^ zDOBt^RST1eNW1d%1@L1fVB~XpvX)QA0^~~yMXgC&PGxRPUkKW3=G1)Af-ztle}uf* zXf=bh5&d&1_}nbxr$ttD1b9X=3qM@y`07f%516>B}ywvx;l1-0e| zw2U06vPsEG9qBg@MKMoW0maGTebD7luGFSK4-d(f%?L`$uY7T$ePr7bWXxzjJ;M{g z*X=g)6JG2CIdhm-2&E&DoC)TJoKIwG7F5y@pELj-O+d>z07fGMW()@g^$Oe*I5rD? zxDrN%=W+t=OMt_kY7ZZ@TpKoQ#luvgbZp+R0y|LM+dq31UqrrQ3b9Nb51lQ(4R$aR@-?IUG z|103@x11NbB1jdZRqhb;i@+#t3F-j?TE`W^+PXUq3|mmg&Kfm?U_iJc*e@RP%thxl z`XopFpQJfPzurJ4HNSMYqu)Lq2hlF%F8JWmBq$WY{Lc!jFui}wNP3rFD`x~h+Z92*GuBHKweQ;DV(+zDco-zrP<=vEI<~jU32h67>NiIB zhWz#zwA@0l@@j*aq;Y_y3|X5d!k^1*N=-R185Oyh0v3cV_zES$DI`&hE}*lboY`=j_R3GXMSmZ~lA# z$Gsa_e^=J=1A<)D22?h#6aK#AI$<~X^uJ(JbD+Qf1;A9G{q4Z0UO?Bo;jtp0_a7)T zRstXW8_+0}c5Due&N6;llDC4m5uU#l-apTQOhiThy=|WxAAMp!c*j44glO_}Ho`l6 z9y~-;@ZVd%AJ}jJ`sDubj_n&=-YVikc+)3PhR%jZ4>C3g!o+vrX`BM@Blnpbz3~8) zYsvb-#~i;D2{+e;@^EMOo_0;Rs1zEJ6(f-KLl`y}GEGg^q(P|8bC;q1;Z=xcWP>qs zKBQl^hT5PuBsccDCj9z(s9&9n{pO3yAd;umg-?Xu|Jy2P-(HR_fAK2B=_{aQKU#%^ z$*cO@&Cxv*jO9BaWev@i4FA%F-6u5HVcP9p3Wt_Xi|%D&9O zQ|8wdsWTX^2aq9Dy}%t84Op1 zJrZp9(y~nSOqGugh*V7MZj-q5~sk_mX| z_EhM0BXv^;I)mYg@K2iBpI#&rKpVQAx5b`(+w=;a(ie)LetHsGauW1bw?Iyi%ctRe zEg{l6))dwH)a-V5`E}RU#t%-ws@L>xtwV26ccxLQ;sp#^-U6|Ht>{HbM8dpmq}r8D z$$?br^;JW)t3w^u1In1bkdhK0((h7M2Pn&SSR>q`F&KF`pp!Z%PnWx(Z2inywbhB5 zkJ}php5;VeSp)UuH4wkK{dbWle*=<8Y{bycf@=7eLNX zCiS;LSk<6S&53Nl=cgcdc^>SeX;53FK_1iv%9~rFdx?9pZ-;Pw_cn)TKxcRt=SFYv zf7K2wqZK@qyR{yZq3=Bw*;%i=2l46NP;1^0KD|wa_?o4PChGb=nh%-!SY`D%h%XI< zwC^|=$(hRB+5qaJkr1!-t{*c8L#A~YQJ#8eHhZYgV^6#ZMr5PD9C|4dH74wVw&8y> zRd6idS|p^-$FuMQC<8O#d4Do6W)YOPwn6d-F=D5aQZ{RF^k7mW5#r{F(5cB+{w4Fdh>+G=p$cU7tJ;qGJ~sGsIFvkHo>0FuhI7 zps6oypdPnZd!JWQ$dg$=b>6QwtOL1Ehw%Hmk3v28KkIb^%_vit4sd59tHb)Rb{_;H zT%lOE&))OR8=K!ZB~1BIZk7t=NWSI$XD83lRR?>2pxeUx7r=>-B0vqkJw$ir{`6KV!`nj(#1XQCDT^tcYvkv9880p?0+_ zHVFz)QmKM6O8C{x{!UR>U$q-->4!k>Aqba?LyVEAVq=u2^+&rH`P!8H)lz7&>@Wrs zp%2T9{PH3aPN@m$=`1LJeJ3_yN*`J^*?cU@*K9yGu>VBlPTsW_G;0KGIuU06h2QKR0NEJ!Qzz+y$m^i*h~82${AWZfr1xNy~a)XqH! zPseAWZl4O3Vo5-bNZ{d^msa~O^PM(F@a|#3}Wc@gNn({H}qzX){MlXIyH%N0ggHiAbv!O|SuoYtg-oC~f z*HR+q=Rvz>KznT+lv(Q`e09!{(>vV>_WBSAl;i{BP+6%xoDH3#usty=4V;-ve_TILLb!|BK7N*mW^ej66r1TfytZt*-K#bJMWLf zg2Qu5z&<`2pQBBVIh)}5*^lA<-7kz2L}|@)kgk+KEh>S2Ej4-I}rc+Jk-Z#LDa2p*H{Lx1qQteZO3%z zlxM4M6VDIc$qbzhjq+){y&J&Zs(|qB zBT(jTsr>JHO?ojpc#r$@#u-**G1;DasUx&n$%c?z8q~9TQ%$3ydOX zrA_5)@!np@dyYYAmu}Anr-b>bL{&qWxfa6WC+!J2B7CC2*h8)|@A|>Nsb_Vk#Sce> zsbi`1b!!Id#^k~xu)4_=Ot?m(yCcguLchUuQzMw*<s-v z9dydIe1A*EcP(d1O|W~LL;q8EAfuJDuE|wd$TtIew}*#5MtUH^N{JT|-%v~RI8R&6 zZh|~>uyKqE8jsPqLXB!PW7+^weDLes*Cw-Vd@w{mkj;l0OpC+ zXk*ddeeDs<#zknQBH)GVuxo1~pw-p54GS@I?@bO)3T^Me&0mWWU^KFdy@ZPH#!Sy6 zw7&@>K;1njQL9Dk&@=L}S7*hZ_X}Em2z$0I{#$R@4FV01Vyfp{+j-Qsud&4iiTx&p z*0=Z_cH5z5{}?c@1`L%b1Ka7Z_Q-gyy?^^sf@Tj2ex8*P$$&Th`A@*U!O6V#0Ub9o zIK5+YBaw`g@#G(=?+b*k*@;G8JPu3e#0oMBZ9RuwvMJn;s_7S)`K~nmV(hX)-15z_4U=xhK7C)L9p+3y zuiu3cKy-fbENn|F%vy!MXd>%Mw%`h>_ZdRk^Q{BM8)Ip598kI4!XZ z$wYNaVt9R1{1=ldxA~)EexuOz5Ng2;?24`a4Q(B<&*v}T-uWE+Ni9mE2|Kxd81}^n zv2Q$v_R=ki6le1aaD%T5fO_U_tT~JoMTsuBBR4X3Uc^apxG#_RQ}^3h^s-85ZpD-> zKzr-AABfG%y`Z@@`4DleVIA7gt1d)lTwgmSONyz&V8 z+hdr+$5GSo#I2f(&dl()T%0(F3aJmDCnQ(Yk^JO&yM|$ zeX~6AG1b$&)_CqCRKptV@T&%Rw0UWrSBm@hLTXUYyaIc9J*M)t#A}j5Kdr;=ZR|U( zy{+miw5XPOU_$WTgwT#ooK$5};Z9;oeiAipe7Kk6d?bYKZorBj_dCjNJ9-NJ-A~xO z8~Xw6shtD0uCCzc38D9oM~xbRJ$~9>M3ZmD$ZM#|xh7m_oHzqzyWsnu{p&>bOx~#A z0!#??-U<%Bk1OAU`SDlOpet|%6F@Gldi_o>h|I}Lobhzm%a9!6PEH%077ET*((09y qL5srlX`b`hlL^U{lKn4#EB*uE!CxKuD1$lx0000kn 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..0660a44e2290d9576db5d5e28c3953a6ed1a0c3b GIT binary patch literal 2314 zcmV+l3HA1gP)gk&u~;6FU;tkrPr(q7R|w?Jo#{WDZgyes-TT-j=~2IP_GC}?&dmSK z{PX|cKXY}lR2TRfKyPdV8VcVK{i-41L=6V>WDP{?RA`C<#Y;LA+T8?VJJaTP?xH41k#UeP~URpvG#;Oz@%=FkfB?<-k$s0S&xgR~S?B zq4esM7#kDPN$Ce*cRmBP`dpY$B_H=ic51W8vD^Hk>t}j+qI*ej0?=Js*j< zh;G{hwtSmXH?t6ARt1@w1! zf_*QmZp@Dkf^GQF{rHP$EF$U~aS<)q;?0#x$^ar-{~azT>3`2FGX3~*})I@T9SioP@ro60Bo8e>VFjy8AFV&9En;1O6s0hgz>PUre~V|#tgwX(H2d;w`m$71)C0`_gd=t%V>%C2fOT*vOE)A+CPe}JMW(dBCwrd4l3U{e#-L~m^dDwNkW(IYzYb5L7 zSslE4K?uHy%6yi6EyR+4yKh4|w0@6eQ$C&kH}`FOe+MR2LB7SkEm4`AUs(nA`<1|F zUjP|xfZ;a-wf_{kw)>Jnh~YM4u&1iPs-^t*0=MuV6K zk2xDV>Nc3In}_?O!de|W1O{nf$F|K=z(@3}BT%syEN>c=y_Mm-U1 z=n1OwpMK5S0NRtitG_TB#_(r@o!f?fxpD>fL>n;S4rudAVUowhBs=w9 zn5~*2Ad86p1yGKjvVQ)hmC(lKf@QRg=4DBg$|_FoVY?sbH}%eGz{Y1`%A)x3Jk-uu zh9s+JlPHKRm;lkXW%O9hnm{dn94w~*oClJ= zbV&4XmPDztaKyEwn}VMxyto1)(oak7@-1aTe<4UkAF0&3;wlnqU zV1S6aLiJhu+LBXgw)8!)1#6+K+Y!vsk%nlLcGzuQAxKal=elUpr(^UTWwS+E3Bi`= z!0$r8y&H@*+nhtX%!gM0|M+vT{29S2#kP+lR22MmJs>}My209B_5|4Ar@-Ywveh%R&rA{o=l%BiF_;4<*U3d^GtbB7 zPoe*ykm3VPk~F+aCNv_;w(qyLRinK=Z#+zz?3kYC7|rB4Y$++1`(B7rE^-F>tcSr# z=G6}(&w@w`3sNz@OTf|(5O`!3j6Xg?jzykDV_?8!@S585CsZo0Ipe@-Z#!-;SH@g_ z74)q|;B(%Bv3z6D9nq;h1c`Ems+jsgD5;AdzXY>lU;LLsbJie`l>y_ip$PP$O6lF{ zV1-Lzl5$cgXJb$g;3os2v}o#XEZ4K1k_45ani?yzJ+~AFiE2x6?*|j-L!-RNx|2lg zb~$v?&AySa`_cD40-Llrv6r_}u#6;6+E57Y=P)f22{EjeWZIaSb!Ac_`iq1NLcf>? zFJ$PVd-Cl~PA2*QaQa_&y<4@xnf#@GfV3x;_cZtTlQs^W4)fM_)+s1RrWKLdu z@mKN!D384grR;eKRrPicff>sngv+y5iRLLVsoWEpZJ`8oY9|1yFS&dHW6LgR zq?cXqH&RDtZm$MNFS2AR9En;I+W{xCT{6I)`VqvCp3sQkg{me(!%1A<99?>VLdG}YL_INe)lw_FX zo+=gUp8KX%(#8)BesH=5Y+n@w^{upN0nz@F*yq1aNX$#W8q|*M>Q5FDA`4Sfpl7)_ k0d$LR-l_kp;cG+mzrxcAS;^)EivR!s07*qoM6N<$f*b&N-2eap literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..44829e21ab05d0414c55dd4e88ad833e67e4db1c GIT binary patch literal 3476 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 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..fc9c241701a4ea4074586212e5e7f4fc634fe7e6 GIT binary patch literal 4923 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 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..fc9c241701a4ea4074586212e5e7f4fc634fe7e6 GIT binary patch literal 4923 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 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..55324d3846449a5fcae544338ed1305043c52805 GIT binary patch literal 7780 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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..dd32607a7a2b88b282e75dfcea107e941f6016f3 GIT binary patch literal 2992 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..050c019a640535cb90f3ddcdbfc165bc63ef52c4 GIT binary patch literal 7198 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 Lt0q$=Z65eP%DwE6 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.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@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..2bcc1e3 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,68 @@ + + + + + NSBonjourServices + + _dartobservatory._tcp + + io.flutter.embedded_views_preview + + NSCameraUsageDescription + This app needs camera access to scan QR codes + NSBluetoothAlwaysUsageDescription + Need BLE permission + NSBluetoothPeripheralUsageDescription + Need BLE permission + UIBackgroundModes + + Need Background BLE permission + + NSLocationAlwaysAndWhenInUseUsageDescription + Need Location permission + NSLocationAlwaysUsageDescription + Need Location permission + NSLocationWhenInUseUsageDescription + Need Location permission + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Pet Activity Tracker + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + pet_activity_tracker + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + + UIViewControllerBasedStatusBarAppearance + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/lib/db/dbprovider.dart b/lib/db/dbprovider.dart new file mode 100644 index 0000000..d963d09 --- /dev/null +++ b/lib/db/dbprovider.dart @@ -0,0 +1,81 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:pet_activity_tracker/db/models.dart'; +import 'package:sqflite/sqflite.dart'; +import 'package:sqflite/sqlite_api.dart'; + +class DBProvider { + late Database db; + + Future open(String path) async { + db = await databaseFactory.openDatabase(path, + options: OpenDatabaseOptions( + version: 1, + onCreate: (db, version) async { + var batch = db.batch(); + _createTablesV1(batch); + _insertWeeklyData(batch); + await batch.commit(); + }, + onDowngrade: onDatabaseDowngradeDelete)); + return db; + } + + Future getDailyLog(int id) async { + List> maps = + await db.query("DailyLog", where: 'id = ?', whereArgs: [id]); + if (maps.isNotEmpty) { + return DailyLog.fromMap(maps.first); + } + return null; + } + + Future insertDailyLog(DailyLog dl) async { + dl.id = await db.insert("DailyLog", dl.toMap()); + return dl; + } + + Future updateDailyLog(DailyLog dl) async { + return await db + .update("DailyLog", dl.toMap(), where: 'id = ?', whereArgs: [dl.id]); + } + + Future updateWeeklyLog(WeeklyLog wl) async { + return await db.rawUpdate( + 'UPDATE WeeklyLog SET log = ? WHERE day = ?', [wl.log, wl.day]); + } + + /// Create tables + void _createTablesV1(Batch batch) { + batch.execute('DROP TABLE IF EXISTS WeeklyLog'); + batch.execute('''CREATE TABLE WeeklyLog ( + day TEXT PRIMARY KEY, + seq INTEGER , + log TEXT + )'''); + batch.execute('DROP TABLE IF EXISTS DailyLog'); + batch.execute('''CREATE TABLE DailyLog ( + id INTEGER PRIMARY KEY, + day TEXT, + ts INTEGER, + ttl INTEGER, + series TEXT, + log TEXT + )'''); + } + + void _insertWeeklyData(Batch batch) { + //final _random = Random(); + + List weekDays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + + for (var day in weekDays) { + batch.insert('WeeklyLog', { + 'seq': 1, + 'day': day, + 'log': json.encode({'rest': 0, 'walk': 0, 'run': 0, 'stair': 0}) + }); + } + } +} diff --git a/lib/db/models.dart b/lib/db/models.dart new file mode 100644 index 0000000..8eee297 --- /dev/null +++ b/lib/db/models.dart @@ -0,0 +1,48 @@ +class DailyLog { + late int id; + late String day; + late int ts; + late int ttl; + late String log; + late String series; + + Map toMap() { + var map = { + 'day': day, + 'ts': ts, + 'ttl': ttl, + 'log': log, + 'series': series, + 'id': id + }; + + return map; + } + + DailyLog.fromMap(Map map) { + id = map['id'] != null ? int.parse(map['id'].toString()) : 0; + ts = int.parse(map['ts'].toString()); + ttl = int.parse(map['ttl'].toString()); + log = map['log'].toString(); + series = map['series'].toString(); + day = map['day'].toString(); + } +} + +class WeeklyLog { + late int seq; + late String day; + late String log; + + Map toMap() { + var map = {'day': day, 'log': log, 'seq': seq}; + + return map; + } + + WeeklyLog.fromMap(Map map) { + seq = map['seq'] != null ? int.parse(map['seq'].toString()) : 0; + log = map['log'].toString(); + day = map['day'].toString(); + } +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..91a0e59 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,99 @@ +import 'package:flutter/material.dart'; +import 'package:pet_activity_tracker/pages/dashboard_page.dart'; +import 'package:pet_activity_tracker/pages/settings_page.dart'; +import 'package:pet_activity_tracker/shared/notification_service.dart'; +import 'package:pet_activity_tracker/shared/variables.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + NotificationService().init(); + NotificationService().requestIOSPermissions(); + + runApp(MaterialApp( + color: Colors.black, + theme: ThemeData( + scaffoldBackgroundColor: Colors.black, + primaryColor: Colors.lightBlue[800], + // textTheme: const TextTheme( + // bodyText1: TextStyle( + // fontSize: fontSizeSmall, + // color: Colors.blueAccent, + // fontWeight: FontWeight.bold), + // bodyText2: TextStyle( + // fontSize: fontSizeSmall, + // color: Colors.grey, + // fontWeight: FontWeight.normal))), + ), + home: const XiaoDataCaptureApp())); +} + +class XiaoDataCaptureApp extends StatefulWidget { + const XiaoDataCaptureApp({Key? key}) : super(key: key); + + @override + State createState() => _XiaoDataCaptureAppState(); +} + +class _XiaoDataCaptureAppState extends State + with SingleTickerProviderStateMixin { + // This widget is the root of your application. + // We need a TabController to control the selected tab programmatically + late TabController controller; + int _selectedIndex = 0; + static const List _pages = [DashboardPage(), SettingsPage()]; + @override + void initState() { + super.initState(); + controller = TabController(vsync: this, length: 2); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: Colors.amber, + foregroundColor: Colors.black, + title: const Text('Pet Activity Tracker'), + // Use TabBar to show the three tabs + ), + bottomNavigationBar: BottomNavigationBar( + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.dashboard_rounded), + label: 'Dashboard', + ), + BottomNavigationBarItem( + icon: Icon(Icons.settings_rounded), + label: 'Settings', + ), + ], + currentIndex: _selectedIndex, + selectedItemColor: Colors.black, + backgroundColor: Colors.amber, + onTap: (int index) { + setState(() { + _selectedIndex = index; + }); + }, + ), + // bottomNavigationBar: Container( + // color: Colors.amber, + + // child: TabBar(controller: controller, tabs: const [ + // Tab(text: "Dashboard", icon: Icon(Icons.dashboard_rounded)), + // Tab(text: "Settings", icon: Icon(Icons.settings_rounded)), + // ])), + resizeToAvoidBottomInset: false, + body: SingleChildScrollView( + child: Center( + child: _pages.elementAt(_selectedIndex), + ), + )); + } +} diff --git a/lib/pages/daily_activity_chart.dart b/lib/pages/daily_activity_chart.dart new file mode 100644 index 0000000..afd8d0e --- /dev/null +++ b/lib/pages/daily_activity_chart.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; +// import 'package:charts_flutter/flutter.dart' as charts; +import 'package:community_charts_flutter/community_charts_flutter.dart' + as charts; +import 'package:pet_activity_tracker/pages/daily_activity_series.dart'; + +class DailyActivityChart extends StatelessWidget { + final List data; + + const DailyActivityChart({Key? key, required this.data}) : super(key: key); + + @override + Widget build(BuildContext context) { + List> series = [ + charts.Series( + id: "developers", + data: data, + domainFn: (ActivitySeries series, _) => series.type, + measureFn: (ActivitySeries series, _) => series.count, + colorFn: (ActivitySeries series, _) => series.barColor) + ]; + + return Container( + height: 300, + padding: const EdgeInsets.all(1.0), + child: Card( + color: Colors.transparent, + child: Padding( + padding: const EdgeInsets.all(1.0), + child: Column( + children: [ + Row( + children: [ + Text( + "TODAY'S ACTIVITY", + // style: Theme.of(context).textTheme.bodyText2, + ), + ], + ), + Expanded( + child: SizedBox( + child: charts.PieChart( + series, + animate: true, + behaviors: [ + charts.DatumLegend( + // Positions for "start" and "end" will be left and right respectively + // for widgets with a build context that has directionality ltr. + // For rtl, "start" and "end" will be right and left respectively. + // Since this example has directionality of ltr, the legend is + // positioned on the right side of the chart. + position: charts.BehaviorPosition.end, + // By default, if the position of the chart is on the left or right of + // the chart, [horizontalFirst] is set to false. This means that the + // legend entries will grow as new rows first instead of a new column. + horizontalFirst: false, + // This defines the padding around each legend entry. + cellPadding: + const EdgeInsets.only(right: 4.0, bottom: 4.0), + // Set [showMeasures] to true to display measures in series legend. + showMeasures: true, + // Configure the measure value to be shown by default in the legend. + legendDefaultMeasure: + charts.LegendDefaultMeasure.firstValue, + // Optionally provide a measure formatter to format the measure value. + // If none is specified the value is formatted as a decimal. + measureFormatter: (value) { + if (value == null) { + return "-"; + } else { + final int hour = value ~/ 60; + final num minutes = value % 60; + return '${hour}h${minutes}m'; + } + }, + ), + ], + ), + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/daily_activity_series.dart b/lib/pages/daily_activity_series.dart new file mode 100644 index 0000000..37f0b55 --- /dev/null +++ b/lib/pages/daily_activity_series.dart @@ -0,0 +1,11 @@ +// import 'package:charts_flutter/flutter.dart' as charts; +import 'package:community_charts_common/community_charts_common.dart' as charts; + +class ActivitySeries { + String type; + int count; + final charts.Color barColor; + + ActivitySeries( + {required this.type, required this.count, required this.barColor}); +} diff --git a/lib/pages/daily_activity_time_chart.dart b/lib/pages/daily_activity_time_chart.dart new file mode 100644 index 0000000..3782411 --- /dev/null +++ b/lib/pages/daily_activity_time_chart.dart @@ -0,0 +1,79 @@ +import 'package:community_charts_flutter/community_charts_flutter.dart'; +import 'package:flutter/material.dart'; +// import 'package:charts_flutter/flutter.dart' as charts; +import 'package:community_charts_common/community_charts_common.dart' as charts; + +import 'package:pet_activity_tracker/pages/daily_activity_time_series.dart'; + +class DailyActivityTimeSeriesChart extends StatelessWidget { + final List data; + + const DailyActivityTimeSeriesChart({Key? key, required this.data}) + : super(key: key); + + @override + Widget build(BuildContext context) { + List> series = [ + charts.Series( + id: "developers", + data: data, + domainFn: (ActivityTimeSeries series, _) => series.seq, + measureFn: (ActivityTimeSeries series, _) => int.parse(series.type), + colorFn: (ActivityTimeSeries series, _) { + // + if (series.type == "1") { + return ColorUtil.fromDartColor(Colors.grey); + } else if (series.type == "2") { + return ColorUtil.fromDartColor(Colors.blueAccent); + } else if (series.type == "3") { + return ColorUtil.fromDartColor(Colors.green); + } else { + return ColorUtil.fromDartColor(Colors.amber); + } + }, + radiusPxFn: (ActivityTimeSeries series, _) => series.radius, + ) + ]; + + return Container( + height: 300, + padding: const EdgeInsets.all(1.0), + child: const Card( + color: Colors.transparent, + child: Padding( + padding: const EdgeInsets.all(1.0), + child: Column( + children: [ + Row( + children: [ + Text( + "TODAY'S TIME SERIES", + // style: Theme.of(context).textTheme.bodyText2, + ), + ], + ), + Expanded( + child: SizedBox( + child: null, + // TODO: fix chart here + // child: charts.ScatterPlotChart( + // series, + // animate: true, + // primaryMeasureAxis: const charts.NumericAxisSpec( + // showAxisLine: false, + // renderSpec: charts.NoneRenderSpec(), + // ), + // domainAxis: const charts.NumericAxisSpec( + // showAxisLine: false, + // renderSpec: charts.NoneRenderSpec(), + // ), + // ), + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/daily_activity_time_series.dart b/lib/pages/daily_activity_time_series.dart new file mode 100644 index 0000000..5646425 --- /dev/null +++ b/lib/pages/daily_activity_time_series.dart @@ -0,0 +1,12 @@ +class ActivityTimeSeries { + String type; + int ts; + int seq; + double radius; + + ActivityTimeSeries( + {required this.type, + required this.ts, + required this.seq, + required this.radius}); +} diff --git a/lib/pages/dashboard_page.dart b/lib/pages/dashboard_page.dart new file mode 100644 index 0000000..6697520 --- /dev/null +++ b/lib/pages/dashboard_page.dart @@ -0,0 +1,534 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:community_charts_flutter/community_charts_flutter.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_blue/flutter_blue.dart'; +import 'package:intl/intl.dart'; +import 'package:pet_activity_tracker/db/dbprovider.dart'; +import 'package:pet_activity_tracker/db/models.dart'; +import 'package:pet_activity_tracker/pages/daily_activity_series.dart'; +import 'package:pet_activity_tracker/pages/daily_activity_chart.dart'; +import 'package:pet_activity_tracker/pages/daily_activity_time_chart.dart'; +import 'package:pet_activity_tracker/pages/daily_activity_time_series.dart'; +import 'package:pet_activity_tracker/pages/weekly_activity_chart.dart'; +import 'package:pet_activity_tracker/pages/weekly_activity_series.dart'; +import 'package:pet_activity_tracker/shared/notification_service.dart'; +import 'package:pet_activity_tracker/shared/variables.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +// import 'package:charts_flutter/flutter.dart' as charts; +import 'package:community_charts_common/community_charts_common.dart' as charts; + +import 'package:sqflite/sqflite.dart'; + +class DashboardPage extends StatefulWidget { + const DashboardPage({Key? key}) : super(key: key); + + @override + State createState() => _DashboardPageState(); +} + +class _DashboardPageState extends State { + final Future _prefs = SharedPreferences.getInstance(); + final FlutterBlue flutterBlue = FlutterBlue.instance; + final DBProvider dbProvider = DBProvider(); + DailyLog? dl; + + bool _connected = false; + bool _discovered = false; + bool _bleOn = false; + bool _firstData = false; + bool _duplicateSync = false; + String _batteryValue = ""; + String _predictionValue = ""; + int _walkCount = 0; + int _runCount = 0; + int _restCount = 0; + int onLoadTime = todaySinceEpoch(); + int _lastSynced = 0; + bool _processingBLEData = false; + + BluetoothDevice? device; + BluetoothCharacteristic? rxPred; + BluetoothCharacteristic? rxBat; + BluetoothCharacteristic? tx; //to send data to BLE peripheral + StreamSubscription? charBatSubscription; + StreamSubscription? charPredSubscription; + StreamSubscription? deviceStateSubscription; + + NotificationService _notificationService = NotificationService(); + + @override + void initState() { + super.initState(); + _loadData(); + + if (kDebugMode) { + print("Initializing dashboard pahe"); + } + + flutterBlue.isOn.then((value) => { + if (mounted) + { + setState(() { + if (kDebugMode) { + print(value); + } + _bleOn = value; + }) + } + }); + + startScan(); + + flutterBlue.scanResults.listen((results) async { + // do something with scan results + for (ScanResult r in results) { + if (kDebugMode) { + print(r.device.name); + } + + if (r.device.name == bleName) { + await flutterBlue.stopScan(); + device = r.device; + try { + await device?.connect(); + + deviceStateSubscription = device?.state.listen((event) async { + if (kDebugMode) { + print(event); + } + if (event == BluetoothDeviceState.disconnected) { + if (kDebugMode) { + print("Device disconnected"); + await handleDisconnect(); + } + if (mounted) { + setState(() { + _connected = false; + }); + } + startScan(); + } + + if (event == BluetoothDeviceState.connected) { + if (kDebugMode) { + print("Device connected"); + } + if (mounted) { + setState(() { + _connected = true; + }); + } + } + }); + + List? services = await device?.discoverServices(); + + services?.forEach((service) async { + if (service.uuid.toString() == serviceUUID.toLowerCase()) { + if (kDebugMode) { + print("Discovering characteristics..."); + } + + var characteristics = service.characteristics; + + for (BluetoothCharacteristic c in characteristics) { + if (c.uuid.toString() == rxBatUUID.toLowerCase()) { + if (kDebugMode) { + print("Found needed RX characteristic"); + } + rxBat = c; + await rxBat?.setNotifyValue(true); + charBatSubscription = rxBat?.value.listen((value) async { + String strData = String.fromCharCodes(value); + if (kDebugMode) { + print("battery value received ${strData}"); + } + setState(() { + _batteryValue = strData; + }); + }); + } + + if (c.uuid.toString() == rxPredUUID.toLowerCase()) { + if (kDebugMode) { + print("Found needed RX characteristic"); + } + rxPred = c; + await rxPred?.setNotifyValue(true); + charPredSubscription = rxPred?.value.listen((value) async { + final prefs = await SharedPreferences.getInstance(); + String strData = String.fromCharCodes(value); + + if (strData != "") { + if (kDebugMode) { + print("non empty prediction value received $strData"); + } + var splitted = strData.split(","); + + var now = DateTime.now().microsecondsSinceEpoch; + + if ((now - _lastSynced < 1000 * 30) || + _processingBLEData == true) { + if (kDebugMode) { + print("probably duplicate data. So ignore."); + } + return; + } + _processingBLEData = true; + _lastSynced = now; + await prefs.setInt('_lastSynced', _lastSynced); + + if (splitted.length > 2) { + if (kDebugMode) { + print("received flash stored data"); + } + _firstData = true; + tx?.write("r".codeUnits); + if (_duplicateSync == true) { + return; + } + + _duplicateSync = true; + } else { + _duplicateSync = false; + } + + //check if date has changed + //if (onLoadTime < todaySinceEpoch()) { + if (onLoadTime < todaySinceEpoch()) { + //data has changed + // await dbProvider.updateWeeklyLog(WeeklyLog.fromMap( + // {'day': dayOfYesterday(), 'log': dl!.log})); + + if (kDebugMode) { + print("!!!! Date has changed "); + } + dl = await dateShifted(todaySinceEpoch(), onLoadTime); + onLoadTime = todaySinceEpoch(); + renderPie(); + renderTimeSeries(); + await renderWeeklyBar(); + } + + List series = json.decode(dl!.series); + for (var element in splitted) { + if (element != "") { + if (kDebugMode) { + print(element); + } + series.add(element); + timeSeries.add(ActivityTimeSeries( + radius: 2.0, + type: element, + seq: timeSeries.length, + ts: 0)); + switch (element) { + case "1": + pieData[0].count++; + break; + case "2": + pieData[1].count++; + break; + case "3": + pieData[2].count++; + break; + case "4": + pieData[3].count++; + break; + default: + } + } + } + + dl?.log = json.encode({ + 'rest': pieData[0].count, + 'walk': pieData[1].count, + 'run': pieData[2].count, + 'stair': pieData[3].count + }); + + // if (pieData[1].count > 2) { + // await _notificationService.showNotifications( + // "Alert", "You have reached your move goal."); + // } + dl?.series = json.encode(series); + await dbProvider.updateDailyLog(dl!); + } + _processingBLEData = false; + + setState(() { + _predictionValue = strData; + }); + }); + } + if (c.uuid.toString() == txUUID.toLowerCase()) { + tx = c; + + if (mounted) { + setState(() { + _discovered = true; + if (kDebugMode) { + print("Found BLE device"); + } + }); + } + } + } + } + }); + } catch (e) { + startScan(); + } + } + } + }); + + _prefs.then((SharedPreferences prefs) { + setState(() { + _walkCount = prefs.getInt('_walkCount') ?? 0; + _lastSynced = prefs.getInt('_lastSynced') ?? 0; + }); + }); + } + + void _loadData() async { + await dbProvider.open("storage.db"); + + if (kDebugMode) { + print("initialized database...."); + } + + int todayId = todaySinceEpoch(); + int yesterdayId = yesterdaySinceEpoch(); + + dl = await dateShifted(todayId, yesterdayId); + + renderPie(); + renderTimeSeries(); + await renderWeeklyBar(); + + setState(() { + weeklyData = weeklyData; + pieData = pieData; + }); + + if (kDebugMode) { + //print(list); + //print(weeklyData); + print(json.decode(dl!.series)); + } + } + + Future renderWeeklyBar() async { + List> list = + await dbProvider.db.rawQuery("Select * from WeeklyLog"); + + List rest = []; + List walk = []; + List stair = []; + List run = []; + + for (var element in list) { + WeeklyLog w = WeeklyLog.fromMap(element); + Map jsonlog = json.decode(w.log); + rest.add(WeeklyActivitySeries( + type: "Rest", + count: jsonlog['rest'], + day: w.day, + barColor: ColorUtil.fromDartColor(Colors.grey), + target: 30)); + + walk.add(WeeklyActivitySeries( + type: "Walk", + count: jsonlog['walk'], + day: w.day, + barColor: ColorUtil.fromDartColor(Colors.blueAccent), + target: 30)); + + run.add(WeeklyActivitySeries( + type: "Run", + count: jsonlog['run'], + day: w.day, + barColor: ColorUtil.fromDartColor(Colors.green), + target: 30)); + + stair.add(WeeklyActivitySeries( + type: "Stair", + count: jsonlog['stair'], + day: w.day, + barColor: ColorUtil.fromDartColor(Colors.amber), + target: 30)); + } + + weeklyData[0] = rest; + weeklyData[1] = walk; + weeklyData[2] = run; + weeklyData[3] = stair; + } + + Future dateShifted(int todayId, int yesterdayId) async { + DailyLog? localdl = await dbProvider.getDailyLog(todayId); + + if (localdl == null) { + localdl = await dbProvider.insertDailyLog(DailyLog.fromMap({ + 'day': dayOfToday(), + 'ts': todayId, + 'ttl': getttl(), + 'log': json.encode({'rest': 0, 'walk': 0, 'run': 0, 'stair': 0}), + 'series': json.encode([]), + 'id': todayId + })); + + DailyLog? ydl = await dbProvider.getDailyLog(yesterdayId); + + if (ydl != null) { + //log to weekly + if (kDebugMode) { + print("log weekly report for ${dayOfYesterday()}"); + } + + await dbProvider.updateWeeklyLog( + WeeklyLog.fromMap({'day': dayOfYesterday(), 'log': ydl.log})); + } + } + return localdl; + } + + void renderPie() { + Map dlJson = {'rest': 0, 'walk': 0, 'run': 0, 'stair': 0}; + if (dl != null) { + dlJson = json.decode(dl!.log); + } + + pieData = [ + ActivitySeries( + type: "Rest", + count: dlJson['rest']!, + barColor: ColorUtil.fromDartColor(Colors.grey), + ), + ActivitySeries( + type: "Walk", + count: dlJson['walk']!, + barColor: ColorUtil.fromDartColor(Colors.blueAccent), + ), + ActivitySeries( + type: "Run", + count: dlJson['run']!, + barColor: ColorUtil.fromDartColor(Colors.green), + ), + ActivitySeries( + type: "Stair", + count: dlJson['stair']!, + barColor: ColorUtil.fromDartColor(Colors.amber), + ), + ]; + } + + void renderTimeSeries() { + List series = json.decode(dl!.series); + + for (int i = 0; i < series.length; i++) { + timeSeries + .add(ActivityTimeSeries(radius: 2.0, type: series[i], seq: i, ts: 0)); + } + } + + void startScan() { + if (kDebugMode) { + print("starting scan"); + } + + flutterBlue.startScan( + withServices: [Guid(serviceUUID.toLowerCase())], + allowDuplicates: false); + } + + @override + void deactivate() async { + super.deactivate(); + await handleDisconnect(); + if (kDebugMode) { + print("inside deactivate"); + } + } + + List pieData = []; + List> weeklyData = [[], [], [], []]; + List timeSeries = []; + + @override + Widget build(BuildContext context) { + return Container( + child: Center( + child: Column(children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + if (!_connected) + const Icon( + Icons.warning, + color: Colors.red, + size: 30, + ), + if (_connected) + const Icon( + Icons.check_circle, + color: Colors.green, + size: 30, + ), + // TODO: fix text here: + // Text(" LAST SYNCED ${formatShortDate(_lastSynced)} ", + // style: const TextStyle(fontSize: fontSizeExtraSmall)), + if (_connected && !_firstData) + const SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + color: Colors.blueGrey, + ), + ), + ], + ), + ), + DailyActivityChart( + data: pieData, + ), + WeeklyActivityChart(data: weeklyData), + DailyActivityTimeSeriesChart(data: timeSeries), + const Text("Live Prediction"), + // TODO: fix text here: + // Text( + // "$_predictionValue", + // style: const TextStyle(fontSize: fontSizeBig), + // ), + Center( + child: ElevatedButton( + child: const Text('Clear Data'), + onPressed: () async { + dl?.log = + json.encode({'rest': 0, 'walk': 0, 'run': 0, 'stair': 0}); + + await dbProvider.updateDailyLog(dl!); + // await _notificationService.scheduleNotifications(); + //await _notificationService.showNotifications(); + setState(() { + renderPie(); + }); + }, + ), + ), + ]), + )); + } + + Future handleDisconnect() async { + await charPredSubscription?.cancel(); + await charBatSubscription?.cancel(); + await deviceStateSubscription?.cancel(); + await device?.disconnect(); + } +} diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart new file mode 100644 index 0000000..58946fc --- /dev/null +++ b/lib/pages/settings_page.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; + +class SettingsPage extends StatefulWidget { + const SettingsPage({Key? key}) : super(key: key); + + @override + State createState() => _SettingsPageState(); +} + +class _SettingsPageState extends State { + @override + Widget build(BuildContext context) { + return Container( + child: Center( + child: Column(children: [const Text("Settings")]), + )); + } +} diff --git a/lib/pages/weekly_activity_chart.dart b/lib/pages/weekly_activity_chart.dart new file mode 100644 index 0000000..722efff --- /dev/null +++ b/lib/pages/weekly_activity_chart.dart @@ -0,0 +1,166 @@ +import 'package:flutter/material.dart'; +// import 'package:charts_flutter/flutter.dart' as charts; +import 'package:community_charts_common/community_charts_common.dart' as charts; +import 'package:pet_activity_tracker/pages/daily_activity_series.dart'; +import 'package:pet_activity_tracker/pages/weekly_activity_series.dart'; + +class WeeklyActivityChart extends StatelessWidget { + final List> data; + + const WeeklyActivityChart({Key? key, required this.data}) : super(key: key); + + @override + Widget build(BuildContext context) { + List activities = ["rest", "walk", "run", "stair"]; + List> series = []; + bool _showLabel = false; + + for (int i = 0; i < activities.length; i++) { + series.add(charts.Series( + id: activities[i], + data: data[i], + labelAccessorFn: (WeeklyActivitySeries series, _) { + final int hour = series.count ~/ 60; + final num minutes = series.count % 60; + return series.count > 0 && _showLabel == true + ? '${hour}h ${minutes}m' + : ''; + }, + domainFn: (WeeklyActivitySeries series, _) => series.day, + measureFn: (WeeklyActivitySeries series, _) => series.count, + colorFn: (WeeklyActivitySeries series, _) => series.barColor)); + } + + // List> series = [ + // charts.Series( + // id: "rest", + // data: data[0], + // labelAccessorFn: (WeeklyActivitySeries series, _) { + // final int hour = series.count ~/ 60; + // final num minutes = series.count % 60; + // return '${hour}h ${minutes}m'; + // }, + // domainFn: (WeeklyActivitySeries series, _) => series.day, + // measureFn: (WeeklyActivitySeries series, _) => series.count, + // colorFn: (WeeklyActivitySeries series, _) => series.barColor), + // charts.Series( + // id: "walk", + // data: data[1], + // labelAccessorFn: (WeeklyActivitySeries series, _) => series.day, + // domainFn: (WeeklyActivitySeries series, _) => series.day, + // measureFn: (WeeklyActivitySeries series, _) => series.count, + // colorFn: (WeeklyActivitySeries series, _) => series.barColor), + // charts.Series( + // id: "run", + // data: data[2], + // labelAccessorFn: (WeeklyActivitySeries series, _) => series.day, + // domainFn: (WeeklyActivitySeries series, _) => series.day, + // measureFn: (WeeklyActivitySeries series, _) => series.count, + // colorFn: (WeeklyActivitySeries series, _) => series.barColor), + // charts.Series( + // id: "stair", + // data: data[3], + // labelAccessorFn: (WeeklyActivitySeries series, _) => series.day, + // domainFn: (WeeklyActivitySeries series, _) => series.day, + // measureFn: (WeeklyActivitySeries series, _) => series.count, + // colorFn: (WeeklyActivitySeries series, _) => series.barColor), + + // //code for target line + // // charts.Series( + // // id: "rest", + // // data: data[0], + // // domainFn: (WeeklyActivitySeries series, _) => series.day, + // // measureFn: (WeeklyActivitySeries series, _) => series.target, + // // colorFn: (WeeklyActivitySeries series, _) => series.barColor) + // // ..setAttribute(charts.rendererIdKey, 'customTargetLine'), + // // charts.Series( + // // id: "walk", + // // data: data[1], + // // domainFn: (WeeklyActivitySeries series, _) => series.day, + // // measureFn: (WeeklyActivitySeries series, _) => series.target, + // // colorFn: (WeeklyActivitySeries series, _) => series.barColor) + // // ..setAttribute(charts.rendererIdKey, 'customTargetLine'), + // // charts.Series( + // // id: "run", + // // data: data[2], + // // domainFn: (WeeklyActivitySeries series, _) => series.day, + // // measureFn: (WeeklyActivitySeries series, _) => series.target, + // // colorFn: (WeeklyActivitySeries series, _) => series.barColor) + // // ..setAttribute(charts.rendererIdKey, 'customTargetLine'), + // // charts.Series( + // // id: "stair", + // // data: data[3], + // // domainFn: (WeeklyActivitySeries series, _) => series.day, + // // measureFn: (WeeklyActivitySeries series, _) => series.target, + // // colorFn: (WeeklyActivitySeries series, _) => series.barColor) + // // ..setAttribute(charts.rendererIdKey, 'customTargetLine'), + // ]; + + return Container( + height: 300, + padding: const EdgeInsets.all(5.0), + child: Card( + color: Colors.transparent, + child: Padding( + padding: const EdgeInsets.all(5.0), + child: Column( + children: [ + Row( + children: [ + Text( + "THIS WEEK'S ACTIVITY", + // style: Theme.of(context).textTheme.bodyText2, + ), + IconButton( + icon: const Icon(Icons.info_outline), + color: Colors.grey, + onPressed: () { + _showLabel = !_showLabel; + }, + ), + ], + ), + const Expanded( + child: SizedBox( + child: null, + // TODO: fix chart here: + // charts.BarChart( + // series, + // animate: true, + // barRendererDecorator: charts.BarLabelDecorator( + // //labelAnchor: charts.BarLabelAnchor.middle, + // //labelPosition: charts.BarLabelPosition.inside, + // outsideLabelStyleSpec: charts.TextStyleSpec( + // color: charts.ColorUtil.fromDartColor( + // Colors.blueAccent))), + // primaryMeasureAxis: const charts.NumericAxisSpec( + // renderSpec: charts.NoneRenderSpec()), + // domainAxis: charts.OrdinalAxisSpec( + // renderSpec: charts.SmallTickRendererSpec( + + // // Tick and Label styling here. + // labelStyle: charts.TextStyleSpec( + // fontSize: 18, // size in Pts. + // color: charts.ColorUtil.fromDartColor( + // Colors.amber)), + + // // Change the line colors to match text color. + // lineStyle: charts.LineStyleSpec( + // color: charts.ColorUtil.fromDartColor( + // Colors.amberAccent)))), + // // customSeriesRenderers: [ + // // charts.BarTargetLineRendererConfig( + // // // ID used to link series to this renderer. + // // customRendererId: 'customTargetLine', + // // groupingType: charts.BarGroupingType.grouped) + // // ] + // ), + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/weekly_activity_series.dart b/lib/pages/weekly_activity_series.dart new file mode 100644 index 0000000..a5e82fb --- /dev/null +++ b/lib/pages/weekly_activity_series.dart @@ -0,0 +1,17 @@ +// import 'package:charts_flutter/flutter.dart' as charts; +import 'package:community_charts_common/community_charts_common.dart' as charts; + +class WeeklyActivitySeries { + String type; + String day; + int count; + int target; + final charts.Color barColor; + + WeeklyActivitySeries( + {required this.day, + required this.type, + required this.count, + required this.target, + required this.barColor}); +} diff --git a/lib/shared/notification_service.dart b/lib/shared/notification_service.dart new file mode 100644 index 0000000..13da287 --- /dev/null +++ b/lib/shared/notification_service.dart @@ -0,0 +1,95 @@ +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:timezone/data/latest.dart' as tz; +import 'package:timezone/timezone.dart' as tz; + +class NotificationService { + //NotificationService a singleton object + static final NotificationService _notificationService = + NotificationService._internal(); + + factory NotificationService() { + return _notificationService; + } + + NotificationService._internal(); + + static const channelId = '123'; + + final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + + Future init() async { + final AndroidInitializationSettings initializationSettingsAndroid = + AndroidInitializationSettings('@mipmap/ic_launcher'); + + final IOSInitializationSettings initializationSettingsIOS = + IOSInitializationSettings( + requestSoundPermission: false, + requestBadgePermission: false, + requestAlertPermission: false, + ); + + final InitializationSettings initializationSettings = + InitializationSettings( + android: initializationSettingsAndroid, + iOS: initializationSettingsIOS, + macOS: null); + + tz.initializeTimeZones(); + + await flutterLocalNotificationsPlugin.initialize( + initializationSettings, + onSelectNotification: (payload) {}, + ); + } + + AndroidNotificationDetails _androidNotificationDetails = + // ignore: prefer_const_constructors + AndroidNotificationDetails( + 'channel ID', + 'channel name', + playSound: true, + priority: Priority.high, + importance: Importance.high, + ); + + Future showNotifications(String title, String message) async { + await flutterLocalNotificationsPlugin.show( + 0, + title, + message, + NotificationDetails(android: _androidNotificationDetails), + ); + } + + void requestIOSPermissions() { + flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + IOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: true, + badge: true, + sound: true, + ); + } + + Future scheduleNotifications() async { + await flutterLocalNotificationsPlugin.zonedSchedule( + 0, + "Notification Title", + "This is the Notification Body!", + tz.TZDateTime.now(tz.local).add(const Duration(seconds: 15)), + NotificationDetails(android: _androidNotificationDetails), + androidAllowWhileIdle: true, + uiLocalNotificationDateInterpretation: + UILocalNotificationDateInterpretation.absoluteTime); + } + + Future cancelNotifications(int id) async { + await flutterLocalNotificationsPlugin.cancel(id); + } + + Future cancelAllNotifications() async { + await flutterLocalNotificationsPlugin.cancelAll(); + } +} diff --git a/lib/shared/variables.dart b/lib/shared/variables.dart new file mode 100644 index 0000000..2a2269b --- /dev/null +++ b/lib/shared/variables.dart @@ -0,0 +1,43 @@ +import 'package:intl/intl.dart'; + +const double fontSizeBig = 24; +const double fontSizeMedium = 21; +const double fontSizeSmall = 18; +const double fontSizeExtraSmall = 14; +const String bleName = "EIBLUE"; +const String serviceUUID = "4D7D1101-EE27-40B2-836C-17505C1044D7"; +const String rxPredUUID = "4D7D1106-EE27-40B2-836C-17505C1044D7"; +const String rxBatUUID = "4D7D1107-EE27-40B2-836C-17505C1044D7"; +const String txUUID = "4D7D1108-EE27-40B2-836C-17505C1044D7"; + +int todaySinceEpoch() { + var now = DateTime.now(); + var startOfDay = DateTime(now.year, now.month, now.day); + return startOfDay.microsecondsSinceEpoch; +} + +int yesterdaySinceEpoch() { + var now = DateTime.now(); + var startOfDay = DateTime(now.year, now.month, now.day - 1); + return startOfDay.microsecondsSinceEpoch; +} + +int getttl() { + var now = DateTime.now(); + var startOfDay = DateTime(now.year, now.month, now.day + 7); + return startOfDay.microsecondsSinceEpoch; +} + +String dayOfToday() { + return DateFormat.E().format(DateTime.now()); +} + +String dayOfYesterday() { + var now = DateTime.now(); + return DateFormat.E().format(DateTime(now.year, now.month, now.day - 1)); +} + +String formatShortDate(int microsecondsSinceEpoch) { + var now = DateTime.fromMicrosecondsSinceEpoch(microsecondsSinceEpoch); + return DateFormat.Md().add_jm().format(now); +} diff --git a/macos/.gitignore b/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..4b81f9b --- /dev/null +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..5caa9d1 --- /dev/null +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..0e52bb5 --- /dev/null +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,18 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import flutter_blue +import flutter_local_notifications +import shared_preferences_foundation +import sqflite_darwin + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FlutterBluePlugin.register(with: registry.registrar(forPlugin: "FlutterBluePlugin")) + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) +} diff --git a/macos/Podfile b/macos/Podfile new file mode 100644 index 0000000..dade8df --- /dev/null +++ b/macos/Podfile @@ -0,0 +1,40 @@ +platform :osx, '10.11' + +# 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', 'ephemeral', '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 Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..86a6ebd --- /dev/null +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* pet_activity_tracker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "pet_activity_tracker.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* pet_activity_tracker.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* pet_activity_tracker.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..b8aed88 --- /dev/null +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..d53ef64 --- /dev/null +++ b/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..a2ec33f --- /dev/null +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4935a7ca84f0976aca34b7f2895d65fb94d1ea GIT binary patch literal 46993 zcmZ5|3p`X?`~OCwR3s6~xD(})N~M}fiXn6%NvKp3QYhuNN0*apqmfHdR7#ShNQ99j zQi+P9nwlXbmnktZ_WnO>bl&&<{m*;O=RK!cd#$zCdM@AR`#jH%+2~+BeX7b-48x|= zZLBt9*d+MZNtpCx_&asa{+CselLUV<<&ceQ5QfRjLjQDSL-t4eq}5znmIXDtfA|D+VRV$*2jxU)JopC)!37FtD<6L^&{ia zgVf1p(e;c3|HY;%uD5<-oSFkC2JRh- z&2RTL)HBG`)j5di8ys|$z_9LSm^22*uH-%MmUJs|nHKLHxy4xTmG+)JoA`BN7#6IN zK-ylvs+~KN#4NWaH~o5Wuwd@W?H@diExdcTl0!JJq9ZOA24b|-TkkeG=Q(pJw7O;i z`@q+n|@eeW7@ z&*NP+)wOyu^5oNJ=yi4~s_+N)#M|@8nfw=2#^BpML$~dJ6yu}2JNuq!)!;Uwxic(z zM@Wa-v|U{v|GX4;P+s#=_1PD7h<%8ey$kxVsS1xt&%8M}eOF98&Rx7W<)gY(fCdmo{y*FPC{My!t`i=PS1cdV7DD=3S1J?b2<5BevW7!rWJ%6Q?D9UljULd*7SxX05PP^5AklWu^y` z-m9&Oq-XNSRjd|)hZ44DK?3>G%kFHSJ8|ZXbAcRb`gH~jk}Iwkl$@lqg!vu)ihSl= zjhBh%%Hq|`Vm>T7+SYyf4bI-MgiBq4mZlZmsKv+S>p$uAOoNxPT)R6owU%t*#aV}B z5@)X8nhtaBhH=={w;Du=-S*xvcPz26EI!gt{(hf;TllHrvku`^8wMj7-9=By>n{b= zHzQ?Wn|y=;)XM#St@o%#8idxfc`!oVz@Lv_=y(t-kUC`W)c0H2TX}Lop4121;RHE(PPHKfe_e_@DoHiPbVP%JzNudGc$|EnIv`qww1F5HwF#@l(=V zyM!JQO>Rt_PTRF1hI|u^2Uo#w*rdF*LXJky0?|fhl4-M%zN_2RP#HFhSATE3&{sos zIE_?MdIn!sUH*vjs(teJ$7^7#|M_7m`T>r>qHw>TQh?yhhc8=TJk2B;KNXw3HhnQs za(Uaz2VwP;82rTy(T3FJNKA86Y7;L(K=~BW_Q=jjRh=-k_=wh-$`nY+#au+v^C4VV z)U?X(v-_#i=3bAylP1S*pM_y*DB z2fR!imng6Dk$>dl*K@AIj<~zw_f$T!-xLO8r{OkE(l?W#W<={460Y02*K#)O4xp?W zAN+isO}!*|mN7B#jUt&!KNyFOpUxv&ybM>jmkfn8z^llBslztv!!`TBEPwu;#eR3d z@_VDa)|ByvXx1V=^Up4{;M8ji3FC7gm(C7Ty-#1gs+U<{Ouc(iV67{< zam#KwvR&s=k4W<13`}DxzJ9{TUa97N-cgWkCDc+C339)EEnC@^HQK6OvKDSCvNz(S zOFAF_6omgG!+zaPC8fBO3kH8YVBx9_AoM?->pv~@$saf(Myo|e@onD`a=;kO*Utem ze=eUH&;JB2I4}?Pm@=VnE+yb$PD~sA5+)|iH3bi|s?ExIePeoAMd(Z4Z%$mCu{t;B9(sgdG~Q}0ShAwe!l8nw0tJn zJ+m?ogrgty$3=T&6+JJa!1oS3AtQQ1gJ z3gR1<=hXU>{SB-zq!okl4c+V9N;vo4{fyGeqtgBIt%TPC1P&k!pR-GZ7O8b}9=%>3 zQrV%FQdB+CcCRKK)0}v>U25rbQk(1^9Ax|WcAo5?L(H&H@%zAoT2RH$iN6boyXpsYqME}WJZI6T%OMlkWXK>R`^7AHG&31 z&MIU}igQ7$;)7AEm#dXA+!I&6ymb7n6D;F7c$tO3Ql(`ht z1sFrzIk_q5#=!#D(e~#SdWz5K;tPF*R883Yu>*@jTeOGUjQekw zM+7HlfP{y8p}jA9bLfyKC_Ti8k#;AVp@RML^9MQp-E+Ns-Y zKA!aAZV-sfm<23fy#@TZZlQVQxH%R7rD}00LxHPUF!Yg3%OX ziDe4m<4fp{7ivBS?*AlJz$~vw5m)Ei8`|+~xOSqJ$waA0+Yys$z$9iN9TIXu8 zaYacjd09uRAsU|)g|03w`F|b1Xg#K~*Mp2X^K^)r3P^juoc}-me&YhkW3#G|H<~jK zoKD?lE@jOw7>4cpKkh!8qU!bF(i~Oa8a!EGy-j46eZYbKUvF=^^nq`EtWFK}gwrsB zeu<6~?mk+;+$whP)8ud8vjqh+NofU+Nu`~|pb&CN1y_idxxf6cGbT=fBZR_hl&G)GgnW$*oDrN-zz;cKs18n+dAn95w z)Y>l6!5eYpebJGw7it~Q5m}8$7@%p&KS=VtydFj4HPJ{xqUVS_Ih}c(^4nUdwG|0% zw8Fnm{IT`8MqoL(1BNtu_#7alS@3WSUUOFT@U*`V!zrPIeCbbO=pE%|g92$EU|lw; z^;^AqMVWVf-R5^OI79TzIyYf}HX%0Y)=aYH;EKo}?=R~ZM&s&F;W>u%hFUfNafb;- z8OkmkK3k||J#3`xdLuMJAhj9oPI?Cjt}cDN7hw26n7irWS0hsy`fs&Y?Y&(QF*Nu! z!p`NggHXaBU6$P42LkqnKsPG@363DHYGXg{!|z6VMAQt??>FK1B4x4{j;iY8A+7o% z*!0qt&w+w#Ob@pQp;q)u0;v^9FlY=AK>2!qku)!%TO<^lNBr!6R8X)iXgXi^1p`T8 z6sU@Y_Fsp6E89E1*jz~Tm2kF=mjYz_q99r^v0h-l7SP6azzL%woM6!7>IFWyizrNwAqoia3nN0q343q zFztMPh0)?ugQg5Izbk{5$EGcMzt*|=S8ZFK%O&^YV@V;ZRL>f!iG?s5z{(*Xq20c^ z(hkk~PljBo%U`$q>mz!ir7chKlE-oHA2&0i@hn4O5scsI&nIWsM>sYg;Ph5IO~VpT z%c-3_{^N>4kECzk?2~Z@V|jWio&a&no;boiNxqXOpS;ph)gEDFJ6E=zPJ$>y5w`U0 z;h9_6ncIEY?#j1+IDUuixRg&(hw+QSSEmFi%_$ua$^K%(*jUynGU@FlvsyThxqMRw z7_ALpqTj~jOSu2_(@wc_Z?>X&(5jezB6w-@0X_34f&cZ=cA-t%#}>L7Q3QRx1$qyh zG>NF=Ts>)wA)fZIlk-kz%Xa;)SE(PLu(oEC8>9GUBgd$(^_(G6Y((Hi{fsV; zt*!IBWx_$5D4D&ezICAdtEU!WS3`YmC_?+o&1RDSfTbuOx<*v`G<2SP;5Q4TqFV&q zJL=90Lcm^TL7a9xck}XPMRnQ`l0%w-fi@bRI&c*VDj!W4nj=qaQd$2U?^9RTT{*qS_)Q9OL>s}2P3&da^Pf(*?> z#&2bt;Q7N2`P{{KH@>)Tf5&za?crRmQ%8xZi<9f=EV3={K zwMet=oA0-@`8F;u`8j-!8G~0TiH5yKemY+HU@Zw3``1nT>D ziK465-m?Nm^~@G@RW2xH&*C#PrvCWU)#M4jQ`I*>_^BZB_c!z5Wn9W&eCBE(oc1pw zmMr)iu74Xl5>pf&D7Ml>%uhpFGJGyj6Mx=t#`}Mt3tDZQDn~K`gp0d)P>>4{FGiP$sPK*ExVs!1)aGgAX z6eA;-9@@Muti3xYv$8U{?*NxlHxs?)(6%!Iw&&l79K86h+Z8;)m9+(zzX?cS zH*~)yk)X^H1?AfL!xctY-8T0G0Vh~kcP=8%Wg*zZxm*;eb)TEh&lGuNkqJib_}i;l z*35qQ@}I#v;EwCGM2phE1{=^T4gT63m`;UEf5x2Get-WSWmt6%T6NJM`|tk-~4<#HHwCXuduB4+vW!BywlH8murH@|32CNxx7} zAoF?Gu02vpSl|q1IFO0tNEvKwyH5V^3ZtEO(su1sIYOr{t@Tr-Ot@&N*enq;Je38} zOY+C1bZ?P~1=Qb%oStI-HcO#|WHrpgIDR0GY|t)QhhTg*pMA|%C~>;R4t_~H1J3!i zyvQeDi&|930wZlA$`Wa9)m(cB!lPKD>+Ag$5v-}9%87`|7mxoNbq7r^U!%%ctxiNS zM6pV6?m~jCQEKtF3vLnpag``|bx+eJ8h=(8b;R+8rzueQvXgFhAW*9y$!DgSJgJj% zWIm~}9(R6LdlXEg{Y3g_i7dP^98=-3qa z$*j&xC_$5btF!80{D&2*mp(`rNLAM$JhkB@3al3s=1k^Ud6HHontlcZw&y?`uPT#a za8$RD%e8!ph8Ow7kqI@_vd7lgRhkMvpzp@4XJ`9dA@+Xk1wYf`0Dk!hIrBxhnRR(_ z%jd(~x^oqA>r>`~!TEyhSyrwNA(i}={W+feUD^8XtX^7^Z#c7att{ot#q6B;;t~oq zct7WAa?UK0rj0yhRuY$7RPVoO29JV$o1Z|sJzG5<%;7pCu%L-deUon-X_wAtzY@_d z6S}&5xXBtsf8TZ13chR&vOMYs0F1?SJcvPn>SFe#+P3r=6=VIqcCU7<6-vxR*BZUm zO^DkE{(r8!e56)2U;+8jH4tuD2c(ptk0R{@wWK?%Wz?fJckr9vpIU27^UN*Q$}VyHWx)reWgmEls}t+2#Zm z_I5?+htcQl)}OTqF<`wht89>W*2f6e)-ewk^XU5!sW2A2VtaI=lggR&I z;Rw{xd)WMqw`VUPbhrx!!1Eg_*O0Si6t@ny)~X^Gu8wZZDockr)5)6tm+<=z+rYu? zCof+;!nq6r9MAfh zp4|^2w^-3vFK~{JFX|F5BIWecBJkkEuE%iP8AZ z^&e|C+VEH&i(4Y|oWPCa#C3T$129o5xaJa=y8f(!k&q+x=M|rq{?Zw_n?1X-bt&bP zD{*>Io`F4(i+5eE2oEo6iF}jNAZ52VN&Cp>LD{MyB=mCeiwP+v#gRvr%W)}?JBTMY z_hc2r8*SksC%(pp$KGmWSa|fx;r^9c;~Q(Jqw1%;$#azZf}#Fca9NZOh{*YxV9(1ivVA^2Wz>!A&Xvmm-~{y8n!^Jdl8c>`J#=2~!P{ zC1g_5Ye3={{fB`R%Q|%9<1p1;XmPo5lH5PHvX$bCIYzQhGqj7hZ?@P4M0^mkejD|H zVzARm7LRy|8`jSG^GpxRIs=aD>Y{Cb>^IwGEKCMd5LAoI;b{Q<-G}x*e>86R8dNAV z<@jb1q%@QQanW1S72kOQ$9_E#O?o}l{mHd=%Dl{WQcPio$baXZN!j{2m)TH1hfAp{ zM`EQ=4J`fMj4c&T+xKT!I0CfT^UpcgJK22vC962ulgV7FrUrII5!rx1;{@FMg(dIf zAC}stNqooiVol%%TegMuWnOkWKKA}hg6c)ssp~EnTUVUI98;a}_8UeTgT|<%G3J=n zKL;GzAhIQ_@$rDqqc1PljwpfUwiB)w!#cLAkgR_af;>}(BhnC9N zqL|q8-?jsO&Srv54TxVuJ=rfcX=C7{JNV zSmW@s0;$(#!hNuU0|YyXLs{9$_y2^fRmM&g#toh}!K8P}tlJvYyrs6yjTtHU>TB0} zNy9~t5F47ocE_+%V1(D!mKNBQc{bnrAbfPC2KO?qdnCv8DJzEBeDbW}gd!g2pyRyK`H6TVU^~K# z488@^*&{foHKthLu?AF6l-wEE&g1CTKV|hN7nP+KJnkd0sagHm&k{^SE-woW9^fYD z7y?g*jh+ELt;$OgP>Se3o#~w9qS}!%#vBvB?|I-;GM63oYrJ}HFRW6D+{54v@PN8K z2kG8`!VVc+DHl^8y#cevo4VCnTaPTzCB%*)sr&+=p{Hh#(MwaJbeuvvd!5fd67J_W za`oKxTR=mtM7P}i2qHG8=A(39l)_rHHKduDVA@^_Ueb7bq1A5#zHAi**|^H@fD`_W z#URdSG86hhQ#&S-Vf_8b`TIAmM55XhaHX7}Ci-^(ZDs*yb-WrWV&(oAQu3vMv%u$5 zc;!ADkeNBN_@47r!;%G3iFzo;?k)xTS-;1D-YeS5QXN7`p2PzGK~e6ib;8COBa5)p zfMn}dA--&A12~zr&GVk?qnBGfIEo`5yir;-Q;ZLn{Fimdrk;e!)q`sAkYh^~^>4Q@ zN5RT>s38+`V{|6@k&vZW!W0*BEqV&~34d+Ev8h)ObYL7Bd_hgbUzjdJaXP=S@Dp6X z)i013q3K4Gr5d%2YIp>218pYK!xwH;k)j?uUrT-yVKLg*L3y~=a+qd!RWGTL`z>29 z-Zb4Y{%pT%`R-iA#?T58c-i@?jf-Ckol9O>HAZPUxN%Z=<4ad9BL7n`_kH0i#E(m& zaNb039+z~ONUCLsf_a|x*&ptU?`=R*n}rm-tOdCDrS!@>>xBg)B3Sy8?x^e=U=i8< zy7H-^BPfM}$hf*d_`Qhk_V$dRYZw<)_mbC~gPPxf0$EeXhl-!(ZH3rkDnf`Nrf4$+ zh?jsRS+?Zc9Cx7Vzg?q53ffpp43po22^8i1Obih&$oBufMR;cT2bHlSZ#fDMZZr~u zXIfM5SRjBj4N1}#0Ez|lHjSPQoL&QiT4mZn=SxHJg~R`ZjP!+hJ?&~tf$N!spvKPi zfY;x~laI9X`&#i#Z}RJ`0+MO_j^3#3TQJu2r;A-maLD8xfI+2Y*iDf4LsQ$9xiu?~ z?^wHEf^qlgtjdj(u_(W5sbGx1;maVPDHvI-76u2uUywf;>()=e>0le;bO0LIvs)iy z*lJTO+7gyf^)2uS-PhS_O-+RToQmc6VT>ej^y^stNkwIxUg?E|YMAAwQ}U!dC&cXL ziXKU?zT~xbh6C};rICGbdX~;8Z%L~Jdg|`senVEJo-CiDsX47Kc`;EiXWO<9o)(`4 zGj(9@c+Me=F~y(HUehcAy!tkoM&e1y#(qqCkE(0lik_U>wg8vOhGR(=gBGFSbR`mh zn-%j3VTD4 zwA1Kqw!OSgi_v0;6?=Bk4Z{l-7Fl4`ZT535OC{73{rBwpNHMPH>((4G`sh zZhr!v{zM@4Q$5?8)Jm;v$A2v$Yp9qFG7y`9j7O-zhzC+7wr3Cb8sS$O{yOFOODdL) zV2pU{=nHne51{?^kh%a$WEro~o(rKQmM!p?#>5Pt`;!{0$2jkmVzsl|Nr^UF^IHxG z8?HmZEVMY~ec%Ow6hjfg6!9hCC4xY?V;5Ipo-myV=3TmfT^@XkKME`+=_inm4h7ki z->K~a+20?)zic^zc&7h=0)T{Aa24FU_}(O|9DMW3Bf>MW=O%~8{unFxp4}B+>>_KN zU%rKs3Va&&27&OX4-o&y2ie|sN2p-=S^V<2wa2NUQ4)?0e|hgna*1R7(#R_ys3xmG zE#(ry+q=O~&t|RX@ZMD`-)0QmE*x%SBc(Yvq60JtCQ4RL(gdA(@=}0rYo5yKz36bW zkvLOosP6I?7qH!rce(}q@cH-{oM2ThKV2RZe+{{25hkc?T>=Tky12xHr0jmfH@SZi zLHPJ@^Oo^Zo%`gZk_hrbCzS+t|=O!Bt zWi|>M8mz~sD|Z>C1ZPf_Cs&R!S5E2qK+@j*UpP>;5_|+h+y{gb=zub7#QKSUabet# zFH2H0ul;zO+uc+V=W_W@_Ig-791T7J9&=5)wrBE?JEHS_A6P~VQ)u6s1)Pu|VxP(aYJV*(e<)(42R zm3AK>dr1QLbC1RMoQ|M5k+TWBjY9q+_vY=K-tUte35m4RWl51A<4O0ptqV3)KzL7U z0gpp-I1)|zvtA8V7-e-o9H)lB_Rx6;Bu7A2yE)6)SuDqWDs}~Ojfk?DFwI% z3E1(>LbbB7I(&E@B7nlulhvY=Wa1mGXD@ijD7WF^y@L1e55h)-hzoq}eWe!fh9m3V{)x^6F8?ed1z>+4;qW6A4hYYj zZCYP=c#I8+$pAIVyiY*#%!j3ySAnH`tp|=^lh{)#JimWaP_rXK40A0WcsEUj`G1}O zG?XQ~qK4F!lqauv6-BL_Up3+-l1=kVfD;D*C)yr>o9>W=%mIyATtn_OBLK+h@p)j5jRAb;m&Ok?TZH-5Q)~#UwdYFp~rEE{judWa9E)z zE>135C-xMdHYY&AZGR)tb`K}s0CK9 z1!))p^ZaUC*e50t`sL+)@`)#kJ}?C_cCMH@k{f4wh~0`OFnGQ2nzUuuu;=r4BYRcI z){G#a6Y$S(mIc6B#YS;jFcU{0`c)Raa$nG+hV(K|2|^ZWOI566zlF0N;t~$jD<_AX zjnD?HN-G>xRmHwtL3BcJX7)Q^YGfc?cS4Nj=yYl5MB(uBD?r@VTB|mIYs=au$e)e{ zLHWd!+EN*v2*(=y%G1JzyQdY&%|?~R5NPb)`S2dw1AJW8O;L=p?yVxJs=X?U#-l1O zk6xh8yyY;OTR7aF{P=kQ>y`*EFivnw%rQioA-I67WS+~hVamG4_sI)(Jo4vHS|@F@ zqrBHbxHd_Y8+?8Gfq=Z1O^Fs5moGayCHVUHY^8)^j)Aj*RB!S2-FA?4#-`puwBW`` zJ_6OQj(FGo8DotHYRKq;;$4xDn9=4rgw}5xvxhi)?n?W5{*%4%h9Tg)zlQl&fN~Z1)gL(Dn7X!P428I zwA+U-x5!cQ57g1N=2bLqAWF z!&cbvsD)dvYoqP5vaQz%rL@kv*J>0AMzWAKn~Mxi5g2GlI7qvVZo)Z5oj=#O!M&*O z`3O3)uvrjNTeremC}nW@(m%#E-sITB>j-!yBM#(=FN`~c#@XjL3e)SjR9&%QO%tUg zzGv=SLH()`ZIt?Ayym;9VG1Muq+a+7Zo+59?SuRu_`k>@S4!yS3roMnq+SDO?`C7V#2 z8vHf4&0k;{kLT)fa==7EILSu3e|ZnxtFO;1 zGqP-;Xo(>_QKcYUhsi-X72BqH#7Zb-TsiNIF>G9xOHT3XoA*qX^10+#XCU0)UO4_%A_s_vO=uDd3_Q%D{OsvLMW9wGvuuRnF52{2vH06D~7N672!bIMt@it_D}& zwjZ7gV!RzZ86*wbEB5cnMJRbEqMM{G!K)bfJjyPH^9nGnrOI9S{~!dm4~P#&b*~)h zCMwM8mR+y5i~E5*JAopwZ>F`=ORfA&IF%O8(aS<}^H6wcY1g^=lYLPtFpyvW9F z3;FCS-TGFYPr#Y$ue>}?rTYrmWr^VbUu>!eL$cEdh1e>5_UDnZ@Mu$l*KVo_NDEu^ zBn*!qVnzYv>t|<(>nt8%CoNPhN!qGP|sANRN^#+2YSSYHa>R1mss->c0f=#g@U58@? zA4sUbrA7)&KrTddS0M6pTSRaz)wqUgsT3&8-0eG|d;ULOUztdaiD3~>!10H`rRHWY z1iNu6=UaA8LUBoaH9G*;m`Mzm6d1d+A#I8sdkl*zfvbmV0}+u` zDMv=HJJm?IOwbP;f~yn|AI_J7`~+5&bPq6Iv?ILo2kk$%vIlGsI0%nf1z9Mth8cy! zWumMn=RL1O9^~bVEFJ}QVvss?tHIwci#ldC`~&KFS~DU5K5zzneq_Q91T~%-SVU4S zJ6nVI5jeqfh~*2{AY#b(R*Ny95RQBGIp^fxDK{I9nG0uHCqc-Ib;pUUh$t0-4wX*< z=RzW~;iR3xfRnW<>5Jr5O1MP)brA3+ei@H8Hjkt7yuYIpd7c-4j%U=8vn8HD#TPJo zSe+7~Db}4U3Y^4dl1)4XuKZ67f(ZP;?TYg9te>hbAr4R_0K$oq3y5m-gb?fR$UtF9 zS~S^=aDyFSE}9W2;Okj%uoG-Um^&Qo^bB#!W?|%=6+P>``bumeA2E7ti7Aj%Fr~qm z2gbOY{WTyX$!s5_0jPGPQQ0#&zQ0Zj0=_74X8|(#FMzl`&9G_zX*j$NMf?i3M;FCU z6EUr4vnUOnZd`*)Uw#6yI!hSIXr%OF5H z5QlF8$-|yjc^Y89Qfl!Er_H$@khM6&N*VKjIZ15?&DB?);muI`r;7r0{mI03v9#31 z#4O*vNqb=1b}TjLY`&ww@u^SE{4ZiO=jOP3!|6cKUV2*@kI9Aw0ASwn-OAV~0843$1_FGl7}eF6C57dJb3grW)*jtoUd zpqXvfJSCIv4G*_@XZE?> z4Lt=jTSc*hG3`qVq!PVMR2~G-1P{%amYoIg!8Odf4~nv6wnEVrBt-R5Au=g~4=X|n zHRJGVd|$>4@y#w;g!wz>+z%x?XM^xY%iw%QoqY@`vSqg0c>n_}g^lrV))+9n$zGOP zs%d&JWT2Jjxaz`_V%XtANP$#kLLlW=OG2?!Q%#ThY#Sj}*XzMsYis2HiU2OlfeC>d z8n8j-{Npr1ri$Jv2E_QqKsbc$6vedBiugD~S`_0QjTTtX(mS}j6)6e;xdh*sp5U0aMpuN}qTP=^_Qn zh~0padPWs&aXmf6b~}{7Raglc)$~p?G89N4)&a}`izf|bA)IUmFLQ8UM$T!6siQxr z=%)pPsWYXWCNdGMS3fK6cxVuhp7>mug|>DVtxGd~O8v@NFz<+l`8^#e^KS3})bovWb^ zILp4a_9#%Y*b6m$VH8#)2NL@6a9|q!@#XOXyU-oAe)RR$Auj6?p2LEp*lD!KP{%(- z@5}`S$R)Kxf@m68b}Tr7eUTO=dh2wBjlx;PuO~gbbS2~9KK1szxbz$R|Frl8NqGn= z2RDp@$u5Obk&sxp!<;h=C=ZKPZB+jk zBxrCc_gxabNnh6Gl;RR6>Yt8c$vkv>_o@KDMFW1bM-3krWm|>RG>U`VedjCz2lAB1 zg(qb_C@Z~^cR=_BmGB@f;-Is3Z=*>wR2?r({x}qymVe?YnczkKG%k?McZ2v3OVpT* z(O$vnv}*Tle9WVK_@X@%tR^Z!3?FT_3s@jb3KBVf#)4!p~AFGgmn%1fBbZe3T53$_+UX_A!@Kz63qSLeH@8(augJDJ;RA>6rNxQYkd6t(sqK=*zv4j;O#N(%*2cdD z3FjN6`owjbF%UFbCO=haP<;Y1KozVgUy(nnnoV7{_l5OYK>DKEgy%~)Rjb0meL49X z7Fg;d!~;Wh63AcY--x{1XWn^J%DQMg*;dLKxs$;db`_0so$qO!>~yPDNd-CrdN!ea zMgHt24mD%(w>*7*z-@bNFaTJlz;N0SU4@J(zDH*@!0V00y{QfFTt>Vx7y5o2Mv9*( z1J#J27gHPEI3{!^cbKr^;T8 z{knt%bS@nrExJq1{mz2x~tc$Dm+yw=~vZD|A3q>d534za^{X9e7qF29H5yu};J)vlJkKq}< zXObu*@ioXGp!F=WVG3eUtfIA$GGgv0N?d&3C47`Zo)ms*qO}A9BAEke!nh#AfQ0d_ z&_N)E>5BsoR0rPqZb)YN}b~6Ppjyev;MMis-HkWF!az%G? z#&it84hv!%_Q>bnwch!nZKxB05M=jgiFaB^M=e-sj1xR?dPYUzZ#jua`ggyCAcWY> z-L$r#a{=;JP5X}9(ZPC&PdG~h5>_8SueX($_)Qu(;()N3*ZQH(VGnkWq^C}0r)~G3_?a10y*LsFz zokU5AKsW9DUr-ylK61shLS#4@vPcteK-Ga9xvRnPq=xSD_zC=Q_%6IuM?GpL(9aDx z|8d_;^6_D4{IQ1ndMAcFz5ZaT+Ww0wWN`xP(U#^=POs(BpKm;(H(lmYp+XCb7Kaw0 z;LT945Ev3IkhP6$lQBiMgr+vAL}{8xO&IObqJBEP4Y^x&V?iGC=1lVIbH^Z!eXxr@ zz)D7Fon`z~N|Pq>Bsue&_T9d;G+d8#@k^cq~F^I8ETsZ*cGOf*gZ4ghlAzW|aZ;WA13^B!Tlr0sWA zosgXD-%zvO-*GLU@hVV(bbQ`s@f~Ux=4}(@7O)%o5EH((gYflccBC@jbLF3IgPozv zglX2IL}kL1rtn4mu~`J(MMY83Rz6gc1}cX4RB+tZO2~;3FI# z@dU(xa5J_KvL0)oSkvwz9|!QcEA$jKR@a-4^SU3O449TrO+x$1fkBU<<=E_IHnF6> zPmZ7I2E+9A_>j6og$>Nih~b2F_^@6ef|Hm-K2(>`6ag{Vpd`g35n`yW|Jme78-cSy z2Jz7V#5=~u#0eLSh3U4uM3Smk31>xEh^-Os%&5tK6hSAX83jJi%5l!MmL4E?=FerNG#3lj^;-F1VISY!4E)__J~gY zP{o~Xo!8DW{5lsBFKL~OJiQoH>yBZ+b^};UL&UUs!Hbu7Gsf<9sLAsOPD4?-3CP{Q zIDu8jLk6(U3VQPyTP{Esf)1-trW5Mi#zfpgoc-!H>F$J#8uDRwDwOaohB(_I%SuHg zGP)11((V9rRAG>80NrW}d`=G(Kh>nzPa1M?sP;UNfGQaOMG1@_D0EMIWhIn#$u2_$ zlG-ED(PU+v<1Dd?q-O#bsA)LwrwL>q#_&75H)_X4sJK{n%SGvVsWH7@1QZqq|LM`l zDhX8m%Pe5`p1qR{^wuQ&>A+{{KWhXs<4RD< z=qU6)+btESL>kZWH8w}Q%=>NJTj=b%SKV3q%jSW>r*Qv1j$bX>}sQ%KO7Il zm?7>4%Q6Nk!2^z})Kchu%6lv-7i=rS26q7)-02q?2$yNt7Y={z<^<+wy6ja-_X6P4 zoqZ1PW#`qSqD4qH&UR57+z0-hm1lRO2-*(xN-42|%wl2i^h8I{d8lS+b=v9_>2C2> zz(-(%#s*fpe18pFi+EIHHeQvxJT*^HFj2QyP0cHJw?Kg+hC?21K&4>=jmwcu-dOqEs{%c+yaQ z2z6rB>nPdwuUR*j{BvM-)_XMd^S1U|6kOQ$rR`lHO3z~*QZ71(y(42g`csRZ1M@K7 zGeZ27hWA%v`&zQExDnc@cm9?ZO?$?0mWaO7E(Js|3_MAlXFB$^4#Zpo;x~xOEbay( zq=N;ZD9RVV7`dZNzz+p@YqH@dW*ij8g053Cbd=Mo!Ad8*L<5m1c4Kk ziuca5CyQ05z7gOMecqu!vU=y93p+$+;m=;s-(45taf_P(2%vER<8q3}actBuhfk)( zf7nccmO{8zL?N5oynmJM4T?8E))e;;+HfHZHr` zdK}~!JG}R#5Bk%M5FlTSPv}Eb9qs1r0ZH{tSk@I{KB|$|16@&`0h3m7S+)$k*3QbQ zasW2`9>hwc)dVNgx46{Io zZ}aJHHNf1?!K|P;>g7(>TefcLJk%!vM`gH8V3!b= z>YS+)1nw9U(G&;7;PV4eIl{=6DT^Vw<2Elnox;u@xF5ad*9Fo|yKgq<>*?C$jaG2j z|29>K)fI^U!v?55+kQ*d2#3}*libC4>Dl4 zIo3Jvsk?)edMnpH<|*l<*0Pf{2#KedIt>~-QiB{4+KEpSjUAYOhGDpn3H_N9$lxaP ztZwagSRY~x@81bqe^3fb;|_A7{FmMBvwHN*Xu006qKo{1i!RbN__2q!Q*A;U*g-Mz zg)-3FZ`VJdognZ~WrWW^2J$ArQAr1&jl~kWhn+osG5wAlE5W&V%GI{8iMQ!5lmV~# zeb3SKZ@?7p;?7{uviY6`Oz16t0=B70`im=`D@xJa16j2eHoCtElU*~7={YUzN41sE z#Th>DvJq-#UwEpJGKx;;wfDhShgO0cM|e!Ej){RX#~>a?)c2|7Hjhh2d=)VUVJL<^Aq|>_df4DX>b9W2$_DM zTjF#j(9?Co`yor?pK<16@{h#F&F8~1PG|qQNZPX^b!L*L&?PH#W8za0c~v6I2W($Jderl%4gufl z#s;C*7APQJP46xHqw;mUyKp3}W^hjJ-Dj>h%`^XS7WAab^C^aRu1?*vh-k2df&y9E z=0p*sn0<83UL4w30FqnZ0EvXCBIMVSY9Zf?H1%IrwQybOvn~4*NKYubcyVkBZ4F$z zkqcP*S>k6!_MiTKIdGlG+pfw>o{ni`;Z7pup#g z4tDx3Kl$)-msHd1r(YpVz7`VW=fx9{ zP}U8rJ-IP)m}~5t&0Y$~Quyjflm!-eXC?_LMGCkZtNDZf0?w<{f^zp&@U@sQxcPOZ zBbfQTFDWL_>HytC*QQG_=K7ZRbL!`q{m8IjE0cz(t`V0Ee}v!C74^!Fy~-~?@}rdn zABORRmgOLz8{r!anhFgghZc>0l7EpqWKU|tG$`VM=141@!EQ$=@Zmjc zTs`)!A&yNGY6WfKa?)h>zHn!)=Jd73@T^(m_j|Z;f?avJ{EOr~O~Q2gox6dkyY@%M zBU+#=T?P8tvGG|D5JTR}XXwjgbH(uwnW%W?9<-OQU9|6H{09v#+jmnxwaQ-V;q{v% zA8srmJX7Fn@7mr*ZQ@)haPjWVN@e3K z_`+@X$k*ocx*uF^_mTqJpwpuhBX~CSu=zPE(Sy%fYz&lzZmz3xo4~-xBBvU0Ao?;I-81*Z%8Do+*}pqg>bt^{w-`V6Sj>{Znj+ z70GS2evXinf|S#9=NNoXoS;$BTW*G0!xuTSZUY45yPE+~*&a-XC+3_YPqhd*&aQ>f z$oMUq^jjA;x#?iJKrpAqa<2<21h*_lx9a}VMib;a6c$~=PJOj6XJXJ|+rc7O7PEN5uE7!4n9nllo@BI4$VW2Nf_jqnkz%cvU4O4umV z#n6oXGWOt3tuIjmX*b!!$t~94@a@QgybLpQo3icAyU`iNbY~XNAArFAn$nFJ()d-U zFaO#nxxVF-%J{UB**uRo0*+?S>=^il)1m7v-u`PDy*ln%|3E-{3U~R=QcE&zhiG_c zDnGMgf1}3h1gWz8IV0Oc7FmEt>6W?Eva;J`(!;IIny}PvD?vztz`F6su_tUO`M%K5 z%C#=nXbX})#uE!zcq2mB;hPUVU1!`9^2K303XfOIVS{mlnMqJyt}FV=$&fgoquO+N zU6!gWoL%3N1kyrhd^3!u>?l6|cIl*t4$Z$=ihyzD7FFY~U~{RaZmfyO4+$kC7+m zo+-*f-VwpUjTi_Idyl~efx)!$GpE!h+in4G1WQkoUr<#2BtxLNn*2A>a-2BL#z%QO@w0v^{s=`*I6=ew2nUj1=mvi%^U@2#Wf& zs1@q6l8WqrqGm!)Yr|*``||#A+4#du6`mR^_#?CymIr}O!8Zm?(XY$u-RGH;?HFMGIEYVuA1& z`3RlG_y0%Mo5w@-_W$E&#>g6j5|y1)2$hg(6k<{&NsACgQQ0c8&8Tdth-{@srKE*I zAW64%AvJJ+Z-|I~8`+eWv&+k8vhdJk5%jolc%e`^%_vul0~U8t)>=bU&^ z6qXW&GDP%~1{L1-nKK>IsFgDJrh>!wr3?Vu-cmi#wn`;F`$GNc_>D|>RSuC8Vh21N z|G;J1%1YxwLZDD400Ggw+FirsoXVWYtOwg-srm}6woBb!8@OIc`P$!?kH>E55zbMB z8rdpODYfVmf>cF`1;>9N>Fl(Rov!pm=okW>I(GNJoNZ6jfIunKna-h6zXZPoZ9E2PythpyYk3HRN%xhq2c?gT$?4}Ybl42kip$QiA+ab zf-!EqBXkT1OLW>C4;|irG4sMfh;hYVSD_t6!MISn-IW)w#8kgY0cI>A`yl?j@x)hc z=wMU^=%71lcELG|Q-og8R{RC9cZ%6f7a#815zaPmyWPN*LS3co#vcvJ%G+>a3sYE`9Xc&ucfU0bB}c_3*W#V7btcG|iC>LctSZUfMOK zlIUt>NBmx6Ed}w_WQARG+9fLiRjS1;g49srN1Xi&DRd|r+zz*OPLWOu>M?V>@!i49 zPLZ3Q(99%(t|l%5=+9=t$slX0Pq(K@S`^n|MKTZL_Sj+DUZY?GU8sG=*6xu)k5V3v zd-flrufs*;j-rU9;qM zyJMlz(uBh0IkV<(HkUxJ747~|gDR6xFu?QvXn`Kr|IWY-Y!UsDCEqsE#Jp*RQpnc# z8y3RX%c2lY9D*aL!VS`xgQ^u0rvl#61yjg03CBER7-#t7Z++5h_4pw{ZZ~j0n_S_g zR=eVrlZDiH4y2}EZMq2(0#uU|XHnU!+}(H*l~J&)BUDN~&$ju@&a=s$tH5L`_wLeB z944k;)JIH^T9GEFlXiNJ6JRymqtLGZc?#Mqk2XIWMuGIt#z#*kJtnk+uS;Gp}zp$(O%LOC|U4ibw%ce-6>id$j5^y?wv zp1At~Sp7Fp_z24oIbOREU!Mji-M;a|15$#ZnBpa^h+HS&4TCU-ul0{^n1aPzkSi1i zuGcMSC@(3Ac6tdQ&TkMI|5n7(6P4(qUTCr)vt5F&iIj9_%tlb|fQ{DyVu!X(gn<3c zCN6?RwFjgCJ2EfV&6mjcfgKQ^rpUedLTsEu8z7=q;WsYb>)E}8qeLhxjhj9K**-Ti z9Z2A=gg+}6%r9HXF!Z~du|jPz&{zgWHpcE+j@p0WhyHpkA6`@q{wXl6g6rL5Z|j~G zbBS~X7QXr3Pq0$@mUH1Snk^1WJ0Fx2nTyCGkWKok$bJZV0*W?kjT|mkUpK<)_!_K^OoTjMc+CWc^~{ZP8vgm`f&=ppzKtw}cxwV^gppu}^df1|va7Q?@=(076-( z4KJVmu?l(aQwmQ*y_mke>YLW^^Rsj@diLY$uUBHL3yGMwNwb7OR3VD%%4tDW(nC984jBWCd90yY(GEdE8s(j>(uPfknLwh!i6*LX}@vvrRCG`c?EdB8uYU zqgsI4=akCeC+&iMNpVu56Fj2xZQHs6SdWssIF#Q@u@f9kab0&y*PlG+PynjHy`}GT zg%aTjRs2+7CknhTQKI%YZhFq1quSM{u24Oy2As@4g(bpbi%y1i0^TwI)%1Whpa~qE zX4MD(PgFEK@jZBPXkFd437aL6#COs$WrNT#U=er-X1FX{{v9!0AS$HR{!_u;zldwY zKko!`w2u@($c&k_3uLFE0Z*2vms?uw1A{AqZw^jwg$|D7jAY20j`s*l##=4Ne_K5) zOtu6_kziEF@vPsS7+@UwqOW6>OUwF$j{r4=nOSf-{UC(rEKidie7IUn>5`UoNJ9k) zxJXXEBQifng+Pte3mPQ76pVlZ<`jnI##F1*YFA*)ZCEncvgF-%)0dUXV*pXTT^L`n zL=?A5Vty#{R9W4K)m$`me~*_(&a88M?Eon$P-YdVG}#Gq4=hh#w=`>8f`9}}zhv;~ za?I=Gb3v$Ln?-SDTBow0J5Tt&xPlw|%`*VTyVee1Oh<-&;mA|;$ zoPl;^f7Q~}km#_#HT2|!;LEqORn%~KJaM)r#x_{PstSGOiZ!zX2c}^!ea3+HSWrwE z=6SJ!7sNDPdbVr#vnUf}hr&g@7_Yj&=sY=q(v^BwLKQm|oSB}172GpPlj?a3GqX#B zJko4zRRttIY>Fv#2b#A<_DLx=T@eUj+f}!u?p)hmN)u4(Jp(`9j58ze{&~rV?WVbP z%A=|J96mQjtD037%>=yk3lkF5EOIYwcE;uQ5J6wRfI^P3{9U$(b>BlcJF$2O;>-{+a1l4;FSlb z_LRpoy$L%S<&ATf#SE z;L?-lQlUDX_s&jz;Q1Lr@5>p_RPPReGnBNxgpD!5R#3)#thAI3ufgc^L)u%Rr+Hlb zT(pLDt%wP7<%z(utq=l%1M78jveI@T$dF#su(&>JkE(#=f4;D54l*%(-^(nfbCUQe)FV9non9F%K+KZ(4_`uOciy82CO)OolxisUd0m^cqueIRnY< z;BgA4S1&XC3uUP?U$}4o&r|0VCC7fkuMZBa|2n4asR>*5`zBaOJPWT$bNn(W_CK%L$c2AsfSlwq?A8Q6 zhK&USSV=^-4vZ^5<}pnAOb&IKseHNxv_!|B{g@d^&w%{?x;i3iSo)+vt^VnMmS!v) zM)W)05vXqzH5^hOWWw~$#&7HoIw}}DD3bCQgc=I8Rv|G5fM8O^58?--_-*>%Nwk)j zIfvfok0n05!w%tZ=-dpffezI7(+}yX5XhwYk#0@KW%PkR;%#t|P6Ze_K*N6ns%jOt zNeW(bRsv0BK7ah~9U~UBAVA_L34F+;14x6-;I|o=%>?sS3@dpRv|GKxilsa#7N#@! z!RX~>&JX&r{A^^>S~n_hPKkPR_(~~g>SuPj5Kx6VI%8BOa(Iit&xSMU8B#EY-Wr?9 zOaRPw0PEbVSW@Wk{8kkVn34;D1pV2mUXnXWp{V-M9+d}|qfb6F`!a9JQO_-wlH?zf z4Sn0F4-q-tzkaJ?1fV0+cJBF$f0g6*DL6U3y`Tr`1wzCiwY#muw7Q-Ki)uN}{MoCWP%tQ@~J4}tyr1^_bV9PScNKQHK=BZFV!`0gRe?mVxhcA4hW5?p0B<5oK+?vG^NM%B%NDOvu0FMq#)u&zt_-g&2 z7?z%~p&32OAUSQV{<=pc_j2^<;)`8$zxCEomh=rvMiliShS?ahdYI1grE-M&+qkK_ zD=5Hexi<&8qb4hgtgj81OD(tfX3EJSqy9KFcxpeBerG`apI4!#93xpEFT??vLt>kf zac28;86CpMu=BWIe$NOT~+Es!y#+$ zvm2s*c`J9Gy*ERvLSI<9<=j*O=0xUG>7rYh^R4bGsvz;j-SBO|P^OQ1>G9_akF}D; zlRmB@k3c5!s|Vz3OMZ8M*n0AMTiSt5ZpRy+R1|ckna&w`UQjklt9f&0Z~=->XImVA zLXizO2h=<|wM~w>%}3q1!E{oSq7LBPwQ~93p-peDq-W?wCm8NOKgTSz-P)|cm}S5&HBsx#C@Ba5;hzi#Yw@y-kC~)@u4}Rf?KV0$lPjv}} zcFpNy=YJfsS||9&!-JFjw=@NU96ESzU^gme0_oNy?})II`>Sy>bUCHs_(m&)vn^&isCl+`F~qu8elAO z)-ZP7`gYE2H(1)5tKalz&NJbcutAU&&JFV~$Jrai31^j>vZ|HV1f}#C1<5>F8 zS1RWIzM%b{@2dAF^$+i4p>TC8-weiLAPN+Aa#(bxXo9%Vz2NEkgF&s#_>V?YPye^_ z`` z-h3Cv^m6K%28I$e2i=cFdhZN?JTWhqJC{Q9mg0Vg|FiPEWDl&K)_;Bz_K`jH7W7QX^d$WQF*iF@#4_P*D36w9&iJr2E{w?LRFapwZIIVHGH ziTp*5>T{=;(E}z{1VL4;_H`BAXA~&zpeWX!gN9m|AfcJ{`!XVz48O^&+0Gd|w;udP zzU|DbGTS|7qZoEoDZEH9Kb0%DZvCaWDzuJ=8jZz}pqPn+I!c_+*~>m>BQqN2560*< z$6sx_y8WRqj$SugYGip+et$;iJ!SQAx=HgVSh_3e)MOFHuXD@sg>Yi_p8Sh`{lP=5 zo?AFv1h;KqR`Yj!8Pjji3lr+qae2|a1GmlxE*su%_V)K0Xu0(#2LcO!*k11w*V12$ z;f~i{kI#9PzvFLZ3pz@d558HeK2BTvk*JvS^J8L^_?q4q z);;4Z!DsV!P*M>F>FiF*{|p_nUgy;pDh?J8vwO;emgOAAcxrgDXiSDS5ag?0l*jj< z(khZ3-)>eiwPwpb6T9meeL)!2C-K@z9fF`0j|t@;^f5+dx86R3ZM{bnx9Hm1O$s)N zk$OvZR0u2`Z^QP8V%{8sEhW~_xbZMad2jtz&0+ekxmp;9`ae;_f%-ltk5E%)VT*a6 zRbMnpCLPnalu+1TafJ4M0xNV8g}U4Mjk{le6MA|0y0rk)is}M%Z9tUU22SvIAh7`w zTysd{Pztfkk=jD^*!lA+rBcqb)Fx`A5iaU2tl&XdL1D)U@pLEXdu%#YB*ol1N?4ti zHBQcU#_%UqiQ1)J^u-ovU@-7l?`YzYFvA2#tM0mEh3?CpyEh_NUuVajD16t zyg$C*5du9R=K~6mCJ`W+dFI$9WZZauO)p2H)*SKpHVsIu2CxfJvi2>; zcit#57RP7DpSwMF-VBm|4V5d=tRgX7RM9%KQ0JRo6d<)RmiIPWe2zh6tmswP`fs^) zwy};#jk|NXMqCSfwIR3QZ#W2`(%sJ>qvk=53CYoLmQt9q|2Gm$sB;rEuBqGJA1OUM zoyl4Wy-HYn0J6L=cad8o)R!Ea^;`rSMg9hYo3?Fw6B9dUq75a-MSb56n8~AAsS(JP zZ!1khPu}!GRpsj+jvl`N1tDD8m1myJCI3c-c<9U-1Vg`xJO~}5_wvPXYh^=Boo^|V z3Tp}|lH!9m4Ipa_$p;b8fjUd=zc4iO7vr)M&Xs0_m$fgY@+hB9%K~4*9$p0d)m2bO ze5JH`W0fnIKdcW!oO#^g1YceSQ4u->{>u@>tLi!fky)o&$h(=he?Fe_6?}O~iSf(F zV&(P~*5h>BW{3e1H%8*7#_%L1#>W97b0@jHtliES^w6w5oldI7QL+?I(Pl$DaN>~d5nXx z;CO1E+S?3E2PLq~)-?ygkHAO1m&hOYmj7?;2XM!$D^f0l9K4P{n}mgb{CoYH6RJ8o ztydc6dNqA)`CG?=Gd~EIbi`UM)eyzGF^+i?&TOdyW~mFH_^Gye(D}clDVFQ@V2Tvy z7rQIaq8Xx`kC;AO-_{k%VI2e6X@bIy^mupEX%{u0=KDUGu~r6lS*7GOeppy{&I&Ly zjOTz=9~jC|qWXznRbrfjg!1`cE!Hzyjzw6l{%>X)TK(UEGi9Uy3f9D6bbn0gT-s`< z8%$Msh!^8WidX7S;)n2jh_n1-QCtSyOAKcPQc(Xlf0*Q|5CSBjo(I-u!R0GJgzTkL z|6QdQRrUMbUO|q0dQ%+d^4)*Mjbm$R}RUcz(7|E0Bq-bAYY@)OsM<+2>}CV zzPBgeD~kBHE(Y+@l2orJrdtV7XXq_V8IETas%7OCYo`oi)+h&v#YN!Qpp7drXFS>6 z?r-q7px+(rIy+bo1uU#I2A5s@ASe01FgGMbouFkhbkm-9yZ8Q2@Q1vuhDQ3D3L+zA z(uz8^rc24VmE5r0Gbd;yOrXnQKAEBfa3@T7fcF$#QYv^00)VZPYehpSc@?^8we}o{ zlX0~o_I<`xSfI8xF(WXO-DX1>wJ`XN?4rw@}_RLD*${$}UaXL=oM(=SDMIxZj1Ji#jAcrH7nYG`r z#ewodj>F5Bf9j(j`a;>)=*2j_ZN}vf!~Hq`2Eyt;9UH1_(yjq1OUO(1M0lI3FZ2j-fU9)L59v&OiQ>5$;d!jg?Fo{Svf5t5FCZbb?)* zJN=Q!?2BztV$7)CWtG0MO~Lr4E5>aoHD5N4(+@~gQEbZTc4s3HrIl_G23PCng4Y3f zbLZK1A-x9x!)WwuI=UBkQ5QyE^&Nrw?@fsRKK41G9-xq=#VyO%CEo`{_eioDj%M!3x=>I zfOPFiFX{1t-|+3E@?UuK=0miGN04hW0=JnJrEyWw{Bg-jMvAA}cg<5LN1c5BQdrIZ z#+bxj9Jbu`11@IUjU|RKfL(UzRlVB4XT ze|(WaxL$KiRqkgCr3^Al(19!_Y7b=E(4Xm7LCO$y5+k;Fu6B#=OSzW`-7p{zRv-_) zPr!|km?8aF}+3hm)QG92YaI+jctX&5IrvTUGf{Y$)TK6)s9v!SMhU=HIpEC~2 z4>o14mG$El2sTA(Ct?xS!l*x7^)oo}|3+BF8QNe;bBHcqdHVmb?#cbS*NqZ%mYS~z z`KLoq7B#KULt%9a#DE%VTEo4TV03T2nr`FK5jUTA$FP0JH6F9oD*|0z1Yf2b5?H0_ zD|K|_5Zk`uu?ZN0U! z_mL>>F;mnHU=@to!Vv*s4;TQr9y)L@1BXXz^a85NSifPTL4h6I>+m_S3~FkXB{N?E zS<3ue_(wqaIS5;4e9{HB`Okl9Y}iFiju+oTqb)BY)QT?~3Oag7nGu-NB5VCOFsiRs zs@m%Ruwl^FuJ1b}g^=*_R?=SYJQ@7o>c9j>)1HgB zyN9LI9ifwu{Shlb6QO2#MWhxq~IG!U^I!6%5}(sbi>=bq8!8@s;4Iaun#kvh7NPwX34Rjbp2f!D)cF&sNIO%9~;C`cs&ZY2=d@c3PpN$YZjUT}X7rY`dlWX$yc znw(7=fzWapI=KzQnJ(6!o0K_aDk!^dZ#)pSTif+jQtQXga$bPApM z=);jZ5c*?*GoeGMnV0=RrZucRRYBjx>tx`A3OuY)#tp2w7mh}&kj)SKoAvbbf;uO! z?+RItUow0xc*6StuO4D--+qY!o}Isy}s;ts5aM5X~eJUZoLOq@dGv=a4hHJD<* z5q{dZSN{bv_(Vj#pFm7Q<$C;MwL|Qizm~QCFx~xQyJoCOZ$`sYD}}q>PwRZjb<=E< zAeMP?qVfM>xu2}Il2xT6={KBdDIstxY-`5IWXN zUiWV&Oiy5R_=2X9Y$ug9Ee=ZSCaza!>dWBMYWrq7uqp>25`btLn^@ydwz?+v?-?2V z?yVwD=rAO!JEABUU1hQ|cY+_OZ14Hb-Ef`qemxp+ZSK?Z;r!gDkJ}&ayJBx+7>#~^ zTm<>LzxR^t-P;1x3$h;-xzQgveY$^C28?jNM6@8$uJiY81sCwNi~+F=78qJZ@bIsz1CO! zgtPM~p6kaCR~-M>zpRCpQI}kUfaiZS`ez6%P6%*!$YCfF=sn}dg!593GFRw>OV2nQ ztTF6uB&}1J`r>gJuBP(z%KW{I^Uz%(^r5#$SK~%w1agl)Gg9Zy9fSK0kyLE24Z(34 zYtihZMQO^*=eY=<5R6LztHaB1AcuIrXoFuQ=7&C}L{c?Z$rto$%n=!whqoqG>#vvC z2%J5LVkU%Ta8hoM($p1WqN}wurA!d@#mQGU5Nb>~#XC84EYH)Zf&DZR!uY+-;VqS< z@q?$ggdX#auS#%%%oS^EN)?JhSR4JYpSgGRQZD<9!YvvF+zp0>C#$!x*x}l8U|Bb& zv?v*im5Bq_(5Wi40b1^nKun$XTST(a8yOAcqQZmKTgGLo)Ig6JuEh5J9NnqJXin@Gxzz-k6xXWYJ&@=JZw=$+ zFPGde%HsR`gI+y`rtiPaMYwbtyp!sVb!pX~;c3zLoPO0eaZSV+O_z z%9H@UhqNowzBTPcMfL6kC>LRaFF6KVaSv1R@%4}rtleX!EMnL`rethYrhTLj1x$tj z;)H!fKo08&T(;i|FT&rPgZ*D0d=B2dXuO_(Uaoi9+vEhs4%{AD{Fl@4^|`X=PvH(s zI7$6bWJiWndP$;&!kSCIR1l57F2?yzmZm~lA5%JKVb;1rQwj*O=^WW~`+n*+fQkK0 zydInOU1Be2`jhA!rnk1iRWR=1SOZpzFoU5{OPpc&A#j6Oc?D&>fAw=>x@H7?SN;d^ z-o&}WR;E|OR`QKItu(y4mT)%Pgqju-3uyH?Y@5>oSLO2Y(0(P!?_xOL=@5+R7rWw# z3J8%Hb@%Pzf^`=J6fEJ_aG6+e7>OUnhaO1(R1<6>f}L z?d@Wnqw9?^;2?q(b@?Wd=T6r_8a@Z4)*_@Q7A`+ zW3w?j!HW0KbhxF%D`9d2HpvIrBxM!36W3Yh5=8_0qYfnHm*yiLB?Ay|V10N%F9XYq zanaDtDk$rS+|_H_r|a${C}C7b{E)Ii20-a?Grff$E?&|gWF<#Ern2GqhCiS0~Y%knIi8zY^lE4qLaR-3M;_Rkz(s;wu z9207W1PXIe#4h4Zw}dvdV&FYcnUlD5_C4hzJ@bPSBVBLpl$&52mi+wwH;svyVIzAB zoA+NQ;Hpqh?A}^Et~xhl>YQNQwh20!muW{ zq}|Pg3jHZWnDBN?r1KhiVG$%Sm-4+=Q2MZzlNr3{#Abqb9j}KK%sHZj{Vr2y4~GIQ zA3Mz1DjQ3q(CC~OyCaZn0M2!){)S!!L~t>-wA&%01?-*H5?nzW?LJB`{r&)vLB4!K zrSm({8SeZ0w(bL9%ZZAZ*^jf=8mAjK^ZR0q9004|3%73z#`-Npqx*X^Ozbja!C1MW z-M~84#=rU1r>p{+h9JU<#K_x$eWqJ+aP%e?7KTSK&1>dlxwhQmkr69uG~0iD@y|L- zlY0vSR2|IhZoS6PpfUai_AhKo2HfdD&mhv#k51CX;T z*sU)XbDyfKjxYC$*_^(U)2-c0>GJ(zVm$CihHKlFSw&1A$mq$vsRt-!$jJe3GTaZ6 z3GcVvmwZ0D>`U+f3i*pQ>${p1UeyF~G9g~g-n{ThVOuC#9=ok`Zgz@qKCSN!1&P`N z=pdlGNwal%9;)ujwWH*#K6CQG*fJDAQiKlO2vKJHeA1lj&WQC+VU^@ea8$#~UOX$*Q!V^8L- zL0$W5(Y3=??%&j_WUq6*x>=?BfmI*d8fmDF*-!XVvxL8p7$r+}Igd_(&`|D*;Z#GE zqm{tHx&aHBpXw&~l6>7-FlyiSPJtTJblAjLU5Ho$FeN0mDguFAq?r+6^~o6|b+rfE zGVcZ&O-X~tE3liGcdI~hHSCT+&F&uH8rr&f{6pr^1y5061`fu~=^_|Idrgti5+*U7 zQOb9G?Rz$j-G0Y}x+i{HB0!4ZmKzykB<0;Rbmo2)T4|VdcwujI_otLG@@8OOKg3kw zP|0ST0D4@zT?O=(0Pikp)Rpwxw_VsmW4!^j^sFd6r5l zw}SG_HQPs>ae%Bq{sye_SaBX%|F-}&^)Wz@Xi<)YNbO?lPs7z@3c;$b^Aw@>E%mOj zW^c%IdtC(Kk@s*}9NbKxEf8SZtP+32ZTxjnrNWS7;W&D~ft{QY?oqOmxlV7JP!kW!Yj`Ur{QbbM1h=0KMaIAmWiISb7TKd4=gMeo+Tcz2>e#NihnOV%iNdx` zeiuoOK^{}D+M+p(Y7EC=&-`$B0F< zQ=zHaM;&QQR4jM$sG=N&sqOvD_Bx*drQ6c@u0()g05cwl`Xm{!S_Nuaa2KlL*rmmk z51yPE)q?Bl$sNM474Y!=zZ zc{EVGpdJ!Su{Qq%llR5O6#zK8l(ld*UVl87@|iaH@C3+*;XBxjEg&fsQrzpMo3EEG zv*Tpms7a;7!|iz8WY7={0a$0ItO-(ajXl;wX_$$yzEF5k9nc>L3wv!p{8h2)G0W?h z{v6vH=7+>$Ho^+)9hDtCd+S_yh8pzS9$)hYev-=eDu?lGIR;-fgz+dr+wcmM-^dZp z9}`&kAf$~z1ovF)>Hgxc!Xe3cju-jQRluCm;c_1=PYQygb?Oxe z!QG0L3sT_k=WpfOPL#|EPlD^t;ENCC39O?tHd<(kfx7SOcxl+E#;ff19_+{vbkZSvbS$I{#>31KZj^$n%ayX0jj}EvsgnHg16P z_A6Y)pdp>kLW<;PtR*Vs#mVb%)ao7AXw{O&hBDmD;?mc3iMH;Ac@rZZ_BQa8CQ~|0 z&d1L{in-z--lBO|pxqc%bqy^~LAGv=E*eaVU~OeuVV{d`Vv#-_W7EYdTDzVraG9H+LC_dWcgZMn~KcP)XvKWbcr5&d+=a>{*(Ha6Y1$==bR z{O-?$7H;`2dt0B%Vm?6`_?ZOjJkyu9ZJsh^WH*+es&^@KDcR%Zej%3PJ*XovgyhTbaH(!H1H_OF~=*f55Jr8A%uW zz5IoAB~1e2-tDGp9}`MnavAMy?jgPM5F%y`%$}dFLrz_* zIrO=afT8+AkK5B1s3{ZDVP$g6y$-*U*=?-fh!cNyn3q6YhNhfRxW&GLIJ2#>9bYMD7-F%{|Iw%@a=DoAAU;3k9p$`V zImKm{5HU~wq|nQFwab)_7lNckW#1z2$|oW5x7vDbBURVjw8674P?L1ogMKpHoV>;# zO%*1OwI|($UOr#hL(*M~qsn3PF%_|15uc%Hy9@D>_~N|?<%lig6yKX0a#1s$o(^Laj8bF#5fGPOFMGmMiUaxSwE}Qf#SG_f79d2Iv=TFBXzTpr$^avJ?=|arh2<+ce}&248Kw0} zhlva`wD6X~s7|37la4FnFOgIHhBiFo`lw~?lSbk{>)P(3jyVhM4O)a=GX3(sW1vIC zz0mJ>;J{!eN5#nf2>$u=3Kq>`7u9QnChi8>CjONBN-b+W_UQIuN#{N$Q<$}IOvpQP zB&5ZrY{V&D=4)voh;6<1U`PFA>V%XUW73S9D^J>cQYfzIyIV5i35WNb5K9c^|M}=* zN_C3rnjCZP1^v{;EaGK7Tp5z~B#?f5NZaAsFUOLK)mI~bJTaL8DF_eRikE{%^J?y9-n_U32EKHPCkB^ZN2*zk{bC=GM%_I z61}nkr+Plg6S0V=mY>H_KQU&)P~=y3$#$*U8FunXkb_e1O-7t@m$5re%u!_G%^?_| zRIJzg+lX$}+ba|qx)Ec6c^ip;`_QfQrD~SPa4MoyRUOtX&~^XWcO^a}KBkXK9J{ZFOA~rovYa0!7btTC*=xNQrwJ)$Eu`TT$;%V&2@y@$ISdNn ztbM7|nO+U9r;ae{{;QiNEYpe4nrFq_x3 z4Tvf^b(I@_3odwhVe!aC0X&~inrYFu# zh)+eF__8ly&nLr4KlLWl%B_ZMo=zCH2QfO^$lJ zBvU*LQ#M(5HQ}2Z9_^y~i@C#h)1C*?N3v68pY+7DD09nxowdG#_AAM5z&*|-9NcB{ z_xKUY>Ya7>TO#Bat}yM}o(~8Ck^!QHnIj8N9}c*uyIs}IEqGn`xP;q3vhW6gsqUe>`m1 z)~ad@y1=?H`1SNl?ANCs5ZD`8tG&Hi=j|R%pP(%gB8pd)Q--E?hWU@)e?>SLV4s(- z!_I^oVC0x97@I(;cnEm$ttKBnI3gXE>>`K?vAq~SK?0YSBsx{@s1ZdiKfFb|zf}ju z7@rJb3mC{U`$R`YS(Z#KyxQx_*nU`kf;}QL%bw17%5~6!mMao^-{FFmX}|ItFuR~F zAAvTF%f4XKYo>2-PJ~ro@Ly#t@Sf69CrA+rmMRpihqH7V&SXX+$Sw`HZF`I*_3Vjz z%kPMyN0J3sl>X{-h12)j&XRhAAI;Aou%%z}gI>G+32z*qpZg{m`CezFrzg#&yc<1` z%j~}PN!F5Ddq(>R{+t0v{j6v^0XwWGu@5+`-$m`_>pCzM`r}wz*8Qv=$|P0R$%tJp z>D+N4GZ|Tg>XL<6XP9_wQRGDs^1icY*5GP4>*7mGMr;V zI%kT_^_SQml6$#uRE4Ps>}?ES)_XI8m-%GN{o^itb^S7e_bM$-wo_Ws)W? zx4_6#*X;T$n2N==N0#xzb~BQU#%^NF6|~898JGDbQxjK(ex;Q}_Qn@?Y>!kkUYUeY z&VclG1#eDPU78K@^p3tAUvZi1(nFfk6AAVHWt)Wbi7dPbjA4isOY~?*1&asp!wg#Q zSpSI6*!TGn3|-%vuJE<9V_1EKkz_0%z}Mb7;E!uz)+0^k;@x+<5tzj5 z!InbRtc`YwNCbCac{plY&Y}hWp#PC{o@5UsBj#tv3f^ns^`;$MVN?>q!pW+MYeC7= zkWr1kAX(0xVQ<{qny&CO*|g1{Mk_yE>1t}_YT<5#p8P7QXf;o|s>XQ#SoA&!ddE+8 zOM&VsxsRGS(Spli?P$^pK7Ty{v86RP_6h|MU^J z`J>vn0|BG3Vf!uR0zM|GwtiTPZNb;a@@1+V5+$P4GI_&$%6m!YRGL=lz5kh?z#5f55 z76COi1`R(5p69;ThuQnJ$R3w?I?jigai2arApagd=^tT~oMUWp^u|H_@zXBjpI)Dv zEFc^_`mVu5U*;ClT?x-t9{#fto_+92GF^dotz0sFWTDwZ`s40AY@mv+Qh5c-Ts8Zp z!(v7!zPvFhUZ-xkR!IvaW`{PqN|k)L4*anbtmK+UU&K*awl?DhxRalbtmDw`$#VzK zYFaG}?$F)1j`Qx7wbn|XzMJ&g@3Ai#u5M?%CLPghk;lD^)-|21{Sr+M(suBU4}6CMTMxc_tD;X;z<1-{FeHte=kh1B9O6Hl z!v2i$d1VFC&z&58zU0`G#7^K3Cs@9LYN16O%Vz)?-iQL!G6&sg6aaX>DBZmm@lFrRJpcL{K3(;+`$9GDFDw62Mud@LZjabzVC=w$dx>TQa}U z-{dhKYTYx*C=Fio`ez@wrzx+p%Fk3i&v?6ENXMb3p^?;_&huLLueDwr zpRqHbU%i;9TmexFxCS8F1rPo-ea3!}!ew7{(($76Rdnfa`~$9{8H@f7U&0&HjZ3TZ zuBc||%FljS_e&wNZ$1ezT$*})XAfm??$_cY_?13vM^tT0EKY2ptb+v5P10}a%aTk_ zh8@_T{ns2@jTFhv`)-Vxh}u(0DiL0MUi(We_eic$;gCoqj(T_S{jDo^PahnKJUp3@ zMOk+%weP*c%K6VFXR2icY`J~-&fVMYUg6fsFI->jlA|9`+07y~$Fsz}^;w;mNk$ms zu?y)VA@QH__tvYDudhEWuDD20H&uvrf_boY{($?5{s-SDjyRxSC%%2Xs5d2dpjdk$ zU*NURD#ovwIfd^H{fXR@UuaooJtQr7$d0+(K+1UEwtG9_T?sb$ExV$e-bpf}a@YUe zuzInI59w!x;<)>Be;a7ukLW>V=8~J6nKU<0@H+SQ!Be;1Za_pw#hiuW_PMPBo8W2G z*WDtiIAN<>HQOmh)DMi{s-0H^GmV3QMf4Zu(zXT!-c;2)uv4gUwt(-}-N*|KUOo$h z+Ak^R)h8yB5UD8 zsSjHgY}KguNi?xV=tdCWqJR!~dDpFQoRJOwxrWH^vfRq4%)v;sDfIjsLXF^)uy>!i z*S8Njd7yfa`+7(|8H9j73Rh|TwFpF(8H-p;RLLIU>k<*qI%A*SL{u$%<=X@Jm1QFe zVkQ(X8P4Tohl?_tSO__^aqaI?k$CC8uNLv2mp_zD@4oDaZfEN5;3#XY!L{8B!;Dtt zb~Zge@JF|#Gsk^5$-|(OPI73po|WZh<`UxaH#Y2!&p05Ph?H)d3Bc3J4sDi$f(6K`?&D&~eHVuE@_Prkt>_&8&aq=OzoN!ANkvho;qIX(g|d#EKQbJ@;-%_iARmgSF1fEK z@B4W@5mDME7AzfL**c&2#B7xO9>rA4x$rM{N=%0=goumK1kL{TF@CSk0yvqR2oo&m z)?nyiL$9~Jt(qnEuWt9Hc_duim%|zJQYiaF*~orVNDvJB;`%ZW_2x%Uu01LeX-JP& zD&fas6d3=igAgcfeki79{5!XPHHYR#nfLYRKv^wkv~cnEbLHMwQ8%yCZI^rK!D2qT zk40Vg;e!_!3d56&umIuidN?6MTZFzHot}AdqKzDh#w0s`)cV!2A74RSH1@lDXtC38 z+UhO4A9?oZEOV{bIgGd1{2qMR&xT+}q!=I8m)W23v!W2WPC?Tf!F!e%_(m^lQZtq* zYwi}gY(KZ*Y^OWRNj$Ph#uEEBM+wtN8QFQ@^`GDOln^ioNrmtvzNNi*qS5lPHxI96#sMil*teLVaa%$msF>@5p#SjT%q8|<4ZOUB#!-kG+|eFSED z!|3c8fXaym9qH`L;pmqTWcG}WE$(h1sZ3seM>)E3ptoP<;~h~qe6XA)lGVanf&->P zjZwi;_;Dt+bYdAeD_XSQ-DgXRXqLv`3Wcgl}myA-JlzBBIh zWq4Q*9#(zjAk_H8VS_AJ`?OS*^gB-rp|~qt;v(C5ef=SErv;~zL64hW`#g!UZQcvZ zF6Ra@S@YhVSkSWVAY=Z1w)w-hfJDRwKTUH0o-OG5TlW0HDH36hIjnP=?A+8u1)Qyy5U8Gi$! zt^!vy|f=YHfQ`ZRK?D zXXn*kItRg50vr2+_hV5kjOleg#s~z(J2p#`=1Tq4#JS`MC^e4p&s7Ir=3m(K$LW#` z=ULCoWtna!so+QQ*JHb~6Ps9_&Ag>9qsUskp0pKbi`n?(u3&@QT!?}N}rXn z>1eHi6(@LicU*AR1obe+nbzTCD#VTJ`PFLRT(nc$NWrhsgRwFni*D(#?W^x=J6?|b zENSc^D}s>Y55)PzFs2d_2;yh89E0ZIgs&>6JV=pL6k9g_(`$04EoY+Zjn}}8e#n83 zJ=zB>BU<253Erdo$wE4^+@QQJFZyAj#(InFlN;!UGg96R@{Y&%OlGG;dM)^X8=Ddw@&2Vx?zui$tO z-{zgaU7&F!xs=e`Mn}r+xrdIAmkraRN_7P1?qu1|TZ%1QR(Mn?k+pq`Xys2v9Gs=a z?r@g&;UKcM#?36r9k*eVD(}9qe8?irotsn0+eHH8*4 zPX@Lusr)$J%8jarx5ssEJ?twFyu4kAbrf`96_z{6at^&UkyDzFa69RXP>PeK+dAWqE5<5P+aHa zs<<*+OO_2ObTXau%y)Nn{(p5`XIPWlvi|asjYcui;E@)Ig{YKBXi}spqC!-P5owwL z3L*+9;0C0G!xoN;4KNfDaElv>1#DMDglI&MAVoK2+c2Pr8&sl*1dYj=^>NRS`{O&%YV25@5*eoOvpD_(xdKsnqb^`T}bm;n0BN9ben1Ynyi*OOf;qLpf^ z!T{}GzkXSszN_Xqzp>}S*Im)_Y8~2|B*ybw(U=Q)5_NcMkT;)1&52YQJB)Tn%kPK! z@3;^AI){B(&UOv<{v9KKJrInkdcXV0%O1%1=7vYV*j?v(Kp~arZio$#(A@$kYB3aM zRdm4!^Je15%66($EkCIWGhi@=kNAyLJ3ydlJnCpPuxH0+OA}J)+t8d7nT->##Nz4w-L=S7ExQt=Rx}S*mpT91(>t~qe7tM%e|O)TIO^dP zfo61GNS=cJbLutqUh84?7X#bq)bv57s&D_zm{+xNv7vHjb=_}j-Lrj-Ss*pcD@ts$ z)5Dol8Z_&*1@JdAQE7SL$*!TXI|YE7q=YGkIiUeLvT0)14Q-ivs|+cqeT6DTi9eQ)h?Pu9pqmH51B* zFMd|;l2@D4*56|EhMFlDxl2i<8qq=c+AhMYS3(A28#3DZ;_Ln>RA3q#IAdJq7M#N> zTZ8t=_>lq0=W&w|bdQ^sy&m^@KR)mNi3|1<6|OL(0KLtP#I6ix$2b{-Y9GP5I7 z8AJUSCnlia5vWawX%ZLWTC2UV$cn^sfv68W!6)QO;ZjnX=7#`$ZPRG~irfl)ZUJ^D z{lUk?(*SU7XIiS^H{Lpxn%542#PgxdeG)Ociej#(uvX)z;Z3)<16Yhd z-sv?qQ5D4a)ZYoYPRep2Zvom@U)HKq*54ZEwdaEq^FZG#(CyG!=Vw(0j8CCmP~`_z z=OR^i&WkDCf2cLvWm@d?)mEgme{hA(o#xAL023LZ3(82SGRg6jJF7$kZ4! z6*FTm4y6v~CP!3$+fxg{QeFo24<3iucgI!oyjV|9Dsx}r~4X@lt^VaH$u zD?87}1Jh=?G8OYg*ts2k;X9{f*Za?yu8IUUfyuQ**wbcWT+KncjD^qQ3h&w2+S(Mj zZM~?Ot%ggTIHwkBkL-4&jI5R=B+MCOR42bKzC2M>l?1%x2Iv7amIfQ1B#wwfD`z|m z+E?G+o(tde*Ws?;Wo4p#Yy>Nnf|*b<nj@-s(rZ)-U@ z(Xe(qZ1(_dH|J3yWu|bAPINK}DwF(kZ>FKx(?ZmU^KFC6*bh$;FKGh~pH1 zozA+kgcIk9@2aAwEJ=VYizT!sxDXX$N?XDiGKaaT-OU@Ib=~4DmgEk&{2D@IvyjF* zuF@sDcuuqx_FAgx;B@@8gqjMh!kQeEKA*y4+q+^4&uc0|>M;$Xb+ z@X%eUx1m%$WSP}Qchx68NQ?dO!h`6;Quq+A1(RORsQ-;6bZ90vj#^0(7>cLR+-_;9 zCd@b~B5V>$tpjkQU#BD%9^zu7-l>U8nzt+XuX5cYDCHYaX5t~~3?lpa;)Mr>q;5XW zu(Th;fr}-GkP`K)u97(#UB|L3f;H7Cd#Pox+auV`=m?a=mSv1v)(V!E=$%gkIJZ;` zZj{Lb@bhs%bRa znZw9cD$cDFVHPtpXwY1K)wys@LS~;!qdqkR>@&RtP>?M^>xe{4N#EtZy4zZ5Ar$ZF zV=X=(!xin-58MC<+b~;jk8Q|3B3THGIA$cM8Bg)Yd6ygP#i?4VrX3OvP_k5i{Cppw z-{$XwrJ-+X$ccJ(Q{|?T@U9=-?qlsfA43%8t247KZn?`+C4e`b-e^(df*iW66=Oc2 z3w9UhohfdY@pH1MZ}vc<1osV(2CGG)Ree$E-T;8>$zw*>x-505b&4(shMGIjbAfLS zEZ3ys(`SmCWc(75)^=aKer}>67qj^nGKtCK{35I|tA}wQa!uM!suX%Gb~ylORGGc( ze^|m|N!}G0#Ph|;wSXz`SByQM>lPM#8>mdSQs`7RxkXaSAADYA24u6xWqkIXY?o%z z%TEFL+wNW^&nrvaA1_#P%&Hbzrjl!*hIft>F0@g0IVydUU4MJgS3_3Js8{*>|G2jC z4%n#cOy9b2Xf&Pw=14;0Dtf00C^Z$I-v05OqtvN9>sAC&oV1Tk;;ku7VR`sQK4oFq zQ8)yoZNuTwV$t13|GCUIC{ID_r7M5&R*zhsxbrkg;EgMtL|9ne=^}BM!dxV!KDeXkWA^MfQTkQEt8~t>JznNh%ULvn@dbQ2cyf} z|C%ns#NJU}SHU(7Pg$<&8uDK>d5GZJ&`;CcfGP(~b-#UusXevc^q!km1X6_wVMqGk z^m&ZS6#42?p4c_t1TA$_+}h1L2c<<=$k%;v+D!<@j5hs|{>d18>~~v#oq4yGyS@QP zgTX2oJbEy@eJbo-f{ZQ>-nmB-#AqWcHbMQXFi*T)0n!(HIexz=pp<(O*DMh7CMupX z)ei1ZYuIW~E={-ND*nD;okiZdm!?^|LjLZhs*FHZvWld5TDj zcvWB)`-1Me9bu`*4M=CO6ye=pMgxlgYvsh2rV#5Z$hFKw0GX30%oufb=hJ0BFIJH` z+Fii4gQ+7!)8K^yc*PVEW^#f!|BW0Q5*`IewQ5YDFh?{x1L7tlaUAX@3Y+D>6FPVf zJzOGex~H34`8eq+TL$FsHm+27RS>3$CG;>0Jj4*1ukX$za})*b^S5p}I2jbFCHLsA zzYwAyftMz`uo2c8ieQcy-p&9iP3fMk(uRw+OlBPm`KCLei6g!|Vnk*-kjs>A25MTE z5GLDMV$70AC0j-tx*0sCruvKh{fSM)3X}13U>m|KeaOb`9^}v^44!$`06-JHf@L4EKyxV)M!8cL zi5p9kF97RiAT92!e?%9CP=qX3wyv^A8q!w%07d(9f-U))uDgsr4FDVL;|%r)fw}-@ zlB$F79X^EKYF%8J7mU?3VzJoYQ0<;NczW1jH4=4kEh_)q|^9wj zIsn-SsmRx0_EJ7(6WypwptIwZ)-T<__UgUu?BXt zoIf|a!5`?&JEb$w2PZSqhA>J;GIA^rJ-Cpz8MKX~bcqZNOUzPtu|NMvEP>+cO;V*W zNQ8YPENkr!)lN+tlxB79RUD20$)+_P6Jc`+4q@%Kno{F+#1qR*zrj%T>nTSceO?a5 zyqGDa59#G6k*RXu6+#=e=e!~i1Y&15!cHmE6sLh_K%Ppv$tFE-Le3RQs-nx5LB>gy z5A))kwkxWSy73{@I{%{DY8X+2o{CLJb~R$3r=oT^P~Xo$2lKz8?Z!3QLn$5l#L2k2 zb1=?UT&c<8!&9gW1M&jI!5%dhJbD3nQXpaeNJ>=zR+EL!4iY(nMBQI+|2J+Hw-WMr z08Mt9h8(PGbY?zKtk=cqw(yW}1A#htn* z8&}5Y>$uc>Lv!bSuWQ5UB&ct7*jiZAFpxz|%xO&5kg zzlf?6xy7H3G^*wvP5scW*Wf(<&eP!YIUf%&HT?K)RWmKg$G^=mSoi~;&9dU%{o}WV z#BX;9+q)fpVU`>Vdo~AtYK)`7z*H;dc-e|q6Qt;3J0APUL!~g&Q literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4cc16421680a50164ba74381b4b35ceaa0ccfc GIT binary patch literal 3276 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 N;OXk;vd$@?2>?>Ex^Vyi literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbf36df2f2aaaa0a63c7dabc94e600184229d0d GIT binary patch literal 5933 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 f$KZHO*s&vt|9^w-6P?|#0pRK8NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zS>O>_%)r1c48n{Iv*t(u1=&kHeO=ifbFy+6aSK)V_AxLppYn8Z42d|rc6w}vOsL55 z`t&mC&y2@JTEyg!eDiFX^k#CC!jq%>erB=yHqUP0XcDOTw6ko}L zX;EmMrq(fKk*eygEuA616;0)>@A{TK|55PV@70 z$OfzS*(VJxQev3J?yY?O=ul(v`fp}?u9z`JK3ugibK>)DyCwImZOF4d{xK%%Ks1*} zv$oa)9anR%lXIBUqYnhLmT>VOzHfNP?ZwJNZ!5$s9M08RynIvaXw>@G^T9@r9^KH1 zVy??F&uuk)bH9Y4pQY!hP58i_H6 znl-NcuCpLV6ZWU;4C zu@9exF&OZi`Bovq_m%T+WhU2kvkz@^_LpycBvqm3bMpLw8X-Or5sL>0AKE1$(k_L=_Zc=CUq#=x1-QZf)G7nHu@fmsQ1eN_N3+nTEz`4HI4Z6uVlE zJH+X&det8JU?tO?upcM4Z=cV!JV;yF>FfL5Q$M|W_2Z!P`S=}Wzp|_1^#d%e?_H`> zV@%vA$+bFVqhw9`U;TfP|5|PD{||OiYdor8P*i??|NJcb%kzT_73*7WE?Ua5hAnR2 z=7WE=PhTlJ#ZeRznjTUb;`E(wkMZrj4e|Hilz-mK>9cZHQY**5TUPw~u}k;u73KI}xAx!0m-)GVia|x^d3p~s_9gh83jA&Ra<8rM%`>U3x69t&NzbwWY}7Ar?)FK#IZ0z|d0H0EkRO w3{9;}4Xg|ebq&m|3=9_N6z8I7$jwj5OsmAL;bP(Gi$Dzwp00i_>zopr02+f8CIA2c literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000000000000000000000000000000000000..e71a726136a47ed24125c7efc79d68a4a01961b4 GIT binary patch literal 14800 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..b034e12 --- /dev/null +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = pet_activity_tracker + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.crazykoder.petActivityTracker + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..2722837 --- /dev/null +++ b/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/ml-data/rest.csv b/ml-data/rest.csv new file mode 100644 index 0000000..21a0024 --- /dev/null +++ b/ml-data/rest.csv @@ -0,0 +1,7 @@ +timestamp,accX,accY,accZ +0,4.220828473773600,1.8800472920291100,-16.89228981323240 +16,4.471770735278730,2.0017025177553300,-17.887080018505500 +32,4.31928972478658,2.4953566802978500,-18.926163539013300 +48,4.648792312787470,2.958335718591510,-18.5336641043514 +64,4.773739711926880,2.719663740594690,-18.800019623565700 +80,4.653879991315310,2.6865938301637800,-19.98305510341230 \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..ad92c24 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,594 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" + args: + dependency: transitive + description: + name: args + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + community_charts_common: + dependency: transitive + description: + name: community_charts_common + sha256: d997ade57f15490346de46efbe23805d378a672aafbf5e47e19517964b671009 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + community_charts_flutter: + dependency: "direct main" + description: + name: community_charts_flutter + sha256: "4614846b99782ab79b613687704865e5468ecada3f0ad1afe1cdc3ff5b727f72" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + crypto: + dependency: "direct main" + description: + name: crypto + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + url: "https://pub.dev" + source: hosted + version: "3.0.5" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dbus: + dependency: transitive + description: + name: dbus + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + url: "https://pub.dev" + source: hosted + version: "0.7.10" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" + source: hosted + version: "2.1.3" + file: + dependency: transitive + description: + name: file + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" + source: hosted + version: "6.1.4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_blue: + dependency: "direct main" + description: + name: flutter_blue + sha256: f7f76b9b80455b0375693ec96c276fadb01e94d8441fa1740a64980cd1aeda5c + url: "https://pub.dev" + source: hosted + version: "0.8.0" + flutter_launcher_icons: + dependency: "direct main" + description: + name: flutter_launcher_icons + sha256: "559c600f056e7c704bd843723c21e01b5fba47e8824bd02422165bcc02a5de1d" + url: "https://pub.dev" + source: hosted + version: "0.9.3" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + sha256: "57d0012730780fe137260dd180e072c18a73fbeeb924cdc029c18aaa0f338d64" + url: "https://pub.dev" + source: hosted + version: "9.9.1" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: b472bfc173791b59ede323661eae20f7fff0b6908fea33dd720a6ef5d576bae8 + url: "https://pub.dev" + source: hosted + version: "0.5.1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "21bceee103a66a53b30ea9daf677f990e5b9e89b62f222e60dd241cd08d63d3a" + url: "https://pub.dev" + source: hosted + version: "5.0.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" + http: + dependency: "direct main" + description: + name: http + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + url: "https://pub.dev" + source: hosted + version: "0.13.6" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + image: + dependency: transitive + description: + name: image + sha256: "8e9d133755c3e84c73288363e6343157c383a0c6c56fc51afcc5d4d7180306d6" + url: "https://pub.dev" + source: hosted + version: "3.3.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" + source: hosted + version: "0.17.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c + url: "https://pub.dev" + source: hosted + version: "1.0.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" + source: hosted + version: "1.15.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + process: + dependency: transitive + description: + name: process + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" + source: hosted + version: "4.2.4" + protobuf: + dependency: transitive + description: + name: protobuf + sha256: "01dd9bd0fa02548bf2ceee13545d4a0ec6046459d847b6b061d8a27237108a08" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "2ef8b4e91cb3b55d155e0e34eeae0ac7107974e451495c955ac04ddee8cc21fd" + url: "https://pub.dev" + source: hosted + version: "0.26.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d" + url: "https://pub.dev" + source: hosted + version: "2.5.3" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e + url: "https://pub.dev" + source: hosted + version: "2.4.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sqflite: + dependency: "direct main" + description: + name: sqflite + sha256: "79a297dc3cc137e758c6a4baf83342b039e5a6d2436fcdf3f96a00adaaf2ad62" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "4468b24876d673418a7b7147e5a08a715b4998a7ae69227acafaab762e0e5490" + url: "https://pub.dev" + source: hosted + version: "2.5.4+5" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "769733dddf94622d5541c73e4ddc6aa7b252d865285914b6fcd54a63c4b4f027" + url: "https://pub.dev" + source: hosted + version: "2.4.1-1" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" + url: "https://pub.dev" + source: hosted + version: "3.3.0+3" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + timezone: + dependency: transitive + description: + name: timezone + sha256: "57b35f6e8ef731f18529695bffc62f92c6189fac2e52c12d478dec1931afb66e" + url: "https://pub.dev" + source: hosted + version: "0.8.0" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + url: "https://pub.dev" + source: hosted + version: "14.2.5" + web: + dependency: transitive + description: + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + url: "https://pub.dev" + source: hosted + version: "0.2.0+3" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.5.0 <4.0.0" + flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..8317210 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,101 @@ +name: pet_activity_tracker +description: A new Flutter project. + +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +# 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. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.16.1 <3.0.0" + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +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: ^1.0.2 + flutter_blue: ^0.8.0 + flutter_launcher_icons: ^0.9.2 + crypto: ^3.0.1 + http: ^0.13.4 + shared_preferences: ^2.0.13 + # charts_flutter: ^0.12.0 + sqflite: ^2.0.2 + intl: ^0.17.0 + flutter_local_notifications: ^9.4.0 + community_charts_flutter: ^1.0.4 + +flutter_icons: + android: false + ios: true + image_path: "assets/icon/icon.png" + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^1.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/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: + - assets/data/rest.json + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/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.dev/custom-fonts/#from-packages diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..d129db6 --- /dev/null +++ b/web/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + pet_activity_tracker + + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 0000000..8caf44b --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "pet_activity_tracker", + "short_name": "pet_activity_tracker", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/windows/.gitignore b/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt new file mode 100644 index 0000000..8e1a79e --- /dev/null +++ b/windows/CMakeLists.txt @@ -0,0 +1,95 @@ +cmake_minimum_required(VERSION 3.14) +project(pet_activity_tracker LANGUAGES CXX) + +set(BINARY_NAME "pet_activity_tracker") + +cmake_policy(SET CMP0063 NEW) + +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Configure build options. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() + +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") + +# Flutter library and tool build rules. +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build +add_subdirectory("runner") + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..b2e4bd8 --- /dev/null +++ b/windows/flutter/CMakeLists.txt @@ -0,0 +1,103 @@ +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + windows-x64 $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..8b6d468 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/windows/flutter/generated_plugin_registrant.h b/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..4d10c25 --- /dev/null +++ b/windows/flutter/generated_plugins.cmake @@ -0,0 +1,15 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..de2d891 --- /dev/null +++ b/windows/runner/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) +apply_standard_settings(${BINARY_NAME}) +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc new file mode 100644 index 0000000..c0aa0b1 --- /dev/null +++ b/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#ifdef FLUTTER_BUILD_NUMBER +#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER +#else +#define VERSION_AS_NUMBER 1,0,0 +#endif + +#ifdef FLUTTER_BUILD_NAME +#define VERSION_AS_STRING #FLUTTER_BUILD_NAME +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "pet_activity_tracker" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "pet_activity_tracker" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "pet_activity_tracker.exe" "\0" + VALUE "ProductName", "pet_activity_tracker" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..b43b909 --- /dev/null +++ b/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp new file mode 100644 index 0000000..6b2d707 --- /dev/null +++ b/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.CreateAndShow(L"pet_activity_tracker", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/windows/runner/resource.h b/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..c977c4a --- /dev/null +++ b/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp new file mode 100644 index 0000000..d19bdbb --- /dev/null +++ b/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + if (target_length == 0) { + return std::string(); + } + std::string utf8_string; + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp new file mode 100644 index 0000000..c10f08d --- /dev/null +++ b/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + FreeLibrary(user32_module); + } +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + return OnCreate(); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h new file mode 100644 index 0000000..17ba431 --- /dev/null +++ b/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates and shows a win32 window with |title| and position and size using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responsponds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_