Merge pull request #878 from ente-io/performance_improvements
Performance improvements
This commit is contained in:
commit
cee012c154
|
@ -5,6 +5,7 @@ import 'package:background_fetch/background_fetch.dart';
|
||||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import "package:flutter/rendering.dart";
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:photos/app.dart';
|
import 'package:photos/app.dart';
|
||||||
|
@ -54,6 +55,7 @@ const kFGTaskDeathTimeoutInMicroseconds = 5000000;
|
||||||
const kBackgroundLockLatency = Duration(seconds: 3);
|
const kBackgroundLockLatency = Duration(seconds: 3);
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
|
debugRepaintRainbowEnabled = false;
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
await _runInForeground();
|
await _runInForeground();
|
||||||
BackgroundFetch.registerHeadlessTask(_headlessTaskHandler);
|
BackgroundFetch.registerHeadlessTask(_headlessTaskHandler);
|
||||||
|
|
|
@ -16,13 +16,13 @@ import 'package:photos/ui/viewer/gallery/empty_state.dart';
|
||||||
import 'package:photos/ui/viewer/gallery/gallery.dart';
|
import 'package:photos/ui/viewer/gallery/gallery.dart';
|
||||||
import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart';
|
import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart';
|
||||||
|
|
||||||
class CollectionPage extends StatefulWidget {
|
class CollectionPage extends StatelessWidget {
|
||||||
final CollectionWithThumbnail c;
|
final CollectionWithThumbnail c;
|
||||||
final String tagPrefix;
|
final String tagPrefix;
|
||||||
final GalleryType appBarType;
|
final GalleryType appBarType;
|
||||||
final bool hasVerifiedLock;
|
final bool hasVerifiedLock;
|
||||||
|
|
||||||
const CollectionPage(
|
CollectionPage(
|
||||||
this.c, {
|
this.c, {
|
||||||
this.tagPrefix = "collection",
|
this.tagPrefix = "collection",
|
||||||
this.appBarType = GalleryType.ownedCollection,
|
this.appBarType = GalleryType.ownedCollection,
|
||||||
|
@ -30,42 +30,24 @@ class CollectionPage extends StatefulWidget {
|
||||||
Key? key,
|
Key? key,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
|
||||||
State<CollectionPage> createState() => _CollectionPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _CollectionPageState extends State<CollectionPage> {
|
|
||||||
final _selectedFiles = SelectedFiles();
|
final _selectedFiles = SelectedFiles();
|
||||||
|
|
||||||
final GlobalKey shareButtonKey = GlobalKey();
|
final GlobalKey shareButtonKey = GlobalKey();
|
||||||
final ValueNotifier<double> _bottomPosition = ValueNotifier(-150.0);
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
_selectedFiles.addListener(_selectedFilesListener);
|
|
||||||
super.initState();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
_selectedFiles.removeListener(_selectedFilesListener);
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(Object context) {
|
Widget build(Object context) {
|
||||||
if (widget.hasVerifiedLock == false && widget.c.collection.isHidden()) {
|
if (hasVerifiedLock == false && c.collection.isHidden()) {
|
||||||
return const EmptyState();
|
return const EmptyState();
|
||||||
}
|
}
|
||||||
|
|
||||||
final appBarTypeValue = _getGalleryType(widget.c.collection);
|
final appBarTypeValue = _getGalleryType(c.collection);
|
||||||
final List<File>? initialFiles =
|
final List<File>? initialFiles =
|
||||||
widget.c.thumbnail != null ? [widget.c.thumbnail!] : null;
|
c.thumbnail != null ? [c.thumbnail!] : null;
|
||||||
final gallery = Gallery(
|
final gallery = Gallery(
|
||||||
asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) async {
|
asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) async {
|
||||||
final FileLoadResult result =
|
final FileLoadResult result =
|
||||||
await FilesDB.instance.getFilesInCollection(
|
await FilesDB.instance.getFilesInCollection(
|
||||||
widget.c.collection.id,
|
c.collection.id,
|
||||||
creationStartTime,
|
creationStartTime,
|
||||||
creationEndTime,
|
creationEndTime,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
|
@ -82,25 +64,25 @@ class _CollectionPageState extends State<CollectionPage> {
|
||||||
},
|
},
|
||||||
reloadEvent: Bus.instance
|
reloadEvent: Bus.instance
|
||||||
.on<CollectionUpdatedEvent>()
|
.on<CollectionUpdatedEvent>()
|
||||||
.where((event) => event.collectionID == widget.c.collection.id),
|
.where((event) => event.collectionID == c.collection.id),
|
||||||
removalEventTypes: const {
|
removalEventTypes: const {
|
||||||
EventType.deletedFromRemote,
|
EventType.deletedFromRemote,
|
||||||
EventType.deletedFromEverywhere,
|
EventType.deletedFromEverywhere,
|
||||||
EventType.hide,
|
EventType.hide,
|
||||||
},
|
},
|
||||||
tagPrefix: widget.tagPrefix,
|
tagPrefix: tagPrefix,
|
||||||
selectedFiles: _selectedFiles,
|
selectedFiles: _selectedFiles,
|
||||||
initialFiles: initialFiles,
|
initialFiles: initialFiles,
|
||||||
albumName: widget.c.collection.name,
|
albumName: c.collection.name,
|
||||||
);
|
);
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: PreferredSize(
|
appBar: PreferredSize(
|
||||||
preferredSize: const Size.fromHeight(50.0),
|
preferredSize: const Size.fromHeight(50.0),
|
||||||
child: GalleryAppBarWidget(
|
child: GalleryAppBarWidget(
|
||||||
appBarTypeValue,
|
appBarTypeValue,
|
||||||
widget.c.collection.name,
|
c.collection.name,
|
||||||
_selectedFiles,
|
_selectedFiles,
|
||||||
collection: widget.c.collection,
|
collection: c.collection,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
body: Stack(
|
body: Stack(
|
||||||
|
@ -110,7 +92,7 @@ class _CollectionPageState extends State<CollectionPage> {
|
||||||
FileSelectionOverlayBar(
|
FileSelectionOverlayBar(
|
||||||
appBarTypeValue,
|
appBarTypeValue,
|
||||||
_selectedFiles,
|
_selectedFiles,
|
||||||
collection: widget.c.collection,
|
collection: c.collection,
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -129,12 +111,6 @@ class _CollectionPageState extends State<CollectionPage> {
|
||||||
} else if (c.type == CollectionType.favorites) {
|
} else if (c.type == CollectionType.favorites) {
|
||||||
return GalleryType.favorite;
|
return GalleryType.favorite;
|
||||||
}
|
}
|
||||||
return widget.appBarType;
|
return appBarType;
|
||||||
}
|
|
||||||
|
|
||||||
_selectedFilesListener() {
|
|
||||||
_selectedFiles.files.isNotEmpty
|
|
||||||
? _bottomPosition.value = 0.0
|
|
||||||
: _bottomPosition.value = -150.0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ import 'package:photos/ui/viewer/gallery/gallery.dart';
|
||||||
import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart';
|
import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart';
|
||||||
import 'package:photos/utils/delete_file_util.dart';
|
import 'package:photos/utils/delete_file_util.dart';
|
||||||
|
|
||||||
class TrashPage extends StatefulWidget {
|
class TrashPage extends StatelessWidget {
|
||||||
final String tagPrefix;
|
final String tagPrefix;
|
||||||
final GalleryType appBarType;
|
final GalleryType appBarType;
|
||||||
final GalleryType overlayType;
|
final GalleryType overlayType;
|
||||||
|
@ -26,30 +26,9 @@ class TrashPage extends StatefulWidget {
|
||||||
Key? key,
|
Key? key,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
|
||||||
State<TrashPage> createState() => _TrashPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _TrashPageState extends State<TrashPage> {
|
|
||||||
late Function() _selectedFilesListener;
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
_selectedFilesListener = () {
|
|
||||||
setState(() {});
|
|
||||||
};
|
|
||||||
widget._selectedFiles.addListener(_selectedFilesListener);
|
|
||||||
super.initState();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
widget._selectedFiles.removeListener(_selectedFilesListener);
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(Object context) {
|
Widget build(Object context) {
|
||||||
final bool filesAreSelected = widget._selectedFiles.files.isNotEmpty;
|
final bool filesAreSelected = _selectedFiles.files.isNotEmpty;
|
||||||
|
|
||||||
final gallery = Gallery(
|
final gallery = Gallery(
|
||||||
asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) {
|
asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) {
|
||||||
|
@ -70,8 +49,8 @@ class _TrashPageState extends State<TrashPage> {
|
||||||
forceReloadEvents: [
|
forceReloadEvents: [
|
||||||
Bus.instance.on<ForceReloadTrashPageEvent>(),
|
Bus.instance.on<ForceReloadTrashPageEvent>(),
|
||||||
],
|
],
|
||||||
tagPrefix: widget.tagPrefix,
|
tagPrefix: tagPrefix,
|
||||||
selectedFiles: widget._selectedFiles,
|
selectedFiles: _selectedFiles,
|
||||||
header: _headerWidget(),
|
header: _headerWidget(),
|
||||||
initialFiles: null,
|
initialFiles: null,
|
||||||
);
|
);
|
||||||
|
@ -80,9 +59,9 @@ class _TrashPageState extends State<TrashPage> {
|
||||||
appBar: PreferredSize(
|
appBar: PreferredSize(
|
||||||
preferredSize: const Size.fromHeight(50.0),
|
preferredSize: const Size.fromHeight(50.0),
|
||||||
child: GalleryAppBarWidget(
|
child: GalleryAppBarWidget(
|
||||||
widget.appBarType,
|
appBarType,
|
||||||
"Trash",
|
"Trash",
|
||||||
widget._selectedFiles,
|
_selectedFiles,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
body: Stack(
|
body: Stack(
|
||||||
|
@ -109,7 +88,7 @@ class _TrashPageState extends State<TrashPage> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
FileSelectionOverlayBar(GalleryType.trash, widget._selectedFiles)
|
FileSelectionOverlayBar(GalleryType.trash, _selectedFiles)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -13,6 +13,7 @@ import 'package:photos/core/event_bus.dart';
|
||||||
import 'package:photos/db/files_db.dart';
|
import 'package:photos/db/files_db.dart';
|
||||||
import 'package:photos/events/collection_updated_event.dart';
|
import 'package:photos/events/collection_updated_event.dart';
|
||||||
import 'package:photos/events/files_updated_event.dart';
|
import 'package:photos/events/files_updated_event.dart';
|
||||||
|
import "package:photos/events/force_reload_trash_page_event.dart";
|
||||||
import 'package:photos/events/local_photos_updated_event.dart';
|
import 'package:photos/events/local_photos_updated_event.dart';
|
||||||
import 'package:photos/models/file.dart';
|
import 'package:photos/models/file.dart';
|
||||||
import 'package:photos/models/selected_files.dart';
|
import 'package:photos/models/selected_files.dart';
|
||||||
|
@ -264,6 +265,9 @@ Future<bool> deleteFromTrash(BuildContext context, List<File> files) async {
|
||||||
source: "deleteFromTrash",
|
source: "deleteFromTrash",
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
//the FilesUpdateEvent is not reloading trash on premanently removing
|
||||||
|
//files, so need to fire ForceReloadTrashPageEvent
|
||||||
|
Bus.instance.fire(ForceReloadTrashPageEvent());
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
_logger.info("failed to delete from trash", e, s);
|
_logger.info("failed to delete from trash", e, s);
|
||||||
rethrow;
|
rethrow;
|
||||||
|
|
Loading…
Reference in a new issue