extraRecentMedia parameter added. MediaFile.file() added. Documantation changed

This commit is contained in:
Furkan 2022-12-31 16:43:05 +03:00
parent e07af8a394
commit 1bf66592fe
19 changed files with 268 additions and 124 deletions

View File

@ -1 +1 @@
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"permission_handler_apple","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_apple-9.0.7\\\\","native_build":true,"dependencies":[]},{"name":"photo_gallery","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\photo_gallery-1.1.1\\\\","native_build":true,"dependencies":[]},{"name":"video_player_avfoundation","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_avfoundation-2.3.8\\\\","native_build":true,"dependencies":[]},{"name":"video_thumbnail","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_thumbnail-0.5.3\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"permission_handler_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_android-10.2.0\\\\","native_build":true,"dependencies":[]},{"name":"photo_gallery","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\photo_gallery-1.1.1\\\\","native_build":true,"dependencies":[]},{"name":"video_player_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_android-2.3.10\\\\","native_build":true,"dependencies":[]},{"name":"video_thumbnail","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_thumbnail-0.5.3\\\\","native_build":true,"dependencies":[]}],"macos":[],"linux":[],"windows":[{"name":"permission_handler_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_windows-0.1.2\\\\","native_build":true,"dependencies":[]}],"web":[{"name":"video_player_web","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_web-2.0.13\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"photo_gallery","dependencies":[]},{"name":"video_player","dependencies":["video_player_android","video_player_avfoundation","video_player_web"]},{"name":"video_player_android","dependencies":[]},{"name":"video_player_avfoundation","dependencies":[]},{"name":"video_player_web","dependencies":[]},{"name":"video_thumbnail","dependencies":[]}],"date_created":"2022-12-30 05:18:44.302087","version":"3.3.9"}
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"permission_handler_apple","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_apple-9.0.7\\\\","native_build":true,"dependencies":[]},{"name":"photo_gallery","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\photo_gallery-1.1.1\\\\","native_build":true,"dependencies":[]},{"name":"video_player_avfoundation","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_avfoundation-2.3.8\\\\","native_build":true,"dependencies":[]},{"name":"video_thumbnail","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_thumbnail-0.5.3\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"permission_handler_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_android-10.2.0\\\\","native_build":true,"dependencies":[]},{"name":"photo_gallery","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\photo_gallery-1.1.1\\\\","native_build":true,"dependencies":[]},{"name":"video_player_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_android-2.3.10\\\\","native_build":true,"dependencies":[]},{"name":"video_thumbnail","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_thumbnail-0.5.3\\\\","native_build":true,"dependencies":[]}],"macos":[],"linux":[],"windows":[{"name":"permission_handler_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\permission_handler_windows-0.1.2\\\\","native_build":true,"dependencies":[]}],"web":[{"name":"video_player_web","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\video_player_web-2.0.13\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]},{"name":"photo_gallery","dependencies":[]},{"name":"video_player","dependencies":["video_player_android","video_player_avfoundation","video_player_web"]},{"name":"video_player_android","dependencies":[]},{"name":"video_player_avfoundation","dependencies":[]},{"name":"video_player_web","dependencies":[]},{"name":"video_thumbnail","dependencies":[]}],"date_created":"2022-12-31 16:40:26.960029","version":"3.3.10"}

View File

@ -83,12 +83,12 @@ Quick and simple usage example:
### Pick Single File
```dart
MediaFile? media = await GalleryPicker.pickMedias(context: context,singleMedia: true);
MediaFile? singleMedia = await GalleryPicker.pickMedia(context: context,singleMedia: true);
```
### Pick Multiple Files
```dart
List<MediaFile>? medias = await GalleryPicker.pickMedias(context: context);
List<MediaFile>? media = await GalleryPicker.pickMedia(context: context);
```
### Get All Media Files in Gallery
@ -121,7 +121,8 @@ There is an example at `example/lib/examples/bottom_sheet_example.dart` to see h
title: Text(widget.title),
),
body: BottomSheetLayout(
onSelect: (medias) {},
config: Config()
onSelect: (media) {},
child: Column(
children: [
```
@ -130,13 +131,13 @@ There is an example at `example/lib/examples/bottom_sheet_example.dart` to see h
Within the Gallery Picker you can design a page that will be redirected after selecting any image(s).
Note: There are two builder called multipleMediasBuilder and heroBuilder. If you designed both of them, multipleMediasBuilder will be shown after picking multiple media files, heroBuilder will be shown after picking a single media. Use given hero tag to view your Hero image. You can see a simple example below.
Note: There are two builder called multipleMediaBuilder and heroBuilder. If you designed both of them, multipleMediaBuilder will be shown after picking multiple media files, heroBuilder will be shown after picking a single media. Use given hero tag to view your Hero image. You can see a simple example below.
There is an example at `example/lib/examples/pick_medias_with_builder.dart` to see how it could be done.
```dart
GalleryPicker.pickMediasWithBuilder(
multipleMediasBuilder: ((medias, context) {
GalleryPicker.pickMediaWithBuilder(
multipleMediaBuilder: ((media, context) {
return Scaffold(
appBar: AppBar(
title: const Text('Flippers Page'),
@ -146,9 +147,9 @@ There is an example at `example/lib/examples/pick_medias_with_builder.dart` to s
mainAxisSpacing: 5,
crossAxisSpacing: 5,
children: [
for (var media in medias)
for (var mediaFile in media)
ThumbnailMedia(
media: media,
media: mediaFile,
)
],
),
@ -159,7 +160,7 @@ There is an example at `example/lib/examples/pick_medias_with_builder.dart` to s
MaterialPageRoute(
builder: (context) => MyHomePage(
title: "Selected Medias",
medias: medias,
medias: media,
)),
);
GalleryPicker.dispose();
@ -220,7 +221,7 @@ A Config class is provided to user to customize your gallery picker. You can cus
#### Customizable appereance features
```dart
List<MediaFile>? medias = await GalleryPicker.pickMedias(
List<MediaFile>? media = await GalleryPicker.pickMedia(
context: context,
config: Config(
backgroundColor: Colors.white,
@ -273,7 +274,7 @@ List<MediaFile>? medias = await GalleryPicker.pickMedias(
#### Appearance Mode
```dart
List<MediaFile>? medias = await GalleryPicker.pickMedias(
List<MediaFile>? media = await GalleryPicker.pickMedia(
context: context,
config: Config(
mode: Mode.dark
@ -284,9 +285,19 @@ List<MediaFile>? medias = await GalleryPicker.pickMedias(
#### Give an initial selected media files
```dart
List<MediaFile>? medias = await GalleryPicker.pickMedias(
List<MediaFile>? media = await GalleryPicker.pickMedia(
context: context,
initSelectedMedias: this.selectedMedias,
initSelectedMedia: initSelectedMedia,
)
```
#### Give extra media files that will be included in recent
You can give extra pictures to appear on the recent page. You should define these files with MediaFile.file()
```dart
MediaFile file = MediaFile.file(id: "id", file: File("path"), type: MediaType.image);
List<MediaFile>? media = await GalleryPicker.pickMedia(
context: context,
extraRecentMedia: [file],
)
```
#### Select your priority page
@ -294,7 +305,7 @@ List<MediaFile>? medias = await GalleryPicker.pickMedias(
There are two pages called "Recent" and "Gallery". You could change the initial page.
```dart
List<MediaFile>? medias = await GalleryPicker.pickMedias(
List<MediaFile>? media = await GalleryPicker.pickMedia(
context: context,
startWithRecent: true,
)

View File

@ -123,21 +123,21 @@ class _GalleryPickerExampleState extends State<GalleryPickerExample> {
),
),
floatingActionButton: FloatingActionButton(
onPressed: pickMedias,
onPressed: pickMedia,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
Future<void> pickMedias() async {
List<MediaFile>? medias = await GalleryPicker.pickMedias(
Future<void> pickMedia() async {
List<MediaFile>? media = await GalleryPicker.pickMedia(
context: context,
config: Config(mode: Mode.dark),
);
if (medias != null) {
if (media != null) {
setState(() {
selectedMedias += medias;
selectedMedias += media;
});
}
}

View File

@ -27,7 +27,7 @@ class _PickMediasWithBuilderState extends State<PickMediasWithBuilder> {
children: <Widget>[
const Spacer(),
TextButton(
onPressed: pickMediasWithBuilder,
onPressed: pickMediaWithBuilder,
child: Container(
width: 300,
height: 60,
@ -49,9 +49,9 @@ class _PickMediasWithBuilderState extends State<PickMediasWithBuilder> {
);
}
pickMediasWithBuilder() {
GalleryPicker.pickMediasWithBuilder(
multipleMediasBuilder: ((medias, context) {
pickMediaWithBuilder() {
GalleryPicker.pickMediaWithBuilder(
multipleMediaBuilder: ((medias, context) {
return MultipleMediasView(medias);
}),
heroBuilder: (tag, media, context) {

View File

@ -79,7 +79,7 @@ class _WhatsappPickPhotoState extends State<WhatsappPickPhoto> {
this.selectedMedias = selectedMedias;
setState(() {});
},
initSelectedMedias: selectedMedias,
initSelectedMedia: selectedMedias,
config: Config(mode: Mode.dark),
child: Stack(
children: [

View File

@ -163,28 +163,30 @@ class _MyHomePageState extends State<MyHomePage> {
),
),
floatingActionButton: FloatingActionButton(
onPressed: pickMedias,
onPressed: pickMedia,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
Future<void> pickMedias() async {
List<MediaFile>? medias = await GalleryPicker.pickMedias(
Future<void> pickMedia() async {
List<MediaFile>? media = await GalleryPicker.pickMedia(
context: context,
initSelectedMedias: selectedMedias,
config: Config(lastWeek: "Bu hafta"),
initSelectedMedia: selectedMedias,
extraRecentMedia: selectedMedias,
startWithRecent: true);
if (medias != null) {
if (media != null) {
setState(() {
selectedMedias += medias;
selectedMedias += media;
});
}
}
pickMediasWithBuilder() {
GalleryPicker.pickMediasWithBuilder(
multipleMediasBuilder: ((medias, context) {
pickMediaWithBuilder() {
GalleryPicker.pickMediaWithBuilder(
multipleMediaBuilder: ((medias, context) {
return MultipleMediasView(medias);
}),
heroBuilder: (tag, media, context) {

View File

@ -136,7 +136,7 @@ packages:
source: sdk
version: "0.0.0"
gallery_picker:
dependency: "direct overridden"
dependency: "direct dev"
description:
path: ".."
relative: true

View File

@ -49,6 +49,7 @@ dev_dependencies:
# rules and activating additional ones.
flutter_lints: ^2.0.0
camera: ^0.10.1
gallery_picker: ^0.0.6
dependency_overrides:
gallery_picker:

View File

@ -19,12 +19,16 @@ class PhoneGalleryController extends GetxController {
{required this.onSelect,
required this.heroBuilder,
required this.isRecent,
List<MediaFile>? initSelectedMedias,
required List<MediaFile>? initSelectedMedias,
required List<MediaFile>? extraRecentMedia,
required this.multipleMediasBuilder}) {
this.config = config ?? Config();
if (initSelectedMedias != null) {
_selectedFiles = initSelectedMedias.map((e) => e).toList();
}
if (extraRecentMedia != null) {
_extraRecentMedia = extraRecentMedia.map((e) => e).toList();
}
}
bool isRecent;
Function(List<MediaFile> selectedMedias) onSelect;
@ -36,20 +40,32 @@ class PhoneGalleryController extends GetxController {
List<GalleryAlbum> _galleryAlbums = [];
List<GalleryAlbum> get galleryAlbums => _galleryAlbums;
List<MediaFile> _selectedFiles = [];
List<MediaFile>? _extraRecentMedia;
List<MediaFile> get selectedFiles => _selectedFiles;
bool _isInitialized = false;
bool get isInitialized => _isInitialized;
List<MediaFile>? get extraRecentMedia => _extraRecentMedia;
bool _pickerMode = false;
bool get pickerMode => _pickerMode;
void updateSelectedFiles(List<MediaFile> medias) {
_selectedFiles = medias;
void updateSelectedFiles(List<MediaFile> media) {
_selectedFiles = media.map((e) => e).toList();
if (selectedFiles.isNotEmpty) {
_pickerMode = true;
}
update();
}
void updateExtraRecentMedia(List<MediaFile> media) {
_extraRecentMedia = media.map((e) => e).toList();
GalleryAlbum? recentTmp = recent;
if (recentTmp != null) {
_extraRecentMedia!.removeWhere(
(element) => recentTmp.files.any((file) => element.id == file.id));
}
update();
}
void changeAlbum(GalleryAlbum? album) {
selectedAlbum = album;
_selectedFiles.clear();
@ -106,7 +122,15 @@ class PhoneGalleryController extends GetxController {
GalleryMedia? media = await PhoneGalleryController.collectGallery;
if (media != null) {
_galleryAlbums = media.albums;
if (_extraRecentMedia != null) {
GalleryAlbum? recentTmp = recent;
if (recentTmp != null) {
_extraRecentMedia!.removeWhere((element) =>
recentTmp.files.any((file) => element.id == file.id));
}
}
}
_isInitialized = true;
update();
}
@ -121,13 +145,13 @@ class PhoneGalleryController extends GetxController {
await PhotoGallery.listAlbums(mediumType: MediumType.video);
for (var photoAlbum in photoAlbums) {
GalleryAlbum entireGalleryAlbum = GalleryAlbum(album: photoAlbum);
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);
GalleryAlbum videoGalleryAlbum = GalleryAlbum.album(videoAlbum);
await videoGalleryAlbum.initialize();
DateTime? lastPhotoDate = entireGalleryAlbum.lastDate;
DateTime? lastVideoDate = videoGalleryAlbum.lastDate;
@ -165,7 +189,7 @@ class PhoneGalleryController extends GetxController {
tempGalleryAlbums.add(entireGalleryAlbum);
}
for (var videoAlbum in videoAlbums) {
GalleryAlbum galleryVideoAlbum = GalleryAlbum(album: videoAlbum);
GalleryAlbum galleryVideoAlbum = GalleryAlbum.album(videoAlbum);
await galleryVideoAlbum.initialize();
galleryVideoAlbum.setType = AlbumType.video;
tempGalleryAlbums.add(galleryVideoAlbum);
@ -178,10 +202,31 @@ class PhoneGalleryController extends GetxController {
}
GalleryAlbum? get recent {
return _isInitialized
return _galleryAlbums.isNotEmpty
? _galleryAlbums.singleWhere((element) => element.album.name == "All")
: null;
}
//GalleryAlbum? get recent {
// if (_isInitialized) {
// GalleryAlbum? recent;
// for (var album in _galleryAlbums) {
// if (recent == null || (album.count > recent.count)) {
// recent = album;
// }
// }
// if (recent != null) {
// return GalleryAlbum(
// album: recent.album,
// type: recent.type,
// thumbnail: recent.thumbnail,
// dateCategories: recent.dateCategories);
// } else {
// return null;
// }
// } else {
// return null;
// }
//}
List<Medium> sortAlbumMediaDates(List<Medium> mediumList) {
mediumList.sort((a, b) {

View File

@ -11,7 +11,7 @@ export 'user_widgets/album_categories_view.dart';
export 'user_widgets/album_medias.dart';
export 'user_widgets/date_category_view.dart';
export 'user_widgets/thumbnail_album.dart';
export 'user_widgets/files_stream_builder.dart';
export 'user_widgets/gallery_picker_builder.dart';
export 'user_widgets/photo_provider.dart';
export 'user_widgets/video_provider.dart';
export 'user_widgets/media_provider.dart';
@ -48,45 +48,53 @@ class GalleryPicker {
}
}
static Future<List<MediaFile>?> pickMedias(
static Future<List<MediaFile>?> pickMedia(
{Config? config,
bool startWithRecent = false,
List<MediaFile>? initSelectedMedias,
bool singleMedia = false,
List<MediaFile>? initSelectedMedia,
List<MediaFile>? extraRecentMedia,
required BuildContext context}) async {
List<MediaFile>? medias;
List<MediaFile>? media;
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => GalleryPickerView(
onSelect: (mediasTmp) {
medias = mediasTmp;
onSelect: (mediaTmp) {
media = mediaTmp;
},
config: config,
initSelectedMedias: initSelectedMedias,
singleMedia: singleMedia,
initSelectedMedia: initSelectedMedia,
extraRecentMedia: extraRecentMedia,
startWithRecent: startWithRecent,
)),
);
return medias;
return media;
}
static Future<void> pickMediasWithBuilder(
static Future<void> pickMediaWithBuilder(
{Config? config,
required Widget Function(List<MediaFile> medias, BuildContext context)?
multipleMediasBuilder,
required Widget Function(List<MediaFile> media, BuildContext context)?
multipleMediaBuilder,
Widget Function(String tag, MediaFile media, BuildContext context)?
heroBuilder,
List<MediaFile>? initSelectedMedias,
bool singleMedia = false,
List<MediaFile>? initSelectedMedia,
List<MediaFile>? extraRecentMedia,
bool startWithRecent = false,
required BuildContext context}) async {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => GalleryPickerView(
onSelect: (medias) {},
multipleMediasBuilder: multipleMediasBuilder,
onSelect: (media) {},
multipleMediaBuilder: multipleMediaBuilder,
heroBuilder: heroBuilder,
singleMedia: singleMedia,
config: config,
initSelectedMedias: initSelectedMedias,
initSelectedMedia: initSelectedMedia,
extraRecentMedia: extraRecentMedia,
startWithRecent: startWithRecent,
)),
);

View File

@ -13,7 +13,13 @@ class Config {
appbarTextStyle,
selectedMenuStyle,
unselectedMenuStyle;
String recents, gallery, lastMonth, lastWeek, tapPhotoSelect, selected;
String recents,
recent,
gallery,
lastMonth,
lastWeek,
tapPhotoSelect,
selected;
List<String> months;
Mode mode;
@ -28,6 +34,7 @@ class Config {
TextStyle? textStyle,
TextStyle? appbarTextStyle,
this.recents = "RECENTS",
this.recent = "Recent",
this.gallery = "GALLERY",
this.lastMonth = "Last Month",
this.lastWeek = "Last Week",

View File

@ -1,26 +1,36 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:photo_gallery/photo_gallery.dart';
import '../controller/gallery_controller.dart';
import '/models/media_file.dart';
import '/models/medium.dart';
import 'config.dart';
class GalleryAlbum {
Album album;
late Album album;
late List<int>? thumbnail;
List<DateCategory> dateCategories = [];
late AlbumType type;
int get count =>
dateCategories.expand((element) => element.files).toList().length;
String? get name => album.name;
GalleryAlbum.album(this.album);
GalleryAlbum(
{required this.album,
required this.type,
this.thumbnail,
this.dateCategories = const []});
List<MediaFile> get medias {
return dateCategories
.expand<MediaFile>((element) => element.files)
.toList();
}
late AlbumType type;
set setType(AlbumType type) {
this.type = type;
}
@ -36,10 +46,6 @@ class GalleryAlbum {
}
}
GalleryAlbum({
required this.album,
});
Future<void> initialize() async {
List<DateCategory> dateCategory = [];
for (var medium in sortAlbumMediaDates((await album.listMedia()).items)) {
@ -76,14 +82,15 @@ class GalleryAlbum {
dateCategories.expand((element) => element.files).toList();
String getDateCategory(Medium mediaFile) {
Config config = Get.find<PhoneGalleryController>().config;
if (daysBetween(mediaFile.lastDate!) <= 3) {
return "Recent";
return config.recent;
} else if (daysBetween(mediaFile.lastDate!) > 3 &&
daysBetween(mediaFile.lastDate!) <= 7) {
return "Last week";
return config.lastWeek;
} else if (daysBetween(mediaFile.lastDate!) > 7 &&
daysBetween(mediaFile.lastDate!) <= 31) {
return "Last month";
return config.lastMonth;
} else if (daysBetween(mediaFile.lastDate!) > 31 &&
daysBetween(mediaFile.lastDate!) <= 365) {
return DateFormat.MMMM().format(mediaFile.lastDate!).toString();
@ -140,31 +147,19 @@ class GalleryAlbum {
}
}
List<String> dates = [
"Recent",
"Last week",
"Last month",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
];
class DateCategory {
String name;
List<MediaFile> files;
DateCategory({required this.files, required this.name});
int getIndexOfCategory() {
int index = dates.indexOf(name);
Config config = Get.find<PhoneGalleryController>().config;
int index = [
config.recent,
config.lastWeek,
config.lastMonth,
config.months
].indexOf(name);
if (index == -1) {
return 3000 - int.parse(name);
} else {

View File

@ -5,12 +5,12 @@ import 'gallery_album.dart';
class GalleryMedia {
List<GalleryAlbum> albums;
GalleryAlbum? get recent {
return albums.singleWhere((element) => element.album.name == "All");
return albums.singleWhere((element) => element.name == "All");
}
GalleryAlbum? getAlbum(String name) {
try {
return albums.singleWhere((element) => element.album.name == name);
return albums.singleWhere((element) => element.name == name);
} catch (e) {
if (kDebugMode) {
print(e);

View File

@ -3,10 +3,13 @@ import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:photo_gallery/photo_gallery.dart';
import 'package:video_thumbnail/video_thumbnail.dart';
import '../controller/gallery_controller.dart';
enum MediaType { image, video }
class MediaFile {
Medium medium;
late Medium medium;
MediumType? type;
Uint8List? thumbnail;
Uint8List? data;
@ -17,18 +20,39 @@ class MediaFile {
type = medium.mediumType;
id = medium.id;
}
Future<void> getThumbnail() async {
MediaFile.file(
{required this.id, required this.file, required MediaType type}) {
this.type = type == MediaType.image ? MediumType.image : MediumType.video;
medium = Medium(id: id);
}
Future<Uint8List?> getThumbnail() async {
try {
if (file != null) {
thumbnail = await VideoThumbnail.thumbnailData(
video: file!.path,
imageFormat: ImageFormat.JPEG,
maxWidth:
128, // specify the width of the thumbnail, let the height auto-scaled to keep the source aspect ratio
quality: 25,
);
} else {
thumbnail =
Uint8List.fromList(await medium.getThumbnail(highQuality: true));
}
} catch (e) {
thumbnailFailed = true;
}
return thumbnail;
}
Future<File> getFile() async {
if (file == null) {
file = await medium.getFile();
return file!;
} else {
return file!;
}
}
Future<Uint8List> getData() async {

View File

@ -3,9 +3,10 @@ import 'package:get/get.dart';
import '../controller/picker_listener.dart';
import '../models/media_file.dart';
class FilesStreamBuilder extends StatelessWidget {
final Widget Function(List<MediaFile>? medias, BuildContext context) builder;
FilesStreamBuilder({super.key, required this.builder}) {
class GalleryPickerBuilder extends StatelessWidget {
final Widget Function(List<MediaFile>? selectedFiles, BuildContext context)
builder;
GalleryPickerBuilder({super.key, required this.builder}) {
Get.put(PickerListener());
}

View File

@ -50,7 +50,7 @@ class AlbumAppBar extends StatelessWidget with PreferredSizeWidget {
Widget getTitle() {
if (!controller.pickerMode && controller.selectedFiles.isEmpty) {
return Text(
album.album.name!,
album.name!,
style: controller.config.appbarTextStyle,
);
} else if (controller.pickerMode && controller.selectedFiles.isEmpty) {

View File

@ -19,7 +19,7 @@ class AlbumMediasView extends StatelessWidget {
children: [
ListView(
children: [
for (var category in galleryAlbum.dateCategories)
for (var category in checkCategories(galleryAlbum.dateCategories))
DateCategoryWiew(
category: category,
controller: controller,
@ -36,4 +36,31 @@ class AlbumMediasView extends StatelessWidget {
],
);
}
List<DateCategory> checkCategories(List<DateCategory> categories) {
if (controller.isRecent &&
controller.extraRecentMedia != null &&
controller.extraRecentMedia!.isNotEmpty) {
List<DateCategory> categoriesTmp = categories.map((e) => e).toList();
int index = categoriesTmp
.indexWhere((element) => element.name == controller.config.recent);
if (index != -1) {
DateCategory category = DateCategory(files: [
...controller.extraRecentMedia!,
...categoriesTmp[index].files
], name: categoriesTmp[index].name);
categoriesTmp[index] = category;
return categoriesTmp;
} else {
return [
DateCategory(
files: controller.extraRecentMedia!,
name: controller.config.recent),
...categoriesTmp
];
}
} else {
return categories;
}
}
}

View File

@ -8,12 +8,14 @@ import '../controller/bottom_sheet_controller.dart';
class BottomSheetLayout extends StatefulWidget {
final Widget child;
final Config? config;
final List<MediaFile>? initSelectedMedias;
final Function(List<MediaFile> selectedMedias) onSelect;
final List<MediaFile>? initSelectedMedia;
final List<MediaFile>? extraRecentMedia;
final bool singleMedia;
final Function(List<MediaFile> selectedMedia) onSelect;
final Widget Function(String tag, MediaFile media, BuildContext context)?
heroBuilder;
final Widget Function(List<MediaFile> medias, BuildContext context)?
multipleMediasBuilder;
final Widget Function(List<MediaFile> media, BuildContext context)?
multipleMediaBuilder;
final bool startWithRecent;
BottomSheetLayout(
{super.key,
@ -21,13 +23,20 @@ class BottomSheetLayout extends StatefulWidget {
required this.onSelect,
this.config,
this.heroBuilder,
this.initSelectedMedias,
this.multipleMediasBuilder,
this.initSelectedMedia,
this.extraRecentMedia,
this.singleMedia = false,
this.multipleMediaBuilder,
this.startWithRecent = true}) {
if (initSelectedMedias != null &&
GetInstance().isRegistered<PhoneGalleryController>()) {
if (GetInstance().isRegistered<PhoneGalleryController>()) {
if (initSelectedMedia != null) {
Get.find<PhoneGalleryController>()
.updateSelectedFiles(initSelectedMedias!);
.updateSelectedFiles(initSelectedMedia!);
}
if (extraRecentMedia != null) {
Get.find<PhoneGalleryController>()
.updateExtraRecentMedia(extraRecentMedia!);
}
}
}
@ -97,8 +106,10 @@ class _BottomSheetLayoutState extends State<BottomSheetLayout> {
config: widget.config,
sheetController: bottomSheetBarController,
heroBuilder: widget.heroBuilder,
multipleMediasBuilder: widget.multipleMediasBuilder,
initSelectedMedias: widget.initSelectedMedias,
multipleMediaBuilder: widget.multipleMediaBuilder,
singleMedia: widget.singleMedia,
initSelectedMedia: widget.initSelectedMedia,
extraRecentMedia: widget.extraRecentMedia,
startWithRecent: widget.startWithRecent,
)
: Container(
@ -115,8 +126,10 @@ class _BottomSheetLayoutState extends State<BottomSheetLayout> {
config: widget.config,
sheetController: bottomSheetBarController,
heroBuilder: widget.heroBuilder,
multipleMediasBuilder: widget.multipleMediasBuilder,
initSelectedMedias: widget.initSelectedMedias,
singleMedia: widget.singleMedia,
multipleMediaBuilder: widget.multipleMediaBuilder,
initSelectedMedia: widget.initSelectedMedia,
extraRecentMedia: widget.extraRecentMedia,
startWithRecent: widget.startWithRecent,
),
viewPicker: controller.isClosing ? false : viewCollapsedPicker,

View File

@ -4,6 +4,7 @@ import 'package:get/get.dart';
import '../../controller/bottom_sheet_controller.dart';
import '../../controller/gallery_controller.dart';
import '../../models/config.dart';
import '../../models/gallery_album.dart';
import '../../models/media_file.dart';
import '../album_categories_view/album_categories_view.dart';
import '../album_view/album_page.dart';
@ -13,24 +14,26 @@ import 'reload_gallery.dart';
class GalleryPickerView extends StatefulWidget {
final Config? config;
final Function(List<MediaFile> selectedMedias) onSelect;
final Function(List<MediaFile> selectedMedia) onSelect;
final Widget Function(String tag, MediaFile media, BuildContext context)?
heroBuilder;
final Widget Function(List<MediaFile> medias, BuildContext context)?
multipleMediasBuilder;
final Widget Function(List<MediaFile> media, BuildContext context)?
multipleMediaBuilder;
final bool startWithRecent;
final BottomSheetBarController? sheetController;
final List<MediaFile>? initSelectedMedias;
final List<MediaFile>? initSelectedMedia;
final List<MediaFile>? extraRecentMedia;
final bool singleMedia;
const GalleryPickerView(
{super.key,
this.config,
required this.onSelect,
this.initSelectedMedias,
this.initSelectedMedia,
this.extraRecentMedia,
this.singleMedia = false,
this.sheetController,
this.heroBuilder,
this.multipleMediasBuilder,
this.multipleMediaBuilder,
this.startWithRecent = false});
@override
@ -54,8 +57,9 @@ class _GalleryPickerState extends State<GalleryPickerView> {
galleryController = Get.put(PhoneGalleryController(widget.config,
onSelect: widget.onSelect,
heroBuilder: widget.heroBuilder,
multipleMediasBuilder: widget.multipleMediasBuilder,
initSelectedMedias: widget.initSelectedMedias,
multipleMediasBuilder: widget.multipleMediaBuilder,
initSelectedMedias: widget.initSelectedMedia,
extraRecentMedia: widget.extraRecentMedia,
isRecent: widget.startWithRecent));
config = galleryController.config;
}
@ -83,10 +87,15 @@ class _GalleryPickerState extends State<GalleryPickerView> {
super.dispose();
}
GalleryAlbum? selectedAlbum;
@override
Widget build(BuildContext context) {
double width = MediaQuery.of(context).size.width;
return GetBuilder<PhoneGalleryController>(builder: (controller) {
if (controller.selectedAlbum == null && selectedAlbum != null) {
_scrollController = PageController(initialPage: 1);
}
selectedAlbum = controller.selectedAlbum;
return GetInstance().isRegistered<PhoneGalleryController>()
? controller.selectedAlbum == null
? Scaffold(
@ -208,8 +217,9 @@ class _GalleryPickerState extends State<GalleryPickerView> {
galleryController = Get.put(PhoneGalleryController(config,
onSelect: widget.onSelect,
heroBuilder: widget.heroBuilder,
initSelectedMedias: widget.initSelectedMedias,
multipleMediasBuilder: widget.multipleMediasBuilder,
initSelectedMedias: widget.initSelectedMedia,
extraRecentMedia: widget.extraRecentMedia,
multipleMediasBuilder: widget.multipleMediaBuilder,
isRecent: widget.startWithRecent));
await controller.initializeAlbums();
if (bottomSheetController != null) {