From af59fa397141c418aca78193fcf9b7cc830d40ae Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Sep 2022 10:31:05 +0530 Subject: [PATCH 1/8] Make dateTimeUtil null safe --- lib/data/holidays.dart | 32 ++++++++++---------- lib/models/search/holiday_search_result.dart | 2 +- lib/utils/date_time_util.dart | 19 ++++++------ 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/lib/data/holidays.dart b/lib/data/holidays.dart index 150b55a63..d9ca36ffc 100644 --- a/lib/data/holidays.dart +++ b/lib/data/holidays.dart @@ -1,20 +1,20 @@ import 'package:photos/models/search/holiday_search_result.dart'; const List allHolidays = [ - HolidayData('New Year', 1, 1), - HolidayData('Epiphany', 1, 6), - HolidayData('Pongal', 1, 14), - HolidayData('Makar Sankranthi', 1, 14), - HolidayData('Valentine\'s Day', 2, 14), - HolidayData('Nowruz', 3, 21), - HolidayData('Walpurgis Night', 4, 30), - HolidayData('Vappu', 4, 30), - HolidayData('May Day', 5, 1), - HolidayData('Midsummer\'s Eve', 6, 24), - HolidayData('Midsummer Day', 6, 25), - HolidayData('Christmas Eve', 12, 24), - HolidayData('Halloween', 10, 31), - HolidayData('Christmas', 12, 25), - HolidayData('Boxing Day', 12, 26), - HolidayData('New Year\'s Eve', 12, 31), + HolidayData('New Year', month: 1, day: 1), + HolidayData('Epiphany', month: 1, day: 6), + HolidayData('Pongal', month: 1, day: 14), + HolidayData('Makar Sankranthi', month: 1, day: 14), + HolidayData('Valentine\'s Day', month: 2, day: 14), + HolidayData('Nowruz', month: 3, day: 21), + HolidayData('Walpurgis Night', month: 4, day: 30), + HolidayData('Vappu', month: 4, day: 30), + HolidayData('May Day', month: 5, day: 1), + HolidayData('Midsummer\'s Eve', month: 6, day: 24), + HolidayData('Midsummer Day', month: 6, day: 25), + HolidayData('Christmas Eve', month: 12, day: 24), + HolidayData('Halloween', month: 10, day: 31), + HolidayData('Christmas', month: 12, day: 25), + HolidayData('Boxing Day', month: 12, day: 26), + HolidayData('New Year\'s Eve', month: 12, day: 31), ]; diff --git a/lib/models/search/holiday_search_result.dart b/lib/models/search/holiday_search_result.dart index e060d7275..9ef1685e2 100644 --- a/lib/models/search/holiday_search_result.dart +++ b/lib/models/search/holiday_search_result.dart @@ -11,5 +11,5 @@ class HolidayData { final String name; final int month; final int day; - const HolidayData(this.name, this.month, this.day); + const HolidayData(this.name, {required this.month, required this.day}); } diff --git a/lib/utils/date_time_util.dart b/lib/utils/date_time_util.dart index 6da8645ba..38eec4f29 100644 --- a/lib/utils/date_time_util.dart +++ b/lib/utils/date_time_util.dart @@ -1,5 +1,3 @@ -// @dart=2.9 - import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -52,32 +50,32 @@ String getMonthAndYear(DateTime dateTime) { //Thu, 30 Jun String getDayAndMonth(DateTime dateTime) { - return _days[dateTime.weekday] + + return _days[dateTime.weekday]! + ", " + dateTime.day.toString() + " " + - _months[dateTime.month]; + _months[dateTime.month]!; } //30 Jun, 2022 String getDateAndMonthAndYear(DateTime dateTime) { return dateTime.day.toString() + " " + - _months[dateTime.month] + + _months[dateTime.month]! + ", " + dateTime.year.toString(); } String getDay(DateTime dateTime) { - return _days[dateTime.weekday]; + return _days[dateTime.weekday]!; } String getMonth(DateTime dateTime) { - return _months[dateTime.month]; + return _months[dateTime.month]!; } String getFullMonth(DateTime dateTime) { - return _fullMonths[dateTime.month]; + return _fullMonths[dateTime.month]!; } String getAbbreviationOfYear(DateTime dateTime) { @@ -201,7 +199,7 @@ Widget getDayWidget( getDayTitle(timestamp), style: (getDayTitle(timestamp) == "Today" && !smallerTodayFont) ? Theme.of(context).textTheme.headline5 - : Theme.of(context).textTheme.caption.copyWith( + : Theme.of(context).textTheme.caption?.copyWith( fontSize: 16, fontWeight: FontWeight.w600, fontFamily: 'Inter-SemiBold', @@ -232,7 +230,8 @@ String secondsToHHMMSS(int value) { h = value ~/ 3600; m = ((value - h * 3600)) ~/ 60; s = value - (h * 3600) - (m * 60); - final String hourLeft = h.toString().length < 2 ? "0" + h.toString() : h.toString(); + final String hourLeft = + h.toString().length < 2 ? "0" + h.toString() : h.toString(); final String minuteLeft = m.toString().length < 2 ? "0" + m.toString() : m.toString(); From 40ddbc968fa74379c55892b99394034dc667d428 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Sep 2022 09:28:27 +0530 Subject: [PATCH 2/8] SearchService: mark method getAllFiles as private --- lib/services/search_service.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/services/search_service.dart b/lib/services/search_service.dart index 961ea0045..80cdf479c 100644 --- a/lib/services/search_service.dart +++ b/lib/services/search_service.dart @@ -40,27 +40,28 @@ class SearchService { /* In case home screen loads before 5 seconds and user starts search, future will not be null.So here getAllFiles won't run again in that case. */ if (_cachedFilesFuture == null) { - getAllFiles(); + _getAllFiles(); } }); Bus.instance.on().listen((event) { _cachedFilesFuture = null; - getAllFiles(); + _getAllFiles(); }); } - Future> getAllFiles() async { + Future> _getAllFiles() async { if (_cachedFilesFuture != null) { return _cachedFilesFuture; } + _logger.fine("Reading all files from db"); _cachedFilesFuture = FilesDB.instance.getAllFilesFromDB(); return _cachedFilesFuture; } Future> getFileSearchResults(String query) async { final List fileSearchResults = []; - final List files = await getAllFiles(); + final List files = await _getAllFiles(); final nonCaseSensitiveRegexForQuery = RegExp(query, caseSensitive: false); for (var file in files) { if (fileSearchResults.length >= _maximumResultsLimit) { @@ -82,7 +83,7 @@ class SearchService { ) async { final List locationSearchResults = []; try { - final List allFiles = await SearchService.instance.getAllFiles(); + final List allFiles = await _getAllFiles(); final response = await _dio.get( _config.getHttpEndpoint() + "/search/location", From f20bf786b95bff88ba30ed441373f67d2ae75837 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Sep 2022 14:03:12 +0530 Subject: [PATCH 3/8] Refactor search widgets --- lib/models/search/album_search_result.dart | 22 +++++ lib/models/search/file_search_result.dart | 21 +++++ lib/models/search/holiday_search_result.dart | 22 +++++ lib/models/search/location_search_result.dart | 20 ++++ lib/models/search/month_search_result.dart | 22 +++++ lib/models/search/search_results.dart | 18 +++- lib/models/search/year_search_result.dart | 20 ++++ .../collections/files_from_holiday_page.dart | 77 ---------------- .../collections/files_from_year_page.dart | 77 ---------------- .../collections/files_in_location_page.dart | 77 ---------------- .../file_result_widget.dart | 5 +- .../no_result_widget.dart | 0 .../search_result_page.dart} | 24 ++--- .../search_result_widget.dart} | 61 +++++++------ .../search_thumbnail_widget.dart} | 4 +- .../holiday_result_widget.dart | 91 ------------------- .../location_result_widget.dart | 91 ------------------- .../month_result_widget.dart | 91 ------------------- .../year_result_widget.dart | 87 ------------------ lib/ui/viewer/search/search_suggestions.dart | 40 +++++--- lib/ui/viewer/search/search_widget.dart | 2 +- lib/utils/date_time_util.dart | 2 +- 22 files changed, 221 insertions(+), 653 deletions(-) delete mode 100644 lib/ui/viewer/search/collections/files_from_holiday_page.dart delete mode 100644 lib/ui/viewer/search/collections/files_from_year_page.dart delete mode 100644 lib/ui/viewer/search/collections/files_in_location_page.dart rename lib/ui/viewer/search/{search_result_widgets => result}/file_result_widget.dart (94%) rename lib/ui/viewer/search/{search_result_widgets => result}/no_result_widget.dart (100%) rename lib/ui/viewer/search/{collections/files_from_month_page.dart => result/search_result_page.dart} (79%) rename lib/ui/viewer/search/{search_result_widgets/collection_result_widget.dart => result/search_result_widget.dart} (67%) rename lib/ui/viewer/search/{search_result_widgets/search_result_thumbnail_widget.dart => result/search_thumbnail_widget.dart} (86%) delete mode 100644 lib/ui/viewer/search/search_result_widgets/holiday_result_widget.dart delete mode 100644 lib/ui/viewer/search/search_result_widgets/location_result_widget.dart delete mode 100644 lib/ui/viewer/search/search_result_widgets/month_result_widget.dart delete mode 100644 lib/ui/viewer/search/search_result_widgets/year_result_widget.dart diff --git a/lib/models/search/album_search_result.dart b/lib/models/search/album_search_result.dart index 5ce2b8874..58c4a9ef9 100644 --- a/lib/models/search/album_search_result.dart +++ b/lib/models/search/album_search_result.dart @@ -1,8 +1,30 @@ import 'package:photos/models/collection_items.dart'; +import 'package:photos/models/file.dart'; import 'package:photos/models/search/search_results.dart'; class AlbumSearchResult extends SearchResult { final CollectionWithThumbnail collectionWithThumbnail; AlbumSearchResult(this.collectionWithThumbnail); + + @override + ResultType type() { + return ResultType.collection; + } + + @override + String name() { + return collectionWithThumbnail.collection.name; + } + + @override + File previewThumbnail() { + return collectionWithThumbnail.thumbnail; + } + + @override + List resultFiles() { + // for album search result, we should open the album page directly + throw UnimplementedError(); + } } diff --git a/lib/models/search/file_search_result.dart b/lib/models/search/file_search_result.dart index c89572c1b..c4bf2c7ec 100644 --- a/lib/models/search/file_search_result.dart +++ b/lib/models/search/file_search_result.dart @@ -5,4 +5,25 @@ class FileSearchResult extends SearchResult { final File file; FileSearchResult(this.file); + + @override + String name() { + return file.getDisplayName(); + } + + @override + ResultType type() { + return ResultType.file; + } + + @override + File previewThumbnail() { + return file; + } + + @override + List resultFiles() { + // for fileSearchResult, the file detailed page view will be opened + throw UnimplementedError(); + } } diff --git a/lib/models/search/holiday_search_result.dart b/lib/models/search/holiday_search_result.dart index 9ef1685e2..af98f3994 100644 --- a/lib/models/search/holiday_search_result.dart +++ b/lib/models/search/holiday_search_result.dart @@ -4,12 +4,34 @@ import 'package:photos/models/search/search_results.dart'; class HolidaySearchResult extends SearchResult { final String holidayName; final List files; + HolidaySearchResult(this.holidayName, this.files); + + @override + String name() { + return holidayName; + } + + @override + ResultType type() { + return ResultType.event; + } + + @override + File previewThumbnail() { + return files[0]; + } + + @override + List resultFiles() { + return files; + } } class HolidayData { final String name; final int month; final int day; + const HolidayData(this.name, {required this.month, required this.day}); } diff --git a/lib/models/search/location_search_result.dart b/lib/models/search/location_search_result.dart index 43322243c..def798427 100644 --- a/lib/models/search/location_search_result.dart +++ b/lib/models/search/location_search_result.dart @@ -6,4 +6,24 @@ class LocationSearchResult extends SearchResult { final List files; LocationSearchResult(this.location, this.files); + + @override + String name() { + return location; + } + + @override + ResultType type() { + return ResultType.location; + } + + @override + File previewThumbnail() { + return files.first; + } + + @override + List resultFiles() { + return files; + } } diff --git a/lib/models/search/month_search_result.dart b/lib/models/search/month_search_result.dart index 6a4405732..df01ab856 100644 --- a/lib/models/search/month_search_result.dart +++ b/lib/models/search/month_search_result.dart @@ -4,11 +4,33 @@ import 'package:photos/models/search/search_results.dart'; class MonthSearchResult extends SearchResult { final String month; final List files; + MonthSearchResult(this.month, this.files); + + @override + String name() { + return month; + } + + @override + ResultType type() { + return ResultType.month; + } + + @override + File previewThumbnail() { + return files.first; + } + + @override + List resultFiles() { + return files; + } } class MonthData { final String name; final int monthNumber; + MonthData(this.name, this.monthNumber); } diff --git a/lib/models/search/search_results.dart b/lib/models/search/search_results.dart index d0823c130..69f1636b5 100644 --- a/lib/models/search/search_results.dart +++ b/lib/models/search/search_results.dart @@ -1 +1,17 @@ -class SearchResult {} +import 'package:photos/models/file.dart'; + +abstract class SearchResult { + ResultType type(); + + String name(); + + File previewThumbnail(); + + String heroTag() { + return '${type().toString()}_${name()}'; + } + + List resultFiles(); +} + +enum ResultType { collection, file, location, month, year, fileType, event } diff --git a/lib/models/search/year_search_result.dart b/lib/models/search/year_search_result.dart index 39661696e..97a814ba5 100644 --- a/lib/models/search/year_search_result.dart +++ b/lib/models/search/year_search_result.dart @@ -6,4 +6,24 @@ class YearSearchResult extends SearchResult { final List files; YearSearchResult(this.year, this.files); + + @override + String name() { + return year; + } + + @override + ResultType type() { + return ResultType.year; + } + + @override + File previewThumbnail() { + return files.first; + } + + @override + List resultFiles() { + return files; + } } diff --git a/lib/ui/viewer/search/collections/files_from_holiday_page.dart b/lib/ui/viewer/search/collections/files_from_holiday_page.dart deleted file mode 100644 index d3f95837c..000000000 --- a/lib/ui/viewer/search/collections/files_from_holiday_page.dart +++ /dev/null @@ -1,77 +0,0 @@ -// @dart=2.9 - -import 'package:flutter/material.dart'; -import 'package:photos/core/event_bus.dart'; -import 'package:photos/events/files_updated_event.dart'; -import 'package:photos/events/local_photos_updated_event.dart'; -import 'package:photos/models/file_load_result.dart'; -import 'package:photos/models/gallery_type.dart'; -import 'package:photos/models/search/holiday_search_result.dart'; -import 'package:photos/models/selected_files.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_overlay_widget.dart'; - -class FilesFromHolidayPage extends StatelessWidget { - final HolidaySearchResult holidaySearchResult; - final String tagPrefix; - - final _selectedFiles = SelectedFiles(); - static const GalleryType appBarType = GalleryType.searchResults; - static const GalleryType overlayType = GalleryType.searchResults; - - FilesFromHolidayPage( - this.holidaySearchResult, - this.tagPrefix, { - Key key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - final gallery = Gallery( - asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) { - final result = holidaySearchResult.files - .where( - (file) => - file.creationTime >= creationStartTime && - file.creationTime <= creationEndTime, - ) - .toList(); - return Future.value( - FileLoadResult( - result, - result.length < holidaySearchResult.files.length, - ), - ); - }, - reloadEvent: Bus.instance.on(), - removalEventTypes: const { - EventType.deletedFromRemote, - EventType.deletedFromEverywhere, - }, - tagPrefix: tagPrefix, - selectedFiles: _selectedFiles, - initialFiles: [holidaySearchResult.files[0]], - ); - return Scaffold( - appBar: PreferredSize( - preferredSize: const Size.fromHeight(50.0), - child: GalleryAppBarWidget( - appBarType, - holidaySearchResult.holidayName, - _selectedFiles, - ), - ), - body: Stack( - alignment: Alignment.bottomCenter, - children: [ - gallery, - GalleryOverlayWidget( - overlayType, - _selectedFiles, - ) - ], - ), - ); - } -} diff --git a/lib/ui/viewer/search/collections/files_from_year_page.dart b/lib/ui/viewer/search/collections/files_from_year_page.dart deleted file mode 100644 index 4faccf57b..000000000 --- a/lib/ui/viewer/search/collections/files_from_year_page.dart +++ /dev/null @@ -1,77 +0,0 @@ -// @dart=2.9 - -import 'package:flutter/material.dart'; -import 'package:photos/core/event_bus.dart'; -import 'package:photos/events/files_updated_event.dart'; -import 'package:photos/events/local_photos_updated_event.dart'; -import 'package:photos/models/file_load_result.dart'; -import 'package:photos/models/gallery_type.dart'; -import 'package:photos/models/search/year_search_result.dart'; -import 'package:photos/models/selected_files.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_overlay_widget.dart'; - -class FilesFromYearPage extends StatelessWidget { - final YearSearchResult yearSearchResult; - final String tagPrefix; - - final _selectedFiles = SelectedFiles(); - static const GalleryType appBarType = GalleryType.searchResults; - static const GalleryType overlayType = GalleryType.searchResults; - - FilesFromYearPage( - this.yearSearchResult, - this.tagPrefix, { - Key key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - final gallery = Gallery( - asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) { - final result = yearSearchResult.files - .where( - (file) => - file.creationTime >= creationStartTime && - file.creationTime <= creationEndTime, - ) - .toList(); - return Future.value( - FileLoadResult( - result, - result.length < yearSearchResult.files.length, - ), - ); - }, - reloadEvent: Bus.instance.on(), - removalEventTypes: const { - EventType.deletedFromRemote, - EventType.deletedFromEverywhere, - }, - tagPrefix: tagPrefix, - selectedFiles: _selectedFiles, - initialFiles: [yearSearchResult.files[0]], - ); - return Scaffold( - appBar: PreferredSize( - preferredSize: const Size.fromHeight(50.0), - child: GalleryAppBarWidget( - appBarType, - yearSearchResult.year.toString(), - _selectedFiles, - ), - ), - body: Stack( - alignment: Alignment.bottomCenter, - children: [ - gallery, - GalleryOverlayWidget( - overlayType, - _selectedFiles, - ) - ], - ), - ); - } -} diff --git a/lib/ui/viewer/search/collections/files_in_location_page.dart b/lib/ui/viewer/search/collections/files_in_location_page.dart deleted file mode 100644 index f39391bc1..000000000 --- a/lib/ui/viewer/search/collections/files_in_location_page.dart +++ /dev/null @@ -1,77 +0,0 @@ -// @dart=2.9 - -import 'package:flutter/material.dart'; -import 'package:photos/core/event_bus.dart'; -import 'package:photos/events/files_updated_event.dart'; -import 'package:photos/events/local_photos_updated_event.dart'; -import 'package:photos/models/file_load_result.dart'; -import 'package:photos/models/gallery_type.dart'; -import 'package:photos/models/search/location_search_result.dart'; -import 'package:photos/models/selected_files.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_overlay_widget.dart'; - -class FilesInLocationPage extends StatelessWidget { - final LocationSearchResult locationSearchResult; - final String tagPrefix; - - final _selectedFiles = SelectedFiles(); - static const GalleryType appBarType = GalleryType.searchResults; - static const GalleryType overlayType = GalleryType.searchResults; - - FilesInLocationPage( - this.locationSearchResult, - this.tagPrefix, { - Key key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - final gallery = Gallery( - asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) { - final result = locationSearchResult.files - .where( - (file) => - file.creationTime >= creationStartTime && - file.creationTime <= creationEndTime, - ) - .toList(); - return Future.value( - FileLoadResult( - result, - result.length < locationSearchResult.files.length, - ), - ); - }, - reloadEvent: Bus.instance.on(), - removalEventTypes: const { - EventType.deletedFromRemote, - EventType.deletedFromEverywhere, - }, - tagPrefix: tagPrefix, - selectedFiles: _selectedFiles, - initialFiles: [locationSearchResult.files[0]], - ); - return Scaffold( - appBar: PreferredSize( - preferredSize: const Size.fromHeight(50.0), - child: GalleryAppBarWidget( - appBarType, - locationSearchResult.location, - _selectedFiles, - ), - ), - body: Stack( - alignment: Alignment.bottomCenter, - children: [ - gallery, - GalleryOverlayWidget( - overlayType, - _selectedFiles, - ) - ], - ), - ); - } -} diff --git a/lib/ui/viewer/search/search_result_widgets/file_result_widget.dart b/lib/ui/viewer/search/result/file_result_widget.dart similarity index 94% rename from lib/ui/viewer/search/search_result_widgets/file_result_widget.dart rename to lib/ui/viewer/search/result/file_result_widget.dart index bf03d0a4c..94dda7b70 100644 --- a/lib/ui/viewer/search/search_result_widgets/file_result_widget.dart +++ b/lib/ui/viewer/search/result/file_result_widget.dart @@ -5,11 +5,12 @@ import 'package:photos/ente_theme_data.dart'; import 'package:photos/models/file.dart'; import 'package:photos/models/search/file_search_result.dart'; import 'package:photos/ui/viewer/file/detail_page.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/search_result_thumbnail_widget.dart'; +import 'package:photos/ui/viewer/search/result/search_thumbnail_widget.dart'; import 'package:photos/utils/navigation_util.dart'; class FileSearchResultWidget extends StatelessWidget { final FileSearchResult matchedFile; + const FileSearchResultWidget(this.matchedFile, {Key key}) : super(key: key); @override @@ -24,7 +25,7 @@ class FileSearchResultWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ - SearchResultThumbnailWidget( + SearchThumbnailWidget( matchedFile.file, "file_details", ), diff --git a/lib/ui/viewer/search/search_result_widgets/no_result_widget.dart b/lib/ui/viewer/search/result/no_result_widget.dart similarity index 100% rename from lib/ui/viewer/search/search_result_widgets/no_result_widget.dart rename to lib/ui/viewer/search/result/no_result_widget.dart diff --git a/lib/ui/viewer/search/collections/files_from_month_page.dart b/lib/ui/viewer/search/result/search_result_page.dart similarity index 79% rename from lib/ui/viewer/search/collections/files_from_month_page.dart rename to lib/ui/viewer/search/result/search_result_page.dart index d55e3de71..51eff08e9 100644 --- a/lib/ui/viewer/search/collections/files_from_month_page.dart +++ b/lib/ui/viewer/search/result/search_result_page.dart @@ -4,33 +4,33 @@ import 'package:flutter/material.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/events/files_updated_event.dart'; import 'package:photos/events/local_photos_updated_event.dart'; +import 'package:photos/models/file.dart'; import 'package:photos/models/file_load_result.dart'; import 'package:photos/models/gallery_type.dart'; -import 'package:photos/models/search/month_search_result.dart'; +import 'package:photos/models/search/search_results.dart'; import 'package:photos/models/selected_files.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_overlay_widget.dart'; -class FilesFromMonthPage extends StatelessWidget { - final MonthSearchResult monthSearchResult; - final String tagPrefix; +class SearchResultPage extends StatelessWidget { + final SearchResult searchResult; final _selectedFiles = SelectedFiles(); static const GalleryType appBarType = GalleryType.searchResults; static const GalleryType overlayType = GalleryType.searchResults; - FilesFromMonthPage( - this.monthSearchResult, - this.tagPrefix, { + SearchResultPage( + this.searchResult, { Key key, }) : super(key: key); @override Widget build(BuildContext context) { + final List files = searchResult.resultFiles(); final gallery = Gallery( asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) { - final result = monthSearchResult.files + final result = files .where( (file) => file.creationTime >= creationStartTime && @@ -40,7 +40,7 @@ class FilesFromMonthPage extends StatelessWidget { return Future.value( FileLoadResult( result, - result.length < monthSearchResult.files.length, + result.length < files.length, ), ); }, @@ -49,16 +49,16 @@ class FilesFromMonthPage extends StatelessWidget { EventType.deletedFromRemote, EventType.deletedFromEverywhere, }, - tagPrefix: tagPrefix, + tagPrefix: searchResult.heroTag(), selectedFiles: _selectedFiles, - initialFiles: [monthSearchResult.files[0]], + initialFiles: [searchResult.previewThumbnail()], ); return Scaffold( appBar: PreferredSize( preferredSize: const Size.fromHeight(50.0), child: GalleryAppBarWidget( appBarType, - monthSearchResult.month, + searchResult.name(), _selectedFiles, ), ), diff --git a/lib/ui/viewer/search/search_result_widgets/collection_result_widget.dart b/lib/ui/viewer/search/result/search_result_widget.dart similarity index 67% rename from lib/ui/viewer/search/search_result_widgets/collection_result_widget.dart rename to lib/ui/viewer/search/result/search_result_widget.dart index b135bc183..b448e0f78 100644 --- a/lib/ui/viewer/search/search_result_widgets/collection_result_widget.dart +++ b/lib/ui/viewer/search/result/search_result_widget.dart @@ -1,21 +1,26 @@ -// @dart=2.9 - import 'package:flutter/material.dart'; -import 'package:photos/db/files_db.dart'; import 'package:photos/ente_theme_data.dart'; -import 'package:photos/models/search/album_search_result.dart'; -import 'package:photos/ui/viewer/gallery/collection_page.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/search_result_thumbnail_widget.dart'; +import 'package:photos/models/search/search_results.dart'; +import 'package:photos/ui/viewer/search/result/search_result_page.dart'; +import 'package:photos/ui/viewer/search/result/search_thumbnail_widget.dart'; import 'package:photos/utils/navigation_util.dart'; -class AlbumSearchResultWidget extends StatelessWidget { - final AlbumSearchResult albumSearchResult; +class SearchResultWidget extends StatelessWidget { + final SearchResult searchResult; + final Future? resultCount; + final Function? onResultTap; - const AlbumSearchResultWidget(this.albumSearchResult, {Key key}) - : super(key: key); + const SearchResultWidget( + this.searchResult, { + Key? key, + this.resultCount, + this.onResultTap, + }) : super(key: key); @override Widget build(BuildContext context) { + final heroTagPrefix = searchResult.heroTag(); + return GestureDetector( behavior: HitTestBehavior.opaque, child: Container( @@ -23,19 +28,19 @@ class AlbumSearchResultWidget extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), child: Row( - mainAxisAlignment: MainAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ - SearchResultThumbnailWidget( - albumSearchResult.collectionWithThumbnail.thumbnail, - "collection_search", + SearchThumbnailWidget( + searchResult.previewThumbnail(), + heroTagPrefix, ), const SizedBox(width: 16), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Album', + searchResult.type().name, style: TextStyle( fontSize: 12, color: Theme.of(context).colorScheme.subTextColor, @@ -45,18 +50,17 @@ class AlbumSearchResultWidget extends StatelessWidget { SizedBox( width: 220, child: Text( - albumSearchResult.collectionWithThumbnail.collection.name, + searchResult.name(), style: const TextStyle(fontSize: 18), overflow: TextOverflow.ellipsis, ), ), const SizedBox(height: 2), FutureBuilder( - future: FilesDB.instance.collectionFileCount( - albumSearchResult.collectionWithThumbnail.collection.id, - ), + future: resultCount ?? + Future.value(searchResult.resultFiles().length), builder: (context, snapshot) { - if (snapshot.hasData && snapshot.data > 0) { + if (snapshot.hasData && snapshot.data! > 0) { final noOfMemories = snapshot.data; return RichText( text: TextSpan( @@ -78,7 +82,7 @@ class AlbumSearchResultWidget extends StatelessWidget { return const SizedBox.shrink(); } }, - ), + ) ], ), const Spacer(), @@ -91,13 +95,14 @@ class AlbumSearchResultWidget extends StatelessWidget { ), ), onTap: () { - routeToPage( - context, - CollectionPage( - albumSearchResult.collectionWithThumbnail, - tagPrefix: "collection_search", - ), - ); + if (onResultTap != null) { + onResultTap!(); + } else { + routeToPage( + context, + SearchResultPage(searchResult), + ); + } }, ); } diff --git a/lib/ui/viewer/search/search_result_widgets/search_result_thumbnail_widget.dart b/lib/ui/viewer/search/result/search_thumbnail_widget.dart similarity index 86% rename from lib/ui/viewer/search/search_result_widgets/search_result_thumbnail_widget.dart rename to lib/ui/viewer/search/result/search_thumbnail_widget.dart index 1dccc7e86..3be39ca51 100644 --- a/lib/ui/viewer/search/search_result_widgets/search_result_thumbnail_widget.dart +++ b/lib/ui/viewer/search/result/search_thumbnail_widget.dart @@ -4,11 +4,11 @@ import 'package:flutter/widgets.dart'; import 'package:photos/models/file.dart'; import 'package:photos/ui/viewer/file/thumbnail_widget.dart'; -class SearchResultThumbnailWidget extends StatelessWidget { +class SearchThumbnailWidget extends StatelessWidget { final File file; final String tagPrefix; - const SearchResultThumbnailWidget( + const SearchThumbnailWidget( this.file, this.tagPrefix, { Key key, diff --git a/lib/ui/viewer/search/search_result_widgets/holiday_result_widget.dart b/lib/ui/viewer/search/search_result_widgets/holiday_result_widget.dart deleted file mode 100644 index 8347a63f9..000000000 --- a/lib/ui/viewer/search/search_result_widgets/holiday_result_widget.dart +++ /dev/null @@ -1,91 +0,0 @@ -// @dart=2.9 - -import 'package:flutter/material.dart'; -import 'package:photos/ente_theme_data.dart'; -import 'package:photos/models/search/holiday_search_result.dart'; -import 'package:photos/ui/viewer/search/collections/files_from_holiday_page.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/search_result_thumbnail_widget.dart'; -import 'package:photos/utils/navigation_util.dart'; - -class HolidaySearchResultWidget extends StatelessWidget { - static const String _tagPrefix = "holiday_search"; - - final HolidaySearchResult holidaySearchResult; - const HolidaySearchResultWidget(this.holidaySearchResult, {Key key}) - : super(key: key); - - @override - Widget build(BuildContext context) { - final noOfMemories = holidaySearchResult.files.length; - final heroTagPrefix = _tagPrefix + holidaySearchResult.holidayName; - - return GestureDetector( - behavior: HitTestBehavior.opaque, - child: Container( - color: Theme.of(context).colorScheme.searchResultsColor, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SearchResultThumbnailWidget( - holidaySearchResult.files[0], - heroTagPrefix, - ), - const SizedBox(width: 16), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Date', - style: TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.subTextColor, - ), - ), - const SizedBox(height: 6), - SizedBox( - width: 220, - child: Text( - holidaySearchResult.holidayName, - style: const TextStyle(fontSize: 18), - overflow: TextOverflow.ellipsis, - ), - ), - const SizedBox(height: 2), - RichText( - text: TextSpan( - style: TextStyle( - color: Theme.of(context) - .colorScheme - .searchResultsCountTextColor, - ), - children: [ - TextSpan(text: noOfMemories.toString()), - TextSpan( - text: noOfMemories != 1 ? ' memories' : ' memory', - ), - ], - ), - ), - ], - ), - const Spacer(), - Icon( - Icons.chevron_right, - color: Theme.of(context).colorScheme.subTextColor, - ), - ], - ), - ), - ), - onTap: () { - routeToPage( - context, - FilesFromHolidayPage(holidaySearchResult, heroTagPrefix), - ); - }, - ); - } -} diff --git a/lib/ui/viewer/search/search_result_widgets/location_result_widget.dart b/lib/ui/viewer/search/search_result_widgets/location_result_widget.dart deleted file mode 100644 index 4ee7d5e7b..000000000 --- a/lib/ui/viewer/search/search_result_widgets/location_result_widget.dart +++ /dev/null @@ -1,91 +0,0 @@ -// @dart=2.9 - -import 'package:flutter/material.dart'; -import 'package:photos/ente_theme_data.dart'; -import 'package:photos/models/search/location_search_result.dart'; -import 'package:photos/ui/viewer/search/collections/files_in_location_page.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/search_result_thumbnail_widget.dart'; -import 'package:photos/utils/navigation_util.dart'; - -class LocationSearchResultWidget extends StatelessWidget { - static const String _tagPrefix = "location_search"; - - final LocationSearchResult locationSearchResult; - const LocationSearchResultWidget(this.locationSearchResult, {Key key}) - : super(key: key); - - @override - Widget build(BuildContext context) { - final noOfMemories = locationSearchResult.files.length; - final heroTagPrefix = _tagPrefix + locationSearchResult.location; - - return GestureDetector( - behavior: HitTestBehavior.opaque, - child: Container( - color: Theme.of(context).colorScheme.searchResultsColor, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SearchResultThumbnailWidget( - locationSearchResult.files[0], - heroTagPrefix, - ), - const SizedBox(width: 16), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Location', - style: TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.subTextColor, - ), - ), - const SizedBox(height: 6), - SizedBox( - width: 220, - child: Text( - locationSearchResult.location, - style: const TextStyle(fontSize: 18), - overflow: TextOverflow.ellipsis, - ), - ), - const SizedBox(height: 2), - RichText( - text: TextSpan( - style: TextStyle( - color: Theme.of(context) - .colorScheme - .searchResultsCountTextColor, - ), - children: [ - TextSpan(text: noOfMemories.toString()), - TextSpan( - text: noOfMemories != 1 ? ' memories' : ' memory', - ), - ], - ), - ), - ], - ), - const Spacer(), - Icon( - Icons.chevron_right, - color: Theme.of(context).colorScheme.subTextColor, - ), - ], - ), - ), - ), - onTap: () { - routeToPage( - context, - FilesInLocationPage(locationSearchResult, heroTagPrefix), - ); - }, - ); - } -} diff --git a/lib/ui/viewer/search/search_result_widgets/month_result_widget.dart b/lib/ui/viewer/search/search_result_widgets/month_result_widget.dart deleted file mode 100644 index 07ca2f253..000000000 --- a/lib/ui/viewer/search/search_result_widgets/month_result_widget.dart +++ /dev/null @@ -1,91 +0,0 @@ -// @dart=2.9 - -import 'package:flutter/material.dart'; -import 'package:photos/ente_theme_data.dart'; -import 'package:photos/models/search/month_search_result.dart'; -import 'package:photos/ui/viewer/search/collections/files_from_month_page.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/search_result_thumbnail_widget.dart'; -import 'package:photos/utils/navigation_util.dart'; - -class MonthSearchResultWidget extends StatelessWidget { - static const String _tagPrefix = "month_search"; - - final MonthSearchResult monthSearchResult; - const MonthSearchResultWidget(this.monthSearchResult, {Key key}) - : super(key: key); - - @override - Widget build(BuildContext context) { - final noOfMemories = monthSearchResult.files.length; - final heroTagPrefix = _tagPrefix + monthSearchResult.month; - - return GestureDetector( - behavior: HitTestBehavior.opaque, - child: Container( - color: Theme.of(context).colorScheme.searchResultsColor, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SearchResultThumbnailWidget( - monthSearchResult.files[0], - heroTagPrefix, - ), - const SizedBox(width: 16), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Date', - style: TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.subTextColor, - ), - ), - const SizedBox(height: 6), - SizedBox( - width: 220, - child: Text( - monthSearchResult.month, - style: const TextStyle(fontSize: 18), - overflow: TextOverflow.ellipsis, - ), - ), - const SizedBox(height: 2), - RichText( - text: TextSpan( - style: TextStyle( - color: Theme.of(context) - .colorScheme - .searchResultsCountTextColor, - ), - children: [ - TextSpan(text: noOfMemories.toString()), - TextSpan( - text: noOfMemories != 1 ? ' memories' : ' memory', - ), - ], - ), - ), - ], - ), - const Spacer(), - Icon( - Icons.chevron_right, - color: Theme.of(context).colorScheme.subTextColor, - ), - ], - ), - ), - ), - onTap: () { - routeToPage( - context, - FilesFromMonthPage(monthSearchResult, heroTagPrefix), - ); - }, - ); - } -} diff --git a/lib/ui/viewer/search/search_result_widgets/year_result_widget.dart b/lib/ui/viewer/search/search_result_widgets/year_result_widget.dart deleted file mode 100644 index 687b77519..000000000 --- a/lib/ui/viewer/search/search_result_widgets/year_result_widget.dart +++ /dev/null @@ -1,87 +0,0 @@ -// @dart=2.9 - -import 'package:flutter/material.dart'; -import 'package:photos/ente_theme_data.dart'; -import 'package:photos/models/search/year_search_result.dart'; -import 'package:photos/ui/viewer/search/collections/files_from_year_page.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/search_result_thumbnail_widget.dart'; -import 'package:photos/utils/navigation_util.dart'; - -class YearSearchResultWidget extends StatelessWidget { - static const String _tagPrefix = "year_search"; - - final YearSearchResult yearSearchResult; - const YearSearchResultWidget(this.yearSearchResult, {Key key}) - : super(key: key); - @override - Widget build(BuildContext context) { - final noOfMemories = yearSearchResult.files.length; - final heroTagPrefix = _tagPrefix + yearSearchResult.year; - - return GestureDetector( - behavior: HitTestBehavior.opaque, - child: Container( - color: Theme.of(context).colorScheme.searchResultsColor, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SearchResultThumbnailWidget( - yearSearchResult.files[0], - heroTagPrefix, - ), - const SizedBox(width: 16), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Date', - style: TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.subTextColor, - ), - ), - const SizedBox(height: 6), - Text( - yearSearchResult.year, - style: const TextStyle(fontSize: 18), - overflow: TextOverflow.ellipsis, - ), - const SizedBox(height: 2), - RichText( - text: TextSpan( - style: TextStyle( - color: Theme.of(context) - .colorScheme - .searchResultsCountTextColor, - ), - children: [ - TextSpan(text: noOfMemories.toString()), - TextSpan( - text: noOfMemories != 1 ? ' memories' : ' memory', - ), - ], - ), - ), - ], - ), - const Spacer(), - Icon( - Icons.chevron_right, - color: Theme.of(context).colorScheme.subTextColor, - ), - ], - ), - ), - ), - onTap: () { - routeToPage( - context, - FilesFromYearPage(yearSearchResult, heroTagPrefix), - ); - }, - ); - } -} diff --git a/lib/ui/viewer/search/search_suggestions.dart b/lib/ui/viewer/search/search_suggestions.dart index 08d1961a9..9e4f41cc5 100644 --- a/lib/ui/viewer/search/search_suggestions.dart +++ b/lib/ui/viewer/search/search_suggestions.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; +import 'package:photos/db/files_db.dart'; import 'package:photos/ente_theme_data.dart'; import 'package:photos/models/search/album_search_result.dart'; import 'package:photos/models/search/file_search_result.dart'; @@ -10,15 +11,14 @@ import 'package:photos/models/search/location_search_result.dart'; import 'package:photos/models/search/month_search_result.dart'; import 'package:photos/models/search/search_results.dart'; import 'package:photos/models/search/year_search_result.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/collection_result_widget.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/file_result_widget.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/holiday_result_widget.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/location_result_widget.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/month_result_widget.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/year_result_widget.dart'; +import 'package:photos/ui/viewer/gallery/collection_page.dart'; +import 'package:photos/ui/viewer/search/result/file_result_widget.dart'; +import 'package:photos/ui/viewer/search/result/search_result_widget.dart'; +import 'package:photos/utils/navigation_util.dart'; class SearchSuggestionsWidget extends StatelessWidget { final List results; + const SearchSuggestionsWidget( this.results, { Key key, @@ -62,17 +62,27 @@ class SearchSuggestionsWidget extends StatelessWidget { } final result = results[index]; if (result is AlbumSearchResult) { - return AlbumSearchResultWidget(result); - } else if (result is LocationSearchResult) { - return LocationSearchResultWidget(result); + final AlbumSearchResult albumSearchResult = result; + return SearchResultWidget( + result, + resultCount: FilesDB.instance.collectionFileCount( + albumSearchResult.collectionWithThumbnail.collection.id, + ), + onResultTap: () => routeToPage( + context, + CollectionPage( + albumSearchResult.collectionWithThumbnail, + tagPrefix: result.heroTag(), + ), + ), + ); } else if (result is FileSearchResult) { return FileSearchResultWidget(result); - } else if (result is YearSearchResult) { - return YearSearchResultWidget(result); - } else if (result is HolidaySearchResult) { - return HolidaySearchResultWidget(result); - } else if (result is MonthSearchResult) { - return MonthSearchResultWidget(result); + } else if (result is YearSearchResult || + result is MonthSearchResult || + result is LocationSearchResult || + result is HolidaySearchResult) { + return SearchResultWidget(result); } else { Logger('SearchSuggestionsWidget') .info("Invalid/Unsupported value"); diff --git a/lib/ui/viewer/search/search_widget.dart b/lib/ui/viewer/search/search_widget.dart index d360b3562..f57e2a855 100644 --- a/lib/ui/viewer/search/search_widget.dart +++ b/lib/ui/viewer/search/search_widget.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; import 'package:photos/ente_theme_data.dart'; import 'package:photos/models/search/search_results.dart'; import 'package:photos/services/search_service.dart'; -import 'package:photos/ui/viewer/search/search_result_widgets/no_result_widget.dart'; +import 'package:photos/ui/viewer/search/result/no_result_widget.dart'; import 'package:photos/ui/viewer/search/search_suffix_icon_widget.dart'; import 'package:photos/ui/viewer/search/search_suggestions.dart'; import 'package:photos/utils/date_time_util.dart'; diff --git a/lib/utils/date_time_util.dart b/lib/utils/date_time_util.dart index 38eec4f29..12c656af5 100644 --- a/lib/utils/date_time_util.dart +++ b/lib/utils/date_time_util.dart @@ -45,7 +45,7 @@ final currentYear = int.parse(DateTime.now().year.toString()); //Jun 2022 String getMonthAndYear(DateTime dateTime) { - return _months[dateTime.month] + " " + dateTime.year.toString(); + return _months[dateTime.month]! + " " + dateTime.year.toString(); } //Thu, 30 Jun From 12fb13efdb048ec7c359b91f6412c449825d6000 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Sep 2022 14:10:27 +0530 Subject: [PATCH 4/8] file rename --- lib/models/search/{search_results.dart => search_result.dart} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/models/search/{search_results.dart => search_result.dart} (100%) diff --git a/lib/models/search/search_results.dart b/lib/models/search/search_result.dart similarity index 100% rename from lib/models/search/search_results.dart rename to lib/models/search/search_result.dart From c0d5bb942a5847552d7076b5e1894aedb3e8f9a0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Sep 2022 14:10:35 +0530 Subject: [PATCH 5/8] file name --- lib/models/search/album_search_result.dart | 2 +- lib/models/search/file_search_result.dart | 2 +- lib/models/search/holiday_search_result.dart | 2 +- lib/models/search/location_search_result.dart | 4 ++-- lib/models/search/month_search_result.dart | 4 ++-- lib/models/search/year_search_result.dart | 2 +- lib/ui/viewer/search/result/search_result_page.dart | 2 +- lib/ui/viewer/search/result/search_result_widget.dart | 2 +- lib/ui/viewer/search/search_suggestions.dart | 2 +- lib/ui/viewer/search/search_widget.dart | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/models/search/album_search_result.dart b/lib/models/search/album_search_result.dart index 58c4a9ef9..97e42f741 100644 --- a/lib/models/search/album_search_result.dart +++ b/lib/models/search/album_search_result.dart @@ -1,6 +1,6 @@ import 'package:photos/models/collection_items.dart'; import 'package:photos/models/file.dart'; -import 'package:photos/models/search/search_results.dart'; +import 'package:photos/models/search/search_result.dart'; class AlbumSearchResult extends SearchResult { final CollectionWithThumbnail collectionWithThumbnail; diff --git a/lib/models/search/file_search_result.dart b/lib/models/search/file_search_result.dart index c4bf2c7ec..65d4e9277 100644 --- a/lib/models/search/file_search_result.dart +++ b/lib/models/search/file_search_result.dart @@ -1,5 +1,5 @@ import 'package:photos/models/file.dart'; -import 'package:photos/models/search/search_results.dart'; +import 'package:photos/models/search/search_result.dart'; class FileSearchResult extends SearchResult { final File file; diff --git a/lib/models/search/holiday_search_result.dart b/lib/models/search/holiday_search_result.dart index af98f3994..472ad12d2 100644 --- a/lib/models/search/holiday_search_result.dart +++ b/lib/models/search/holiday_search_result.dart @@ -1,5 +1,5 @@ import 'package:photos/models/file.dart'; -import 'package:photos/models/search/search_results.dart'; +import 'package:photos/models/search/search_result.dart'; class HolidaySearchResult extends SearchResult { final String holidayName; diff --git a/lib/models/search/location_search_result.dart b/lib/models/search/location_search_result.dart index def798427..9f8c175e4 100644 --- a/lib/models/search/location_search_result.dart +++ b/lib/models/search/location_search_result.dart @@ -1,5 +1,5 @@ import 'package:photos/models/file.dart'; -import 'package:photos/models/search/search_results.dart'; +import 'package:photos/models/search/search_result.dart'; class LocationSearchResult extends SearchResult { final String location; @@ -24,6 +24,6 @@ class LocationSearchResult extends SearchResult { @override List resultFiles() { - return files; + return files; } } diff --git a/lib/models/search/month_search_result.dart b/lib/models/search/month_search_result.dart index df01ab856..d98dce879 100644 --- a/lib/models/search/month_search_result.dart +++ b/lib/models/search/month_search_result.dart @@ -1,5 +1,5 @@ import 'package:photos/models/file.dart'; -import 'package:photos/models/search/search_results.dart'; +import 'package:photos/models/search/search_result.dart'; class MonthSearchResult extends SearchResult { final String month; @@ -24,7 +24,7 @@ class MonthSearchResult extends SearchResult { @override List resultFiles() { - return files; + return files; } } diff --git a/lib/models/search/year_search_result.dart b/lib/models/search/year_search_result.dart index 97a814ba5..bdc7694ca 100644 --- a/lib/models/search/year_search_result.dart +++ b/lib/models/search/year_search_result.dart @@ -1,5 +1,5 @@ import 'package:photos/models/file.dart'; -import 'package:photos/models/search/search_results.dart'; +import 'package:photos/models/search/search_result.dart'; class YearSearchResult extends SearchResult { final String year; diff --git a/lib/ui/viewer/search/result/search_result_page.dart b/lib/ui/viewer/search/result/search_result_page.dart index 51eff08e9..102f745d8 100644 --- a/lib/ui/viewer/search/result/search_result_page.dart +++ b/lib/ui/viewer/search/result/search_result_page.dart @@ -7,7 +7,7 @@ import 'package:photos/events/local_photos_updated_event.dart'; import 'package:photos/models/file.dart'; import 'package:photos/models/file_load_result.dart'; import 'package:photos/models/gallery_type.dart'; -import 'package:photos/models/search/search_results.dart'; +import 'package:photos/models/search/search_result.dart'; import 'package:photos/models/selected_files.dart'; import 'package:photos/ui/viewer/gallery/gallery.dart'; import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart'; diff --git a/lib/ui/viewer/search/result/search_result_widget.dart b/lib/ui/viewer/search/result/search_result_widget.dart index b448e0f78..d04f5dc98 100644 --- a/lib/ui/viewer/search/result/search_result_widget.dart +++ b/lib/ui/viewer/search/result/search_result_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:photos/ente_theme_data.dart'; -import 'package:photos/models/search/search_results.dart'; +import 'package:photos/models/search/search_result.dart'; import 'package:photos/ui/viewer/search/result/search_result_page.dart'; import 'package:photos/ui/viewer/search/result/search_thumbnail_widget.dart'; import 'package:photos/utils/navigation_util.dart'; diff --git a/lib/ui/viewer/search/search_suggestions.dart b/lib/ui/viewer/search/search_suggestions.dart index 9e4f41cc5..d40c06243 100644 --- a/lib/ui/viewer/search/search_suggestions.dart +++ b/lib/ui/viewer/search/search_suggestions.dart @@ -9,7 +9,7 @@ import 'package:photos/models/search/file_search_result.dart'; import 'package:photos/models/search/holiday_search_result.dart'; import 'package:photos/models/search/location_search_result.dart'; import 'package:photos/models/search/month_search_result.dart'; -import 'package:photos/models/search/search_results.dart'; +import 'package:photos/models/search/search_result.dart'; import 'package:photos/models/search/year_search_result.dart'; import 'package:photos/ui/viewer/gallery/collection_page.dart'; import 'package:photos/ui/viewer/search/result/file_result_widget.dart'; diff --git a/lib/ui/viewer/search/search_widget.dart b/lib/ui/viewer/search/search_widget.dart index f57e2a855..8cbbda1e7 100644 --- a/lib/ui/viewer/search/search_widget.dart +++ b/lib/ui/viewer/search/search_widget.dart @@ -4,7 +4,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:photos/ente_theme_data.dart'; -import 'package:photos/models/search/search_results.dart'; +import 'package:photos/models/search/search_result.dart'; import 'package:photos/services/search_service.dart'; import 'package:photos/ui/viewer/search/result/no_result_widget.dart'; import 'package:photos/ui/viewer/search/search_suffix_icon_widget.dart'; From a5c8929baa7a49ade4545d937b21c5f3d50bad79 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Sep 2022 14:41:29 +0530 Subject: [PATCH 6/8] Fix result type header --- .../search/result/search_result_widget.dart | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/ui/viewer/search/result/search_result_widget.dart b/lib/ui/viewer/search/result/search_result_widget.dart index d04f5dc98..b88d4c82e 100644 --- a/lib/ui/viewer/search/result/search_result_widget.dart +++ b/lib/ui/viewer/search/result/search_result_widget.dart @@ -40,7 +40,7 @@ class SearchResultWidget extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - searchResult.type().name, + _resultTypeName(searchResult.type()), style: TextStyle( fontSize: 12, color: Theme.of(context).colorScheme.subTextColor, @@ -106,4 +106,23 @@ class SearchResultWidget extends StatelessWidget { }, ); } + + String _resultTypeName(ResultType type) { + switch (type) { + case ResultType.collection: + return "Album"; + case ResultType.year: + return "Year"; + case ResultType.month: + return "Month"; + case ResultType.file: + return "Memory"; + case ResultType.event: + return "Day"; + case ResultType.location: + return "Day"; + default: + return type.name.toUpperCase(); + } + } } From bffc967e215269cb0cc41d6cf0ce1228e709e62a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Sep 2022 16:25:45 +0530 Subject: [PATCH 7/8] more refactoring --- lib/data/holidays.dart | 8 ++- lib/data/months.dart | 9 +++- ...result.dart => generic_search_result.dart} | 17 ++++--- lib/models/search/holiday_search_result.dart | 37 -------------- lib/models/search/month_search_result.dart | 36 ------------- lib/models/search/year_search_result.dart | 29 ----------- lib/services/search_service.dart | 51 ++++++++++--------- lib/ui/viewer/search/search_suggestions.dart | 10 +--- 8 files changed, 51 insertions(+), 146 deletions(-) rename lib/models/search/{location_search_result.dart => generic_search_result.dart} (50%) delete mode 100644 lib/models/search/holiday_search_result.dart delete mode 100644 lib/models/search/month_search_result.dart delete mode 100644 lib/models/search/year_search_result.dart diff --git a/lib/data/holidays.dart b/lib/data/holidays.dart index d9ca36ffc..c8ed8f8b0 100644 --- a/lib/data/holidays.dart +++ b/lib/data/holidays.dart @@ -1,4 +1,10 @@ -import 'package:photos/models/search/holiday_search_result.dart'; +class HolidayData { + final String name; + final int month; + final int day; + + const HolidayData(this.name, {required this.month, required this.day}); +} const List allHolidays = [ HolidayData('New Year', month: 1, day: 1), diff --git a/lib/data/months.dart b/lib/data/months.dart index 700a35533..530a869c1 100644 --- a/lib/data/months.dart +++ b/lib/data/months.dart @@ -1,5 +1,3 @@ -import 'package:photos/models/search/month_search_result.dart'; - List allMonths = [ MonthData('January', 1), MonthData('February', 2), @@ -14,3 +12,10 @@ List allMonths = [ MonthData('November', 11), MonthData('December', 12), ]; + +class MonthData { + final String name; + final int monthNumber; + + MonthData(this.name, this.monthNumber); +} diff --git a/lib/models/search/location_search_result.dart b/lib/models/search/generic_search_result.dart similarity index 50% rename from lib/models/search/location_search_result.dart rename to lib/models/search/generic_search_result.dart index 9f8c175e4..4710633b6 100644 --- a/lib/models/search/location_search_result.dart +++ b/lib/models/search/generic_search_result.dart @@ -1,29 +1,30 @@ import 'package:photos/models/file.dart'; import 'package:photos/models/search/search_result.dart'; -class LocationSearchResult extends SearchResult { - final String location; - final List files; +class GenericSearchResult extends SearchResult { + final String _name; + final List _files; + final ResultType _type; - LocationSearchResult(this.location, this.files); + GenericSearchResult(this._type, this._name, this._files); @override String name() { - return location; + return _name; } @override ResultType type() { - return ResultType.location; + return _type; } @override File previewThumbnail() { - return files.first; + return _files.first; } @override List resultFiles() { - return files; + return _files; } } diff --git a/lib/models/search/holiday_search_result.dart b/lib/models/search/holiday_search_result.dart deleted file mode 100644 index 8f5707a19..000000000 --- a/lib/models/search/holiday_search_result.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:photos/models/file.dart'; -import 'package:photos/models/search/search_result.dart'; - -class HolidaySearchResult extends SearchResult { - final String holidayName; - final List files; - - HolidaySearchResult(this.holidayName, this.files); - - @override - String name() { - return holidayName; - } - - @override - ResultType type() { - return ResultType.event; - } - - @override - File previewThumbnail() { - return files.first; - } - - @override - List resultFiles() { - return files; - } -} - -class HolidayData { - final String name; - final int month; - final int day; - - const HolidayData(this.name, {required this.month, required this.day}); -} diff --git a/lib/models/search/month_search_result.dart b/lib/models/search/month_search_result.dart deleted file mode 100644 index d98dce879..000000000 --- a/lib/models/search/month_search_result.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:photos/models/file.dart'; -import 'package:photos/models/search/search_result.dart'; - -class MonthSearchResult extends SearchResult { - final String month; - final List files; - - MonthSearchResult(this.month, this.files); - - @override - String name() { - return month; - } - - @override - ResultType type() { - return ResultType.month; - } - - @override - File previewThumbnail() { - return files.first; - } - - @override - List resultFiles() { - return files; - } -} - -class MonthData { - final String name; - final int monthNumber; - - MonthData(this.name, this.monthNumber); -} diff --git a/lib/models/search/year_search_result.dart b/lib/models/search/year_search_result.dart deleted file mode 100644 index bdc7694ca..000000000 --- a/lib/models/search/year_search_result.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:photos/models/file.dart'; -import 'package:photos/models/search/search_result.dart'; - -class YearSearchResult extends SearchResult { - final String year; - final List files; - - YearSearchResult(this.year, this.files); - - @override - String name() { - return year; - } - - @override - ResultType type() { - return ResultType.year; - } - - @override - File previewThumbnail() { - return files.first; - } - - @override - List resultFiles() { - return files; - } -} diff --git a/lib/services/search_service.dart b/lib/services/search_service.dart index 80cdf479c..6e1705682 100644 --- a/lib/services/search_service.dart +++ b/lib/services/search_service.dart @@ -15,11 +15,9 @@ import 'package:photos/models/collection_items.dart'; import 'package:photos/models/file.dart'; import 'package:photos/models/location.dart'; import 'package:photos/models/search/album_search_result.dart'; -import 'package:photos/models/search/holiday_search_result.dart'; +import 'package:photos/models/search/generic_search_result.dart'; import 'package:photos/models/search/location_api_response.dart'; -import 'package:photos/models/search/location_search_result.dart'; -import 'package:photos/models/search/month_search_result.dart'; -import 'package:photos/models/search/year_search_result.dart'; +import 'package:photos/models/search/search_result.dart'; import 'package:photos/services/collections_service.dart'; import 'package:photos/utils/date_time_util.dart'; @@ -78,10 +76,10 @@ class SearchService { _cachedFilesFuture = null; } - Future> getLocationSearchResults( + Future> getLocationSearchResults( String query, ) async { - final List locationSearchResults = []; + final List searchResults = []; try { final List allFiles = await _getAllFiles(); @@ -109,15 +107,16 @@ class SearchService { (first, second) => second.creationTime.compareTo(first.creationTime), ); if (filesInLocation.isNotEmpty) { - locationSearchResults.add( - LocationSearchResult(locationData.place, filesInLocation), + searchResults.add( + GenericSearchResult( + ResultType.location, locationData.place, filesInLocation), ); } } } catch (e) { _logger.severe(e); } - return locationSearchResults; + return searchResults; } // getFilteredCollectionsWithThumbnail removes deleted or archived or @@ -150,16 +149,17 @@ class SearchService { return collectionSearchResults; } - Future> getYearSearchResults( + Future> getYearSearchResults( String yearFromQuery, ) async { - final List yearSearchResults = []; + final List searchResults = []; for (var yearData in YearsData.instance.yearsData) { if (yearData.year.startsWith(yearFromQuery)) { final List filesInYear = await _getFilesInYear(yearData.duration); if (filesInYear.isNotEmpty) { - yearSearchResults.add( - YearSearchResult( + searchResults.add( + GenericSearchResult( + ResultType.year, yearData.year, filesInYear, ), @@ -167,13 +167,13 @@ class SearchService { } } } - return yearSearchResults; + return searchResults; } - Future> getHolidaySearchResults( + Future> getHolidaySearchResults( String query, ) async { - final List holidaySearchResults = []; + final List searchResults = []; final nonCaseSensitiveRegexForQuery = RegExp(query, caseSensitive: false); @@ -185,18 +185,18 @@ class SearchService { null, order: 'DESC', ); - if (matchedFiles.isNotEmpty) { - holidaySearchResults.add( - HolidaySearchResult(holiday.name, matchedFiles), + if (matchedFiles.\\isNotEmpty) { + searchResults.add( + GenericSearchResult(ResultType.event, holiday.name, matchedFiles), ); } } } - return holidaySearchResults; + return searchResults; } - Future> getMonthSearchResults(String query) async { - final List monthSearchResults = []; + Future> getMonthSearchResults(String query) async { + final List searchResults = []; final nonCaseSensitiveRegexForQuery = RegExp(query, caseSensitive: false); for (var month in allMonths) { @@ -208,8 +208,9 @@ class SearchService { order: 'DESC', ); if (matchedFiles.isNotEmpty) { - monthSearchResults.add( - MonthSearchResult( + searchResults.add( + GenericSearchResult( + ResultType.month, month.name, matchedFiles, ), @@ -218,7 +219,7 @@ class SearchService { } } - return monthSearchResults; + return searchResults; } Future> _getFilesInYear(List durationOfYear) async { diff --git a/lib/ui/viewer/search/search_suggestions.dart b/lib/ui/viewer/search/search_suggestions.dart index d40c06243..e19343956 100644 --- a/lib/ui/viewer/search/search_suggestions.dart +++ b/lib/ui/viewer/search/search_suggestions.dart @@ -6,11 +6,8 @@ import 'package:photos/db/files_db.dart'; import 'package:photos/ente_theme_data.dart'; import 'package:photos/models/search/album_search_result.dart'; import 'package:photos/models/search/file_search_result.dart'; -import 'package:photos/models/search/holiday_search_result.dart'; -import 'package:photos/models/search/location_search_result.dart'; -import 'package:photos/models/search/month_search_result.dart'; +import 'package:photos/models/search/generic_search_result.dart'; import 'package:photos/models/search/search_result.dart'; -import 'package:photos/models/search/year_search_result.dart'; import 'package:photos/ui/viewer/gallery/collection_page.dart'; import 'package:photos/ui/viewer/search/result/file_result_widget.dart'; import 'package:photos/ui/viewer/search/result/search_result_widget.dart'; @@ -78,10 +75,7 @@ class SearchSuggestionsWidget extends StatelessWidget { ); } else if (result is FileSearchResult) { return FileSearchResultWidget(result); - } else if (result is YearSearchResult || - result is MonthSearchResult || - result is LocationSearchResult || - result is HolidaySearchResult) { + } else if (result is GenericSearchResult) { return SearchResultWidget(result); } else { Logger('SearchSuggestionsWidget') From 0080d82d2263392f611c78614fa8b7e8ed8898b1 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 14 Sep 2022 16:27:47 +0530 Subject: [PATCH 8/8] Fix typo --- lib/services/search_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/search_service.dart b/lib/services/search_service.dart index 6e1705682..7b45268aa 100644 --- a/lib/services/search_service.dart +++ b/lib/services/search_service.dart @@ -185,7 +185,7 @@ class SearchService { null, order: 'DESC', ); - if (matchedFiles.\\isNotEmpty) { + if (matchedFiles.isNotEmpty) { searchResults.add( GenericSearchResult(ResultType.event, holiday.name, matchedFiles), );