From 794c5e47654a05ea17a2213f2d90adddfdeade97 Mon Sep 17 00:00:00 2001 From: Bruno Bernardino Date: Fri, 19 Sep 2025 09:00:49 +0100 Subject: [PATCH] Remove all code, update documentation See #8 on why this decision was made. --- .env.sample | 1 - .github/FUNDING.yml | 1 + .github/workflows/build.yml | 59 -- .github/workflows/test.yml | 22 - .gitignore | 46 - .metadata | 45 - LICENSE | 661 --------------- Makefile | 23 - README.md | 57 +- analysis_options.yaml | 11 - android/.gitignore | 13 - android/app/build.gradle | 66 -- android/app/src/debug/AndroidManifest.xml | 7 - android/app/src/main/AndroidManifest.xml | 41 - .../com/bewcloud/mobile/MainActivity.kt | 5 - .../res/drawable-v21/launch_background.xml | 12 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../main/res/mipmap-hdpi/launcher_icon.png | Bin 1983 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../main/res/mipmap-mdpi/launcher_icon.png | Bin 1302 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xhdpi/launcher_icon.png | Bin 2628 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxhdpi/launcher_icon.png | Bin 3969 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../main/res/mipmap-xxxhdpi/launcher_icon.png | Bin 5271 -> 0 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 | 18 - android/gradle.properties | 3 - .../gradle/wrapper/gradle-wrapper.properties | 5 - android/settings.gradle | 26 - assets/images/app-icon.png | Bin 26845 -> 0 bytes assets/images/favicon.svg | 121 --- assets/images/logo-white.svg | 121 --- assets/images/logo.svg | 120 --- assets/images/logomark.svg | 111 --- devtools_options.yaml | 1 - ios/.gitignore | 34 - ios/Flutter/AppFrameworkInfo.plist | 26 - ios/Flutter/Debug.xcconfig | 2 - ios/Flutter/Release.xcconfig | 2 - ios/Podfile | 44 - ios/Podfile.lock | 102 --- ios/Runner.xcodeproj/project.pbxproj | 745 ----------------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../xcshareddata/xcschemes/Runner.xcscheme | 98 --- .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - ios/Runner/AppDelegate.swift | 33 - .../AppIcon.appiconset/Contents.json | 122 --- .../Icon-App-1024x1024@1x.png | Bin 29956 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 528 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1091 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1605 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 761 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1564 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 2410 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1091 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 2247 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 3261 -> 0 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 1345 -> 0 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 2714 -> 0 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 1532 -> 0 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 3103 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 3261 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 4951 -> 0 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 1983 -> 0 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 3969 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 2096 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 4200 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 4612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 - ios/Runner/Base.lproj/Main.storyboard | 26 - ios/Runner/Info.plist | 61 -- ios/Runner/Runner-Bridging-Header.h | 1 - ios/RunnerTests/RunnerTests.swift | 12 - lib/add_account_page.dart | 279 ------- lib/api.dart | 240 ------ lib/config.dart | 106 --- lib/encryption.dart | 28 - lib/files_page.dart | 790 ------------------ lib/main.dart | 232 ----- lib/notifications.dart | 122 --- lib/photo_sync_page.dart | 265 ------ lib/photos.dart | 110 --- lib/settings_page.dart | 231 ----- linux/.gitignore | 1 - linux/CMakeLists.txt | 145 ---- linux/flutter/CMakeLists.txt | 88 -- linux/flutter/generated_plugin_registrant.cc | 11 - linux/flutter/generated_plugin_registrant.h | 15 - linux/flutter/generated_plugins.cmake | 23 - linux/main.cc | 6 - linux/my_application.cc | 124 --- linux/my_application.h | 18 - macos/.gitignore | 7 - macos/Flutter/Flutter-Debug.xcconfig | 2 - macos/Flutter/Flutter-Release.xcconfig | 2 - macos/Flutter/GeneratedPluginRegistrant.swift | 18 - macos/Podfile | 43 - macos/Runner.xcodeproj/project.pbxproj | 705 ---------------- .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/xcschemes/Runner.xcscheme | 98 --- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - macos/Runner/AppDelegate.swift | 9 - .../AppIcon.appiconset/Contents.json | 68 -- .../AppIcon.appiconset/app_icon_1024.png | Bin 29956 -> 0 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 3489 -> 0 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 415 -> 0 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 7124 -> 0 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 835 -> 0 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 14464 -> 0 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 1786 -> 0 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 | 15 - macos/Runner/Info.plist | 32 - macos/Runner/MainFlutterWindow.swift | 15 - macos/Runner/Release.entitlements | 11 - macos/RunnerTests/RunnerTests.swift | 12 - pubspec.lock | 650 -------------- pubspec.yaml | 57 -- test/widget_test.dart | 25 - web/favicon.png | Bin 415 -> 0 bytes web/icons/Icon-192.png | Bin 5271 -> 0 bytes web/icons/Icon-512.png | Bin 14464 -> 0 bytes web/icons/Icon-maskable-192.png | Bin 5271 -> 0 bytes web/icons/Icon-maskable-512.png | Bin 14464 -> 0 bytes web/index.html | 59 -- web/manifest.json | 35 - windows/.gitignore | 17 - windows/CMakeLists.txt | 108 --- windows/flutter/CMakeLists.txt | 109 --- .../flutter/generated_plugin_registrant.cc | 11 - windows/flutter/generated_plugin_registrant.h | 15 - windows/flutter/generated_plugins.cmake | 23 - windows/runner/CMakeLists.txt | 40 - windows/runner/Runner.rc | 121 --- windows/runner/flutter_window.cpp | 71 -- windows/runner/flutter_window.h | 33 - windows/runner/main.cpp | 43 - windows/runner/resource.h | 16 - windows/runner/resources/app_icon.ico | Bin 7146 -> 0 bytes windows/runner/runner.exe.manifest | 20 - windows/runner/utils.cpp | 65 -- windows/runner/utils.h | 19 - windows/runner/win32_window.cpp | 288 ------- windows/runner/win32_window.h | 102 --- 163 files changed, 10 insertions(+), 9258 deletions(-) delete mode 100644 .env.sample delete mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .gitignore delete mode 100644 .metadata delete mode 100644 LICENSE delete mode 100644 Makefile delete mode 100644 analysis_options.yaml delete mode 100644 android/.gitignore delete mode 100644 android/app/build.gradle delete mode 100644 android/app/src/debug/AndroidManifest.xml delete mode 100644 android/app/src/main/AndroidManifest.xml delete mode 100644 android/app/src/main/kotlin/com/bewcloud/mobile/MainActivity.kt delete mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml delete mode 100644 android/app/src/main/res/drawable/launch_background.xml delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/launcher_icon.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/launcher_icon.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/launcher_icon.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png delete mode 100644 android/app/src/main/res/values-night/styles.xml delete mode 100644 android/app/src/main/res/values/styles.xml delete mode 100644 android/app/src/profile/AndroidManifest.xml delete mode 100644 android/build.gradle delete mode 100644 android/gradle.properties delete mode 100644 android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 android/settings.gradle delete mode 100644 assets/images/app-icon.png delete mode 100644 assets/images/favicon.svg delete mode 100644 assets/images/logo-white.svg delete mode 100644 assets/images/logo.svg delete mode 100644 assets/images/logomark.svg delete mode 100644 devtools_options.yaml delete mode 100644 ios/.gitignore delete mode 100644 ios/Flutter/AppFrameworkInfo.plist delete mode 100644 ios/Flutter/Debug.xcconfig delete mode 100644 ios/Flutter/Release.xcconfig delete mode 100644 ios/Podfile delete mode 100644 ios/Podfile.lock delete mode 100644 ios/Runner.xcodeproj/project.pbxproj delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 ios/Runner/AppDelegate.swift delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 ios/Runner/Base.lproj/Main.storyboard delete mode 100644 ios/Runner/Info.plist delete mode 100644 ios/Runner/Runner-Bridging-Header.h delete mode 100644 ios/RunnerTests/RunnerTests.swift delete mode 100644 lib/add_account_page.dart delete mode 100644 lib/api.dart delete mode 100644 lib/config.dart delete mode 100644 lib/encryption.dart delete mode 100644 lib/files_page.dart delete mode 100644 lib/main.dart delete mode 100644 lib/notifications.dart delete mode 100644 lib/photo_sync_page.dart delete mode 100644 lib/photos.dart delete mode 100644 lib/settings_page.dart delete mode 100644 linux/.gitignore delete mode 100644 linux/CMakeLists.txt delete mode 100644 linux/flutter/CMakeLists.txt delete mode 100644 linux/flutter/generated_plugin_registrant.cc delete mode 100644 linux/flutter/generated_plugin_registrant.h delete mode 100644 linux/flutter/generated_plugins.cmake delete mode 100644 linux/main.cc delete mode 100644 linux/my_application.cc delete mode 100644 linux/my_application.h delete mode 100644 macos/.gitignore delete mode 100644 macos/Flutter/Flutter-Debug.xcconfig delete mode 100644 macos/Flutter/Flutter-Release.xcconfig delete mode 100644 macos/Flutter/GeneratedPluginRegistrant.swift delete mode 100644 macos/Podfile delete mode 100644 macos/Runner.xcodeproj/project.pbxproj delete mode 100644 macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 macos/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 macos/Runner/AppDelegate.swift delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png delete mode 100644 macos/Runner/Base.lproj/MainMenu.xib delete mode 100644 macos/Runner/Configs/AppInfo.xcconfig delete mode 100644 macos/Runner/Configs/Debug.xcconfig delete mode 100644 macos/Runner/Configs/Release.xcconfig delete mode 100644 macos/Runner/Configs/Warnings.xcconfig delete mode 100644 macos/Runner/DebugProfile.entitlements delete mode 100644 macos/Runner/Info.plist delete mode 100644 macos/Runner/MainFlutterWindow.swift delete mode 100644 macos/Runner/Release.entitlements delete mode 100644 macos/RunnerTests/RunnerTests.swift delete mode 100644 pubspec.lock delete mode 100644 pubspec.yaml delete mode 100644 test/widget_test.dart delete mode 100644 web/favicon.png delete mode 100644 web/icons/Icon-192.png delete mode 100644 web/icons/Icon-512.png delete mode 100644 web/icons/Icon-maskable-192.png delete mode 100644 web/icons/Icon-maskable-512.png delete mode 100644 web/index.html delete mode 100644 web/manifest.json delete mode 100644 windows/.gitignore delete mode 100644 windows/CMakeLists.txt delete mode 100644 windows/flutter/CMakeLists.txt delete mode 100644 windows/flutter/generated_plugin_registrant.cc delete mode 100644 windows/flutter/generated_plugin_registrant.h delete mode 100644 windows/flutter/generated_plugins.cmake delete mode 100644 windows/runner/CMakeLists.txt delete mode 100644 windows/runner/Runner.rc delete mode 100644 windows/runner/flutter_window.cpp delete mode 100644 windows/runner/flutter_window.h delete mode 100644 windows/runner/main.cpp delete mode 100644 windows/runner/resource.h delete mode 100644 windows/runner/resources/app_icon.ico delete mode 100644 windows/runner/runner.exe.manifest delete mode 100644 windows/runner/utils.cpp delete mode 100644 windows/runner/utils.h delete mode 100644 windows/runner/win32_window.cpp delete mode 100644 windows/runner/win32_window.h diff --git a/.env.sample b/.env.sample deleted file mode 100644 index bed8deb..0000000 --- a/.env.sample +++ /dev/null @@ -1 +0,0 @@ -PASSWORD_SECRET_KEY="my 32 length key................"; diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 30b98b4..7b2bfef 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,7 @@ github: [BrunoBernardino] custom: [ + 'https://donate.stripe.com/bIYeWBbw00Ape5iaFi', 'https://paypal.me/brunobernardino', 'https://gist.github.com/BrunoBernardino/ff5b54c13dd96ac7f9fee6fbfd825b09', ] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 3775857..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Build - -on: - workflow_dispatch: - - push: - branches: - - "main" - - "feature/**" - - "fix/**" - -jobs: - build: - strategy: - fail-fast: false - matrix: - config: - # NOTE: This is only a matrix right now so it's easier when eventually setting up iOS - - os: ubuntu-latest - arch: x86_64 - - runs-on: ${{ matrix.config.os }} - steps: - - uses: actions/checkout@v4 - - uses: subosito/flutter-action@v2 - with: - channel: stable - flutter-version: 3.19.5 - cache: true - - - name: Setup .env - run: echo 'PASSWORD_SECRET_KEY="${{ secrets.PASSWORD_SECRET_KEY }}"' > .env - - - name: Build - run: make build/android - - - name: Archive x86 APK - uses: actions/upload-artifact@v4 - if: matrix.config.os == 'ubuntu-latest' - with: - name: bewcloud-x86-${{ github.sha }}-unsigned.apk - path: build/app/outputs/flutter-apk/app-x86_64-release.apk - if-no-files-found: error - - - name: Archive arm64 APK - uses: actions/upload-artifact@v4 - if: matrix.config.os == 'ubuntu-latest' - with: - name: bewcloud-arm64-${{ github.sha }}-unsigned.apk - path: build/app/outputs/flutter-apk/app-arm64-v8a-release.apk - if-no-files-found: error - - - name: Archive armeabi APK - uses: actions/upload-artifact@v4 - if: matrix.config.os == 'ubuntu-latest' - with: - name: bewcloud-armeabi-${{ github.sha }}-unsigned.apk - path: build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk - if-no-files-found: error diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 7b4caf7..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Run Tests - -on: - push: - pull_request: - -jobs: - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: subosito/flutter-action@v2 - with: - channel: stable - flutter-version: 3.19.5 - cache: true - - - name: Setup .env - run: cp .env.sample .env - - - name: Run tests - run: make test diff --git a/.gitignore b/.gitignore deleted file mode 100644 index dbb5eb3..0000000 --- a/.gitignore +++ /dev/null @@ -1,46 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ -migrate_working_dir/ - -# 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 -.pub-cache/ -.pub/ -/build/ - -# 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 - -# .env -.env diff --git a/.metadata b/.metadata deleted file mode 100644 index 32dc8a5..0000000 --- a/.metadata +++ /dev/null @@ -1,45 +0,0 @@ -# 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: "300451adae589accbece3490f4396f10bdf15e6e" - channel: "stable" - -project_type: app - -# Tracks metadata for the flutter migrate command -migration: - platforms: - - platform: root - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e - - platform: android - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e - - platform: ios - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e - - platform: linux - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e - - platform: macos - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e - - platform: web - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e - - platform: windows - create_revision: 300451adae589accbece3490f4396f10bdf15e6e - base_revision: 300451adae589accbece3490f4396f10bdf15e6e - - # User provided section - - # List of Local paths (relative to this file) that should be - # ignored by the migrate tool. - # - # Files that are not part of the templates will be ignored by default. - unmanaged_files: - - 'lib/main.dart' - - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/LICENSE b/LICENSE deleted file mode 100644 index be3f7b2..0000000 --- a/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/Makefile b/Makefile deleted file mode 100644 index 8b748e8..0000000 --- a/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -.PHONY: start -start: - flutter run - -.PHONY: format -format: - dart format lib - -.PHONY: test -test: - flutter test - -.PHONY: build/android -build/android: - flutter build apk --split-per-abi --release - -.PHONY: build/ios -build/ios: - flutter build ios --release && flutter build ipa --export-method development - -.PHONY: install -install: - flutter install diff --git a/README.md b/README.md index fde9080..724d34c 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,13 @@ # bewCloud Mobile -[![](https://github.com/bewcloud/bewcloud-mobile/workflows/Run%20Tests/badge.svg)](https://github.com/bewcloud/bewcloud-mobile/actions?workflow=Run+Tests) +> [!IMPORTANT] +> +> The native mobile app is no longer built/maintained, and instead now I only provide a link to an alternative here, which uses `WebDav` to sync the files/directories (the app already used that). This is simpler and probably safer, to be honest. +> +> If you're looking for the last working version of the mobile app, it's at the [v0.1.1 release](https://github.com/bewcloud/bewcloud-mobile/releases/tag/v0.1.1) or [this commit](https://github.com/bewcloud/bewcloud-mobile/tree/d761d03d0e0bd5fe6f25492a7b0b8df9770f36bc). +> + > If you're looking for the last failed attempt to upgrade it, check [this PR](https://github.com/bewcloud/bewcloud-mobile/pull/8). -This is the Mobile client for [bewCloud](https://github.com/bewcloud/bewcloud). It is built with [`Flutter`](https://flutter.dev) and relies on the [WebDav](https://github.com/bewcloud/bewcloud/blob/main/routes/dav.tsx) and [REST](https://github.com/bewcloud/bewcloud/tree/main/routes/api/files) APIs. + ## I _really_ want a mobile app, though -Usernames, passwords, and URLs are stored on the device, with passwords [being encrypted](/lib/encryption.dart). - -If you're looking for the desktop sync app, it's at [`bewcloud-desktop`](https://github.com/bewcloud/bewcloud-desktop). - -## Install - -Download the appropriate binary [from the releases page](https://github.com/bewcloud/bewcloud-mobile/releases) for your mobile device and run it. - -Alternatively, you can [build from source](#build-from-source)! - -> [!CAUTION] -> I _know_ the key used to encrypt the config passwords in the automatic release builds, and anyone who cares to reverse-engineer the app binaries can too, so you should [build your own client](#build-from-source) instead, with your own key. - -## Development - -You need to have [Flutter](https://docs.flutter.dev/get-started/install) installed and setup, with `flutter doctor` passing. - -Don't forget to set up your `.env` file based on `.env.sample`. - -```sh -make start # runs the app -make format # formats the code -make test # runs tests -``` - -## Build from source - -Don't forget to check the [development](#development) section above first! - -> [!NOTE] -> If you're releasing a new version, update it in `pubspec.yaml` first. - -```sh -make build/android # builds the APK for Android -make build/ios # builds the IPA for iOS -make install # installs the app directly on a connected device -``` - -### Generate icons - -If the icons change, just run the following to re-generate them: - -```sh -dart pub get -dart run flutter_launcher_icons -``` +I'm sorry, but there's not enough incentive for me to keep maintaining a native mobile app. I've heard great things about [PhotoSync](https://www.photosync-app.com/home), though I haven't used it myself. Any WebDav client should work, and if it doesn't, feel free to open an issue at [`bewcloud/bewcloud`](https://github.com/bewcloud/bewcloud). diff --git a/analysis_options.yaml b/analysis_options.yaml deleted file mode 100644 index 8db89e1..0000000 --- a/analysis_options.yaml +++ /dev/null @@ -1,11 +0,0 @@ -include: package:flutter_lints/flutter.yaml - -linter: - rules: - # avoid_print: false - # prefer_const_constructors_in_immutables: false - # prefer_const_constructors: false - # prefer_const_literals_to_create_immutables: false - # prefer_final_fields: false - # unnecessary_breaks: true - # use_key_in_widget_constructors: false diff --git a/android/.gitignore b/android/.gitignore deleted file mode 100644 index 6f56801..0000000 --- a/android/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index ca39fa7..0000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,66 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - id "dev.flutter.flutter-gradle-plugin" -} - -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -android { - namespace "com.bewcloud.mobile" - compileSdk flutter.compileSdkVersion - ndkVersion flutter.ndkVersion - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - defaultConfig { - applicationId "com.bewcloud.mobile" - // You can update the following values to match your application needs. - // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - 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 {} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 4d816b1..0000000 --- a/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/app/src/main/kotlin/com/bewcloud/mobile/MainActivity.kt b/android/app/src/main/kotlin/com/bewcloud/mobile/MainActivity.kt deleted file mode 100644 index f2c3125..0000000 --- a/android/app/src/main/kotlin/com/bewcloud/mobile/MainActivity.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.bewcloud.mobile - -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 deleted file mode 100644 index f74085f..0000000 --- a/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f..0000000 --- a/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png deleted file mode 100644 index 60a3c13435869c1f1ffc22adf8556be08d79fda9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1983 zcmb7_`#Tc~1IOpI8GD#Taw(BULntb9KPz5$IlPmc+>J`YtQiT7l(0r}XHu>cwz=i9 zS%h5YpZACF_wziTf8dki;%p-gQHB5j0BJj0E7xDN{m&%C ze?9su!{!&1aMm6;x3C~wlphuYh>D8RyM8MqGQck!qZft^E?6^D1^~c*c2=l=6U4q2 zM28ak`8zZhIPu!i=+5d;OmuA>Vh>d)~|@xdmZDa z`MEw(tgVjXH0gt=QKP1NYn^2zSvX2Evjk}8LWCnwvRP`9_GF-jE%AS7MHuQ_Fb5qY z8@A7stT@-;*Q&r4lQ0*IhOev>+|O9tmv?f+Xk?sUQhB(a_v#uEsJ>du-r-W;e6&2* zCFQ%hY;)H%5KZa%@VaZ;$`Lp=OCI+2%6&W0YfWP)P$~OY521oT#5-Q*P4|BsTm`yW6gU5DWrsV4s=3XZEA;c-*D@Xfl-&n zYWlH?&?*jPho%&?vyj$PqbtAgrh!nIzqsg=Or70Na^ir&Z)TmFUI#`F@)AVU$cAVw zT1{;o7XBOEZE7Y$>-}o;K=;aHnR&~(oIeJH{YL)pl6OuGP%m~D2M{8yRhGsZ=DHbP zWcxkiqJ*V+sJoM)pP(V*CYR$e4(nf*NG)l)l_uJRSp<01ytqRldo6#zIGgqNsDoDORnIXT8 zINYw6W5;IKOK4jVqi|oyzL0s5+ct!X9sFRFXNkU2F*`Xamd8|_CN_I$r2>QBZAfgw~;xuCAPEoaJ}n8^1I?~((iBe&+$D%+h#$doo2~FrHIH=sp5k! zD-9uzEUX0APOH<^=alhbs0H%=ETyP_Yg?5C^c7XP9~H(_d0a}|e#t~SCH)u@Eu5 zZTrzU?h-bmxuZ2obJbeSibeCO(aC*29auI^21Vn>n$YtnOsn5$=cALi`OAQq%234? z*^)7Wic!{G`brEFsY(3a*MGXTZY}?Xh{5zy{XP`YKB4fl_Tch9Cn*o!Vef8ZOGLPp zV-lE+O`!6v+fq{zgnTkT1OO z*Uzq1sweHHV`lbA9n}W40I}9qTm9>6Njh;~kp160?jCv3YkdJzAF9N8#MBMbWKH)y zCL*{d0f+89Sg*2)rS*#s(p=A9Lmd%5OjjT$4zpb>w2M_r81i>&K#Y8oPV_`FPs#2S z93{@~6QG)xoEd8QjMbVpeb2j; z8E_>%n)~to_VBSW|J7Ba-o6B&QUG)a62deeH7zJKEy6=zHl*d6uN&aUSW>#S)0+#> z7e(Q}2V@}iJ7Ww(wX#9z@l@VO+;KearvazvqqqW>aNIaYHeChT->$-bh9NJmoT-OD zJRJWvB+AQ!#I`!QH|VMlhIz7v48mj{C-Q5u81T z$qm3zhl=Gar?+0iB?LEBi#+J@W!O{Bw_#ur8D0yF<&~P)!nfmvF21NH>{S zKh5}a9C|izG_>5Z==so{H3!jjmlOF2K>;i^g6^7Z!c3XP6Z4=*sswEzGB diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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@UUP)gX?c~>d(O^vc4>qHwQX)p`c0bL^Si&(`~BQ|&pE$y6^t=>l%$FM!-~8^EZA1y$c-ujzW(%Uwp6WDz0QUjfGGP}FBc z;`vpv_)~xnn%#9ho7@6W*-rD1>F8JEQxI++Hv%l|A7u%(-E6~2Jrr+QPTpM+L(1K8 zO`BW>II0srIoHIB5CCm4f?!tq!rd_os3-$JDP}Z7bV)TW+qe`8H>QyNu3pzBmjKQ* z&~0T+Y?sY>$^tCQO~ieP8ocHsplGo&AAKLoH^*T$2RuG@D3 zpvS}(pQxi>+-opk`DtXw`egDo+U58va4KUFRxXRe%40X_ryRD3hw-S6ezQ0f>#ujw zb$=LGPX8#x^Npdv!8(#7@V7Pbyp{`yxZILppzFf~hYw(}J^& zY^Rk%K=UB1K3GE!eY8s0i#R@>47m=Vjnk)5abNN zl5o6|7K!CA#*(v+a`-^LzF{fZdHhfMCGwZ=Vk_N}q!At-pmUhT@2(OrnXM4^;JN-0 z7B_$U058Sk_tJQnOF2(r=_x(zl_rY%ewO7ZZ%zQ|!&m7IdcbBr`Z2iqMmi~s<=R`625*B0Xi*$JC@PixG=l!g&V zkd9RW&^goHm*f!OcpcqiGanNQx~LFrNsq(|&)A)=i*0PPZK32d&}Bz?GXhxo`_?uD z&r8Q)0nkyBBRnhBHlDFMU5x`Q~{dfZXx|$Sp5`-0}j*tw$cw*PXGV_ M07*qoM6N<$f_nmU=>Px# diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 09d4391482be68e9e4a07fab769b5de337d16eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!iOI#yLg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+5i=O3-AeX1=1l$e`s#|#^}+&7(N@w0CIr{$Oe+Uk^K-ZP~83C zcc@hG6rikF&NPT(23>y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png deleted file mode 100644 index 8cdbd00377b8c1ac23a66b55f766a3428d408989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2628 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 LYob%D<@DFT01yM< diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png deleted file mode 100644 index 644d1703f3fcc3868fa1b736375915b20d062e45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3969 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 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png deleted file mode 100644 index 8dd28e2bc81713be09ea372c576f26486dde8e37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5271 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 EA2_!Wg8%>k diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml deleted file mode 100644 index 06952be..0000000 --- a/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml deleted file mode 100644 index cb1ef88..0000000 --- a/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index bc157bd..0000000 --- a/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/android/gradle.properties b/android/gradle.properties deleted file mode 100644 index 598d13f..0000000 --- a/android/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -org.gradle.jvmargs=-Xmx4G -android.useAndroidX=true -android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e1ca574..0000000 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index ba6291a..0000000 --- a/android/settings.gradle +++ /dev/null @@ -1,26 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - } - settings.ext.flutterSdkPath = flutterSdkPath() - - includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "7.3.0" apply false - id "org.jetbrains.kotlin.android" version "1.8.0" apply false -} - -include ":app" diff --git a/assets/images/app-icon.png b/assets/images/app-icon.png deleted file mode 100644 index 25a09cac96622c12566ef62af78285d430b98b26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26845 zcmeEu_gj-^`}d7luw~W9Dk4k2GD;CpkiE24XqXx*BgiVslz>2pVOuKH2SuB(rwkq{6PhJ+ai5JuQ}ulRi5_kVbg@5u69GSQ^6ClT=i889UBV!!aYyivke;;4Iq;V<;n$tR9fEzr z(O#i5mKy^Y#k4s~H^Xo5L|V13_mY*e_Rqdyu=t#N^)fy*kHV30uK0UMTYgPQ=hWbK<(L`jQVKE(i z9`dY{K!}20C@Eh^@Dtf8_%~$gDfoB1!bQQ)6{*vLpBJLyf}fAVf_+2tLc)Tdjrjk* z_Ft6g;lFVbDB-_B0Vv`Blc4aCC<(>;lkQrJC`NmxD5f~3 zs3(Nl*pjUmStCVqIoaM0i^X@1(Cl9`oml~zK>8?EEuDfX*y8h_kGUbwTL7A>oda8QhVp?&k zx^-SOC1uWx7;RAzB!3LD5d{@VQ|Mw~D345?zd8+zSv{K|Is{kDWkuoSK2w&zC!0}A z0~Rf<)fBT*xdRm`X4Qey+3JB`l0i9h9K5XK-`*$gOExLieAdnA8_vrQM2HGOV8t^oBNSdkw`UburBs<5 z$5xQcN>d81Al_4)FlZbJIs$!65rX2|XIabS_Tw%XA9#Kq>mA)xF2bV%FRgrcj2Hb+ zRQG3J-%sGXyYGOS&ygZJyV^x@Z7xLGQy6lXl7tVr6;PLUmDkyzH(P+{gsv!pts5xm z`z*F39Bbik5oR!234MKlC>U*f?Cvf1RLzE!(30F~!m�* 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 - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/logo-white.svg b/assets/images/logo-white.svg deleted file mode 100644 index 6d096f1..0000000 --- a/assets/images/logo-white.svg +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/logo.svg b/assets/images/logo.svg deleted file mode 100644 index 31a66ce..0000000 --- a/assets/images/logo.svg +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/logomark.svg b/assets/images/logomark.svg deleted file mode 100644 index 2764c14..0000000 --- a/assets/images/logomark.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/devtools_options.yaml b/devtools_options.yaml deleted file mode 100644 index 7e7e7f6..0000000 --- a/devtools_options.yaml +++ /dev/null @@ -1 +0,0 @@ -extensions: diff --git a/ios/.gitignore b/ios/.gitignore deleted file mode 100644 index 7a7f987..0000000 --- a/ios/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -**/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 deleted file mode 100644 index 7c56964..0000000 --- a/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - 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 deleted file mode 100644 index ec97fc6..0000000 --- a/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#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 deleted file mode 100644 index c4855bf..0000000 --- a/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile deleted file mode 100644 index d97f17e..0000000 --- a/ios/Podfile +++ /dev/null @@ -1,44 +0,0 @@ -# Uncomment this line to define a global platform for your project -# platform :ios, '12.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - end -end diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index f0ec9d0..0000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,102 +0,0 @@ -PODS: - - DKImagePickerController/Core (4.3.4): - - DKImagePickerController/ImageDataManager - - DKImagePickerController/Resource - - DKImagePickerController/ImageDataManager (4.3.4) - - DKImagePickerController/PhotoGallery (4.3.4): - - DKImagePickerController/Core - - DKPhotoGallery - - DKImagePickerController/Resource (4.3.4) - - DKPhotoGallery (0.0.17): - - DKPhotoGallery/Core (= 0.0.17) - - DKPhotoGallery/Model (= 0.0.17) - - DKPhotoGallery/Preview (= 0.0.17) - - DKPhotoGallery/Resource (= 0.0.17) - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Core (0.0.17): - - DKPhotoGallery/Model - - DKPhotoGallery/Preview - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Model (0.0.17): - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Preview (0.0.17): - - DKPhotoGallery/Model - - DKPhotoGallery/Resource - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Resource (0.0.17): - - SDWebImage - - SwiftyGif - - file_picker (0.0.1): - - DKImagePickerController/PhotoGallery - - Flutter - - Flutter (1.0.0) - - flutter_local_notifications (0.0.1): - - Flutter - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - photo_manager (2.0.0): - - Flutter - - FlutterMacOS - - SDWebImage (5.19.1): - - SDWebImage/Core (= 5.19.1) - - SDWebImage/Core (5.19.1) - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - - SwiftyGif (5.4.5) - - workmanager (0.0.1): - - Flutter - -DEPENDENCIES: - - file_picker (from `.symlinks/plugins/file_picker/ios`) - - Flutter (from `Flutter`) - - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - - photo_manager (from `.symlinks/plugins/photo_manager/ios`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - - workmanager (from `.symlinks/plugins/workmanager/ios`) - -SPEC REPOS: - trunk: - - DKImagePickerController - - DKPhotoGallery - - SDWebImage - - SwiftyGif - -EXTERNAL SOURCES: - file_picker: - :path: ".symlinks/plugins/file_picker/ios" - Flutter: - :path: Flutter - flutter_local_notifications: - :path: ".symlinks/plugins/flutter_local_notifications/ios" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/darwin" - photo_manager: - :path: ".symlinks/plugins/photo_manager/ios" - shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - workmanager: - :path: ".symlinks/plugins/workmanager/ios" - -SPEC CHECKSUMS: - DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac - DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 - file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655 - Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 - path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c - photo_manager: 4f6810b7dfc4feb03b461ac1a70dacf91fba7604 - SDWebImage: 40b0b4053e36c660a764958bff99eed16610acbb - shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 - SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 - workmanager: 0afdcf5628bbde6924c21af7836fed07b42e30e6 - -PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796 - -COCOAPODS: 1.15.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 4173fe1..0000000 --- a/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,745 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; - 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 */; }; - A886C8A99FA641D0F0C3CC66 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48CB4591D86C147658489A3D /* Pods_RunnerTests.framework */; }; - CC5A379998FED1114DA997D5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F6E1F149D57F2BD30F0A9B3 /* Pods_Runner.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 97C146E61CF9000F007C117D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 97C146ED1CF9000F007C117D; - remoteInfo = Runner; - }; -/* End PBXContainerItemProxy 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 = ""; }; - 1F6E1F149D57F2BD30F0A9B3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 3653816254EF4E616178CCE4 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 48CB4591D86C147658489A3D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5043F40F02DE47CE59DF1568 /* 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 = ""; }; - 59FD49AC0AE7909846401993 /* 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 = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 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 = ""; }; - D74C98EB9C7F467B017EB2A9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - DCA75C2ED5F69E3A535605E7 /* 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 = ""; }; - E4B3E2DE0C3B579DF0F14706 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - CC5A379998FED1114DA997D5 /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ECE905431EDB0C67DE98DA0E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A886C8A99FA641D0F0C3CC66 /* Pods_RunnerTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 17815B4A2894D92504AB213B /* Pods */ = { - isa = PBXGroup; - children = ( - DCA75C2ED5F69E3A535605E7 /* Pods-Runner.debug.xcconfig */, - 5043F40F02DE47CE59DF1568 /* Pods-Runner.release.xcconfig */, - 59FD49AC0AE7909846401993 /* Pods-Runner.profile.xcconfig */, - E4B3E2DE0C3B579DF0F14706 /* Pods-RunnerTests.debug.xcconfig */, - 3653816254EF4E616178CCE4 /* Pods-RunnerTests.release.xcconfig */, - D74C98EB9C7F467B017EB2A9 /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; - 331C8082294A63A400263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - 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 */, - 331C8082294A63A400263BE5 /* RunnerTests */, - 17815B4A2894D92504AB213B /* Pods */, - DCBB63043C1B976BC4B19937 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - 331C8081294A63A400263BE5 /* RunnerTests.xctest */, - ); - 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 = ""; - }; - DCBB63043C1B976BC4B19937 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 1F6E1F149D57F2BD30F0A9B3 /* Pods_Runner.framework */, - 48CB4591D86C147658489A3D /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C8080294A63A400263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - E1346EF1122407D3C35A83C5 /* [CP] Check Pods Manifest.lock */, - 331C807D294A63A400263BE5 /* Sources */, - 331C807F294A63A400263BE5 /* Resources */, - ECE905431EDB0C67DE98DA0E /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 331C8086294A63A400263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 05BDAA1CB5EC8E059D9FDAF5 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 8F3F2C6F4809BE64C1007EED /* [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 = { - BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C8080294A63A400263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 97C146ED1CF9000F007C117D; - }; - 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 */, - 331C8080294A63A400263BE5 /* RunnerTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C807F294A63A400263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 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 */ - 05BDAA1CB5EC8E059D9FDAF5 /* [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; - }; - 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"; - }; - 8F3F2C6F4809BE64C1007EED /* [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"; - }; - E1346EF1122407D3C35A83C5 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C807D294A63A400263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 97C146ED1CF9000F007C117D /* Runner */; - targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency 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; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - 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; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - 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 = BR4RWWLMM9; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = bewCloud; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 0.0.1; - PRODUCT_BUNDLE_IDENTIFIER = com.bewcloud.mobile; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 331C8088294A63A400263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E4B3E2DE0C3B579DF0F14706 /* Pods-RunnerTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.bewcloud.mobile.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Debug; - }; - 331C8089294A63A400263BE5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3653816254EF4E616178CCE4 /* Pods-RunnerTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.bewcloud.mobile.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Release; - }; - 331C808A294A63A400263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D74C98EB9C7F467B017EB2A9 /* Pods-RunnerTests.profile.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.bewcloud.mobile.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; - 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; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - 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; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; - 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; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - 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 = BR4RWWLMM9; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = bewCloud; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 0.0.1; - PRODUCT_BUNDLE_IDENTIFIER = com.bewcloud.mobile; - 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 = BR4RWWLMM9; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = bewCloud; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 0.0.1; - PRODUCT_BUNDLE_IDENTIFIER = com.bewcloud.mobile; - 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 */ - 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C8088294A63A400263BE5 /* Debug */, - 331C8089294A63A400263BE5 /* Release */, - 331C808A294A63A400263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 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 */ - }; - SystemCapabilities = { - com.apple.BackgroundModes = { - enabled = 1; - }; - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c..0000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 8e3ca5d..0000000 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc1..0000000 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c..0000000 --- a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift deleted file mode 100644 index 944e0cf..0000000 --- a/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,33 +0,0 @@ -import UIKit -import Flutter -import workmanager -import UserNotifications - -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - - if #available(iOS 10.0, *) { - UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate - UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in - if let error = error { - print("Notification permission error: \(error)") - } - } - } - - WorkmanagerPlugin.registerTask(withIdentifier: "auto-upload-photos") - WorkmanagerPlugin.registerTask(withIdentifier: "com.bewcloud.mobile.iOSBackgroundAppRefresh") - WorkmanagerPlugin.registerTask(withIdentifier: "workmanager.background.task") - - // WorkmanagerPlugin.registerBGProcessingTask(withIdentifier: "auto-upload-photos") - // Run background sync every 2 hours - // WorkmanagerPlugin.registerPeriodicTask(withIdentifier: "com.bewcloud.mobile.iOSBackgroundAppRefresh", frequency: NSNumber(value: 2 * 60 * 60)) - UIApplication.shared.setMinimumBackgroundFetchInterval(TimeInterval(2 * 60 * 60)) - 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 deleted file mode 100644 index d36b1fa..0000000 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "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 deleted file mode 100644 index a2eee2a7180d697f776fc3e3a25365ede2bd3da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29956 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 DVQ&ES diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 21a25b0a52145d9894daa5129e655ec77e8c3af1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 761 zcmV}vvQ5XmC?>n;>T-{Yu zST8AEHnTJ;lfXy`Tns4-HVlgDrB_KK3L~WuDg2}kB(|RupnU=Yb!xDw1r$9-yGF?Lpqa8G{NeqD z6d}o1gQH4)Z7{w|h{XFBpYh_i-IShR#Y>xqDA6fGpn%|v3&)2?HnZ$-1GX<3t^Ujp z$h)&jzQD;D@aM@4C3$MIGRma1`aasT+yD)$mSO3DomR>>VrlA^%x9B@EfxEU-FWxucX`8b_=lrL;hP- z;v^Kj;6=4P)1VTE2zoy)*j@EMl_*$DLD)FEwl#u1Hk;^1MH^+x)4na%h}CXUQ3mfe z@Eir)5{4z|8(99>1o>+O7`*aq9N*3k z>D2gb>gDhtRwslgt-P8?X4mJSb$yhgfby!mV_uCnr$Ns$Hc7sZTKF-6fm0c=TXa$a zjnevSVK7LCeVtZXzgSHE5y2iCt-064bNlTOZHd8i0X{hF7L5zTicmd#ESH}{d7G5E zSa5b2!sOm{c>dr<=_9bc~LL=PodudcbNlRf6cn^00000NkvXXu0mjff7oIa 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 deleted file mode 100644 index 85f2fd94ec5268ec57593bf828f52eeab8c775bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1564 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 Y8KSS=D`e>XQ=SCutzi(7m4D*D0WS)@`2YX_ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index d1d2fd63ca740025b47181dd60c82ff3430b594d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1091 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 H0+Rj%ds!D` diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png deleted file mode 100644 index 3688b47f401f23a43d3c9155902f7bb05c6cb7a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1345 zcmV-H1-|-;P)DX-lv zAeKiWa*=z@VFE|DVo1_srb$+jI9mMumvvUXbelPCzMH zK`c#H5KEI4#L{F1u{2phEKODrOOxUt;%T~fg821KVBnlUGg@_mdNm9xJ(jT) z1GzJYw%^~tgC(uPt3y*HU|u)+xRB~+Hqn#Oeo#mOlp6M~6ai`b4MR^>@&)~qBv>W{ zy2i*Or!NZyrEMhjjcr_#P6Pc)j4f%!AkBlgCH)eAafT<(l5dS2=?l_9rIS4w9iAdy z%|p1I^*f1uEkoq-vt}0) zJhA<43m#i2j#b93q7zf9y7;7oO_23M7|mc6GWl^~*&ublVl0ouL9~O{Lg|AZaM_&a zo(zDq=YA%~SS5Y#I+37GL)utX`}A$?bp{aebgX$y!I$}$kbxDY>>`T z443SOz2G}@pA+YPxF?j9-NaO}9p(we`!>_Je2u11*BJVLQ7>d%?ZxNBc3B6$;;$8| z;{xcXa_?O-2wSBhE_DbgHNBW1`Lt?sYbo#W*Fud5vO56YJMa)aI)7jBae=n9Xzuxs zYxyp=NE{V?3@m4dFBGY5VQNJnGi<{a-M)^=?p`5Df3`4W}nS zX1<8-eG&BShJHS#XPiXbo+Y}fTbLN*5BVzsdH+Wt?@BlBU8rwh5;vIp9#MfhQWvD> z>K2Q$p}@xn($gPS3!jMX#(vxx<4=|kaMPHmaueWk(QjDJ)G@G5(GGs%^ zjAXM_QZ`@Nj#(a6$1n0F?QG*RatnzeG*_V<%~IzWJ|NjzwfsIM3sTyK`~QYOL9c;U z7kkp@riNi96J1O!j{}k&q=zcGI9ZTueYjh)Q?_sip9-RR%B5$X*p(ouX#nFyn*uRJ z`aq#vtSksS2--`w=Ni(kY>K8O-ffDn=ivLIp^-`UCS%B|#!hW~waU3IbP+_)!%X6;xH z1?F6hP3|KBI%xRdX)dI30Ha2y|G0NhQ}GH2?Km>-?E($!oS}UwSNlbGcCn-p_rVV< z$?m_9^}Cj($qHg=vVvHetRR*qD~P4Z3Sw!xXFz@j)I!7CVO{y+00000NkvXXu0mjf Dk%xOi diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png deleted file mode 100644 index 440ff76d9b0570f2b6319ba0c4d88d5b9072219e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2714 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png deleted file mode 100644 index 86836ec9c86075129bd2e61d524268d3327652b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3103 zcmcIm_dgqo1GH<@9w{0$Ld^7)s;7z~u~J*n)N1WLYOhvnM-aPKDNkxttQOB`tqMv) zHA;zHG-euV6kp#z;{9-UpZoppK9^!F*XC_9)1eE-Wkz>gnhG#Q9NxE7U*8y=eQ62pt_qk0DIkDx7|+n8ViUzSzg} zH3u;eH;|q=B9-;p>jlXHu)+AKMeEJh&60LMM>lToQ5bW;_g2eOAG32bK)Lq?2s#GLB)UE zxXzx3qT*PrUmWCSM-XBqrMferCfoYXv{V@+qTpKsWVVn?`fAnooA}IaZ@LOEKo?(gb@Szb6$5DpSrPE zr$)I;Xy-1qvd4oTc-z*PsNm8GY|I;DI25;~QJH+rerOjfn-Y#z>gSPx z8!fif->pwG$r{!it<^xpU{$NjRgmdycCvM-P;*sEc=>@sAuGepgI_wM_P!b9wjBJH zRQQiQk=Muc9IPS$FsgYY;2Odk$ao_0>lFmm`r#>^*6%IT6~W`2rC`E`j3pZj(D;wt z?lAeFdRI;f$x6N0kA6K1gnerZ9-8;Ih8*isi;qz=ba_+a8WA^zTboB!>yV5F{vaIuG zn9;B|YgB(XTkW5f9(fl+a_BU@tB`?gb7qdO)QWJJ>KhX@jN*slx8|fN-x3WK#(Ym5 zy84gNXD{pDO2|TuIXaOP7`>oLl zMETX1DiMeB6+aIJk6a!ccjcVy$}FB$H|kWCHrngB#Hy8QOUX$Chj=}Jr?J&aO=qH# z<0NBvKqi+4AG%Ioue*0@d$0(3<8u)&B)ZJTE}ti&EwQpD_tdSSVQl?)bp;aA(4g7O ziu*ad7ta;99#ADS$qn4!k4GN0e-dJ?G#n#}$b*TN7Mq*2cCw4+dJDOtfekR4YjHYzZ>2wMaHyKc3co zW~83DfEZaRCwwmNebSs*-im9H0N!Ih_xn52J@P8DZo^L) z0lphj*6n*i{O#|8aD1@EQxj|lX9WAJnfw?_)8A2>h{d9Eu!~%Ud;4nGA$$Frp?)vX z6w9F}A1z^P#nbN#VjIq3Dt}BXGav%jOTbm!O63-BZ}2}iTbu~KvDNNtVS=a)BK*Qt z9R5>%!=vx(JvE0^OZc|zfafcLrBxsxQ)`?i0QQsR~^pS1aN@^;O5+PJ|-3)Ced&f$C4b6$)VN#0<=FetzqlZ+fTL z8E=P*g&jiDuG5hH0N}iU3kcnt?AG?)vV}PKr*iOKRP?Lf!X!CBLvnzaPR5 z@_oBdp;F}sQZ(*|EdLdom!2do8jt7Rv^Bh*AGmpk}@VE6&SqH6Q@~?v$KLryRpU zFD^n3&1F~t%)r08RUmymSkK!o2}V-IbYJB5RT%vB=VT{ZiR6CcM{VVob=E@UOI+S) zN+zC@`Owr_Jw9yz@Y)#w`?20LG;iT#a`-W$c`2!_5Kfv&mc{0L-ubylI~f=8e7=mN zILG}7x^tGsY>_hz0+C8(}t`4#%&!NsO zTocUY2EZD~@F~n;A>8`AL9&tg$chIILuylKI(tSNoWl-*-cj*%Eg|8V&QaMnQI&Hw zj{({RxK+LCL1qm)rxb^#*^NX1s)W@BwyaBxam+a7-{%@{YWE zjMY`7^t2c`w79^>B$^|3)|xb${Nc{OX`K*{J@k@KSL}{{)YMOu*QdlX?qBk^fr#M_ z3yl_1kDS%gA}Z>6r+Jsd4PfE)OLb&;_Zy>Q-zTD%iM85w{BzvhF$a2q=^w^Em@j1F zF9z0aF?=yyaN0sh+8|I>1q+O5Jx(iMA5dfKeW>RH2@KztRJ(_NP|RRy{bPwxC@6$b zBi@!4hza`5x;T*R=;y4;U{8|7aq}P4bqY%PDD)$K84cNK_;GEG^GH;Y1B#{Ng)I|V zcP!%y^RfS?`l&OmbYz!yYe(1J!rXafV^Wnz${shSvBRMOPgBN;u}$c1f?i?2)nyud z@HHcmtS!A7`OCy->r;nN^9o4QP<4`V4&@A3I1HA>1@PB0vuPY04 WMGUBIy}Nk)bcS#fSiO$Z^Zx<=KjRPp 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 deleted file mode 100644 index b2b234843976b7fbe95ecbd232067241329ae625..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3261 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 H0+Rj%ds!D` 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 deleted file mode 100644 index 64f2c44d49b40f8f92b9676c2fbcc88a69417db2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4951 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png deleted file mode 100644 index 60a3c13435869c1f1ffc22adf8556be08d79fda9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1983 zcmb7_`#Tc~1IOpI8GD#Taw(BULntb9KPz5$IlPmc+>J`YtQiT7l(0r}XHu>cwz=i9 zS%h5YpZACF_wziTf8dki;%p-gQHB5j0BJj0E7xDN{m&%C ze?9su!{!&1aMm6;x3C~wlphuYh>D8RyM8MqGQck!qZft^E?6^D1^~c*c2=l=6U4q2 zM28ak`8zZhIPu!i=+5d;OmuA>Vh>d)~|@xdmZDa z`MEw(tgVjXH0gt=QKP1NYn^2zSvX2Evjk}8LWCnwvRP`9_GF-jE%AS7MHuQ_Fb5qY z8@A7stT@-;*Q&r4lQ0*IhOev>+|O9tmv?f+Xk?sUQhB(a_v#uEsJ>du-r-W;e6&2* zCFQ%hY;)H%5KZa%@VaZ;$`Lp=OCI+2%6&W0YfWP)P$~OY521oT#5-Q*P4|BsTm`yW6gU5DWrsV4s=3XZEA;c-*D@Xfl-&n zYWlH?&?*jPho%&?vyj$PqbtAgrh!nIzqsg=Or70Na^ir&Z)TmFUI#`F@)AVU$cAVw zT1{;o7XBOEZE7Y$>-}o;K=;aHnR&~(oIeJH{YL)pl6OuGP%m~D2M{8yRhGsZ=DHbP zWcxkiqJ*V+sJoM)pP(V*CYR$e4(nf*NG)l)l_uJRSp<01ytqRldo6#zIGgqNsDoDORnIXT8 zINYw6W5;IKOK4jVqi|oyzL0s5+ct!X9sFRFXNkU2F*`Xamd8|_CN_I$r2>QBZAfgw~;xuCAPEoaJ}n8^1I?~((iBe&+$D%+h#$doo2~FrHIH=sp5k! zD-9uzEUX0APOH<^=alhbs0H%=ETyP_Yg?5C^c7XP9~H(_d0a}|e#t~SCH)u@Eu5 zZTrzU?h-bmxuZ2obJbeSibeCO(aC*29auI^21Vn>n$YtnOsn5$=cALi`OAQq%234? z*^)7Wic!{G`brEFsY(3a*MGXTZY}?Xh{5zy{XP`YKB4fl_Tch9Cn*o!Vef8ZOGLPp zV-lE+O`!6v+fq{zgnTkT1OO z*Uzq1sweHHV`lbA9n}W40I}9qTm9>6Njh;~kp160?jCv3YkdJzAF9N8#MBMbWKH)y zCL*{d0f+89Sg*2)rS*#s(p=A9Lmd%5OjjT$4zpb>w2M_r81i>&K#Y8oPV_`FPs#2S z93{@~6QG)xoEd8QjMbVpeb2j; z8E_>%n)~to_VBSW|J7Ba-o6B&QUG)a62deeH7zJKEy6=zHl*d6uN&aUSW>#S)0+#> z7e(Q}2V@}iJ7Ww(wX#9z@l@VO+;KearvazvqqqW>aNIaYHeChT->$-bh9NJmoT-OD zJRJWvB+AQ!#I`!QH|VMlhIz7v48mj{C-Q5u81T z$qm3zhl=Gar?+0iB?LEBi#+J@W!O{Bw_#ur8D0yF<&~P)!nfmvF21NH>{S zKh5}a9C|izG_>5Z==so{H3!jjmlOF2K>;i^g6^7Z!c3XP6Z4=*sswEzGB diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png deleted file mode 100644 index 644d1703f3fcc3868fa1b736375915b20d062e45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3969 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 Q7eM5Wm4jv7&EGKp11A<8oB#j- diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 417ff7667b179b474e9d4d09ad3cd4be900a0625..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4200 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 Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725..0000000 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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 deleted file mode 100644 index f2e259c..0000000 --- a/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c2851..0000000 --- a/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist deleted file mode 100644 index c68b398..0000000 --- a/ios/Runner/Info.plist +++ /dev/null @@ -1,61 +0,0 @@ - - - - - BGTaskSchedulerPermittedIdentifiers - - auto-upload-photos - com.bewcloud.mobile.iOSBackgroundAppRefresh - - CADisableMinimumFrameDurationOnPhone - - UIBackgroundModes - - processing - fetch - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - bewCloud - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - bewcloud - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - NSPhotoLibraryUsageDescription - Auto-upload photos and videos from the gallery - LSRequiresIPhoneOS - - UIApplicationSupportsIndirectInputEvents - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index 308a2a5..0000000 --- a/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1 +0,0 @@ -#import "GeneratedPluginRegistrant.h" diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift deleted file mode 100644 index 86a7c3b..0000000 --- a/ios/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Flutter -import UIKit -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/lib/add_account_page.dart b/lib/add_account_page.dart deleted file mode 100644 index 5ddac32..0000000 --- a/lib/add_account_page.dart +++ /dev/null @@ -1,279 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; - -import 'package:flutter/material.dart'; -import 'package:http/http.dart' as http; - -import 'config.dart'; -import 'encryption.dart'; - -Future testApiConnection( - String url, String username, String password) async { - final body = {'parentPath': '/'}; - final jsonString = jsonEncode(body); - final uri = - Uri.parse('${url.replaceFirst("/dav", "")}/api/files/get-directories'); - final String basicAuth = - 'Basic ${base64.encode(utf8.encode('$username:$password'))}'; - final headers = { - HttpHeaders.contentTypeHeader: 'application/json', - HttpHeaders.authorizationHeader: basicAuth - }; - - try { - final response = await http.post(uri, headers: headers, body: jsonString); - - if (response.statusCode == 200) { - final result = jsonDecode(response.body) as Map; - - if (result['success'] == true) { - return true; - } - } - } catch (error) { - debugPrint(error.toString()); - } - - return false; -} - -class AddAccountPage extends StatefulWidget { - const AddAccountPage({super.key}); - - @override - State createState() => _AddAccountPageState(); -} - -class _AddAccountPageState extends State { - final TextEditingController _urlTextFieldController = TextEditingController(); - final TextEditingController _usernameTextFieldController = - TextEditingController(); - final TextEditingController _passwordTextFieldController = - TextEditingController(); - - List accounts = []; - - String newAccountUrl = ""; - String newAccountUsername = ""; - String newAccountPassword = ""; - - @override - void initState() { - super.initState(); - _loadCloudAccounts(); - } - - Future _loadCloudAccounts() async { - final config = await ConfigStorage().readConfig(); - - setState(() { - accounts = config.accounts; - }); - } - - Future _saveNewCloudAccount() async { - var config = await ConfigStorage().readConfig(); - - final encryptedPassword = encryptPassword(newAccountPassword); - - final newCloudAccount = CloudAccount( - url: newAccountUrl, - username: newAccountUsername, - password: encryptedPassword.base64); - - config.accounts.add(newCloudAccount); - - await ConfigStorage().writeConfig(config); - - setState(() { - accounts = config.accounts; - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text( - 'Add new account', - style: TextStyle(fontWeight: FontWeight.w300), - ), - ), - body: Align( - alignment: Alignment.topCenter, - child: Align( - alignment: Alignment.topLeft, - child: Container( - margin: const EdgeInsets.all(8.0), - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - Expanded( - child: Card( - child: Padding( - padding: const EdgeInsets.all(14.0), - child: TextField( - keyboardType: TextInputType.url, - autocorrect: false, - onChanged: (value) { - setState(() { - newAccountUrl = value; - }); - }, - controller: _urlTextFieldController, - decoration: const InputDecoration( - alignLabelWithHint: true, - label: Text('WebDav URL'), - hintText: 'https://bewcloud.example.com/dav'), - ), - ), - ), - ), - Expanded( - child: Card( - child: Padding( - padding: const EdgeInsets.all(14.0), - child: TextField( - keyboardType: TextInputType.emailAddress, - autocorrect: false, - onChanged: (value) { - setState(() { - newAccountUsername = value; - }); - }, - controller: _usernameTextFieldController, - decoration: const InputDecoration( - alignLabelWithHint: true, - label: Text('Email'), - hintText: 'jane.doe@example.com'), - ), - ), - ), - ), - Expanded( - child: Card( - child: Padding( - padding: const EdgeInsets.all(14.0), - child: TextField( - keyboardType: TextInputType.visiblePassword, - obscureText: true, - enableSuggestions: false, - autocorrect: false, - onChanged: (value) { - setState(() { - newAccountPassword = value; - }); - }, - controller: _passwordTextFieldController, - decoration: const InputDecoration( - alignLabelWithHint: true, - label: Text('WebDav Password'), - hintText: 'super-SECRET-passphrase'), - ), - ), - ), - ), - const Spacer(flex: 2), - ], - ), - ), - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: () async { - if (newAccountUrl.isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('WebDav URL is required!'), - duration: Duration(seconds: 5), - backgroundColor: Colors.red, - ), - ); - return; - } - - if (newAccountUsername.isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Email is required!'), - duration: Duration(seconds: 5), - backgroundColor: Colors.red, - ), - ); - return; - } - - if (newAccountPassword.isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('WebDav Password is required!'), - duration: Duration(seconds: 5), - backgroundColor: Colors.red, - ), - ); - return; - } - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Testing account details...')), - ); - - final doesConnectionWork = await testApiConnection( - newAccountUrl, newAccountUsername, newAccountPassword); - - if (!context.mounted) { - return; - } - - ScaffoldMessenger.of(context).hideCurrentSnackBar(); - - if (!doesConnectionWork) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: - Text('Could not connect! Please check the details again.'), - duration: Duration(seconds: 5), - backgroundColor: Colors.red, - ), - ); - - return; - } - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Adding account...')), - ); - - await _saveNewCloudAccount(); - - if (!context.mounted) { - return; - } - - ScaffoldMessenger.of(context).hideCurrentSnackBar(); - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Account added!'), - duration: Duration(seconds: 5), - backgroundColor: Colors.green, - ), - ); - - setState(() { - newAccountUrl = ""; - newAccountUsername = ""; - newAccountPassword = ""; - }); - - Navigator.pop(context); - }, - tooltip: 'Save', - foregroundColor: Theme.of(context).primaryColor, - backgroundColor: Colors.lightBlue, - shape: const CircleBorder(), - child: const Icon(Icons.check), - ), - ); - } -} diff --git a/lib/api.dart b/lib/api.dart deleted file mode 100644 index 3f32062..0000000 --- a/lib/api.dart +++ /dev/null @@ -1,240 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:flutter/material.dart'; -import 'package:http/http.dart' as http; - -import 'config.dart'; -import 'encryption.dart'; - -Future> makeApiConnection(String url, String username, - String password, String apiPath, Map requestBody) async { - final jsonString = jsonEncode(requestBody); - final uri = Uri.parse('${url.replaceFirst("/dav", "")}/api/files/$apiPath'); - final String basicAuth = - 'Basic ${base64.encode(utf8.encode('$username:$password'))}'; - final headers = { - HttpHeaders.contentTypeHeader: 'application/json', - HttpHeaders.authorizationHeader: basicAuth - }; - - try { - final response = await http.post(uri, headers: headers, body: jsonString); - - if (response.statusCode == 200) { - final result = jsonDecode(response.body) as Map; - - if (result['success']) { - return result; - } - } - } catch (error) { - debugPrint(error.toString()); - } - - return {}; -} - -class CloudDirectory { - String parentPath; - String name; - - CloudDirectory({required this.parentPath, required this.name}); - - factory CloudDirectory.fromJson(Map json) { - return CloudDirectory( - parentPath: json['parent_path'] as String, - name: json['directory_name'] as String, - ); - } -} - -class CloudFile { - String parentPath; - String name; - int sizeInBytes; - - CloudFile( - {required this.parentPath, - required this.name, - required this.sizeInBytes}); - - factory CloudFile.fromJson(Map json) { - return CloudFile( - parentPath: json['parent_path'] as String, - name: json['file_name'] as String, - sizeInBytes: json['size_in_bytes'] as int, - ); - } -} - -class DownloadedFile { - Uint8List bytes; - String name; - - DownloadedFile({required this.bytes, required this.name}); -} - -class Api { - CloudAccount account; - late String decryptedPassword; - - Api({required this.account}) { - decryptedPassword = decryptPassword(account.password); - } - - Future> fetchDirectories(String parentPath) async { - final body = {'parentPath': parentPath}; - final result = await makeApiConnection(account.url, account.username, - decryptedPassword, 'get-directories', body); - - if (result['success']) { - final directories = (result['directories'] as List) - .cast>() - .map((directoryJson) => CloudDirectory.fromJson(directoryJson)) - .toList(); - - return directories; - } - - return []; - } - - Future createDirectory(String parentPath, String name) async { - final body = {'parentPath': parentPath, 'name': name}; - final result = await makeApiConnection(account.url, account.username, - decryptedPassword, 'create-directory', body); - - if (result['success']) { - return true; - } - - return false; - } - - Future> fetchFiles(String parentPath) async { - final body = {'parentPath': parentPath}; - final result = await makeApiConnection( - account.url, account.username, decryptedPassword, 'get', body); - - if (result['success']) { - final directories = (result['files'] as List) - .cast>() - .map((fileJson) => CloudFile.fromJson(fileJson)) - .toList(); - - return directories; - } - - return []; - } - - Future ensureDirectoryExists(String path) async { - if (path == '/') return true; // Root always exists - - final parts = path.split('/').where((p) => p.isNotEmpty).toList(); - String currentCumulativePath = '/'; - - for (final part in parts) { - String nextPath = '$currentCumulativePath$part/'; - try { - bool exists = false; - try { - await fetchDirectories(currentCumulativePath); // Check parent first - final existingDirs = await fetchDirectories(currentCumulativePath); - exists = existingDirs.any((dir) => dir.name == part); - } catch (e) { - if (currentCumulativePath != '/') { - debugPrint( - "Error checking parent directory $currentCumulativePath: $e"); - return false; - } - exists = false; - } - - if (!exists) { - bool created = await createDirectory(currentCumulativePath, part); - if (!created) { - try { - final existingDirs = - await fetchDirectories(currentCumulativePath); - if (!existingDirs.any((dir) => dir.name == part)) { - debugPrint( - "Failed to create directory part: $part in $currentCumulativePath and it still doesn't exist."); - return false; - } - } catch (e) { - debugPrint("Error confirming directory creation $nextPath: $e"); - return false; - } - } - } - currentCumulativePath = nextPath; - } catch (e) { - debugPrint("Error ensuring directory $nextPath exists: $e"); - return false; - } - } - return true; - } - - Future downloadFile(String filePath) async { - final uri = Uri.parse('${account.url}$filePath'); - final String basicAuth = - 'Basic ${base64.encode(utf8.encode('${account.username}:$decryptedPassword'))}'; - final headers = {HttpHeaders.authorizationHeader: basicAuth}; - - try { - final response = await http.get(uri, headers: headers); - - if (response.statusCode == 200) { - final fileName = filePath.split('/').removeLast(); - final downloadedFile = - DownloadedFile(bytes: response.bodyBytes, name: fileName); - - return downloadedFile; - } - } catch (error) { - debugPrint(error.toString()); - } - - return null; - } - - Future uploadFile(String parentPath, File file) async { - final fileName = file.path.split('/').removeLast(); - final uri = Uri.parse('${account.url}$parentPath$fileName'); - final String basicAuth = - 'Basic ${base64.encode(utf8.encode('${account.username}:$decryptedPassword'))}'; - final headers = { - HttpHeaders.authorizationHeader: basicAuth, - HttpHeaders.contentLengthHeader: (await file.length()).toString(), - }; - - try { - final response = - await http.put(uri, headers: headers, body: await file.readAsBytes()); - - if (response.statusCode == 201) { - return true; - } - } catch (error) { - debugPrint(error.toString()); - } - - return false; - } - - Future deleteFile(String parentPath, String name) async { - final body = {'parentPath': parentPath, 'name': name}; - final result = await makeApiConnection( - account.url, account.username, decryptedPassword, 'delete', body); - - if (result['success']) { - return true; - } - - return false; - } -} diff --git a/lib/config.dart b/lib/config.dart deleted file mode 100644 index a48e7f8..0000000 --- a/lib/config.dart +++ /dev/null @@ -1,106 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; - -import 'package:path_provider/path_provider.dart'; - -class CloudAccount { - String url; - String username; - String password; - String? autoUploadDestinationDirectory; - List? selectedPhotoAlbumIds; - - CloudAccount( - {required this.url, - required this.username, - required this.password, - this.autoUploadDestinationDirectory, - this.selectedPhotoAlbumIds}); - - factory CloudAccount.fromJson(Map json) { - List? albumIds; - if (json['selectedPhotoAlbumIds'] != null) { - albumIds = List.from(json['selectedPhotoAlbumIds'] as List); - } - - return CloudAccount( - url: json['url'] as String, - username: json['username'] as String, - password: json['password'] as String, - autoUploadDestinationDirectory: - json['autoUploadDestinationDirectory'] as String?, - selectedPhotoAlbumIds: albumIds, - ); - } - - Map toJson() => { - 'url': url, - 'username': username, - 'password': password, - 'autoUploadDestinationDirectory': autoUploadDestinationDirectory, - 'selectedPhotoAlbumIds': selectedPhotoAlbumIds, - }; -} - -class Config { - List accounts; - - Config({required this.accounts}); - - factory Config.fromJson(Map json) { - final accounts = (json['accounts'] as List) - .cast>() - .map((jsonAccount) => CloudAccount.fromJson(jsonAccount)) - .toList(); - - return Config(accounts: accounts); - } - - Map toJson() => { - 'accounts': accounts.map((account) => account.toJson()).toList(), - }; -} - -Config parseConfig(String jsonString) { - final configJson = jsonDecode(jsonString) as Map; - - final config = Config.fromJson(configJson); - - return config; -} - -String stringifyConfig(Config config) { - final jsonString = jsonEncode(config.toJson()); - - return jsonString; -} - -class ConfigStorage { - Future get _localPath async { - final directory = await getApplicationDocumentsDirectory(); - return directory.path; - } - - Future get _localFile async { - final path = await _localPath; - return File('$path/config.json'); - } - - Future readConfig() async { - try { - final file = await _localFile; - final contents = await file.readAsString(); - return parseConfig(contents); - } catch (e) { - // If encountering an error, return default config - return Config(accounts: []); - } - } - - Future writeConfig(Config config) async { - final file = await _localFile; - final jsonString = stringifyConfig(config); - return file.writeAsString(jsonString); - } -} diff --git a/lib/encryption.dart b/lib/encryption.dart deleted file mode 100644 index 27d54dd..0000000 --- a/lib/encryption.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'dart:convert'; - -import 'package:encrypt/encrypt.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; - -final stringKey = dotenv.env['PASSWORD_SECRET_KEY']!; - -Encrypted encryptPassword(String plainText) { - final key = Key.fromUtf8(stringKey); - final base64key = Key.fromUtf8(base64Url.encode(key.bytes).substring(0, 32)); - - final fernet = Fernet(base64key); - final encrypter = Encrypter(fernet); - - var encrypted = encrypter.encrypt(plainText); - return encrypted; -} - -String decryptPassword(String encryptedBase64) { - final key = Key.fromUtf8(stringKey); - final base64key = Key.fromUtf8(base64Url.encode(key.bytes).substring(0, 32)); - - final fernet = Fernet(base64key); - final encrypter = Encrypter(fernet); - - var decrypted = encrypter.decrypt64(encryptedBase64); - return decrypted; -} diff --git a/lib/files_page.dart b/lib/files_page.dart deleted file mode 100644 index 001feff..0000000 --- a/lib/files_page.dart +++ /dev/null @@ -1,790 +0,0 @@ -import 'dart:io'; -import 'dart:math'; - -import 'package:file_picker/file_picker.dart'; -import 'package:flutter/material.dart'; -import 'package:photo_manager/photo_manager.dart'; -import 'package:prompt_dialog/prompt_dialog.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:intl/intl.dart'; - -import 'config.dart'; -import 'api.dart'; - -double log10(num x) => log(x) / ln10; - -String readableFileSize(int sizeInBytes) { - if (sizeInBytes <= 0) return "0"; - - const base = 1024; - final units = ["B", "KB", "MB", "GB", "TB"]; - - int digitGroups = (log10(sizeInBytes) / log10(base)).floor(); - return "${NumberFormat("#,##0.#").format(sizeInBytes / pow(base, digitGroups))} ${units[digitGroups]}"; -} - -class FilesPage extends StatefulWidget { - const FilesPage({super.key, required this.theme}); - - final ThemeData theme; - - @override - State createState() => _FilesPageState(); -} - -class FileListItem extends CloudDirectory { - String label; - int sizeInBytes; - - FileListItem( - {required super.parentPath, - required super.name, - required this.label, - required this.sizeInBytes}); -} - -class _FilesPageState extends State { - int _chosenAccountIndex = 0; - String _currentPath = '/'; - List accounts = []; - List directories = []; - List files = []; - Api? api; - - @override - void initState() { - super.initState(); - _loadCloudAccounts(); - _loadChosenAccountIndex(); - } - - Future _loadChosenAccountIndex() async { - final prefs = await SharedPreferences.getInstance(); - - setState(() { - _chosenAccountIndex = prefs.getInt('chosenAccountIndex') ?? 0; - }); - } - - Future _updateChosenAccountIndex(int newIndex) async { - final prefs = await SharedPreferences.getInstance(); - - setState(() { - _chosenAccountIndex = newIndex; - prefs.setInt('chosenAccountIndex', _chosenAccountIndex); - }); - } - - Future _loadCloudAccounts() async { - final config = await ConfigStorage().readConfig(); - - setState(() { - accounts = config.accounts; - }); - - _loadDirectoriesAndFiles(); - - // Request gallery access if there's some auto upload directory - final isThereAnyAutoUploadConfig = config.accounts - .any((account) => account.autoUploadDestinationDirectory != null); - - if (isThereAnyAutoUploadConfig) { - final PermissionState permissions = - await PhotoManager.requestPermissionExtend(); - - if (!permissions.isAuth && !permissions.hasAccess) { - await PhotoManager.openSetting(); - } - } - } - - Future _loadDirectoriesAndFiles() async { - CloudAccount? cloudAccount = - accounts.isNotEmpty ? accounts[_chosenAccountIndex] : null; - - if (cloudAccount == null) { - return; - } - - if (api == null) { - setState(() { - api = Api(account: cloudAccount); - }); - } - - final resultDirectories = await api!.fetchDirectories(_currentPath); - - setState(() { - directories = resultDirectories; - }); - - final resultFiles = await api!.fetchFiles(_currentPath); - - setState(() { - files = resultFiles; - }); - } - - Future _downloadFile(String filePath, BuildContext context) async { - CloudAccount? cloudAccount = - accounts.isNotEmpty ? accounts[_chosenAccountIndex] : null; - - if (cloudAccount == null) { - return; - } - - if (api == null) { - setState(() { - api = Api(account: cloudAccount); - }); - } - - final downloadedFile = await api!.downloadFile(filePath); - - if (downloadedFile == null) { - if (!context.mounted) { - return; - } - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Failed to download file.'), - duration: Duration(seconds: 5), - backgroundColor: Colors.red, - ), - ); - - return; - } - - await FilePicker.platform.saveFile( - dialogTitle: 'Save file:', - fileName: downloadedFile.name, - bytes: downloadedFile.bytes, - ); - } - - Future _uploadFile(BuildContext context) async { - CloudAccount? cloudAccount = - accounts.isNotEmpty ? accounts[_chosenAccountIndex] : null; - - if (cloudAccount == null) { - return; - } - - if (api == null) { - setState(() { - api = Api(account: cloudAccount); - }); - } - - FilePickerResult? result = - await FilePicker.platform.pickFiles(allowMultiple: true); - - if (result == null) { - return; - } - - List files = result.paths.map((path) => File(path!)).toList(); - - for (final newFile in files) { - final uploadedFile = await api!.uploadFile(_currentPath, newFile); - - if (!uploadedFile) { - if (!context.mounted) { - return; - } - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Failed to upload file.'), - duration: Duration(seconds: 5), - backgroundColor: Colors.red, - ), - ); - - return; - } - } - - _loadDirectoriesAndFiles(); - } - - Future _createDirectory(BuildContext context) async { - CloudAccount? cloudAccount = - accounts.isNotEmpty ? accounts[_chosenAccountIndex] : null; - - if (cloudAccount == null) { - return; - } - - if (api == null) { - setState(() { - api = Api(account: cloudAccount); - }); - } - - String? directoryName = - await prompt(context, title: const Text('Directory name')); - - if (directoryName == null) { - return; - } - - final createdDirectory = - await api!.createDirectory(_currentPath, directoryName); - - if (!createdDirectory) { - if (!context.mounted) { - return; - } - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Failed to create directory.'), - duration: Duration(seconds: 5), - backgroundColor: Colors.red, - ), - ); - - return; - } - - _loadDirectoriesAndFiles(); - } - - Future _deleteFile(String fileName, BuildContext context) async { - CloudAccount? cloudAccount = - accounts.isNotEmpty ? accounts[_chosenAccountIndex] : null; - - if (cloudAccount == null) { - return; - } - - if (api == null) { - setState(() { - api = Api(account: cloudAccount); - }); - } - - final deletedFile = await api!.deleteFile(_currentPath, fileName); - - if (!deletedFile) { - if (!context.mounted) { - return; - } - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Failed to delete file.'), - duration: Duration(seconds: 5), - backgroundColor: Colors.red, - ), - ); - - return; - } - - _loadDirectoriesAndFiles(); - } - - Future _updateAccountAutoUploadDirectory(String? directory) async { - var config = await ConfigStorage().readConfig(); - - if (config.accounts[_chosenAccountIndex].autoUploadDestinationDirectory == - directory) { - config.accounts[_chosenAccountIndex].autoUploadDestinationDirectory = - null; - } else { - config.accounts[_chosenAccountIndex].autoUploadDestinationDirectory = - directory; - } - - await ConfigStorage().writeConfig(config); - - _loadCloudAccounts(); - } - - @override - Widget build(BuildContext context) { - CloudAccount? cloudAccount = - accounts.isNotEmpty ? accounts[_chosenAccountIndex] : null; - - var listAccountIndex = 0; - - final accountsToChooseFrom = (accounts.map((account) { - final thisAccountIndex = listAccountIndex++; - - List children = [ - Text('${account.username} - ${account.url}', - overflow: TextOverflow.ellipsis), - ]; - - if (thisAccountIndex == _chosenAccountIndex) { - children.add(const Spacer()); - children.add(const Icon( - Icons.check, - size: 18, - )); - } - - return ElevatedButton( - style: const ButtonStyle( - backgroundColor: MaterialStatePropertyAll(Colors.lightBlue), - foregroundColor: MaterialStatePropertyAll(Colors.black)), - onPressed: () async { - await _updateChosenAccountIndex(thisAccountIndex); - - if (!context.mounted) { - return; - } - - Navigator.pop(context); - }, - child: Row( - children: children, - ), - ); - }).toList()); - - List listItems = directories - .map((directory) => FileListItem( - parentPath: directory.parentPath, - name: directory.name, - label: directory.name, - sizeInBytes: 0, - )) - .toList(); - - final pathParts = _currentPath.split('/'); - pathParts.removeAt(0); - pathParts.removeLast(); - final parentName = pathParts.isNotEmpty ? pathParts.removeLast() : ''; - - if (_currentPath != '/') { - var parentPath = '/${pathParts.join('/')}/'; - parentPath = parentPath.replaceAll('//', '/'); - - listItems.insert( - 0, - FileListItem( - parentPath: parentPath, - name: '', - label: '..', - sizeInBytes: 0, - )); - } - - listItems.addAll(files.map((file) => FileListItem( - parentPath: file.parentPath, - name: file.name, - label: file.name, - sizeInBytes: file.sizeInBytes, - ))); - - return Scaffold( - appBar: accounts.isEmpty - ? null - : AppBar( - title: GestureDetector( - child: Row( - children: [ - Expanded( - child: Text( - parentName.isEmpty ? _currentPath : parentName, - overflow: TextOverflow.ellipsis, - )), - Padding( - padding: const EdgeInsets.only(left: 12.0), - child: Text(cloudAccount!.username), - ), - const Padding( - padding: EdgeInsets.only(left: 12), - child: Icon(Icons.arrow_drop_down_circle_outlined), - ), - ], - ), - onTap: () { - showModalBottomSheet( - context: context, - builder: (BuildContext context) { - return Container( - height: 200, - color: Colors.black45, - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - const Text( - 'Choose account', - style: - TextStyle(fontWeight: FontWeight.bold), - ), - const Spacer(), - ...accountsToChooseFrom, - const Spacer(flex: 1), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: - MaterialStatePropertyAll( - Colors.black), - foregroundColor: - MaterialStatePropertyAll( - Colors.white)), - onPressed: () { - Navigator.pop(context); - }, - child: const Text('Cancel / Close'), - ), - ], - ), - ), - ), - ); - }); - }, - ), - ), - body: listItems.isEmpty - ? Center( - child: Text( - accounts.isEmpty - ? 'No accounts found.\n\nAdd a new one from the settings tab.' - : 'No directories or files found. Add a new one below!', - textAlign: TextAlign.center, - )) - : ListView.builder( - scrollDirection: Axis.vertical, - physics: const AlwaysScrollableScrollPhysics(), - shrinkWrap: false, - itemCount: listItems.length, - itemBuilder: (BuildContext context, int index) { - final item = listItems[index]; - var itemIcon = const Icon(Icons.folder_outlined); - - final itemFullPath = '${item.parentPath}${item.name}/'; - - if (item.name == '.Trash' && item.parentPath == '/') { - itemIcon = const Icon(Icons.delete_outline); - } - - if (item.sizeInBytes == 0 && - itemFullPath == - cloudAccount!.autoUploadDestinationDirectory) { - itemIcon = const Icon(Icons.folder_special); - } - - if (item.sizeInBytes > 0) { - itemIcon = const Icon(Icons.insert_drive_file_outlined); - } - - var children = [ - itemIcon, - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 12.0), - child: Text(item.label, overflow: TextOverflow.ellipsis), - ), - ), - ]; - - if (item.sizeInBytes > 0) { - children.add(const Spacer()); - children.add( - Padding( - padding: const EdgeInsets.only(left: 12.0), - child: Text(readableFileSize(item.sizeInBytes)), - ), - ); - } - - return GestureDetector( - onTap: () { - if (item.sizeInBytes == 0) { - setState(() { - directories = []; - files = []; - - if (item.name.isNotEmpty) { - _currentPath = '${item.parentPath}${item.name}/'; - } else { - _currentPath = item.parentPath; - } - }); - - _loadDirectoriesAndFiles(); - return; - } - - showModalBottomSheet( - context: context, - builder: (BuildContext context) { - return Container( - height: 300, - color: Colors.black45, - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - const Text( - 'Choose action', - style: TextStyle( - fontWeight: FontWeight.bold), - ), - Text(item.label), - const Spacer(), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: - MaterialStatePropertyAll( - Colors.lightBlue), - foregroundColor: - MaterialStatePropertyAll( - Colors.black)), - onPressed: () async { - await _downloadFile( - '${item.parentPath}${item.name}', - context); - - if (!context.mounted) { - return; - } - - Navigator.pop(context); - }, - child: const Text('Download file'), - ), - const Spacer(), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: - MaterialStatePropertyAll( - Colors.red), - foregroundColor: - MaterialStatePropertyAll( - Colors.white)), - onPressed: () async { - Navigator.pop(context); - - showDialog( - context: context, - builder: (BuildContext subContext) { - return AlertDialog( - title: - const Text('Are you sure?'), - content: const Text( - 'Are you sure you want to delete this file?'), - actions: [ - TextButton( - onPressed: () async { - await _deleteFile( - item.name, context); - - if (!subContext - .mounted) { - return; - } - - Navigator.pop( - subContext); - }, - child: const Text('Yes')), - TextButton( - onPressed: () { - Navigator.pop( - subContext); - }, - child: const Text('No')) - ], - ); - }); - }, - child: const Text('Delete file'), - ), - const Spacer(flex: 1), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: - MaterialStatePropertyAll( - Colors.black), - foregroundColor: - MaterialStatePropertyAll( - Colors.white)), - onPressed: () { - Navigator.pop(context); - }, - child: const Text('Cancel / Close'), - ), - ], - ), - ), - ), - ); - }); - }, - onLongPress: () async { - if (item.sizeInBytes > 0) { - return; - } - - showModalBottomSheet( - context: context, - builder: (BuildContext context) { - return Container( - height: 200, - color: Colors.black45, - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'Manage ${item.name}', - style: const TextStyle( - fontWeight: FontWeight.bold), - ), - const Spacer(), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: - MaterialStatePropertyAll( - Colors.lightBlue), - foregroundColor: - MaterialStatePropertyAll( - Colors.black)), - onPressed: () async { - Navigator.pop(context); - - await _updateAccountAutoUploadDirectory( - itemFullPath); - }, - child: Text(cloudAccount! - .autoUploadDestinationDirectory == - itemFullPath - ? 'Stop auto-uploading to this directory' - : 'Choose this as the auto-upload directory'), - ), - const Spacer(flex: 1), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: - MaterialStatePropertyAll( - Colors.black), - foregroundColor: - MaterialStatePropertyAll( - Colors.white)), - onPressed: () => Navigator.pop(context), - child: const Text('Cancel / Close'), - ), - ], - ), - ), - ), - ); - }); - }, - child: Card( - child: Container( - margin: const EdgeInsets.all(8.0), - padding: const EdgeInsets.all(8.0), - child: Row( - children: children, - ), - ), - ), - ); - }, - ), - floatingActionButton: accounts.isEmpty - ? null - : FloatingActionButton( - onPressed: () { - showModalBottomSheet( - context: context, - builder: (BuildContext context) { - return Container( - height: 200, - color: Colors.black45, - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - const Text( - 'Choose action', - style: TextStyle(fontWeight: FontWeight.bold), - ), - const Spacer(), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: MaterialStatePropertyAll( - Colors.lightBlue), - foregroundColor: MaterialStatePropertyAll( - Colors.black)), - onPressed: () async { - await _uploadFile(context); - - if (!context.mounted) { - return; - } - - Navigator.pop(context); - }, - child: const Text('Upload file'), - ), - const Spacer(), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: MaterialStatePropertyAll( - Colors.lightBlue), - foregroundColor: MaterialStatePropertyAll( - Colors.black)), - onPressed: () async { - await _createDirectory(context); - - if (!context.mounted) { - return; - } - - Navigator.pop(context); - }, - child: const Text('Create directory'), - ), - const Spacer(flex: 1), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: MaterialStatePropertyAll( - Colors.black), - foregroundColor: MaterialStatePropertyAll( - Colors.white)), - onPressed: () { - Navigator.pop(context); - }, - child: const Text('Cancel / Close'), - ), - ], - ), - ), - ), - ); - }); - }, - tooltip: 'Upload file or create directory', - foregroundColor: Theme.of(context).primaryColor, - backgroundColor: Colors.lightBlue, - shape: const CircleBorder(), - child: const Icon(Icons.add), - ), - ); - } -} diff --git a/lib/main.dart b/lib/main.dart deleted file mode 100644 index acdd4a1..0000000 --- a/lib/main.dart +++ /dev/null @@ -1,232 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:photo_manager/photo_manager.dart'; -import 'package:workmanager/workmanager.dart'; -import 'dart:io'; - -import 'files_page.dart'; -import 'settings_page.dart'; -import 'config.dart'; -import 'photos.dart'; -import 'api.dart'; -import 'photo_sync_page.dart'; -import 'notifications.dart'; - -final NotificationService notificationService = NotificationService(); - -@pragma('vm:entry-point') -void callbackDispatcher() { - Workmanager().executeTask((task, inputData) async { - await dotenv.load(fileName: ".env"); - await notificationService.init(); - bool success = false; - String errorMessage = 'An unknown error occurred.'; - - try { - switch (task) { - case Workmanager.iOSBackgroundTask: - case "autoUploadPhotos": - case "auto-upload-photos": - await notificationService.showSyncProgressNotification(); - final config = await ConfigStorage().readConfig(); - - await PhotoManager.setIgnorePermissionCheck(true); - - bool anyAccountSynced = false; - int totalFilesUploaded = 0; - int totalFilesSkipped = 0; - - for (var account in config.accounts) { - final selectedAlbumIds = account.selectedPhotoAlbumIds; - - if (selectedAlbumIds == null || selectedAlbumIds.isEmpty) { - continue; - } - anyAccountSynced = true; - - final api = Api(account: account); - const String basePhotoDir = '/Photos/'; - - bool baseDirExists = await api.ensureDirectoryExists(basePhotoDir); - if (!baseDirExists) { - errorMessage = - 'Failed to ensure base directory $basePhotoDir for ${account.username}.'; - throw Exception(errorMessage); - } - - final Map> filesToUploadByAlbum = - await getFilesFromAlbums(selectedAlbumIds); - - if (filesToUploadByAlbum.isEmpty) { - continue; - } - - for (var albumEntry in filesToUploadByAlbum.entries) { - final albumName = albumEntry.key; - final filesInAlbum = albumEntry.value; - final sanitizedAlbumName = - albumName.replaceAll(RegExp(r'[<>:"/\\|?*]'), '_').trim(); - if (sanitizedAlbumName.isEmpty) { - continue; - } - final String targetDirectoryPath = - '$basePhotoDir$sanitizedAlbumName/'; - - bool albumDirExists = - await api.ensureDirectoryExists(targetDirectoryPath); - if (!albumDirExists) { - errorMessage = - 'Failed ensure album directory $targetDirectoryPath for ${account.username}.'; - throw Exception(errorMessage); - } - - List existingFiles = []; - try { - existingFiles = await api.fetchFiles(targetDirectoryPath); - } catch (e) { - errorMessage = - 'Error fetching existing files from $targetDirectoryPath: $e'; - throw Exception(errorMessage); - } - - for (var fileToUpload in filesInAlbum) { - final fileName = fileToUpload.path.split('/').last; - - if (existingFiles - .any((existingFile) => existingFile.name == fileName)) { - totalFilesSkipped++; - continue; - } - - try { - bool uploaded = - await api.uploadFile(targetDirectoryPath, fileToUpload); - if (uploaded) { - totalFilesUploaded++; - } else {} - } catch (e) { - errorMessage = - 'Error uploading $fileName to $targetDirectoryPath: $e'; - throw Exception(errorMessage); - } - } - } - } - - if (anyAccountSynced) { - await notificationService.showSyncCompleteNotification( - message: - 'Sync complete. Uploaded $totalFilesUploaded file(s). Skipped $totalFilesSkipped existing.'); - } - success = true; - break; - - default: - success = true; - break; - } - } catch (e, stacktrace) { - debugPrint( - "Workmanager: Error during background task execution: $e\n$stacktrace"); - await notificationService.showSyncErrorNotification( - message: errorMessage); - success = false; - } - - return Future.value(success); - }); -} - -Future main() async { - WidgetsFlutterBinding.ensureInitialized(); - - await dotenv.load(fileName: ".env"); - await notificationService.init(); - await notificationService.requestPermissions(); - - Workmanager().initialize(callbackDispatcher, isInDebugMode: false); - Workmanager().registerPeriodicTask( - "auto-upload-photos", - "autoUploadPhotos", - constraints: Constraints( - networkType: NetworkType.unmetered, - requiresBatteryNotLow: true, - requiresCharging: false, - ), - frequency: const Duration(hours: 2), - ); - - await PhotoManager.clearFileCache(); - - runApp(const MyApp()); -} - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - @override - Widget build(BuildContext context) { - return MaterialApp( - theme: ThemeData( - useMaterial3: true, - primarySwatch: Colors.lightBlue, - brightness: Brightness.dark, - colorScheme: const ColorScheme.dark()), - home: const AppNavigation(), - ); - } -} - -class AppNavigation extends StatefulWidget { - const AppNavigation({super.key}); - - @override - State createState() => _AppNavigationState(); -} - -class _AppNavigationState extends State { - int _selectedIndex = 0; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final List widgetOptions = [ - FilesPage(theme: theme), - const PhotoSyncPage(), - SettingsPage(theme: theme), - ]; - - return Scaffold( - body: Center( - child: widgetOptions.elementAt(_selectedIndex), - ), - bottomNavigationBar: BottomNavigationBar( - items: const [ - BottomNavigationBarItem( - icon: Icon(Icons.folder_outlined), - activeIcon: Icon(Icons.folder), - label: 'Files', - ), - BottomNavigationBarItem( - icon: Icon(Icons.photo_library_outlined), - activeIcon: Icon(Icons.photo_library), - label: 'Photos Sync', - ), - BottomNavigationBarItem( - icon: Icon(Icons.settings), - activeIcon: Icon(Icons.settings), - label: 'Settings', - ), - ], - currentIndex: _selectedIndex, - onTap: _onItemTapped, - ), - ); - } - - void _onItemTapped(int index) { - setState(() { - _selectedIndex = index; - }); - } -} diff --git a/lib/notifications.dart b/lib/notifications.dart deleted file mode 100644 index 358de71..0000000 --- a/lib/notifications.dart +++ /dev/null @@ -1,122 +0,0 @@ -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; - -class NotificationService { - static final NotificationService _notificationService = - NotificationService._internal(); - - factory NotificationService() { - return _notificationService; - } - - NotificationService._internal(); - - final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = - FlutterLocalNotificationsPlugin(); - - static const String _channelId = 'bewcloud_sync_channel'; - static const String _channelName = 'Photo Sync'; - static const String _channelDescription = - 'Notifications for photo synchronization status'; - static const int _notificationId = 0; - - Future init() async { - const AndroidInitializationSettings initializationSettingsAndroid = - AndroidInitializationSettings('@mipmap/launcher_icon'); - - const DarwinInitializationSettings initializationSettingsIOS = - DarwinInitializationSettings( - requestAlertPermission: false, - requestBadgePermission: false, - requestSoundPermission: false, - ); - - const InitializationSettings initializationSettings = - InitializationSettings( - android: initializationSettingsAndroid, - iOS: initializationSettingsIOS, - macOS: null, - linux: null, - ); - - await flutterLocalNotificationsPlugin.initialize(initializationSettings); - - const AndroidNotificationChannel channel = AndroidNotificationChannel( - _channelId, - _channelName, - description: _channelDescription, - importance: Importance.low, - ); - - await flutterLocalNotificationsPlugin - .resolvePlatformSpecificImplementation< - AndroidFlutterLocalNotificationsPlugin>() - ?.createNotificationChannel(channel); - } - - NotificationDetails _getNotificationDetails({bool ongoing = false}) { - return NotificationDetails( - android: AndroidNotificationDetails( - _channelId, - _channelName, - channelDescription: _channelDescription, - importance: Importance.low, - priority: Priority.low, - ongoing: ongoing, - autoCancel: !ongoing, - onlyAlertOnce: true, - ), - iOS: const DarwinNotificationDetails( - presentAlert: true, - presentBadge: false, - presentSound: false, - ), - ); - } - - Future showSyncProgressNotification( - {String message = 'Syncing photos...'}) async { - await flutterLocalNotificationsPlugin.show( - _notificationId, - 'bewCloud Photo Sync', - message, - _getNotificationDetails(ongoing: true), - ); - } - - Future showSyncCompleteNotification( - {String message = 'Photo sync complete.'}) async { - await flutterLocalNotificationsPlugin.show( - _notificationId, - 'bewCloud Photo Sync', - message, - _getNotificationDetails(ongoing: false), - ); - } - - Future showSyncErrorNotification( - {String message = 'Photo sync failed. Check app for details.'}) async { - await flutterLocalNotificationsPlugin.show( - _notificationId, - 'bewCloud Photo Sync', - message, - _getNotificationDetails(ongoing: false), - ); - } - - Future requestPermissions() async { - final plugin = - flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation< - AndroidFlutterLocalNotificationsPlugin>(); - if (plugin != null) { - await plugin.requestNotificationsPermission(); - } - await flutterLocalNotificationsPlugin - .resolvePlatformSpecificImplementation< - IOSFlutterLocalNotificationsPlugin>() - ?.requestPermissions( - alert: true, - badge: true, - sound: true, - ); - } -} diff --git a/lib/photo_sync_page.dart b/lib/photo_sync_page.dart deleted file mode 100644 index 34ed7f3..0000000 --- a/lib/photo_sync_page.dart +++ /dev/null @@ -1,265 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:photo_manager/photo_manager.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:workmanager/workmanager.dart'; - -import 'config.dart'; - -class PhotoSyncPage extends StatefulWidget { - const PhotoSyncPage({super.key}); - - @override - State createState() => _PhotoSyncPageState(); -} - -class _PhotoSyncPageState extends State { - List _albums = []; - Set _selectedAlbumIds = {}; - bool _isLoading = true; - int _chosenAccountIndex = 0; - List _accounts = []; - final ConfigStorage _configStorage = ConfigStorage(); - - @override - void initState() { - super.initState(); - _loadInitialData(); - } - - Future _loadInitialData() async { - setState(() { - _isLoading = true; - }); - await _loadCloudAccounts(); - await _loadChosenAccountIndex(); - await _loadAlbums(); - await _loadSelectedAlbums(); - setState(() { - _isLoading = false; - }); - } - - Future _loadCloudAccounts() async { - final config = await _configStorage.readConfig(); - if (!mounted) return; - setState(() { - _accounts = config.accounts; - }); - } - - Future _loadChosenAccountIndex() async { - final prefs = await SharedPreferences.getInstance(); - final loadedIndex = prefs.getInt('chosenAccountIndex') ?? 0; - if (!mounted) return; - setState(() { - _chosenAccountIndex = (loadedIndex >= 0 && loadedIndex < _accounts.length) - ? loadedIndex - : 0; - }); - } - - Future _updateChosenAccountIndex(int newIndex) async { - final prefs = await SharedPreferences.getInstance(); - if (!mounted) return; - setState(() { - _chosenAccountIndex = newIndex; - prefs.setInt('chosenAccountIndex', _chosenAccountIndex); - _loadSelectedAlbums(); - }); - } - - Future _loadAlbums() async { - final permissionState = await PhotoManager.requestPermissionExtend(); - if (permissionState.isAuth) { - final albums = await PhotoManager.getAssetPathList( - type: RequestType.image, - ); - setState(() { - _albums = albums; - }); - } else { - PhotoManager.openSetting(); - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Photo library permission is required.')), - ); - } - } - - Future _loadSelectedAlbums() async { - final currentAccount = _currentAccount; - if (currentAccount != null) { - if (!mounted) return; - setState(() { - _selectedAlbumIds = - (currentAccount.selectedPhotoAlbumIds ?? []).toSet(); - }); - } else { - if (!mounted) return; - setState(() { - _selectedAlbumIds = {}; - }); - } - } - - Future _saveSelectedAlbums() async { - final currentAccount = _currentAccount; - if (currentAccount == null) return; - - final config = await _configStorage.readConfig(); - final accountIndex = config.accounts.indexWhere((acc) => - acc.url == currentAccount.url && - acc.username == currentAccount.username); - - if (accountIndex != -1) { - config.accounts[accountIndex].selectedPhotoAlbumIds = - _selectedAlbumIds.toList(); - await _configStorage.writeConfig(config); - } - // Optionally show a confirmation message - // ScaffoldMessenger.of(context).showSnackBar( - // const SnackBar(content: Text('Sync settings saved.')), - // ); - } - - void _toggleAlbumSelection(String albumId) { - if (!mounted) return; - setState(() { - if (_selectedAlbumIds.contains(albumId)) { - _selectedAlbumIds.remove(albumId); - } else { - _selectedAlbumIds.add(albumId); - } - }); - _saveSelectedAlbums(); - } - - CloudAccount? get _currentAccount { - if (_accounts.isNotEmpty && _chosenAccountIndex < _accounts.length) { - return _accounts[_chosenAccountIndex]; - } - return null; - } - - @override - Widget build(BuildContext context) { - final currentAccount = _currentAccount; - - var listAccountIndex = 0; - final accountsToChooseFrom = (_accounts.map((account) { - final thisAccountIndex = listAccountIndex++; - List children = [ - Text('${account.username} - ${account.url}', - overflow: TextOverflow.ellipsis), - ]; - if (thisAccountIndex == _chosenAccountIndex) { - children.add(const Spacer()); - children.add(const Icon(Icons.check, size: 18)); - } - return ElevatedButton( - style: const ButtonStyle( - backgroundColor: MaterialStatePropertyAll(Colors.lightBlue), - foregroundColor: MaterialStatePropertyAll(Colors.black)), - onPressed: () async { - await _updateChosenAccountIndex(thisAccountIndex); - if (!context.mounted) return; - Navigator.pop(context); - }, - child: Row(children: children), - ); - }).toList()); - - return Scaffold( - appBar: AppBar( - title: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text('Select Photo Folders to Sync'), - if (currentAccount != null) - Text( - 'Account: ${currentAccount.username}', - style: Theme.of(context).textTheme.titleSmall, - ) - ], - ), - actions: [ - if (_accounts.length > 1) - IconButton( - icon: const Icon(Icons.switch_account_outlined), - tooltip: 'Switch Account', - onPressed: () { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: const Text('Choose Account'), - content: SingleChildScrollView( - child: ListBody( - children: accountsToChooseFrom, - ), - ), - actions: [ - TextButton( - child: const Text('Cancel'), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ); - }, - ); - }, - ), - ], - ), - body: _isLoading - ? const Center(child: CircularProgressIndicator()) - : currentAccount == null - ? const Center( - child: Text( - 'No accounts configured. Please add an account in Settings.')) - : _albums.isEmpty - ? const Center( - child: - Text('No photo albums found or permission denied.')) - : ListView.builder( - itemCount: _albums.length, - itemBuilder: (context, index) { - final album = _albums[index]; - final isSelected = _selectedAlbumIds.contains(album.id); - return CheckboxListTile( - title: Text(album.name), - value: isSelected, - onChanged: (bool? value) { - if (value != null) { - _toggleAlbumSelection(album.id); - } - }, - ); - }, - ), - floatingActionButton: FloatingActionButton.extended( - onPressed: () { - Workmanager().registerOneOffTask( - "manualPhotoSync_${DateTime.now().millisecondsSinceEpoch}", - "auto-upload-photos", - constraints: Constraints( - networkType: NetworkType.connected, - ), - ); - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text( - 'Manual photo sync initiated. It will run in the background.'), - duration: Duration(seconds: 3), - ), - ); - }, - tooltip: 'Sync Photos Now', - icon: const Icon(Icons.sync), - label: const Text('Sync Now'), - ), - ); - } -} diff --git a/lib/photos.dart b/lib/photos.dart deleted file mode 100644 index d272919..0000000 --- a/lib/photos.dart +++ /dev/null @@ -1,110 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/material.dart'; // Import for debugPrint -import 'package:photo_manager/photo_manager.dart'; - -class RecentFile { - File file; - bool isPhoto; - bool isVideo; - - RecentFile( - {required this.file, required this.isPhoto, required this.isVideo}); -} - -Future> getRecentFiles() async { - final now = DateTime.now(); - final lastWeek = now.subtract(const Duration(days: 7)); - - await PhotoManager.setIgnorePermissionCheck(true); - - final List imageAlbumPaths = - await PhotoManager.getAssetPathList( - onlyAll: true, type: RequestType.image); - final List videoAlbumPaths = - await PhotoManager.getAssetPathList( - onlyAll: true, type: RequestType.video); - - List recentFiles = []; - - for (var imageAlbumPath in imageAlbumPaths) { - final List items = - await imageAlbumPath.getAssetListPaged(page: 0, size: 100); - - for (var item in items) { - if (item.createDateTime.isAfter(lastWeek)) { - recentFiles.add(RecentFile( - file: (await item.originFile)!, isPhoto: true, isVideo: false)); - } - } - } - - for (var videoAlbumPath in videoAlbumPaths) { - final List items = - await videoAlbumPath.getAssetListPaged(page: 0, size: 100); - - for (var item in items) { - if (item.createDateTime.isAfter(lastWeek)) { - recentFiles.add(RecentFile( - file: (await item.originFile)!, isPhoto: false, isVideo: true)); - } - } - } - - return recentFiles; -} - -Future>> getFilesFromAlbums( - List albumIds) async { - Map> albumFiles = {}; - final List allAlbums = await PhotoManager.getAssetPathList( - type: RequestType.all, - ); - - final Map albumMap = { - for (var album in allAlbums) album.id: album - }; - - for (String albumId in albumIds) { - final album = albumMap[albumId]; - if (album == null) { - debugPrint("Could not find album with ID: $albumId"); - continue; - } - - try { - List assets = []; - int page = 0; - int size = 100; - List currentPageAssets; - do { - currentPageAssets = - await album.getAssetListPaged(page: page, size: size); - assets.addAll(currentPageAssets); - page++; - } while (currentPageAssets.isNotEmpty); - - List files = []; - for (var asset in assets) { - if (asset.type != AssetType.image && asset.type != AssetType.video) { - continue; - } - try { - final file = await asset.originFile; - if (file != null) { - files.add(file); - } else { - debugPrint( - "Could not get originFile for asset ${asset.id} in album ${album.name}"); - } - } catch (e) { - debugPrint("Error getting file for asset ${asset.id}: $e"); - } - } - albumFiles[album.name] = files; - } catch (e) { - debugPrint("Error processing album '${album.name}' (ID $albumId): $e"); - } - } - return albumFiles; -} diff --git a/lib/settings_page.dart b/lib/settings_page.dart deleted file mode 100644 index 54e3cec..0000000 --- a/lib/settings_page.dart +++ /dev/null @@ -1,231 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'config.dart'; -import 'add_account_page.dart'; -import 'api.dart'; -import 'photos.dart'; - -class SettingsPage extends StatefulWidget { - const SettingsPage({super.key, required this.theme}); - - final ThemeData theme; - - @override - State createState() => _SettingsPageState(); -} - -class _SettingsPageState extends State { - List accounts = []; - - @override - void initState() { - super.initState(); - _loadCloudAccounts(); - } - - Future _loadCloudAccounts() async { - final config = await ConfigStorage().readConfig(); - - setState(() { - accounts = config.accounts; - }); - } - - Future _deleteCloudAccount(int indexToRemove) async { - var config = await ConfigStorage().readConfig(); - - config.accounts.removeAt(indexToRemove); - - await ConfigStorage().writeConfig(config); - - setState(() { - accounts = config.accounts; - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - body: accounts.isEmpty - ? const Center(child: Text('No accounts found. Add a new one below!')) - : ListView.builder( - itemCount: accounts.length, - itemBuilder: (BuildContext context, int index) { - final account = accounts[index]; - - var children = [ - Text( - 'Manage ${account.username}', - style: const TextStyle(fontWeight: FontWeight.bold), - ), - const Spacer(), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: MaterialStatePropertyAll(Colors.red), - foregroundColor: - MaterialStatePropertyAll(Colors.white)), - onPressed: () { - Navigator.pop(context); - - showDialog( - context: context, - builder: (BuildContext subContext) { - return AlertDialog( - title: const Text('Are you sure?'), - content: const Text( - 'Are you sure you want to delete this account?'), - actions: [ - TextButton( - onPressed: () async { - await _deleteCloudAccount(index); - - if (!subContext.mounted) { - return; - } - - Navigator.pop(subContext); - }, - child: const Text('Yes')), - TextButton( - onPressed: () { - Navigator.pop(subContext); - }, - child: const Text('No')) - ], - ); - }); - }, - child: const Text('Delete account'), - ), - const Spacer(flex: 1), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: MaterialStatePropertyAll(Colors.black), - foregroundColor: - MaterialStatePropertyAll(Colors.white)), - onPressed: () => Navigator.pop(context), - child: const Text('Cancel / Close'), - ), - ]; - - // If account has auto-upload set, add button to manually trigger it - final destinationDirectoryPath = - account.autoUploadDestinationDirectory; - if (destinationDirectoryPath != null) { - children.insertAll(1, [ - const Spacer(), - ElevatedButton( - style: const ButtonStyle( - backgroundColor: - MaterialStatePropertyAll(Colors.lightBlue), - foregroundColor: - MaterialStatePropertyAll(Colors.black)), - onPressed: () async { - Navigator.pop(context); - - final List recentFiles = - await getRecentFiles(); - - if (!context.mounted) { - return; - } - - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - 'Uploading ${recentFiles.length} file${recentFiles.length == 1 ? '' : 's'}...')), - ); - - final api = Api(account: account); - - final accountDestinationFiles = - await api.fetchFiles(destinationDirectoryPath); - - for (var recentFile in recentFiles) { - final fileName = - recentFile.file.path.split('/').removeLast(); - - // Check if file exists in destination - if (accountDestinationFiles.any((destinationFile) => - destinationFile.name == fileName)) { - continue; - } - - await api.uploadFile( - destinationDirectoryPath, recentFile.file); - } - - if (!context.mounted) { - return; - } - - ScaffoldMessenger.of(context).hideCurrentSnackBar(); - - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Files uploaded!'), - duration: Duration(seconds: 5), - backgroundColor: Colors.green, - ), - ); - }, - child: const Text('Force auto-upload now'), - ), - ]); - } - - return Align( - alignment: Alignment.topLeft, - child: GestureDetector( - onTap: () { - showModalBottomSheet( - context: context, - builder: (BuildContext context) { - return Container( - height: 250, - color: Colors.black45, - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: children, - ), - ), - ), - ); - }); - }, - child: Container( - margin: const EdgeInsets.all(8.0), - padding: const EdgeInsets.all(8.0), - child: Card( - child: Padding( - padding: const EdgeInsets.all(14.0), - child: Text( - '${accounts[index].username} - ${accounts[index].url}', - overflow: TextOverflow.ellipsis, - ), - )), - ), - ), - ); - }, - ), - floatingActionButton: FloatingActionButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const AddAccountPage()), - ); - }, - tooltip: 'Add new account', - foregroundColor: Theme.of(context).primaryColor, - backgroundColor: Colors.lightBlue, - shape: const CircleBorder(), - child: const Icon(Icons.add), - ), - ); - } -} diff --git a/linux/.gitignore b/linux/.gitignore deleted file mode 100644 index d3896c9..0000000 --- a/linux/.gitignore +++ /dev/null @@ -1 +0,0 @@ -flutter/ephemeral diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt deleted file mode 100644 index fb3ed83..0000000 --- a/linux/CMakeLists.txt +++ /dev/null @@ -1,145 +0,0 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.10) -project(runner LANGUAGES CXX) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "bewcloud_mobile") -# The unique GTK application identifier for this application. See: -# https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "com.example.bewcloud_mobile") - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(SET CMP0063 NEW) - -# Load bundled libraries from the lib/ directory relative to the binary. -set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") - -# Root filesystem for cross-building. -if(FLUTTER_TARGET_PLATFORM_SYSROOT) - set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) - set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -endif() - -# Define build configuration options. -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() - -# Compilation settings that should be applied to most targets. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_14) - target_compile_options(${TARGET} PRIVATE -Wall -Werror) - target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") - target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") -endfunction() - -# Flutter library and tool build rules. -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) - -add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") - -# Define the application target. To change its name, change BINARY_NAME above, -# not the value here, or `flutter run` will no longer work. -# -# Any new source files that you add to the application should be added here. -add_executable(${BINARY_NAME} - "main.cc" - "my_application.cc" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add dependency libraries. Add any application-specific dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter) -target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) - -# Only the install-generated bundle's copy of the executable will launch -# correctly, since the resources must in the right relative locations. To avoid -# people trying to run the unbundled copy, put it in a subdirectory instead of -# the default top-level location. -set_target_properties(${BINARY_NAME} - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" -) - - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) - - -# === Installation === -# By default, "installing" just makes a relocatable bundle in the build -# directory. -set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) -endif() - -# Start with a clean build bundle directory every time. -install(CODE " - file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") - " COMPONENT Runtime) - -set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") -set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") - -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) - -foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) - install(FILES "${bundled_library}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endforeach(bundled_library) - -# Copy the native assets provided by the build.dart from all packages. -set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") -install(DIRECTORY "${NATIVE_ASSETS_DIR}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -# 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. -if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") - install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt deleted file mode 100644 index d5bd016..0000000 --- a/linux/flutter/CMakeLists.txt +++ /dev/null @@ -1,88 +0,0 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.10) - -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. - -# Serves the same purpose as list(TRANSFORM ... PREPEND ...), -# which isn't available in 3.10. -function(list_prepend LIST_NAME PREFIX) - set(NEW_LIST "") - foreach(element ${${LIST_NAME}}) - list(APPEND NEW_LIST "${PREFIX}${element}") - endforeach(element) - set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) -endfunction() - -# === Flutter Library === -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) -pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) -pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) - -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") - -# 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/lib/libapp.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "fl_basic_message_channel.h" - "fl_binary_codec.h" - "fl_binary_messenger.h" - "fl_dart_project.h" - "fl_engine.h" - "fl_json_message_codec.h" - "fl_json_method_codec.h" - "fl_message_codec.h" - "fl_method_call.h" - "fl_method_channel.h" - "fl_method_codec.h" - "fl_method_response.h" - "fl_plugin_registrar.h" - "fl_plugin_registry.h" - "fl_standard_message_codec.h" - "fl_standard_method_codec.h" - "fl_string_codec.h" - "fl_value.h" - "fl_view.h" - "flutter_linux.h" -) -list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") -target_link_libraries(flutter INTERFACE - PkgConfig::GTK - PkgConfig::GLIB - PkgConfig::GIO -) -add_dependencies(flutter 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. -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CMAKE_CURRENT_BINARY_DIR}/_phony_ - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" - ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} -) diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc deleted file mode 100644 index e71a16d..0000000 --- a/linux/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,11 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - - -void fl_register_plugins(FlPluginRegistry* registry) { -} diff --git a/linux/flutter/generated_plugin_registrant.h b/linux/flutter/generated_plugin_registrant.h deleted file mode 100644 index e0f0a47..0000000 --- a/linux/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void fl_register_plugins(FlPluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake deleted file mode 100644 index 2e1de87..0000000 --- a/linux/flutter/generated_plugins.cmake +++ /dev/null @@ -1,23 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux 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) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/linux/main.cc b/linux/main.cc deleted file mode 100644 index e7c5c54..0000000 --- a/linux/main.cc +++ /dev/null @@ -1,6 +0,0 @@ -#include "my_application.h" - -int main(int argc, char** argv) { - g_autoptr(MyApplication) app = my_application_new(); - return g_application_run(G_APPLICATION(app), argc, argv); -} diff --git a/linux/my_application.cc b/linux/my_application.cc deleted file mode 100644 index b93ca1f..0000000 --- a/linux/my_application.cc +++ /dev/null @@ -1,124 +0,0 @@ -#include "my_application.h" - -#include -#ifdef GDK_WINDOWING_X11 -#include -#endif - -#include "flutter/generated_plugin_registrant.h" - -struct _MyApplication { - GtkApplication parent_instance; - char** dart_entrypoint_arguments; -}; - -G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) - -// Implements GApplication::activate. -static void my_application_activate(GApplication* application) { - MyApplication* self = MY_APPLICATION(application); - GtkWindow* window = - GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); - - // Use a header bar when running in GNOME as this is the common style used - // by applications and is the setup most users will be using (e.g. Ubuntu - // desktop). - // If running on X and not using GNOME then just use a traditional title bar - // in case the window manager does more exotic layout, e.g. tiling. - // If running on Wayland assume the header bar will work (may need changing - // if future cases occur). - gboolean use_header_bar = TRUE; -#ifdef GDK_WINDOWING_X11 - GdkScreen* screen = gtk_window_get_screen(window); - if (GDK_IS_X11_SCREEN(screen)) { - const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); - if (g_strcmp0(wm_name, "GNOME Shell") != 0) { - use_header_bar = FALSE; - } - } -#endif - if (use_header_bar) { - GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); - gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "bewcloud_mobile"); - gtk_header_bar_set_show_close_button(header_bar, TRUE); - gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); - } else { - gtk_window_set_title(window, "bewcloud_mobile"); - } - - gtk_window_set_default_size(window, 1280, 720); - gtk_widget_show(GTK_WIDGET(window)); - - g_autoptr(FlDartProject) project = fl_dart_project_new(); - fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); - - FlView* view = fl_view_new(project); - gtk_widget_show(GTK_WIDGET(view)); - gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); - - fl_register_plugins(FL_PLUGIN_REGISTRY(view)); - - gtk_widget_grab_focus(GTK_WIDGET(view)); -} - -// Implements GApplication::local_command_line. -static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { - MyApplication* self = MY_APPLICATION(application); - // Strip out the first argument as it is the binary name. - self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); - - g_autoptr(GError) error = nullptr; - if (!g_application_register(application, nullptr, &error)) { - g_warning("Failed to register: %s", error->message); - *exit_status = 1; - return TRUE; - } - - g_application_activate(application); - *exit_status = 0; - - return TRUE; -} - -// Implements GApplication::startup. -static void my_application_startup(GApplication* application) { - //MyApplication* self = MY_APPLICATION(object); - - // Perform any actions required at application startup. - - G_APPLICATION_CLASS(my_application_parent_class)->startup(application); -} - -// Implements GApplication::shutdown. -static void my_application_shutdown(GApplication* application) { - //MyApplication* self = MY_APPLICATION(object); - - // Perform any actions required at application shutdown. - - G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); -} - -// Implements GObject::dispose. -static void my_application_dispose(GObject* object) { - MyApplication* self = MY_APPLICATION(object); - g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); - G_OBJECT_CLASS(my_application_parent_class)->dispose(object); -} - -static void my_application_class_init(MyApplicationClass* klass) { - G_APPLICATION_CLASS(klass)->activate = my_application_activate; - G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; - G_APPLICATION_CLASS(klass)->startup = my_application_startup; - G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; - G_OBJECT_CLASS(klass)->dispose = my_application_dispose; -} - -static void my_application_init(MyApplication* self) {} - -MyApplication* my_application_new() { - return MY_APPLICATION(g_object_new(my_application_get_type(), - "application-id", APPLICATION_ID, - "flags", G_APPLICATION_NON_UNIQUE, - nullptr)); -} diff --git a/linux/my_application.h b/linux/my_application.h deleted file mode 100644 index 72271d5..0000000 --- a/linux/my_application.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef FLUTTER_MY_APPLICATION_H_ -#define FLUTTER_MY_APPLICATION_H_ - -#include - -G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, - GtkApplication) - -/** - * my_application_new: - * - * Creates a new Flutter-based application. - * - * Returns: a new #MyApplication. - */ -MyApplication* my_application_new(); - -#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/macos/.gitignore b/macos/.gitignore deleted file mode 100644 index 746adbb..0000000 --- a/macos/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# Flutter-related -**/Flutter/ephemeral/ -**/Pods/ - -# Xcode-related -**/dgph -**/xcuserdata/ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig deleted file mode 100644 index 4b81f9b..0000000 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#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 deleted file mode 100644 index 5caa9d1..0000000 --- a/macos/Flutter/Flutter-Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#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 deleted file mode 100644 index 47ced00..0000000 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// Generated file. Do not edit. -// - -import FlutterMacOS -import Foundation - -import flutter_local_notifications -import path_provider_foundation -import photo_manager -import shared_preferences_foundation - -func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) - PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) - PhotoManagerPlugin.register(with: registry.registrar(forPlugin: "PhotoManagerPlugin")) - SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) -} diff --git a/macos/Podfile b/macos/Podfile deleted file mode 100644 index c795730..0000000 --- a/macos/Podfile +++ /dev/null @@ -1,43 +0,0 @@ -platform :osx, '10.14' - -# 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__)) - target 'RunnerTests' do - inherit! :search_paths - end -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 deleted file mode 100644 index 75c266a..0000000 --- a/macos/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,705 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - 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 */ - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; - 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 */ - 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 33CC10E52044A3C60003C045 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 33CC10EC2044A3C60003C045; - remoteInfo = Runner; - }; - 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 */ - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 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 /* bewcloud_mobile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "bewcloud_mobile.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 */ - 331C80D2294CF70F00263BE5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10EA2044A3C60003C045 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 331C80D6294CF71000263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C80D7294CF71000263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 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 */, - 331C80D6294CF71000263BE5 /* RunnerTests */, - 33CC10EE2044A3C60003C045 /* Products */, - D73912EC22F37F3D000D13A0 /* Frameworks */, - ); - sourceTree = ""; - }; - 33CC10EE2044A3C60003C045 /* Products */ = { - isa = PBXGroup; - children = ( - 33CC10ED2044A3C60003C045 /* bewcloud_mobile.app */, - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, - ); - 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 */ - 331C80D4294CF70F00263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - 331C80D1294CF70F00263BE5 /* Sources */, - 331C80D2294CF70F00263BE5 /* Frameworks */, - 331C80D3294CF70F00263BE5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 331C80DA294CF71000263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 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 /* bewcloud_mobile.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 33CC10E52044A3C60003C045 /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = YES; - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C80D4294CF70F00263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 33CC10EC2044A3C60003C045; - }; - 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 */, - 331C80D4294CF70F00263BE5 /* RunnerTests */, - 33CC111A2044C6BA0003C045 /* Flutter Assemble */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C80D3294CF70F00263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 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; - alwaysOutOfDate = 1; - 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 */ - 331C80D1294CF70F00263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 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 */ - 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC10EC2044A3C60003C045 /* Runner */; - targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; - }; - 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 */ - 331C80DB294CF71000263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.bewcloudMobile.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/bewcloud_mobile.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/bewcloud_mobile"; - }; - name = Debug; - }; - 331C80DC294CF71000263BE5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.bewcloudMobile.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/bewcloud_mobile.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/bewcloud_mobile"; - }; - name = Release; - }; - 331C80DD294CF71000263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.bewcloudMobile.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/bewcloud_mobile.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/bewcloud_mobile"; - }; - name = Profile; - }; - 338D0CE9231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - 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; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - 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.14; - 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; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - 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; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - 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.14; - 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; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - 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; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - 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.14; - 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 */ - 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C80DB294CF71000263BE5 /* Debug */, - 331C80DC294CF71000263BE5 /* Release */, - 331C80DD294CF71000263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 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 deleted file mode 100644 index 18d9810..0000000 --- a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index fa75f47..0000000 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a1..0000000 --- a/macos/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift deleted file mode 100644 index d53ef64..0000000 --- a/macos/Runner/AppDelegate.swift +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 96d3fee..0000000 --- a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "info": { - "version": 1, - "author": "xcode" - }, - "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" - } - ] -} \ No newline at end of file diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png deleted file mode 100644 index a2eee2a7180d697f776fc3e3a25365ede2bd3da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29956 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 JPDHLkV1lQxz~le` diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png deleted file mode 100644 index a14b4f7341887d712926bc4b4f976cf9b09edf05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7124 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 N002ovPDHLkV1m;0a!UXJ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png deleted file mode 100644 index c8ca321945676b0b5dd23f867ea1ea3127a9a82e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14464 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig deleted file mode 100644 index df9341c..0000000 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -// 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 = bewcloud_mobile - -// The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = com.example.bewcloudMobile - -// The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig deleted file mode 100644 index 36b0fd9..0000000 --- a/macos/Runner/Configs/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../Flutter/Flutter-Debug.xcconfig" -#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig deleted file mode 100644 index dff4f49..0000000 --- a/macos/Runner/Configs/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../Flutter/Flutter-Release.xcconfig" -#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig deleted file mode 100644 index 42bcbf4..0000000 --- a/macos/Runner/Configs/Warnings.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index 1829c22..0000000 --- a/macos/Runner/DebugProfile.entitlements +++ /dev/null @@ -1,15 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.cs.allow-jit - - com.apple.security.network.server - - - com.apple.security.network.client - - - diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist deleted file mode 100644 index 4789daa..0000000 --- a/macos/Runner/Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - 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 deleted file mode 100644 index 3cc05eb..0000000 --- a/macos/Runner/MainFlutterWindow.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Cocoa -import FlutterMacOS - -class MainFlutterWindow: NSWindow { - override func awakeFromNib() { - let flutterViewController = FlutterViewController() - 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 deleted file mode 100644 index 8449f3f..0000000 --- a/macos/Runner/Release.entitlements +++ /dev/null @@ -1,11 +0,0 @@ - - - - - com.apple.security.app-sandbox - - - com.apple.security.network.client - - - diff --git a/macos/RunnerTests/RunnerTests.swift b/macos/RunnerTests/RunnerTests.swift deleted file mode 100644 index 5418c9f..0000000 --- a/macos/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import FlutterMacOS -import Cocoa -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/pubspec.lock b/pubspec.lock deleted file mode 100644 index 4b64c3f..0000000 --- a/pubspec.lock +++ /dev/null @@ -1,650 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - archive: - dependency: transitive - description: - name: archive - sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" - url: "https://pub.dev" - source: hosted - version: "3.4.10" - args: - dependency: transitive - description: - name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 - url: "https://pub.dev" - source: hosted - version: "2.4.2" - asn1lib: - dependency: transitive - description: - name: asn1lib - sha256: c9c85fedbe2188b95133cbe960e16f5f448860f7133330e272edbbca5893ddc6 - url: "https://pub.dev" - source: hosted - version: "1.5.2" - 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" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" - cli_util: - dependency: transitive - description: - name: cli_util - sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 - url: "https://pub.dev" - source: hosted - version: "0.4.1" - 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" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" - url: "https://pub.dev" - source: hosted - version: "0.3.4+1" - crypto: - dependency: transitive - description: - name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.dev" - source: hosted - version: "3.0.3" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d - url: "https://pub.dev" - source: hosted - version: "1.0.6" - dbus: - dependency: transitive - description: - name: dbus - sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" - url: "https://pub.dev" - source: hosted - version: "0.7.11" - encrypt: - dependency: "direct main" - description: - name: encrypt - sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" - url: "https://pub.dev" - source: hosted - version: "5.0.3" - 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: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - file: - dependency: transitive - description: - name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" - url: "https://pub.dev" - source: hosted - version: "7.0.0" - file_picker: - dependency: "direct main" - description: - name: file_picker - sha256: d1d0ac3966b36dc3e66eeefb40280c17feb87fa2099c6e22e6a1fc959327bd03 - url: "https://pub.dev" - source: hosted - version: "8.0.0+1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_dotenv: - dependency: "direct main" - description: - name: flutter_dotenv - sha256: "9357883bdd153ab78cbf9ffa07656e336b8bbb2b5a3ca596b0b27e119f7c7d77" - url: "https://pub.dev" - source: hosted - version: "5.1.0" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" - url: "https://pub.dev" - source: hosted - version: "0.13.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - flutter_local_notifications: - dependency: "direct main" - description: - name: flutter_local_notifications - sha256: "674173fd3c9eda9d4c8528da2ce0ea69f161577495a9cc835a2a4ecd7eadeb35" - url: "https://pub.dev" - source: hosted - version: "17.2.4" - flutter_local_notifications_linux: - dependency: transitive - description: - name: flutter_local_notifications_linux - sha256: c49bd06165cad9beeb79090b18cd1eb0296f4bf4b23b84426e37dd7c027fc3af - url: "https://pub.dev" - source: hosted - version: "4.0.1" - flutter_local_notifications_platform_interface: - dependency: transitive - description: - name: flutter_local_notifications_platform_interface - sha256: "85f8d07fe708c1bdcf45037f2c0109753b26ae077e9d9e899d55971711a4ea66" - url: "https://pub.dev" - source: hosted - version: "7.2.0" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: "592dc01a18961a51c24ae5d963b724b2b7fa4a95c100fe8eb6ca8a5a4732cadf" - url: "https://pub.dev" - source: hosted - version: "2.0.18" - 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: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" - url: "https://pub.dev" - source: hosted - version: "1.2.1" - 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: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" - url: "https://pub.dev" - source: hosted - version: "4.1.7" - intl: - dependency: "direct main" - description: - name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.dev" - source: hosted - version: "0.19.0" - js: - dependency: transitive - description: - name: js - sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf - url: "https://pub.dev" - source: hosted - version: "0.7.1" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 - url: "https://pub.dev" - source: hosted - version: "4.8.1" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" - url: "https://pub.dev" - source: hosted - version: "10.0.0" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 - url: "https://pub.dev" - source: hosted - version: "2.0.1" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 - url: "https://pub.dev" - source: hosted - version: "2.0.1" - lints: - dependency: transitive - description: - name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 - url: "https://pub.dev" - source: hosted - version: "3.0.0" - 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: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" - url: "https://pub.dev" - source: hosted - version: "0.8.0" - meta: - dependency: transitive - description: - name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 - url: "https://pub.dev" - source: hosted - version: "1.11.0" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - path: - dependency: transitive - description: - name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.dev" - source: hosted - version: "1.9.0" - path_provider: - dependency: "direct main" - description: - name: path_provider - sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b - url: "https://pub.dev" - source: hosted - version: "2.1.2" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: "51f0d2c554cfbc9d6a312ab35152fc77e2f0b758ce9f1a444a3a1e5b8f3c6b7f" - url: "https://pub.dev" - source: hosted - version: "2.2.3" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - 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: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" - url: "https://pub.dev" - source: hosted - version: "2.2.1" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.dev" - source: hosted - version: "6.0.2" - photo_manager: - dependency: "direct main" - description: - name: photo_manager - sha256: df594f989f0c31cdb3ed48f3d49cb9ffadf11cc3700d2c3460b1912c93432621 - url: "https://pub.dev" - source: hosted - version: "3.0.0" - platform: - dependency: transitive - description: - name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" - url: "https://pub.dev" - source: hosted - version: "3.1.4" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "70fe966348fe08c34bf929582f1d8247d9d9408130723206472b4687227e4333" - url: "https://pub.dev" - source: hosted - version: "3.8.0" - prompt_dialog: - dependency: "direct main" - description: - name: prompt_dialog - sha256: de171ecb5b7df70a7776657390e266a4638f4387e5a758065433e6c9e5211756 - url: "https://pub.dev" - source: hosted - version: "1.0.15" - provider: - dependency: "direct main" - description: - name: provider - sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c - url: "https://pub.dev" - source: hosted - version: "6.1.2" - shared_preferences: - dependency: "direct main" - description: - name: shared_preferences - sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" - url: "https://pub.dev" - source: hosted - version: "2.2.2" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" - url: "https://pub.dev" - source: hosted - version: "2.2.1" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" - url: "https://pub.dev" - source: hosted - version: "2.3.5" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" - url: "https://pub.dev" - source: hosted - version: "2.3.0" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - 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" - 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" - 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: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" - url: "https://pub.dev" - source: hosted - version: "0.6.1" - timezone: - dependency: transitive - description: - name: timezone - sha256: "2236ec079a174ce07434e89fcd3fcda430025eb7692244139a9cf54fdcf1fc7d" - url: "https://pub.dev" - source: hosted - version: "0.9.4" - 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: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 - url: "https://pub.dev" - source: hosted - version: "13.0.0" - web: - dependency: transitive - description: - name: web - sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" - url: "https://pub.dev" - source: hosted - version: "0.5.1" - win32: - dependency: transitive - description: - name: win32 - sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" - url: "https://pub.dev" - source: hosted - version: "5.4.0" - workmanager: - dependency: "direct main" - description: - name: workmanager - sha256: ed13530cccd28c5c9959ad42d657cd0666274ca74c56dea0ca183ddd527d3a00 - url: "https://pub.dev" - source: hosted - version: "0.5.2" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d - url: "https://pub.dev" - source: hosted - version: "1.0.4" - 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.3.3 <4.0.0" - flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml deleted file mode 100644 index d385941..0000000 --- a/pubspec.yaml +++ /dev/null @@ -1,57 +0,0 @@ -name: bewcloud -description: "bewCloud WebDav client" -publish_to: 'none' - - -version: 0.1.1+1 - -environment: - sdk: '>=3.3.3 <4.0.0' - - -dependencies: - flutter: - sdk: flutter - - provider: ^6.0.0 - cupertino_icons: ^1.0.6 - encrypt: ^5.0.3 - flutter_dotenv: ^5.1.0 - path_provider: ^2.1.2 - shared_preferences: ^2.2.2 - http: ^1.2.1 - intl: ^0.19.0 - file_picker: ^8.0.0+1 - prompt_dialog: ^1.0.15 - workmanager: ^0.5.2 - photo_manager: ^3.0.0 - flutter_local_notifications: ^17.1.2 - -dev_dependencies: - flutter_test: - sdk: flutter - - flutter_lints: ^3.0.0 - flutter_launcher_icons: ^0.13.1 - -flutter: - uses-material-design: true - - assets: - - "assets/images/app-icon.png" - - ".env" - -flutter_launcher_icons: - android: "launcher_icon" - ios: true - image_path: "assets/images/app-icon.png" - min_sdk_android: 21 - web: - generate: true - background_color: "#111111" - theme_color: "#111111" - windows: - generate: true - icon_size: 256 - macos: - generate: true diff --git a/test/widget_test.dart b/test/widget_test.dart deleted file mode 100644 index 62a6081..0000000 --- a/test/widget_test.dart +++ /dev/null @@ -1,25 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:bewcloud/main.dart'; - -void main() { - testWidgets('Basic app smoke test', (WidgetTester tester) async { - await tester.pumpWidget(const MyApp()); - - expect(find.text('Files'), findsOneWidget); - expect(find.text('Delete'), findsNothing); - - await tester.tap(find.byIcon(Icons.settings)); - await tester.pump(); - - expect(find.text('No accounts found. Add a new one below!'), findsOneWidget); - }); -} diff --git a/web/favicon.png b/web/favicon.png deleted file mode 100644 index 903eeb928eb7b869383c80b62e4e33b5fea0c839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmV;Q0bu@#P)re2~9xcBbA-k}Ho zqWis>^|)9Wzkd1kpRZ)w-?RJg{Y!lNjX_#VjPY=`1yiaZC*w;D173dlFTdi_za}Fo z#_b@@ATb^`#!qglOfxk_8IP!oGMw6Q?SJ9qIWc>q81Ulre}%?rurf3Jc=X}F-sIzd=V1#h5cvIM|8_YROo=Fg2r{kJjoI$j>;G23 zgw2S{047F;KglLc`TQJ=Z%_;X0Rf<(nJnWbT$*u#L7bF{1pr%7a>U{}Wj_D_002ov JPDHLkV1lQxz~le` diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png deleted file mode 100644 index 8dd28e2bc81713be09ea372c576f26486dde8e37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5271 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 EA2_!Wg8%>k diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png deleted file mode 100644 index c8ca321945676b0b5dd23f867ea1ea3127a9a82e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14464 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 EA2_!Wg8%>k diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png deleted file mode 100644 index c8ca321945676b0b5dd23f867ea1ea3127a9a82e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14464 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 - - - - - - - - - - - - - - - - - - - bewcloud_mobile - - - - - - - - - - diff --git a/web/manifest.json b/web/manifest.json deleted file mode 100644 index 4646fd0..0000000 --- a/web/manifest.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "bewcloud_mobile", - "short_name": "bewcloud_mobile", - "start_url": ".", - "display": "standalone", - "background_color": "#111111", - "theme_color": "#111111", - "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" - } - ] -} \ No newline at end of file diff --git a/windows/.gitignore b/windows/.gitignore deleted file mode 100644 index d492d0d..0000000 --- a/windows/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index 95608b5..0000000 --- a/windows/CMakeLists.txt +++ /dev/null @@ -1,108 +0,0 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.14) -project(bewcloud_mobile LANGUAGES CXX) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "bewcloud_mobile") - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(VERSION 3.14...3.25) - -# Define build configuration option. -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() -# Define settings for the Profile build mode. -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. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -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() - -# Flutter library and tool build rules. -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# Application build; see runner/CMakeLists.txt. -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() - -# Copy the native assets provided by the build.dart from all packages. -set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") -install(DIRECTORY "${NATIVE_ASSETS_DIR}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -# 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 deleted file mode 100644 index 903f489..0000000 --- a/windows/flutter/CMakeLists.txt +++ /dev/null @@ -1,109 +0,0 @@ -# This file controls Flutter-level build steps. It should not be edited. -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") - -# Set fallback configurations for older versions of the flutter tool. -if (NOT DEFINED FLUTTER_TARGET_PLATFORM) - set(FLUTTER_TARGET_PLATFORM "windows-x64") -endif() - -# === 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" - ${FLUTTER_TARGET_PLATFORM} $ - 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 deleted file mode 100644 index 8b6d468..0000000 --- a/windows/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,11 +0,0 @@ -// -// 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 deleted file mode 100644 index dc139d8..0000000 --- a/windows/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// 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 deleted file mode 100644 index b93c4c3..0000000 --- a/windows/flutter/generated_plugins.cmake +++ /dev/null @@ -1,23 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST -) - -list(APPEND FLUTTER_FFI_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) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt deleted file mode 100644 index 394917c..0000000 --- a/windows/runner/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(runner LANGUAGES CXX) - -# Define the application target. To change its name, change BINARY_NAME in the -# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer -# work. -# -# Any new source files that you add to the application should be added here. -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 the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add preprocessor definitions for the build version. -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") - -# Disable Windows macros that collide with C++ standard library functions. -target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") - -# Add dependency libraries and include directories. Add any application-specific -# dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) -target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") -target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc deleted file mode 100644 index bb5295d..0000000 --- a/windows/runner/Runner.rc +++ /dev/null @@ -1,121 +0,0 @@ -// 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 -// - -#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) -#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD -#else -#define VERSION_AS_NUMBER 1,0,0,0 -#endif - -#if defined(FLUTTER_VERSION) -#define VERSION_AS_STRING FLUTTER_VERSION -#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", "bewcloud_mobile" "\0" - VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "bewcloud_mobile" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" - VALUE "OriginalFilename", "bewcloud_mobile.exe" "\0" - VALUE "ProductName", "bewcloud_mobile" "\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 deleted file mode 100644 index 955ee30..0000000 --- a/windows/runner/flutter_window.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#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()); - - flutter_controller_->engine()->SetNextFrameCallback([&]() { - this->Show(); - }); - - // Flutter can complete the first frame before the "show window" callback is - // registered. The following call ensures a frame is pending to ensure the - // window is shown. It is a no-op if the first frame hasn't completed yet. - flutter_controller_->ForceRedraw(); - - 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 deleted file mode 100644 index 6da0652..0000000 --- a/windows/runner/flutter_window.h +++ /dev/null @@ -1,33 +0,0 @@ -#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 deleted file mode 100644 index b1f267d..0000000 --- a/windows/runner/main.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#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.Create(L"bewcloud_mobile", 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 deleted file mode 100644 index 66a65d1..0000000 --- a/windows/runner/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -//{{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 deleted file mode 100644 index c2306c3e3037ec1949847543bf71ede61cd2d467..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7146 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 DcCRZg diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest deleted file mode 100644 index a42ea76..0000000 --- a/windows/runner/runner.exe.manifest +++ /dev/null @@ -1,20 +0,0 @@ - - - - - PerMonitorV2 - - - - - - - - - - - - - - - diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp deleted file mode 100644 index b2b0873..0000000 --- a/windows/runner/utils.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#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) - -1; // remove the trailing null character - int input_length = (int)wcslen(utf16_string); - std::string utf8_string; - if (target_length <= 0 || target_length > utf8_string.max_size()) { - return utf8_string; - } - utf8_string.resize(target_length); - int converted_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - input_length, 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 deleted file mode 100644 index 3879d54..0000000 --- a/windows/runner/utils.h +++ /dev/null @@ -1,19 +0,0 @@ -#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 deleted file mode 100644 index 60608d0..0000000 --- a/windows/runner/win32_window.cpp +++ /dev/null @@ -1,288 +0,0 @@ -#include "win32_window.h" - -#include -#include - -#include "resource.h" - -namespace { - -/// Window attribute that enables dark mode window decorations. -/// -/// Redefined in case the developer's machine has a Windows SDK older than -/// version 10.0.22000.0. -/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute -#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE -#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 -#endif - -constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; - -/// Registry key for app theme preference. -/// -/// A value of 0 indicates apps should use dark mode. A non-zero or missing -/// value indicates apps should use light mode. -constexpr const wchar_t kGetPreferredBrightnessRegKey[] = - L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; -constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; - -// 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 registrar 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::Create(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, - 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; - } - - UpdateTheme(window); - - return OnCreate(); -} - -bool Win32Window::Show() { - return ShowWindow(window_handle_, SW_SHOWNORMAL); -} - -// 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; - - case WM_DWMCOLORIZATIONCOLORCHANGED: - UpdateTheme(hwnd); - 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. -} - -void Win32Window::UpdateTheme(HWND const window) { - DWORD light_mode; - DWORD light_mode_size = sizeof(light_mode); - LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, - kGetPreferredBrightnessRegValue, - RRF_RT_REG_DWORD, nullptr, &light_mode, - &light_mode_size); - - if (result == ERROR_SUCCESS) { - BOOL enable_dark_mode = light_mode == 0; - DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, - &enable_dark_mode, sizeof(enable_dark_mode)); - } -} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h deleted file mode 100644 index e901dde..0000000 --- a/windows/runner/win32_window.h +++ /dev/null @@ -1,102 +0,0 @@ -#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 a win32 window with |title| that is positioned and sized 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 this function will scale the inputted width and height as - // as appropriate for the default monitor. The window is invisible until - // |Show| is called. Returns true if the window was created successfully. - bool Create(const std::wstring& title, const Point& origin, const Size& size); - - // Show the current window. Returns true if the window was successfully shown. - bool Show(); - - // 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 - // responds 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; - - // Update the window frame's theme to match the system theme. - static void UpdateTheme(HWND const window); - - 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_