From 074211a8157b4eb5db18195730e2144bba992fc5 Mon Sep 17 00:00:00 2001 From: otsmr Date: Tue, 10 Mar 2026 21:08:00 +0100 Subject: [PATCH] remove face filters --- android/app/build.gradle | 6 +- assets/filters/beard_upper_lip.webp | Bin 3652 -> 0 bytes assets/filters/beard_upper_lip_green.webp | Bin 3990 -> 0 bytes assets/filters/dog_brown_ear.webp | Bin 4536 -> 0 bytes assets/filters/dog_brown_nose.webp | Bin 5904 -> 0 bytes assets/filters/hat_black.webp | Bin 4092 -> 0 bytes ios/Podfile.lock | 100 +++---- .../api/websocket/client_to_server.pb.dart | 12 + .../websocket/client_to_server.pbjson.dart | 15 +- .../protobuf/api/websocket/error.pbenum.dart | 3 + .../protobuf/api/websocket/error.pbjson.dart | 4 +- .../camera_preview.dart | 4 - .../camera_preview_controller_view.dart | 124 ++------- .../face_filters.dart | 36 --- .../main_camera_controller.dart | 120 +-------- .../face_filters/beard_filter_painter.dart | 193 -------------- .../face_filters/dog_filter_painter.dart | 243 ------------------ .../face_filters/face_filter_painter.dart | 44 ---- lib/src/views/components/flame.dart | 12 +- pubspec.lock | 206 +++++++-------- pubspec.yaml | 48 ++-- 21 files changed, 249 insertions(+), 921 deletions(-) delete mode 100644 assets/filters/beard_upper_lip.webp delete mode 100644 assets/filters/beard_upper_lip_green.webp delete mode 100644 assets/filters/dog_brown_ear.webp delete mode 100644 assets/filters/dog_brown_nose.webp delete mode 100644 assets/filters/hat_black.webp delete mode 100644 lib/src/views/camera/camera_preview_components/face_filters.dart delete mode 100644 lib/src/views/camera/camera_preview_components/painters/face_filters/beard_filter_painter.dart delete mode 100644 lib/src/views/camera/camera_preview_components/painters/face_filters/dog_filter_painter.dart delete mode 100644 lib/src/views/camera/camera_preview_components/painters/face_filters/face_filter_painter.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 361ae10..bd6de01 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -23,12 +23,12 @@ android { compileOptions { coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = "1.8" + jvmTarget = "17" } defaultConfig { diff --git a/assets/filters/beard_upper_lip.webp b/assets/filters/beard_upper_lip.webp deleted file mode 100644 index 058b2ed09d90d51c74c76ab03e73d741a1be63f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3652 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 WlnkhHfiZMRWfk;rn?TeI0002rmfOhy diff --git a/assets/filters/beard_upper_lip_green.webp b/assets/filters/beard_upper_lip_green.webp deleted file mode 100644 index 4046f6516fbf8f9fcdddde615784149d25588890..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3990 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 W;k?mM5Xg3Rds(@is=+`20001pNVXLK diff --git a/assets/filters/dog_brown_nose.webp b/assets/filters/dog_brown_nose.webp deleted file mode 100644 index 7716995089c34ec6d58f942344d81d52c71c0db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5904 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 diff --git a/assets/filters/hat_black.webp b/assets/filters/hat_black.webp deleted file mode 100644 index fbc44c0c1f77a2414ba22c6f5b237564545805de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4092 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 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index ae7f32b..fd0ae16 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -49,55 +49,55 @@ PODS: - file_picker (0.0.1): - DKImagePickerController/PhotoGallery - Flutter - - Firebase (12.8.0): - - Firebase/Core (= 12.8.0) - - Firebase/Core (12.8.0): + - Firebase (12.9.0): + - Firebase/Core (= 12.9.0) + - Firebase/Core (12.9.0): - Firebase/CoreOnly - - FirebaseAnalytics (~> 12.8.0) - - Firebase/CoreOnly (12.8.0): - - FirebaseCore (~> 12.8.0) - - Firebase/Messaging (12.8.0): + - FirebaseAnalytics (~> 12.9.0) + - Firebase/CoreOnly (12.9.0): + - FirebaseCore (~> 12.9.0) + - Firebase/Messaging (12.9.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 12.8.0) - - firebase_core (4.4.0): - - Firebase/CoreOnly (= 12.8.0) + - FirebaseMessaging (~> 12.9.0) + - firebase_core (4.5.0): + - Firebase/CoreOnly (= 12.9.0) - Flutter - - firebase_messaging (16.1.1): - - Firebase/Messaging (= 12.8.0) + - firebase_messaging (16.1.2): + - Firebase/Messaging (= 12.9.0) - firebase_core - Flutter - - FirebaseAnalytics (12.8.0): - - FirebaseAnalytics/Default (= 12.8.0) - - FirebaseCore (~> 12.8.0) - - FirebaseInstallations (~> 12.8.0) + - FirebaseAnalytics (12.9.0): + - FirebaseAnalytics/Default (= 12.9.0) + - FirebaseCore (~> 12.9.0) + - FirebaseInstallations (~> 12.9.0) - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/MethodSwizzler (~> 8.1) - GoogleUtilities/Network (~> 8.1) - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - FirebaseAnalytics/Default (12.8.0): - - FirebaseCore (~> 12.8.0) - - FirebaseInstallations (~> 12.8.0) - - GoogleAppMeasurement/Default (= 12.8.0) + - FirebaseAnalytics/Default (12.9.0): + - FirebaseCore (~> 12.9.0) + - FirebaseInstallations (~> 12.9.0) + - GoogleAppMeasurement/Default (= 12.9.0) - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/MethodSwizzler (~> 8.1) - GoogleUtilities/Network (~> 8.1) - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - FirebaseCore (12.8.0): - - FirebaseCoreInternal (~> 12.8.0) + - FirebaseCore (12.9.0): + - FirebaseCoreInternal (~> 12.9.0) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreInternal (12.8.0): + - FirebaseCoreInternal (12.9.0): - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseInstallations (12.8.0): - - FirebaseCore (~> 12.8.0) + - FirebaseInstallations (12.9.0): + - FirebaseCore (~> 12.9.0) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/UserDefaults (~> 8.1) - PromisesObjC (~> 2.4) - - FirebaseMessaging (12.8.0): - - FirebaseCore (~> 12.8.0) - - FirebaseInstallations (~> 12.8.0) + - FirebaseMessaging (12.9.0): + - FirebaseCore (~> 12.9.0) + - FirebaseInstallations (~> 12.9.0) - GoogleDataTransport (~> 10.1) - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/Environment (~> 8.1) @@ -140,23 +140,23 @@ PODS: - GoogleUtilities/Logger (~> 8.1) - GoogleUtilities/Network (~> 8.1) - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/Core (12.8.0): + - GoogleAppMeasurement/Core (12.9.0): - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/MethodSwizzler (~> 8.1) - GoogleUtilities/Network (~> 8.1) - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/Default (12.8.0): + - GoogleAppMeasurement/Default (12.9.0): - GoogleAdsOnDeviceConversion (~> 3.2.0) - - GoogleAppMeasurement/Core (= 12.8.0) - - GoogleAppMeasurement/IdentitySupport (= 12.8.0) + - GoogleAppMeasurement/Core (= 12.9.0) + - GoogleAppMeasurement/IdentitySupport (= 12.9.0) - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/MethodSwizzler (~> 8.1) - GoogleUtilities/Network (~> 8.1) - "GoogleUtilities/NSData+zlib (~> 8.1)" - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/IdentitySupport (12.8.0): - - GoogleAppMeasurement/Core (= 12.8.0) + - GoogleAppMeasurement/IdentitySupport (12.9.0): + - GoogleAppMeasurement/Core (= 12.9.0) - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/MethodSwizzler (~> 8.1) - GoogleUtilities/Network (~> 8.1) @@ -276,7 +276,7 @@ PODS: - pro_video_editor (0.0.1): - Flutter - PromisesObjC (2.4.0) - - restart_app (0.0.1): + - restart_app (1.7.2): - Flutter - SDWebImage (5.21.6): - SDWebImage/Core (= 5.21.6) @@ -285,7 +285,7 @@ PODS: - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) - Sentry/HybridSDK (8.56.2) - - sentry_flutter (9.13.0): + - sentry_flutter (9.14.0): - Flutter - FlutterMacOS - Sentry/HybridSDK (= 8.56.2) @@ -331,6 +331,8 @@ PODS: - video_player_avfoundation (0.0.1): - Flutter - FlutterMacOS + - workmanager_apple (0.0.1): + - Flutter DEPENDENCIES: - app_links (from `.symlinks/plugins/app_links/ios`) @@ -377,6 +379,7 @@ DEPENDENCIES: - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - video_compress (from `.symlinks/plugins/video_compress/ios`) - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) + - workmanager_apple (from `.symlinks/plugins/workmanager_apple/ios`) SPEC REPOS: trunk: @@ -488,6 +491,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/video_compress/ios" video_player_avfoundation: :path: ".symlinks/plugins/video_player_avfoundation/darwin" + workmanager_apple: + :path: ".symlinks/plugins/workmanager_apple/ios" SPEC CHECKSUMS: app_links: a754cbec3c255bd4bbb4d236ecc06f28cd9a7ce8 @@ -501,14 +506,14 @@ SPEC CHECKSUMS: DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 emoji_picker_flutter: ece213fc274bdddefb77d502d33080dc54e616cc file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be - Firebase: 9a58fdbc9d8655ed7b79a19cf9690bb007d3d46d - firebase_core: ee30637e6744af8e0c12a6a1e8a9718506ec2398 - firebase_messaging: 343de01a8d3e18b60df0c6d37f7174c44ae38e02 - FirebaseAnalytics: f20bbad8cb7f65d8a5eaefeb424ae8800a31bdfc - FirebaseCore: 0dbad74bda10b8fb9ca34ad8f375fb9dd3ebef7c - FirebaseCoreInternal: fe5fa466aeb314787093a7dce9f0beeaad5a2a21 - FirebaseInstallations: 6a14ab3d694ebd9f839c48d330da5547e9ca9dc0 - FirebaseMessaging: 7f42cfd10ec64181db4e01b305a613791c8e782c + Firebase: 065f2bb395062046623036d8e6dc857bc2521d56 + firebase_core: afac1aac13c931e0401c7e74ed1276112030efab + firebase_messaging: 7cb2727feb789751fc6936bcc8e08408970e2820 + FirebaseAnalytics: cd7d01d352f3c237c9a0e31552c257cd0b0c0352 + FirebaseCore: 428912f751178b06bef0a1793effeb4a5e09a9b8 + FirebaseCoreInternal: b321eafae5362113bc182956fafc9922cfc77b72 + FirebaseInstallations: 7b64ffd006032b2b019a59b803858df5112d9eaa + FirebaseMessaging: 7d6cdbff969127c4151c824fe432f0e301210f15 Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1 flutter_keyboard_visibility_temp_fork: 95b2d534bacf6ac62e7fcbe5c2a9e2c2a17ce06f @@ -521,7 +526,7 @@ SPEC CHECKSUMS: google_mlkit_commons: a5e4ffae5bc59ea4c7b9025dc72cb6cb79dc1166 google_mlkit_face_detection: ee4b72cfae062b4c972204be955d83055a4bfd36 GoogleAdsOnDeviceConversion: d68c69dd9581a0f5da02617b6f377e5be483970f - GoogleAppMeasurement: 72c9a682fec6290327ea5e3c4b829b247fcb2c17 + GoogleAppMeasurement: fce7c1c90640d2f9f5c56771f71deacb2ba3f98c GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 GoogleMLKit: b1eee21a41c57704fe72483b15c85cb2c0cd7444 GoogleToolboxForMac: d1a2cbf009c453f4d6ded37c105e2f67a32206d8 @@ -543,11 +548,11 @@ SPEC CHECKSUMS: permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d pro_video_editor: 44ef9a6d48dbd757ed428cf35396dd05f35c7830 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - restart_app: 9cda5378aacc5000e3f66ee76a9201534e7d3ecf + restart_app: 98825697952793b5a8e489df3d52ed5ac4fd536d SDWebImage: 1bb6a1b84b6fe87b972a102bdc77dd589df33477 SDWebImageWebPCoder: 0e06e365080397465cc73a7a9b472d8a3bd0f377 Sentry: b53951377b78e21a734f5dc8318e333dbfc682d7 - sentry_flutter: dbed9a62ae39716b685a80140705c330d200d941 + sentry_flutter: 841fa2fe08dc72eb95e2320b76e3f751f3400cf5 share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 @@ -558,6 +563,7 @@ SPEC CHECKSUMS: url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b video_compress: f2133a07762889d67f0711ac831faa26f956980e video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a + workmanager_apple: 904529ae31e97fc5be632cf628507652294a0778 PODFILE CHECKSUM: ae041999f13ba7b2285ff9ad9bc688ed647bbcb7 diff --git a/lib/src/model/protobuf/api/websocket/client_to_server.pb.dart b/lib/src/model/protobuf/api/websocket/client_to_server.pb.dart index a8f1d04..5012b75 100644 --- a/lib/src/model/protobuf/api/websocket/client_to_server.pb.dart +++ b/lib/src/model/protobuf/api/websocket/client_to_server.pb.dart @@ -536,12 +536,14 @@ class Handshake_Authenticate extends $pb.GeneratedMessage { $core.List<$core.int>? authToken, $core.String? appVersion, $fixnum.Int64? deviceId, + $core.bool? inBackground, }) { final result = create(); if (userId != null) result.userId = userId; if (authToken != null) result.authToken = authToken; if (appVersion != null) result.appVersion = appVersion; if (deviceId != null) result.deviceId = deviceId; + if (inBackground != null) result.inBackground = inBackground; return result; } @@ -564,6 +566,7 @@ class Handshake_Authenticate extends $pb.GeneratedMessage { 2, _omitFieldNames ? '' : 'authToken', $pb.PbFieldType.OY) ..aOS(3, _omitFieldNames ? '' : 'appVersion') ..aInt64(4, _omitFieldNames ? '' : 'deviceId') + ..aOB(5, _omitFieldNames ? '' : 'inBackground') ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -624,6 +627,15 @@ class Handshake_Authenticate extends $pb.GeneratedMessage { $core.bool hasDeviceId() => $_has(3); @$pb.TagNumber(4) void clearDeviceId() => $_clearField(4); + + @$pb.TagNumber(5) + $core.bool get inBackground => $_getBF(4); + @$pb.TagNumber(5) + set inBackground($core.bool value) => $_setBool(4, value); + @$pb.TagNumber(5) + $core.bool hasInBackground() => $_has(4); + @$pb.TagNumber(5) + void clearInBackground() => $_clearField(5); } enum Handshake_Handshake { diff --git a/lib/src/model/protobuf/api/websocket/client_to_server.pbjson.dart b/lib/src/model/protobuf/api/websocket/client_to_server.pbjson.dart index df410ab..5a5620f 100644 --- a/lib/src/model/protobuf/api/websocket/client_to_server.pbjson.dart +++ b/lib/src/model/protobuf/api/websocket/client_to_server.pbjson.dart @@ -229,10 +229,20 @@ const Handshake_Authenticate$json = { '10': 'deviceId', '17': true }, + { + '1': 'in_background', + '3': 5, + '4': 1, + '5': 8, + '9': 2, + '10': 'inBackground', + '17': true + }, ], '8': [ {'1': '_app_version'}, {'1': '_device_id'}, + {'1': '_in_background'}, ], }; @@ -254,10 +264,11 @@ final $typed_data.Uint8List handshakeDescriptor = $convert.base64Decode( 'QSFQoGaXNfaW9zGAggASgIUgVpc0lvcxIbCglsYW5nX2NvZGUYCSABKAlSCGxhbmdDb2RlEiIK' 'DXByb29mX29mX3dvcmsYCiABKANSC3Byb29mT2ZXb3JrQg4KDF9pbnZpdGVfY29kZRoSChBHZX' 'RBdXRoQ2hhbGxlbmdlGkMKDEdldEF1dGhUb2tlbhIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQS' - 'GgoIcmVzcG9uc2UYAiABKAxSCHJlc3BvbnNlGqwBCgxBdXRoZW50aWNhdGUSFwoHdXNlcl9pZB' + 'GgoIcmVzcG9uc2UYAiABKAxSCHJlc3BvbnNlGugBCgxBdXRoZW50aWNhdGUSFwoHdXNlcl9pZB' 'gBIAEoA1IGdXNlcklkEh0KCmF1dGhfdG9rZW4YAiABKAxSCWF1dGhUb2tlbhIkCgthcHBfdmVy' 'c2lvbhgDIAEoCUgAUgphcHBWZXJzaW9uiAEBEiAKCWRldmljZV9pZBgEIAEoA0gBUghkZXZpY2' - 'VJZIgBAUIOCgxfYXBwX3ZlcnNpb25CDAoKX2RldmljZV9pZEILCglIYW5kc2hha2U='); + 'VJZIgBARIoCg1pbl9iYWNrZ3JvdW5kGAUgASgISAJSDGluQmFja2dyb3VuZIgBAUIOCgxfYXBw' + 'X3ZlcnNpb25CDAoKX2RldmljZV9pZEIQCg5faW5fYmFja2dyb3VuZEILCglIYW5kc2hha2U='); @$core.Deprecated('Use applicationDataDescriptor instead') const ApplicationData$json = { diff --git a/lib/src/model/protobuf/api/websocket/error.pbenum.dart b/lib/src/model/protobuf/api/websocket/error.pbenum.dart index 7f8f093..d8847c7 100644 --- a/lib/src/model/protobuf/api/websocket/error.pbenum.dart +++ b/lib/src/model/protobuf/api/websocket/error.pbenum.dart @@ -91,6 +91,8 @@ class ErrorCode extends $pb.ProtobufEnum { ErrorCode._(1034, _omitEnumNames ? '' : 'IPAPaymentExpired'); static const ErrorCode UserIsNotInFreePlan = ErrorCode._(1035, _omitEnumNames ? '' : 'UserIsNotInFreePlan'); + static const ErrorCode ForegroundSessionConnected = + ErrorCode._(1036, _omitEnumNames ? '' : 'ForegroundSessionConnected'); static const $core.List values = [ Unknown, @@ -131,6 +133,7 @@ class ErrorCode extends $pb.ProtobufEnum { RegistrationDisabled, IPAPaymentExpired, UserIsNotInFreePlan, + ForegroundSessionConnected, ]; static final $core.Map<$core.int, ErrorCode> _byValue = diff --git a/lib/src/model/protobuf/api/websocket/error.pbjson.dart b/lib/src/model/protobuf/api/websocket/error.pbjson.dart index 9c82638..8b5c480 100644 --- a/lib/src/model/protobuf/api/websocket/error.pbjson.dart +++ b/lib/src/model/protobuf/api/websocket/error.pbjson.dart @@ -56,6 +56,7 @@ const ErrorCode$json = { {'1': 'RegistrationDisabled', '2': 1033}, {'1': 'IPAPaymentExpired', '2': 1034}, {'1': 'UserIsNotInFreePlan', '2': 1035}, + {'1': 'ForegroundSessionConnected', '2': 1036}, ], }; @@ -77,4 +78,5 @@ final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode( 'duZWRQcmVLZXkQgwgSEwoOVXNlcklkTm90Rm91bmQQhAgSFwoSVXNlcklkQWxyZWFkeVRha2Vu' 'EIUIEhcKEkFwcFZlcnNpb25PdXRkYXRlZBCGCBIYChNOZXdEZXZpY2VSZWdpc3RlcmVkEIcIEh' 'cKEkludmFsaWRQcm9vZk9mV29yaxCICBIZChRSZWdpc3RyYXRpb25EaXNhYmxlZBCJCBIWChFJ' - 'UEFQYXltZW50RXhwaXJlZBCKCBIYChNVc2VySXNOb3RJbkZyZWVQbGFuEIsI'); + 'UEFQYXltZW50RXhwaXJlZBCKCBIYChNVc2VySXNOb3RJbkZyZWVQbGFuEIsIEh8KGkZvcmVncm' + '91bmRTZXNzaW9uQ29ubmVjdGVkEIwI'); diff --git a/lib/src/views/camera/camera_preview_components/camera_preview.dart b/lib/src/views/camera/camera_preview_components/camera_preview.dart index 1f196ea..ec2d40e 100644 --- a/lib/src/views/camera/camera_preview_components/camera_preview.dart +++ b/lib/src/views/camera/camera_preview_components/camera_preview.dart @@ -46,10 +46,6 @@ class MainCameraPreview extends StatelessWidget { Positioned.fill( child: mainCameraController.customPaint!, ), - if (mainCameraController.facePaint != null) - Positioned.fill( - child: mainCameraController.facePaint!, - ), ], ), ), diff --git a/lib/src/views/camera/camera_preview_components/camera_preview_controller_view.dart b/lib/src/views/camera/camera_preview_components/camera_preview_controller_view.dart index d033caf..7e48d19 100644 --- a/lib/src/views/camera/camera_preview_components/camera_preview_controller_view.dart +++ b/lib/src/views/camera/camera_preview_components/camera_preview_controller_view.dart @@ -22,7 +22,6 @@ import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/qr.dart'; import 'package:twonly/src/utils/screenshot.dart'; import 'package:twonly/src/utils/storage.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/face_filters.dart'; import 'package:twonly/src/views/camera/camera_preview_components/main_camera_controller.dart'; import 'package:twonly/src/views/camera/camera_preview_components/permissions_view.dart'; import 'package:twonly/src/views/camera/camera_preview_components/send_to.dart'; @@ -458,36 +457,6 @@ class _CameraPreviewViewState extends State { }); } - Future pressSideButtonLeft() async { - if (!mc.isSelectingFaceFilters) { - return pickImageFromGallery(); - } - if (mc.currentFilterType.index == 1) { - mc.setFilter(FaceFilterType.none); - setState(() { - mc.isSelectingFaceFilters = false; - }); - return; - } - mc.setFilter(mc.currentFilterType.goLeft()); - } - - Future pressSideButtonRight() async { - if (!mc.isSelectingFaceFilters) { - setState(() { - mc.isSelectingFaceFilters = true; - }); - } - if (mc.currentFilterType.index == FaceFilterType.values.length - 1) { - mc.setFilter(FaceFilterType.none); - setState(() { - mc.isSelectingFaceFilters = false; - }); - return; - } - mc.setFilter(mc.currentFilterType.goRight()); - } - Future startVideoRecording() async { if (mc.cameraController != null && mc.cameraController!.value.isRecordingVideo) { @@ -724,84 +693,27 @@ class _CameraPreviewViewState extends State { ), ), const SizedBox(height: 30), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - if (!mc.isVideoRecording) - GestureDetector( - onTap: pressSideButtonLeft, - child: Align( - child: Container( - height: 50, - width: 80, - padding: const EdgeInsets.all(2), - child: Center( - child: FaIcon( - mc.isSelectingFaceFilters - ? mc.currentFilterType.index == 1 - ? FontAwesomeIcons.xmark - : FontAwesomeIcons.arrowLeft - : FontAwesomeIcons.photoFilm, - color: Colors.white, - size: 25, - ), - ), - ), - ), - ), - GestureDetector( - onTap: takePicture, - // onLongPress: startVideoRecording, - key: keyTriggerButton, - child: Align( - child: Container( - height: 100, - width: 100, - clipBehavior: Clip.antiAliasWithSaveLayer, - padding: const EdgeInsets.all(2), - decoration: BoxDecoration( - shape: BoxShape.circle, - border: Border.all( - width: 7, - color: mc.isVideoRecording - ? Colors.red - : Colors.white, - ), - ), - child: mc.currentFilterType.preview, + GestureDetector( + onTap: takePicture, + // onLongPress: startVideoRecording, + key: keyTriggerButton, + child: Align( + child: Container( + height: 100, + width: 100, + clipBehavior: Clip.antiAliasWithSaveLayer, + padding: const EdgeInsets.all(2), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + width: 7, + color: mc.isVideoRecording + ? Colors.red + : Colors.white, ), ), ), - if (!mc.isVideoRecording) - if (isFront) - GestureDetector( - onTap: pressSideButtonRight, - child: Align( - child: Container( - height: 50, - width: 80, - padding: const EdgeInsets.all(2), - child: Center( - child: FaIcon( - mc.isSelectingFaceFilters - ? mc.currentFilterType.index == - FaceFilterType - .values.length - - 1 - ? FontAwesomeIcons.xmark - : FontAwesomeIcons.arrowRight - : FontAwesomeIcons - .faceGrinTongueSquint, - color: Colors.white, - size: 25, - ), - ), - ), - ), - ) - else - const SizedBox(width: 80), - ], + ), ), ], ), diff --git a/lib/src/views/camera/camera_preview_components/face_filters.dart b/lib/src/views/camera/camera_preview_components/face_filters.dart deleted file mode 100644 index 4913ed4..0000000 --- a/lib/src/views/camera/camera_preview_components/face_filters.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/painters/face_filters/beard_filter_painter.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/painters/face_filters/dog_filter_painter.dart'; - -enum FaceFilterType { - none, - dogBrown, - beardUpperLipGreen, - beardUpperLip, -} - -extension FaceFilterTypeExtension on FaceFilterType { - FaceFilterType goRight() { - final nextIndex = (index + 1) % FaceFilterType.values.length; - return FaceFilterType.values[nextIndex]; - } - - FaceFilterType goLeft() { - final prevIndex = (index - 1 + FaceFilterType.values.length) % - FaceFilterType.values.length; - return FaceFilterType.values[prevIndex]; - } - - Widget get preview { - switch (this) { - case FaceFilterType.none: - return Container(); - case FaceFilterType.dogBrown: - return DogFilterPainter.getPreview(); - case FaceFilterType.beardUpperLip: - return BeardFilterPainter.getPreview(this); - case FaceFilterType.beardUpperLipGreen: - return BeardFilterPainter.getPreview(this); - } - } -} diff --git a/lib/src/views/camera/camera_preview_components/main_camera_controller.dart b/lib/src/views/camera/camera_preview_components/main_camera_controller.dart index a514b75..ab61665 100644 --- a/lib/src/views/camera/camera_preview_components/main_camera_controller.dart +++ b/lib/src/views/camera/camera_preview_components/main_camera_controller.dart @@ -6,7 +6,6 @@ import 'package:drift/drift.dart' show Value; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:google_mlkit_barcode_scanning/google_mlkit_barcode_scanning.dart'; -import 'package:google_mlkit_face_detection/google_mlkit_face_detection.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:twonly/globals.dart'; import 'package:twonly/src/database/daos/contacts.dao.dart'; @@ -18,26 +17,16 @@ import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/qr.dart'; import 'package:twonly/src/utils/screenshot.dart'; import 'package:twonly/src/views/camera/camera_preview_components/camera_preview_controller_view.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/face_filters.dart'; import 'package:twonly/src/views/camera/camera_preview_components/painters/barcode_detector_painter.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/painters/face_filters/beard_filter_painter.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/painters/face_filters/dog_filter_painter.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/painters/face_filters/face_filter_painter.dart'; class ScannedVerifiedContact { - ScannedVerifiedContact({ - required this.contact, - required this.verificationOk, - }); + ScannedVerifiedContact({required this.contact, required this.verificationOk}); Contact contact; bool verificationOk; } class ScannedNewProfile { - ScannedNewProfile({ - required this.profile, - this.isLoading = false, - }); + ScannedNewProfile({required this.profile, this.isLoading = false}); PublicProfile profile; bool isLoading; } @@ -53,7 +42,6 @@ class MainCameraController { String? scannedUrl; GlobalKey zoomButtonKey = GlobalKey(); GlobalKey cameraPreviewKey = GlobalKey(); - bool isSelectingFaceFilters = false; bool isSharePreviewIsShown = false; bool isVideoRecording = false; @@ -71,21 +59,10 @@ class MainCameraController { } final BarcodeScanner _barcodeScanner = BarcodeScanner(); - final FaceDetector _faceDetector = FaceDetector( - options: FaceDetectorOptions( - enableContours: true, - enableLandmarks: true, - ), - ); bool _isBusy = false; - bool _isBusyFaces = false; CustomPaint? customPaint; - CustomPaint? facePaint; Offset? focusPointOffset; - FaceFilterType _currentFilterType = FaceFilterType.none; - FaceFilterType get currentFilterType => _currentFilterType; - Future closeCamera() async { contactsVerified = {}; scannedNewProfiles = {}; @@ -159,8 +136,9 @@ class MainCameraController { } } - await cameraController - ?.lockCaptureOrientation(DeviceOrientation.portraitUp); + await cameraController?.lockCaptureOrientation( + DeviceOrientation.portraitUp, + ); await cameraController?.setFlashMode( selectedCameraDetails.isFlashOn ? FlashMode.always : FlashMode.off, ); @@ -174,10 +152,7 @@ class MainCameraController { ..cameraLoaded = true ..cameraId = cameraId; - facePaint = null; customPaint = null; - isSelectingFaceFilters = false; - setFilter(FaceFilterType.none); zoomButtonKey = GlobalKey(); setState(); } @@ -214,18 +189,6 @@ class MainCameraController { setState(); } - void setFilter(FaceFilterType type) { - _currentFilterType = type; - if (_currentFilterType == FaceFilterType.none) { - faceFilterPainter = null; - facePaint = null; - _isBusyFaces = false; - } - setState(); - } - - FaceFilterPainter? faceFilterPainter; - final Map _orientations = { DeviceOrientation.portraitUp: 0, DeviceOrientation.landscapeLeft: 90, @@ -240,15 +203,6 @@ class MainCameraController { final inputImage = _inputImageFromCameraImage(image); if (inputImage == null) return; _processBarcode(inputImage); - // check if front camera is selected - if (cameraController?.description.lensDirection == - CameraLensDirection.front) { - if (_currentFilterType != FaceFilterType.none) { - _processFaces(inputImage); - } - } else { - _processBarcode(inputImage); - } } InputImage? _inputImageFromCameraImage(CameraImage image) { @@ -338,16 +292,19 @@ class MainCameraController { if (profile == null) continue; - final contact = - await twonlyDB.contactsDao.getContactById(profile.userId.toInt()); + final contact = await twonlyDB.contactsDao.getContactById( + profile.userId.toInt(), + ); if (contact != null && contact.accepted) { if (contactsVerified[contact.userId] == null) { - final storedPublicKey = - await getPublicKeyFromContact(contact.userId); + final storedPublicKey = await getPublicKeyFromContact( + contact.userId, + ); if (storedPublicKey != null) { - final verificationOk = - profile.publicIdentityKey.equals(storedPublicKey.toList()); + final verificationOk = profile.publicIdentityKey.equals( + storedPublicKey.toList(), + ); contactsVerified[contact.userId] = ScannedVerifiedContact( contact: contact, verificationOk: verificationOk, @@ -390,53 +347,4 @@ class MainCameraController { _isBusy = false; setState(); } - - Future _processFaces(InputImage inputImage) async { - if (_isBusyFaces) return; - _isBusyFaces = true; - final faces = await _faceDetector.processImage(inputImage); - if (inputImage.metadata?.size != null && - inputImage.metadata?.rotation != null && - cameraController != null) { - if (faces.isNotEmpty) { - CustomPainter? painter; - switch (_currentFilterType) { - case FaceFilterType.dogBrown: - painter = DogFilterPainter( - faces, - inputImage.metadata!.size, - inputImage.metadata!.rotation, - cameraController!.description.lensDirection, - ); - case FaceFilterType.beardUpperLip: - case FaceFilterType.beardUpperLipGreen: - painter = BeardFilterPainter( - _currentFilterType, - faces, - inputImage.metadata!.size, - inputImage.metadata!.rotation, - cameraController!.description.lensDirection, - ); - case FaceFilterType.none: - break; - } - - if (painter != null) { - facePaint = CustomPaint(painter: painter); - // Also set the correct FaceFilterPainter reference if needed for other logic, - // though currently facePaint is what's used for display. - if (painter is FaceFilterPainter) { - faceFilterPainter = painter; - } - } else { - facePaint = null; - faceFilterPainter = null; - } - } else { - facePaint = null; - } - } - _isBusyFaces = false; - setState(); - } } diff --git a/lib/src/views/camera/camera_preview_components/painters/face_filters/beard_filter_painter.dart b/lib/src/views/camera/camera_preview_components/painters/face_filters/beard_filter_painter.dart deleted file mode 100644 index 35a478d..0000000 --- a/lib/src/views/camera/camera_preview_components/painters/face_filters/beard_filter_painter.dart +++ /dev/null @@ -1,193 +0,0 @@ -import 'dart:async'; -import 'dart:io'; -import 'dart:math'; -import 'dart:ui' as ui; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:google_mlkit_face_detection/google_mlkit_face_detection.dart'; -import 'package:twonly/src/utils/log.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/face_filters.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/painters/coordinates_translator.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/painters/face_filters/face_filter_painter.dart'; - -class BeardFilterPainter extends FaceFilterPainter { - BeardFilterPainter( - FaceFilterType beardType, - super.faces, - super.imageSize, - super.rotation, - super.cameraLensDirection, - ) { - _loadAssets(beardType); - } - - static FaceFilterType? _lastLoadedBeardType; - static ui.Image? _beardImage; - static bool _loading = false; - - static String getAssetPath(FaceFilterType beardType) { - switch (beardType) { - case FaceFilterType.beardUpperLip: - return 'assets/filters/beard_upper_lip.webp'; - case FaceFilterType.beardUpperLipGreen: - return 'assets/filters/beard_upper_lip_green.webp'; - case FaceFilterType.dogBrown: - case FaceFilterType.none: - return ''; - } - } - - static Future _loadAssets(FaceFilterType beardType) async { - if ((_loading || _beardImage != null) && - _lastLoadedBeardType == beardType) { - return; - } - _loading = true; - try { - _beardImage = await _loadImage(getAssetPath(beardType)); - } catch (e) { - Log.error('Failed to load filter assets: $e'); - } finally { - _loading = false; - } - } - - static Future _loadImage(String assetPath) async { - final data = await rootBundle.load(assetPath); - final list = Uint8List.view(data.buffer); - final completer = Completer(); - ui.decodeImageFromList(list, completer.complete); - return completer.future; - } - - @override - void paint(Canvas canvas, Size size) { - if (_beardImage == null) return; - - for (final face in faces) { - final noseBase = face.landmarks[FaceLandmarkType.noseBase]; - final mouthLeft = face.landmarks[FaceLandmarkType.leftMouth]; - final mouthRight = face.landmarks[FaceLandmarkType.rightMouth]; - final bottomMouth = face.landmarks[FaceLandmarkType.bottomMouth]; - - if (noseBase != null && - mouthLeft != null && - mouthRight != null && - bottomMouth != null) { - final noseX = translateX( - noseBase.position.x.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - final noseY = translateY( - noseBase.position.y.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - - final mouthLeftX = translateX( - mouthLeft.position.x.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - final mouthLeftY = translateY( - mouthLeft.position.y.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - - final mouthRightX = translateX( - mouthRight.position.x.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - final mouthRightY = translateY( - mouthRight.position.y.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - - final mouthCenterX = (mouthLeftX + mouthRightX) / 2; - final mouthCenterY = (mouthLeftY + mouthRightY) / 2; - - final beardCenterX = (noseX + mouthCenterX) / 2; - final beardCenterY = (noseY + mouthCenterY) / 2; - - final dx = mouthRightX - mouthLeftX; - final dy = mouthRightY - mouthLeftY; - final angle = atan2(dy, dx); - - final mouthWidth = sqrt(dx * dx + dy * dy); - final beardWidth = mouthWidth * 1.5; - - final yaw = face.headEulerAngleY ?? 0; - final scaleX = cos(yaw * pi / 180).abs(); - - _drawImage( - canvas, - _beardImage!, - Offset(beardCenterX, beardCenterY), - beardWidth, - angle, - scaleX, - ); - } - } - } - - void _drawImage( - Canvas canvas, - ui.Image image, - Offset position, - double width, - double rotation, - double scaleX, - ) { - canvas - ..save() - ..translate(position.dx, position.dy) - ..rotate(rotation) - ..scale(scaleX, Platform.isAndroid ? -1 : 1); - - final srcRect = - Rect.fromLTWH(0, 0, image.width.toDouble(), image.height.toDouble()); - - final aspectRatio = image.width / image.height; - final dstWidth = width; - final dstHeight = width / aspectRatio; - - final dstRect = Rect.fromCenter( - center: Offset.zero, - width: dstWidth, - height: dstHeight, - ); - - canvas - ..drawImageRect(image, srcRect, dstRect, Paint()) - ..restore(); - } - - static Widget getPreview(FaceFilterType beardType) { - return Preview( - child: Padding( - padding: const EdgeInsets.all(8), - child: Image.asset( - getAssetPath(beardType), - fit: BoxFit.contain, - ), - ), - ); - } -} diff --git a/lib/src/views/camera/camera_preview_components/painters/face_filters/dog_filter_painter.dart b/lib/src/views/camera/camera_preview_components/painters/face_filters/dog_filter_painter.dart deleted file mode 100644 index 3643c33..0000000 --- a/lib/src/views/camera/camera_preview_components/painters/face_filters/dog_filter_painter.dart +++ /dev/null @@ -1,243 +0,0 @@ -import 'dart:async'; -import 'dart:io'; -import 'dart:math'; -import 'dart:ui' as ui; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:google_mlkit_face_detection/google_mlkit_face_detection.dart'; -import 'package:twonly/src/utils/log.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/painters/coordinates_translator.dart'; -import 'package:twonly/src/views/camera/camera_preview_components/painters/face_filters/face_filter_painter.dart'; - -class DogFilterPainter extends FaceFilterPainter { - DogFilterPainter( - super.faces, - super.imageSize, - super.rotation, - super.cameraLensDirection, - ) { - _loadAssets(); - } - - static ui.Image? _earImage; - static ui.Image? _noseImage; - static bool _loading = false; - - static Future _loadAssets() async { - if (_loading || (_earImage != null && _noseImage != null)) return; - _loading = true; - try { - _earImage = await _loadImage('assets/filters/dog_brown_ear.webp'); - _noseImage = await _loadImage('assets/filters/dog_brown_nose.webp'); - } catch (e) { - Log.error('Failed to load filter assets: $e'); - } finally { - _loading = false; - } - } - - static Future _loadImage(String assetPath) async { - final data = await rootBundle.load(assetPath); - final list = Uint8List.view(data.buffer); - final completer = Completer(); - ui.decodeImageFromList(list, completer.complete); - return completer.future; - } - - @override - void paint(Canvas canvas, Size size) { - if (_earImage == null || _noseImage == null) return; - - for (final face in faces) { - final faceContour = face.contours[FaceContourType.face]; - final noseBase = face.landmarks[FaceLandmarkType.noseBase]; - - if (faceContour != null && noseBase != null) { - final points = faceContour.points; - if (points.isEmpty) continue; - - final upperPoints = - points.where((p) => p.y < noseBase.position.y).toList(); - - if (upperPoints.isEmpty) continue; - - Point? leftMost; - Point? rightMost; - Point? topMost; - - for (final point in upperPoints) { - if (leftMost == null || point.x < leftMost.x) { - leftMost = point; - } - if (rightMost == null || point.x > rightMost.x) { - rightMost = point; - } - if (topMost == null || point.y < topMost.y) { - topMost = point; - } - } - - if (leftMost == null || rightMost == null || topMost == null) continue; - - final leftEarX = translateX( - leftMost.x.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - final leftEarY = translateY( - topMost.y.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - - final rightEarX = translateX( - rightMost.x.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - final rightEarY = translateY( - topMost.y.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - - final noseX = translateX( - noseBase.position.x.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - final noseY = translateY( - noseBase.position.y.toDouble(), - size, - imageSize, - rotation, - cameraLensDirection, - ); - - final dx = rightEarX - leftEarX; - final dy = rightEarY - leftEarY; - - final faceWidth = sqrt(dx * dx + dy * dy) * 1.5; - final angle = atan2(dy, dx); - - final yaw = face.headEulerAngleY ?? 0; - final scaleX = cos(yaw * pi / 180).abs(); - - final earSize = faceWidth / 2.5; - - _drawImage( - canvas, - _earImage!, - Offset(leftEarX, leftEarY + earSize * 0.3), - earSize, - angle, - scaleX, - ); - - _drawImage( - canvas, - _earImage!, - Offset(rightEarX, rightEarY + earSize * 0.3), - earSize, - angle, - scaleX, - isFlipped: true, - ); - - final noseSize = faceWidth * 0.4; - _drawImage( - canvas, - _noseImage!, - Offset(noseX, noseY + noseSize * 0.1), - noseSize, - angle, - scaleX, - ); - } - } - } - - void _drawImage( - Canvas canvas, - ui.Image image, - Offset position, - double size, - double rotation, - double scaleX, { - bool isFlipped = false, - }) { - canvas - ..save() - ..translate(position.dx, position.dy) - ..rotate(rotation); - if (isFlipped) { - canvas.scale(-scaleX, Platform.isAndroid ? -1 : 1); - } else { - canvas.scale(scaleX, Platform.isAndroid ? -1 : 1); - } - - final srcRect = - Rect.fromLTWH(0, 0, image.width.toDouble(), image.height.toDouble()); - final aspectRatio = image.width / image.height; - final dstWidth = size; - final dstHeight = size / aspectRatio; - - final dstRect = Rect.fromCenter( - center: Offset.zero, - width: dstWidth, - height: dstHeight, - ); - - canvas - ..drawImageRect(image, srcRect, dstRect, Paint()) - ..restore(); - } - - static Widget getPreview() { - return Preview( - child: Stack( - alignment: Alignment.center, - children: [ - Padding( - padding: const EdgeInsets.only(top: 25), - child: Image.asset( - 'assets/filters/dog_brown_nose.webp', - width: 25, - ), - ), - Padding( - padding: const EdgeInsets.only(bottom: 10), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/filters/dog_brown_ear.webp', - width: 20, - ), - const SizedBox(width: 15), - Transform.scale( - scaleX: -1, - child: Image.asset( - 'assets/filters/dog_brown_ear.webp', - width: 20, - ), - ), - ], - ), - ), - ], - ), - ); - } -} diff --git a/lib/src/views/camera/camera_preview_components/painters/face_filters/face_filter_painter.dart b/lib/src/views/camera/camera_preview_components/painters/face_filters/face_filter_painter.dart deleted file mode 100644 index b32ec7d..0000000 --- a/lib/src/views/camera/camera_preview_components/painters/face_filters/face_filter_painter.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:camera/camera.dart'; -import 'package:flutter/material.dart'; -import 'package:google_mlkit_face_detection/google_mlkit_face_detection.dart'; - -abstract class FaceFilterPainter extends CustomPainter { - FaceFilterPainter( - this.faces, - this.imageSize, - this.rotation, - this.cameraLensDirection, - ); - - final List faces; - final Size imageSize; - final InputImageRotation rotation; - final CameraLensDirection cameraLensDirection; - - @override - bool shouldRepaint(covariant FaceFilterPainter oldDelegate) { - return oldDelegate.imageSize != imageSize || - oldDelegate.faces != faces || - oldDelegate.rotation != rotation || - oldDelegate.cameraLensDirection != cameraLensDirection; - } -} - -class Preview extends StatelessWidget { - const Preview({required this.child, super.key}); - - final Widget child; - - @override - Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.grey.withValues(alpha: 0.2), - ), - child: Center( - child: child, - ), - ); - } -} diff --git a/lib/src/views/components/flame.dart b/lib/src/views/components/flame.dart index 3e33ba3..abe89b5 100644 --- a/lib/src/views/components/flame.dart +++ b/lib/src/views/components/flame.dart @@ -67,6 +67,16 @@ class _FlameCounterWidgetState extends State { @override Widget build(BuildContext context) { if (flameCounter < 1) return Container(); + + var flameEmoji = '🔥'; + + if (isBestFriend) flameEmoji = '❤️‍🔥'; + if (flameCounter == 100) flameEmoji = '💯'; + + if (flameCounter >= 365 && flameCounter % 365 == 0) { + flameEmoji = '🎂'; + } + return Row( children: [ if (widget.prefix) const SizedBox(width: 5), @@ -79,7 +89,7 @@ class _FlameCounterWidgetState extends State { SizedBox( height: 15, child: EmojiAnimation( - emoji: isBestFriend ? '❤️‍🔥' : '🔥', + emoji: flameEmoji, ), ), ], diff --git a/pubspec.lock b/pubspec.lock index 3ee608d..da0924f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: cd83f7d6bd4e4c0b0b4fef802e8796784032e1cc23d7b0e982cf5d05d9bbe182 + sha256: afe15ce18a287d2f89da95566e62892df339b1936bbe9b83587df45b944ee72a url: "https://pub.dev" source: hosted - version: "1.3.66" + version: "1.3.67" adaptive_number: dependency: "direct overridden" description: @@ -68,10 +68,10 @@ packages: dependency: "direct main" description: name: archive - sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff url: "https://pub.dev" source: hosted - version: "4.0.7" + version: "4.0.9" args: dependency: transitive description: @@ -108,10 +108,10 @@ packages: dependency: "direct main" description: name: background_downloader - sha256: "2ea5322fe836c0aaf96aefd29ef1936771c71927f687cf18168dcc119666a45f" + sha256: "4cb23d9ad4f5060944f38164e7b90d4bf99b57b2472a3bd4676e59b2db4afd06" url: "https://pub.dev" source: hosted - version: "9.5.2" + version: "9.5.4" boolean_selector: dependency: transitive description: @@ -164,10 +164,10 @@ packages: dependency: transitive description: name: built_value - sha256: "7931c90b84bc573fef103548e354258ae4c9d28d140e41961df6843c5d60d4d8" + sha256: "6ae8a6435a8c6520c7077b107e77f1fb4ba7009633259a4d49a8afd8e7efc5e9" url: "https://pub.dev" source: hosted - version: "8.12.3" + version: "8.12.4" cached_network_image: dependency: "direct main" description: @@ -196,10 +196,10 @@ packages: dependency: "direct main" description: name: camera - sha256: a005c6b9783d895a3a9808d65d06773d13587e22a186b6fe8ef3801b0d12f8cf + sha256: "4142a19a38e388d3bab444227636610ba88982e36dff4552d5191a86f65dc437" url: "https://pub.dev" source: hosted - version: "0.11.3+1" + version: "0.11.4" camera_android_camerax: dependency: "direct overridden" description: @@ -365,10 +365,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "15a7db352c8fc6a4d2bc475ba901c25b39fe7157541da4c16eacce6f8be83e49" + sha256: "6f6b30cba0301e7b38f32bdc9a6bdae6f5921a55f0a1eb9450e1e6515645dbb2" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.6" dbus: dependency: transitive description: @@ -508,10 +508,10 @@ packages: dependency: "direct main" description: name: firebase_core - sha256: "923085c881663ef685269b013e241b428e1fb03cdd0ebde265d9b40ff18abf80" + sha256: f0997fee80fbb6d2c658c5b88ae87ba1f9506b5b37126db64fc2e75d8e977fbb url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.5.0" firebase_core_platform_interface: dependency: transitive description: @@ -524,34 +524,34 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: "83e7356c704131ca4d8d8dd57e360d8acecbca38b1a3705c7ae46cc34c708084" + sha256: "856ca92bf2d75a63761286ab8e791bda3a85184c2b641764433b619647acfca6" url: "https://pub.dev" source: hosted - version: "3.4.0" + version: "3.5.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: "06fad40ea14771e969a8f2bbce1944aa20ee2f4f57f4eca5b3ba346b65f3f644" + sha256: bd17823b70e629877904d384841cda72ed2cc197517404c0c90da5c0ba786a8c url: "https://pub.dev" source: hosted - version: "16.1.1" + version: "16.1.2" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: "6c49e901c77e6e10e86d98e32056a087eb1ca1b93acdf58524f1961e617657b7" + sha256: "550435235cc7d53683f32bf0762c28ef8cfc20a8d36318a033676ae09526d7fb" url: "https://pub.dev" source: hosted - version: "4.7.6" + version: "4.7.7" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "2756f8fea583ffb9d294d15ddecb3a9ad429b023b70c9990c151fc92c54a32b3" + sha256: "6b1b93ed90309fbce91c219e3cd32aa831e8eccaf4a61f3afaea1625479275d2" url: "https://pub.dev" source: hosted - version: "4.1.2" + version: "4.1.3" fixnum: dependency: "direct main" description: @@ -868,14 +868,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.11.1" - google_mlkit_face_detection: - dependency: "direct main" - description: - name: google_mlkit_face_detection - sha256: "7b6ddcc69dbd6fbfa313fb2d974ad0f0c3a0d1657560f0da6be465baf1889687" - url: "https://pub.dev" - source: hosted - version: "0.13.2" graphs: dependency: transitive description: @@ -957,10 +949,10 @@ packages: dependency: "direct main" description: name: image - sha256: "492bd52f6c4fbb6ee41f781ff27765ce5f627910e1e0cbecfa3d9add5562604c" + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce url: "https://pub.dev" source: hosted - version: "4.7.2" + version: "4.8.0" image_picker: dependency: "direct main" description: @@ -973,10 +965,10 @@ packages: dependency: transitive description: name: image_picker_android - sha256: "518a16108529fc18657a3e6dde4a043dc465d16596d20ab2abd49a4cac2e703d" + sha256: eda9b91b7e266d9041084a42d605a74937d996b87083395c5e47835916a86156 url: "https://pub.dev" source: hosted - version: "0.8.13+13" + version: "0.8.13+14" image_picker_for_web: dependency: transitive description: @@ -1053,10 +1045,10 @@ packages: dependency: transitive description: name: in_app_purchase_storekit - sha256: f7cbbd7fb47ab5a4fb736fc3f20ae81a4f6def0af9297b3c525ca727761e2589 + sha256: "2f1a1db44798158076ced07d401b349880dd24a29c7c50a1b1a0de230b7f2f62" url: "https://pub.dev" source: hosted - version: "0.4.7" + version: "0.4.8" intl: dependency: "direct main" description: @@ -1100,26 +1092,18 @@ packages: dependency: "direct main" description: name: json_annotation - sha256: "805fa86df56383000f640384b282ce0cb8431f1a7a2396de92fb66186d8c57df" + sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8 url: "https://pub.dev" source: hosted - version: "4.10.0" - json_schema: - dependency: transitive - description: - name: json_schema - sha256: f37d9c3fdfe8c9aae55fdfd5af815d24ce63c3a0f6a2c1f0982c30f43643fa1a - url: "https://pub.dev" - source: hosted - version: "5.2.2" + version: "4.11.0" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: "93fba3ad139dab2b1ce59ecc6fdce6da46a42cdb6c4399ecda30f1e7e725760d" + sha256: "44729f5c45748e6748f6b9a57ab8f7e4336edc8ae41fc295070e3814e616a6c0" url: "https://pub.dev" source: hosted - version: "6.12.0" + version: "6.13.0" leak_tracker: dependency: transitive description: @@ -1163,26 +1147,26 @@ packages: dependency: "direct main" description: name: local_auth - sha256: a4f1bf57f0236a4aeb5e8f0ec180e197f4b112a3456baa6c1e73b546630b0422 + sha256: ae6f382f638108c6becd134318d7c3f0a93875383a54010f61d7c97ac05d5137 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.1" local_auth_android: dependency: transitive description: name: local_auth_android - sha256: "162b8e177fd9978c4620da2a8002a5c6bed4d20f0c6daf5137e72e9a8b767d2e" + sha256: dc9663a7bc8ac33d7d988e63901974f63d527ebef260eabd19c479447cc9c911 url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.0.5" local_auth_darwin: dependency: transitive description: name: local_auth_darwin - sha256: "176480aa855ebedeed195e26ac7d6601a45e6b255dfc7433f353e0c1aeafa9a2" + sha256: a8c3d4e17454111f7fd31ff72a31222359f6059f7fe956c2dcfe0f88f49826d4 url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" local_auth_platform_interface: dependency: transitive description: @@ -1447,10 +1431,10 @@ packages: dependency: transitive description: name: petitparser - sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.0.2" photo_view: dependency: "direct main" description: @@ -1493,18 +1477,18 @@ packages: dependency: transitive description: name: posix - sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" + sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" url: "https://pub.dev" source: hosted - version: "6.0.3" + version: "6.5.0" pro_video_editor: dependency: "direct main" description: name: pro_video_editor - sha256: "0d985f7653c59e2b521d19db49351476eb74eb4001689b33fb8112ab1a9c4330" + sha256: "5aa37aed1399333a3ac4b78ce00c7dcba77c5e407b6420960bba43751895fa22" url: "https://pub.dev" source: hosted - version: "1.6.1" + version: "1.6.2" protobuf: dependency: "direct main" description: @@ -1551,14 +1535,6 @@ packages: relative: true source: path version: "4.1.0" - quiver: - dependency: transitive - description: - name: quiver - sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 - url: "https://pub.dev" - source: hosted - version: "3.2.2" recase: dependency: transitive description: @@ -1571,18 +1547,10 @@ packages: dependency: "direct main" description: name: restart_app - sha256: "00d5ec3e9de871cedbe552fc41e615b042b5ec654385e090e0983f6d02f655ed" + sha256: "0fd0a14cedfcd65d429588c204de44493866438391a9ee97ecf910ce591323ae" url: "https://pub.dev" source: hosted - version: "1.3.2" - rfc_6901: - dependency: transitive - description: - name: rfc_6901 - sha256: "6a43b1858dca2febaf93e15639aa6b0c49ccdfd7647775f15a499f872b018154" - url: "https://pub.dev" - source: hosted - version: "0.2.1" + version: "1.7.2" rxdart: dependency: transitive description: @@ -1603,18 +1571,18 @@ packages: dependency: transitive description: name: sentry - sha256: e57e57123968b673c8ca19892eecf93113b4811b8e5cd5d165749ca7f7319fdb + sha256: "605ad1f6f1ae5b72018cbe8fc20f490fa3bd53e58882e5579566776030d8c8c1" url: "https://pub.dev" source: hosted - version: "9.13.0" + version: "9.14.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: c8f5b805c0346cd0c93b09e584675af7ed8c3ef36c3589181ad19b4adce35954 + sha256: "7fd0fb80050c1f6a77ae185bda997a76d384326d6777cf5137a6c38952c4ac7d" url: "https://pub.dev" source: hosted - version: "9.13.0" + version: "9.14.0" share_plus: dependency: "direct main" description: @@ -1643,10 +1611,10 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: cbc40be9be1c5af4dab4d6e0de4d5d3729e6f3d65b89d21e1815d57705644a6f + sha256: "8374d6200ab33ac99031a852eba4c8eb2170c4bf20778b3e2c9eccb45384fb41" url: "https://pub.dev" source: hosted - version: "2.4.20" + version: "2.4.21" shared_preferences_foundation: dependency: transitive description: @@ -1848,10 +1816,10 @@ packages: dependency: transitive description: name: test_api - sha256: "19a78f63e83d3a61f00826d09bc2f60e191bf3504183c001262be6ac75589fb8" + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.8" + version: "0.7.9" timezone: dependency: transitive description: @@ -1868,14 +1836,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" - uri: - dependency: transitive - description: - name: uri - sha256: "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a" - url: "https://pub.dev" - source: hosted - version: "1.0.0" url_launcher: dependency: "direct main" description: @@ -1896,10 +1856,10 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: b1aca26728b7cc7a3af971bb6f601554a8ae9df2e0a006de8450ba06a17ad36a + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" url: "https://pub.dev" source: hosted - version: "6.4.0" + version: "6.4.1" url_launcher_linux: dependency: transitive description: @@ -1944,10 +1904,10 @@ packages: dependency: transitive description: name: uuid - sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" url: "https://pub.dev" source: hosted - version: "4.5.2" + version: "4.5.3" vector_graphics: dependency: "direct main" description: @@ -1968,10 +1928,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: "201e876b5d52753626af64b6359cd13ac6011b80728731428fd34bc840f71c9b" + sha256: "5a88dd14c0954a5398af544651c7fb51b457a2a556949bfb25369b210ef73a74" url: "https://pub.dev" source: hosted - version: "1.1.20" + version: "1.2.0" vector_math: dependency: transitive description: @@ -1984,10 +1944,10 @@ packages: dependency: "direct dev" description: name: very_good_analysis - sha256: "27927d1140ce1b140f998b6340f730a626faa5b95110b3e34a238ff254d731d0" + sha256: d1cb1d66a5aae2c702d68caca6c8347306d35e728fd94555fa21fa0448a972e0 url: "https://pub.dev" source: hosted - version: "10.1.0" + version: "10.2.0" video_compress: dependency: "direct main" description: @@ -2000,18 +1960,18 @@ packages: dependency: "direct main" description: name: video_player - sha256: "096bc28ce10d131be80dfb00c223024eb0fba301315a406728ab43dd99c45bdf" + sha256: "08bfba72e311d48219acad4e191b1f9c27ff8cf928f2c7234874592d9c9d7341" url: "https://pub.dev" source: hosted - version: "2.10.1" + version: "2.11.0" video_player_android: dependency: transitive description: name: video_player_android - sha256: ee4fd520b0cafa02e4a867a0f882092e727cdaa1a2d24762171e787f8a502b0a + sha256: "9862c67c4661c98f30fe707bc1a4f97d6a0faa76784f485d282668e4651a7ac3" url: "https://pub.dev" source: hosted - version: "2.9.1" + version: "2.9.4" video_player_avfoundation: dependency: transitive description: @@ -2092,6 +2052,38 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + workmanager: + dependency: "direct main" + description: + name: workmanager + sha256: "065673b2a465865183093806925419d311a9a5e0995aa74ccf8920fd695e2d10" + url: "https://pub.dev" + source: hosted + version: "0.9.0+3" + workmanager_android: + dependency: transitive + description: + name: workmanager_android + sha256: "9ae744db4ef891f5fcd2fb8671fccc712f4f96489a487a1411e0c8675e5e8cb7" + url: "https://pub.dev" + source: hosted + version: "0.9.0+2" + workmanager_apple: + dependency: transitive + description: + name: workmanager_apple + sha256: "1cc12ae3cbf5535e72f7ba4fde0c12dd11b757caf493a28e22d684052701f2ca" + url: "https://pub.dev" + source: hosted + version: "0.9.1+2" + workmanager_platform_interface: + dependency: transitive + description: + name: workmanager_platform_interface + sha256: f40422f10b970c67abb84230b44da22b075147637532ac501729256fcea10a47 + url: "https://pub.dev" + source: hosted + version: "0.9.1+1" x25519: dependency: "direct overridden" description: @@ -2124,5 +2116,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.10.3 <4.0.0" + dart: ">=3.11.0 <4.0.0" flutter: ">=3.38.4" diff --git a/pubspec.yaml b/pubspec.yaml index 9eb29ca..e2f2654 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -48,6 +48,7 @@ dependencies: font_awesome_flutter: ^10.10.0 share_plus: ^12.0.0 package_info_plus: ^9.0.0 + workmanager: ^0.9.0+3 # Trustworthy publishers @@ -63,10 +64,27 @@ dependencies: drift: ^2.25.1 drift_flutter: ^0.2.4 flutter_local_notifications: ^19.1.0 - sentry_flutter: ^9.8.0 + sentry_flutter: ^9.14.0 - # With high download + # Overwritten by self-controlled repository + emoji_picker_flutter: ^4.3.0 + + # Packages which got overwritten using the twonly-app-dependencies repository + # Idea: Every change goes though a git commit, where every change can be reviewed. + restart_app: ^1.3.2 + photo_view: ^0.15.0 + hashlib: ^2.0.0 + libsignal_protocol_dart: ^0.7.4 + lottie: ^3.3.1 + mutex: ^3.1.0 + introduction_screen: ^4.0.0 + qr_flutter: ^4.1.0 + hand_signature: ^3.0.3 + flutter_sharing_intent: ^2.0.4 + no_screenshot: ^0.3.1 + + # With high download. (But should be checked nonetheless.) app_links: ^7.0.0 # 1.6 mio image: ^4.3.0 # 3.3 mio archive: ^4.0.7 # 6.5 mio @@ -75,7 +93,6 @@ dependencies: flutter_secure_storage: ^10.0.0 # 1.85 mio permission_handler: ^12.0.0+1 # 2 mio - # Not yet checked audio_waveforms: ^2.0.0 avatar_maker: ^0.4.0 @@ -88,30 +105,6 @@ dependencies: flutter_volume_controller: ^1.3.4 gal: ^2.3.1 google_mlkit_barcode_scanning: ^0.14.1 - - # flutter_secure_storage: - # git: - # url: https://github.com/juliansteenbakker/flutter_secure_storage.git - # ref: a06ead81809c900e7fc421a30db0adf3b5919139 # from develop - # path: flutter_secure_storage/ - - - # Overwritten by self-controlled repository - emoji_picker_flutter: ^4.3.0 - - # Packages which got overwritten using the twonly-app-dependencies repository - restart_app: ^1.3.2 - photo_view: ^0.15.0 - hashlib: ^2.0.0 - libsignal_protocol_dart: ^0.7.4 - lottie: ^3.3.1 - mutex: ^3.1.0 - introduction_screen: ^4.0.0 - qr_flutter: ^4.1.0 - hand_signature: ^3.0.3 - flutter_sharing_intent: ^2.0.4 - no_screenshot: ^0.3.1 - google_mlkit_face_detection: ^0.13.1 pro_video_editor: ^1.6.1 video_compress: ^3.1.4 @@ -208,6 +201,5 @@ flutter: - assets/animated_icons/ - assets/animations/ - assets/passwords/ - - assets/filters/ - CHANGELOG.md