From 0ee7d33f28dff943eca2e69ac3e24044a3faf2d5 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Wed, 23 Nov 2022 11:57:55 +0100 Subject: [PATCH] #404 widget: option to show most recent item instead of random items --- CHANGELOG.md | 1 + lib/l10n/app_en.arb | 4 + lib/model/settings/defaults.dart | 1 + lib/model/settings/enums/enums.dart | 2 + .../settings/enums/widget_displayed_item.dart | 14 ++++ lib/model/settings/settings.dart | 5 ++ lib/widget_common.dart | 10 ++- .../settings/home_widget_settings_page.dart | 18 ++++- untranslated.json | 73 ++++++++++++++++--- 9 files changed, 114 insertions(+), 14 deletions(-) create mode 100644 lib/model/settings/enums/widget_displayed_item.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index b7aaca3ba..3fe2dc45c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Video: subtitle vertical position option - Info: export metadata to text file - Accessibility: apply bold font system setting +- Widget: option to show most recent item instead of random items - `libre` app flavor (no mobile service maps, no Crashlytics) ### Changed diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 93e32558f..b80b23a62 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -219,6 +219,9 @@ "wallpaperTargetLock": "Lock screen", "wallpaperTargetHomeLock": "Home and lock screens", + "widgetDisplayedItemRandom": "Random", + "widgetDisplayedItemMostRecent": "Most recent", + "widgetOpenPageHome": "Open home", "widgetOpenPageCollection": "Open collection", "widgetOpenPageViewer": "Open viewer", @@ -811,6 +814,7 @@ "settingsWidgetPageTitle": "Photo Frame", "settingsWidgetShowOutline": "Outline", "settingsWidgetOpenPage": "When tapping on the widget", + "settingsWidgetDisplayedItem": "Displayed item", "settingsCollectionTile": "Collection", diff --git a/lib/model/settings/defaults.dart b/lib/model/settings/defaults.dart index ea662d7be..e419d7847 100644 --- a/lib/model/settings/defaults.dart +++ b/lib/model/settings/defaults.dart @@ -137,6 +137,7 @@ class SettingsDefaults { static const widgetOutline = false; static const widgetShape = WidgetShape.rrect; static const widgetOpenPage = WidgetOpenPage.viewer; + static const widgetDisplayedItem = WidgetDisplayedItem.random; // platform settings static const isRotationLocked = false; diff --git a/lib/model/settings/enums/enums.dart b/lib/model/settings/enums/enums.dart index 35a74b2da..9871cf927 100644 --- a/lib/model/settings/enums/enums.dart +++ b/lib/model/settings/enums/enums.dart @@ -32,6 +32,8 @@ enum VideoAutoPlayMode { disabled, playMuted, playWithSound } enum ViewerTransition { slide, parallax, fade, zoomIn, none } +enum WidgetDisplayedItem { random, mostRecent } + enum WidgetOpenPage { home, collection, viewer } enum WidgetShape { rrect, circle, heart } diff --git a/lib/model/settings/enums/widget_displayed_item.dart b/lib/model/settings/enums/widget_displayed_item.dart new file mode 100644 index 000000000..0914d4a6a --- /dev/null +++ b/lib/model/settings/enums/widget_displayed_item.dart @@ -0,0 +1,14 @@ +import 'package:aves/model/settings/enums/enums.dart'; +import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/widgets.dart'; + +extension ExtraWidgetDisplayedItem on WidgetDisplayedItem { + String getName(BuildContext context) { + switch (this) { + case WidgetDisplayedItem.random: + return context.l10n.widgetDisplayedItemRandom; + case WidgetDisplayedItem.mostRecent: + return context.l10n.widgetDisplayedItemMostRecent; + } + } +} diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 91d98e7ee..5a0494a9b 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -173,6 +173,7 @@ class Settings extends ChangeNotifier { static const widgetShapePrefixKey = '${_widgetKeyPrefix}shape_'; static const widgetCollectionFiltersPrefixKey = '${_widgetKeyPrefix}collection_filters_'; static const widgetOpenPagePrefixKey = '${_widgetKeyPrefix}open_page_'; + static const widgetDisplayedItemPrefixKey = '${_widgetKeyPrefix}displayed_item_'; static const widgetUriPrefixKey = '${_widgetKeyPrefix}uri_'; // platform settings @@ -732,6 +733,10 @@ class Settings extends ChangeNotifier { void setWidgetOpenPage(int widgetId, WidgetOpenPage newValue) => setAndNotify('$widgetOpenPagePrefixKey$widgetId', newValue.toString()); + WidgetDisplayedItem getWidgetDisplayedItem(int widgetId) => getEnumOrDefault('$widgetDisplayedItemPrefixKey$widgetId', SettingsDefaults.widgetDisplayedItem, WidgetDisplayedItem.values); + + void setWidgetDisplayedItem(int widgetId, WidgetDisplayedItem newValue) => setAndNotify('$widgetDisplayedItemPrefixKey$widgetId', newValue.toString()); + String? getWidgetUri(int widgetId) => getString('$widgetUriPrefixKey$widgetId'); void setWidgetUri(int widgetId, String? newValue) => setAndNotify('$widgetUriPrefixKey$widgetId', newValue); diff --git a/lib/widget_common.dart b/lib/widget_common.dart index 50c569684..e2316fb3f 100644 --- a/lib/widget_common.dart +++ b/lib/widget_common.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:aves/app_flavor.dart'; import 'package:aves/model/entry.dart'; +import 'package:aves/model/settings/enums/enums.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/media_store_source.dart'; @@ -74,7 +75,14 @@ Future _getWidgetEntry(int widgetId, bool reuseEntry) async { await readyCompleter.future; final entries = CollectionLens(source: source, filters: filters).sortedEntries; - entries.shuffle(); + switch (settings.getWidgetDisplayedItem(widgetId)) { + case WidgetDisplayedItem.random: + entries.shuffle(); + break; + case WidgetDisplayedItem.mostRecent: + entries.sort(AvesEntry.compareByDate); + break; + } final entry = entries.firstOrNull; if (entry != null) { settings.setWidgetUri(widgetId, entry.uri); diff --git a/lib/widgets/settings/home_widget_settings_page.dart b/lib/widgets/settings/home_widget_settings_page.dart index 3a91a15f3..8dc221502 100644 --- a/lib/widgets/settings/home_widget_settings_page.dart +++ b/lib/widgets/settings/home_widget_settings_page.dart @@ -1,5 +1,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/settings/enums/enums.dart'; +import 'package:aves/model/settings/enums/widget_displayed_item.dart'; import 'package:aves/model/settings/enums/widget_open_action.dart'; import 'package:aves/model/settings/enums/widget_shape.dart'; import 'package:aves/model/settings/settings.dart'; @@ -36,6 +37,7 @@ class _HomeWidgetSettingsPageState extends State { late WidgetShape _shape; late Color? _outline; late WidgetOpenPage _openPage; + late WidgetDisplayedItem _displayedItem; late Set _collectionFilters; int get widgetId => widget.widgetId; @@ -59,6 +61,7 @@ class _HomeWidgetSettingsPageState extends State { _shape = settings.getWidgetShape(widgetId); _outline = settings.getWidgetOutline(widgetId); _openPage = settings.getWidgetOpenPage(widgetId); + _displayedItem = settings.getWidgetDisplayedItem(widgetId); _collectionFilters = settings.getWidgetCollectionFilters(widgetId); } @@ -91,6 +94,13 @@ class _HomeWidgetSettingsPageState extends State { onSelection: (v) => setState(() => _openPage = v), tileTitle: l10n.settingsWidgetOpenPage, ), + SettingsSelectionListTile( + values: WidgetDisplayedItem.values, + getName: (context, v) => v.getName(context), + selector: (context, s) => _displayedItem, + onSelection: (v) => setState(() => _displayedItem = v), + tileTitle: l10n.settingsWidgetDisplayedItem, + ), SettingsCollectionTile( filters: _collectionFilters, onSelection: (v) => setState(() => _collectionFilters = v), @@ -148,11 +158,15 @@ class _HomeWidgetSettingsPageState extends State { } void _saveSettings() { + final invalidateUri = _displayedItem != settings.getWidgetDisplayedItem(widgetId) || !const SetEquality().equals(_collectionFilters, settings.getWidgetCollectionFilters(widgetId)); + settings.setWidgetShape(widgetId, _shape); settings.setWidgetOutline(widgetId, _outline); settings.setWidgetOpenPage(widgetId, _openPage); - if (!const SetEquality().equals(_collectionFilters, settings.getWidgetCollectionFilters(widgetId))) { - settings.setWidgetCollectionFilters(widgetId, _collectionFilters); + settings.setWidgetDisplayedItem(widgetId, _displayedItem); + settings.setWidgetCollectionFilters(widgetId, _collectionFilters); + + if (invalidateUri) { settings.setWidgetUri(widgetId, null); } } diff --git a/untranslated.json b/untranslated.json index da73abc50..7a2d59e37 100644 --- a/untranslated.json +++ b/untranslated.json @@ -3,16 +3,22 @@ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", - "settingsSubtitleThemeTextPositionDialogTitle" + "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem" ], "el": [ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem", "tagEditorSectionPlaceholders" ], @@ -20,8 +26,11 @@ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", - "settingsSubtitleThemeTextPositionDialogTitle" + "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem" ], "fa": [ @@ -179,6 +188,8 @@ "wallpaperTargetHome", "wallpaperTargetLock", "wallpaperTargetHomeLock", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "widgetOpenPageHome", "widgetOpenPageCollection", "widgetOpenPageViewer", @@ -549,6 +560,7 @@ "settingsWidgetPageTitle", "settingsWidgetShowOutline", "settingsWidgetOpenPage", + "settingsWidgetDisplayedItem", "settingsCollectionTile", "statsPageTitle", "statsWithGps", @@ -615,8 +627,11 @@ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", - "settingsSubtitleThemeTextPositionDialogTitle" + "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem" ], "gl": [ @@ -641,6 +656,8 @@ "wallpaperTargetHome", "wallpaperTargetLock", "wallpaperTargetHomeLock", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "widgetOpenPageHome", "widgetOpenPageCollection", "widgetOpenPageViewer", @@ -1011,6 +1028,7 @@ "settingsWidgetPageTitle", "settingsWidgetShowOutline", "settingsWidgetOpenPage", + "settingsWidgetDisplayedItem", "settingsCollectionTile", "statsPageTitle", "statsWithGps", @@ -1077,16 +1095,22 @@ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", - "settingsSubtitleThemeTextPositionDialogTitle" + "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem" ], "it": [ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", - "settingsSubtitleThemeTextPositionDialogTitle" + "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem" ], "ja": [ @@ -1094,16 +1118,22 @@ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", - "settingsSubtitleThemeTextPositionDialogTitle" + "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem" ], "ko": [ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", - "settingsSubtitleThemeTextPositionDialogTitle" + "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem" ], "nb": [ @@ -1120,6 +1150,8 @@ "subtitlePositionTop", "subtitlePositionBottom", "viewerTransitionFade", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "albumTierSpecial", "storageAccessDialogMessage", "restrictedAccessDialogMessage", @@ -1212,6 +1244,7 @@ "settingsThemeColorHighlights", "settingsDisplayRefreshRateModeTile", "settingsDisplayRefreshRateModeDialogTitle", + "settingsWidgetDisplayedItem", "statsWithGps", "viewerErrorDoesNotExist", "mapAttributionStamen", @@ -1228,8 +1261,11 @@ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", - "settingsSubtitleThemeTextPositionDialogTitle" + "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem" ], "pl": [ @@ -1294,6 +1330,8 @@ "wallpaperTargetHome", "wallpaperTargetLock", "wallpaperTargetHomeLock", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "widgetOpenPageHome", "widgetOpenPageCollection", "widgetOpenPageViewer", @@ -1664,6 +1702,7 @@ "settingsWidgetPageTitle", "settingsWidgetShowOutline", "settingsWidgetOpenPage", + "settingsWidgetDisplayedItem", "settingsCollectionTile", "statsPageTitle", "statsWithGps", @@ -1730,34 +1769,46 @@ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", - "settingsSubtitleThemeTextPositionDialogTitle" + "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem" ], "ru": [ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", - "settingsSubtitleThemeTextPositionDialogTitle" + "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem" ], "tr": [ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "settingsSubtitleThemeTextPositionTile", - "settingsSubtitleThemeTextPositionDialogTitle" + "settingsSubtitleThemeTextPositionDialogTitle", + "settingsWidgetDisplayedItem" ], "zh": [ "entryInfoActionExportMetadata", "subtitlePositionTop", "subtitlePositionBottom", + "widgetDisplayedItemRandom", + "widgetDisplayedItemMostRecent", "editEntryLocationDialogSetCustom", "settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionDialogTitle", "settingsAllowMediaManagement", + "settingsWidgetDisplayedItem", "tagEditorSectionPlaceholders", "tagPlaceholderCountry", "tagPlaceholderPlace"