refactor: photo process
parent
ef3d131b4d
commit
1ce2765172
Binary file not shown.
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 147 KiB |
Binary file not shown.
|
|
@ -7,6 +7,11 @@ PODS:
|
||||||
- device_info_plus (0.0.1):
|
- device_info_plus (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- Flutter (1.0.0)
|
- Flutter (1.0.0)
|
||||||
|
- flutter_image_compress_common (1.0.0):
|
||||||
|
- Flutter
|
||||||
|
- Mantle
|
||||||
|
- SDWebImage
|
||||||
|
- SDWebImageWebPCoder
|
||||||
- fluttertoast (0.0.2):
|
- fluttertoast (0.0.2):
|
||||||
- Flutter
|
- Flutter
|
||||||
- Toast
|
- Toast
|
||||||
|
|
@ -17,6 +22,18 @@ PODS:
|
||||||
- Flutter
|
- Flutter
|
||||||
- image_picker_ios (0.0.1):
|
- image_picker_ios (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- libwebp (1.2.4):
|
||||||
|
- libwebp/demux (= 1.2.4)
|
||||||
|
- libwebp/mux (= 1.2.4)
|
||||||
|
- libwebp/webp (= 1.2.4)
|
||||||
|
- libwebp/demux (1.2.4):
|
||||||
|
- libwebp/webp
|
||||||
|
- libwebp/mux (1.2.4):
|
||||||
|
- libwebp/demux
|
||||||
|
- libwebp/webp (1.2.4)
|
||||||
|
- Mantle (2.2.0):
|
||||||
|
- Mantle/extobjc (= 2.2.0)
|
||||||
|
- Mantle/extobjc (2.2.0)
|
||||||
- ObjectBox (1.8.1)
|
- ObjectBox (1.8.1)
|
||||||
- objectbox_flutter_libs (0.0.1):
|
- objectbox_flutter_libs (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
|
@ -26,9 +43,13 @@ PODS:
|
||||||
- path_provider_foundation (0.0.1):
|
- path_provider_foundation (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- permission_handler_apple (9.0.4):
|
|
||||||
- Flutter
|
|
||||||
- ReachabilitySwift (5.0.0)
|
- ReachabilitySwift (5.0.0)
|
||||||
|
- SDWebImage (5.16.0):
|
||||||
|
- SDWebImage/Core (= 5.16.0)
|
||||||
|
- SDWebImage/Core (5.16.0)
|
||||||
|
- SDWebImageWebPCoder (0.11.0):
|
||||||
|
- libwebp (~> 1.0)
|
||||||
|
- SDWebImage/Core (~> 5.15)
|
||||||
- shared_preferences_foundation (0.0.1):
|
- shared_preferences_foundation (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
|
|
@ -46,13 +67,13 @@ DEPENDENCIES:
|
||||||
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
|
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
|
||||||
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
||||||
- Flutter (from `Flutter`)
|
- Flutter (from `Flutter`)
|
||||||
|
- flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`)
|
||||||
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
|
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
|
||||||
- image_gallery_saver (from `.symlinks/plugins/image_gallery_saver/ios`)
|
- image_gallery_saver (from `.symlinks/plugins/image_gallery_saver/ios`)
|
||||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||||
- objectbox_flutter_libs (from `.symlinks/plugins/objectbox_flutter_libs/ios`)
|
- objectbox_flutter_libs (from `.symlinks/plugins/objectbox_flutter_libs/ios`)
|
||||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`)
|
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`)
|
||||||
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
|
||||||
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
|
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
|
||||||
- sqflite (from `.symlinks/plugins/sqflite/ios`)
|
- sqflite (from `.symlinks/plugins/sqflite/ios`)
|
||||||
- wakelock (from `.symlinks/plugins/wakelock/ios`)
|
- wakelock (from `.symlinks/plugins/wakelock/ios`)
|
||||||
|
|
@ -61,8 +82,12 @@ DEPENDENCIES:
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
trunk:
|
trunk:
|
||||||
- FMDB
|
- FMDB
|
||||||
|
- libwebp
|
||||||
|
- Mantle
|
||||||
- ObjectBox
|
- ObjectBox
|
||||||
- ReachabilitySwift
|
- ReachabilitySwift
|
||||||
|
- SDWebImage
|
||||||
|
- SDWebImageWebPCoder
|
||||||
- Toast
|
- Toast
|
||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
|
|
@ -74,6 +99,8 @@ EXTERNAL SOURCES:
|
||||||
:path: ".symlinks/plugins/device_info_plus/ios"
|
:path: ".symlinks/plugins/device_info_plus/ios"
|
||||||
Flutter:
|
Flutter:
|
||||||
:path: Flutter
|
:path: Flutter
|
||||||
|
flutter_image_compress_common:
|
||||||
|
:path: ".symlinks/plugins/flutter_image_compress_common/ios"
|
||||||
fluttertoast:
|
fluttertoast:
|
||||||
:path: ".symlinks/plugins/fluttertoast/ios"
|
:path: ".symlinks/plugins/fluttertoast/ios"
|
||||||
image_gallery_saver:
|
image_gallery_saver:
|
||||||
|
|
@ -86,8 +113,6 @@ EXTERNAL SOURCES:
|
||||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||||
path_provider_foundation:
|
path_provider_foundation:
|
||||||
:path: ".symlinks/plugins/path_provider_foundation/ios"
|
:path: ".symlinks/plugins/path_provider_foundation/ios"
|
||||||
permission_handler_apple:
|
|
||||||
:path: ".symlinks/plugins/permission_handler_apple/ios"
|
|
||||||
shared_preferences_foundation:
|
shared_preferences_foundation:
|
||||||
:path: ".symlinks/plugins/shared_preferences_foundation/ios"
|
:path: ".symlinks/plugins/shared_preferences_foundation/ios"
|
||||||
sqflite:
|
sqflite:
|
||||||
|
|
@ -102,16 +127,20 @@ SPEC CHECKSUMS:
|
||||||
connectivity_plus: 07c49e96d7fc92bc9920617b83238c4d178b446a
|
connectivity_plus: 07c49e96d7fc92bc9920617b83238c4d178b446a
|
||||||
device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed
|
device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed
|
||||||
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
|
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
|
||||||
|
flutter_image_compress_common: ec1d45c362c9d30a3f6a0426c297f47c52007e3e
|
||||||
fluttertoast: eb263d302cc92e04176c053d2385237e9f43fad0
|
fluttertoast: eb263d302cc92e04176c053d2385237e9f43fad0
|
||||||
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
||||||
image_gallery_saver: 6eb11e5a866e9ac2c8a98c74ef99a04fc62878b2
|
image_gallery_saver: 6eb11e5a866e9ac2c8a98c74ef99a04fc62878b2
|
||||||
image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5
|
image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5
|
||||||
|
libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef
|
||||||
|
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
|
||||||
ObjectBox: a7900d5335218cd437cbc080b7ccc38a5211f7b4
|
ObjectBox: a7900d5335218cd437cbc080b7ccc38a5211f7b4
|
||||||
objectbox_flutter_libs: 61d74196d924fbc773da5f5757d1e9fab7b3cc78
|
objectbox_flutter_libs: 61d74196d924fbc773da5f5757d1e9fab7b3cc78
|
||||||
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
|
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
|
||||||
path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9
|
path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9
|
||||||
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
|
|
||||||
ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
|
ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
|
||||||
|
SDWebImage: 2aea163b50bfcb569a2726b6a754c54a4506fcf6
|
||||||
|
SDWebImageWebPCoder: 295a6573c512f54ad2dd58098e64e17dcf008499
|
||||||
shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472
|
shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472
|
||||||
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
|
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
|
||||||
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
|
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,9 @@ import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:camera/camera.dart';
|
import 'package:camera/camera.dart';
|
||||||
|
import 'package:audioplayers/audioplayers.dart';
|
||||||
|
import 'package:flutter_image_compress/flutter_image_compress.dart';
|
||||||
|
import 'package:mobdr/service/shared_prefs.dart';
|
||||||
|
|
||||||
class CustomCameraPreview extends StatefulWidget {
|
class CustomCameraPreview extends StatefulWidget {
|
||||||
final List<File> photoFiles;
|
final List<File> photoFiles;
|
||||||
|
|
@ -16,6 +19,9 @@ class CustomCameraPreview extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _CustomCameraPreviewState extends State<CustomCameraPreview> {
|
class _CustomCameraPreviewState extends State<CustomCameraPreview> {
|
||||||
|
final AudioPlayer _audioPlayer = AudioPlayer();
|
||||||
|
bool isTakingPhoto = false;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Stack(
|
return Stack(
|
||||||
|
|
@ -23,80 +29,88 @@ class _CustomCameraPreviewState extends State<CustomCameraPreview> {
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Positioned.fill(
|
Positioned.fill(
|
||||||
child: AspectRatio(
|
child: AspectRatio(
|
||||||
aspectRatio: widget.cameraController.value.aspectRatio,
|
aspectRatio: widget.cameraController.value.aspectRatio,
|
||||||
child: CameraPreview(widget.cameraController)),
|
child: CameraPreview(widget.cameraController),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
Positioned(
|
Positioned(
|
||||||
bottom: 5,
|
bottom: 5,
|
||||||
child: FloatingActionButton(
|
child: FloatingActionButton(
|
||||||
heroTag: "camera",
|
heroTag: "camera",
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
//you can give limit that's user can take how many photo
|
if (widget.photoFiles.length != 10 && !isTakingPhoto) {
|
||||||
if (widget.photoFiles.length != 10) {
|
setState(() {
|
||||||
//take a photo
|
isTakingPhoto = true;
|
||||||
var videoFile = await widget.cameraController.takePicture();
|
});
|
||||||
File file = File(videoFile.path);
|
|
||||||
//add photo into files list
|
try {
|
||||||
widget.photoFiles.add(file);
|
var dirCacheXFile =
|
||||||
|
await widget.cameraController.takePicture();
|
||||||
|
|
||||||
|
/// move jpg file to photo directory
|
||||||
|
final dirPhotoFile =
|
||||||
|
await moveFromCacheToPhotosDir(File(dirCacheXFile.path));
|
||||||
|
|
||||||
|
widget.photoFiles.add(dirPhotoFile);
|
||||||
|
|
||||||
|
if (SharedPrefs().photoSound) {
|
||||||
|
await _audioPlayer.setVolume((0.5));
|
||||||
|
await _audioPlayer.play(
|
||||||
|
AssetSource('sounds/camera-shutter-click.mp3'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
setState(() {
|
||||||
|
isTakingPhoto = false;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
child: const Icon(
|
},
|
||||||
Icons.camera_alt,
|
child: const Icon(
|
||||||
color: Colors.black,
|
Icons.camera_alt,
|
||||||
),
|
color: Colors.black,
|
||||||
)),
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
_confirmButton(),
|
_confirmButton(),
|
||||||
_rejectButton(),
|
_rejectButton(),
|
||||||
Positioned(
|
Positioned(
|
||||||
bottom: 80,
|
bottom: 80,
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
height: 80,
|
height: 80,
|
||||||
width: MediaQuery.of(context).size.width,
|
width: MediaQuery.of(context).size.width,
|
||||||
child: ListView.builder(
|
child: ListView.builder(
|
||||||
scrollDirection: Axis.horizontal,
|
scrollDirection: Axis.horizontal,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
return Container(
|
return GestureDetector(
|
||||||
|
onVerticalDragEnd: (details) {
|
||||||
|
if (details.primaryVelocity! < 0) {
|
||||||
|
setState(() {
|
||||||
|
widget.photoFiles.removeAt(index);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
margin: const EdgeInsets.symmetric(horizontal: 2.0),
|
margin: const EdgeInsets.symmetric(horizontal: 2.0),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
border: Border.all(width: 2.0, color: Colors.white)),
|
border: Border.all(width: 2.0, color: Colors.white),
|
||||||
|
),
|
||||||
child: index >= widget.photoFiles.length
|
child: index >= widget.photoFiles.length
|
||||||
? Container(color: Colors.white, width: 100)
|
? Container(color: Colors.white, width: 100)
|
||||||
: Stack(
|
: Image.file(
|
||||||
children: [
|
widget.photoFiles[index],
|
||||||
Image.file(
|
fit: BoxFit.cover,
|
||||||
widget.photoFiles[index],
|
height: 100,
|
||||||
fit: BoxFit.cover,
|
width: 100,
|
||||||
height: 100,
|
|
||||||
width: 100,
|
|
||||||
),
|
|
||||||
Positioned(
|
|
||||||
top: 2.5,
|
|
||||||
right: 2.5,
|
|
||||||
child: Container(
|
|
||||||
height: 20,
|
|
||||||
width: 20,
|
|
||||||
decoration: const BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
shape: BoxShape.circle),
|
|
||||||
child: GestureDetector(
|
|
||||||
onTap: () {
|
|
||||||
setState(() {
|
|
||||||
widget.photoFiles.removeAt(index);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
child: const Icon(Icons.close,
|
|
||||||
size: 12, color: Colors.black),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
);
|
),
|
||||||
},
|
);
|
||||||
itemCount: 10,
|
},
|
||||||
),
|
itemCount: widget.photoFiles.length,
|
||||||
)),
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -108,9 +122,11 @@ class _CustomCameraPreviewState extends State<CustomCameraPreview> {
|
||||||
child: FloatingActionButton(
|
child: FloatingActionButton(
|
||||||
heroTag: "close",
|
heroTag: "close",
|
||||||
backgroundColor: Colors.black,
|
backgroundColor: Colors.black,
|
||||||
onPressed: () {
|
onPressed: !isTakingPhoto
|
||||||
Navigator.pop(context, false);
|
? () {
|
||||||
},
|
Navigator.pop(context, false);
|
||||||
|
}
|
||||||
|
: null,
|
||||||
child: const Icon(
|
child: const Icon(
|
||||||
Icons.close,
|
Icons.close,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
|
|
@ -121,18 +137,62 @@ class _CustomCameraPreviewState extends State<CustomCameraPreview> {
|
||||||
|
|
||||||
Positioned _confirmButton() {
|
Positioned _confirmButton() {
|
||||||
return Positioned(
|
return Positioned(
|
||||||
bottom: 5,
|
bottom: 5,
|
||||||
right: 5,
|
right: 5,
|
||||||
child: FloatingActionButton(
|
child: FloatingActionButton(
|
||||||
heroTag: "confirm",
|
heroTag: "confirm",
|
||||||
backgroundColor: Colors.black,
|
backgroundColor: Colors.black,
|
||||||
onPressed: () {
|
onPressed: !isTakingPhoto
|
||||||
Navigator.pop(context, true);
|
? () {
|
||||||
},
|
Navigator.pop(context, true);
|
||||||
child: const Icon(
|
}
|
||||||
Icons.check,
|
: null,
|
||||||
color: Colors.white,
|
child: const Icon(
|
||||||
),
|
Icons.check,
|
||||||
));
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Moves a temporary file to the photos directory in the app's document directory.
|
||||||
|
///
|
||||||
|
/// Returns a `File` object for the new file in the photos directory.
|
||||||
|
///
|
||||||
|
/// Parameters:
|
||||||
|
/// * `tempFile`: The temporary `File` object to move to the photos directory.
|
||||||
|
///
|
||||||
|
/// Throws a `FileSystemException` if there is an error renaming the file.
|
||||||
|
Future<File> moveFromCacheToPhotosDir(File tempFile) async {
|
||||||
|
// Set the new file path with the original file name
|
||||||
|
final String newPath =
|
||||||
|
'${SharedPrefs().photosDir}/${tempFile.path.split('/').last}';
|
||||||
|
|
||||||
|
// Create a new File object with the new path
|
||||||
|
final newFile = File(newPath);
|
||||||
|
|
||||||
|
final bool photoResizing = SharedPrefs().photoResizing;
|
||||||
|
final int? minWidth = photoResizing ? 1024 : null;
|
||||||
|
final int? minHeight = photoResizing ? 768 : null;
|
||||||
|
|
||||||
|
final fixedImageBytes = await FlutterImageCompress.compressWithFile(
|
||||||
|
tempFile.path,
|
||||||
|
minWidth: minWidth!,
|
||||||
|
minHeight: minHeight!,
|
||||||
|
rotate: 0,
|
||||||
|
quality: 100,
|
||||||
|
keepExif: false,
|
||||||
|
autoCorrectionAngle: true,
|
||||||
|
format: CompressFormat.jpeg,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Write the compressed image bytes to the new file
|
||||||
|
await newFile.writeAsBytes(fixedImageBytes!);
|
||||||
|
|
||||||
|
// deleting the temporary file
|
||||||
|
await tempFile.delete();
|
||||||
|
|
||||||
|
// Create and return a new File object for the new file
|
||||||
|
return File(newPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -156,7 +156,7 @@ class SharedPrefs {
|
||||||
|
|
||||||
/// get/set photo quality
|
/// get/set photo quality
|
||||||
String get photoQuality =>
|
String get photoQuality =>
|
||||||
_sharedPrefs.getString('key_photo_quality') ?? "Defaut";
|
_sharedPrefs.getString('key_photo_quality') ?? "veryHigh";
|
||||||
|
|
||||||
set photoQuality(String value) {
|
set photoQuality(String value) {
|
||||||
_sharedPrefs.setString('key_photo_quality', value);
|
_sharedPrefs.setString('key_photo_quality', value);
|
||||||
|
|
|
||||||
|
|
@ -208,7 +208,13 @@ class _SettingsPageState extends State<SettingsPage> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _showQualityPopup() {
|
Widget _showQualityPopup() {
|
||||||
List<String> qualityOptions = ['Defaut', 'High', 'Medium', 'Low'];
|
List<String> qualityOptions = [
|
||||||
|
'medium',
|
||||||
|
'high',
|
||||||
|
'veryHigh',
|
||||||
|
'ultraHigh',
|
||||||
|
'max'
|
||||||
|
];
|
||||||
|
|
||||||
return StatefulBuilder(
|
return StatefulBuilder(
|
||||||
builder: (BuildContext context, StateSetter mystate) {
|
builder: (BuildContext context, StateSetter mystate) {
|
||||||
|
|
@ -239,27 +245,18 @@ class _SettingsPageState extends State<SettingsPage> {
|
||||||
itemCount: qualityOptions.length,
|
itemCount: qualityOptions.length,
|
||||||
itemBuilder: (BuildContext context, int index) {
|
itemBuilder: (BuildContext context, int index) {
|
||||||
String qualityOption = qualityOptions[index];
|
String qualityOption = qualityOptions[index];
|
||||||
return GestureDetector(
|
return RadioListTile<String>(
|
||||||
behavior: HitTestBehavior.translucent,
|
dense: true, // Ajouter cette ligne
|
||||||
onTap: () {
|
title: Text(qualityOption),
|
||||||
|
value: qualityOption,
|
||||||
|
groupValue: _photoQuality,
|
||||||
|
onChanged: (String? value) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_photoQuality = qualityOption;
|
_photoQuality = value!;
|
||||||
SharedPrefs().photoQuality = qualityOption;
|
SharedPrefs().photoQuality = value;
|
||||||
});
|
});
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
child: Container(
|
|
||||||
margin: EdgeInsets.only(top: 16),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
qualityOption,
|
|
||||||
style: GlobalStyle.courierType,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
@ -302,12 +299,17 @@ class _SettingsPageState extends State<SettingsPage> {
|
||||||
itemCount: languageOptions.length,
|
itemCount: languageOptions.length,
|
||||||
itemBuilder: (BuildContext context, int index) {
|
itemBuilder: (BuildContext context, int index) {
|
||||||
String languageOption = languageOptions[index];
|
String languageOption = languageOptions[index];
|
||||||
return GestureDetector(
|
return RadioListTile<String>(
|
||||||
behavior: HitTestBehavior.translucent,
|
title: Text(
|
||||||
onTap: () {
|
languageOption,
|
||||||
|
style: GlobalStyle.courierType,
|
||||||
|
),
|
||||||
|
value: languageOption,
|
||||||
|
groupValue: _language,
|
||||||
|
onChanged: (String? value) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_language = languageOption;
|
_language = value!;
|
||||||
switch (languageOption) {
|
switch (value) {
|
||||||
case 'English':
|
case 'English':
|
||||||
SharedPrefs().langage = 'en';
|
SharedPrefs().langage = 'en';
|
||||||
break;
|
break;
|
||||||
|
|
@ -315,25 +317,12 @@ class _SettingsPageState extends State<SettingsPage> {
|
||||||
SharedPrefs().langage = 'fr';
|
SharedPrefs().langage = 'fr';
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// TODO a vérifier
|
|
||||||
_language = 'French';
|
_language = 'French';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
child: Container(
|
|
||||||
margin: EdgeInsets.only(top: 16),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
languageOption,
|
|
||||||
style: GlobalStyle.courierType,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,6 @@ import 'package:mobdr/config/constant.dart';
|
||||||
import 'package:mobdr/events.dart';
|
import 'package:mobdr/events.dart';
|
||||||
import 'package:mobdr/service/plausible.dart';
|
import 'package:mobdr/service/plausible.dart';
|
||||||
import 'package:mobdr/service/logger_util.dart';
|
import 'package:mobdr/service/logger_util.dart';
|
||||||
import 'package:mobdr/service/plausible.dart';
|
|
||||||
|
|
||||||
class HomePage extends StatefulWidget {
|
class HomePage extends StatefulWidget {
|
||||||
@override
|
@override
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,6 @@ import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:mobdr/config/constant.dart';
|
import 'package:mobdr/config/constant.dart';
|
||||||
|
|
||||||
//TODO Rechercher toutes les utilisations
|
|
||||||
|
|
||||||
class ReusableWidget {
|
class ReusableWidget {
|
||||||
PreferredSizeWidget bottomAppBar() {
|
PreferredSizeWidget bottomAppBar() {
|
||||||
return PreferredSize(
|
return PreferredSize(
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:camera/camera.dart';
|
import 'package:camera/camera.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:mobdr/core/components/custom_camera_preview.dart';
|
import 'package:mobdr/core/components/custom_camera_preview.dart';
|
||||||
|
import 'package:mobdr/service/shared_prefs.dart';
|
||||||
|
|
||||||
class CameraPage extends StatefulWidget {
|
class CameraPage extends StatefulWidget {
|
||||||
const CameraPage({Key? key, required this.photoFiles}) : super(key: key);
|
const CameraPage({Key? key, required this.photoFiles}) : super(key: key);
|
||||||
|
|
@ -53,10 +54,35 @@ class _CameraPageState extends State<CameraPage> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future _initCameraController(CameraDescription cameraDescription) async {
|
Future _initCameraController(CameraDescription cameraDescription) async {
|
||||||
|
ResolutionPreset getResolutionPresetFromPhotoQuality(String photoQuality) {
|
||||||
|
switch (photoQuality) {
|
||||||
|
case 'low':
|
||||||
|
return ResolutionPreset.low;
|
||||||
|
case 'medium':
|
||||||
|
return ResolutionPreset.medium;
|
||||||
|
case 'high':
|
||||||
|
return ResolutionPreset.high;
|
||||||
|
case 'veryHigh':
|
||||||
|
return ResolutionPreset.veryHigh;
|
||||||
|
case 'ultraHigh':
|
||||||
|
return ResolutionPreset.ultraHigh;
|
||||||
|
case 'max':
|
||||||
|
return ResolutionPreset.max;
|
||||||
|
default:
|
||||||
|
return ResolutionPreset
|
||||||
|
.veryHigh; // Default value if quality is not recognised
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ResolutionPreset resolutionPreset =
|
||||||
|
getResolutionPresetFromPhotoQuality(SharedPrefs().photoQuality);
|
||||||
|
|
||||||
if (controller != null) {
|
if (controller != null) {
|
||||||
await controller!.dispose();
|
await controller!.dispose();
|
||||||
}
|
}
|
||||||
controller = CameraController(cameraDescription, ResolutionPreset.high);
|
|
||||||
|
controller = CameraController(cameraDescription, resolutionPreset,
|
||||||
|
enableAudio: false);
|
||||||
controller!.addListener(() {
|
controller!.addListener(() {
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,9 @@ import 'dart:io';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:fluttertoast/fluttertoast.dart';
|
import 'package:fluttertoast/fluttertoast.dart';
|
||||||
|
import 'package:image/image.dart' as img;
|
||||||
import 'package:image_gallery_saver/image_gallery_saver.dart';
|
import 'package:image_gallery_saver/image_gallery_saver.dart';
|
||||||
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
|
||||||
import 'package:mobdr/config/constant.dart';
|
import 'package:mobdr/config/constant.dart';
|
||||||
import 'package:mobdr/config/global_style.dart';
|
import 'package:mobdr/config/global_style.dart';
|
||||||
|
|
@ -45,6 +47,10 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
bool _isLoading = true;
|
bool _isLoading = true;
|
||||||
String _errorMessage = '';
|
String _errorMessage = '';
|
||||||
|
|
||||||
|
late String imageSize;
|
||||||
|
late String imageResolution;
|
||||||
|
late String imageOrientation;
|
||||||
|
|
||||||
// Typology list
|
// Typology list
|
||||||
late List<PhotoTypology> _photoTypologiesList = [];
|
late List<PhotoTypology> _photoTypologiesList = [];
|
||||||
int _photoTypologyIndex = 0;
|
int _photoTypologyIndex = 0;
|
||||||
|
|
@ -62,6 +68,8 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
|
getImageDetails();
|
||||||
|
|
||||||
// track & log page access
|
// track & log page access
|
||||||
final page = 'visit_photo_typology_detail';
|
final page = 'visit_photo_typology_detail';
|
||||||
LoggerUtil.dblog('LOG', 'MOBDR', 'Page : ${page}', 0);
|
LoggerUtil.dblog('LOG', 'MOBDR', 'Page : ${page}', 0);
|
||||||
|
|
@ -74,6 +82,36 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getImageDetails() {
|
||||||
|
File imageFile = File(widget.pp_image);
|
||||||
|
|
||||||
|
if (imageFile.existsSync()) {
|
||||||
|
img.Image? image = img.decodeImage(imageFile.readAsBytesSync());
|
||||||
|
|
||||||
|
int imageSizeInBytes = imageFile.lengthSync();
|
||||||
|
double imageSizeInMb = imageSizeInBytes / (1024 * 1024);
|
||||||
|
|
||||||
|
int imageWidth = image!.width;
|
||||||
|
int imageHeight = image.height;
|
||||||
|
|
||||||
|
imageSize = '${imageSizeInMb.toStringAsFixed(2)} MB';
|
||||||
|
imageResolution = '$imageWidth x $imageHeight';
|
||||||
|
|
||||||
|
if (imageWidth > imageHeight) {
|
||||||
|
imageOrientation = 'Landscape';
|
||||||
|
} else if (imageHeight > imageWidth) {
|
||||||
|
imageOrientation = 'Portrait';
|
||||||
|
} else {
|
||||||
|
imageOrientation = 'Square';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// The image file does not exist
|
||||||
|
imageSize = '';
|
||||||
|
imageResolution = '';
|
||||||
|
imageOrientation = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
|
|
@ -136,10 +174,11 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
child: ListView(
|
child: ListView(
|
||||||
children: [
|
children: [
|
||||||
Image.file(File(widget.pp_image), fit: BoxFit.cover),
|
Image.file(File(widget.pp_image), fit: BoxFit.cover),
|
||||||
_buildPhotoTypology(),
|
_buildPhotoDetail(),
|
||||||
_buildPhotoVisibility(),
|
|
||||||
_buildPhotoTag(context),
|
_buildPhotoTag(context),
|
||||||
|
_buildPhotoVisibility(),
|
||||||
_BuildPhotoCompetitor(),
|
_BuildPhotoCompetitor(),
|
||||||
|
_buildPhotoTypology(),
|
||||||
SizedBox(height: 16)
|
SizedBox(height: 16)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
@ -209,6 +248,45 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget _buildPhotoDetail() {
|
||||||
|
return Container(
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(left: 5), // Décalage de 10 pixels à gauche
|
||||||
|
child: Text(
|
||||||
|
imageSize,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.blue,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 16),
|
||||||
|
Flexible(
|
||||||
|
child: Text(
|
||||||
|
imageResolution,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.blue,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 16),
|
||||||
|
Flexible(
|
||||||
|
child: Text(
|
||||||
|
'($imageOrientation)',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.blue,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Widget _buildPhotoTypology() {
|
Widget _buildPhotoTypology() {
|
||||||
return Container(
|
return Container(
|
||||||
margin: EdgeInsets.only(top: 12),
|
margin: EdgeInsets.only(top: 12),
|
||||||
|
|
@ -519,9 +597,17 @@ class _VisitPhotoTypologyDetailPageState
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> saveImageToGallery(String imagePath) async {
|
Future<bool> saveImageToGallery(String imagePath) async {
|
||||||
final result = await ImageGallerySaver.saveFile(imagePath);
|
// Request permission to access external storage
|
||||||
bool isSuccess = result["isSuccess"];
|
PermissionStatus status = await Permission.storage.request();
|
||||||
return isSuccess;
|
|
||||||
|
if (status.isGranted) {
|
||||||
|
final result = await ImageGallerySaver.saveFile(imagePath);
|
||||||
|
bool isSuccess = result["isSuccess"];
|
||||||
|
return isSuccess;
|
||||||
|
} else {
|
||||||
|
// The user has refused permission
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Initializes data when the page loads.
|
/// Initializes data when the page loads.
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
import 'package:fluttertoast/fluttertoast.dart';
|
import 'package:fluttertoast/fluttertoast.dart';
|
||||||
import 'package:image/image.dart' as img;
|
import 'package:flutter_image_compress/flutter_image_compress.dart';
|
||||||
import 'package:image_picker/image_picker.dart';
|
import 'package:image_picker/image_picker.dart';
|
||||||
|
|
||||||
import 'package:path/path.dart' as path;
|
import 'package:path/path.dart' as path;
|
||||||
|
|
@ -413,10 +413,7 @@ class _VisitPhotoTypologyListPageState
|
||||||
if (_visitPhotoFiles.length > 0) {
|
if (_visitPhotoFiles.length > 0) {
|
||||||
final List<VisitPhoto> _listPhotos = [];
|
final List<VisitPhoto> _listPhotos = [];
|
||||||
|
|
||||||
for (var myTmpPhoto in _visitPhotoFiles) {
|
for (var myPhoto in _visitPhotoFiles) {
|
||||||
/// move jpg file to photo directory
|
|
||||||
final myPhoto = await moveFileFromTempToPhotosDir(myTmpPhoto);
|
|
||||||
|
|
||||||
/// to insert into database
|
/// to insert into database
|
||||||
_listPhotos.add(VisitPhoto(
|
_listPhotos.add(VisitPhoto(
|
||||||
id_visite: widget.pp_visitModel.id_visite,
|
id_visite: widget.pp_visitModel.id_visite,
|
||||||
|
|
@ -543,26 +540,6 @@ class _VisitPhotoTypologyListPageState
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Moves a temporary file to the photos directory in the app's document directory.
|
|
||||||
///
|
|
||||||
/// Returns a `File` object for the new file in the photos directory.
|
|
||||||
///
|
|
||||||
/// Parameters:
|
|
||||||
/// * `tempFile`: The temporary `File` object to move to the photos directory.
|
|
||||||
///
|
|
||||||
/// Throws a `FileSystemException` if there is an error renaming the file.
|
|
||||||
Future<File> moveFileFromTempToPhotosDir(File tempFile) async {
|
|
||||||
// Set the new file path with the original file name
|
|
||||||
final String newPath =
|
|
||||||
'${SharedPrefs().photosDir}/${tempFile.path.split('/').last}';
|
|
||||||
|
|
||||||
// Rename the file to move it to the documents directory
|
|
||||||
await tempFile.rename(newPath);
|
|
||||||
|
|
||||||
// Create and return a new File object for the new file
|
|
||||||
return File(newPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Rotates the image file clockwise by the specified angle (in degrees) and overwrites the original file with the rotated image.
|
/// Rotates the image file clockwise by the specified angle (in degrees) and overwrites the original file with the rotated image.
|
||||||
///
|
///
|
||||||
/// Parameters:
|
/// Parameters:
|
||||||
|
|
@ -571,24 +548,20 @@ class _VisitPhotoTypologyListPageState
|
||||||
///
|
///
|
||||||
/// Throws an exception if there is an error in the rotation process.
|
/// Throws an exception if there is an error in the rotation process.
|
||||||
Future<void> rotateAndReplaceImage(File imageFile, int angle) async {
|
Future<void> rotateAndReplaceImage(File imageFile, int angle) async {
|
||||||
// Read the image file into a Uint8List
|
// Rotate the image using flutter_image_compress
|
||||||
Uint8List bytes = await imageFile.readAsBytes();
|
Uint8List? rotatedBytes = await FlutterImageCompress.compressWithFile(
|
||||||
|
imageFile.absolute.path,
|
||||||
|
rotate: angle,
|
||||||
|
);
|
||||||
|
|
||||||
// Decode the bytes into an Image object using the image package
|
// Check that rotatedBytes is not null before using it
|
||||||
img.Image? image = img.decodeImage(bytes);
|
if (rotatedBytes != null) {
|
||||||
|
// Overwrite the original file with the rotated image
|
||||||
|
await imageFile.writeAsBytes(rotatedBytes);
|
||||||
|
|
||||||
// Rotate the image clockwise by 90 degrees
|
// remove the flutter cache image
|
||||||
img.Image? rotatedImage = img.copyRotate(image!, angle: angle);
|
FileImage(imageFile).evict();
|
||||||
|
}
|
||||||
// Encode the rotated image back into a Uint8List
|
|
||||||
// TODO : png ??
|
|
||||||
Uint8List rotatedBytes = img.encodePng(rotatedImage);
|
|
||||||
|
|
||||||
// Overwrite the original file with the rotated image
|
|
||||||
await imageFile.writeAsBytes(rotatedBytes);
|
|
||||||
|
|
||||||
// remove the flutter cache image
|
|
||||||
FileImage(imageFile).evict();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Copies the 'simulator.jpg' image file from the app's assets to a randomly named file in the app's temporary directory and returns the File object.
|
/// Copies the 'simulator.jpg' image file from the app's assets to a randomly named file in the app's temporary directory and returns the File object.
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,13 @@
|
||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
|
#include <audioplayers_linux/audioplayers_linux_plugin.h>
|
||||||
#include <objectbox_flutter_libs/objectbox_flutter_libs_plugin.h>
|
#include <objectbox_flutter_libs/objectbox_flutter_libs_plugin.h>
|
||||||
|
|
||||||
void fl_register_plugins(FlPluginRegistry* registry) {
|
void fl_register_plugins(FlPluginRegistry* registry) {
|
||||||
|
g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar =
|
||||||
|
fl_plugin_registry_get_registrar_for_plugin(registry, "AudioplayersLinuxPlugin");
|
||||||
|
audioplayers_linux_plugin_register_with_registrar(audioplayers_linux_registrar);
|
||||||
g_autoptr(FlPluginRegistrar) objectbox_flutter_libs_registrar =
|
g_autoptr(FlPluginRegistrar) objectbox_flutter_libs_registrar =
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "ObjectboxFlutterLibsPlugin");
|
fl_plugin_registry_get_registrar_for_plugin(registry, "ObjectboxFlutterLibsPlugin");
|
||||||
objectbox_flutter_libs_plugin_register_with_registrar(objectbox_flutter_libs_registrar);
|
objectbox_flutter_libs_plugin_register_with_registrar(objectbox_flutter_libs_registrar);
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
|
audioplayers_linux
|
||||||
objectbox_flutter_libs
|
objectbox_flutter_libs
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
import FlutterMacOS
|
import FlutterMacOS
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
|
import audioplayers_darwin
|
||||||
import connectivity_plus
|
import connectivity_plus
|
||||||
import device_info_plus
|
import device_info_plus
|
||||||
import objectbox_flutter_libs
|
import objectbox_flutter_libs
|
||||||
|
|
@ -15,6 +16,7 @@ import sqflite
|
||||||
import wakelock_macos
|
import wakelock_macos
|
||||||
|
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
|
AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin"))
|
||||||
ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
|
ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
|
||||||
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
|
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
|
||||||
ObjectboxFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "ObjectboxFlutterLibsPlugin"))
|
ObjectboxFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "ObjectboxFlutterLibsPlugin"))
|
||||||
|
|
|
||||||
140
pubspec.lock
140
pubspec.lock
|
|
@ -21,10 +21,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: archive
|
name: archive
|
||||||
sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d
|
sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.3.6"
|
version: "3.3.7"
|
||||||
args:
|
args:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -41,6 +41,62 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.10.0"
|
version: "2.10.0"
|
||||||
|
audioplayers:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: audioplayers
|
||||||
|
sha256: "61583554386721772f9309f509e17712865b38565a903c761f96b1115a979282"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "4.1.0"
|
||||||
|
audioplayers_android:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: audioplayers_android
|
||||||
|
sha256: dbdc9b7f2aa2440314c638aa55aadd45c7705e8340d5eddf2e3fb8da32d4ae2c
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.0.2"
|
||||||
|
audioplayers_darwin:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: audioplayers_darwin
|
||||||
|
sha256: "6aea96df1d12f7ad5a71d88c6d1b22a216211a9564219920124c16768e456e9d"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "4.1.0"
|
||||||
|
audioplayers_linux:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: audioplayers_linux
|
||||||
|
sha256: "396b62ac62c92dd26c3bc5106583747f57a8b325ebd2b41e5576f840cfc61338"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.0"
|
||||||
|
audioplayers_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: audioplayers_platform_interface
|
||||||
|
sha256: f7daaed4659143094151ecf6bacd927d29ab8acffba98c110c59f0b81ae51143
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "5.0.1"
|
||||||
|
audioplayers_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: audioplayers_web
|
||||||
|
sha256: ec84fd46eed1577148ed4113f5998a36a18da4fce7170c37ce3e21b631393339
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.1.0"
|
||||||
|
audioplayers_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: audioplayers_windows
|
||||||
|
sha256: "1d3aaac98a192b8488167711ba1e67d8b96333e8d0572ede4e2912e5bbce69a3"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.2"
|
||||||
badges:
|
badges:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -430,6 +486,38 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.3.0"
|
version: "3.3.0"
|
||||||
|
flutter_image_compress:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress
|
||||||
|
sha256: "2babae2c69ee4849c3d3ae0f1f10c14a6b8132390e4583c5d3b1f02e8167a022"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.3"
|
||||||
|
flutter_image_compress_common:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress_common
|
||||||
|
sha256: "88aae2219cd4507992643f19aee7882fe8ff82375ffa8cb4c876e3bfe3e7c3b6"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.1"
|
||||||
|
flutter_image_compress_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress_platform_interface
|
||||||
|
sha256: dae0a3eb1fb7f38cf327cc2005dc287bc891becdd83c519277de4415fd9e065d
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.1"
|
||||||
|
flutter_image_compress_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_image_compress_web
|
||||||
|
sha256: "677f02509bdf5fd71afb560a22f0444e82c9ee887d223cd006cb44fd145fcb17"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.3"
|
||||||
flutter_localizations:
|
flutter_localizations:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
|
|
@ -513,10 +601,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: image
|
name: image
|
||||||
sha256: "483a389d6ccb292b570c31b3a193779b1b0178e7eb571986d9a49904b6861227"
|
sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.15"
|
version: "4.0.17"
|
||||||
image_gallery_saver:
|
image_gallery_saver:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -781,6 +869,46 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.11.1"
|
version: "1.11.1"
|
||||||
|
permission_handler:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: permission_handler
|
||||||
|
sha256: "1b6b3e73f0bcbc856548bbdfb1c33084a401c4f143e220629a9055233d76c331"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "10.3.0"
|
||||||
|
permission_handler_android:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: permission_handler_android
|
||||||
|
sha256: "8f6a95ccbca13766882f95d32684d7c9bfe6c45650c32bedba948ef1c6a4ddf7"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "10.2.3"
|
||||||
|
permission_handler_apple:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: permission_handler_apple
|
||||||
|
sha256: "08dcb6ce628ac0b257e429944b4c652c2a4e6af725bdf12b498daa2c6b2b1edb"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "9.1.0"
|
||||||
|
permission_handler_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: permission_handler_platform_interface
|
||||||
|
sha256: de20a5c3269229c1ae2e5a6b822f6cb59578b23e8255c93fbeebfc82116e6b11
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.10.0"
|
||||||
|
permission_handler_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: permission_handler_windows
|
||||||
|
sha256: f67cab14b4328574938ecea2db3475dad7af7ead6afab6338772c5f88963e38b
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.2"
|
||||||
petitparser:
|
petitparser:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -825,10 +953,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: pointycastle
|
name: pointycastle
|
||||||
sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c
|
sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.7.2"
|
version: "3.7.3"
|
||||||
pool:
|
pool:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
||||||
23
pubspec.yaml
23
pubspec.yaml
|
|
@ -66,16 +66,18 @@ dependencies:
|
||||||
# https://pub.dev/packages/camera
|
# https://pub.dev/packages/camera
|
||||||
camera: ^0.10.5+2
|
camera: ^0.10.5+2
|
||||||
|
|
||||||
|
# https://pub.dev/packages/audioplayers
|
||||||
|
audioplayers: ^4.1.0
|
||||||
|
|
||||||
# https://pub.dev/packages/image
|
# https://pub.dev/packages/image
|
||||||
# Rotations ...
|
image: ^4.0.17
|
||||||
image: ^4.0.15
|
|
||||||
|
# https://pub.dev/packages/flutter_image_compress
|
||||||
|
flutter_image_compress: ^2.0.3
|
||||||
|
|
||||||
# https://pub.dev/packages/super_tag_editor
|
# https://pub.dev/packages/super_tag_editor
|
||||||
super_tag_editor: ^0.1.1
|
super_tag_editor: ^0.1.1
|
||||||
|
|
||||||
# https://pub.dev/packages/flutter_cache_manager
|
|
||||||
#flutter_cache_manager: ^3.3.0
|
|
||||||
|
|
||||||
# https://pub.dev/packages/cached_network_image
|
# https://pub.dev/packages/cached_network_image
|
||||||
cached_network_image: 3.2.3
|
cached_network_image: 3.2.3
|
||||||
|
|
||||||
|
|
@ -116,15 +118,18 @@ dependencies:
|
||||||
# https://pub.dev/packages/image_gallery_saver
|
# https://pub.dev/packages/image_gallery_saver
|
||||||
image_gallery_saver: ^2.0.1
|
image_gallery_saver: ^2.0.1
|
||||||
|
|
||||||
|
# https://pub.dev/packages/permission_handler
|
||||||
|
permission_handler: 10.3.0
|
||||||
|
|
||||||
# hhttps://pub.dev/packages/timelines
|
# hhttps://pub.dev/packages/timelines
|
||||||
#timelines: ^0.1.0
|
#timelines: ^0.1.0
|
||||||
|
|
||||||
# https://pub.dev/packages/permission_handler
|
|
||||||
#permission_handler: 10.2.0
|
|
||||||
|
|
||||||
# https://pub.dev/packages/flutter_html
|
# https://pub.dev/packages/flutter_html
|
||||||
#flutter_html: 3.0.0-alpha.6
|
#flutter_html: 3.0.0-alpha.6
|
||||||
|
|
||||||
|
# https://pub.dev/packages/flutter_cache_manager
|
||||||
|
#flutter_cache_manager: ^3.3.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
@ -210,3 +215,5 @@ flutter:
|
||||||
- assets/lang/hi.json
|
- assets/lang/hi.json
|
||||||
- assets/lang/th.json
|
- assets/lang/th.json
|
||||||
- assets/lang/tk.json
|
- assets/lang/tk.json
|
||||||
|
|
||||||
|
- assets/sounds/camera-shutter-click.mp3
|
||||||
|
|
@ -6,12 +6,18 @@
|
||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
|
#include <audioplayers_windows/audioplayers_windows_plugin.h>
|
||||||
#include <connectivity_plus/connectivity_plus_windows_plugin.h>
|
#include <connectivity_plus/connectivity_plus_windows_plugin.h>
|
||||||
#include <objectbox_flutter_libs/objectbox_flutter_libs_plugin.h>
|
#include <objectbox_flutter_libs/objectbox_flutter_libs_plugin.h>
|
||||||
|
#include <permission_handler_windows/permission_handler_windows_plugin.h>
|
||||||
|
|
||||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
|
AudioplayersWindowsPluginRegisterWithRegistrar(
|
||||||
|
registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin"));
|
||||||
ConnectivityPlusWindowsPluginRegisterWithRegistrar(
|
ConnectivityPlusWindowsPluginRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin"));
|
registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin"));
|
||||||
ObjectboxFlutterLibsPluginRegisterWithRegistrar(
|
ObjectboxFlutterLibsPluginRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("ObjectboxFlutterLibsPlugin"));
|
registry->GetRegistrarForPlugin("ObjectboxFlutterLibsPlugin"));
|
||||||
|
PermissionHandlerWindowsPluginRegisterWithRegistrar(
|
||||||
|
registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,10 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
|
audioplayers_windows
|
||||||
connectivity_plus
|
connectivity_plus
|
||||||
objectbox_flutter_libs
|
objectbox_flutter_libs
|
||||||
|
permission_handler_windows
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue