gallery_picker/lib/controller/gallery_controller.dart

212 lines
6.3 KiB
Dart
Raw Normal View History

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
}
}