2022-12-29 08:45:28 +03:00
|
|
|
import 'dart:io';
|
2022-12-25 12:30:20 +03:00
|
|
|
import 'package:flutter/cupertino.dart';
|
2022-12-30 05:18:18 +03:00
|
|
|
import 'package:flutter/foundation.dart';
|
2022-12-25 12:30:20 +03:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:get/get.dart';
|
2022-12-29 08:45:28 +03:00
|
|
|
import 'package:permission_handler/permission_handler.dart';
|
2022-12-25 12:30:20 +03:00
|
|
|
import 'package:photo_gallery/photo_gallery.dart';
|
|
|
|
import '../models/config.dart';
|
2022-12-29 08:45:28 +03:00
|
|
|
import '../models/gallery_media.dart';
|
2022-12-25 12:30:20 +03:00
|
|
|
import '/models/gallery_album.dart';
|
|
|
|
import '/models/medium.dart';
|
|
|
|
import '../models/media_file.dart';
|
2022-12-29 08:45:28 +03:00
|
|
|
import 'picker_listener.dart';
|
2022-12-25 12:30:20 +03:00
|
|
|
|
|
|
|
class PhoneGalleryController extends GetxController {
|
|
|
|
late Config config;
|
|
|
|
|
|
|
|
PhoneGalleryController(Config? config,
|
|
|
|
{required this.onSelect,
|
|
|
|
required this.heroBuilder,
|
|
|
|
required this.isRecent,
|
2022-12-29 08:45:28 +03:00
|
|
|
List<MediaFile>? initSelectedMedias,
|
|
|
|
required this.multipleMediasBuilder}) {
|
2022-12-25 12:30:20 +03:00
|
|
|
this.config = config ?? Config();
|
2022-12-29 08:45:28 +03:00
|
|
|
if (initSelectedMedias != null) {
|
|
|
|
_selectedFiles = initSelectedMedias.map((e) => e).toList();
|
|
|
|
}
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
bool isRecent;
|
|
|
|
Function(List<MediaFile> selectedMedias) onSelect;
|
|
|
|
Widget Function(String tag, MediaFile media, BuildContext context)?
|
|
|
|
heroBuilder;
|
|
|
|
Widget Function(List<MediaFile> medias, BuildContext context)?
|
2022-12-29 08:45:28 +03:00
|
|
|
multipleMediasBuilder;
|
2022-12-25 12:30:20 +03:00
|
|
|
GalleryAlbum? selectedAlbum;
|
|
|
|
List<GalleryAlbum> _galleryAlbums = [];
|
|
|
|
List<GalleryAlbum> get galleryAlbums => _galleryAlbums;
|
|
|
|
List<MediaFile> _selectedFiles = [];
|
|
|
|
List<MediaFile> get selectedFiles => _selectedFiles;
|
|
|
|
bool _isInitialized = false;
|
|
|
|
bool get isInitialized => _isInitialized;
|
|
|
|
bool _pickerMode = false;
|
|
|
|
bool get pickerMode => _pickerMode;
|
|
|
|
|
2022-12-29 08:45:28 +03:00
|
|
|
void updateSelectedFiles(List<MediaFile> medias) {
|
|
|
|
_selectedFiles = medias;
|
2022-12-30 05:18:18 +03:00
|
|
|
if (selectedFiles.isNotEmpty) {
|
|
|
|
_pickerMode = true;
|
2022-12-29 08:45:28 +03:00
|
|
|
}
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
2022-12-25 12:30:20 +03:00
|
|
|
void changeAlbum(GalleryAlbum? album) {
|
|
|
|
selectedAlbum = album;
|
2022-12-29 08:45:28 +03:00
|
|
|
_selectedFiles.clear();
|
2022-12-25 12:30:20 +03:00
|
|
|
update();
|
2022-12-29 08:45:28 +03:00
|
|
|
updatePickerListener();
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void unselectMedia(MediaFile file) {
|
|
|
|
_selectedFiles.remove(file);
|
|
|
|
if (_selectedFiles.isEmpty) {
|
|
|
|
_pickerMode = false;
|
|
|
|
}
|
|
|
|
update();
|
2022-12-29 08:45:28 +03:00
|
|
|
updatePickerListener();
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void selectMedia(MediaFile file) {
|
|
|
|
if (!_selectedFiles.any((element) => element == file)) {
|
|
|
|
_selectedFiles.add(file);
|
|
|
|
}
|
|
|
|
if (!_pickerMode) {
|
|
|
|
_pickerMode = true;
|
|
|
|
}
|
|
|
|
update();
|
2022-12-29 08:45:28 +03:00
|
|
|
updatePickerListener();
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void switchPickerMode(bool value) {
|
|
|
|
if (!value) {
|
2022-12-29 08:45:28 +03:00
|
|
|
_selectedFiles.clear();
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
_pickerMode = value;
|
|
|
|
update();
|
2022-12-29 08:45:28 +03:00
|
|
|
updatePickerListener();
|
|
|
|
}
|
|
|
|
|
|
|
|
void updatePickerListener() {
|
|
|
|
if (GetInstance().isRegistered<PickerListener>()) {
|
|
|
|
Get.find<PickerListener>().updateController(_selectedFiles);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static Future<bool> promptPermissionSetting() async {
|
|
|
|
if (Platform.isIOS &&
|
|
|
|
await Permission.storage.request().isGranted &&
|
|
|
|
await Permission.photos.request().isGranted ||
|
|
|
|
Platform.isAndroid && await Permission.storage.request().isGranted) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> initializeAlbums() async {
|
2022-12-29 08:45:28 +03:00
|
|
|
GalleryMedia? media = await PhoneGalleryController.collectGallery;
|
|
|
|
if (media != null) {
|
2022-12-30 05:18:18 +03:00
|
|
|
_galleryAlbums = media.albums;
|
2022-12-29 08:45:28 +03:00
|
|
|
}
|
|
|
|
_isInitialized = true;
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
|
|
|
static Future<GalleryMedia?> get collectGallery async {
|
|
|
|
if (await promptPermissionSetting()) {
|
|
|
|
List<GalleryAlbum> tempGalleryAlbums = [];
|
|
|
|
|
|
|
|
List<Album> photoAlbums =
|
|
|
|
await PhotoGallery.listAlbums(mediumType: MediumType.image);
|
|
|
|
List<Album> videoAlbums =
|
|
|
|
await PhotoGallery.listAlbums(mediumType: MediumType.video);
|
|
|
|
|
|
|
|
for (var photoAlbum in photoAlbums) {
|
|
|
|
GalleryAlbum entireGalleryAlbum = GalleryAlbum(album: photoAlbum);
|
|
|
|
await entireGalleryAlbum.initialize();
|
|
|
|
entireGalleryAlbum.setType = AlbumType.image;
|
|
|
|
if (videoAlbums.any((element) => element.name == photoAlbum.name)) {
|
|
|
|
Album videoAlbum = videoAlbums
|
|
|
|
.singleWhere((element) => element.name == photoAlbum.name);
|
|
|
|
GalleryAlbum videoGalleryAlbum = GalleryAlbum(album: videoAlbum);
|
|
|
|
await videoGalleryAlbum.initialize();
|
|
|
|
DateTime? lastPhotoDate = entireGalleryAlbum.lastDate;
|
|
|
|
DateTime? lastVideoDate = videoGalleryAlbum.lastDate;
|
|
|
|
|
|
|
|
if (lastPhotoDate == null) {
|
2022-12-25 12:30:20 +03:00
|
|
|
try {
|
2022-12-29 08:45:28 +03:00
|
|
|
entireGalleryAlbum.thumbnail =
|
|
|
|
await videoAlbum.getThumbnail(highQuality: true);
|
2022-12-25 12:30:20 +03:00
|
|
|
} catch (e) {
|
2022-12-30 05:18:18 +03:00
|
|
|
if (kDebugMode) {
|
|
|
|
print(e);
|
|
|
|
}
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
2022-12-29 08:45:28 +03:00
|
|
|
} else if (lastVideoDate == null) {
|
|
|
|
} else {
|
|
|
|
if (lastVideoDate.isAfter(lastPhotoDate)) {
|
|
|
|
try {
|
|
|
|
entireGalleryAlbum.thumbnail =
|
|
|
|
await videoAlbum.getThumbnail(highQuality: true);
|
|
|
|
} catch (e) {
|
|
|
|
entireGalleryAlbum.thumbnail = null;
|
2022-12-30 05:18:18 +03:00
|
|
|
if (kDebugMode) {
|
|
|
|
print(e);
|
|
|
|
}
|
2022-12-29 08:45:28 +03:00
|
|
|
}
|
|
|
|
}
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
2022-12-29 08:45:28 +03:00
|
|
|
for (var file in videoGalleryAlbum.files) {
|
|
|
|
entireGalleryAlbum.addFile(file);
|
|
|
|
}
|
|
|
|
entireGalleryAlbum.sort();
|
|
|
|
entireGalleryAlbum.setType = AlbumType.mixed;
|
|
|
|
videoAlbums.remove(videoAlbum);
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
2022-12-29 08:45:28 +03:00
|
|
|
tempGalleryAlbums.add(entireGalleryAlbum);
|
|
|
|
}
|
|
|
|
for (var videoAlbum in videoAlbums) {
|
|
|
|
GalleryAlbum galleryVideoAlbum = GalleryAlbum(album: videoAlbum);
|
|
|
|
await galleryVideoAlbum.initialize();
|
|
|
|
galleryVideoAlbum.setType = AlbumType.video;
|
|
|
|
tempGalleryAlbums.add(galleryVideoAlbum);
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
|
2022-12-29 08:45:28 +03:00
|
|
|
return GalleryMedia(tempGalleryAlbums);
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
GalleryAlbum? get recent {
|
|
|
|
return _isInitialized
|
|
|
|
? _galleryAlbums.singleWhere((element) => element.album.name == "All")
|
|
|
|
: null;
|
|
|
|
}
|
|
|
|
|
|
|
|
List<Medium> sortAlbumMediaDates(List<Medium> mediumList) {
|
|
|
|
mediumList.sort((a, b) {
|
|
|
|
if (a.lastDate == null) {
|
|
|
|
return 1;
|
|
|
|
} else if (b.lastDate == null) {
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
return a.lastDate!.compareTo(b.lastDate!);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return mediumList;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool isSelectedMedia(MediaFile file) {
|
2022-12-29 08:45:28 +03:00
|
|
|
return _selectedFiles.any((element) => element.medium.id == file.medium.id);
|
|
|
|
}
|
|
|
|
|
|
|
|
void disposeController() {
|
|
|
|
_galleryAlbums = [];
|
|
|
|
_selectedFiles = [];
|
|
|
|
_isInitialized = false;
|
|
|
|
selectedAlbum = null;
|
|
|
|
Get.delete<PhoneGalleryController>();
|
|
|
|
update();
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
}
|