diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ca11750..b7b8163 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,5 +26,6 @@ jobs: uses: TokTok/ci-tools/.github/workflows/flutter.yml@master with: project-name: btox + flutter-version: "3.38.9" secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 2a1630a..5ccc1bc 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -11,3 +11,4 @@ jobs: uses: TokTok/ci-tools/.github/workflows/flutter-pages.yml@master with: project-name: btox + flutter-version: "3.38.9" diff --git a/.metadata b/.metadata index b4fb385..26d3e69 100644 --- a/.metadata +++ b/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: "35c388afb57ef061d06a39b537336c87e0e3d1b1" + revision: "67323de285b00232883f53b84095eb72be97d35c" channel: "stable" project_type: app @@ -13,11 +13,26 @@ project_type: app migration: platforms: - platform: root - create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 - base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + create_revision: 67323de285b00232883f53b84095eb72be97d35c + base_revision: 67323de285b00232883f53b84095eb72be97d35c + - platform: android + create_revision: 67323de285b00232883f53b84095eb72be97d35c + base_revision: 67323de285b00232883f53b84095eb72be97d35c - platform: ios - create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 - base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + create_revision: 67323de285b00232883f53b84095eb72be97d35c + base_revision: 67323de285b00232883f53b84095eb72be97d35c + - platform: linux + create_revision: 67323de285b00232883f53b84095eb72be97d35c + base_revision: 67323de285b00232883f53b84095eb72be97d35c + - platform: macos + create_revision: 67323de285b00232883f53b84095eb72be97d35c + base_revision: 67323de285b00232883f53b84095eb72be97d35c + - platform: web + create_revision: 67323de285b00232883f53b84095eb72be97d35c + base_revision: 67323de285b00232883f53b84095eb72be97d35c + - platform: windows + create_revision: 67323de285b00232883f53b84095eb72be97d35c + base_revision: 67323de285b00232883f53b84095eb72be97d35c # User provided section diff --git a/.netlify/Dockerfile b/.netlify/Dockerfile index fc9592b..10ee95b 100644 --- a/.netlify/Dockerfile +++ b/.netlify/Dockerfile @@ -1,4 +1,4 @@ -FROM toxchat/flutter-web:latest +FROM ghcr.io/toktok/flutter-web:latest ARG TARGET=release diff --git a/.restyled.yaml b/.restyled.yaml index 57e6161..fbf47f8 100644 --- a/.restyled.yaml +++ b/.restyled.yaml @@ -10,8 +10,3 @@ exclude: - "windows/**/*.cc" - "windows/**/*.cpp" - "windows/**/*.h" - -restylers: - - name: dart-format - image: "public.ecr.aws/restyled-io/restyler-dart-format:v2.3" - - name: "*" diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index b458f50..fab7f09 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 468acaa..adb93a8 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index db3456f..fca25ea 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 2bc35a7..e44d32f 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 32ee218..ec896d3 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 89176ef..dbee657 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -5,7 +5,10 @@ allprojects { } } -val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +val newBuildDir: Directory = + rootProject.layout.buildDirectory + .dir("../../build") + .get() rootProject.layout.buildDirectory.value(newBuildDir) subprojects { diff --git a/android/gradle.properties b/android/gradle.properties index f018a61..fbee1d8 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,2 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true -android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index afa1e8e..e4ef43f 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index a439442..ca7fe06 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -1,11 +1,12 @@ pluginManagement { - val flutterSdkPath = run { - val properties = java.util.Properties() - file("local.properties").inputStream().use { properties.load(it) } - val flutterSdkPath = properties.getProperty("flutter.sdk") - require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } - flutterSdkPath - } + val flutterSdkPath = + run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") @@ -18,8 +19,8 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.7.0" apply false - id("org.jetbrains.kotlin.android") version "1.8.22" apply false + id("com.android.application") version "8.11.1" apply false + id("org.jetbrains.kotlin.android") version "2.2.20" apply false } include(":app") diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 7c56964..1dc6cf7 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 12.0 + 13.0 diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index ec97fc6..592ceee 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index c4855bf..592ceee 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1,2 +1 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index a57a405..0000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,109 +0,0 @@ -PODS: - - DKImagePickerController/Core (4.3.9): - - DKImagePickerController/ImageDataManager - - DKImagePickerController/Resource - - DKImagePickerController/ImageDataManager (4.3.9) - - DKImagePickerController/PhotoGallery (4.3.9): - - DKImagePickerController/Core - - DKPhotoGallery - - DKImagePickerController/Resource (4.3.9) - - DKPhotoGallery (0.0.19): - - DKPhotoGallery/Core (= 0.0.19) - - DKPhotoGallery/Model (= 0.0.19) - - DKPhotoGallery/Preview (= 0.0.19) - - DKPhotoGallery/Resource (= 0.0.19) - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Core (0.0.19): - - DKPhotoGallery/Model - - DKPhotoGallery/Preview - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Model (0.0.19): - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Preview (0.0.19): - - DKPhotoGallery/Model - - DKPhotoGallery/Resource - - SDWebImage - - SwiftyGif - - DKPhotoGallery/Resource (0.0.19): - - SDWebImage - - SwiftyGif - - file_picker (0.0.1): - - DKImagePickerController/PhotoGallery - - Flutter - - Flutter (1.0.0) - - geolocator_apple (1.2.0): - - Flutter - - image_picker_ios (0.0.1): - - Flutter - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - SDWebImage (5.20.1): - - SDWebImage/Core (= 5.20.1) - - SDWebImage/Core (5.20.1) - - "sodium_libs (3.4.3+1)": - - Flutter - - FlutterMacOS - - SQLCipher (4.5.7): - - SQLCipher/standard (= 4.5.7) - - SQLCipher/common (4.5.7) - - SQLCipher/standard (4.5.7): - - SQLCipher/common - - sqlcipher_flutter_libs (0.0.1): - - Flutter - - SQLCipher (~> 4.5.7) - - SwiftyGif (5.4.5) - -DEPENDENCIES: - - file_picker (from `.symlinks/plugins/file_picker/ios`) - - Flutter (from `Flutter`) - - geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`) - - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - - sodium_libs (from `.symlinks/plugins/sodium_libs/darwin`) - - sqlcipher_flutter_libs (from `.symlinks/plugins/sqlcipher_flutter_libs/ios`) - -SPEC REPOS: - trunk: - - DKImagePickerController - - DKPhotoGallery - - SDWebImage - - SQLCipher - - SwiftyGif - -EXTERNAL SOURCES: - file_picker: - :path: ".symlinks/plugins/file_picker/ios" - Flutter: - :path: Flutter - geolocator_apple: - :path: ".symlinks/plugins/geolocator_apple/ios" - image_picker_ios: - :path: ".symlinks/plugins/image_picker_ios/ios" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/darwin" - sodium_libs: - :path: ".symlinks/plugins/sodium_libs/darwin" - sqlcipher_flutter_libs: - :path: ".symlinks/plugins/sqlcipher_flutter_libs/ios" - -SPEC CHECKSUMS: - DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c - DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 - file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be - Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - geolocator_apple: 1560c3c875af2a412242c7a923e15d0d401966ff - image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 - SDWebImage: 33d0f23bddeb5d209ae959153883247be6703713 - sodium_libs: d5a8c0ec38806fe1cff3caf98c8319378da0bc1d - SQLCipher: 5e6bfb47323635c8b657b1b27d25c5f1baf63bf5 - sqlcipher_flutter_libs: f2a2e9f25d0d392f97e6099126a337927b7ddd63 - SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 - -PODFILE CHECKSUM: 4305caec6b40dde0ae97be1573c53de1882a07e5 - -COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 89fd2dd..be71078 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -10,14 +10,10 @@ 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 */; }; - 581251DD50D493C67B632D8F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75EA28E047D5BDD2A041BC19 /* Pods_Runner.framework */; }; - 64ABA5772D6A2C300005B827 /* Tox.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 64ABA5752D6A2C250005B827 /* Tox.xcframework */; }; - 64ABA5782D6A2C300005B827 /* Tox.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 64ABA5752D6A2C250005B827 /* Tox.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 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 */; }; - B8748C889CDE424CA6902288 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DEF8C62564D68C02BAE9078C /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -37,7 +33,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 64ABA5782D6A2C300005B827 /* Tox.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -45,19 +40,14 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 098931EE07C88D0D9ED29B51 /* 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 = ""; }; 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 = ""; }; - 322CFF793F985619E34E432B /* 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 = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 64ABA5752D6A2C250005B827 /* Tox.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Tox.xcframework; 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 = ""; }; - 75EA28E047D5BDD2A041BC19 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 852DFB8801FA92EF3B3E563B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -65,46 +55,19 @@ 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 = ""; }; - 9FD718157A7953CAAEFA5740 /* 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 = ""; }; - B64B8A589EE83C1CE705A7A6 /* 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 = ""; }; - DBB9C4C3ABA25F02A6F0B689 /* 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 = ""; }; - DEF8C62564D68C02BAE9078C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 7AEF4066DE8D501EBBBDF2C0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - B8748C889CDE424CA6902288 /* Pods_RunnerTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 581251DD50D493C67B632D8F /* Pods_Runner.framework in Frameworks */, - 64ABA5772D6A2C300005B827 /* Tox.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0435D249EDAE5BD93DBDCAA8 /* Pods */ = { - isa = PBXGroup; - children = ( - 852DFB8801FA92EF3B3E563B /* Pods-Runner.debug.xcconfig */, - DBB9C4C3ABA25F02A6F0B689 /* Pods-Runner.release.xcconfig */, - 9FD718157A7953CAAEFA5740 /* Pods-Runner.profile.xcconfig */, - 098931EE07C88D0D9ED29B51 /* Pods-RunnerTests.debug.xcconfig */, - 322CFF793F985619E34E432B /* Pods-RunnerTests.release.xcconfig */, - B64B8A589EE83C1CE705A7A6 /* Pods-RunnerTests.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -131,8 +94,6 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, - 0435D249EDAE5BD93DBDCAA8 /* Pods */, - DC1657EF07301007B408DDEB /* Frameworks */, ); sourceTree = ""; }; @@ -160,16 +121,6 @@ path = Runner; sourceTree = ""; }; - DC1657EF07301007B408DDEB /* Frameworks */ = { - isa = PBXGroup; - children = ( - 75EA28E047D5BDD2A041BC19 /* Pods_Runner.framework */, - DEF8C62564D68C02BAE9078C /* Pods_RunnerTests.framework */, - 64ABA5752D6A2C250005B827 /* Tox.xcframework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -177,10 +128,8 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - EFB1907419A29450F856C7FD /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, - 7AEF4066DE8D501EBBBDF2C0 /* Frameworks */, ); buildRules = ( ); @@ -196,14 +145,12 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 50ECF00EB51D32188BF80721 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 8B239642564A7EEA9FB1E89D /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -291,45 +238,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 50ECF00EB51D32188BF80721 /* [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; - }; - 8B239642564A7EEA9FB1E89D /* [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; @@ -345,28 +253,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - EFB1907419A29450F856C7FD /* [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 */ @@ -460,7 +346,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -476,14 +362,13 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 83SSMZ4T7X; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = chat.tox.btox; + PRODUCT_BUNDLE_IDENTIFIER = com.example.btox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -493,14 +378,13 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 098931EE07C88D0D9ED29B51 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = chat.tox.btox.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.btox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -511,14 +395,13 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 322CFF793F985619E34E432B /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = chat.tox.btox.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.btox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -527,14 +410,13 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B64B8A589EE83C1CE705A7A6 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = chat.tox.btox.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.btox.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -590,7 +472,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -641,7 +523,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -659,14 +541,13 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 83SSMZ4T7X; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = chat.tox.btox; + PRODUCT_BUNDLE_IDENTIFIER = com.example.btox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -682,14 +563,13 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 83SSMZ4T7X; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = chat.tox.btox; + PRODUCT_BUNDLE_IDENTIFIER = com.example.btox; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 15cada4..e3773d4 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -26,6 +26,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit" shouldUseLaunchSchemeArgsEnv = "YES"> - - diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index e68e0fe..b3b6f09 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index ffd6f4c..e612313 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index b6d9f0a..ba7abe0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index 745e58f..ef2e376 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ 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 index 90cfe10..be9cffe 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ 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 index 6d799e4..57040d3 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 858e8e4..0bc0d48 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index b6d9f0a..ba7abe0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index b78c46e..1b18692 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index 584e307..6e1d393 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ 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 index 2f9d61a..e12f6ee 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ 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 index fcfe2df..f349d2d 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png index e715a02..b2c73a5 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ 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 index e1b5e56..1e9665b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index 584e307..6e1d393 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index d22c03a..e047d49 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ 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 index 9e00464..1916328 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ 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 index c9e4609..699027b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index 5fb0ab2..f2124c3 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 30f19ff..b64c53d 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index d9f7a89..d38309d 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/lib/api/toxcore/tox_events.dart b/lib/api/toxcore/tox_events.dart index 7acea77..7d14d6e 100644 --- a/lib/api/toxcore/tox_events.dart +++ b/lib/api/toxcore/tox_events.dart @@ -102,35 +102,31 @@ sealed class Event extends Packet { } static List unpackList(Unpacker unpacker) { - return List.unmodifiable(List.generate(unpacker.unpackListLength(), (_) { - ensure(unpacker.unpackListLength(), 2); - return Event.unpack( - unpacker, - Tox_Event_Type.fromValue(unpacker.unpackInt()!), - ); - })); + return List.unmodifiable( + List.generate(unpacker.unpackListLength(), (_) { + ensure(unpacker.unpackListLength(), 2); + return Event.unpack( + unpacker, + Tox_Event_Type.fromValue(unpacker.unpackInt()!), + ); + }), + ); } } @freezed -class ToxEventConferenceConnected extends Event +abstract class ToxEventConferenceConnected extends Event with _$ToxEventConferenceConnected { const ToxEventConferenceConnected._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) - const factory ToxEventConferenceConnected({ - required int conferenceNumber, - }) = _ToxEventConferenceConnected; + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) + const factory ToxEventConferenceConnected({required int conferenceNumber}) = + _ToxEventConferenceConnected; factory ToxEventConferenceConnected.fromJson(Map json) => _$ToxEventConferenceConnectedFromJson(json); factory ToxEventConferenceConnected.unpack(Unpacker unpacker) { - return ToxEventConferenceConnected( - conferenceNumber: unpacker.unpackInt()!, - ); + return ToxEventConferenceConnected(conferenceNumber: unpacker.unpackInt()!); } @override @@ -140,7 +136,8 @@ class ToxEventConferenceConnected extends Event } @freezed -class ToxEventConferenceInvite extends Event with _$ToxEventConferenceInvite { +abstract class ToxEventConferenceInvite extends Event + with _$ToxEventConferenceInvite { const ToxEventConferenceInvite._(); @JsonSerializable( explicitToJson: true, @@ -176,7 +173,8 @@ class ToxEventConferenceInvite extends Event with _$ToxEventConferenceInvite { } @freezed -class ToxEventConferenceMessage extends Event with _$ToxEventConferenceMessage { +abstract class ToxEventConferenceMessage extends Event + with _$ToxEventConferenceMessage { const ToxEventConferenceMessage._(); @JsonSerializable( explicitToJson: true, @@ -215,20 +213,17 @@ class ToxEventConferenceMessage extends Event with _$ToxEventConferenceMessage { } @freezed -class ToxEventConferencePeerListChanged extends Event +abstract class ToxEventConferencePeerListChanged extends Event with _$ToxEventConferencePeerListChanged { const ToxEventConferencePeerListChanged._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventConferencePeerListChanged({ required int conferenceNumber, }) = _ToxEventConferencePeerListChanged; factory ToxEventConferencePeerListChanged.fromJson( - Map json) => - _$ToxEventConferencePeerListChangedFromJson(json); + Map json, + ) => _$ToxEventConferencePeerListChangedFromJson(json); factory ToxEventConferencePeerListChanged.unpack(Unpacker unpacker) { return ToxEventConferencePeerListChanged( @@ -243,7 +238,7 @@ class ToxEventConferencePeerListChanged extends Event } @freezed -class ToxEventConferencePeerName extends Event +abstract class ToxEventConferencePeerName extends Event with _$ToxEventConferencePeerName { const ToxEventConferencePeerName._(); @JsonSerializable( @@ -280,7 +275,8 @@ class ToxEventConferencePeerName extends Event } @freezed -class ToxEventConferenceTitle extends Event with _$ToxEventConferenceTitle { +abstract class ToxEventConferenceTitle extends Event + with _$ToxEventConferenceTitle { const ToxEventConferenceTitle._(); @JsonSerializable( explicitToJson: true, @@ -316,7 +312,8 @@ class ToxEventConferenceTitle extends Event with _$ToxEventConferenceTitle { } @freezed -class ToxEventDhtNodesResponse extends Event with _$ToxEventDhtNodesResponse { +abstract class ToxEventDhtNodesResponse extends Event + with _$ToxEventDhtNodesResponse { const ToxEventDhtNodesResponse._(); @JsonSerializable( explicitToJson: true, @@ -352,12 +349,10 @@ class ToxEventDhtNodesResponse extends Event with _$ToxEventDhtNodesResponse { } @freezed -class ToxEventFileChunkRequest extends Event with _$ToxEventFileChunkRequest { +abstract class ToxEventFileChunkRequest extends Event + with _$ToxEventFileChunkRequest { const ToxEventFileChunkRequest._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventFileChunkRequest({ required int length, required int fileNumber, @@ -390,7 +385,7 @@ class ToxEventFileChunkRequest extends Event with _$ToxEventFileChunkRequest { } @freezed -class ToxEventFileRecv extends Event with _$ToxEventFileRecv { +abstract class ToxEventFileRecv extends Event with _$ToxEventFileRecv { const ToxEventFileRecv._(); @JsonSerializable( explicitToJson: true, @@ -432,7 +427,8 @@ class ToxEventFileRecv extends Event with _$ToxEventFileRecv { } @freezed -class ToxEventFileRecvChunk extends Event with _$ToxEventFileRecvChunk { +abstract class ToxEventFileRecvChunk extends Event + with _$ToxEventFileRecvChunk { const ToxEventFileRecvChunk._(); @JsonSerializable( explicitToJson: true, @@ -471,12 +467,10 @@ class ToxEventFileRecvChunk extends Event with _$ToxEventFileRecvChunk { } @freezed -class ToxEventFileRecvControl extends Event with _$ToxEventFileRecvControl { +abstract class ToxEventFileRecvControl extends Event + with _$ToxEventFileRecvControl { const ToxEventFileRecvControl._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventFileRecvControl({ required Tox_File_Control control, required int fileNumber, @@ -506,13 +500,10 @@ class ToxEventFileRecvControl extends Event with _$ToxEventFileRecvControl { } @freezed -class ToxEventFriendConnectionStatus extends Event +abstract class ToxEventFriendConnectionStatus extends Event with _$ToxEventFriendConnectionStatus { const ToxEventFriendConnectionStatus._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventFriendConnectionStatus({ required Tox_Connection connectionStatus, required int friendNumber, @@ -539,7 +530,7 @@ class ToxEventFriendConnectionStatus extends Event } @freezed -class ToxEventFriendLosslessPacket extends Event +abstract class ToxEventFriendLosslessPacket extends Event with _$ToxEventFriendLosslessPacket { const ToxEventFriendLosslessPacket._(); @JsonSerializable( @@ -576,7 +567,8 @@ class ToxEventFriendLosslessPacket extends Event } @freezed -class ToxEventFriendLossyPacket extends Event with _$ToxEventFriendLossyPacket { +abstract class ToxEventFriendLossyPacket extends Event + with _$ToxEventFriendLossyPacket { const ToxEventFriendLossyPacket._(); @JsonSerializable( explicitToJson: true, @@ -612,7 +604,8 @@ class ToxEventFriendLossyPacket extends Event with _$ToxEventFriendLossyPacket { } @freezed -class ToxEventFriendMessage extends Event with _$ToxEventFriendMessage { +abstract class ToxEventFriendMessage extends Event + with _$ToxEventFriendMessage { const ToxEventFriendMessage._(); @JsonSerializable( explicitToJson: true, @@ -651,7 +644,7 @@ class ToxEventFriendMessage extends Event with _$ToxEventFriendMessage { } @freezed -class ToxEventFriendName extends Event with _$ToxEventFriendName { +abstract class ToxEventFriendName extends Event with _$ToxEventFriendName { const ToxEventFriendName._(); @JsonSerializable( explicitToJson: true, @@ -684,12 +677,10 @@ class ToxEventFriendName extends Event with _$ToxEventFriendName { } @freezed -class ToxEventFriendReadReceipt extends Event with _$ToxEventFriendReadReceipt { +abstract class ToxEventFriendReadReceipt extends Event + with _$ToxEventFriendReadReceipt { const ToxEventFriendReadReceipt._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventFriendReadReceipt({ required int friendNumber, required int messageId, @@ -716,7 +707,8 @@ class ToxEventFriendReadReceipt extends Event with _$ToxEventFriendReadReceipt { } @freezed -class ToxEventFriendRequest extends Event with _$ToxEventFriendRequest { +abstract class ToxEventFriendRequest extends Event + with _$ToxEventFriendRequest { const ToxEventFriendRequest._(); @JsonSerializable( explicitToJson: true, @@ -749,12 +741,9 @@ class ToxEventFriendRequest extends Event with _$ToxEventFriendRequest { } @freezed -class ToxEventFriendStatus extends Event with _$ToxEventFriendStatus { +abstract class ToxEventFriendStatus extends Event with _$ToxEventFriendStatus { const ToxEventFriendStatus._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventFriendStatus({ required Tox_User_Status status, required int friendNumber, @@ -781,7 +770,7 @@ class ToxEventFriendStatus extends Event with _$ToxEventFriendStatus { } @freezed -class ToxEventFriendStatusMessage extends Event +abstract class ToxEventFriendStatusMessage extends Event with _$ToxEventFriendStatusMessage { const ToxEventFriendStatusMessage._(); @JsonSerializable( @@ -815,12 +804,9 @@ class ToxEventFriendStatusMessage extends Event } @freezed -class ToxEventFriendTyping extends Event with _$ToxEventFriendTyping { +abstract class ToxEventFriendTyping extends Event with _$ToxEventFriendTyping { const ToxEventFriendTyping._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventFriendTyping({ required bool typing, required int friendNumber, @@ -847,7 +833,8 @@ class ToxEventFriendTyping extends Event with _$ToxEventFriendTyping { } @freezed -class ToxEventGroupCustomPacket extends Event with _$ToxEventGroupCustomPacket { +abstract class ToxEventGroupCustomPacket extends Event + with _$ToxEventGroupCustomPacket { const ToxEventGroupCustomPacket._(); @JsonSerializable( explicitToJson: true, @@ -883,7 +870,7 @@ class ToxEventGroupCustomPacket extends Event with _$ToxEventGroupCustomPacket { } @freezed -class ToxEventGroupCustomPrivatePacket extends Event +abstract class ToxEventGroupCustomPrivatePacket extends Event with _$ToxEventGroupCustomPrivatePacket { const ToxEventGroupCustomPrivatePacket._(); @JsonSerializable( @@ -898,8 +885,8 @@ class ToxEventGroupCustomPrivatePacket extends Event }) = _ToxEventGroupCustomPrivatePacket; factory ToxEventGroupCustomPrivatePacket.fromJson( - Map json) => - _$ToxEventGroupCustomPrivatePacketFromJson(json); + Map json, + ) => _$ToxEventGroupCustomPrivatePacketFromJson(json); factory ToxEventGroupCustomPrivatePacket.unpack(Unpacker unpacker) { ensure(unpacker.unpackListLength(), 3); @@ -921,7 +908,7 @@ class ToxEventGroupCustomPrivatePacket extends Event } @freezed -class ToxEventGroupInvite extends Event with _$ToxEventGroupInvite { +abstract class ToxEventGroupInvite extends Event with _$ToxEventGroupInvite { const ToxEventGroupInvite._(); @JsonSerializable( explicitToJson: true, @@ -957,12 +944,10 @@ class ToxEventGroupInvite extends Event with _$ToxEventGroupInvite { } @freezed -class ToxEventGroupJoinFail extends Event with _$ToxEventGroupJoinFail { +abstract class ToxEventGroupJoinFail extends Event + with _$ToxEventGroupJoinFail { const ToxEventGroupJoinFail._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventGroupJoinFail({ required int groupNumber, required Tox_Group_Join_Fail failType, @@ -989,7 +974,7 @@ class ToxEventGroupJoinFail extends Event with _$ToxEventGroupJoinFail { } @freezed -class ToxEventGroupMessage extends Event with _$ToxEventGroupMessage { +abstract class ToxEventGroupMessage extends Event with _$ToxEventGroupMessage { const ToxEventGroupMessage._(); @JsonSerializable( explicitToJson: true, @@ -1031,12 +1016,10 @@ class ToxEventGroupMessage extends Event with _$ToxEventGroupMessage { } @freezed -class ToxEventGroupModeration extends Event with _$ToxEventGroupModeration { +abstract class ToxEventGroupModeration extends Event + with _$ToxEventGroupModeration { const ToxEventGroupModeration._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventGroupModeration({ required int groupNumber, required int sourcePeerId, @@ -1069,7 +1052,8 @@ class ToxEventGroupModeration extends Event with _$ToxEventGroupModeration { } @freezed -class ToxEventGroupPassword extends Event with _$ToxEventGroupPassword { +abstract class ToxEventGroupPassword extends Event + with _$ToxEventGroupPassword { const ToxEventGroupPassword._(); @JsonSerializable( explicitToJson: true, @@ -1102,7 +1086,8 @@ class ToxEventGroupPassword extends Event with _$ToxEventGroupPassword { } @freezed -class ToxEventGroupPeerExit extends Event with _$ToxEventGroupPeerExit { +abstract class ToxEventGroupPeerExit extends Event + with _$ToxEventGroupPeerExit { const ToxEventGroupPeerExit._(); @JsonSerializable( explicitToJson: true, @@ -1144,12 +1129,10 @@ class ToxEventGroupPeerExit extends Event with _$ToxEventGroupPeerExit { } @freezed -class ToxEventGroupPeerJoin extends Event with _$ToxEventGroupPeerJoin { +abstract class ToxEventGroupPeerJoin extends Event + with _$ToxEventGroupPeerJoin { const ToxEventGroupPeerJoin._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventGroupPeerJoin({ required int groupNumber, required int peerId, @@ -1176,12 +1159,10 @@ class ToxEventGroupPeerJoin extends Event with _$ToxEventGroupPeerJoin { } @freezed -class ToxEventGroupPeerLimit extends Event with _$ToxEventGroupPeerLimit { +abstract class ToxEventGroupPeerLimit extends Event + with _$ToxEventGroupPeerLimit { const ToxEventGroupPeerLimit._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventGroupPeerLimit({ required int groupNumber, required int peerLimit, @@ -1208,7 +1189,8 @@ class ToxEventGroupPeerLimit extends Event with _$ToxEventGroupPeerLimit { } @freezed -class ToxEventGroupPeerName extends Event with _$ToxEventGroupPeerName { +abstract class ToxEventGroupPeerName extends Event + with _$ToxEventGroupPeerName { const ToxEventGroupPeerName._(); @JsonSerializable( explicitToJson: true, @@ -1244,12 +1226,10 @@ class ToxEventGroupPeerName extends Event with _$ToxEventGroupPeerName { } @freezed -class ToxEventGroupPeerStatus extends Event with _$ToxEventGroupPeerStatus { +abstract class ToxEventGroupPeerStatus extends Event + with _$ToxEventGroupPeerStatus { const ToxEventGroupPeerStatus._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventGroupPeerStatus({ required int groupNumber, required int peerId, @@ -1279,12 +1259,10 @@ class ToxEventGroupPeerStatus extends Event with _$ToxEventGroupPeerStatus { } @freezed -class ToxEventGroupPrivacyState extends Event with _$ToxEventGroupPrivacyState { +abstract class ToxEventGroupPrivacyState extends Event + with _$ToxEventGroupPrivacyState { const ToxEventGroupPrivacyState._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventGroupPrivacyState({ required int groupNumber, required Tox_Group_Privacy_State privacyState, @@ -1311,7 +1289,7 @@ class ToxEventGroupPrivacyState extends Event with _$ToxEventGroupPrivacyState { } @freezed -class ToxEventGroupPrivateMessage extends Event +abstract class ToxEventGroupPrivateMessage extends Event with _$ToxEventGroupPrivateMessage { const ToxEventGroupPrivateMessage._(); @JsonSerializable( @@ -1354,23 +1332,18 @@ class ToxEventGroupPrivateMessage extends Event } @freezed -class ToxEventGroupSelfJoin extends Event with _$ToxEventGroupSelfJoin { +abstract class ToxEventGroupSelfJoin extends Event + with _$ToxEventGroupSelfJoin { const ToxEventGroupSelfJoin._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) - const factory ToxEventGroupSelfJoin({ - required int groupNumber, - }) = _ToxEventGroupSelfJoin; + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) + const factory ToxEventGroupSelfJoin({required int groupNumber}) = + _ToxEventGroupSelfJoin; factory ToxEventGroupSelfJoin.fromJson(Map json) => _$ToxEventGroupSelfJoinFromJson(json); factory ToxEventGroupSelfJoin.unpack(Unpacker unpacker) { - return ToxEventGroupSelfJoin( - groupNumber: unpacker.unpackInt()!, - ); + return ToxEventGroupSelfJoin(groupNumber: unpacker.unpackInt()!); } @override @@ -1380,7 +1353,7 @@ class ToxEventGroupSelfJoin extends Event with _$ToxEventGroupSelfJoin { } @freezed -class ToxEventGroupTopic extends Event with _$ToxEventGroupTopic { +abstract class ToxEventGroupTopic extends Event with _$ToxEventGroupTopic { const ToxEventGroupTopic._(); @JsonSerializable( explicitToJson: true, @@ -1416,12 +1389,10 @@ class ToxEventGroupTopic extends Event with _$ToxEventGroupTopic { } @freezed -class ToxEventGroupTopicLock extends Event with _$ToxEventGroupTopicLock { +abstract class ToxEventGroupTopicLock extends Event + with _$ToxEventGroupTopicLock { const ToxEventGroupTopicLock._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventGroupTopicLock({ required int groupNumber, required Tox_Group_Topic_Lock topicLock, @@ -1448,12 +1419,10 @@ class ToxEventGroupTopicLock extends Event with _$ToxEventGroupTopicLock { } @freezed -class ToxEventGroupVoiceState extends Event with _$ToxEventGroupVoiceState { +abstract class ToxEventGroupVoiceState extends Event + with _$ToxEventGroupVoiceState { const ToxEventGroupVoiceState._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventGroupVoiceState({ required int groupNumber, required Tox_Group_Voice_State voiceState, @@ -1480,13 +1449,10 @@ class ToxEventGroupVoiceState extends Event with _$ToxEventGroupVoiceState { } @freezed -class ToxEventSelfConnectionStatus extends Event +abstract class ToxEventSelfConnectionStatus extends Event with _$ToxEventSelfConnectionStatus { const ToxEventSelfConnectionStatus._(); - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory ToxEventSelfConnectionStatus({ required Tox_Connection connectionStatus, }) = _ToxEventSelfConnectionStatus; diff --git a/lib/background_service.dart b/lib/background_service.dart index 07f91b6..dbdeebe 100644 --- a/lib/background_service.dart +++ b/lib/background_service.dart @@ -88,7 +88,8 @@ final class _BackgroundService { _isRunning = true; while (_isRunning) { _logger.d( - 'Background service is successfully running ${DateTime.now().minute}'); + 'Background service is successfully running ${DateTime.now().minute}', + ); await Future.delayed(const Duration(minutes: 1)); } } diff --git a/lib/btox_app.dart b/lib/btox_app.dart index ef5cc2b..b4aed92 100644 --- a/lib/btox_app.dart +++ b/lib/btox_app.dart @@ -32,26 +32,19 @@ final class BtoxApp extends ConsumerWidget { title: 'bTox', localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, - theme: ThemeData( - brightness: Brightness.dark, - primarySwatch: Colors.blue, - ), + theme: ThemeData(brightness: Brightness.dark, primarySwatch: Colors.blue), home: _appContent(ref), ); } Widget _appContent(WidgetRef ref) { - return ref.watch(appInitProvider).when( - loading: () => const Scaffold( - body: Center( - child: CircularProgressIndicator(), - ), - ), - error: (error, _) => Scaffold( - body: Center( - child: Text('Error: $error'), - ), - ), + return ref + .watch(appInitProvider) + .when( + loading: () => + const Scaffold(body: Center(child: CircularProgressIndicator())), + error: (error, _) => + Scaffold(body: Center(child: Text('Error: $error'))), data: (init) { final (database, sodium, constants) = init; return StreamBuilder>( @@ -66,8 +59,9 @@ final class BtoxApp extends ConsumerWidget { ); } - final activeProfiles = - profiles.where((profile) => profile.active); + final activeProfiles = profiles.where( + (profile) => profile.active, + ); if (activeProfiles.isEmpty) { return SelectProfilePage( constants: constants, diff --git a/lib/db/database.dart b/lib/db/database.dart index b6f986d..897f6bf 100644 --- a/lib/db/database.dart +++ b/lib/db/database.dart @@ -9,11 +9,7 @@ export 'package:drift/drift.dart' show Value; part 'database.g.dart'; -@DriftDatabase(tables: [ - Contacts, - Messages, - Profiles, -]) +@DriftDatabase(tables: [Contacts, Messages, Profiles]) final class Database extends _$Database { Database(super.e); @@ -28,10 +24,9 @@ final class Database extends _$Database { // Currently we only support 1 active profile at a time. await deactivateProfiles(); - await (update(profiles)..where((p) => p.id.equals(id.value))) - .write(ProfilesCompanion( - active: Value(true), - )); + await (update(profiles)..where((p) => p.id.equals(id.value))).write( + ProfilesCompanion(active: Value(true)), + ); } Future> addContact(ContactsCompanion entry) async => @@ -44,17 +39,15 @@ final class Database extends _$Database { Id(await into(profiles).insert(entry)); Future deactivateProfiles() async { - await update(profiles).write(ProfilesCompanion( - active: Value(false), - )); + await update(profiles).write(ProfilesCompanion(active: Value(false))); } Future deleteProfile(Id id) async { transaction(() async { // Find all the contacts for the profile. - final contactsForProfile = await (select(contacts) - ..where((c) => c.profileId.equals(id.value))) - .get(); + final contactsForProfile = await (select( + contacts, + )..where((c) => c.profileId.equals(id.value))).get(); // Delete all their messages. batch((batch) { for (final contact in contactsForProfile) { @@ -75,23 +68,22 @@ final class Database extends _$Database { (select(messages)..where((m) => m.id.equals(id.value))).getSingle(); Future updateProfileSettings( - Id id, ProfileSettings settings) async { + Id id, + ProfileSettings settings, + ) async { await (update(profiles)..where((p) => p.id.equals(id.value))).write( - ProfilesCompanion( - settings: Value(settings), - ), + ProfilesCompanion(settings: Value(settings)), ); } Stream watchContact(Id id) => (select(contacts)..where((c) => c.id.equals(id.value))).watchSingle(); - Stream> watchContactsFor(Id id) => (select(contacts) - ..where((c) => c.profileId.equals(id.value)) - ..orderBy([ - (c) => OrderingTerm(expression: c.name), - ])) - .watch(); + Stream> watchContactsFor(Id id) => + (select(contacts) + ..where((c) => c.profileId.equals(id.value)) + ..orderBy([(c) => OrderingTerm(expression: c.name)])) + .watch(); Stream> watchMessagesFor(Id id) => (select(messages)..where((m) => m.contactId.equals(id.value))).watch(); diff --git a/lib/db/native.dart b/lib/db/native.dart index a8f4e7e..8c8730c 100644 --- a/lib/db/native.dart +++ b/lib/db/native.dart @@ -26,18 +26,23 @@ Future constructDb(String databaseKey) async { await _setupSqlCipher; // https://drift.simonbinder.eu/platforms/encryption/#using - return Database(NativeDatabase(file, setup: (database) { - // https://drift.simonbinder.eu/platforms/encryption/#important-notice - final cipherVersion = database.select('PRAGMA cipher_version;'); - if (cipherVersion.isEmpty) { - throw Exception('Failed to get cipher version'); - } - _logger.d('Encrypted database: ${cipherVersion.first}'); - - final escapedKey = databaseKey.replaceAll("'", "''"); - database.execute("PRAGMA key = '$escapedKey';"); - - // Recommended option, not enabled by default on SQLCipher - database.config.doubleQuotedStringLiterals = false; - })); + return Database( + NativeDatabase( + file, + setup: (database) { + // https://drift.simonbinder.eu/platforms/encryption/#important-notice + final cipherVersion = database.select('PRAGMA cipher_version;'); + if (cipherVersion.isEmpty) { + throw Exception('Failed to get cipher version'); + } + _logger.d('Encrypted database: ${cipherVersion.first}'); + + final escapedKey = databaseKey.replaceAll("'", "''"); + database.execute("PRAGMA key = '$escapedKey';"); + + // Recommended option, not enabled by default on SQLCipher + database.config.doubleQuotedStringLiterals = false; + }, + ), + ); } diff --git a/lib/ffi/tox_constants.dart b/lib/ffi/tox_constants.dart index 6c61607..cc0e13c 100644 --- a/lib/ffi/tox_constants.dart +++ b/lib/ffi/tox_constants.dart @@ -8,10 +8,10 @@ ToxConstants toxcoreConstants(ToxLibrary lib) { conferenceIdSize: lib.ffi.tox_conference_id_size(), fileIdLength: lib.ffi.tox_file_id_length(), groupChatIdSize: lib.ffi.tox_group_chat_id_size(), - groupMaxCustomLosslessPacketLength: - lib.ffi.tox_group_max_custom_lossless_packet_length(), - groupMaxCustomLossyPacketLength: - lib.ffi.tox_group_max_custom_lossy_packet_length(), + groupMaxCustomLosslessPacketLength: lib.ffi + .tox_group_max_custom_lossless_packet_length(), + groupMaxCustomLossyPacketLength: lib.ffi + .tox_group_max_custom_lossy_packet_length(), groupMaxGroupNameLength: lib.ffi.tox_group_max_group_name_length(), groupMaxMessageLength: lib.ffi.tox_group_max_message_length(), groupMaxPartLength: lib.ffi.tox_group_max_part_length(), diff --git a/lib/ffi/tox_library.ffi.dart b/lib/ffi/tox_library.ffi.dart index 504f28f..7755784 100644 --- a/lib/ffi/tox_library.ffi.dart +++ b/lib/ffi/tox_library.ffi.dart @@ -3,7 +3,6 @@ import 'dart:ffi'; import 'package:btox/ffi/generated/toxcore.ffi.dart'; import 'package:btox/platform/any_platform.dart'; import 'package:ffi/ffi.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; export 'dart:ffi'; @@ -16,9 +15,11 @@ part 'tox_library.ffi.g.dart'; Future toxFfi(Ref ref) async { return ToxLibrary( malloc, - ToxFfi(AnyPlatform.instance.isAndroid - ? DynamicLibrary.open('libtoxcore.so') - : DynamicLibrary.process()), + ToxFfi( + AnyPlatform.instance.isAndroid + ? DynamicLibrary.open('libtoxcore.so') + : DynamicLibrary.process(), + ), ); } diff --git a/lib/ffi/tox_library.js.dart b/lib/ffi/tox_library.js.dart index beab8c5..db49810 100644 --- a/lib/ffi/tox_library.js.dart +++ b/lib/ffi/tox_library.js.dart @@ -1,6 +1,5 @@ import 'package:btox/ffi/generated/toxcore.js.dart'; import 'package:btox/logger.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:wasm_ffi/ffi.dart'; diff --git a/lib/ffi/tox_library.unsupported.dart b/lib/ffi/tox_library.unsupported.dart index 5b11c0a..2e8a6f5 100644 --- a/lib/ffi/tox_library.unsupported.dart +++ b/lib/ffi/tox_library.unsupported.dart @@ -1,5 +1,4 @@ import 'package:btox/ffi/generated/toxcore.js.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:wasm_ffi/ffi.dart'; diff --git a/lib/ffi/toxcore.dart b/lib/ffi/toxcore.dart index 66481b5..7158da1 100644 --- a/lib/ffi/toxcore.dart +++ b/lib/ffi/toxcore.dart @@ -66,11 +66,13 @@ final class Toxcore extends api.Tox { @override ToxAddress get address { return _scoped( - _lib.allocator.free, _lib.allocator(_lib.ffi.tox_address_size()), - (ptr) { - _lib.ffi.tox_self_get_address(_tox, ptr); - return ToxAddress(ptr.asTypedList(_lib.ffi.tox_address_size()).clone()); - }); + _lib.allocator.free, + _lib.allocator(_lib.ffi.tox_address_size()), + (ptr) { + _lib.ffi.tox_self_get_address(_tox, ptr); + return ToxAddress(ptr.asTypedList(_lib.ffi.tox_address_size()).clone()); + }, + ); } @override @@ -96,12 +98,7 @@ final class Toxcore extends api.Tox { _handleError( _lib.allocator, Tox_Err_Set_Info.fromValue, - (err) => _lib.ffi.tox_self_set_status_message( - _tox, - ptr, - length, - err, - ), + (err) => _lib.ffi.tox_self_set_status_message(_tox, ptr, length, err), ); }); } @@ -117,7 +114,12 @@ final class Toxcore extends api.Tox { @override void addTcpRelay(String host, int port, PublicKey publicKey) { _bootstrap( - host, port, publicKey, _lib.ffi.tox_add_tcp_relay, 'tox_add_tcp_relay'); + host, + port, + publicKey, + _lib.ffi.tox_add_tcp_relay, + 'tox_add_tcp_relay', + ); } @override @@ -127,20 +129,29 @@ final class Toxcore extends api.Tox { @override List iterate() { - return _handleError(_lib.allocator, Tox_Err_Events_Iterate.fromValue, - (err) { - return _scoped(_lib.ffi.tox_events_free, - _lib.ffi.tox_events_iterate(_tox, true, err), (events) { - return _scoped(_lib.allocator.free, + return _handleError(_lib.allocator, Tox_Err_Events_Iterate.fromValue, ( + err, + ) { + return _scoped( + _lib.ffi.tox_events_free, + _lib.ffi.tox_events_iterate(_tox, true, err), + (events) { + return _scoped( + _lib.allocator.free, _lib.allocator(_lib.ffi.tox_events_bytes_size(events)), (ptr) { - if (!_lib.ffi.tox_events_get_bytes(events, ptr)) { - throw Exception('Failed to get events bytes'); - } - return Event.unpackList(Unpacker( - ptr.asTypedList(_lib.ffi.tox_events_bytes_size(events)))); - }); - }); + if (!_lib.ffi.tox_events_get_bytes(events, ptr)) { + throw Exception('Failed to get events bytes'); + } + return Event.unpackList( + Unpacker( + ptr.asTypedList(_lib.ffi.tox_events_bytes_size(events)), + ), + ); + }, + ); + }, + ); }); } @@ -162,7 +173,8 @@ final class Toxcore extends api.Tox { int port, Pointer publicKey, Pointer error, - ) f, + ) + f, String functionName, ) { host.scopedCString(_lib.allocator, (hostPtr) { @@ -183,20 +195,27 @@ final class Toxcore extends api.Tox { extension on api.ToxOptions { T withNative(ToxLibrary lib, T Function(Pointer) callback) { return _scoped( - lib.ffi.tox_options_free, - _handleError(lib.allocator, Tox_Err_Options_New.fromValue, - lib.ffi.tox_options_new), (options) { - lib.ffi.tox_options_set_ipv6_enabled(options, ipv6Enabled); - lib.ffi.tox_options_set_udp_enabled(options, udpEnabled); - lib.ffi.tox_options_set_local_discovery_enabled( - options, localDiscoveryEnabled); - - return savedata.scoped(lib.allocator, (ptr, length) { - lib.ffi.tox_options_set_savedata_type(options, savedataType); - lib.ffi.tox_options_set_savedata_data(options, ptr, length); - return callback(options); - }); - }); + lib.ffi.tox_options_free, + _handleError( + lib.allocator, + Tox_Err_Options_New.fromValue, + lib.ffi.tox_options_new, + ), + (options) { + lib.ffi.tox_options_set_ipv6_enabled(options, ipv6Enabled); + lib.ffi.tox_options_set_udp_enabled(options, udpEnabled); + lib.ffi.tox_options_set_local_discovery_enabled( + options, + localDiscoveryEnabled, + ); + + return savedata.scoped(lib.allocator, (ptr, length) { + lib.ffi.tox_options_set_savedata_type(options, savedataType); + lib.ffi.tox_options_set_savedata_data(options, ptr, length); + return callback(options); + }); + }, + ); } } @@ -211,8 +230,9 @@ extension on Uint8List? { if (this == null) { return f(nullptr, 0); } - return _scoped(allocator.free, allocator.allocate(this!.length), - (ptr) { + return _scoped(allocator.free, allocator.allocate(this!.length), ( + ptr, + ) { ptr.asTypedList(this!.length).setAll(0, this!); return f(ptr, this!.length); }); @@ -222,8 +242,9 @@ extension on Uint8List? { extension on String { T scopedBytes(Allocator allocator, T Function(Pointer, int) f) { final units = utf8.encode(this); - return _scoped(allocator.free, allocator.allocate(units.length), - (ptr) { + return _scoped(allocator.free, allocator.allocate(units.length), ( + ptr, + ) { for (var i = 0; i < units.length; i++) { ptr[i] = units[i]; } diff --git a/lib/logger.dart b/lib/logger.dart index 62b544f..32ad2d1 100644 --- a/lib/logger.dart +++ b/lib/logger.dart @@ -15,8 +15,9 @@ class _StackFrame { String toString() => '$file:$line:$column'; static _StackFrame? fromString(String frame) { - final match = - RegExp(r'packages?[:/]([^ :]+)[: ](\d+):(\d+)').firstMatch(frame); + final match = RegExp( + r'packages?[:/]([^ :]+)[: ](\d+):(\d+)', + ).firstMatch(frame); if (match == null) return null; return _StackFrame( match.group(1)!, @@ -56,10 +57,18 @@ final class Logger { _logLine(LogLevel.info, text, stackTrace); void logError(Error e, [String? message]) { debugPrintStack( - stackTrace: e.stackTrace, - label: message != null ? '$tags $message ($e)' : tags.toString()); - _log.add(LogLine( - clock.now(), LogLevel.warning, tags, '$message ($e)', e.stackTrace)); + stackTrace: e.stackTrace, + label: message != null ? '$tags $message ($e)' : tags.toString(), + ); + _log.add( + LogLine( + clock.now(), + LogLevel.warning, + tags, + '$message ($e)', + e.stackTrace, + ), + ); } void v(String text, [StackTrace? stackTrace]) => @@ -83,7 +92,9 @@ final class Logger { T Function(A) catching(T Function(A) f) { return (A a) { try { - v('Calling $f with ${a.toString().substring(0, min(20, a.toString().length))}'); + v( + 'Calling $f with ${a.toString().substring(0, min(20, a.toString().length))}', + ); return f(a); } catch (exn, stackTrace) { e('Caught exception $exn', stackTrace); diff --git a/lib/models/bootstrap_nodes.dart b/lib/models/bootstrap_nodes.dart index 4583660..09005fb 100644 --- a/lib/models/bootstrap_nodes.dart +++ b/lib/models/bootstrap_nodes.dart @@ -5,12 +5,9 @@ part 'bootstrap_nodes.freezed.dart'; part 'bootstrap_nodes.g.dart'; @freezed -class BootstrapNode with _$BootstrapNode { +abstract class BootstrapNode with _$BootstrapNode { // ignore: invalid_annotation_target - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory BootstrapNode({ required String ipv4, required String ipv6, @@ -32,12 +29,9 @@ class BootstrapNode with _$BootstrapNode { } @freezed -class BootstrapNodeList with _$BootstrapNodeList { +abstract class BootstrapNodeList with _$BootstrapNodeList { // ignore: invalid_annotation_target - @JsonSerializable( - explicitToJson: true, - fieldRename: FieldRename.snake, - ) + @JsonSerializable(explicitToJson: true, fieldRename: FieldRename.snake) const factory BootstrapNodeList({ required int lastScan, required int lastRefresh, diff --git a/lib/models/content.dart b/lib/models/content.dart index 6cee6db..f401aed 100644 --- a/lib/models/content.dart +++ b/lib/models/content.dart @@ -110,10 +110,7 @@ final class ContentConverter extends TypeConverter @override Map toJson(Content value) { - return { - '_type': value.type.name, - ...value.toJson(), - }; + return {'_type': value.type.name, ...value.toJson()}; } @override @@ -134,9 +131,7 @@ enum ContentType { @freezed sealed class DeleteContent extends Content with _$DeleteContent { @JsonSerializable(explicitToJson: true) - const factory DeleteContent({ - required Sha256 message, - }) = _DeleteContent; + const factory DeleteContent({required Sha256 message}) = _DeleteContent; factory DeleteContent.fromJson(Map json) => _$DeleteContentFromJson(json); @@ -159,10 +154,8 @@ sealed class DeleteContent extends Content with _$DeleteContent { @freezed sealed class EditContent extends Content with _$EditContent { @JsonSerializable(explicitToJson: true) - const factory EditContent({ - required Sha256 message, - required String text, - }) = _EditContent; + const factory EditContent({required Sha256 message, required String text}) = + _EditContent; factory EditContent.fromJson(Map json) => _$EditContentFromJson(json); @@ -194,9 +187,7 @@ sealed class EditContent extends Content with _$EditContent { @freezed sealed class FileContent extends Content with _$FileContent { - const factory FileContent({ - required String url, - }) = _FileContent; + const factory FileContent({required String url}) = _FileContent; factory FileContent.fromJson(Map json) => _$FileContentFromJson(json); @@ -253,9 +244,7 @@ sealed class LocationContent extends Content with _$LocationContent { @freezed sealed class MediaContent extends Content with _$MediaContent { - const factory MediaContent({ - required String url, - }) = _MediaContent; + const factory MediaContent({required String url}) = _MediaContent; factory MediaContent.fromJson(Map json) => _$MediaContentFromJson(json); diff --git a/lib/models/crypto.dart b/lib/models/crypto.dart index 91eabed..3e8aae3 100644 --- a/lib/models/crypto.dart +++ b/lib/models/crypto.dart @@ -136,9 +136,11 @@ final class ToxAddress extends _CryptoBytes { return ToxAddress(Uint8List.fromList(hex.decode(value))); } - ToxAddressHash get hash => ToxAddressHash(bytes.buffer - .asByteData() - .getUint16(PublicKey.kLength + ToxAddressNospam.kLength)); + ToxAddressHash get hash => ToxAddressHash( + bytes.buffer.asByteData().getUint16( + PublicKey.kLength + ToxAddressNospam.kLength, + ), + ); @override int get length => ToxAddress.kLength; diff --git a/lib/models/identicon.dart b/lib/models/identicon.dart index 4626a72..65240ac 100644 --- a/lib/models/identicon.dart +++ b/lib/models/identicon.dart @@ -10,7 +10,6 @@ import 'package:btox/models/bytes.dart'; import 'package:btox/models/crypto.dart'; import 'package:crypto/crypto.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'identicon.g.dart'; @@ -42,8 +41,11 @@ Identicon identicon(Ref ref, PublicKey publicKey) { double _bytesToColor(Uint8List bytes) { assert(bytes.length == _kIdenticonColorBytes, 'bytes: $bytes'); - final data = - ByteData.view(bytes.buffer, bytes.offsetInBytes, bytes.lengthInBytes); + final data = ByteData.view( + bytes.buffer, + bytes.offsetInBytes, + bytes.lengthInBytes, + ); // Using int32 here to make sure all systems behave the same. final hi = _toDouble(data.getInt32(0)); final lo = data.getUint16(4); @@ -112,10 +114,16 @@ final class Identicon extends ImageProvider { // hash with sha256 var hash = Uint8List.fromList(sha256.convert(data).bytes); for (int colorIndex = 0; colorIndex < _kColors; ++colorIndex) { - final hashPart = Uint8List.view(hash.buffer, - hash.length - _kIdenticonColorBytes, _kIdenticonColorBytes); + final hashPart = Uint8List.view( + hash.buffer, + hash.length - _kIdenticonColorBytes, + _kIdenticonColorBytes, + ); hash = Uint8List.view( - hash.buffer, hash.offsetInBytes, hash.length - _kIdenticonColorBytes); + hash.buffer, + hash.offsetInBytes, + hash.length - _kIdenticonColorBytes, + ); final hue = _bytesToColor(hashPart); _logger.v('Color $colorIndex: $hue'); @@ -182,10 +190,7 @@ final class Identicon extends ImageProvider { @override ImageStreamCompleter loadImage(ui.Image key, ImageDecoderCallback decode) { return ImmediateImageStreamCompleter( - ImageInfo( - image: key.clone(), - debugLabel: 'Identicon', - ), + ImageInfo(image: key.clone(), debugLabel: 'Identicon'), ); } diff --git a/lib/models/messaging.dart b/lib/models/messaging.dart index 08dbb6b..2de2649 100644 --- a/lib/models/messaging.dart +++ b/lib/models/messaging.dart @@ -9,8 +9,13 @@ import 'package:btox/packets/message_packet.dart'; import 'package:crypto/crypto.dart'; // [parent, merged, timestamp, author, content] -Uint8List encodeMessage(Message? parent, Message? merged, DateTime timestamp, - PublicKey author, Content content) { +Uint8List encodeMessage( + Message? parent, + Message? merged, + DateTime timestamp, + PublicKey author, + Content content, +) { return MessagePacket( parent: parent?.sha, merged: merged?.sha, diff --git a/lib/models/profile_settings.dart b/lib/models/profile_settings.dart index 6bde5cb..2229bdf 100644 --- a/lib/models/profile_settings.dart +++ b/lib/models/profile_settings.dart @@ -7,7 +7,7 @@ part 'profile_settings.g.dart'; part 'profile_settings.freezed.dart'; @freezed -class ProfileSettings with _$ProfileSettings { +abstract class ProfileSettings with _$ProfileSettings { const factory ProfileSettings({ required String nickname, required String statusMessage, diff --git a/lib/packets/message_packet.dart b/lib/packets/message_packet.dart index 65f54b5..a3b08d6 100644 --- a/lib/packets/message_packet.dart +++ b/lib/packets/message_packet.dart @@ -27,12 +27,15 @@ final class MessagePacket extends Packet { throw Exception('Invalid message packet'); } - final Sha256? parent = - unpacker.unpackBinary()?.let((sha) => Sha256.fromDigest(Digest(sha))); - final Sha256? merged = - unpacker.unpackBinary()?.let((sha) => Sha256.fromDigest(Digest(sha))); - final DateTime timestamp = - DateTime.fromMillisecondsSinceEpoch(unpacker.unpackInt()!); + final Sha256? parent = unpacker.unpackBinary()?.let( + (sha) => Sha256.fromDigest(Digest(sha)), + ); + final Sha256? merged = unpacker.unpackBinary()?.let( + (sha) => Sha256.fromDigest(Digest(sha)), + ); + final DateTime timestamp = DateTime.fromMillisecondsSinceEpoch( + unpacker.unpackInt()!, + ); final PublicKey author = PublicKey.unpack(unpacker); final Content content = Content.unpack(unpacker); diff --git a/lib/packets/messagepack/message_data.dart b/lib/packets/messagepack/message_data.dart index 814d1d1..1e75e5b 100644 --- a/lib/packets/messagepack/message_data.dart +++ b/lib/packets/messagepack/message_data.dart @@ -131,8 +131,10 @@ final class MessageDataList extends MessageData { @override bool _equals(MessageDataList other) => value.length == other.value.length && - List.generate(value.length, (i) => value[i]._equals(other.value[i])) - .every((e) => e); + List.generate( + value.length, + (i) => value[i]._equals(other.value[i]), + ).every((e) => e); } final class MessageDataMap extends MessageData { diff --git a/lib/packets/messagepack/message_data_json_converter.dart b/lib/packets/messagepack/message_data_json_converter.dart index dacfd12..64d517a 100644 --- a/lib/packets/messagepack/message_data_json_converter.dart +++ b/lib/packets/messagepack/message_data_json_converter.dart @@ -16,7 +16,8 @@ final class MessageDataJsonConverter @override String toJson(MessageData object) { - return Uint8ListConverter() - .toJson((Packer()..packMessageData(object)).takeBytes()); + return Uint8ListConverter().toJson( + (Packer()..packMessageData(object)).takeBytes(), + ); } } diff --git a/lib/packets/messagepack/packer.dart b/lib/packets/messagepack/packer.dart index bf58877..b9e3079 100644 --- a/lib/packets/messagepack/packer.dart +++ b/lib/packets/messagepack/packer.dart @@ -61,11 +61,7 @@ final class Packer { /// Flush [_buf] to [_builder] when [_buf] if almost full /// or when packer completes his job and transforms to bytes void _flushBuf() { - _builder.add(Uint8List.view( - _buf.buffer, - _buf.offsetInBytes, - _offset, - )); + _builder.add(Uint8List.view(_buf.buffer, _buf.offsetInBytes, _offset)); } /// Pack binary and string uses this internally. @@ -290,11 +286,7 @@ final class Packer { Uint8List takeBytes() { Uint8List bytes; if (_builder.isEmpty) { - bytes = Uint8List.view( - _buf.buffer, - _buf.offsetInBytes, - _offset, - ); + bytes = Uint8List.view(_buf.buffer, _buf.offsetInBytes, _offset); } else { _flushBuf(); bytes = _builder.takeBytes(); diff --git a/lib/packets/messagepack/unpacker.dart b/lib/packets/messagepack/unpacker.dart index 49acc7a..f25e843 100644 --- a/lib/packets/messagepack/unpacker.dart +++ b/lib/packets/messagepack/unpacker.dart @@ -157,8 +157,11 @@ final class Unpacker { } else { throw _formatException('String', b); } - final data = - Uint8List.view(_list.buffer, _list.offsetInBytes + _offset, len); + final data = Uint8List.view( + _list.buffer, + _list.offsetInBytes + _offset, + len, + ); _offset += len; return utf8.decode(data); } @@ -239,8 +242,11 @@ final class Unpacker { } else { throw _formatException('Binary', b); } - final data = - Uint8List.view(_list.buffer, _list.offsetInBytes + _offset, len); + final data = Uint8List.view( + _list.buffer, + _list.offsetInBytes + _offset, + len, + ); _offset += len; return data.asUnmodifiableView(); } @@ -303,5 +309,6 @@ final class Unpacker { } Exception _formatException(String type, int b) => FormatException( - 'Try to unpack $type value, but it\'s not an $type, byte = $b'); + 'Try to unpack $type value, but it\'s not an $type, byte = $b', + ); } diff --git a/lib/pages/add_contact_page.dart b/lib/pages/add_contact_page.dart index 24d976d..b972c83 100644 --- a/lib/pages/add_contact_page.dart +++ b/lib/pages/add_contact_page.dart @@ -26,9 +26,7 @@ final class AddContactPage extends HookWidget { ); return Scaffold( - appBar: AppBar( - title: Text(AppLocalizations.of(context)!.addContact), - ), + appBar: AppBar(title: Text(AppLocalizations.of(context)!.addContact)), body: SingleChildScrollView( child: Form( key: formKey, @@ -71,7 +69,11 @@ final class AddContactPage extends HookWidget { } void _onAddContact( - BuildContext context, FormState form, String toxId, String message) { + BuildContext context, + FormState form, + String toxId, + String message, + ) { if (form.validate()) { onAddContact(toxId, message); Navigator.pop(context); diff --git a/lib/pages/chat_page.dart b/lib/pages/chat_page.dart index 5d591bb..b55b119 100644 --- a/lib/pages/chat_page.dart +++ b/lib/pages/chat_page.dart @@ -35,9 +35,7 @@ final class ChatPage extends HookConsumerWidget { final contact = snapshot.data; if (contact == null) { return const Scaffold( - body: Center( - child: CircularProgressIndicator(), - ), + body: Center(child: CircularProgressIndicator()), ); } @@ -51,8 +49,10 @@ final class ChatPage extends HookConsumerWidget { child: CircleIdenticon(publicKey: contact.publicKey), ), Expanded( - child: Text(contact.name ?? - AppLocalizations.of(context)!.defaultContactName), + child: Text( + contact.name ?? + AppLocalizations.of(context)!.defaultContactName, + ), ), ], ), @@ -83,10 +83,13 @@ final class ChatPage extends HookConsumerWidget { left: 16, top: 4, right: 8, - bottom: ref.watch(keyboardHeightProvider).when( - data: (height) => height == 0 ? 24 : 4, - error: (_, __) => 12, - loading: () => 12), + bottom: ref + .watch(keyboardHeightProvider) + .when( + data: (height) => height == 0 ? 24 : 4, + error: (_, _) => 12, + loading: () => 12, + ), ), child: MessageInput( hintText: AppLocalizations.of(context)!.messageInput, diff --git a/lib/pages/contact_list_page.dart b/lib/pages/contact_list_page.dart index 4ba074c..e5d2edc 100644 --- a/lib/pages/contact_list_page.dart +++ b/lib/pages/contact_list_page.dart @@ -48,20 +48,22 @@ final class ContactListPage extends ConsumerWidget { ); }, ), - title: Row(children: [ - Padding( - padding: const EdgeInsets.only(right: 16), - child: SizedBox( - height: 24, - width: 24, - child: Align( - alignment: Alignment.centerLeft, - child: ConnectionStatusIcon(profile: profile), + title: Row( + children: [ + Padding( + padding: const EdgeInsets.only(right: 16), + child: SizedBox( + height: 24, + width: 24, + child: Align( + alignment: Alignment.centerLeft, + child: ConnectionStatusIcon(profile: profile), + ), ), ), - ), - Text(AppLocalizations.of(context)!.title), - ]), + Text(AppLocalizations.of(context)!.title), + ], + ), ), body: StreamBuilder>( stream: database.watchContactsFor(profile.id), @@ -83,14 +85,16 @@ final class ContactListPage extends ConsumerWidget { contact: database.watchContact(contact.id), messages: database.watchMessagesFor(contact.id), onSendMessage: (Message? parent, Content content) { - database.addMessage(newMessage( - contactId: contact.id, - parent: parent, - merged: null, - author: profile.publicKey, - timestamp: clock.now().toUtc(), - content: content, - )); + database.addMessage( + newMessage( + contactId: contact.id, + parent: parent, + merged: null, + author: profile.publicKey, + timestamp: clock.now().toUtc(), + content: content, + ), + ); }, ), ), @@ -113,7 +117,8 @@ final class ContactListPage extends ConsumerWidget { ContactsCompanion.insert( profileId: profile.id, publicKey: PublicKey.fromJson( - toxID.substring(0, toxID.length - 12)), + toxID.substring(0, toxID.length - 12), + ), ), ); _logger.d('Added contact: $id'); diff --git a/lib/pages/create_profile_page.dart b/lib/pages/create_profile_page.dart index ae76013..00a514d 100644 --- a/lib/pages/create_profile_page.dart +++ b/lib/pages/create_profile_page.dart @@ -30,17 +30,13 @@ final class CreateProfilePage extends HookWidget { @override Widget build(BuildContext context) { - final nicknameController = useTextEditingController( - text: 'Yanciman', - ); + final nicknameController = useTextEditingController(text: 'Yanciman'); final statusMessageController = useTextEditingController( text: 'Producing works of art in Kannywood', ); return Scaffold( - appBar: AppBar( - title: Text(AppLocalizations.of(context)!.newProfile), - ), + appBar: AppBar(title: Text(AppLocalizations.of(context)!.newProfile)), body: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -52,36 +48,31 @@ final class CreateProfilePage extends HookWidget { height: 200, ), ), - NicknameField( - constants: constants, - controller: nicknameController, - ), - const Padding( - padding: EdgeInsets.all(8), - ), + NicknameField(constants: constants, controller: nicknameController), + const Padding(padding: EdgeInsets.all(8)), StatusMessageField( constants: constants, controller: statusMessageController, ), - const Padding( - padding: EdgeInsets.all(8), - ), + const Padding(padding: EdgeInsets.all(8)), ElevatedButton( key: const Key('createProfileButton'), onPressed: () async { _logger.d('Creating new profile'); final keyPair = sodium.crypto.box.keyPair(); - final id = await database.addProfile(ProfilesCompanion.insert( - active: const Value(true), - settings: ProfileSettings( - nickname: nicknameController.text, - statusMessage: statusMessageController.text, + final id = await database.addProfile( + ProfilesCompanion.insert( + active: const Value(true), + settings: ProfileSettings( + nickname: nicknameController.text, + statusMessage: statusMessageController.text, + ), + secretKey: SecretKey.fromSodium(keyPair.secretKey), + publicKey: PublicKey(keyPair.publicKey), + nospam: ToxAddressNospam(0), ), - secretKey: SecretKey.fromSodium(keyPair.secretKey), - publicKey: PublicKey(keyPair.publicKey), - nospam: ToxAddressNospam(0), - )); + ); _logger.d('Created new profile with ID $id'); onProfileCreated?.call(id); }, diff --git a/lib/pages/select_profile_page.dart b/lib/pages/select_profile_page.dart index 0edd082..f804758 100644 --- a/lib/pages/select_profile_page.dart +++ b/lib/pages/select_profile_page.dart @@ -24,9 +24,7 @@ final class SelectProfilePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Select Profile'), - ), + appBar: AppBar(title: const Text('Select Profile')), body: ListView.builder( itemCount: profiles.length, itemBuilder: (context, index) { diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart index 3b02abb..71bc5bf 100644 --- a/lib/pages/settings_page.dart +++ b/lib/pages/settings_page.dart @@ -19,9 +19,7 @@ final class SettingsPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: Text(AppLocalizations.of(context)!.menuSettings), - ), + appBar: AppBar(title: Text(AppLocalizations.of(context)!.menuSettings)), body: ListView( children: [ ListTile( @@ -32,9 +30,9 @@ final class SettingsPage extends StatelessWidget { builder: (context) => AlertDialog( title: Text(AppLocalizations.of(context)!.deleteProfile), content: Text( - AppLocalizations.of(context)!.deleteProfileMessage( - profile.settings.nickname, - ), + AppLocalizations.of( + context, + )!.deleteProfileMessage(profile.settings.nickname), ), actions: [ TextButton( @@ -49,9 +47,9 @@ final class SettingsPage extends StatelessWidget { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( - AppLocalizations.of(context)!.profileDeleted( - profile.settings.nickname, - ), + AppLocalizations.of( + context, + )!.profileDeleted(profile.settings.nickname), ), ), ); diff --git a/lib/pages/user_profile_page.dart b/lib/pages/user_profile_page.dart index 8579023..d1de9dc 100644 --- a/lib/pages/user_profile_page.dart +++ b/lib/pages/user_profile_page.dart @@ -48,24 +48,18 @@ final class UserProfilePage extends HookWidget { } return Scaffold( - appBar: AppBar( - title: Text(AppLocalizations.of(context)!.menuProfile), - ), + appBar: AppBar(title: Text(AppLocalizations.of(context)!.menuProfile)), body: Form( key: formKey, child: Column( children: [ - const Padding( - padding: EdgeInsets.all(8), - ), + const Padding(padding: EdgeInsets.all(8)), NicknameField( constants: constants, controller: nickInputController, onChanged: (value) => applyButtonPressed.value = false, ), - const Padding( - padding: EdgeInsets.all(8), - ), + const Padding(padding: EdgeInsets.all(8)), StatusMessageField( constants: constants, controller: statusMessageInputController, @@ -73,8 +67,9 @@ final class UserProfilePage extends HookWidget { ), ElevatedButton( style: ElevatedButton.styleFrom( - backgroundColor: - applyButtonPressed.value ? Colors.green : Colors.blue, + backgroundColor: applyButtonPressed.value + ? Colors.green + : Colors.blue, foregroundColor: Colors.white, ), onPressed: () => onValidate(), diff --git a/lib/providers/bootstrap_nodes.dart b/lib/providers/bootstrap_nodes.dart index 2039ad6..1a34a0b 100644 --- a/lib/providers/bootstrap_nodes.dart +++ b/lib/providers/bootstrap_nodes.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'package:btox/models/bootstrap_nodes.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:http/http.dart' as http; import 'package:riverpod_annotation/riverpod_annotation.dart'; diff --git a/lib/providers/database.dart b/lib/providers/database.dart index eb0f165..ee982ab 100644 --- a/lib/providers/database.dart +++ b/lib/providers/database.dart @@ -2,7 +2,6 @@ import 'package:btox/db/database.dart'; import 'package:btox/db/shared.dart'; import 'package:btox/logger.dart'; import 'package:btox/providers/secure_storage.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'database.g.dart'; diff --git a/lib/providers/geolocation.dart b/lib/providers/geolocation.dart index 94674d4..45de86f 100644 --- a/lib/providers/geolocation.dart +++ b/lib/providers/geolocation.dart @@ -30,7 +30,8 @@ Future geolocation() async { if (permission == LocationPermission.deniedForever) { // Permissions are denied forever, handle appropriately. return Future.error( - 'Location permissions are permanently denied, we cannot request permissions.'); + 'Location permissions are permanently denied, we cannot request permissions.', + ); } // When we reach here, permissions are granted and we can diff --git a/lib/providers/keyboard_height.dart b/lib/providers/keyboard_height.dart index 83ca5b5..a3ef9ad 100644 --- a/lib/providers/keyboard_height.dart +++ b/lib/providers/keyboard_height.dart @@ -1,6 +1,5 @@ import 'package:btox/platform/any_platform.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:keyboard_height_plugin/keyboard_height_plugin.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -12,7 +11,7 @@ Stream keyboardHeight(Ref ref) { return Stream.empty(); } final _ = KeyboardHeightPlugin(); - return const EventChannel('keyboardHeightEventChannel') - .receiveBroadcastStream() - .map((event) => event as double); + return const EventChannel( + 'keyboardHeightEventChannel', + ).receiveBroadcastStream().map((event) => event as double); } diff --git a/lib/providers/map_tile.dart b/lib/providers/map_tile.dart index 1a8e3eb..8b3f6dd 100644 --- a/lib/providers/map_tile.dart +++ b/lib/providers/map_tile.dart @@ -1,5 +1,4 @@ import 'package:flutter_map/flutter_map.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'map_tile.g.dart'; diff --git a/lib/providers/secure_storage.dart b/lib/providers/secure_storage.dart index c944808..b983f3c 100644 --- a/lib/providers/secure_storage.dart +++ b/lib/providers/secure_storage.dart @@ -1,4 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'secure_storage.g.dart'; diff --git a/lib/providers/sodium.dart b/lib/providers/sodium.dart index 2c0232d..9ae262d 100644 --- a/lib/providers/sodium.dart +++ b/lib/providers/sodium.dart @@ -1,4 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:sodium_libs/sodium_libs.dart'; diff --git a/lib/providers/tox.dart b/lib/providers/tox.dart index 8d39c64..9f38911 100644 --- a/lib/providers/tox.dart +++ b/lib/providers/tox.dart @@ -7,7 +7,6 @@ import 'package:btox/ffi/toxcore.dart' as ffi; import 'package:btox/logger.dart'; import 'package:btox/models/crypto.dart'; import 'package:btox/providers/bootstrap_nodes.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'tox.g.dart'; @@ -37,16 +36,20 @@ Future toxConstants(Ref ref) async { @riverpod Stream toxEvents( - Ref ref, SecretKey secretKey, ToxAddressNospam nospam) async* { + Ref ref, + SecretKey secretKey, + ToxAddressNospam nospam, +) async* { final tox = await ref.watch(toxProvider(secretKey, nospam).future); - final nodes = (await ref.watch(bootstrapNodesProvider.future)) - .nodes - .where((node) => node.tcpPorts.isNotEmpty) - .toList(growable: false); + final nodes = (await ref.watch( + bootstrapNodesProvider.future, + )).nodes.where((node) => node.tcpPorts.isNotEmpty).toList(growable: false); final selectedNodes = nodes.take(8); - _logger.d('Got ${nodes.length} bootstrap nodes; ' - 'using ${selectedNodes.length}...'); + _logger.d( + 'Got ${nodes.length} bootstrap nodes; ' + 'using ${selectedNodes.length}...', + ); try { for (final node in selectedNodes) { tox.bootstrap(node.ipv4, node.port, node.publicKey); diff --git a/lib/widgets/attachment_button.dart b/lib/widgets/attachment_button.dart index a8fdd16..ef5870e 100644 --- a/lib/widgets/attachment_button.dart +++ b/lib/widgets/attachment_button.dart @@ -16,10 +16,7 @@ final class AttachmentButton extends StatelessWidget { Widget build(BuildContext context) { return Column( children: [ - IconButton( - icon: Icon(icon, size: 56), - onPressed: onPressed, - ), + IconButton(icon: Icon(icon, size: 56), onPressed: onPressed), Text(text), ], ); diff --git a/lib/widgets/attachment_selector.dart b/lib/widgets/attachment_selector.dart index 32f6ddf..ef4c6a2 100644 --- a/lib/widgets/attachment_selector.dart +++ b/lib/widgets/attachment_selector.dart @@ -12,10 +12,7 @@ const _logger = Logger(['AttachmentSelector']); final class AttachmentSelector extends StatelessWidget { final void Function(List) onSelected; - const AttachmentSelector({ - super.key, - required this.onSelected, - }); + const AttachmentSelector({super.key, required this.onSelected}); @override Widget build(BuildContext context) { @@ -47,8 +44,11 @@ final class AttachmentSelector extends StatelessWidget { type: FileType.image, ); if (result != null) { - onSelected(await Future.wait( - result.files.map((file) => _loadImage(file.xFile)))); + onSelected( + await Future.wait( + result.files.map((file) => _loadImage(file.xFile)), + ), + ); } }, ), @@ -60,8 +60,11 @@ final class AttachmentSelector extends StatelessWidget { allowMultiple: true, ); if (result != null) { - onSelected(await Future.wait( - result.files.map((file) => _loadFile(file.xFile)))); + onSelected( + await Future.wait( + result.files.map((file) => _loadFile(file.xFile)), + ), + ); } }, ), diff --git a/lib/widgets/chat_content.dart b/lib/widgets/chat_content.dart index 3c2fb06..95d3376 100644 --- a/lib/widgets/chat_content.dart +++ b/lib/widgets/chat_content.dart @@ -39,32 +39,32 @@ final class ChatContent extends StatelessWidget { final Positioned? stateIcon = switch (state) { ChatContentState.none => null, ChatContentState.sent => const Positioned( - bottom: _kStateIconBottom, - right: _kStateIconRight, - child: Icon( - Icons.done, - size: _kStateIconSize, - color: Color(0xFF97AD8E), - ), + bottom: _kStateIconBottom, + right: _kStateIconRight, + child: Icon( + Icons.done, + size: _kStateIconSize, + color: Color(0xFF97AD8E), ), + ), ChatContentState.delivered => const Positioned( - bottom: _kStateIconBottom, - right: _kStateIconRight, - child: Icon( - Icons.done_all, - size: _kStateIconSize, - color: Color(0xFF97AD8E), - ), + bottom: _kStateIconBottom, + right: _kStateIconRight, + child: Icon( + Icons.done_all, + size: _kStateIconSize, + color: Color(0xFF97AD8E), ), + ), ChatContentState.seen => const Positioned( - bottom: _kStateIconBottom, - right: _kStateIconRight, - child: Icon( - Icons.done_all, - size: _kStateIconSize, - color: Color(0xFF92DEDA), - ), + bottom: _kStateIconBottom, + right: _kStateIconRight, + child: Icon( + Icons.done_all, + size: _kStateIconSize, + color: Color(0xFF92DEDA), ), + ), }; return Row( @@ -95,9 +95,9 @@ final class ChatContent extends StatelessWidget { bubbleRadius: bubbleRadius, ); case LocationContent( - latitude: final latitude, - longitude: final longitude - ): + latitude: final latitude, + longitude: final longitude, + ): return ChatLocationBubble( stateIcon: stateIcon, latitude: latitude, diff --git a/lib/widgets/chat_context_menu.dart b/lib/widgets/chat_context_menu.dart index 90f694d..27bd59b 100644 --- a/lib/widgets/chat_context_menu.dart +++ b/lib/widgets/chat_context_menu.dart @@ -22,7 +22,7 @@ final class ChatContextMenu { onDelete: onDelete, ); - return menu.show(context); + return menu.show(context); } static ContextMenu _build( @@ -36,34 +36,34 @@ final class ChatContextMenu { }) { final entries = [ MenuItem( - label: 'Reply', - icon: Icons.reply_outlined, - onSelected: onReply, + label: const Text('Reply'), + icon: const Icon(Icons.reply_outlined), + onSelected: (_) => onReply(), ), MenuItem( - label: 'Forward', - icon: Icons.forward_outlined, - onSelected: onForward, + label: const Text('Forward'), + icon: const Icon(Icons.forward_outlined), + onSelected: (_) => onForward(), ), MenuItem( - label: 'Copy', - icon: Icons.copy, - onSelected: onCopy, + label: const Text('Copy'), + icon: const Icon(Icons.copy), + onSelected: (_) => onCopy(), ), MenuItem( - label: 'Select', - icon: Icons.check_circle_outline, - onSelected: onSelect, + label: const Text('Select'), + icon: const Icon(Icons.check_circle_outline), + onSelected: (_) => onSelect(), ), MenuItem( - label: 'Info', - icon: Icons.info_outline, - onSelected: onInfo, + label: const Text('Info'), + icon: const Icon(Icons.info_outline), + onSelected: (_) => onInfo(), ), MenuItem( - label: 'Delete', - icon: Icons.delete_outline, - onSelected: onDelete, + label: const Text('Delete'), + icon: const Icon(Icons.delete_outline), + onSelected: (_) => onDelete(), ), ]; diff --git a/lib/widgets/chat_item.dart b/lib/widgets/chat_item.dart index 9dc392c..bd0b0e2 100644 --- a/lib/widgets/chat_item.dart +++ b/lib/widgets/chat_item.dart @@ -36,8 +36,9 @@ final class ChatItem extends HookWidget { final bubbleDrag = useState(0.0); final showTime = useState(false); - final dragValue = - isSender ? max(0.0, -bubbleDrag.value) : max(0.0, bubbleDrag.value); + final dragValue = isSender + ? max(0.0, -bubbleDrag.value) + : max(0.0, bubbleDrag.value); final replyIconExtraSize = dragValue > _kMaxBubbleDrag * _kBubbleDragActivation ? 8.0 : 0.0; @@ -45,17 +46,16 @@ final class ChatItem extends HookWidget { children: [ Stack( children: [ - _align(Padding( - padding: EdgeInsets.all(8.0 - replyIconExtraSize / 2), - // Transparent to opaque depending on drag state. - child: Opacity( - opacity: dragValue / _kMaxBubbleDrag, - child: Icon( - Icons.reply, - size: 24 + replyIconExtraSize, + _align( + Padding( + padding: EdgeInsets.all(8.0 - replyIconExtraSize / 2), + // Transparent to opaque depending on drag state. + child: Opacity( + opacity: dragValue / _kMaxBubbleDrag, + child: Icon(Icons.reply, size: 24 + replyIconExtraSize), ), ), - )), + ), GestureDetector( onHorizontalDragUpdate: (details) { final delta = details.primaryDelta; @@ -85,7 +85,8 @@ final class ChatItem extends HookWidget { onForward: () {}, onCopy: () { Clipboard.setData( - ClipboardData(text: message.content.toString())); + ClipboardData(text: message.content.toString()), + ); }, onSelect: () {}, onInfo: () {}, @@ -103,8 +104,9 @@ final class ChatItem extends HookWidget { direction: isSender ? ChatContentDirection.sent : ChatContentDirection.received, - state: - isSender ? ChatContentState.seen : ChatContentState.none, + state: isSender + ? ChatContentState.seen + : ChatContentState.none, textStyle: Theme.of(context).textTheme.bodyLarge!, onTap: () => showTime.value = !showTime.value, ), diff --git a/lib/widgets/chat_location_bubble.dart b/lib/widgets/chat_location_bubble.dart index 4e44569..810a6c3 100644 --- a/lib/widgets/chat_location_bubble.dart +++ b/lib/widgets/chat_location_bubble.dart @@ -53,16 +53,18 @@ final class ChatLocationBubble extends ConsumerWidget { urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', tileProvider: ref.read(mapTileProvider), ), - MarkerLayer(markers: [ - Marker( - point: LatLng(latitude, longitude), - child: Icon(Icons.location_on, color: Colors.red), - ), - ]), + MarkerLayer( + markers: [ + Marker( + point: LatLng(latitude, longitude), + child: Icon(Icons.location_on, color: Colors.red), + ), + ], + ), ], ), ), - if (stateIcon != null) stateIcon!, + ?stateIcon, ], ), ); diff --git a/lib/widgets/chat_text.dart b/lib/widgets/chat_text.dart index 96d9826..3105aef 100644 --- a/lib/widgets/chat_text.dart +++ b/lib/widgets/chat_text.dart @@ -39,10 +39,7 @@ final class ChatText extends StatelessWidget { radius: bubbleRadius, color: color, stateIcon: stateIcon, - child: Text( - text, - style: textStyle, - ), + child: Text(text, style: textStyle), ); } } diff --git a/lib/widgets/chat_text_bubble.dart b/lib/widgets/chat_text_bubble.dart index b18ac39..0ff77ca 100644 --- a/lib/widgets/chat_text_bubble.dart +++ b/lib/widgets/chat_text_bubble.dart @@ -29,7 +29,7 @@ final class ChatTextBubble extends StatelessWidget { : EdgeInsets.symmetric(vertical: 6, horizontal: 12), child: child, ), - if (stateIcon != null) stateIcon!, + ?stateIcon, ], ), ); diff --git a/lib/widgets/chat_text_emoji.dart b/lib/widgets/chat_text_emoji.dart index 529b23a..2093d0a 100644 --- a/lib/widgets/chat_text_emoji.dart +++ b/lib/widgets/chat_text_emoji.dart @@ -20,12 +20,9 @@ final class ChatTextEmoji extends StatelessWidget { padding: stateIcon != null ? EdgeInsets.fromLTRB(0, 0, 0, 12) : EdgeInsets.zero, - child: Text( - emoji, - style: textStyle.copyWith(fontSize: 48), - ), + child: Text(emoji, style: textStyle.copyWith(fontSize: 48)), ), - if (stateIcon != null) stateIcon!, + ?stateIcon, ], ); } diff --git a/lib/widgets/circle_identicon.dart b/lib/widgets/circle_identicon.dart index cf7a1fe..61d8b57 100644 --- a/lib/widgets/circle_identicon.dart +++ b/lib/widgets/circle_identicon.dart @@ -6,10 +6,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; final class CircleIdenticon extends ConsumerWidget { final PublicKey publicKey; - const CircleIdenticon({ - super.key, - required this.publicKey, - }); + const CircleIdenticon({super.key, required this.publicKey}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/lib/widgets/connection_status_icon.dart b/lib/widgets/connection_status_icon.dart index f4de96b..500136d 100644 --- a/lib/widgets/connection_status_icon.dart +++ b/lib/widgets/connection_status_icon.dart @@ -11,32 +11,27 @@ const _logger = Logger(['ConnectionStatusIcon']); final class ConnectionStatusIcon extends ConsumerWidget { final Profile profile; - const ConnectionStatusIcon({ - super.key, - required this.profile, - }); + const ConnectionStatusIcon({super.key, required this.profile}); @override Widget build(BuildContext context, WidgetRef ref) { - return ref.watch(toxEventsProvider(profile.secretKey, profile.nospam)).when( + return ref + .watch(toxEventsProvider(profile.secretKey, profile.nospam)) + .when( data: (event) { - final online = event is ToxEventSelfConnectionStatus && + final online = + event is ToxEventSelfConnectionStatus && event.connectionStatus != Tox_Connection.TOX_CONNECTION_NONE; return Icon( online ? Icons.online_prediction : Icons.offline_bolt_outlined, color: online ? Colors.green : Colors.red, ); }, - loading: () => const Icon( - Icons.offline_bolt_outlined, - color: Colors.red, - ), + loading: () => + const Icon(Icons.offline_bolt_outlined, color: Colors.red), error: (error, _) { _logger.e('Error: $error'); - return const Icon( - Icons.error, - color: Colors.red, - ); + return const Icon(Icons.error, color: Colors.red); }, ); } diff --git a/lib/widgets/contact_list_item.dart b/lib/widgets/contact_list_item.dart index f8e6e46..84e0470 100644 --- a/lib/widgets/contact_list_item.dart +++ b/lib/widgets/contact_list_item.dart @@ -17,9 +17,12 @@ final class ContactListItem extends StatelessWidget { Widget build(BuildContext context) { return ListTile( title: Text( - contact.name ?? AppLocalizations.of(context)!.defaultContactName), - subtitle: - Text(contact.publicKey.toJson(), overflow: TextOverflow.ellipsis), + contact.name ?? AppLocalizations.of(context)!.defaultContactName, + ), + subtitle: Text( + contact.publicKey.toJson(), + overflow: TextOverflow.ellipsis, + ), trailing: CircleIdenticon(publicKey: contact.publicKey), onTap: () => onTap(contact), ); diff --git a/lib/widgets/main_menu.dart b/lib/widgets/main_menu.dart index d6cc587..68b7ac0 100644 --- a/lib/widgets/main_menu.dart +++ b/lib/widgets/main_menu.dart @@ -55,16 +55,16 @@ final class MainMenu extends ConsumerWidget { builder: (context, snapshot) { final profile = snapshot.data; if (profile == null) { - return const Center( - child: CircularProgressIndicator(), - ); + return const Center(child: CircularProgressIndicator()); } return UserProfilePage( constants: constants, profile: profile, onUpdateProfile: (settings) async { await database.updateProfileSettings( - profile.id, settings); + profile.id, + settings, + ); _logger.d('Updated profile settings'); }, ); @@ -82,10 +82,8 @@ final class MainMenu extends ConsumerWidget { Navigator.push( context, MaterialPageRoute( - builder: (context) => SettingsPage( - database: database, - profile: profile, - ), + builder: (context) => + SettingsPage(database: database, profile: profile), ), ); }, @@ -106,7 +104,7 @@ final class MainMenu extends ConsumerWidget { onTap: () { SystemChannels.platform.invokeMethod('SystemNavigator.pop'); }, - ) + ), ], ); } diff --git a/lib/widgets/message_input.dart b/lib/widgets/message_input.dart index 668b739..56fd9e2 100644 --- a/lib/widgets/message_input.dart +++ b/lib/widgets/message_input.dart @@ -8,16 +8,9 @@ import 'package:flutter_hooks/flutter_hooks.dart'; const _logger = Logger(['MessageInput']); -enum _SendMode { - text, - attachment, -} +enum _SendMode { text, attachment } -enum _EditMode { - text, - attachment, - emoji, -} +enum _EditMode { text, attachment, emoji } final class MessageInput extends HookWidget { final String hintText; @@ -71,10 +64,7 @@ final class MessageInput extends HookWidget { if (replyingTo != null) ...[ Container( color: Theme.of(context).primaryColor, - padding: const EdgeInsets.symmetric( - vertical: 8, - horizontal: 16, - ), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: Row( children: [ Icon(Icons.reply, color: buttonColor), @@ -146,11 +136,13 @@ final class MessageInput extends HookWidget { onSubmitted: (_) => send(), contentInsertionConfiguration: ContentInsertionConfiguration( - onContentInserted: (content) { - _logger.d('Content inserted: ${content.mimeType}, ' - '${content.uri}, ${content.data?.length} bytes'); - }, - ), + onContentInserted: (content) { + _logger.d( + 'Content inserted: ${content.mimeType}, ' + '${content.uri}, ${content.data?.length} bytes', + ); + }, + ), decoration: InputDecoration( isDense: true, hintText: hintText, diff --git a/lib/widgets/nickname_field.dart b/lib/widgets/nickname_field.dart index a64b5ad..bcaffa4 100644 --- a/lib/widgets/nickname_field.dart +++ b/lib/widgets/nickname_field.dart @@ -16,34 +16,33 @@ final class NicknameField extends StatelessWidget { @override Widget build(BuildContext context) { - return Column(children: [ - Text( - AppLocalizations.of(context)!.profileTextFieldNick, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold, + return Column( + children: [ + Text( + AppLocalizations.of(context)!.profileTextFieldNick, + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold), ), - ), - Padding( - padding: const EdgeInsets.all(8), - child: TextFormField( - key: const Key('nicknameField'), - autovalidateMode: AutovalidateMode.onUserInteraction, - validator: (value) { - value ??= ''; - if (value.isEmpty || value.length > constants.maxNameLength) { - return AppLocalizations.of(context)!.nickLengthError( - constants.maxNameLength, - ); - } + Padding( + padding: const EdgeInsets.all(8), + child: TextFormField( + key: const Key('nicknameField'), + autovalidateMode: AutovalidateMode.onUserInteraction, + validator: (value) { + value ??= ''; + if (value.isEmpty || value.length > constants.maxNameLength) { + return AppLocalizations.of( + context, + )!.nickLengthError(constants.maxNameLength); + } - return null; - }, - controller: controller, - textInputAction: TextInputAction.next, - onChanged: onChanged, + return null; + }, + controller: controller, + textInputAction: TextInputAction.next, + onChanged: onChanged, + ), ), - ), - ]); + ], + ); } } diff --git a/lib/widgets/status_message_field.dart b/lib/widgets/status_message_field.dart index 4958a31..072b827 100644 --- a/lib/widgets/status_message_field.dart +++ b/lib/widgets/status_message_field.dart @@ -16,33 +16,33 @@ final class StatusMessageField extends StatelessWidget { @override Widget build(BuildContext context) { - return Column(children: [ - Text( - AppLocalizations.of(context)!.profileTextFieldUserStatusMessage, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold, + return Column( + children: [ + Text( + AppLocalizations.of(context)!.profileTextFieldUserStatusMessage, + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold), ), - ), - Padding( - padding: const EdgeInsets.all(8), - child: TextFormField( - key: const Key('statusMessageField'), - autovalidateMode: AutovalidateMode.onUserInteraction, - validator: (value) { - value ??= ''; - if (value.length > constants.maxStatusMessageLength) { - return AppLocalizations.of(context)! - .statusMessageLengthError(constants.maxStatusMessageLength); - } + Padding( + padding: const EdgeInsets.all(8), + child: TextFormField( + key: const Key('statusMessageField'), + autovalidateMode: AutovalidateMode.onUserInteraction, + validator: (value) { + value ??= ''; + if (value.length > constants.maxStatusMessageLength) { + return AppLocalizations.of( + context, + )!.statusMessageLengthError(constants.maxStatusMessageLength); + } - return null; - }, - controller: controller, - textInputAction: TextInputAction.next, - onChanged: onChanged, + return null; + }, + controller: controller, + textInputAction: TextInputAction.next, + onChanged: onChanged, + ), ), - ), - ]); + ], + ); } } diff --git a/lib/widgets/tox_id_field.dart b/lib/widgets/tox_id_field.dart index cc33950..1281717 100644 --- a/lib/widgets/tox_id_field.dart +++ b/lib/widgets/tox_id_field.dart @@ -22,8 +22,9 @@ final class ToxIdField extends StatelessWidget { validator: (value) { value ??= ''; if (value.length != constants.addressSize * 2) { - final msg = AppLocalizations.of(context)! - .toxIdLengthError(constants.addressSize * 2); + final msg = AppLocalizations.of( + context, + )!.toxIdLengthError(constants.addressSize * 2); return '$msg (${value.length}/76)'; } return null; diff --git a/linux/runner/my_application.cc b/linux/runner/my_application.cc index 188ff35..a75c121 100644 --- a/linux/runner/my_application.cc +++ b/linux/runner/my_application.cc @@ -14,6 +14,11 @@ struct _MyApplication { G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + // Implements GApplication::activate. static void my_application_activate(GApplication* application) { MyApplication* self = MY_APPLICATION(application); @@ -48,31 +53,44 @@ static void my_application_activate(GApplication* application) { } gtk_window_set_default_size(window, 480, 960); - 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); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); gtk_widget_show(GTK_WIDGET(view)); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(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) { +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_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; } g_application_activate(application); @@ -83,7 +101,7 @@ static gboolean my_application_local_command_line(GApplication* application, gch // Implements GApplication::startup. static void my_application_startup(GApplication* application) { - //MyApplication* self = MY_APPLICATION(object); + // MyApplication* self = MY_APPLICATION(object); // Perform any actions required at application startup. @@ -92,7 +110,7 @@ static void my_application_startup(GApplication* application) { // Implements GApplication::shutdown. static void my_application_shutdown(GApplication* application) { - //MyApplication* self = MY_APPLICATION(object); + // MyApplication* self = MY_APPLICATION(object); // Perform any actions required at application shutdown. @@ -108,7 +126,8 @@ static void my_application_dispose(GObject* 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)->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; @@ -124,7 +143,6 @@ MyApplication* my_application_new() { g_set_prgname(APPLICATION_ID); return MY_APPLICATION(g_object_new(my_application_get_type(), - "application-id", APPLICATION_ID, - "flags", G_APPLICATION_NON_UNIQUE, - nullptr)); + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); } diff --git a/linux/runner/my_application.h b/linux/runner/my_application.h index 72271d5..db16367 100644 --- a/linux/runner/my_application.h +++ b/linux/runner/my_application.h @@ -3,7 +3,10 @@ #include -G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, +G_DECLARE_FINAL_TYPE(MyApplication, + my_application, + MY, + APPLICATION, GtkApplication) /** diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index bfb64d6..9b85c85 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,7 +9,7 @@ import emoji_picker_flutter import file_picker import file_selector_macos import geolocator_apple -import path_provider_foundation +import package_info_plus import shared_preferences_foundation import sodium_libs import sqlcipher_flutter_libs @@ -19,7 +19,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) - PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SodiumLibsPlugin.register(with: registry.registrar(forPlugin: "SodiumLibsPlugin")) Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin")) diff --git a/macos/Podfile b/macos/Podfile index 29c8eb3..26c624b 100644 --- a/macos/Podfile +++ b/macos/Podfile @@ -1,4 +1,4 @@ -platform :osx, '10.14' +platform :osx, '11.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -38,5 +38,8 @@ end post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_macos_build_settings(target) + target.build_configurations.each do |config| + config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '11.0' + end end end diff --git a/macos/Podfile.lock b/macos/Podfile.lock deleted file mode 100644 index f447a77..0000000 --- a/macos/Podfile.lock +++ /dev/null @@ -1,78 +0,0 @@ -PODS: - - emoji_picker_flutter (0.0.1): - - FlutterMacOS - - file_picker (0.0.1): - - FlutterMacOS - - file_selector_macos (0.0.1): - - FlutterMacOS - - FlutterMacOS (1.0.0) - - geolocator_apple (1.2.0): - - FlutterMacOS - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - - "sodium_libs (3.4.3+1)": - - Flutter - - FlutterMacOS - - SQLCipher (4.5.7): - - SQLCipher/standard (= 4.5.7) - - SQLCipher/common (4.5.7) - - SQLCipher/standard (4.5.7): - - SQLCipher/common - - sqlcipher_flutter_libs (0.0.1): - - FlutterMacOS - - SQLCipher (~> 4.5.7) - -DEPENDENCIES: - - emoji_picker_flutter (from `Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos`) - - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) - - FlutterMacOS (from `Flutter/ephemeral`) - - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos`) - - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - - sodium_libs (from `Flutter/ephemeral/.symlinks/plugins/sodium_libs/darwin`) - - sqlcipher_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlcipher_flutter_libs/macos`) - -SPEC REPOS: - trunk: - - SQLCipher - -EXTERNAL SOURCES: - emoji_picker_flutter: - :path: Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos - file_picker: - :path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos - file_selector_macos: - :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos - FlutterMacOS: - :path: Flutter/ephemeral - geolocator_apple: - :path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos - path_provider_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin - shared_preferences_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin - sodium_libs: - :path: Flutter/ephemeral/.symlinks/plugins/sodium_libs/darwin - sqlcipher_flutter_libs: - :path: Flutter/ephemeral/.symlinks/plugins/sqlcipher_flutter_libs/macos - -SPEC CHECKSUMS: - emoji_picker_flutter: 51ca408e289d84d1e460016b2a28721ec754fcf7 - file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a - file_selector_macos: 6280b52b459ae6c590af5d78fc35c7267a3c4b31 - FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - geolocator_apple: ccfb79d5250de3a295f5093cd03e76aa8836a416 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 - shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 - sodium_libs: d5a8c0ec38806fe1cff3caf98c8319378da0bc1d - SQLCipher: 5e6bfb47323635c8b657b1b27d25c5f1baf63bf5 - sqlcipher_flutter_libs: cce5c169d6e1442eccf8642932b204319a6a3062 - -PODFILE CHECKSUM: 7eb978b976557c8c1cd717d8185ec483fd090a82 - -COCOAPODS: 1.16.2 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 74b5b7c..36b5e6a 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -21,6 +21,7 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 01F0781468BC822F10DC8A05 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A8C70FB0B2D9AFD742ADB3DA /* Pods_RunnerTests.framework */; }; 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 */; }; @@ -29,8 +30,7 @@ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; 64199DB92D6A2A7A00DF0900 /* Tox.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 64199DB72D6A2A2000DF0900 /* Tox.xcframework */; }; 64199DBA2D6A2A7A00DF0900 /* Tox.xcframework in Bundle Framework */ = {isa = PBXBuildFile; fileRef = 64199DB72D6A2A2000DF0900 /* Tox.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 970FF055AB6A1B4747CA4433 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABE5E5EC8828459C78DDB678 /* Pods_RunnerTests.framework */; }; - F370CF4069DE14384DA40856 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7F767652C1419DC9F6A6A2 /* Pods_Runner.framework */; }; + EB72DCE375DE8FF0C4219C03 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F470658074DB5C8067B805F5 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -81,17 +81,17 @@ 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 = ""; }; - 425B333BBA403A39E5A5D587 /* 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 = ""; }; - 4C7F767652C1419DC9F6A6A2 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 64199DB72D6A2A2000DF0900 /* Tox.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = Tox.xcframework; sourceTree = ""; }; - 65DB8DA0EC37C89CC70AB85E /* 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 = ""; }; + 672DD3ACF494A67DBF140BAF /* 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 = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 7D0DAFAA6F783BD0D6E2F58D /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A851D80B8FE7E3F27AEFD24D /* 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 = ""; }; - AB11EA7972BE3BA76EB0D4F6 /* 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 = ""; }; - ABE5E5EC8828459C78DDB678 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - EFDA39DE685189199B1E9FFD /* 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 = ""; }; + 9FB716BFC8DC02FBC901B324 /* 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 = ""; }; + A8C70FB0B2D9AFD742ADB3DA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B1E22308AC7F9F9EE12BE082 /* 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 = ""; }; + BE712E88212EF0242BA5C1B2 /* 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 = ""; }; + EF903D868001239510A3747A /* 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 = ""; }; + F470658074DB5C8067B805F5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F95E596F669A90ED59D7DAC7 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -99,7 +99,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 970FF055AB6A1B4747CA4433 /* Pods_RunnerTests.framework in Frameworks */, + 01F0781468BC822F10DC8A05 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -107,7 +107,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F370CF4069DE14384DA40856 /* Pods_Runner.framework in Frameworks */, + EB72DCE375DE8FF0C4219C03 /* Pods_Runner.framework in Frameworks */, 64199DB92D6A2A7A00DF0900 /* Tox.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -115,19 +115,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 059310D7D3B083C2183E82DD /* Pods */ = { - isa = PBXGroup; - children = ( - 425B333BBA403A39E5A5D587 /* Pods-Runner.debug.xcconfig */, - 65DB8DA0EC37C89CC70AB85E /* Pods-Runner.release.xcconfig */, - AB11EA7972BE3BA76EB0D4F6 /* Pods-Runner.profile.xcconfig */, - 7D0DAFAA6F783BD0D6E2F58D /* Pods-RunnerTests.debug.xcconfig */, - A851D80B8FE7E3F27AEFD24D /* Pods-RunnerTests.release.xcconfig */, - EFDA39DE685189199B1E9FFD /* Pods-RunnerTests.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -155,7 +142,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - 059310D7D3B083C2183E82DD /* Pods */, + C6EE80B7E23F0F5D485CE2C3 /* Pods */, ); sourceTree = ""; }; @@ -203,11 +190,25 @@ path = Runner; sourceTree = ""; }; + C6EE80B7E23F0F5D485CE2C3 /* Pods */ = { + isa = PBXGroup; + children = ( + F95E596F669A90ED59D7DAC7 /* Pods-Runner.debug.xcconfig */, + B1E22308AC7F9F9EE12BE082 /* Pods-Runner.release.xcconfig */, + BE712E88212EF0242BA5C1B2 /* Pods-Runner.profile.xcconfig */, + 672DD3ACF494A67DBF140BAF /* Pods-RunnerTests.debug.xcconfig */, + EF903D868001239510A3747A /* Pods-RunnerTests.release.xcconfig */, + 9FB716BFC8DC02FBC901B324 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - 4C7F767652C1419DC9F6A6A2 /* Pods_Runner.framework */, - ABE5E5EC8828459C78DDB678 /* Pods_RunnerTests.framework */, + F470658074DB5C8067B805F5 /* Pods_Runner.framework */, + A8C70FB0B2D9AFD742ADB3DA /* Pods_RunnerTests.framework */, 64199DB72D6A2A2000DF0900 /* Tox.xcframework */, ); name = Frameworks; @@ -220,7 +221,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - F738756D5DB132425FB5CBBF /* [CP] Check Pods Manifest.lock */, + 345B887943C3897F1F7002C9 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -239,13 +240,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 632F93308ECE2DE5110F93C6 /* [CP] Check Pods Manifest.lock */, + F134A196D39F6739B8E40F9D /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - E08C759A2DB2A69CDD87D012 /* [CP] Embed Pods Frameworks */, + 872E76E930F2580E94509B91 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -366,7 +367,7 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 632F93308ECE2DE5110F93C6 /* [CP] Check Pods Manifest.lock */ = { + 345B887943C3897F1F7002C9 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -381,14 +382,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(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; }; - E08C759A2DB2A69CDD87D012 /* [CP] Embed Pods Frameworks */ = { + 872E76E930F2580E94509B91 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -405,7 +406,7 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - F738756D5DB132425FB5CBBF /* [CP] Check Pods Manifest.lock */ = { + F134A196D39F6739B8E40F9D /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -420,7 +421,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -478,7 +479,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7D0DAFAA6F783BD0D6E2F58D /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 672DD3ACF494A67DBF140BAF /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -493,7 +494,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A851D80B8FE7E3F27AEFD24D /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = EF903D868001239510A3747A /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -508,7 +509,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EFDA39DE685189199B1E9FFD /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 9FB716BFC8DC02FBC901B324 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -562,7 +563,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -644,7 +645,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -694,7 +695,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png index 78dc315..bf74bd0 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png index c81fb52..49e7d94 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png index 84a0b44..a787dcd 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png index b5deb0b..095557d 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png index 489afec..8c4bfe6 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png index ca7fd3a..456ef71 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png index c0c0e1a..cc1f823 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/pubspec.lock b/pubspec.lock index 1d908cc..2f0aafc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,55 +5,66 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "88399e291da5f7e889359681a8f64b18c5123e03576b01f32a6a276611e511c3" + sha256: c209688d9f5a5f26b2fb47a188131a6fb9e876ae9e47af3737c0b4f58a93470d url: "https://pub.dev" source: hosted - version: "78.0.0" - _macros: + version: "91.0.0" + analysis_server_plugin: dependency: transitive - description: dart - source: sdk + description: + name: analysis_server_plugin + sha256: "26844e7f977087567135d62532b67d5639fe206c5194c3f410ba75e1a04a2747" + url: "https://pub.dev" + source: hosted version: "0.3.3" analyzer: dependency: "direct dev" description: name: analyzer - sha256: "62899ef43d0b962b056ed2ebac6b47ec76ffd003d5f7c4e4dc870afe63188e33" + sha256: a40a0cee526a7e1f387c6847bd8a5ccbf510a75952ef8a28338e989558072cb0 url: "https://pub.dev" source: hosted - version: "7.1.0" + version: "8.4.0" + analyzer_buffer: + dependency: transitive + description: + name: analyzer_buffer + sha256: aba2f75e63b3135fd1efaa8b6abefe1aa6e41b6bd9806221620fa48f98156033 + url: "https://pub.dev" + source: hosted + version: "0.1.11" analyzer_plugin: dependency: transitive description: name: analyzer_plugin - sha256: "1d460d14e3c2ae36dc2b32cef847c4479198cf87704f63c3c3c8150ee50c3916" + sha256: "08cfefa90b4f4dd3b447bda831cecf644029f9f8e22820f6ee310213ebe2dd53" url: "https://pub.dev" source: hosted - version: "0.12.0" + version: "0.13.10" archive: dependency: transitive description: name: archive - sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a" + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.7" args: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.7.0" async: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.0" boolean_selector: dependency: transitive description: @@ -66,50 +77,34 @@ packages: dependency: transitive description: name: build - sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + sha256: "275bf6bb2a00a9852c28d4e0b410da1d833a734d57d39d44f94bfc895a484ec3" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "4.0.4" build_config: dependency: transitive description: name: build_config - sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.0" build_daemon: dependency: transitive description: name: build_daemon - sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948" - url: "https://pub.dev" - source: hosted - version: "4.0.3" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" + sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 url: "https://pub.dev" source: hosted - version: "2.4.3" + version: "4.1.1" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" + sha256: ac78098de97893812b7aff1154f29008fa2464cad9e8e7044d39bc905dad4fbc url: "https://pub.dev" source: hosted - version: "2.4.14" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" - url: "https://pub.dev" - source: hosted - version: "8.0.0" + version: "2.11.0" built_collection: dependency: transitive description: @@ -122,10 +117,10 @@ packages: dependency: transitive description: name: built_value - sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2" + sha256: "7931c90b84bc573fef103548e354258ae4c9d28d140e41961df6843c5d60d4d8" url: "https://pub.dev" source: hosted - version: "8.9.3" + version: "8.12.3" characters: dependency: transitive description: @@ -146,10 +141,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.4" ci: dependency: transitive description: @@ -166,6 +161,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.12.0" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" cli_util: dependency: transitive description: @@ -182,14 +185,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" + source: hosted + version: "1.0.0" code_builder: dependency: transitive description: name: code_builder - sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" + sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" url: "https://pub.dev" source: hosted - version: "4.10.1" + version: "4.11.1" collection: dependency: transitive description: @@ -206,22 +217,30 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + coverage: + dependency: transitive + description: + name: coverage + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" + url: "https://pub.dev" + source: hosted + version: "1.15.0" cross_file: dependency: transitive description: name: cross_file - sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" url: "https://pub.dev" source: hosted - version: "0.3.4+2" + version: "0.3.5+2" crypto: dependency: "direct main" description: name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.7" csslib: dependency: transitive description: @@ -242,34 +261,26 @@ packages: dependency: "direct dev" description: name: custom_lint - sha256: "021897cce2b6c783b2521543e362e7fe1a2eaab17bf80514d8de37f99942ed9e" + sha256: "751ee9440920f808266c3ec2553420dea56d3c7837dd2d62af76b11be3fcece5" url: "https://pub.dev" source: hosted - version: "0.7.3" - custom_lint_builder: - dependency: transitive - description: - name: custom_lint_builder - sha256: e4235b9d8cef59afe621eba086d245205c8a0a6c70cd470be7cb17494d6df32d - url: "https://pub.dev" - source: hosted - version: "0.7.3" + version: "0.8.1" custom_lint_core: dependency: transitive description: name: custom_lint_core - sha256: "6dcee8a017181941c51a110da7e267c1d104dc74bec8862eeb8c85b5c8759a9e" + sha256: "85b339346154d5646952d44d682965dfe9e12cae5febd706f0db3aa5010d6423" url: "https://pub.dev" source: hosted - version: "0.7.1" + version: "0.8.1" custom_lint_visitor: dependency: transitive description: name: custom_lint_visitor - sha256: "14df0760dfa81b7b0c398c876045f4e4a343eb2c9d200c66163671dd3e337c1b" + sha256: "91f2a81e9f0abb4b9f3bb529f78b6227ce6050300d1ae5b1e2c69c66c7a566d8" url: "https://pub.dev" source: hosted - version: "1.0.0+7.1.0" + version: "1.0.0+8.4.0" dart_earcut: dependency: transitive description: @@ -278,38 +289,54 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + dart_polylabel2: + dependency: transitive + description: + name: dart_polylabel2 + sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6" + url: "https://pub.dev" + source: hosted + version: "1.0.0" dart_style: dependency: transitive description: name: dart_style - sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.3" + dbus: + dependency: transitive + description: + name: dbus + sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270 + url: "https://pub.dev" + source: hosted + version: "0.7.12" drift: dependency: "direct main" description: name: drift - sha256: ab4d0e7aa1793829b1dd8e72d71bbf0b53bf4ff84b184045d1ab71b0832e632e + sha256: "970cd188fddb111b26ea6a9b07a62bf5c2432d74147b8122c67044ae3b97e99e" url: "https://pub.dev" source: hosted - version: "2.25.0" + version: "2.31.0" drift_dev: dependency: "direct dev" description: name: drift_dev - sha256: "9aaf4e4c406afb93e907b5e21e0120a2618abb436bec5809fa9190232f3eed47" + sha256: "917184b2fb867b70a548a83bf0d36268423b38d39968c06cce4905683da49587" url: "https://pub.dev" source: hosted - version: "2.25.0" + version: "2.31.0" emoji_picker_flutter: dependency: "direct main" description: name: emoji_picker_flutter - sha256: "9a44c102079891ea5877f78c70f2e3c6e9df7b7fe0a01757d31f1046eeaa016d" + sha256: "984d3e9b9cf3175df9a868ce4a2d9611491e80e5d3b8e2b1e8991a4998972885" url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.4.0" emoji_regex: dependency: "direct main" description: @@ -322,26 +349,26 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" ffi: dependency: "direct main" description: name: ffi - sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + sha256: d07d37192dbf97461359c1518788f203b0c9102cfd2c35a716b823741219542c url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.5" ffigen: dependency: "direct dev" description: name: ffigen - sha256: a0ca4853028c6a9e4d9a0a40bb744fceb898c89d75931d08e87b3987d0087060 + sha256: b7803707faeec4ce3c1b0c2274906504b796e3b70ad573577e72333bd1c9b3ba url: "https://pub.dev" source: hosted - version: "15.0.0" + version: "20.1.1" file: dependency: transitive description: @@ -354,42 +381,42 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "6f6bfa8797f296965bdc3e1f702574ab49a540c19b9237b401e7c2b25dfe594c" + sha256: "57d9a1dd5063f85fa3107fb42d1faffda52fdc948cefd5fe5ea85267a5fc7343" url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "10.3.10" file_selector_linux: dependency: transitive description: name: file_selector_linux - sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" url: "https://pub.dev" source: hosted - version: "0.9.3+2" + version: "0.9.4" file_selector_macos: dependency: transitive description: name: file_selector_macos - sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc" + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" url: "https://pub.dev" source: hosted - version: "0.9.4+2" + version: "0.9.5" file_selector_platform_interface: dependency: transitive description: name: file_selector_platform_interface - sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" url: "https://pub.dev" source: hosted - version: "2.6.2" + version: "2.7.0" file_selector_windows: dependency: transitive description: name: file_selector_windows - sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" url: "https://pub.dev" source: hosted - version: "0.9.3+4" + version: "0.9.3+5" fixnum: dependency: transitive description: @@ -415,10 +442,10 @@ packages: dependency: transitive description: name: flutter_background_service_android - sha256: b73d903056240e23a5c56d9e52d3a5d02ae41cb18b2988a97304ae37b2bae4bf + sha256: ca0793d4cd19f1e194a130918401a3d0b1076c81236f7273458ae96987944a87 url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.3.1" flutter_background_service_ios: dependency: transitive description: @@ -439,34 +466,34 @@ packages: dependency: "direct main" description: name: flutter_context_menu - sha256: "4bc1dc30ae5aa705ed99ebbeb875898c6341a6d092397a566fecd5184b392380" + sha256: e8f2cd13ef5e3320e35b27b3f7de278d9fc6b3f9c328cc16cd90784fb66d1054 url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.4.1" flutter_hooks: dependency: "direct main" description: name: flutter_hooks - sha256: cde36b12f7188c85286fba9b38cc5a902e7279f36dd676967106c041dc9dde70 + sha256: "8ae1f090e5f4ef5cfa6670ce1ab5dddadd33f3533a7f9ba19d9f958aa2a89f42" url: "https://pub.dev" source: hosted - version: "0.20.5" + version: "0.21.3+1" flutter_launcher_icons: dependency: "direct dev" description: name: flutter_launcher_icons - sha256: bfa04787c85d80ecb3f8777bde5fc10c3de809240c48fa061a2c2bf15ea5211c + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" url: "https://pub.dev" source: hosted - version: "0.14.3" + version: "0.14.4" flutter_lints: dependency: "direct dev" description: name: flutter_lints - sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.0.0" flutter_localizations: dependency: "direct main" description: flutter @@ -476,26 +503,26 @@ packages: dependency: "direct main" description: name: flutter_map - sha256: bbf145e8220531f2f727608c431871c7457f3b134e513543913afd00fdc1cd47 + sha256: "391e7dc95cc3f5190748210a69d4cfeb5d8f84dcdfa9c3235d0a9d7742ccb3f8" url: "https://pub.dev" source: hosted - version: "8.1.0" + version: "8.2.2" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" + sha256: ee8068e0e1cd16c4a82714119918efdeed33b3ba7772c54b5d094ab53f9b7fd1 url: "https://pub.dev" source: hosted - version: "2.0.24" + version: "2.0.33" flutter_riverpod: dependency: "direct main" description: name: flutter_riverpod - sha256: "9532ee6db4a943a1ed8383072a2e3eeda041db5657cdf6d2acecf3c21ecbe7e1" + sha256: "38ec6c303e2c83ee84512f5fc2a82ae311531021938e63d7137eccc107bf3c02" url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "3.1.0" flutter_test: dependency: "direct dev" description: flutter @@ -510,18 +537,18 @@ packages: dependency: "direct dev" description: name: freezed - sha256: "59a584c24b3acdc5250bb856d0d3e9c0b798ed14a4af1ddb7dc1c7b41df91c9c" + sha256: "13065f10e135263a4f5a4391b79a8efc5fb8106f8dd555a9e49b750b45393d77" url: "https://pub.dev" source: hosted - version: "2.5.8" + version: "3.2.3" freezed_annotation: dependency: "direct main" description: name: freezed_annotation - sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 + sha256: "7294967ff0a6d98638e7acb774aac3af2550777accd8149c90af5b014e6d44d8" url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "3.1.0" frontend_server_client: dependency: transitive description: @@ -530,54 +557,70 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + geoclue: + dependency: transitive + description: + name: geoclue + sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f + url: "https://pub.dev" + source: hosted + version: "0.1.1" geolocator: dependency: "direct main" description: name: geolocator - sha256: d2ec66329cab29cb297d51d96c067d457ca519dca8589665fa0b82ebacb7dbe4 + sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" url: "https://pub.dev" source: hosted - version: "13.0.2" + version: "14.0.2" geolocator_android: dependency: transitive description: name: geolocator_android - sha256: "7aefc530db47d90d0580b552df3242440a10fe60814496a979aa67aa98b1fd47" + sha256: "179c3cb66dfa674fc9ccbf2be872a02658724d1c067634e2c427cf6df7df901a" url: "https://pub.dev" source: hosted - version: "4.6.1" + version: "5.0.2" geolocator_apple: dependency: transitive description: name: geolocator_apple - sha256: c4ecead17985ede9634f21500072edfcb3dba0ef7b97f8d7bc556d2d722b3ba3 + sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 url: "https://pub.dev" source: hosted - version: "2.3.9" + version: "2.3.13" + geolocator_linux: + dependency: transitive + description: + name: geolocator_linux + sha256: d64112a205931926f4363bb6bd48f14cb38e7326833041d170615586cd143797 + url: "https://pub.dev" + source: hosted + version: "0.2.4" geolocator_platform_interface: dependency: transitive description: name: geolocator_platform_interface - sha256: "386ce3d9cce47838355000070b1d0b13efb5bc430f8ecda7e9238c8409ace012" + sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" url: "https://pub.dev" source: hosted - version: "4.2.4" + version: "4.2.6" geolocator_web: dependency: transitive description: name: geolocator_web - sha256: "2ed69328e05cd94e7eb48bb0535f5fc0c0c44d1c4fa1e9737267484d05c29b5e" + sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 url: "https://pub.dev" source: hosted - version: "4.1.1" + version: "4.1.3" geolocator_windows: dependency: transitive description: name: geolocator_windows - sha256: "53da08937d07c24b0d9952eb57a3b474e29aae2abf9dd717f7e1230995f13f0e" + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" url: "https://pub.dev" source: hosted - version: "0.2.3" + version: "0.2.5" glob: dependency: transitive description: @@ -594,38 +637,46 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" - hooks_riverpod: - dependency: "direct main" + gsettings: + dependency: transitive description: - name: hooks_riverpod - sha256: "70bba33cfc5670c84b796e6929c54b8bc5be7d0fe15bb28c2560500b9ad06966" + name: gsettings + sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" url: "https://pub.dev" source: hosted - version: "2.6.1" - hotreloader: + version: "0.2.8" + hooks: dependency: transitive description: - name: hotreloader - sha256: bc167a1163807b03bada490bfe2df25b0d744df359227880220a5cbd04e5734b + name: hooks + sha256: "7a08a0d684cb3b8fb604b78455d5d352f502b68079f7b80b831c62220ab0a4f6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + hooks_riverpod: + dependency: "direct main" + description: + name: hooks_riverpod + sha256: b880efcd17757af0aa242e5dceac2fb781a014c22a32435a5daa8f17e9d5d8a9 url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "3.1.0" html: dependency: transitive description: name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" url: "https://pub.dev" source: hosted - version: "0.15.5" + version: "0.15.6" http: dependency: "direct main" description: name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.6.0" http_multi_server: dependency: transitive description: @@ -646,82 +697,82 @@ packages: dependency: transitive description: name: image - sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6" + sha256: "492bd52f6c4fbb6ee41f781ff27765ce5f627910e1e0cbecfa3d9add5562604c" url: "https://pub.dev" source: hosted - version: "4.5.2" + version: "4.7.2" image_picker: dependency: "direct main" description: name: image_picker - sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + sha256: "784210112be18ea55f69d7076e2c656a4e24949fa9e76429fe53af0c0f4fa320" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.1" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: "82652a75e3dd667a91187769a6a2cc81bd8c111bbead698d8e938d2b63e5e89a" + sha256: "518a16108529fc18657a3e6dde4a043dc465d16596d20ab2abd49a4cac2e703d" url: "https://pub.dev" source: hosted - version: "0.8.12+21" + version: "0.8.13+13" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.1.1" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" + sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 url: "https://pub.dev" source: hosted - version: "0.8.12+2" + version: "0.8.13+6" image_picker_linux: dependency: transitive description: name: image_picker_linux - sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" url: "https://pub.dev" source: hosted - version: "0.2.1+1" + version: "0.2.2" image_picker_macos: dependency: transitive description: name: image_picker_macos - sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" url: "https://pub.dev" source: hosted - version: "0.2.1+2" + version: "0.2.2+1" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" + sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" url: "https://pub.dev" source: hosted - version: "2.10.1" + version: "2.11.1" image_picker_windows: dependency: transitive description: name: image_picker_windows - sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae url: "https://pub.dev" source: hosted - version: "0.2.1+1" + version: "0.2.2" intl: dependency: "direct main" description: name: intl - sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" url: "https://pub.dev" source: hosted - version: "0.19.0" + version: "0.20.2" io: dependency: transitive description: @@ -734,10 +785,10 @@ packages: dependency: transitive description: name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "0.7.2" json_annotation: dependency: "direct main" description: @@ -750,18 +801,18 @@ packages: dependency: "direct dev" description: name: json_serializable - sha256: b0a98230538fe5d0b60a22fb6bf1b6cb03471b53e3324ff6069c591679dd59c9 + sha256: c5b2ee75210a0f263c6c7b9eeea80553dbae96ea1bf57f02484e806a3ffdffa3 url: "https://pub.dev" source: hosted - version: "6.9.3" + version: "6.11.2" keyboard_height_plugin: dependency: "direct main" description: name: keyboard_height_plugin - sha256: "3a51c8ebb43465ebe0b3bad17f3b6d945421e58011f3f5a08134afe69a3d775f" + sha256: "633df6e561d20b8d54fe1d4525124882e4c50c40974c42997cd647736e428380" url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" latlong2: dependency: "direct main" description: @@ -774,34 +825,34 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.1.0" lists: dependency: transitive description: @@ -814,10 +865,10 @@ packages: dependency: transitive description: name: logger - sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 + sha256: a7967e31b703831a893bbc3c3dd11db08126fe5f369b5c648a36f821979f5be3 url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.6.2" logging: dependency: transitive description: @@ -826,14 +877,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - macros: - dependency: transitive - description: - name: macros - sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" - url: "https://pub.dev" - source: hosted - version: "0.1.3-main.0" matcher: dependency: transitive description: @@ -854,10 +897,10 @@ packages: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" mgrs_dart: dependency: transitive description: @@ -874,14 +917,62 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + mockito: + dependency: transitive + description: + name: mockito + sha256: a45d1aa065b796922db7b9e7e7e45f921aed17adf3a8318a1f47097e7e695566 + url: "https://pub.dev" + source: hosted + version: "5.6.3" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: "89e83885ba09da5fdf2cdacc8002a712ca238c28b7f717910b34bcd27b0d03ac" + url: "https://pub.dev" + source: hosted + version: "0.17.4" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" + url: "https://pub.dev" + source: hosted + version: "9.3.0" package_config: dependency: transitive description: name: package_config - sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: f69da0d3189a4b4ceaeb1a3defb0f329b3b352517f52bed4290f83d4f06bc08d + url: "https://pub.dev" + source: hosted + version: "9.0.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" path: dependency: "direct main" description: @@ -902,18 +993,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e url: "https://pub.dev" source: hosted - version: "2.2.15" + version: "2.2.22" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.6.0" path_provider_linux: dependency: transitive description: @@ -942,10 +1033,10 @@ packages: dependency: transitive description: name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "7.0.1" platform: dependency: transitive description: @@ -962,30 +1053,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" - polylabel: - dependency: transitive - description: - name: polylabel - sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" - url: "https://pub.dev" - source: hosted - version: "1.0.1" pool: dependency: transitive description: name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" url: "https://pub.dev" source: hosted - version: "1.5.1" + version: "1.5.2" posix: dependency: transitive description: name: posix - sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a + sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" url: "https://pub.dev" source: hosted - version: "6.0.1" + version: "6.0.3" proj4dart: dependency: transitive description: @@ -998,10 +1081,10 @@ packages: dependency: transitive description: name: pub_semver - sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.2.0" pubspec_parse: dependency: transitive description: @@ -1030,42 +1113,42 @@ packages: dependency: transitive description: name: riverpod - sha256: "59062512288d3056b2321804332a13ffdd1bf16df70dcc8e506e411280a72959" + sha256: "16ff608d21e8ea64364f2b7c049c94a02ab81668f78845862b6e88b71dd4935a" url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "3.1.0" riverpod_analyzer_utils: dependency: transitive description: name: riverpod_analyzer_utils - sha256: "837a6dc33f490706c7f4632c516bcd10804ee4d9ccc8046124ca56388715fdf3" + sha256: "947b05d04c52a546a2ac6b19ef2a54b08520ff6bdf9f23d67957a4c8df1c3bc0" url: "https://pub.dev" source: hosted - version: "0.5.9" + version: "1.0.0-dev.8" riverpod_annotation: dependency: "direct main" description: name: riverpod_annotation - sha256: e14b0bf45b71326654e2705d462f21b958f987087be850afd60578fcd502d1b8 + sha256: cc1474bc2df55ec3c1da1989d139dcef22cd5e2bd78da382e867a69a8eca2e46 url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "4.0.0" riverpod_generator: dependency: "direct dev" description: name: riverpod_generator - sha256: "120d3310f687f43e7011bb213b90a436f1bbc300f0e4b251a72c39bccb017a4f" + sha256: e43b1537229cc8f487f09b0c20d15dba840acbadcf5fc6dad7ad5e8ab75950dc url: "https://pub.dev" source: hosted - version: "2.6.4" + version: "4.0.0+1" riverpod_lint: dependency: "direct dev" description: name: riverpod_lint - sha256: b05408412b0f75dec954e032c855bc28349eeed2d2187f94519e1ddfdf8b3693 + sha256: "4d2eb0d19bbe7e3323bd0ce4553b2e6170d161a13914bfdd85a3612329edcb43" url: "https://pub.dev" source: hosted - version: "2.6.4" + version: "3.1.0" rxdart: dependency: transitive description: @@ -1078,26 +1161,26 @@ packages: dependency: transitive description: name: shared_preferences - sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a" + sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.5.4" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: a768fc8ede5f0c8e6150476e14f38e2417c0864ca36bb4582be8e21925a03c22 + sha256: cbc40be9be1c5af4dab4d6e0de4d5d3729e6f3d65b89d21e1815d57705644a6f url: "https://pub.dev" source: hosted - version: "2.4.6" + version: "2.4.20" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.6" shared_preferences_linux: dependency: transitive description: @@ -1138,14 +1221,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.2" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.0" sky_engine: dependency: transitive description: flutter @@ -1155,74 +1254,82 @@ packages: dependency: "direct main" description: name: sodium - sha256: "93d7c8d9af1f57cbd1ddeeb815902d3e0c1e1c8579a78cf229bcd97e1714f061" + sha256: "515b86c186f4caca49051caf858d878ca7cc4ff4542411e9febb50654eac8a62" url: "https://pub.dev" source: hosted - version: "3.4.4" + version: "3.4.6" sodium_libs: dependency: "direct main" description: name: sodium_libs - sha256: "4e5d96a7805369dd51b24975a9072c51433466ae5716a33cff70316a14d97af9" + sha256: f3f9c516b4183226b7a08ca43a765ebc9e02cfd92e46e8a6cc490f98ffe73052 url: "https://pub.dev" source: hosted - version: "3.4.3+1" + version: "3.4.6+4" source_gen: dependency: transitive description: name: source_gen - sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + sha256: "1d562a3c1f713904ebbed50d2760217fd8a51ca170ac4b05b0db490699dbac17" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "4.2.0" source_helper: dependency: transitive description: name: source_helper - sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" + sha256: "6a3c6cc82073a8797f8c4dc4572146114a39652851c157db37e964d9c7038723" url: "https://pub.dev" source: hosted - version: "1.3.5" - source_span: + version: "1.3.8" + source_map_stack_trace: dependency: transitive description: - name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" url: "https://pub.dev" source: hosted - version: "1.10.1" - sprintf: + version: "0.10.13" + source_span: dependency: transitive description: - name: sprintf - sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "1.10.2" sqlcipher_flutter_libs: dependency: "direct main" description: name: sqlcipher_flutter_libs - sha256: a6a08d3082c1deaacc8f6670c78a9c2384991102db5b234d5293aa2c65e87f61 + sha256: dd1fcc74d5baf3c36ad53e2652b2d06c9f8747494a3ccde0076e88b159dfe622 url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.8" sqlite3: dependency: "direct main" description: name: sqlite3 - sha256: decd58236d7c59e01ae81b34ebd158e6a1b61e0ae5397fc428736eb91ab82808 + sha256: "3145bd74dcdb4fd6f5c6dda4d4e4490a8087d7f286a14dee5d37087290f0f8a2" url: "https://pub.dev" source: hosted - version: "2.7.3" + version: "2.9.4" sqlparser: dependency: transitive description: name: sqlparser - sha256: "27dd0a9f0c02e22ac0eb42a23df9ea079ce69b52bb4a3b478d64e0ef34a263ee" + sha256: "337e9997f7141ffdd054259128553c348635fa318f7ca492f07a4ab76f850d19" url: "https://pub.dev" source: hosted - version: "0.41.0" + version: "0.43.1" stack_trace: dependency: transitive description: @@ -1267,10 +1374,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 url: "https://pub.dev" source: hosted - version: "3.3.0+3" + version: "3.4.0" term_glyph: dependency: transitive description: @@ -1279,22 +1386,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.2" + test: + dependency: transitive + description: + name: test + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" + url: "https://pub.dev" + source: hosted + version: "1.26.3" test_api: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.4" - timing: + version: "0.7.7" + test_core: dependency: transitive description: - name: timing - sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + name: test_core + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "0.6.12" typed_data: dependency: transitive description: @@ -1311,38 +1426,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.1" - universal_io: - dependency: transitive - description: - name: universal_io - sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" - url: "https://pub.dev" - source: hosted - version: "2.2.2" uuid: dependency: transitive description: name: uuid - sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 url: "https://pub.dev" source: hosted - version: "4.5.1" + version: "4.5.2" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "15.0.2" wasm_ffi: dependency: "direct main" description: @@ -1355,42 +1462,50 @@ packages: dependency: transitive description: name: watcher - sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.1" web: dependency: transitive description: name: web - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" web_socket: dependency: transitive description: name: web_socket - sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" url: "https://pub.dev" source: hosted - version: "0.1.6" + version: "1.0.1" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" win32: dependency: transitive description: name: win32 - sha256: b89e6e24d1454e149ab20fbb225af58660f0c0bf4475544650700d8e2da54aef + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e url: "https://pub.dev" source: hosted - version: "5.11.0" + version: "5.15.0" wkt_parser: dependency: transitive description: @@ -1411,10 +1526,10 @@ packages: dependency: transitive description: name: xml - sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" url: "https://pub.dev" source: hosted - version: "6.5.0" + version: "6.6.1" yaml: dependency: transitive description: @@ -1427,10 +1542,10 @@ packages: dependency: transitive description: name: yaml_edit - sha256: fb38626579fb345ad00e674e2af3a5c9b0cc4b9bfb8fd7f7ff322c7c9e62aef5 + sha256: ec709065bb2c911b336853b67f3732dd13e0336bd065cc2f1061d7610ddf45e3 url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" sdks: - dart: ">=3.7.0 <4.0.0" - flutter: ">=3.27.0" + dart: ">=3.10.3 <4.0.0" + flutter: ">=3.38.4" diff --git a/pubspec.yaml b/pubspec.yaml index 69b6583..c062dae 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev version: 0.0.1 environment: - sdk: ">=3.5.0 <4.0.0" + sdk: ">=3.10.0 <4.0.0" # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -41,24 +41,24 @@ dependencies: emoji_picker_flutter: ^4.3.0 emoji_regex: ^0.0.5 ffi: ^2.1.3 - file_picker: ^9.0.0 + file_picker: ^10.3.10 flutter_background_service: ^5.1.0 - flutter_context_menu: ^0.2.0 - flutter_hooks: ^0.20.5 + flutter_context_menu: ^0.4.1 + flutter_hooks: ^0.21.3+1 flutter_map: ^8.1.0 - flutter_riverpod: ^2.6.1 - freezed_annotation: ^2.4.4 - geolocator: ^13.0.2 - hooks_riverpod: ^2.6.1 + flutter_riverpod: ^3.1.0 + freezed_annotation: ^3.1.0 + geolocator: ^14.0.2 + hooks_riverpod: ^3.1.0 http: ^1.3.0 image_picker: ^1.1.2 - intl: ^0.19.0 + intl: ^0.20.2 json_annotation: ^4.9.0 - keyboard_height_plugin: ^0.1.5 + keyboard_height_plugin: ^0.2.0 latlong2: ^0.9.1 path_provider: ^2.1.5 path: ^1.9.0 - riverpod_annotation: ^2.6.1 + riverpod_annotation: ^4.0.0 sodium_libs: ^3.4.3+1 sodium: ^3.4.4 sqlcipher_flutter_libs: ^0.6.4 @@ -69,17 +69,17 @@ dev_dependencies: flutter_test: sdk: flutter - analyzer: ^7.1.0 - build_runner: ^2.1.7 - custom_lint: ^0.7.0 - drift_dev: ^2.21.2 - ffigen: ^15.0.0 + analyzer: ^8.4.0 + build_runner: ^2.11.0 + custom_lint: ^0.8.0 + drift_dev: ^2.31.0 + ffigen: ^20.1.1 flutter_launcher_icons: ^0.14.1 - flutter_lints: ^5.0.0 - freezed: ^2.5.7 - json_serializable: ^6.8.0 - riverpod_generator: ^2.6.2 - riverpod_lint: ^2.6.2 + flutter_lints: ^6.0.0 + freezed: ^3.2.0 + json_serializable: ^6.11.0 + riverpod_generator: ^4.0.0 + riverpod_lint: ^3.1.0 # dart run flutter_launcher_icons flutter_launcher_icons: diff --git a/test/btox_app.png b/test/btox_app.png index b51e188..e511b9a 100644 Binary files a/test/btox_app.png and b/test/btox_app.png differ diff --git a/test/btox_app_test.dart b/test/btox_app_test.dart index b1807d0..ec07a57 100644 --- a/test/btox_app_test.dart +++ b/test/btox_app_test.dart @@ -22,11 +22,14 @@ import 'mocks/fake_toxcore.dart'; // the tearDown after being reported as leaks at the test end. void main() { final mySecretKey = SecretKey.fromJson( - String.fromCharCodes(Iterable.generate(64, (_) => 'F'.codeUnits.first))); + String.fromCharCodes(Iterable.generate(64, (_) => 'F'.codeUnits.first)), + ); final myToxId = ToxAddress.fromString( - String.fromCharCodes(Iterable.generate(76, (_) => '0'.codeUnits.first))); + String.fromCharCodes(Iterable.generate(76, (_) => '0'.codeUnits.first)), + ); final friendToxId = ToxAddress.fromString( - String.fromCharCodes(Iterable.generate(76, (_) => '1'.codeUnits.first))); + String.fromCharCodes(Iterable.generate(76, (_) => '1'.codeUnits.first)), + ); testWidgets('Add contact adds a contact', (WidgetTester tester) async { final tox = FakeToxcore(); @@ -75,7 +78,9 @@ void main() { // Fill in the contact data. await tester.enterText( - find.byKey(const Key('toxId')), friendToxId.toJson()); + find.byKey(const Key('toxId')), + friendToxId.toJson(), + ); await tester.pump(); await tester.tap(find.text('Add')); await tester.pumpAndSettle(); diff --git a/test/chat_page_test.dart b/test/chat_page_test.dart index 3138d56..7f0461e 100644 --- a/test/chat_page_test.dart +++ b/test/chat_page_test.dart @@ -17,11 +17,15 @@ void main() { id: Id(0), active: true, settings: ProfileSettings( - nickname: 'Yeetman', statusMessage: 'Yeeting everyone.'), + nickname: 'Yeetman', + statusMessage: 'Yeeting everyone.', + ), secretKey: SecretKey.fromJson( - 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'), + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + ), publicKey: PublicKey.fromJson( - '0000000000000000000000000000000000000000000000000000000000000000'), + '0000000000000000000000000000000000000000000000000000000000000000', + ), nospam: ToxAddressNospam(0), ); @@ -30,148 +34,172 @@ void main() { profileId: profile.id, name: 'Testman', publicKey: PublicKey.fromJson( - '1111111111111111111111111111111111111111111111111111111111111111'), + '1111111111111111111111111111111111111111111111111111111111111111', + ), ); - testWidgets('Empty chat page should display message entry box', - (WidgetTester tester) async { + testWidgets('Empty chat page should display message entry box', ( + WidgetTester tester, + ) async { final messages = []; await tester.pumpWidget( ProviderScope( - child: MaterialApp( - localizationsDelegates: AppLocalizations.localizationsDelegates, - home: ChatPage( - profile: profile, - contact: Stream.value(contact), - messages: Stream.value(messages), + child: MaterialApp( + localizationsDelegates: AppLocalizations.localizationsDelegates, + home: ChatPage( + profile: profile, + contact: Stream.value(contact), + messages: Stream.value(messages), + ), ), - )), + ), ); await tester.pumpAndSettle(); - await expectLater(find.byType(ChatPage), - matchesGoldenFile('goldens/chat_page/empty.png')); + await expectLater( + find.byType(ChatPage), + matchesGoldenFile('goldens/chat_page/empty.png'), + ); }); testWidgets('Chat page should display messages', (WidgetTester tester) async { final messages = []; - messages.add(_fakeInsertMessage( - Id(0), - newMessage( - contactId: contact.id, - parent: null, - merged: null, - author: contact.publicKey, - timestamp: DateTime(2025, 1, 1, 0, 1, 12), - content: TextContent(text: 'Happy New Year!'), + messages.add( + _fakeInsertMessage( + Id(0), + newMessage( + contactId: contact.id, + parent: null, + merged: null, + author: contact.publicKey, + timestamp: DateTime(2025, 1, 1, 0, 1, 12), + content: TextContent(text: 'Happy New Year!'), + ), ), - )); - messages.add(_fakeInsertMessage( - Id(1), - newMessage( - contactId: contact.id, - parent: messages.last, - merged: null, - author: profile.publicKey, - timestamp: DateTime(2025, 1, 1, 0, 2, 23), - content: TextContent(text: 'Thank you! Happy New Year to you too!'), + ); + messages.add( + _fakeInsertMessage( + Id(1), + newMessage( + contactId: contact.id, + parent: messages.last, + merged: null, + author: profile.publicKey, + timestamp: DateTime(2025, 1, 1, 0, 2, 23), + content: TextContent(text: 'Thank you! Happy New Year to you too!'), + ), ), - )); + ); await tester.pumpWidget( ProviderScope( - child: MaterialApp( - localizationsDelegates: AppLocalizations.localizationsDelegates, - home: ChatPage( - profile: profile, - contact: Stream.value(contact), - messages: Stream.value(messages), + child: MaterialApp( + localizationsDelegates: AppLocalizations.localizationsDelegates, + home: ChatPage( + profile: profile, + contact: Stream.value(contact), + messages: Stream.value(messages), + ), ), - )), + ), ); await tester.pumpAndSettle(); - await expectLater(find.byType(ChatPage), - matchesGoldenFile('goldens/chat_page/messages.png')); + await expectLater( + find.byType(ChatPage), + matchesGoldenFile('goldens/chat_page/messages.png'), + ); }); - testWidgets('Long messages should be shown in a big bubble', - (WidgetTester tester) async { + testWidgets('Long messages should be shown in a big bubble', ( + WidgetTester tester, + ) async { final messages = []; - messages.add(_fakeInsertMessage( - Id(0), - newMessage( - contactId: contact.id, - parent: null, - merged: null, - author: profile.publicKey, - timestamp: DateTime(2025, 1, 1, 0, 1, 12), - content: TextContent(text: 'Here is a long message.\n' * 10), + messages.add( + _fakeInsertMessage( + Id(0), + newMessage( + contactId: contact.id, + parent: null, + merged: null, + author: profile.publicKey, + timestamp: DateTime(2025, 1, 1, 0, 1, 12), + content: TextContent(text: 'Here is a long message.\n' * 10), + ), ), - )); + ); await tester.pumpWidget( ProviderScope( - child: MaterialApp( - localizationsDelegates: AppLocalizations.localizationsDelegates, - home: ChatPage( - profile: profile, - contact: Stream.value(contact), - messages: Stream.value(messages), + child: MaterialApp( + localizationsDelegates: AppLocalizations.localizationsDelegates, + home: ChatPage( + profile: profile, + contact: Stream.value(contact), + messages: Stream.value(messages), + ), ), - )), + ), ); await tester.pumpAndSettle(); - await expectLater(find.byType(ChatPage), - matchesGoldenFile('goldens/chat_page/messages_long.png')); + await expectLater( + find.byType(ChatPage), + matchesGoldenFile('goldens/chat_page/messages_long.png'), + ); }); testWidgets('Tapping a message shows the time', (WidgetTester tester) async { final messages = []; - messages.add(_fakeInsertMessage( - Id(0), - newMessage( - contactId: contact.id, - parent: null, - merged: null, - author: contact.publicKey, - timestamp: DateTime(2025, 1, 1, 0, 1, 12), - content: TextContent(text: 'Happy New Year!'), + messages.add( + _fakeInsertMessage( + Id(0), + newMessage( + contactId: contact.id, + parent: null, + merged: null, + author: contact.publicKey, + timestamp: DateTime(2025, 1, 1, 0, 1, 12), + content: TextContent(text: 'Happy New Year!'), + ), ), - )); + ); await tester.pumpWidget( ProviderScope( - child: MaterialApp( - localizationsDelegates: AppLocalizations.localizationsDelegates, - home: ChatPage( - profile: profile, - contact: Stream.value(contact), - messages: Stream.value(messages), + child: MaterialApp( + localizationsDelegates: AppLocalizations.localizationsDelegates, + home: ChatPage( + profile: profile, + contact: Stream.value(contact), + messages: Stream.value(messages), + ), ), - )), + ), ); await tester.pumpAndSettle(); // Tap the message. // TODO(iphydf): This is a hack. Find a better way to tap the message. - final bubble = find.byType(GestureDetector).first.evaluate().first.widget - as GestureDetector; + final bubble = + find.byType(GestureDetector).first.evaluate().first.widget + as GestureDetector; bubble.onTap!(); await tester.pumpAndSettle(); - await expectLater(find.byType(ChatPage), - matchesGoldenFile('goldens/chat_page/messages_time.png')); + await expectLater( + find.byType(ChatPage), + matchesGoldenFile('goldens/chat_page/messages_time.png'), + ); }); testWidgets('Tapping smiley shows emoji picker', (WidgetTester tester) async { @@ -179,15 +207,16 @@ void main() { await tester.pumpWidget( ProviderScope( - child: MaterialApp( - localizationsDelegates: AppLocalizations.localizationsDelegates, - home: ChatPage( - profile: profile, - contact: Stream.value(contact), - messages: Stream.value(messages), - recentEmojis: false, + child: MaterialApp( + localizationsDelegates: AppLocalizations.localizationsDelegates, + home: ChatPage( + profile: profile, + contact: Stream.value(contact), + messages: Stream.value(messages), + recentEmojis: false, + ), ), - )), + ), ); await tester.pumpAndSettle(); @@ -196,50 +225,60 @@ void main() { await tester.tap(find.byIcon(Icons.emoji_emotions_outlined)); await tester.pumpAndSettle(); - await expectLater(find.byType(ChatPage), - matchesGoldenFile('goldens/chat_page/emoji_picker.png')); + await expectLater( + find.byType(ChatPage), + matchesGoldenFile('goldens/chat_page/emoji_picker.png'), + ); // Tap the smiley again to close the emoji picker. await tester.tap(find.byIcon(Icons.emoji_emotions_outlined)); await tester.pumpAndSettle(); - await expectLater(find.byType(ChatPage), - matchesGoldenFile('goldens/chat_page/emoji_picker_closed.png')); + await expectLater( + find.byType(ChatPage), + matchesGoldenFile('goldens/chat_page/emoji_picker_closed.png'), + ); }); - testWidgets('Tapping an emoji in the emoji picker puts an emoji in the input', - (WidgetTester tester) async { - final messages = []; + testWidgets( + 'Tapping an emoji in the emoji picker puts an emoji in the input', + (WidgetTester tester) async { + final messages = []; - await tester.pumpWidget( - ProviderScope( + await tester.pumpWidget( + ProviderScope( child: MaterialApp( - localizationsDelegates: AppLocalizations.localizationsDelegates, - home: ChatPage( - profile: profile, - contact: Stream.value(contact), - messages: Stream.value(messages), - recentEmojis: false, + localizationsDelegates: AppLocalizations.localizationsDelegates, + home: ChatPage( + profile: profile, + contact: Stream.value(contact), + messages: Stream.value(messages), + recentEmojis: false, + ), + ), ), - )), - ); + ); - await tester.pumpAndSettle(); + await tester.pumpAndSettle(); - // Tap the smiley. - await tester.tap(find.byIcon(Icons.emoji_emotions_outlined)); - await tester.pumpAndSettle(); + // Tap the smiley. + await tester.tap(find.byIcon(Icons.emoji_emotions_outlined)); + await tester.pumpAndSettle(); - // Tap the emoji. - await tester.tap(find.text('😀')); - await tester.pumpAndSettle(); + // Tap the emoji. + await tester.tap(find.text('😀')); + await tester.pumpAndSettle(); - await expectLater(find.byType(ChatPage), - matchesGoldenFile('goldens/chat_page/emoji_picker_tapped.png')); - }); + await expectLater( + find.byType(ChatPage), + matchesGoldenFile('goldens/chat_page/emoji_picker_tapped.png'), + ); + }, + ); - testWidgets('Sending a single emoji shows a big emoji', - (WidgetTester tester) async { + testWidgets('Sending a single emoji shows a big emoji', ( + WidgetTester tester, + ) async { final messages = [ _fakeInsertMessage( Id(0), @@ -256,49 +295,56 @@ void main() { await tester.pumpWidget( ProviderScope( - child: MaterialApp( - localizationsDelegates: AppLocalizations.localizationsDelegates, - home: ChatPage( - profile: profile, - contact: Stream.value(contact), - messages: Stream.value(messages), - recentEmojis: false, + child: MaterialApp( + localizationsDelegates: AppLocalizations.localizationsDelegates, + home: ChatPage( + profile: profile, + contact: Stream.value(contact), + messages: Stream.value(messages), + recentEmojis: false, + ), ), - )), + ), ); await tester.pumpAndSettle(); - await expectLater(find.byType(ChatPage), - matchesGoldenFile('goldens/chat_page/emoji_sent.png')); + await expectLater( + find.byType(ChatPage), + matchesGoldenFile('goldens/chat_page/emoji_sent.png'), + ); }); - testWidgets('Long-pressing a message shows a context menu', - (WidgetTester tester) async { + testWidgets('Long-pressing a message shows a context menu', ( + WidgetTester tester, + ) async { final messages = []; - messages.add(_fakeInsertMessage( - Id(0), - newMessage( - contactId: contact.id, - parent: null, - merged: null, - author: contact.publicKey, - timestamp: DateTime(2025, 1, 1, 0, 1, 12), - content: TextContent(text: 'Happy New Year!'), + messages.add( + _fakeInsertMessage( + Id(0), + newMessage( + contactId: contact.id, + parent: null, + merged: null, + author: contact.publicKey, + timestamp: DateTime(2025, 1, 1, 0, 1, 12), + content: TextContent(text: 'Happy New Year!'), + ), ), - )); + ); await tester.pumpWidget( ProviderScope( - child: MaterialApp( - localizationsDelegates: AppLocalizations.localizationsDelegates, - home: ChatPage( - profile: profile, - contact: Stream.value(contact), - messages: Stream.value(messages), + child: MaterialApp( + localizationsDelegates: AppLocalizations.localizationsDelegates, + home: ChatPage( + profile: profile, + contact: Stream.value(contact), + messages: Stream.value(messages), + ), ), - )), + ), ); await tester.pumpAndSettle(); @@ -309,8 +355,10 @@ void main() { // MaterialApp instead of ChatPage because the context menu is a separate // route and is displayed on top of the ChatPage, not inside it. - await expectLater(find.byType(MaterialApp), - matchesGoldenFile('goldens/chat_page/message_context_menu.png')); + await expectLater( + find.byType(MaterialApp), + matchesGoldenFile('goldens/chat_page/message_context_menu.png'), + ); }); } diff --git a/test/goldens/add_contact.png b/test/goldens/add_contact.png index 0ec20ef..e0a266c 100644 Binary files a/test/goldens/add_contact.png and b/test/goldens/add_contact.png differ diff --git a/test/goldens/add_contact_empty_message.png b/test/goldens/add_contact_empty_message.png index 2ad1d2d..378df0b 100644 Binary files a/test/goldens/add_contact_empty_message.png and b/test/goldens/add_contact_empty_message.png differ diff --git a/test/goldens/add_contact_filled.png b/test/goldens/add_contact_filled.png index fbd37db..00064c3 100644 Binary files a/test/goldens/add_contact_filled.png and b/test/goldens/add_contact_filled.png differ diff --git a/test/goldens/add_contact_incomplete.png b/test/goldens/add_contact_incomplete.png index 4268835..6b5d574 100644 Binary files a/test/goldens/add_contact_incomplete.png and b/test/goldens/add_contact_incomplete.png differ diff --git a/test/goldens/add_contact_too_long_message.png b/test/goldens/add_contact_too_long_message.png index 2025072..cf5078c 100644 Binary files a/test/goldens/add_contact_too_long_message.png and b/test/goldens/add_contact_too_long_message.png differ diff --git a/test/goldens/chat_empty.png b/test/goldens/chat_empty.png index 362e8bd..92e9e75 100644 Binary files a/test/goldens/chat_empty.png and b/test/goldens/chat_empty.png differ diff --git a/test/goldens/chat_hello.png b/test/goldens/chat_hello.png index c4706ca..8771c58 100644 Binary files a/test/goldens/chat_hello.png and b/test/goldens/chat_hello.png differ diff --git a/test/goldens/chat_page/emoji_picker.png b/test/goldens/chat_page/emoji_picker.png index 91d211e..d91418c 100644 Binary files a/test/goldens/chat_page/emoji_picker.png and b/test/goldens/chat_page/emoji_picker.png differ diff --git a/test/goldens/chat_page/emoji_picker_closed.png b/test/goldens/chat_page/emoji_picker_closed.png index 7601a6c..9b6682a 100644 Binary files a/test/goldens/chat_page/emoji_picker_closed.png and b/test/goldens/chat_page/emoji_picker_closed.png differ diff --git a/test/goldens/chat_page/emoji_picker_tapped.png b/test/goldens/chat_page/emoji_picker_tapped.png index a72ac26..179fca3 100644 Binary files a/test/goldens/chat_page/emoji_picker_tapped.png and b/test/goldens/chat_page/emoji_picker_tapped.png differ diff --git a/test/goldens/chat_page/emoji_sent.png b/test/goldens/chat_page/emoji_sent.png index 42bf3a8..0fa4aaf 100644 Binary files a/test/goldens/chat_page/emoji_sent.png and b/test/goldens/chat_page/emoji_sent.png differ diff --git a/test/goldens/chat_page/empty.png b/test/goldens/chat_page/empty.png index 637b5ca..0392518 100644 Binary files a/test/goldens/chat_page/empty.png and b/test/goldens/chat_page/empty.png differ diff --git a/test/goldens/chat_page/message_context_menu.png b/test/goldens/chat_page/message_context_menu.png index 5e72969..d4a79b6 100644 Binary files a/test/goldens/chat_page/message_context_menu.png and b/test/goldens/chat_page/message_context_menu.png differ diff --git a/test/goldens/chat_page/messages.png b/test/goldens/chat_page/messages.png index 9844405..d6ddc41 100644 Binary files a/test/goldens/chat_page/messages.png and b/test/goldens/chat_page/messages.png differ diff --git a/test/goldens/chat_page/messages_long.png b/test/goldens/chat_page/messages_long.png index ce33687..6ace5db 100644 Binary files a/test/goldens/chat_page/messages_long.png and b/test/goldens/chat_page/messages_long.png differ diff --git a/test/goldens/chat_page/messages_time.png b/test/goldens/chat_page/messages_time.png index e032761..8f154db 100644 Binary files a/test/goldens/chat_page/messages_time.png and b/test/goldens/chat_page/messages_time.png differ diff --git a/test/goldens/contact_list_empty.png b/test/goldens/contact_list_empty.png index 6dfd028..a83e1e2 100644 Binary files a/test/goldens/contact_list_empty.png and b/test/goldens/contact_list_empty.png differ diff --git a/test/goldens/contact_list_one.png b/test/goldens/contact_list_one.png index a8ba92f..5951f71 100644 Binary files a/test/goldens/contact_list_one.png and b/test/goldens/contact_list_one.png differ diff --git a/test/goldens/entry.png b/test/goldens/entry.png index 028482e..92431ec 100644 Binary files a/test/goldens/entry.png and b/test/goldens/entry.png differ diff --git a/test/goldens/profile.png b/test/goldens/profile.png index e2f8617..cd58765 100644 Binary files a/test/goldens/profile.png and b/test/goldens/profile.png differ diff --git a/test/goldens/profile_alice.png b/test/goldens/profile_alice.png index 4c3d204..f95c78b 100644 Binary files a/test/goldens/profile_alice.png and b/test/goldens/profile_alice.png differ diff --git a/test/goldens/profile_applied.png b/test/goldens/profile_applied.png index f3bd5ef..c530ce1 100644 Binary files a/test/goldens/profile_applied.png and b/test/goldens/profile_applied.png differ diff --git a/test/identicon_test.dart b/test/identicon_test.dart index f9d2bfc..d62ffa4 100644 --- a/test/identicon_test.dart +++ b/test/identicon_test.dart @@ -7,8 +7,11 @@ import 'package:flutter_test/flutter_test.dart'; void main() { test('Identicon generation should agree with qTox', () { - final data = Uint8List.fromList(hex.decode( - '7A114177E3934588EED87E6FE8B18AF7DC581C1FBB67F973EE5BF07B6EFABB72')); + final data = Uint8List.fromList( + hex.decode( + '7A114177E3934588EED87E6FE8B18AF7DC581C1FBB67F973EE5BF07B6EFABB72', + ), + ); final identicon = Identicon.fromBytes(data); @@ -29,8 +32,11 @@ void main() { }, tags: ['identicon']); test('Identicon can generate an image', () async { - final data = Uint8List.fromList(hex.decode( - '7A114177E3934588EED87E6FE8B18AF7DC581C1FBB67F973EE5BF07B6EFABB72')); + final data = Uint8List.fromList( + hex.decode( + '7A114177E3934588EED87E6FE8B18AF7DC581C1FBB67F973EE5BF07B6EFABB72', + ), + ); final identicon = Identicon.fromBytes(data); diff --git a/test/mocks/fake_bootstrap_nodes.dart b/test/mocks/fake_bootstrap_nodes.dart index 13ab307..0065c26 100644 --- a/test/mocks/fake_bootstrap_nodes.dart +++ b/test/mocks/fake_bootstrap_nodes.dart @@ -19,7 +19,8 @@ BootstrapNodeList fakeBootstrapNodesProvider(Ref ref) { lastPing: 0, port: 33445, publicKey: PublicKey.fromJson( - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'), + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + ), tcpPorts: [33446], ), ], diff --git a/test/mocks/fake_sodium.dart b/test/mocks/fake_sodium.dart index 3701470..b90a383 100644 --- a/test/mocks/fake_sodium.dart +++ b/test/mocks/fake_sodium.dart @@ -26,8 +26,10 @@ final class FakeSecureKey implements SecureKey { int get length => _data.length; @override - FutureOr runUnlockedAsync(SecureCallbackFn> callback, - {bool writable = false}) { + FutureOr runUnlockedAsync( + SecureCallbackFn> callback, { + bool writable = false, + }) { return callback(_data); } @@ -56,20 +58,22 @@ final class FakeBox implements Box { const FakeBox(); @override - DetachedCipherResult detached( - {required Uint8List message, - required Uint8List nonce, - required Uint8List publicKey, - required SecureKey secretKey}) { + DetachedCipherResult detached({ + required Uint8List message, + required Uint8List nonce, + required Uint8List publicKey, + required SecureKey secretKey, + }) { throw UnimplementedError(); } @override - Uint8List easy( - {required Uint8List message, - required Uint8List nonce, - required Uint8List publicKey, - required SecureKey secretKey}) { + Uint8List easy({ + required Uint8List message, + required Uint8List nonce, + required Uint8List publicKey, + required SecureKey secretKey, + }) { throw UnimplementedError(); } @@ -87,27 +91,31 @@ final class FakeBox implements Box { int get nonceBytes => throw UnimplementedError(); @override - Uint8List openDetached( - {required Uint8List cipherText, - required Uint8List mac, - required Uint8List nonce, - required Uint8List publicKey, - required SecureKey secretKey}) { + Uint8List openDetached({ + required Uint8List cipherText, + required Uint8List mac, + required Uint8List nonce, + required Uint8List publicKey, + required SecureKey secretKey, + }) { throw UnimplementedError(); } @override - Uint8List openEasy( - {required Uint8List cipherText, - required Uint8List nonce, - required Uint8List publicKey, - required SecureKey secretKey}) { + Uint8List openEasy({ + required Uint8List cipherText, + required Uint8List nonce, + required Uint8List publicKey, + required SecureKey secretKey, + }) { throw UnimplementedError(); } @override - PrecalculatedBox precalculate( - {required Uint8List publicKey, required SecureKey secretKey}) { + PrecalculatedBox precalculate({ + required Uint8List publicKey, + required SecureKey secretKey, + }) { throw UnimplementedError(); } @@ -123,10 +131,11 @@ final class FakeBox implements Box { int get sealBytes => throw UnimplementedError(); @override - Uint8List sealOpen( - {required Uint8List cipherText, - required Uint8List publicKey, - required SecureKey secretKey}) { + Uint8List sealOpen({ + required Uint8List cipherText, + required Uint8List publicKey, + required SecureKey secretKey, + }) { throw UnimplementedError(); } @@ -200,13 +209,15 @@ final class FakeSodium implements Sodium { @override KeyPair materializeTransferrableKeyPair( - TransferrableKeyPair transferrableKeyPair) { + TransferrableKeyPair transferrableKeyPair, + ) { throw UnimplementedError(); } @override SecureKey materializeTransferrableSecureKey( - TransferrableSecureKey transferrableSecureKey) { + TransferrableSecureKey transferrableSecureKey, + ) { throw UnimplementedError(); } @@ -219,9 +230,11 @@ final class FakeSodium implements Sodium { Randombytes get randombytes => throw UnimplementedError(); @override - Future runIsolated(SodiumIsolateCallback callback, - {List secureKeys = const [], - List keyPairs = const []}) { + Future runIsolated( + SodiumIsolateCallback callback, { + List secureKeys = const [], + List keyPairs = const [], + }) { throw UnimplementedError(); } diff --git a/test/mocks/fake_toxcore.dart b/test/mocks/fake_toxcore.dart index f7601ab..54352d8 100644 --- a/test/mocks/fake_toxcore.dart +++ b/test/mocks/fake_toxcore.dart @@ -16,7 +16,8 @@ final class FakeToxcore extends api.Tox { @override ToxAddress get address { return ToxAddress.fromString( - '52602D8D81573725A77F602A53CD1CD8C2156595E8C3310EAC3552E99B7FB50D897BC532A375'); + '52602D8D81573725A77F602A53CD1CD8C2156595E8C3310EAC3552E99B7FB50D897BC532A375', + ); } @override diff --git a/test/models/content_test.dart b/test/models/content_test.dart index c87a07e..c0af661 100644 --- a/test/models/content_test.dart +++ b/test/models/content_test.dart @@ -24,8 +24,9 @@ void main() { TextContent(text: 'Hello'), UnknownContent(data: MessageDataList([MessageDataInt(42)])), ]; - final l2 = - l1.map((c) => Content.decode(c.encode())).toList(growable: false); + final l2 = l1 + .map((c) => Content.decode(c.encode())) + .toList(growable: false); const converter = ContentConverter(); final l3 = l1 .map((c) => converter.fromSql(converter.toSql(c))) diff --git a/test/models/persistence_test.dart b/test/models/persistence_test.dart index e197bf7..1593b55 100644 --- a/test/models/persistence_test.dart +++ b/test/models/persistence_test.dart @@ -9,11 +9,14 @@ import 'package:flutter_test/flutter_test.dart'; void main() { final mySecretKey = SecretKey.fromJson( - String.fromCharCodes(Iterable.generate(64, (_) => 'F'.codeUnits.first))); + String.fromCharCodes(Iterable.generate(64, (_) => 'F'.codeUnits.first)), + ); final myToxId = ToxAddress.fromString( - String.fromCharCodes(Iterable.generate(76, (_) => '0'.codeUnits.first))); + String.fromCharCodes(Iterable.generate(76, (_) => '0'.codeUnits.first)), + ); final friendPk = PublicKey.fromJson( - '0000000000000000000000000000000000000000000000000000000000000000'); + '0000000000000000000000000000000000000000000000000000000000000000', + ); testDatabase('Messages can be added to the database', (Database db) async { final profileId = await db.addProfile( @@ -42,30 +45,42 @@ void main() { expect(contactId.value, 1); // Happy new year in 2025. - final firstMsg = await db.getMessage(await db.addMessage(newMessage( - contactId: contactId, - parent: null, - merged: null, - author: myToxId.publicKey, - timestamp: DateTime(2025, 1, 1, 0, 2, 10, 123), - content: TextContent(text: 'Happy new year!'), - ))); + final firstMsg = await db.getMessage( + await db.addMessage( + newMessage( + contactId: contactId, + parent: null, + merged: null, + author: myToxId.publicKey, + timestamp: DateTime(2025, 1, 1, 0, 2, 10, 123), + content: TextContent(text: 'Happy new year!'), + ), + ), + ); - expect(firstMsg.sha.toJson(), - 'B7D2BD769A3A5E8D8445B75A76370A384FA87514AA5979F27365CE26D3CE6CD8'); + expect( + firstMsg.sha.toJson(), + 'B7D2BD769A3A5E8D8445B75A76370A384FA87514AA5979F27365CE26D3CE6CD8', + ); // Happy new year in 2026. - final secondMsg = await db.getMessage(await db.addMessage(newMessage( - contactId: contactId, - parent: firstMsg, - merged: null, - author: myToxId.publicKey, - timestamp: DateTime(2026, 1, 1, 0, 2, 10, 123), - content: TextContent(text: 'Happy new year!'), - ))); + final secondMsg = await db.getMessage( + await db.addMessage( + newMessage( + contactId: contactId, + parent: firstMsg, + merged: null, + author: myToxId.publicKey, + timestamp: DateTime(2026, 1, 1, 0, 2, 10, 123), + content: TextContent(text: 'Happy new year!'), + ), + ), + ); - expect(secondMsg.sha.toJson(), - '4E0F0A708C4E82000A89F5549E7F68E149F7DBC392AAC7B87B89CDECC5AB5642'); + expect( + secondMsg.sha.toJson(), + '4E0F0A708C4E82000A89F5549E7F68E149F7DBC392AAC7B87B89CDECC5AB5642', + ); }, tags: ['models']); testDatabase('Two separate histories can be merged', (db) async { @@ -95,39 +110,53 @@ void main() { expect(contactId.value, 1); // Happy new year in 2025. - final myFirstMsg = await db.getMessage(await db.addMessage(newMessage( - contactId: contactId, - parent: null, - merged: null, - author: myToxId.publicKey, - // 2 minutes after midnight. - timestamp: DateTime(2025, 1, 1, 0, 2, 10, 123), - content: TextContent(text: 'Happy new year!'), - ))); + final myFirstMsg = await db.getMessage( + await db.addMessage( + newMessage( + contactId: contactId, + parent: null, + merged: null, + author: myToxId.publicKey, + // 2 minutes after midnight. + timestamp: DateTime(2025, 1, 1, 0, 2, 10, 123), + content: TextContent(text: 'Happy new year!'), + ), + ), + ); // Friend's happy new year in 2025. - final friendFirstMsg = await db.getMessage(await db.addMessage(newMessage( - contactId: contactId, - parent: null, - merged: null, - author: friendPk, - // 1 minute before my message. - timestamp: myFirstMsg.timestamp.subtract(const Duration(minutes: 1)), - content: TextContent(text: 'Happy new year!'), - ))); + final friendFirstMsg = await db.getMessage( + await db.addMessage( + newMessage( + contactId: contactId, + parent: null, + merged: null, + author: friendPk, + // 1 minute before my message. + timestamp: myFirstMsg.timestamp.subtract(const Duration(minutes: 1)), + content: TextContent(text: 'Happy new year!'), + ), + ), + ); - final mergedMessage = await db.getMessage(await db.addMessage(newMessage( - contactId: contactId, - parent: myFirstMsg, - merged: friendFirstMsg, - author: myToxId.publicKey, - // 1 minute after my message. - timestamp: myFirstMsg.timestamp.add(const Duration(minutes: 1)), - content: TextContent(text: 'Haha, jinx!'), - ))); + final mergedMessage = await db.getMessage( + await db.addMessage( + newMessage( + contactId: contactId, + parent: myFirstMsg, + merged: friendFirstMsg, + author: myToxId.publicKey, + // 1 minute after my message. + timestamp: myFirstMsg.timestamp.add(const Duration(minutes: 1)), + content: TextContent(text: 'Haha, jinx!'), + ), + ), + ); - expect(mergedMessage.sha.toJson(), - 'BF17F7ABA56A3FDC7B0DED4A4308248364B0E0E7981C68DAFAF7B2CF867C7E2E'); + expect( + mergedMessage.sha.toJson(), + 'BF17F7ABA56A3FDC7B0DED4A4308248364B0E0E7981C68DAFAF7B2CF867C7E2E', + ); }, tags: ['models']); test('Microseconds are ignored in hash calculation', () async { diff --git a/test/packets/messagepack/message_data_test.dart b/test/packets/messagepack/message_data_test.dart index 71664e3..615038a 100644 --- a/test/packets/messagepack/message_data_test.dart +++ b/test/packets/messagepack/message_data_test.dart @@ -7,15 +7,9 @@ import 'package:flutter_test/flutter_test.dart'; void main() { test('MessageDataList is equality comparable', () { - final l1 = MessageDataList([ - MessageDataBool(true), - ]); - final l2 = MessageDataList([ - MessageDataBool(true), - ]); - final l3 = MessageDataList([ - MessageDataBool(false), - ]); + final l1 = MessageDataList([MessageDataBool(true)]); + final l2 = MessageDataList([MessageDataBool(true)]); + final l3 = MessageDataList([MessageDataBool(false)]); expect(l1, l2); expect(l1, isNot(l3)); @@ -24,17 +18,17 @@ void main() { test('MessageDataMap is equality comparable', () { final m1 = MessageDataMap({ MessageDataBool(true): MessageDataBool(true), - MessageDataBinary(Uint8List.fromList([1, 2, 3, 4])): - MessageDataBinary(Uint8List.fromList([1, 2, 3, 4])), + MessageDataBinary(Uint8List.fromList([1, 2, 3, 4])): MessageDataBinary( + Uint8List.fromList([1, 2, 3, 4]), + ), }); final m2 = MessageDataMap({ MessageDataBool(true): MessageDataBool(true), - MessageDataBinary(Uint8List.fromList([1, 2, 3, 4])): - MessageDataBinary(Uint8List.fromList([1, 2, 3, 4])), - }); - final m3 = MessageDataMap({ - MessageDataBool(false): MessageDataBool(true), + MessageDataBinary(Uint8List.fromList([1, 2, 3, 4])): MessageDataBinary( + Uint8List.fromList([1, 2, 3, 4]), + ), }); + final m3 = MessageDataMap({MessageDataBool(false): MessageDataBool(true)}); expect(m1, m2); expect(m1, isNot(m3)); @@ -66,8 +60,9 @@ void main() { MessageDataNull(): MessageDataNull(), }), ]); - final l2 = - Unpacker((Packer()..packMessageData(l1)).takeBytes()).unpackList(); + final l2 = Unpacker( + (Packer()..packMessageData(l1)).takeBytes(), + ).unpackList(); final l3 = MessageData.fromJson(jsonDecode(jsonEncode(l1))); expect(l1.value, l2); diff --git a/test/widget_test.dart b/test/widget_test.dart index a97dfe3..9dea214 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -18,180 +18,233 @@ import 'mocks/fake_tox_constants.dart'; import 'mocks/fake_toxcore.dart'; void main() { - final mySecretKey = - SecretKey.fromSodium(FakeSodium().crypto.box.keyPair().secretKey); + final mySecretKey = SecretKey.fromSodium( + FakeSodium().crypto.box.keyPair().secretKey, + ); final myToxId = ToxAddress.fromString( - String.fromCharCodes(Iterable.generate(76, (_) => '0'.codeUnits.first))); + String.fromCharCodes(Iterable.generate(76, (_) => '0'.codeUnits.first)), + ); final friendToxId = ToxAddress.fromString( - String.fromCharCodes(Iterable.generate(76, (_) => '1'.codeUnits.first))); + String.fromCharCodes(Iterable.generate(76, (_) => '1'.codeUnits.first)), + ); testWidgets('Jump through all the screens', (WidgetTester tester) async { - await withClock(Clock.fixed(DateTime(2024, 2, 14, 12, 33, 13, 456)), - () async { - final tox = FakeToxcore(); - - // Create a database in memory. - final Database db = Database(NativeDatabase.memory()); - - final Future font = - rootBundle.load('assets/fonts/DejaVuSans.ttf'); - - // It's DejaVuSans, but the test wants Roboto. - final FontLoader fontLoader = FontLoader('Roboto')..addFont(font); - await fontLoader.load(); - - await tester.pumpWidget( - ProviderScope( - overrides: [ - bootstrapNodesProvider.overrideWith(fakeBootstrapNodesProvider), - databaseProvider.overrideWith((ref) => db), - sodiumProvider.overrideWith((ref) => FakeSodium()), - toxConstantsProvider.overrideWith((ref) => fakeToxcoreConstants), - toxProvider(mySecretKey, myToxId.nospam).overrideWith((ref) => tox), - ], - child: const BtoxApp(), - ), - ); - - // Wait for the database to be loaded. - await tester.pumpAndSettle(); - - // Take a screenshot. - await expectLater( - find.byType(BtoxApp), matchesGoldenFile('goldens/entry.png')); - - // Press the 'Create' button. - await tester.tap(find.byKey(const Key('createProfileButton'))); - await tester.pumpAndSettle(); - - await expectLater(find.byType(BtoxApp), - matchesGoldenFile('goldens/contact_list_empty.png')); - - await tester.tap(find.byKey(const Key('addContactButton'))); - await tester.pumpAndSettle(); - - await expectLater( - find.byType(BtoxApp), matchesGoldenFile('goldens/add_contact.png')); - - // Fill in some letters, not done yet. - await tester.enterText(find.byKey(const Key('toxId')), 'aaaaa'); - await tester.pumpAndSettle(); - - await expectLater(find.byType(BtoxApp), - matchesGoldenFile('goldens/add_contact_incomplete.png')); - - // Fill in the rest of the letters. - await tester.enterText( - find.byKey(const Key('toxId')), friendToxId.toJson()); - // Put a too long message. - await tester.enterText(find.byKey(const Key('friendRequestMessageField')), - 'This message is way too long. ' * 40); - await tester.pumpAndSettle(); - - await expectLater(find.byType(BtoxApp), - matchesGoldenFile('goldens/add_contact_too_long_message.png')); - - // Put an empty message. - await tester.enterText( - find.byKey(const Key('friendRequestMessageField')), ''); - await tester.pumpAndSettle(); - - await expectLater(find.byType(BtoxApp), - matchesGoldenFile('goldens/add_contact_empty_message.png')); - - // Fill in a message. - await tester.enterText(find.byKey(const Key('friendRequestMessageField')), - 'Add me on bTox!'); - await tester.pumpAndSettle(); - - await expectLater(find.byType(BtoxApp), - matchesGoldenFile('goldens/add_contact_filled.png')); - - await tester.tap(find.text('Add')); - await tester.pumpAndSettle(); - - await expectLater(find.byType(BtoxApp), - matchesGoldenFile('goldens/contact_list_one.png')); - - // Open a conversation with the contact. - await tester.tap(find.text('Unknown')); - await tester.pumpAndSettle(); - - await expectLater( - find.byType(BtoxApp), matchesGoldenFile('goldens/chat_empty.png')); - - // Send a message. - await tester.enterText(find.byKey(const Key('messageField')), 'Hello!'); - await tester.pumpAndSettle(); - await tester.tap(find.byIcon(Icons.send)); - await tester.pumpAndSettle(); - - await expectLater( - find.byType(BtoxApp), matchesGoldenFile('goldens/chat_hello.png')); - - // Close the chat. - await tester.tap(find.byIcon(Icons.arrow_back)); - await tester.pumpAndSettle(); - - // Open the drawer. - await tester.tap(find.byIcon(Icons.menu)); - await tester.pumpAndSettle(); - - await expectLater( - find.byType(BtoxApp), matchesGoldenFile('goldens/drawer.png')); - - // Click "Profile". - await tester.tap(find.text('Profile')); - await tester.pumpAndSettle(); - - await expectLater( - find.byType(BtoxApp), matchesGoldenFile('goldens/profile.png')); - - // Change nicknameField and statusMessageField. - await tester.enterText(find.byKey(const Key('nicknameField')), 'Alice'); - await tester.enterText( - find.byKey(const Key('statusMessageField')), 'Hello, world!'); - await tester.pumpAndSettle(); - - await expectLater( - find.byType(BtoxApp), matchesGoldenFile('goldens/profile_alice.png')); - - // Press "Apply changes". - await tester.tap(find.text('Apply changes')); - await tester.pumpAndSettle(); - - await expectLater(find.byType(BtoxApp), - matchesGoldenFile('goldens/profile_applied.png')); - - // Close the profile page (back button). - await tester.tap(find.byIcon(Icons.arrow_back)); - await tester.pumpAndSettle(); - - // Open drawer again. - await tester.tap(find.byIcon(Icons.menu)); - await tester.pumpAndSettle(); - - await expectLater( - find.byType(BtoxApp), matchesGoldenFile('goldens/drawer_alice.png')); - - // Click "Settings". - await tester.tap(find.text('Settings')); - await tester.pumpAndSettle(); - - await expectLater( - find.byType(BtoxApp), matchesGoldenFile('goldens/settings.png')); - - // Press "Delete profile". - await tester.tap(find.text('Delete profile')); - await tester.pumpAndSettle(); - - await expectLater(find.byType(BtoxApp), - matchesGoldenFile('goldens/settings_delete.png')); - - tox.kill(); - await tester.pump(const Duration(seconds: 1)); - - await db.close(); - }); + await withClock( + Clock.fixed(DateTime(2024, 2, 14, 12, 33, 13, 456)), + () async { + final tox = FakeToxcore(); + + // Create a database in memory. + final Database db = Database(NativeDatabase.memory()); + + final Future font = rootBundle.load( + 'assets/fonts/DejaVuSans.ttf', + ); + + // It's DejaVuSans, but the test wants Roboto. + final FontLoader fontLoader = FontLoader('Roboto')..addFont(font); + await fontLoader.load(); + + await tester.pumpWidget( + ProviderScope( + overrides: [ + bootstrapNodesProvider.overrideWith(fakeBootstrapNodesProvider), + databaseProvider.overrideWith((ref) => db), + sodiumProvider.overrideWith((ref) => FakeSodium()), + toxConstantsProvider.overrideWith((ref) => fakeToxcoreConstants), + toxProvider( + mySecretKey, + myToxId.nospam, + ).overrideWith((ref) => tox), + ], + child: const BtoxApp(), + ), + ); + + // Wait for the database to be loaded. + await tester.pumpAndSettle(); + + // Take a screenshot. + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/entry.png'), + ); + + // Press the 'Create' button. + await tester.tap(find.byKey(const Key('createProfileButton'))); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/contact_list_empty.png'), + ); + + await tester.tap(find.byKey(const Key('addContactButton'))); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/add_contact.png'), + ); + + // Fill in some letters, not done yet. + await tester.enterText(find.byKey(const Key('toxId')), 'aaaaa'); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/add_contact_incomplete.png'), + ); + + // Fill in the rest of the letters. + await tester.enterText( + find.byKey(const Key('toxId')), + friendToxId.toJson(), + ); + // Put a too long message. + await tester.enterText( + find.byKey(const Key('friendRequestMessageField')), + 'This message is way too long. ' * 40, + ); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/add_contact_too_long_message.png'), + ); + + // Put an empty message. + await tester.enterText( + find.byKey(const Key('friendRequestMessageField')), + '', + ); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/add_contact_empty_message.png'), + ); + + // Fill in a message. + await tester.enterText( + find.byKey(const Key('friendRequestMessageField')), + 'Add me on bTox!', + ); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/add_contact_filled.png'), + ); + + await tester.tap(find.text('Add')); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/contact_list_one.png'), + ); + + // Open a conversation with the contact. + await tester.tap(find.text('Unknown')); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/chat_empty.png'), + ); + + // Send a message. + await tester.enterText(find.byKey(const Key('messageField')), 'Hello!'); + await tester.pumpAndSettle(); + await tester.tap(find.byIcon(Icons.send)); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/chat_hello.png'), + ); + + // Close the chat. + await tester.tap(find.byIcon(Icons.arrow_back)); + await tester.pumpAndSettle(); + + // Open the drawer. + await tester.tap(find.byIcon(Icons.menu)); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/drawer.png'), + ); + + // Click "Profile". + await tester.tap(find.text('Profile')); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/profile.png'), + ); + + // Change nicknameField and statusMessageField. + await tester.enterText(find.byKey(const Key('nicknameField')), 'Alice'); + await tester.enterText( + find.byKey(const Key('statusMessageField')), + 'Hello, world!', + ); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/profile_alice.png'), + ); + + // Press "Apply changes". + await tester.tap(find.text('Apply changes')); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/profile_applied.png'), + ); + + // Close the profile page (back button). + await tester.tap(find.byIcon(Icons.arrow_back)); + await tester.pumpAndSettle(); + + // Open drawer again. + await tester.tap(find.byIcon(Icons.menu)); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/drawer_alice.png'), + ); + + // Click "Settings". + await tester.tap(find.text('Settings')); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/settings.png'), + ); + + // Press "Delete profile". + await tester.tap(find.text('Delete profile')); + await tester.pumpAndSettle(); + + await expectLater( + find.byType(BtoxApp), + matchesGoldenFile('goldens/settings_delete.png'), + ); + + tox.kill(); + await tester.pump(const Duration(seconds: 1)); + + await db.close(); + }, + ); }); } diff --git a/test/widgets/chat_content_test.dart b/test/widgets/chat_content_test.dart index ca4378b..3cd22d2 100644 --- a/test/widgets/chat_content_test.dart +++ b/test/widgets/chat_content_test.dart @@ -11,17 +11,14 @@ import 'package:flutter_test/flutter_test.dart'; import '../mocks/fake_tile_provider.dart'; void main() { - testWidgets('Location content is displayed as map', - (WidgetTester tester) async { + testWidgets('Location content is displayed as map', ( + WidgetTester tester, + ) async { final fakeTileProvider = FakeTileProvider(); await tester.pumpWidget( ProviderScope( - overrides: [ - mapTileProvider.overrideWith( - (ref) => fakeTileProvider, - ), - ], + overrides: [mapTileProvider.overrideWith((ref) => fakeTileProvider)], child: MaterialApp( localizationsDelegates: AppLocalizations.localizationsDelegates, home: ChatContent( diff --git a/tools/prepare-web b/tools/prepare-web index 84ba685..4b1fa5a 100755 --- a/tools/prepare-web +++ b/tools/prepare-web @@ -3,11 +3,11 @@ set -eux -o pipefail # SQLite wasm/js. -SQLITE_VERSION=2.6.1 +SQLITE_VERSION=2.9.4 curl -L "https://github.com/simolus3/sqlite3.dart/releases/download/sqlite3-$SQLITE_VERSION/sqlite3.wasm" -o web/sqlite3.wasm # Drift worker. -DRIFT_VERSION=2.23.1 +DRIFT_VERSION=2.31.0 curl -L "https://github.com/simolus3/drift/releases/download/drift-$DRIFT_VERSION/drift_worker.js" -o web/drift_worker.js # Sodium libs. diff --git a/web/favicon.png b/web/favicon.png index 84a0b44..a787dcd 100644 Binary files a/web/favicon.png and b/web/favicon.png differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png index 32ee218..ec896d3 100644 Binary files a/web/icons/Icon-192.png and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png index ca7fd3a..456ef71 100644 Binary files a/web/icons/Icon-512.png and b/web/icons/Icon-512.png differ diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png index 32ee218..ec896d3 100644 Binary files a/web/icons/Icon-maskable-192.png and b/web/icons/Icon-maskable-192.png differ diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png index ca7fd3a..456ef71 100644 Binary files a/web/icons/Icon-maskable-512.png and b/web/icons/Icon-maskable-512.png differ diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico index cedff2b..684a64b 100644 Binary files a/windows/runner/resources/app_icon.ico and b/windows/runner/resources/app_icon.ico differ