2024-02-24 22:33:52 +03:00
|
|
|
import 'dart:io';
|
|
|
|
|
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';
|
2022-12-31 16:43:05 +03:00
|
|
|
import 'package:get/get.dart';
|
2024-02-24 22:33:52 +03:00
|
|
|
import 'package:intl/date_symbol_data_local.dart';
|
2022-12-25 12:30:20 +03:00
|
|
|
import 'package:intl/intl.dart';
|
|
|
|
import 'package:photo_gallery/photo_gallery.dart';
|
2024-02-24 22:33:52 +03:00
|
|
|
|
2022-12-31 16:43:05 +03:00
|
|
|
import '../controller/gallery_controller.dart';
|
2022-12-25 12:30:20 +03:00
|
|
|
import '/models/media_file.dart';
|
|
|
|
import '/models/medium.dart';
|
2022-12-31 16:43:05 +03:00
|
|
|
import 'config.dart';
|
2022-12-25 12:30:20 +03:00
|
|
|
|
|
|
|
class GalleryAlbum {
|
2022-12-31 16:43:05 +03:00
|
|
|
late Album album;
|
2023-01-20 09:58:21 +03:00
|
|
|
List<int>? thumbnail;
|
2022-12-25 12:30:20 +03:00
|
|
|
List<DateCategory> dateCategories = [];
|
2022-12-31 16:43:05 +03:00
|
|
|
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
|
|
|
|
2022-12-31 16:43:05 +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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-02-24 22:33:52 +03:00
|
|
|
Future<void> initialize({Locale? locale}) async {
|
2022-12-25 12:30:20 +03:00
|
|
|
List<DateCategory> dateCategory = [];
|
2022-12-29 08:45:28 +03:00
|
|
|
for (var medium in sortAlbumMediaDates((await album.listMedia()).items)) {
|
2023-01-20 09:58:21 +03:00
|
|
|
MediaFile mediaFile = MediaFile.medium(medium);
|
2024-02-24 22:33:52 +03:00
|
|
|
String name = getDateCategory(mediaFile, locale: locale);
|
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 {
|
2024-02-24 22:33:52 +03:00
|
|
|
DateTime? lastDate = mediaFile.lastModified;
|
|
|
|
lastDate = lastDate ?? DateTime.now();
|
|
|
|
dateCategory.add(
|
|
|
|
DateCategory(files: [mediaFile], name: name, dateTime: lastDate));
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
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 {
|
2023-01-20 09:58:21 +03:00
|
|
|
if (dateCategories.isNotEmpty &&
|
|
|
|
dateCategories.first.files.first.medium != null) {
|
|
|
|
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();
|
|
|
|
|
2024-02-24 22:33:52 +03:00
|
|
|
String getDateCategory(MediaFile media, {Locale? locale}) {
|
2023-01-01 10:09:43 +03:00
|
|
|
Config config = GetInstance().isRegistered<PhoneGalleryController>()
|
|
|
|
? Get.find<PhoneGalleryController>().config
|
|
|
|
: Config();
|
2023-01-20 09:58:21 +03:00
|
|
|
DateTime? lastDate = media.lastModified;
|
|
|
|
lastDate = lastDate ?? DateTime.now();
|
2024-02-24 22:33:52 +03:00
|
|
|
initializeDateFormatting();
|
|
|
|
String languageCode = locale != null
|
|
|
|
? (locale).languageCode
|
|
|
|
: Platform.localeName.split('_')[0];
|
2023-01-20 09:58:21 +03:00
|
|
|
if (daysBetween(lastDate) <= 3) {
|
2022-12-31 16:43:05 +03:00
|
|
|
return config.recent;
|
2023-01-20 09:58:21 +03:00
|
|
|
} else if (daysBetween(lastDate) > 3 && daysBetween(lastDate) <= 7) {
|
2022-12-31 16:43:05 +03:00
|
|
|
return config.lastWeek;
|
2024-02-24 22:33:52 +03:00
|
|
|
} else if (DateTime.now().month == lastDate.month) {
|
2022-12-31 16:43:05 +03:00
|
|
|
return config.lastMonth;
|
2024-02-24 22:33:52 +03:00
|
|
|
} else if (DateTime.now().year == lastDate.year) {
|
|
|
|
String month = DateFormat.MMMM(languageCode).format(lastDate).toString();
|
|
|
|
return "$month ${lastDate.day}";
|
2022-12-25 12:30:20 +03:00
|
|
|
} else {
|
2024-02-24 22:33:52 +03:00
|
|
|
String month = DateFormat.MMMM(languageCode).format(lastDate).toString();
|
|
|
|
return "$month ${lastDate.day}, ${lastDate.year}";
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2023-01-20 09:58:21 +03:00
|
|
|
return b.lastDate!.compareTo(a.lastDate!);
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
});
|
|
|
|
return mediumList;
|
|
|
|
}
|
|
|
|
|
|
|
|
sort() {
|
2024-02-24 22:33:52 +03:00
|
|
|
dateCategories.sort((a, b) => b.dateTime.compareTo(a.dateTime));
|
2022-12-25 12:30:20 +03:00
|
|
|
|
|
|
|
for (var category in dateCategories) {
|
|
|
|
category.files.sort((a, b) {
|
2023-01-20 09:58:21 +03:00
|
|
|
if (a.medium == null) {
|
2022-12-25 12:30:20 +03:00
|
|
|
return 1;
|
2023-01-20 09:58:21 +03:00
|
|
|
} else if (b.medium == null) {
|
2022-12-25 12:30:20 +03:00
|
|
|
return -1;
|
|
|
|
} else {
|
2023-01-20 09:58:21 +03:00
|
|
|
return b.medium!.lastDate!.compareTo(a.medium!.lastDate!);
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-02-24 22:33:52 +03:00
|
|
|
void addFile(MediaFile file, {Locale? locale}) {
|
|
|
|
String name = getDateCategory(file, locale: locale);
|
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 {
|
2024-02-24 22:33:52 +03:00
|
|
|
DateTime? lastDate = file.lastModified;
|
|
|
|
lastDate = lastDate ?? DateTime.now();
|
|
|
|
dateCategories
|
|
|
|
.add(DateCategory(files: [file], name: name, dateTime: lastDate));
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class DateCategory {
|
|
|
|
String name;
|
|
|
|
List<MediaFile> files;
|
2024-02-24 22:33:52 +03:00
|
|
|
DateTime dateTime;
|
|
|
|
DateCategory(
|
|
|
|
{required this.files, required this.name, required this.dateTime});
|
2022-12-25 12:30:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
enum AlbumType { video, image, mixed }
|