diff --git a/analyze_log.txt b/analyze_log.txt new file mode 100644 index 0000000..a95adb7 --- /dev/null +++ b/analyze_log.txt @@ -0,0 +1,31 @@ +Analyzing bully... + + info - Statements in an if should be enclosed in a block - lib\features\analysis\analysis_screen.dart:122:17 - curly_braces_in_flow_control_structures + info - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss - lib\features\analysis\analysis_screen.dart:650:51 - deprecated_member_use +warning - The declaration '_showAddShotHint' isn't referenced - lib\features\analysis\analysis_screen.dart:1083:8 - unused_element +warning - The declaration '_showAutoDetectDialog' isn't referenced - lib\features\analysis\analysis_screen.dart:1120:8 - unused_element +warning - Unused import: 'widgets/target_type_selector.dart' - lib\features\capture\capture_screen.dart:16:8 - unused_import + info - The private field _selectedType could be 'final' - lib\features\capture\capture_screen.dart:28:14 - prefer_final_fields + info - 'scale' is deprecated and shouldn't be used. Use scaleByVector3, scaleByVector4, or scaleByDouble instead - lib\features\crop\crop_screen.dart:141:25 - deprecated_member_use + info - The import of 'package:flutter/foundation.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart' - lib\features\statistics\statistics_screen.dart:8:8 - unnecessary_import +warning - The declaration '_buildLegendItem' isn't referenced - lib\features\statistics\statistics_screen.dart:309:10 - unused_element + info - Unnecessary use of string interpolation - lib\features\statistics\statistics_screen.dart:408:15 - unnecessary_string_interpolations + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:192:7 - avoid_print + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:239:7 - avoid_print + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:246:9 - avoid_print + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:278:9 - avoid_print + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:289:11 - avoid_print + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:292:11 - avoid_print + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:297:9 - avoid_print + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:332:7 - avoid_print + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:336:7 - avoid_print + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:683:7 - avoid_print + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:725:7 - avoid_print + info - Don't invoke 'print' in production code - lib\services\image_processing_service.dart:736:7 - avoid_print +warning - The declaration '_detectDarkSpotsAdaptive' isn't referenced - lib\services\image_processing_service.dart:780:15 - unused_element + info - Don't invoke 'print' in production code - lib\services\opencv_impact_detection_service.dart:104:5 - avoid_print + info - Don't invoke 'print' in production code - lib\services\opencv_impact_detection_service.dart:116:5 - avoid_print + info - Don't invoke 'print' in production code - lib\services\target_detection_service.dart:297:7 - avoid_print + info - Don't invoke 'print' in production code - lib\services\target_detection_service.dart:342:7 - avoid_print + +27 issues found. (ran in 1.9s) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 86b2724..f7b80a6 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,4 +1,6 @@ + + A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction + > Android resource linking failed + ERROR: C:\Users\streaper2\Documents\00 - projet\bully\build\cunning_document_scanner\intermediates\merged_manifest\debug\processDebugManifest\AndroidManifest.xml:9:5-65: AAPT: error: unexpected element found in . + + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights. +> Get more help at https://help.gradle.org. + +BUILD FAILED in 5s +Running Gradle task 'assembleDebug'... 5,4s +Gradle task assembleDebug failed with exit code 1 diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 0ae7f1a..bf8159c 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + NSCameraUsageDescription + This app needs camera access to scan documents CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/lib/features/analysis/analysis_screen.dart b/lib/features/analysis/analysis_screen.dart index e1d24dd..f5ace84 100644 --- a/lib/features/analysis/analysis_screen.dart +++ b/lib/features/analysis/analysis_screen.dart @@ -118,8 +118,9 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { actions: [ Consumer( builder: (context, provider, _) { - if (provider.state != AnalysisState.success) + if (provider.state != AnalysisState.success) { return const SizedBox.shrink(); + } return IconButton( icon: Icon(_isCalibrating ? Icons.check : Icons.tune), onPressed: () { @@ -647,7 +648,7 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { boxShadow: [ if (!_isAtBottom) BoxShadow( - color: Colors.black.withOpacity(0.2), + color: Colors.black.withValues(alpha: 0.2), blurRadius: 6, offset: const Offset(0, 3), ), @@ -1080,6 +1081,7 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { ); } + /* void _showAddShotHint(BuildContext context) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( @@ -1088,6 +1090,7 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { ), ); } + */ void _showClearConfirmation(BuildContext context, AnalysisProvider provider) { showDialog( @@ -1117,6 +1120,7 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { ); } + /* void _showAutoDetectDialog(BuildContext context, AnalysisProvider provider) { // Detection settings bool clearExisting = true; @@ -1315,6 +1319,7 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> { ), ); } + */ void _showCalibratedDetectionDialog( BuildContext context, diff --git a/lib/features/capture/capture_screen.dart b/lib/features/capture/capture_screen.dart index ee0cc45..889a707 100644 --- a/lib/features/capture/capture_screen.dart +++ b/lib/features/capture/capture_screen.dart @@ -6,13 +6,13 @@ library; import 'dart:io'; +import 'package:cunning_document_scanner/cunning_document_scanner.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import '../../core/constants/app_constants.dart'; import '../../core/theme/app_theme.dart'; import '../../data/models/target_type.dart'; import '../crop/crop_screen.dart'; -import 'widgets/target_type_selector.dart'; import 'widgets/image_source_button.dart'; class CaptureScreen extends StatefulWidget { @@ -31,9 +31,7 @@ class _CaptureScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Nouvelle Analyse'), - ), + appBar: AppBar(title: const Text('Nouvelle Analyse')), body: SingleChildScrollView( padding: const EdgeInsets.all(AppConstants.defaultPadding), child: Column( @@ -59,8 +57,8 @@ class _CaptureScreenState extends State { Expanded( child: ImageSourceButton( icon: Icons.camera_alt, - label: 'Camera', - onPressed: _isLoading ? null : () => _captureImage(ImageSource.camera), + label: 'Scanner', + onPressed: _isLoading ? null : _scanDocument, ), ), const SizedBox(width: 12), @@ -68,7 +66,9 @@ class _CaptureScreenState extends State { child: ImageSourceButton( icon: Icons.photo_library, label: 'Galerie', - onPressed: _isLoading ? null : () => _captureImage(ImageSource.gallery), + onPressed: _isLoading + ? null + : () => _captureImage(ImageSource.gallery), ), ), ], @@ -87,8 +87,7 @@ class _CaptureScreenState extends State { _buildImagePreview(), // Guide text - if (_selectedImagePath == null && !_isLoading) - _buildGuide(), + if (_selectedImagePath == null && !_isLoading) _buildGuide(), ], ), ), @@ -105,9 +104,9 @@ class _CaptureScreenState extends State { Widget _buildSectionTitle(String title) { return Text( title, - style: Theme.of(context).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.bold, - ), + style: Theme.of( + context, + ).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold), ); } @@ -160,7 +159,9 @@ class _CaptureScreenState extends State { Expanded( child: Text( 'Assurez-vous que la cible est bien centree et visible.', - style: TextStyle(color: AppTheme.warningColor.withValues(alpha: 0.8)), + style: TextStyle( + color: AppTheme.warningColor.withValues(alpha: 0.8), + ), ), ), ], @@ -175,20 +176,19 @@ class _CaptureScreenState extends State { padding: const EdgeInsets.all(AppConstants.defaultPadding), child: Column( children: [ - Icon( - Icons.help_outline, - size: 48, - color: Colors.grey[400], - ), + Icon(Icons.help_outline, size: 48, color: Colors.grey[400]), const SizedBox(height: 12), Text( 'Conseils pour une bonne analyse', - style: Theme.of(context).textTheme.titleSmall?.copyWith( - fontWeight: FontWeight.bold, - ), + style: Theme.of( + context, + ).textTheme.titleSmall?.copyWith(fontWeight: FontWeight.bold), ), const SizedBox(height: 12), - _buildGuideItem(Icons.crop_free, 'Cadrez la cible entiere dans l\'image'), + _buildGuideItem( + Icons.crop_free, + 'Cadrez la cible entiere dans l\'image', + ), _buildGuideItem(Icons.wb_sunny, 'Utilisez un bon eclairage'), _buildGuideItem(Icons.straighten, 'Prenez la photo de face'), _buildGuideItem(Icons.blur_off, 'Evitez les images floues'), @@ -211,6 +211,31 @@ class _CaptureScreenState extends State { ); } + Future _scanDocument() async { + setState(() => _isLoading = true); + + try { + final List? pictures = await CunningDocumentScanner.getPictures(); + + if (pictures != null && pictures.isNotEmpty) { + setState(() => _selectedImagePath = pictures.first); + } + } catch (e) { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Erreur lors du scan: $e'), + backgroundColor: AppTheme.errorColor, + ), + ); + } + } finally { + if (mounted) { + setState(() => _isLoading = false); + } + } + } + Future _captureImage(ImageSource source) async { setState(() => _isLoading = true); diff --git a/lib/features/crop/crop_screen.dart b/lib/features/crop/crop_screen.dart index b25995b..484a83d 100644 --- a/lib/features/crop/crop_screen.dart +++ b/lib/features/crop/crop_screen.dart @@ -119,7 +119,8 @@ class _CropScreenState extends State { _viewportSize = Size(constraints.maxWidth, constraints.maxHeight); // Taille du carré de crop (90% de la plus petite dimension) - _cropSize = math.min(constraints.maxWidth, constraints.maxHeight) * 0.85; + _cropSize = + math.min(constraints.maxWidth, constraints.maxHeight) * 0.85; // Calculer l'échelle initiale si pas encore fait if (_scale == 1.0 && _offset == Offset.zero) { @@ -138,7 +139,7 @@ class _CropScreenState extends State { child: Transform( transform: Matrix4.identity() ..setTranslationRaw(_offset.dx, _offset.dy, 0) - ..scale(_scale, _scale, 1.0), + ..scale(_scale, _scale), alignment: Alignment.center, child: Image.file( File(widget.imagePath), @@ -153,10 +154,7 @@ class _CropScreenState extends State { // Overlay de recadrage Positioned.fill( child: IgnorePointer( - child: CropOverlay( - cropSize: _cropSize, - showGrid: true, - ), + child: CropOverlay(cropSize: _cropSize, showGrid: true), ), ), diff --git a/lib/features/statistics/statistics_screen.dart b/lib/features/statistics/statistics_screen.dart index f020461..f77edc1 100644 --- a/lib/features/statistics/statistics_screen.dart +++ b/lib/features/statistics/statistics_screen.dart @@ -5,7 +5,6 @@ /// écart-type et distribution régionale des tirs. library; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../core/constants/app_constants.dart'; @@ -69,28 +68,38 @@ class _StatisticsScreenState extends State { } void _calculateStats() { - debugPrint('Calculating stats for ${_allSessions.length} sessions, period: $_selectedPeriod'); + debugPrint( + 'Calculating stats for ${_allSessions.length} sessions, period: $_selectedPeriod', + ); for (final session in _allSessions) { - debugPrint(' Session: ${session.id}, shots: ${session.shots.length}, date: ${session.createdAt}'); + debugPrint( + ' Session: ${session.id}, shots: ${session.shots.length}, date: ${session.createdAt}', + ); } _statistics = _statisticsService.calculateStatistics( _allSessions, period: _selectedPeriod, ); - debugPrint('Statistics result: totalShots=${_statistics?.totalShots}, totalScore=${_statistics?.totalScore}'); + debugPrint( + 'Statistics result: totalShots=${_statistics?.totalShots}, totalScore=${_statistics?.totalScore}', + ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text(widget.singleSession != null ? 'Statistiques Session' : 'Statistiques'), + title: Text( + widget.singleSession != null + ? 'Statistiques Session' + : 'Statistiques', + ), ), body: _isLoading ? const Center(child: CircularProgressIndicator()) : _statistics == null || _statistics!.totalShots == 0 - ? _buildEmptyState() - : _buildStatistics(), + ? _buildEmptyState() + : _buildStatistics(), ); } @@ -101,7 +110,11 @@ class _StatisticsScreenState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(Icons.analytics_outlined, size: 64, color: Colors.grey.shade400), + Icon( + Icons.analytics_outlined, + size: 64, + color: Colors.grey.shade400, + ), const SizedBox(height: 16), Text( 'Aucune donnee disponible', @@ -292,11 +305,17 @@ class _StatisticsScreenState extends State { children: [ Padding( padding: const EdgeInsets.only(left: 16), - child: Text('Peu', style: TextStyle(fontSize: 12, color: Colors.grey.shade600)), + child: Text( + 'Peu', + style: TextStyle(fontSize: 12, color: Colors.grey.shade600), + ), ), Padding( padding: const EdgeInsets.only(right: 16), - child: Text('Beaucoup', style: TextStyle(fontSize: 12, color: Colors.grey.shade600)), + child: Text( + 'Beaucoup', + style: TextStyle(fontSize: 12, color: Colors.grey.shade600), + ), ), ], ), @@ -306,28 +325,6 @@ class _StatisticsScreenState extends State { ); } - Widget _buildLegendItem(Color color, String label) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 16, - height: 16, - decoration: BoxDecoration( - color: color, - borderRadius: BorderRadius.circular(2), - border: Border.all(color: Colors.grey.shade400), - ), - ), - const SizedBox(width: 4), - Text(label, style: const TextStyle(fontSize: 10)), - ], - ), - ); - } - Widget _buildPrecisionSection() { final precision = _statistics!.precision; @@ -339,7 +336,10 @@ class _StatisticsScreenState extends State { children: [ Row( children: [ - const Icon(Icons.center_focus_strong, color: AppTheme.successColor), + const Icon( + Icons.center_focus_strong, + color: AppTheme.successColor, + ), const SizedBox(width: 8), const Text( 'Precision', @@ -368,12 +368,18 @@ class _StatisticsScreenState extends State { ], ), const Divider(height: 32), - _buildStatRow('Distance moyenne du centre', - '${(precision.avgDistanceFromCenter * 100).toStringAsFixed(1)}%'), - _buildStatRow('Diametre de groupement', - '${(precision.groupingDiameter * 100).toStringAsFixed(1)}%'), - _buildStatRow('Score moyen', - _statistics!.avgScore.toStringAsFixed(2)), + _buildStatRow( + 'Distance moyenne du centre', + '${(precision.avgDistanceFromCenter * 100).toStringAsFixed(1)}%', + ), + _buildStatRow( + 'Diametre de groupement', + '${(precision.groupingDiameter * 100).toStringAsFixed(1)}%', + ), + _buildStatRow( + 'Score moyen', + _statistics!.avgScore.toStringAsFixed(2), + ), _buildStatRow('Meilleur score', '${_statistics!.maxScore}'), _buildStatRow('Plus bas score', '${_statistics!.minScore}'), ], @@ -386,8 +392,8 @@ class _StatisticsScreenState extends State { final color = value > 70 ? AppTheme.successColor : value > 40 - ? AppTheme.warningColor - : AppTheme.errorColor; + ? AppTheme.warningColor + : AppTheme.errorColor; return Column( children: [ @@ -405,7 +411,7 @@ class _StatisticsScreenState extends State { ), ), Text( - '${value.toStringAsFixed(0)}', + value.toStringAsFixed(0), style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, @@ -415,10 +421,7 @@ class _StatisticsScreenState extends State { ], ), const SizedBox(height: 8), - Text( - title, - style: const TextStyle(fontWeight: FontWeight.bold), - ), + Text(title, style: const TextStyle(fontWeight: FontWeight.bold)), Text( subtitle, style: TextStyle(fontSize: 10, color: Colors.grey.shade600), @@ -439,7 +442,10 @@ class _StatisticsScreenState extends State { children: [ Row( children: [ - const Icon(Icons.stacked_line_chart, color: AppTheme.warningColor), + const Icon( + Icons.stacked_line_chart, + color: AppTheme.warningColor, + ), const SizedBox(width: 8), const Text( 'Ecart Type', @@ -453,21 +459,32 @@ class _StatisticsScreenState extends State { style: TextStyle(color: Colors.grey.shade600, fontSize: 12), ), const SizedBox(height: 16), - _buildStatRow('Ecart type X (horizontal)', - '${(stdDev.stdDevX * 100).toStringAsFixed(2)}%'), - _buildStatRow('Ecart type Y (vertical)', - '${(stdDev.stdDevY * 100).toStringAsFixed(2)}%'), - _buildStatRow('Ecart type radial', - '${(stdDev.stdDevRadial * 100).toStringAsFixed(2)}%'), - _buildStatRow('Ecart type score', - stdDev.stdDevScore.toStringAsFixed(2)), + _buildStatRow( + 'Ecart type X (horizontal)', + '${(stdDev.stdDevX * 100).toStringAsFixed(2)}%', + ), + _buildStatRow( + 'Ecart type Y (vertical)', + '${(stdDev.stdDevY * 100).toStringAsFixed(2)}%', + ), + _buildStatRow( + 'Ecart type radial', + '${(stdDev.stdDevRadial * 100).toStringAsFixed(2)}%', + ), + _buildStatRow( + 'Ecart type score', + stdDev.stdDevScore.toStringAsFixed(2), + ), const Divider(height: 24), - _buildStatRow('Position moyenne X', - '${(stdDev.meanX * 100).toStringAsFixed(1)}%'), - _buildStatRow('Position moyenne Y', - '${(stdDev.meanY * 100).toStringAsFixed(1)}%'), - _buildStatRow('Score moyen', - stdDev.meanScore.toStringAsFixed(2)), + _buildStatRow( + 'Position moyenne X', + '${(stdDev.meanX * 100).toStringAsFixed(1)}%', + ), + _buildStatRow( + 'Position moyenne Y', + '${(stdDev.meanY * 100).toStringAsFixed(1)}%', + ), + _buildStatRow('Score moyen', stdDev.meanScore.toStringAsFixed(2)), ], ), ), @@ -504,7 +521,10 @@ class _StatisticsScreenState extends State { ), child: Row( children: [ - const Icon(Icons.compass_calibration, color: AppTheme.primaryColor), + const Icon( + Icons.compass_calibration, + color: AppTheme.primaryColor, + ), const SizedBox(width: 12), Expanded( child: Column( @@ -536,7 +556,10 @@ class _StatisticsScreenState extends State { ), child: Row( children: [ - const Icon(Icons.warning_amber, color: AppTheme.warningColor), + const Icon( + Icons.warning_amber, + color: AppTheme.warningColor, + ), const SizedBox(width: 12), Expanded( child: Column( @@ -556,7 +579,10 @@ class _StatisticsScreenState extends State { const SizedBox(height: 16), // Sector distribution - const Text('Repartition par secteur:', style: TextStyle(fontWeight: FontWeight.bold)), + const Text( + 'Repartition par secteur:', + style: TextStyle(fontWeight: FontWeight.bold), + ), const SizedBox(height: 8), Wrap( spacing: 8, @@ -572,7 +598,10 @@ class _StatisticsScreenState extends State { const SizedBox(height: 16), // Quadrant distribution - const Text('Repartition par quadrant:', style: TextStyle(fontWeight: FontWeight.bold)), + const Text( + 'Repartition par quadrant:', + style: TextStyle(fontWeight: FontWeight.bold), + ), const SizedBox(height: 8), _buildQuadrantGrid(regional.quadrantDistribution), ], @@ -598,7 +627,9 @@ class _StatisticsScreenState extends State { return Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), decoration: BoxDecoration( - color: count > 0 ? AppTheme.primaryColor.withValues(alpha: 0.1) : Colors.grey.shade100, + color: count > 0 + ? AppTheme.primaryColor.withValues(alpha: 0.1) + : Colors.grey.shade100, borderRadius: BorderRadius.circular(16), border: Border.all( color: count > 0 ? AppTheme.primaryColor : Colors.grey.shade300, @@ -649,10 +680,7 @@ class _StatisticsScreenState extends State { children: [ Text( '$count', - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 24, - ), + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 24), ), Text( '${percentage.toStringAsFixed(0)}%', @@ -712,10 +740,7 @@ class _StatCard extends StatelessWidget { color: color, ), ), - Text( - title, - style: TextStyle(color: Colors.grey.shade600), - ), + Text(title, style: TextStyle(color: Colors.grey.shade600)), ], ), ), diff --git a/pubspec.lock b/pubspec.lock index 62ca582..94378b0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -73,6 +73,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.7" + cunning_document_scanner: + dependency: "direct main" + description: + name: cunning_document_scanner + sha256: de0c0705799f7d5cc9b82b67bfb8b3e965a1fbff4afbd70ea10cd1dad4f3a98c + url: "https://pub.dev" + source: hosted + version: "1.4.0" cupertino_icons: dependency: "direct main" description: @@ -448,6 +456,54 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + permission_handler: + dependency: transitive + description: + name: permission_handler + sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 + url: "https://pub.dev" + source: hosted + version: "12.0.1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" + url: "https://pub.dev" + source: hosted + version: "13.0.1" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 + url: "https://pub.dev" + source: hosted + version: "9.4.7" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" petitparser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 7150431..1aa4e1e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -40,6 +40,7 @@ dependencies: # Image capture from camera/gallery image_picker: ^1.0.7 + cunning_document_scanner: ^1.4.0 # Local database for history sqflite: ^2.3.2 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 77ab7a0..2c256bd 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -7,8 +7,11 @@ #include "generated_plugin_registrant.h" #include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { FileSelectorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("FileSelectorWindows")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index a423a02..230eabf 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST file_selector_windows + permission_handler_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST