From 755664a8de4ff373349d5ffdfdf376e869e104a2 Mon Sep 17 00:00:00 2001 From: Vishnu Mohandas Date: Tue, 21 Jul 2020 15:55:19 +0530 Subject: [PATCH] Display memories from previous years --- lib/ui/home_widget.dart | 3 +- lib/ui/memories_widget.dart | 113 ++++++++++++++++++++++++++-------- lib/ui/zoomable_image.dart | 2 +- lib/utils/date_time_util.dart | 27 ++++++++ pubspec.lock | 21 +++++++ pubspec.yaml | 1 + 6 files changed, 141 insertions(+), 26 deletions(-) diff --git a/lib/ui/home_widget.dart b/lib/ui/home_widget.dart index 9817b039c..856117517 100644 --- a/lib/ui/home_widget.dart +++ b/lib/ui/home_widget.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:collection'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -16,6 +15,7 @@ import 'package:photos/ui/gallery.dart'; import 'package:photos/ui/gallery_app_bar_widget.dart'; import 'package:photos/ui/loading_photos_widget.dart'; import 'package:photos/ui/loading_widget.dart'; +import 'package:photos/ui/memories_widget.dart'; import 'package:photos/ui/remote_folder_gallery_widget.dart'; import 'package:photos/ui/search_page.dart'; import 'package:photos/utils/logging_util.dart'; @@ -114,6 +114,7 @@ class _HomeWidgetState extends State { onRefresh: PhotoSyncManager.instance.sync, tagPrefix: "home_gallery", selectedFiles: _selectedFiles, + headerWidget: MemoriesWidget(), ); } else if (snapshot.hasError) { return Center(child: Text(snapshot.error.toString())); diff --git a/lib/ui/memories_widget.dart b/lib/ui/memories_widget.dart index fb2db4265..bc8c465b6 100644 --- a/lib/ui/memories_widget.dart +++ b/lib/ui/memories_widget.dart @@ -1,17 +1,15 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:flutter_swiper/flutter_swiper.dart'; import 'package:photos/memory_service.dart'; +import 'package:photos/models/file_type.dart'; import 'package:photos/models/memory.dart'; import 'package:photos/ui/thumbnail_widget.dart'; +import 'package:photos/ui/video_widget.dart'; +import 'package:photos/ui/zoomable_image.dart'; +import 'package:photos/utils/date_time_util.dart'; -class MemoriesWidget extends StatefulWidget { - MemoriesWidget({Key key}) : super(key: key); - - @override - _MemoriesWidgetState createState() => _MemoriesWidgetState(); -} - -class _MemoriesWidgetState extends State { +class MemoriesWidget extends StatelessWidget { @override Widget build(BuildContext context) { return FutureBuilder>( @@ -75,23 +73,37 @@ class MemoryWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - width: 100, - height: 120, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - ClipOval( - child: Container( - width: 76, - height: 76, - child: ThumbnailWidget(memories[0].file), + return GestureDetector( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return FullScreenMemory(memories); + }, + ), + ); + }, + child: Container( + width: 100, + height: 120, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + ClipOval( + child: Container( + width: 76, + height: 76, + child: Hero( + tag: "memories" + memories[0].file.tag(), + child: ThumbnailWidget(memories[0].file), + ), + ), ), - ), - Padding(padding: EdgeInsets.all(2)), - _getTitle(memories[0]), - ], + Padding(padding: EdgeInsets.all(2)), + _getTitle(memories[0]), + ], + ), ), ), ); @@ -108,3 +120,56 @@ class MemoryWidget extends StatelessWidget { } } } + +class FullScreenMemory extends StatefulWidget { + final List memories; + + FullScreenMemory(this.memories, {Key key}) : super(key: key); + + @override + _FullScreenMemoryState createState() => _FullScreenMemoryState(); +} + +class _FullScreenMemoryState extends State { + @override + Widget build(BuildContext context) { + return Material( + type: MaterialType.transparency, + child: Container( + child: new Swiper( + itemBuilder: (BuildContext context, int index) { + final file = widget.memories[index].file; + return Stack(children: [ + file.fileType == FileType.image + ? ZoomableImage( + file, + tagPrefix: "memories", + ) + : VideoWidget(file, tagPrefix: "memories"), + Padding( + padding: const EdgeInsets.fromLTRB(16, 40, 16, 16), + child: Text( + getFormattedDate( + DateTime.fromMicrosecondsSinceEpoch(file.creationTime)), + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ) + ]); + }, + itemCount: widget.memories.length, + pagination: new SwiperPagination( + builder: DotSwiperPaginationBuilder(activeColor: Colors.white)), + control: new SwiperControl(), + loop: false, + autoplay: true, + autoplayDelay: 5000, + autoplayDisableOnInteraction: true, + layout: SwiperLayout.DEFAULT, + ), + ), + ); + } +} diff --git a/lib/ui/zoomable_image.dart b/lib/ui/zoomable_image.dart index 1445510de..65e16812b 100644 --- a/lib/ui/zoomable_image.dart +++ b/lib/ui/zoomable_image.dart @@ -18,7 +18,7 @@ class ZoomableImage extends StatefulWidget { this.photo, { Key key, this.shouldDisableScroll, - this.tagPrefix, + @required this.tagPrefix, }) : super(key: key); @override diff --git a/lib/utils/date_time_util.dart b/lib/utils/date_time_util.dart index a18ff3e26..7dfad5938 100644 --- a/lib/utils/date_time_util.dart +++ b/lib/utils/date_time_util.dart @@ -65,6 +65,16 @@ String getFormattedTime(DateTime dateTime) { getTime(dateTime); } +String getFormattedDate(DateTime dateTime) { + return getDay(dateTime) + + ", " + + getMonth(dateTime) + + " " + + dateTime.day.toString() + + ", " + + dateTime.year.toString(); +} + String formatDuration(Duration position) { final ms = position.inMilliseconds; @@ -87,3 +97,20 @@ String formatDuration(Duration position) { return formattedTime; } + +bool isLeapYear(DateTime dateTime) { + final year = dateTime.year; + if (year % 4 == 0) { + if (year % 100 == 0) { + if (year % 400 == 0) { + return true; + } else { + return false; + } + } else { + return true; + } + } else { + return false; + } +} diff --git a/pubspec.lock b/pubspec.lock index 89fe9d089..c9e1f5371 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -223,6 +223,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.7.5" + flutter_page_indicator: + dependency: transitive + description: + name: flutter_page_indicator + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.3" + flutter_swiper: + dependency: "direct main" + description: + name: flutter_swiper + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" flutter_test: dependency: "direct dev" description: flutter @@ -574,6 +588,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.17" + transformer_page_view: + dependency: transitive + description: + name: transformer_page_view + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.6" typed_data: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 18b1e8665..d23e52907 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,6 +54,7 @@ dependencies: chewie: ^0.9.10 cached_network_image: ^2.3.0-beta progress_dialog: ^1.2.4 + flutter_swiper: ^1.1.6 dev_dependencies: flutter_test: