Add hero animation to the device folder gallery page

This commit is contained in:
Vishnu Mohandas 2020-07-14 03:03:43 +05:30
parent 06886c858c
commit 2d14356792
13 changed files with 49 additions and 31 deletions

View file

@ -187,6 +187,9 @@ class PhotoSyncManager {
List<File> photosToBeUploaded = await _db.getFilesToBeUploaded();
for (int i = 0; i < photosToBeUploaded.length; i++) {
File file = photosToBeUploaded[i];
if (file.fileType == FileType.video) {
continue;
}
_logger.info("Uploading " + file.toString());
try {
var uploadedFile = await _uploadFile(file);

View file

@ -17,8 +17,10 @@ import 'package:logging/logging.dart';
class DetailPage extends StatefulWidget {
final List<File> files;
final int selectedIndex;
final String tagPrefix;
DetailPage(this.files, this.selectedIndex, {key}) : super(key: key);
DetailPage(this.files, this.selectedIndex, this.tagPrefix, {key})
: super(key: key);
@override
_DetailPageState createState() => _DetailPageState();
@ -74,11 +76,13 @@ class _DetailPageState extends State<DetailPage> {
_shouldDisableScroll = value;
});
},
tagPrefix: widget.tagPrefix,
);
} else if (file.fileType == FileType.video) {
content = VideoWidget(
file,
autoPlay: !_hasPageChanged, // Autoplay if it was opened directly
tagPrefix: widget.tagPrefix,
);
} else {
content = Icon(Icons.error);

View file

@ -46,6 +46,7 @@ class _DeviceFolderPageState extends State<DeviceFolderPage> {
});
},
reloadEvent: Bus.instance.on<LocalPhotosUpdatedEvent>(),
tagPrefix: "device_folder",
),
);
}

View file

@ -2,7 +2,6 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:page_transition/page_transition.dart';
import 'package:photos/core/event_bus.dart';
import 'package:photos/db/file_db.dart';
import 'package:photos/events/local_photos_updated_event.dart';
@ -98,7 +97,9 @@ class _DeviceFolderGalleryWidgetState extends State<DeviceFolderGalleryWidget> {
child: Column(
children: <Widget>[
Container(
child: ThumbnailWidget(folder.thumbnail),
child: Hero(
tag: "device_folder" + folder.thumbnail.tag(),
child: ThumbnailWidget(folder.thumbnail)),
height: 150,
width: 150,
),
@ -115,11 +116,13 @@ class _DeviceFolderGalleryWidgetState extends State<DeviceFolderGalleryWidget> {
],
),
onTap: () {
Navigator.push(
context,
PageTransition(
type: PageTransitionType.rightToLeftWithFade,
child: DeviceFolderPage(folder)));
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
return DeviceFolderPage(folder);
},
),
);
},
);
}

View file

@ -22,6 +22,7 @@ class FaceSearchResultsPage extends StatelessWidget {
body: Container(
child: Gallery(
asyncLoader: () => _faceSearchManager.getFaceSearchResults(face),
tagPrefix: "face_search_results",
),
),
);

View file

@ -23,6 +23,7 @@ class Gallery extends StatefulWidget {
final Future<void> Function() onRefresh;
final Set<File> selectedFiles;
final Function(Set<File>) onFileSelectionChange;
final String tagPrefix;
Gallery({
this.syncLoader,
@ -31,6 +32,7 @@ class Gallery extends StatefulWidget {
this.onRefresh,
this.selectedFiles,
this.onFileSelectionChange,
this.tagPrefix,
});
@override
@ -189,7 +191,7 @@ class _GalleryState extends State<Gallery> {
: null,
),
child: Hero(
tag: file.tag(),
tag: widget.tagPrefix + file.tag(),
child: ThumbnailWidget(file),
),
),
@ -211,6 +213,7 @@ class _GalleryState extends State<Gallery> {
final page = DetailPage(
_files,
_files.indexOf(file),
widget.tagPrefix,
);
Navigator.of(context).push(
MaterialPageRoute(

View file

@ -123,6 +123,7 @@ class _HomeWidgetState extends State<HomeWidget> {
_selectedPhotos = selectedPhotos;
});
},
tagPrefix: "home_gallery",
);
} else if (snapshot.hasError) {
return Center(child: Text(snapshot.error.toString()));

View file

@ -39,6 +39,7 @@ class _LocationSearchResultsPageState extends State<LocationSearchResultsPage> {
body: Container(
child: Gallery(
syncLoader: _getResult,
tagPrefix: "location_search",
),
),
);

View file

@ -33,17 +33,18 @@ class _RemoteFolderPageState extends State<RemoteFolderPage> {
},
),
body: Gallery(
asyncLoader: () => FileDB.instance.getAllInFolder(widget.folder.id),
onRefresh: () =>
FolderSharingService.instance.syncDiff(widget.folder),
selectedFiles: _selectedPhotos,
onFileSelectionChange: (Set<File> selectedPhotos) {
setState(
() {
_selectedPhotos = selectedPhotos;
},
);
}),
asyncLoader: () => FileDB.instance.getAllInFolder(widget.folder.id),
onRefresh: () => FolderSharingService.instance.syncDiff(widget.folder),
selectedFiles: _selectedPhotos,
onFileSelectionChange: (Set<File> selectedPhotos) {
setState(
() {
_selectedPhotos = selectedPhotos;
},
);
},
tagPrefix: "remote_folder",
),
);
}
}

View file

@ -16,7 +16,13 @@ import 'loading_widget.dart';
class VideoWidget extends StatefulWidget {
final File file;
final bool autoPlay;
VideoWidget(this.file, {this.autoPlay = false, Key key}) : super(key: key);
final String tagPrefix;
VideoWidget(
this.file, {
this.autoPlay = false,
this.tagPrefix,
Key key,
}) : super(key: key);
@override
_VideoWidgetState createState() => _VideoWidgetState();
@ -73,7 +79,7 @@ class _VideoWidgetState extends State<VideoWidget> {
? _getVideoPlayer()
: _getLoadingWidget();
return Hero(
tag: widget.file.tag(),
tag: widget.tagPrefix + widget.file.tag(),
child: content,
);
}

View file

@ -12,11 +12,13 @@ import 'package:photos/core/constants.dart';
class ZoomableImage extends StatefulWidget {
final File photo;
final Function(bool) shouldDisableScroll;
final String tagPrefix;
ZoomableImage(
this.photo, {
Key key,
this.shouldDisableScroll,
this.tagPrefix,
}) : super(key: key);
@override
@ -59,7 +61,7 @@ class _ZoomableImageState extends State<ZoomableImage>
minScale: PhotoViewComputedScale.contained,
gaplessPlayback: true,
heroAttributes: PhotoViewHeroAttributes(
tag: widget.photo.tag(),
tag: widget.tagPrefix + widget.photo.tag(),
),
);
} else {

View file

@ -352,13 +352,6 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.0+17"
page_transition:
dependency: "direct main"
description:
name: page_transition
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.5"
path:
dependency: transitive
description:

View file

@ -54,7 +54,6 @@ dependencies:
chewie: ^0.9.10
cached_network_image: ^2.3.0-beta
progress_dialog: ^1.2.4
page_transition: ^1.1.5
dev_dependencies:
flutter_test: