diff --git a/.crashlytics/dump_syms.bin b/.crashlytics/dump_syms.bin new file mode 100755 index 00000000..97943c5e Binary files /dev/null and b/.crashlytics/dump_syms.bin differ diff --git a/.vscode/settings.json b/.vscode/settings.json index 7f89760e..a1f99a30 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,4 +5,4 @@ "other": "off" }, "java.configuration.updateBuildConfiguration": "automatic" -} +} \ No newline at end of file diff --git a/android/.tool-versions b/android/.tool-versions index af32ddaa..3d505cf2 100644 --- a/android/.tool-versions +++ b/android/.tool-versions @@ -1,2 +1,2 @@ gradle 8.10.2 -kotlin 1.8.22 +kotlin 2.0.20 diff --git a/android/app/build.gradle b/android/app/build.gradle index 75a53588..d55ff444 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.application' id 'com.android.library' apply false + id 'com.google.firebase.crashlytics' id 'org.jetbrains.kotlin.android' id "kotlin-android" @@ -35,6 +36,7 @@ android { namespace 'com.freaccess.hub' compileSdkVersion 34 compileSdk 35 + // ndkVersion "25.1.8937393" // Example version sourceSets { main.java.srcDirs += 'src/main/kotlin' @@ -96,6 +98,15 @@ android { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + firebaseCrashlytics { + mappingFileUploadEnabled true + nativeSymbolUploadEnabled false // Disable NDK symbol upload + unstrippedNativeLibsDir "build/intermediates/merged_native_libs/release/out/lib" // Add this + strippedNativeLibsDir "build/intermediates/stripped_native_libs/release/out/lib" + + // Point to your google-services.json location + // googleServicesResourceRoot "${project.projectDir}/../../android/app" + } } debug { signingConfig signingConfigs.debug @@ -128,4 +139,5 @@ dependencies { } -apply plugin: 'com.google.gms.google-services' \ No newline at end of file +apply plugin: 'com.google.gms.google-services' + // id 'com.google.firebase.crashlytics' \ No newline at end of file diff --git a/android/app/google-services.json b/android/app/google-services.json index dfe96ebc..3840ad7e 100644 --- a/android/app/google-services.json +++ b/android/app/google-services.json @@ -3,7 +3,7 @@ "project_number": "187064172787", "firebase_url": "https://accessmoblie-da839.firebaseio.com", "project_id": "accessmoblie-da839", - "storage_bucket": "accessmoblie-da839.appspot.com" + "storage_bucket": "accessmoblie-da839.firebasestorage.app" }, "client": [ { diff --git a/android/build.gradle b/android/build.gradle index cd5795fe..e2b77b73 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.8.22' - ext.gradle_version = '8.6.0' // Replace with the latest version - ext.google_services_version = '4.4.2' // Replace with the latest version + ext.kotlin_version = '2.0.20' + ext.gradle_version = '8.8.0' // Replace with the latest version + ext.google_services_version = '4.4.1' // Replace with the latest version repositories { google() mavenCentral() @@ -12,6 +12,7 @@ buildscript { // Use a versão do Gradle que corresponde à sua configuração classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.google.gms:google-services:$google_services_version" + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' // Google Services plugin } } diff --git a/android/gradle.properties b/android/gradle.properties index d1327d41..d697d418 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx4608m android.useAndroidX=true android.enableJetifier=true -android.enableR8=true +# android.enableR8=true enableProguardInReleaseBuilds = true diff --git a/android/settings.gradle b/android/settings.gradle index 28b925fa..d96886e2 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -18,13 +18,13 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id 'com.android.application' version '8.6.0' apply false - id 'com.android.library' version '8.6.0' apply false - id 'org.jetbrains.kotlin.android' version '1.8.22' apply false + id 'com.android.application' version '8.8.0' apply false + id 'com.android.library' version '8.8.0' apply false + id 'org.jetbrains.kotlin.android' version '2.0.20' apply false // START: FlutterFire Configuration - id "com.google.gms.google-services" version "4.3.15" apply false + id "com.google.gms.google-services" version "4.4.1" apply false // END: FlutterFire Configuration // id "org.jetbrains.kotlin.android" version "1.7.10" apply false // id "org.jetbrains.kotlin.android" version "1.8.10" apply false diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart index da88df3f..6267453a 100644 --- a/integration_test/app_test.dart +++ b/integration_test/app_test.dart @@ -1,6 +1,10 @@ import 'dart:collection'; import 'dart:math'; +import 'package:app_tracking_transparency/app_tracking_transparency.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -8,42 +12,65 @@ import 'package:go_router/go_router.dart'; import 'package:hub/components/molecular_components/throw_exception/throw_exception_widget.dart'; import 'package:hub/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart'; import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_widget.dart'; +import 'package:hub/components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart'; import 'package:hub/features/backend/api_requests/index.dart'; import 'package:hub/features/local/index.dart'; import 'package:hub/features/menu/index.dart'; import 'package:hub/features/module/data/index.dart'; import 'package:hub/features/module/domain/index.dart'; +import 'package:hub/features/notification/index.dart'; import 'package:hub/features/storage/index.dart'; import 'package:hub/flutter_flow/index.dart' as ff; +import 'package:hub/flutter_flow/index.dart'; import 'package:hub/initialization.dart'; import 'package:hub/main.dart'; -import 'package:integration_test/integration_test.dart'; +import 'package:hub/pages/forgot_password_page/forgot_password_screen.dart'; import 'package:material_symbols_icons/symbols.dart'; -import 'package:patrol_finders/patrol_finders.dart'; +import 'package:flutter_web_plugins/url_strategy.dart'; +import 'package:patrol/patrol.dart'; +import 'app_test.dart'; import 'fuzzer/fuzzer.dart'; +import 'package:patrol_finders/patrol_finders.dart'; +import 'package:integration_test/integration_test.dart'; +export 'package:flutter_test/flutter_test.dart'; +export 'package:patrol/patrol.dart'; + part 'auth_test.dart'; + +part 'common.dart'; + part 'home_test.dart'; + part 'locals_test.dart'; + part 'menu_test.dart'; + part 'module_test.dart'; + part 'notify_test.dart'; + part 'profile_test.dart'; + part 'property_test.dart'; + part 'setting_test.dart'; + part 'storage_test.dart'; + part 'utils_test.dart'; + part 'welcome_test.dart'; late PatrolTester $; void main() { //init integration test - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + // IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - setUp(() async {}); - tearDown(() async {}); + // setUp(() async {}); + // tearDown(() async {}); WelcomeTest.signInToSignUp(); WelcomeTest.signUpToSignIn(); @@ -51,6 +78,7 @@ void main() { AuthenticationTest.signIn(); AuthenticationTest.signUp(); AuthenticationTest.signOut(); + // AuthenticationTest.recovery(); ModularizationTest.switchLicense(); ModularizationTest.containLicense(); @@ -61,4 +89,5 @@ void main() { LocalsTest.setLocal(); LocalsTest.unlinkLocal(); + LocalsTest.attachLocal(); } diff --git a/integration_test/auth_test.dart b/integration_test/auth_test.dart index 3528acc1..4045cfc3 100644 --- a/integration_test/auth_test.dart +++ b/integration_test/auth_test.dart @@ -182,9 +182,7 @@ class AuthenticationTest { await $.waitUntilVisible($(MenuStaggeredView)); - await $(Icons.menu_rounded) // - .waitUntilVisible() - .tap(); + await $(Icons.menu_rounded).waitUntilVisible().tap(); await $.waitUntilVisible($(MenuListView)); @@ -197,7 +195,28 @@ class AuthenticationTest { ); } - static Future recovery() async {} + static void recovery() async { + patrol('Open url in the app', ($) async { + await _loggedWithMultiLocalsAccount(); + await $.pumpWidget(const App()); + + await $.waitUntilVisible($(MenuStaggeredView)); + + // await $.native.pressHome(); + // final String browserId = 'com.android.chrome'; + // await $.native.openApp(appId: browserId); + await $.native.openUrl(// + 'https://freaccess.com.br/freaccess/alterarSenha.php?email=freaccesshub@gmail.com&token=67939240e12c31.10412525'); + + await $.pumpAndSettle(); + Future.delayed(Duration(seconds: 3)); + await $.pump(Duration(seconds: 3)); + await $.pumpAndSettle(); + final PatrolFinder forgotPassword = + await $(#ForgotPasswordScreen).waitUntilVisible(); + expect(forgotPassword, findsOneWidget); + }); + } } Future _auth( diff --git a/integration_test/common.dart b/integration_test/common.dart new file mode 100644 index 00000000..9de14e48 --- /dev/null +++ b/integration_test/common.dart @@ -0,0 +1,31 @@ +part of 'app_test.dart'; + +final _PatrolTesterConfig = PatrolTesterConfig(printLogs: true); +final _nativeAutomatorConfig = NativeAutomatorConfig( + findTimeout: Duration(seconds: 20), // 10 seconds is too short for some CIs +); + +// Future createApp(PatrolTester $) async { +// await app_main.main(); +// await $.pumpAndSettle(); +// } + +void patrol( + String description, + Future Function(PatrolIntegrationTester) callback, { + bool? skip, + List tags = const [], + NativeAutomatorConfig? nativeAutomatorConfig, + LiveTestWidgetsFlutterBindingFramePolicy framePolicy = + LiveTestWidgetsFlutterBindingFramePolicy.fadePointers, +}) { + patrolTest( + description, + config: _PatrolTesterConfig, + nativeAutomatorConfig: nativeAutomatorConfig ?? _nativeAutomatorConfig, + framePolicy: framePolicy, + skip: skip, + callback, + tags: tags, + ); +} diff --git a/integration_test/example_test.dart b/integration_test/example_test.dart index e69de29b..8b137891 100644 --- a/integration_test/example_test.dart +++ b/integration_test/example_test.dart @@ -0,0 +1 @@ + diff --git a/integration_test/locals_test.dart b/integration_test/locals_test.dart index e2e605c9..4faba845 100644 --- a/integration_test/locals_test.dart +++ b/integration_test/locals_test.dart @@ -303,73 +303,61 @@ class LocalsTest { static Future attachLocal() async { patrolWidgetTest( - 'Selecionar um local disponível com multíplos locais disponíveis', // + 'Auto-Validação de Locais com Multiplos Locais', // (PatrolTester tester) async { $ = tester; - await _loggedWithMultiLocalsAccount(); + $.tester.printToConsole('Locals Test - Vincular um local desvinculado'); + + await _loggedWithMultiLocalsAccount(false); await $.pumpWidget(const App()); - late Map credentials; - final PatrolFinder throwsException = $(''); - var name = ff.randomString(7, 7, true, true, true); - var email = '$name@example.com'; - var password = '12345678'; - credentials = { - 'nameTextFormField': name, - 'emailTextFormField': email, - 'passwordTextFormField': password - }; + final PatrolFinder bottomSheetFinder = + await $(BottomArrowLinkedLocalsComponentWidget) // + .waitUntilVisible(); + expect(bottomSheetFinder, findsOneWidget); - await $.pumpWidget(const App()); - await _navigateToSignUp($); - await _auth(credentials, $, throwsException); - credentials = { - 'emailTextFormField': email, - 'passwordTextFormField': password - }; - await _auth(credentials, $, throwsException); + await $.pump(const Duration(milliseconds: 500)); + + final PatrolFinder listViewFinder = $(bottomSheetFinder) // + .$(ListView); + expect(listViewFinder, findsOneWidget); + + await $.pump(const Duration(milliseconds: 500)); + + final PatrolFinder entriesFinder = $(listViewFinder) // + .$(CardItemTemplateComponentWidget); + expect(entriesFinder, findsWidgets); - await $.pumpAndSettle(); - await StorageHelper() // - .set(ProfileStorageKey.clientUUID.key, '7'); - await $.pumpAndSettle(); await Future.delayed(const Duration(milliseconds: 500)); - return; }, ); patrolWidgetTest( - 'Selecionar um local disponível com somente um local disponível', // + 'Auto-Validação de Locais com local unico', // (PatrolTester tester) async { $ = tester; - await _loggedWithSomeoneLocalAccount(); + $.tester.printToConsole('Locals Test - Vincular um local desvinculado'); + + await _loggedWithSomeoneLocalAccount(false); await $.pumpWidget(const App()); - late Map credentials; - final PatrolFinder throwsException = $(''); - var name = ff.randomString(7, 7, true, true, true); - var email = '$name@example.com'; - var password = '12345678'; - credentials = { - 'nameTextFormField': name, - 'emailTextFormField': email, - 'passwordTextFormField': password - }; + final PatrolFinder bottomSheetFinder = + await $(BottomArrowLinkedLocalsComponentWidget) // + .waitUntilVisible(); + expect(bottomSheetFinder, findsOneWidget); - await $.pumpWidget(const App()); - await _navigateToSignUp($); - await _auth(credentials, $, throwsException); - credentials = { - 'emailTextFormField': email, - 'passwordTextFormField': password - }; - await _auth(credentials, $, throwsException); + await $.pump(const Duration(milliseconds: 500)); + + final PatrolFinder listViewFinder = $(bottomSheetFinder) // + .$(ListView); + expect(listViewFinder, findsOneWidget); + + await $.pump(const Duration(milliseconds: 500)); + + final PatrolFinder entriesFinder = $(listViewFinder) // + .$(CardItemTemplateComponentWidget); + expect(entriesFinder, findsWidgets); - await $.pumpAndSettle(); - await StorageHelper() // - .set(ProfileStorageKey.clientUUID.key, '7'); - await $.pumpAndSettle(); await Future.delayed(const Duration(milliseconds: 500)); - return; }, ); } diff --git a/integration_test/test_bundle.dart b/integration_test/test_bundle.dart index 32287821..55d38e30 100644 --- a/integration_test/test_bundle.dart +++ b/integration_test/test_bundle.dart @@ -9,7 +9,7 @@ import 'package:patrol/src/native/contracts/contracts.dart'; import 'package:test_api/src/backend/invoker.dart'; // START: GENERATED TEST IMPORTS -import 'app_test.dart' as app_test; +import 'app_test.dart' as __app_test; // END: GENERATED TEST IMPORTS Future main() async { @@ -31,7 +31,7 @@ Future main() async { // When running on iOS, the native side of Patrol (specifically: the // PATROL_INTEGRATION_TEST_IOS_RUNNER macro) makes an initial run to gather // the tests that it will later run (same as the Android). During that initial - // run, it makes an RPC call to PatrolAppSevice and asks it for Dart tests. + // run, it makes an RPC call to PatrolAppService and asks it for Dart tests. // // Once the native runner has the list of Dart tests, it dynamically creates // native test cases from them. On Android, this is done using the @@ -59,7 +59,8 @@ Future main() async { // Maybe somewhat counterintuitively, this callback runs *after* the calls // to group() below. final topLevelGroup = Invoker.current!.liveTest.groups.first; - final dartTestGroup = createDartTestGroup(topLevelGroup, + final dartTestGroup = createDartTestGroup( + topLevelGroup, tags: null, excludeTags: null, ); @@ -69,7 +70,7 @@ Future main() async { }); // START: GENERATED TEST GROUPS - group('app_test', app_test.main); + group('.app_test', __app_test.main); // END: GENERATED TEST GROUPS final dartTestGroup = await testExplorationCompleter.future; diff --git a/integration_test/utils_test.dart b/integration_test/utils_test.dart index 144aa4ad..cce351a2 100644 --- a/integration_test/utils_test.dart +++ b/integration_test/utils_test.dart @@ -2,7 +2,7 @@ part of 'app_test.dart'; Future _loggedWithMultiLocalsAccount( [bool forceLinkedLocal = true]) async { - await initializeApp(); + await _init(); await StorageHelper() // .set(SecureStorageKey.isLogged.value, 'true'); await StorageHelper() // @@ -21,6 +21,10 @@ Future _loggedWithMultiLocalsAccount( if (forceLinkedLocal == true) { await StorageHelper() // .set(ProfileStorageKey.clientUUID.key, '7'); + await StorageHelper() // + .set(ProfileStorageKey.ownerUUID.key, '7'); + await StorageHelper() // + .set(ProfileStorageKey.clientName.key, 'FRE ACCESS DEMO'); await PhpGroup // .resopndeVinculo .call(tarefa: 'A'); @@ -31,7 +35,7 @@ Future _loggedWithMultiLocalsAccount( Future _loggedWithSomeoneLocalAccount( [bool forceLinkedLocal = true]) async { - await initializeApp(); + await _init(); await StorageHelper() // .set(SecureStorageKey.isLogged.value, 'true'); await StorageHelper() // @@ -50,6 +54,10 @@ Future _loggedWithSomeoneLocalAccount( if (forceLinkedLocal == true) { await StorageHelper() // .set(ProfileStorageKey.clientUUID.key, '7'); + await StorageHelper() // + .set(ProfileStorageKey.ownerUUID.key, '7'); + await StorageHelper() // + .set(ProfileStorageKey.clientName.key, 'FRE ACCESS DEMO'); await PhpGroup // .resopndeVinculo .call(tarefa: 'A'); @@ -59,7 +67,7 @@ Future _loggedWithSomeoneLocalAccount( } Future _unlogged() async { - await initializeApp(); + await _init(); await StorageHelper() // .set(SecureStorageKey.isLogged.value, 'false'); await StorageHelper() // @@ -78,6 +86,18 @@ Future _unlogged() async { .set(LocalsStorageKey.isNewVersion.key, true); } +Future _init() async { + WidgetsFlutterBinding.ensureInitialized(); + await _initializeTracking(); + await _initializeStorage(); + await _initializeFirebase(); + await _initializeNotificationService(); + _initializeUrlStrategy(); + _initializeSystemSettings(); + await _initializeFlutterFlow(); + await _initializeNav(); +} + Future _navigateToSignIn(PatrolTester $) async { final signInButton = $(#toggleSignInPage).waitUntilVisible(); await signInButton.tap(); @@ -91,3 +111,61 @@ Future _navigateToSignUp(PatrolTester $) async { Future _navigateBackUsingSystemGesture() async => IntegrationTestWidgetsFlutterBinding.instance.keyboard .isLogicalKeyPressed(LogicalKeyboardKey.escape); + +Future _initializeTracking() async { + print('Requesting tracking authorization...'); + await AppTrackingTransparency.requestTrackingAuthorization(); + print('Tracking authorization requested'); +} + +Future _initializeFirebase() async { + print('Initializing Firebase...'); + await Firebase.initializeApp(); + print('Firebase initialized'); +} + +Future _initializeNotificationService() async { + print('Initializing Notification Service...'); + await NotificationService.initialize(false); + + print('Notification Service initialized'); +} + +void _initializeUrlStrategy() { + print('Initializing URL Strategy...'); + setUrlStrategy(PathUrlStrategy()); + print('URL Strategy initialized'); +} + +void _initializeSystemSettings() { + print('Initializing System Settings...'); + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + if (kDebugMode) { + print('Debug mode'); + } else { + final crashlyticsInstance = FirebaseCrashlytics.instance; + print('Release mode'); + if (crashlyticsInstance.isCrashlyticsCollectionEnabled) { + FlutterError.onError = crashlyticsInstance.recordFlutterError; + print('Crashlytics enabled'); + } + } +} + +Future _initializeFlutterFlow() async { + print('Initializing FlutterFlow...'); + await FlutterFlowTheme.initialize(); + await FFLocalizations.initialize(); + print('FlutterFlow initialized'); +} + +Future _initializeNav() async { + print('Initializing Nav...'); + GoRouter.optionURLReflectsImperativeAPIs = true; + usePathUrlStrategy(); + print('Nav initialized'); +} + +Future _initializeStorage() async { + await StorageHelper().init(); +} diff --git a/integration_test/welcome_test.dart b/integration_test/welcome_test.dart index c384d771..e3dc0316 100644 --- a/integration_test/welcome_test.dart +++ b/integration_test/welcome_test.dart @@ -9,6 +9,7 @@ class WelcomeTest { $.tester.printToConsole('Welcome Test - Sign-In to Sign-Up'); await _unlogged(); await $.pumpWidgetAndSettle(const App()); + await _navigateToSignIn($); await _navigateToSignUp($); }, diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 2a883653..1113eac6 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -396,19 +396,19 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/webview_flutter_wkwebview/darwin" SPEC CHECKSUMS: - app_links: e7a6750a915a9e161c58d91bc610e8cd1d4d0ad0 - app_tracking_transparency: e169b653478da7bb15a6c61209015378ca73e375 - awesome_notifications: dd5518ff1c80be03d4f1c40f04da9d9cc2a37af5 + app_links: 3da4c36b46cac3bf24eb897f1a6ce80bda109874 + app_tracking_transparency: 3d84f147f67ca82d3c15355c36b1fa6b66ca7c92 + awesome_notifications: 0f432b28098d193920b11a44cfa9d2d9313a3888 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d + device_info_plus: 71ffc6ab7634ade6267c7a93088ed7e4f74e5896 DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 - file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655 + file_picker: 9b3292d7c8bc68c8a7bf8eb78f730e49c8efc517 Firebase: 9f574c08c2396885b5e7e100ed4293d956218af9 - firebase_analytics: 1a66fe8d4375eccff44671ea37897683a78b2675 - firebase_core: ceec591a66629daaee82d3321551692c4a871493 - firebase_crashlytics: e4f04180f443d5a8b56fbc0685bdbd7d90dd26f0 - firebase_messaging: 15d8b557010f3bb7b98d0302e1c7c8fbcd244425 + firebase_analytics: 2090f32a7f5364b03cdf11aa7e904f4610309563 + firebase_core: 53cecb83c72fea329b267bb0accb06a33e9f036a + firebase_crashlytics: 4a35a15cbb0d9ba176f9bb2dfd3aa44c762c434f + firebase_messaging: 62c8a01f1ee118754d01dd4fd83ba670980326a3 FirebaseAnalytics: 27eb78b97880ea4a004839b9bac0b58880f5a92a FirebaseCore: 3cf438f431f18c12cdf2aaf64434648b63f7e383 FirebaseCoreExtension: 30bb063476ef66cd46925243d64ad8b2c8ac3264 @@ -419,42 +419,42 @@ SPEC CHECKSUMS: FirebaseRemoteConfigInterop: c3a5c31b3c22079f41ba1dc645df889d9ce38cb9 FirebaseSessions: 655ff17f3cc1a635cbdc2d69b953878001f9e25b Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4 - flutter_secure_storage_darwin: 12d2375c690785d97a4e586f15f11be5ae35d5b0 - fluttertoast: e9a18c7be5413da53898f660530c56f35edfba9c - google_mlkit_commons: 384e4e206e122b6dad430d3158205e0b2fac6789 - google_mlkit_face_detection: ff627695d8eba051db7e0f13f7b20d802df1f84c + flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99 + flutter_secure_storage_darwin: ce237a8775b39723566dc72571190a3769d70468 + fluttertoast: 76fea30fcf04176325f6864c87306927bd7d2038 + google_mlkit_commons: 92c769cc2e0a2bfdeb3c38091a36e8a9cc8c63d4 + google_mlkit_face_detection: 76f493a9ffcb1aeb0ad4abd13ea58403e092ab84 GoogleAppMeasurement: 6e49ffac7d3f2c3ded9cc663f912a13b67bbd0de GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 GoogleMLKit: eff9e23ec1d90ea4157a1ee2e32a4f610c5b3318 GoogleToolboxForMac: d1a2cbf009c453f4d6ded37c105e2f67a32206d8 GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1 - integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 + image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a + integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e IosAwnCore: 653786a911089012092ce831f2945cd339855a89 - local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3 + local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391 MLImage: 0ad1c5f50edd027672d8b26b0fee78a8b4a0fc56 MLKitCommon: 07c2c33ae5640e5380beaaa6e4b9c249a205542d MLKitFaceDetection: 2a593db4837db503ad3426b565e7aab045cefea5 MLKitVision: 45e79d68845a2de77e2dd4d7f07947f0ed157b0e nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 - package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 - path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 - patrol: 0564cee315ff6c86fb802b3647db05cc2d3d0624 - permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 + package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 + path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 + patrol: dd82ffedfee3aba87c1d0ed2daad0b77bfb8ee1f + permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3 - share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad - shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 - sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d + share_plus: 011d6fb4f9d2576b83179a3a5c5e323202cdabcf + shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 + sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e - url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe - webview_flutter_wkwebview: 0982481e3d9c78fd5c6f62a002fcd24fc791f1e4 + url_launcher_ios: 694010445543906933d732453a59da0a173ae33d + webview_flutter_wkwebview: 44d4dee7d7056d5ad185d25b38404436d56c547c PODFILE CHECKSUM: 1214504d483029dbea12c83e130a53cc7299687f -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 2cb86b11..bd6cec46 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -216,6 +216,7 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, DB4ADAD93A6C1B6E82A2FDA3 /* [CP] Copy Pods Resources */, + 106EFC912B39433BCC0D0CA9 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */, ); buildRules = ( ); @@ -290,6 +291,24 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 106EFC912B39433BCC0D0CA9 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "FlutterFire: \"flutterfire upload-crashlytics-symbols\""; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\n#!/bin/bash\nPATH=\"${PATH}:$FLUTTER_ROOT/bin:$HOME/.pub-cache/bin\"\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=\"$PODS_ROOT/FirebaseCrashlytics/upload-symbols\" --platform=ios --apple-project-path=\"${SRCROOT}\" --env-platform-name=\"${PLATFORM_NAME}\" --env-configuration=\"${CONFIGURATION}\" --env-project-dir=\"${PROJECT_DIR}\" --env-built-products-dir=\"${BUILT_PRODUCTS_DIR}\" --env-dwarf-dsym-folder-path=\"${DWARF_DSYM_FOLDER_PATH}\" --env-dwarf-dsym-file-name=\"${DWARF_DSYM_FILE_NAME}\" --env-infoplist-path=\"${INFOPLIST_PATH}\" --default-config=default\n"; + }; 35A087622D3ED1C700BEE419 /* xcode_backend build */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist index dc3dcc38..a1475bb1 100644 --- a/ios/Runner/GoogleService-Info.plist +++ b/ios/Runner/GoogleService-Info.plist @@ -19,7 +19,7 @@ PROJECT_ID accessmoblie-da839 STORAGE_BUCKET - accessmoblie-da839.appspot.com + accessmoblie-da839.firebasestorage.app IS_ADS_ENABLED IS_ANALYTICS_ENABLED diff --git a/lib/components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart b/lib/components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart index d9797e17..12bdc25e 100644 --- a/lib/components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart +++ b/lib/components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart @@ -58,6 +58,7 @@ class _ForgotPasswordTemplateComponentWidgetState LimitedFontSizeUtil.getHeaderFontSize(context); return Align( + key: ValueKey('ForgotPasswordTemplateComponentWidget'), alignment: const AlignmentDirectional(0.0, 1.0), child: SingleChildScrollView( child: Container( diff --git a/lib/features/history/presentation/pages/provisional_history_page.dart b/lib/features/history/presentation/pages/provisional_history_page.dart index 54ef965d..e4bfde25 100644 --- a/lib/features/history/presentation/pages/provisional_history_page.dart +++ b/lib/features/history/presentation/pages/provisional_history_page.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; @@ -364,8 +365,8 @@ class ProvisionalHistoryState extends State { enText: 'Name:', ): historyItem['AGP_NOME'] ?? '', FFLocalizations.of(context).getVariableText( - ptText: 'Data:', - enText: 'Data:', + ptText: 'Vencimento', + enText: 'Expiration', ): formatDate(historyItem['AGP_DT_VISITA']), FFLocalizations.of(context).getVariableText( ptText: 'Observação:', @@ -398,19 +399,34 @@ class ProvisionalHistoryState extends State { enText: 'Visitor', ): FlutterFlowTheme.of(context).alternate2, }, - _getStatusMap(context, historyItem['AGP_STATUS']) + _getStatusMap(context, historyItem) ]; } - Map _getStatusMap(BuildContext context, String status) { - switch (status) { + Map _getStatusMap(BuildContext context, dynamic json) { + late Map statusColorMap; + log(DateTime.parse(json['AGP_DT_VISITA']).toString()); + log(DateTime.now().toString()); + final DateTime now = DateTime.now(); + final DateTime date = DateTime.parse(json['AGP_DT_VISITA']); + final bool isExpired = now.isAfter(date); + + final String statusMap = json['AGP_STATUS']; + switch (statusMap) { case 'AT': - return { - FFLocalizations.of(context).getVariableText( - ptText: 'Ativo', - enText: 'Active', - ): FlutterFlowTheme.of(context).success, - }; + return isExpired + ? { + FFLocalizations.of(context).getVariableText( + ptText: 'Vencido', + enText: 'Expired', + ): FlutterFlowTheme.of(context).error, + } + : { + FFLocalizations.of(context).getVariableText( + ptText: 'Ativo', + enText: 'Active', + ): FlutterFlowTheme.of(context).success, + }; case 'CO': return { FFLocalizations.of(context).getVariableText( diff --git a/lib/features/home/presentation/pages/about_system.dart b/lib/features/home/presentation/pages/about_system.dart index 78a409c2..7255388f 100644 --- a/lib/features/home/presentation/pages/about_system.dart +++ b/lib/features/home/presentation/pages/about_system.dart @@ -1,5 +1,6 @@ import 'dart:developer'; +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -7,6 +8,8 @@ import 'package:hub/flutter_flow/flutter_flow_icon_button.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/internationalization.dart'; +import 'package:hub/shared/utils/log_util.dart'; +import 'package:stack_trace/stack_trace.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -130,6 +133,20 @@ class _AboutSystemPageState extends State { width: 100, child: Image.asset('assets/images/fre.png'), ); + // return GestureDetector( + // onTap: () { + // final exception = Exception('Crashando'); + // final stackTrace = Trace.current(); + // LogUtil.requestAPIFailed("proccessRequest.php", "", "Consulta de Pets", + // exception, stackTrace); + // FirebaseCrashlytics.instance.crash(); + // }, + // child: SizedBox( + // height: 100, + // width: 100, + // child: Image.asset('assets/images/fre.png'), + // ), + // ); } Widget _buildLaunch() { diff --git a/lib/features/local/data/data_sources/locals_remote_data_source.dart b/lib/features/local/data/data_sources/locals_remote_data_source.dart index fd91b648..a40883cf 100644 --- a/lib/features/local/data/data_sources/locals_remote_data_source.dart +++ b/lib/features/local/data/data_sources/locals_remote_data_source.dart @@ -151,11 +151,13 @@ class LocalsRemoteDataSourceImpl implements LocalsRemoteDataSource { @override Future checkLocals(BuildContext context) async { - String cliUUID = - (await StorageHelper().get(ProfileStorageKey.clientUUID.key)) ?? ''; - String cliName = - (await StorageHelper().get(ProfileStorageKey.clientName.key)) ?? ''; - return cliUUID.isEmpty && cliName.isEmpty; + final String? cliUUID = + await StorageHelper().get(ProfileStorageKey.clientUUID.key); + final String? cliName = + await StorageHelper().get(ProfileStorageKey.clientName.key); + final haveCli = cliUUID != null && cliUUID.isNotEmpty; + final haveName = cliName != null && cliName.isNotEmpty; + return haveCli && haveName; } @override diff --git a/lib/features/local/data/repositories/locals_repository_impl.dart b/lib/features/local/data/repositories/locals_repository_impl.dart index 232e511e..d171256e 100644 --- a/lib/features/local/data/repositories/locals_repository_impl.dart +++ b/lib/features/local/data/repositories/locals_repository_impl.dart @@ -56,6 +56,7 @@ class LocalsRepositoryImpl implements LocalsRepository { final bool haveCli = cliUUID != null && cliUUID.isNotEmpty; final bool haveOwner = ownerUUID != null && ownerUUID.isNotEmpty; if (!haveCli && !haveOwner) { + log('No client or owner selected'); await update(context); await FirebaseMessagingService().updateDeviceToken(); } @@ -64,7 +65,8 @@ class LocalsRepositoryImpl implements LocalsRepository { Future _handleLocal(BuildContext context) async { bool response = false; final bool isUnselected = await remoteDataSource.checkLocals(context); - if (isUnselected) { + if (!isUnselected) { + log('_handleLocal -> No local selected'); while (!response) { try { response = await remoteDataSource.processLocals(context); @@ -77,6 +79,8 @@ class LocalsRepositoryImpl implements LocalsRepository { } } } else { + log('_handleLocal -> Local selected'); + return true; } diff --git a/lib/features/notification/deep_link_service.dart b/lib/features/notification/deep_link_service.dart index f7aa1ac0..4f6ba58d 100644 --- a/lib/features/notification/deep_link_service.dart +++ b/lib/features/notification/deep_link_service.dart @@ -59,7 +59,11 @@ class DeepLinkService { context: navigatorKey.currentContext!, builder: (context) => Padding( padding: MediaQuery.viewInsetsOf(context), - child: ForgotPasswordScreen(email: email, token: token), + child: ForgotPasswordScreen( + key: ValueKey('ForgotPasswordScreen'), + email: email, + token: token, + ), ), isScrollControlled: true, backgroundColor: FlutterFlowTheme.of(navigatorKey.currentContext!) diff --git a/lib/features/notification/notification_service.dart b/lib/features/notification/notification_service.dart index 8e1662d6..8c7b423c 100644 --- a/lib/features/notification/notification_service.dart +++ b/lib/features/notification/notification_service.dart @@ -260,7 +260,7 @@ Future onMessageReceived( } class NotificationService { - static Future initialize() async { + static Future initialize([bool forceRequest = true]) async { await AwesomeNotifications().initialize( 'resource://drawable/notification_icon', [ @@ -296,7 +296,8 @@ class NotificationService { if (isAllowed == false) { await StorageHelper() .set(LocalsStorageKey.requestOSNotification.key, true); - await AwesomeNotifications().requestPermissionToSendNotifications(); + if (forceRequest == true) + await AwesomeNotifications().requestPermissionToSendNotifications(); } } return; diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart index ac64bcb6..198a8ed2 100644 --- a/lib/firebase_options.dart +++ b/lib/firebase_options.dart @@ -53,7 +53,7 @@ class DefaultFirebaseOptions { projectId: 'accessmoblie-da839', authDomain: 'accessmoblie-da839.firebaseapp.com', databaseURL: 'https://accessmoblie-da839.firebaseio.com', - storageBucket: 'accessmoblie-da839.appspot.com', + storageBucket: 'accessmoblie-da839.firebasestorage.app', measurementId: 'G-L4BQGX2WLZ', ); @@ -63,7 +63,7 @@ class DefaultFirebaseOptions { messagingSenderId: '187064172787', projectId: 'accessmoblie-da839', databaseURL: 'https://accessmoblie-da839.firebaseio.com', - storageBucket: 'accessmoblie-da839.appspot.com', + storageBucket: 'accessmoblie-da839.firebasestorage.app', ); static const FirebaseOptions ios = FirebaseOptions( @@ -72,7 +72,7 @@ class DefaultFirebaseOptions { messagingSenderId: '187064172787', projectId: 'accessmoblie-da839', databaseURL: 'https://accessmoblie-da839.firebaseio.com', - storageBucket: 'accessmoblie-da839.appspot.com', + storageBucket: 'accessmoblie-da839.firebasestorage.app', androidClientId: '187064172787-7et0qu5p2qtmisvqgndn3kfi1b7u9ifl.apps.googleusercontent.com', iosClientId: diff --git a/lib/flutter_flow/nav/nav.dart b/lib/flutter_flow/nav/nav.dart index 22782a4d..600a43ad 100644 --- a/lib/flutter_flow/nav/nav.dart +++ b/lib/flutter_flow/nav/nav.dart @@ -152,7 +152,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) { params.getParam('token', ParamType.String); return ForgotPasswordScreen( - key: UniqueKey(), + key: ValueKey('ForgotPasswordScreen'), email: email, token: token, ); diff --git a/lib/initialization.dart b/lib/initialization.dart index 32198a5d..04aa29c6 100644 --- a/lib/initialization.dart +++ b/lib/initialization.dart @@ -50,18 +50,32 @@ void _initializeUrlStrategy() { print('URL Strategy initialized'); } -void _initializeSystemSettings() { +Future _initializeSystemSettings() async { print('Initializing System Settings...'); - SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + final crashlyticsInstance = FirebaseCrashlytics.instance; + + await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); if (kDebugMode) { + //kDebugMode print('Debug mode'); - } else { - final crashlyticsInstance = FirebaseCrashlytics.instance; - print('Release mode'); - if (crashlyticsInstance.isCrashlyticsCollectionEnabled) { - FlutterError.onError = crashlyticsInstance.recordFlutterError; - print('Crashlytics enabled'); + bool unsentReports = + await FirebaseCrashlytics.instance.checkForUnsentReports(); + if (unsentReports) { + // Existem relatórios não enviados + await crashlyticsInstance.sendUnsentReports(); + print('Existem relatórios de falhas não enviados.'); + } else { + // Não existem relatórios não enviados + print('Todos os relatórios de falhas foram enviados.'); } + } else { + print('Release mode'); + + await crashlyticsInstance.setCrashlyticsCollectionEnabled(true); + // if (crashlyticsInstance.isCrashlyticsCollectionEnabled) { + FlutterError.onError = await crashlyticsInstance.recordFlutterError; + print('Crashlytics enabled'); + // } } } diff --git a/lib/main.dart b/lib/main.dart index c9941df7..623ac049 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -181,7 +181,8 @@ class _AppState extends State { ); _setupFirebaseMessaging(); - if (TestUtil.isInTest) DeepLinkService().ensureInitialization(); + // if (TestUtil.isInTest) // + DeepLinkService().ensureInitialization(); } @override diff --git a/lib/pages/forgot_password_page/forgot_password_screen.dart b/lib/pages/forgot_password_page/forgot_password_screen.dart index bf737647..99d0914d 100644 --- a/lib/pages/forgot_password_page/forgot_password_screen.dart +++ b/lib/pages/forgot_password_page/forgot_password_screen.dart @@ -116,6 +116,7 @@ class _ForgotPasswordScreenState extends State }, ), title: Text( + key: ValueKey('ForgotPasswordText'), FFLocalizations.of(context).getVariableText( ptText: 'Recuperar Senha', enText: 'Recover Password', diff --git a/lib/pages/schedule_complete_visit_page/visit_history_page_widget.dart b/lib/pages/schedule_complete_visit_page/visit_history_page_widget.dart index bafb04bb..0c4ddaf1 100644 --- a/lib/pages/schedule_complete_visit_page/visit_history_page_widget.dart +++ b/lib/pages/schedule_complete_visit_page/visit_history_page_widget.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:hub/components/templates_components/card_item_template_component/card_item_template_component_widget.dart'; import 'package:hub/features/backend/index.dart'; @@ -196,6 +198,8 @@ class _VisitHistoryWidgetState extends State } Widget _item(BuildContext context, dynamic visitaWrapItem) { + log(DateTime.now().toString()); + log(visitaWrapItem['VAW_DTFIM'].toString()); return CardItemTemplateComponentWidget( imagePath: 'https://freaccess.com.br/freaccess/getImage.php?devUUID=$devUUID&userUUID=$userUUID&cliID=$cliUUID&atividade=getFoto&Documento=${visitaWrapItem['VTE_DOCUMENTO'] ?? ''}&tipo=E', @@ -218,10 +222,19 @@ class _VisitHistoryWidgetState extends State statusHashMap: [ if (Status.getStatus(visitaWrapItem['VAW_STATUS']) == StatusEnum.active) { - FFLocalizations.of(context).getVariableText( - ptText: 'Ativo', - enText: 'Active', - ): FlutterFlowTheme.of(context).warning, + if (visitaWrapItem['VAW_DTFIM'] != '' && + visitaWrapItem['VAW_DTFIM'] != null) + if (DateTime.now().isAfter( + DateTime.parse(visitaWrapItem['VAW_DTFIM'] as String))) + FFLocalizations.of(context).getVariableText( + ptText: 'Vencido', + enText: 'Expired', + ): FlutterFlowTheme.of(context).error + else + FFLocalizations.of(context).getVariableText( + ptText: 'Ativo', + enText: 'Active', + ): FlutterFlowTheme.of(context).warning, }, if (Status.getStatus(visitaWrapItem['VAW_STATUS']) == StatusEnum.finished) diff --git a/lib/shared/constants/index.dart b/lib/shared/constants/index.dart index e69de29b..8b137891 100644 --- a/lib/shared/constants/index.dart +++ b/lib/shared/constants/index.dart @@ -0,0 +1 @@ + diff --git a/pubspec.lock b/pubspec.lock index 056ad392..78885bc3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -114,10 +114,10 @@ packages: dependency: transitive description: name: barcode - sha256: ab180ce22c6555d77d45f0178a523669db67f95856e3378259ef2ffeb43e6003 + sha256: "7b6729c37e3b7f34233e2318d866e8c48ddb46c1f7ad01ff7bb2a8de1da2b9f4" url: "https://pub.dev" source: hosted - version: "2.2.8" + version: "2.2.9" barcode_widget: dependency: "direct main" description: @@ -146,50 +146,62 @@ packages: dependency: transitive description: name: build - sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" + version: "2.4.2" build_config: dependency: transitive description: name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" + version: "1.1.2" build_daemon: dependency: transitive description: name: build_daemon - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" + sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948" + sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.3" + version: "4.0.3" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" + sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.3" + version: "2.4.3" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" + sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" + sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" url: "https://pub.dev" source: hosted - version: "2.4.13" + version: "2.4.14" + version: "2.4.14" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" url: "https://pub.dev" source: hosted - version: "7.3.2" + version: "8.0.0" + version: "8.0.0" built_collection: dependency: transitive description: @@ -330,10 +342,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" + sha256: "7306ab8a2359a48d22310ad823521d723acfed60ee1f7e37388e8986853b6820" url: "https://pub.dev" source: hosted - version: "2.3.7" + version: "2.3.8" device_info_plus: dependency: "direct main" description: @@ -824,18 +836,20 @@ packages: dependency: transitive description: name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" + version: "2.1.3" go_router: dependency: "direct main" description: name: go_router - sha256: "7c2d40b59890a929824f30d442e810116caf5088482629c894b9e4478c67472d" + sha256: "9b736a9fa879d8ad6df7932cbdcc58237c173ab004ef90d8377923d7ad731eaa" url: "https://pub.dev" source: hosted - version: "14.6.3" + version: "14.7.2" google_fonts: dependency: "direct main" description: @@ -896,10 +910,12 @@ packages: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.1.2" + version: "4.1.2" image: dependency: "direct dev" description: @@ -952,10 +968,12 @@ packages: dependency: transitive description: name: image_picker_macos - sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" + sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" url: "https://pub.dev" source: hosted - version: "0.2.1+1" + version: "0.2.1+2" + version: "0.2.1+2" image_picker_platform_interface: dependency: "direct main" description: @@ -1021,10 +1039,10 @@ packages: dependency: "direct main" description: name: json_path - sha256: "7a06bbb1cfad390b20fb7a2ca5e67d9ba59633879c6d71142b80fbf61c3b66f6" + sha256: a3a06eb005f2e93d0df7f263cdf76bbd02c7602f5c4bed9be94fcca4c36be03e url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.5" json_serializable: dependency: "direct dev" description: @@ -1061,10 +1079,12 @@ packages: dependency: "direct dev" description: name: lints - sha256: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413" + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.1.1" + version: "5.1.1" local_auth: dependency: "direct main" description: @@ -1181,10 +1201,12 @@ packages: dependency: "direct dev" description: name: mockito - sha256: "6841eed20a7befac0ce07df8116c8b8233ed1f4486a7647c7fc5a02ae6163917" + sha256: f99d8d072e249f719a5531735d146d8cf04c580d93920b04de75bef6dfb2daf6 + sha256: f99d8d072e249f719a5531735d146d8cf04c580d93920b04de75bef6dfb2daf6 url: "https://pub.dev" source: hosted - version: "5.4.4" + version: "5.4.5" + version: "5.4.5" nested: dependency: transitive description: @@ -1221,10 +1243,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "739e0a5c3c4055152520fa321d0645ee98e932718b4c8efeeb51451968fe0790" + sha256: b15fad91c4d3d1f2b48c053dd41cb82da007c27407dc9ab5f9aa59881d0e39d4 url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.1.4" package_info_plus_platform_interface: dependency: transitive description: @@ -1461,10 +1483,12 @@ packages: dependency: transitive description: name: pubspec_parse - sha256: "81876843eb50dc2e1e5b151792c9a985c5ed2536914115ed04e9c8528f6647b0" + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.5.0" + version: "1.5.0" qr: dependency: transitive description: @@ -1533,18 +1557,20 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a + sha256: c59819dacc6669a1165d54d2735a9543f136f9b3cec94ca65cea6ab8dffc422e + sha256: c59819dacc6669a1165d54d2735a9543f136f9b3cec94ca65cea6ab8dffc422e url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.4.0" + version: "2.4.0" shared_preferences_android: dependency: "direct main" description: name: shared_preferences_android - sha256: "138b7bbbc7f59c56236e426c37afb8f78cbc57b094ac64c440e0bb90e380a4f5" + sha256: "650584dcc0a39856f369782874e562efd002a9c94aec032412c9eb81419cce1f" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.4" shared_preferences_foundation: dependency: "direct main" description: @@ -1589,10 +1615,12 @@ packages: dependency: transitive description: name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.2" + version: "1.4.2" shelf_packages_handler: dependency: transitive description: @@ -1874,10 +1902,12 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" + sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.4.0" + version: "2.4.0" url_launcher_windows: dependency: transitive description: @@ -1898,10 +1928,10 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" + sha256: "7ed22c21d7fdcc88dd6ba7860384af438cd220b251ad65dfc142ab722fabef61" url: "https://pub.dev" source: hosted - version: "1.1.15" + version: "1.1.16" vector_graphics_codec: dependency: transitive description: @@ -1962,10 +1992,12 @@ packages: dependency: transitive description: name: web_socket_channel - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" + version: "3.0.2" webdriver: dependency: transitive description: @@ -2010,10 +2042,10 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "4adc14ea9a770cc9e2c8f1ac734536bd40e82615bd0fa6b94be10982de656cc7" + sha256: "8e0593559bfecd35eb1757d6907ed6b995a41ef82607d6113df897c2805ce6be" url: "https://pub.dev" source: hosted - version: "3.17.0" + version: "3.18.0" win32: dependency: "direct overridden" description: @@ -2055,5 +2087,7 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.5.0 <4.0.0" - flutter: ">=3.24.0" + dart: ">=3.6.0 <4.0.0" + flutter: ">=3.27.0" + dart: ">=3.6.0 <4.0.0" + flutter: ">=3.27.0" diff --git a/scripts/test.ps1 b/scripts/test.ps1 new file mode 100644 index 00000000..bb742505 --- /dev/null +++ b/scripts/test.ps1 @@ -0,0 +1,3 @@ +flutter clean +flutter pub get +patrol test --target integration_test/app_test.dart --verbose \ No newline at end of file diff --git a/scripts/test.sh b/scripts/test.sh new file mode 100644 index 00000000..3ab1e543 --- /dev/null +++ b/scripts/test.sh @@ -0,0 +1,3 @@ +flutter clean +flutter pub get +patrol test --target integration_test/app_test.dart \ No newline at end of file