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