gallery_picker/lib/models/gallery_album.dart

176 lines
4.7 KiB
Dart
Raw Normal View History

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-25 12:30:20 +03:00
import 'package:intl/intl.dart';
import 'package:photo_gallery/photo_gallery.dart';
import '../controller/gallery_controller.dart';
2022-12-25 12:30:20 +03:00
import '/models/media_file.dart';
import '/models/medium.dart';
import 'config.dart';
2022-12-25 12:30:20 +03:00
class GalleryAlbum {
late Album album;
2022-12-25 12:30:20 +03:00
late List<int>? thumbnail;
List<DateCategory> dateCategories = [];
late AlbumType type;
2022-12-25 12:30:20 +03:00
int get count =>
dateCategories.expand((element) => element.files).toList().length;
String? get name => album.name;
2022-12-30 05:18:18 +03:00
GalleryAlbum.album(this.album);
GalleryAlbum(
{required this.album,
required this.type,
this.thumbnail,
this.dateCategories = const []});
2022-12-29 08:45:28 +03:00
List<MediaFile> get medias {
return dateCategories
.expand<MediaFile>((element) => element.files)
.toList();
}
2022-12-25 12:30:20 +03:00
set setType(AlbumType type) {
this.type = type;
}
IconData get icon {
switch (type) {
case AlbumType.image:
return Icons.image;
case AlbumType.video:
return Icons.videocam;
case AlbumType.mixed:
return Icons.perm_media_outlined;
}
}
Future<void> initialize() async {
List<DateCategory> dateCategory = [];
2022-12-29 08:45:28 +03:00
for (var medium in sortAlbumMediaDates((await album.listMedia()).items)) {
MediaFile mediaFile = MediaFile(medium: medium);
String name = getDateCategory(medium);
2022-12-25 12:30:20 +03:00
if (dateCategory.any((element) => element.name == name)) {
dateCategory
.singleWhere((element) => element.name == name)
.files
.add(mediaFile);
} else {
dateCategory.add(DateCategory(files: [mediaFile], name: name));
}
}
dateCategories = dateCategory;
try {
thumbnail = await album.getThumbnail(highQuality: true);
} catch (e) {
2022-12-30 05:18:18 +03:00
if (kDebugMode) {
print(e);
}
2022-12-25 12:30:20 +03:00
}
}
DateTime? get lastDate {
if (dateCategories.isNotEmpty) {
2022-12-29 08:45:28 +03:00
return dateCategories.first.files.first.medium.lastDate;
2022-12-25 12:30:20 +03:00
} else {
return null;
}
}
List<MediaFile> get files =>
dateCategories.expand((element) => element.files).toList();
String getDateCategory(Medium mediaFile) {
Config config = GetInstance().isRegistered<PhoneGalleryController>()
? Get.find<PhoneGalleryController>().config
: Config();
2022-12-25 12:30:20 +03:00
if (daysBetween(mediaFile.lastDate!) <= 3) {
return config.recent;
2022-12-25 12:30:20 +03:00
} else if (daysBetween(mediaFile.lastDate!) > 3 &&
daysBetween(mediaFile.lastDate!) <= 7) {
return config.lastWeek;
2022-12-25 12:30:20 +03:00
} else if (daysBetween(mediaFile.lastDate!) > 7 &&
daysBetween(mediaFile.lastDate!) <= 31) {
return config.lastMonth;
2022-12-25 12:30:20 +03:00
} else if (daysBetween(mediaFile.lastDate!) > 31 &&
daysBetween(mediaFile.lastDate!) <= 365) {
return DateFormat.MMMM().format(mediaFile.lastDate!).toString();
} else {
return DateFormat.y().format(mediaFile.lastDate!).toString();
}
}
int daysBetween(DateTime from) {
from = DateTime(from.year, from.month, from.day);
return (DateTime.now().difference(from).inHours / 24).round();
}
static 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;
}
sort() {
dateCategories.sort(
(a, b) => a.getIndexOfCategory().compareTo(b.getIndexOfCategory()));
for (var category in dateCategories) {
category.files.sort((a, b) {
2022-12-29 08:45:28 +03:00
if (a.medium.lastDate == null) {
2022-12-25 12:30:20 +03:00
return 1;
2022-12-29 08:45:28 +03:00
} else if (b.medium.lastDate == null) {
2022-12-25 12:30:20 +03:00
return -1;
} else {
2022-12-29 08:45:28 +03:00
return b.medium.lastDate!.compareTo(a.medium.lastDate!);
2022-12-25 12:30:20 +03:00
}
});
}
}
void addFile(MediaFile file) {
2022-12-29 08:45:28 +03:00
String name = getDateCategory(file.medium);
2022-12-25 12:30:20 +03:00
if (dateCategories.any((element) => element.name == name)) {
dateCategories
.singleWhere((element) => element.name == name)
.files
.add(file);
} else {
dateCategories.add(DateCategory(files: [file], name: name));
}
}
}
class DateCategory {
String name;
List<MediaFile> files;
DateCategory({required this.files, required this.name});
int getIndexOfCategory() {
Config config = GetInstance().isRegistered<PhoneGalleryController>()
? Get.find<PhoneGalleryController>().config
: Config();
int index = [
config.recent,
config.lastWeek,
config.lastMonth,
2023-01-04 14:09:02 +03:00
...config.months
].indexOf(name);
2022-12-25 12:30:20 +03:00
if (index == -1) {
return 3000 - int.parse(name);
} else {
return index;
}
}
}
enum AlbumType { video, image, mixed }