#404 widget: option to show most recent item instead of random items

This commit is contained in:
Thibault Deckers 2022-11-23 11:57:55 +01:00
parent cbfbc436ed
commit 0ee7d33f28
9 changed files with 114 additions and 14 deletions

View file

@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file.
- Video: subtitle vertical position option - Video: subtitle vertical position option
- Info: export metadata to text file - Info: export metadata to text file
- Accessibility: apply bold font system setting - 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) - `libre` app flavor (no mobile service maps, no Crashlytics)
### Changed ### Changed

View file

@ -219,6 +219,9 @@
"wallpaperTargetLock": "Lock screen", "wallpaperTargetLock": "Lock screen",
"wallpaperTargetHomeLock": "Home and lock screens", "wallpaperTargetHomeLock": "Home and lock screens",
"widgetDisplayedItemRandom": "Random",
"widgetDisplayedItemMostRecent": "Most recent",
"widgetOpenPageHome": "Open home", "widgetOpenPageHome": "Open home",
"widgetOpenPageCollection": "Open collection", "widgetOpenPageCollection": "Open collection",
"widgetOpenPageViewer": "Open viewer", "widgetOpenPageViewer": "Open viewer",
@ -811,6 +814,7 @@
"settingsWidgetPageTitle": "Photo Frame", "settingsWidgetPageTitle": "Photo Frame",
"settingsWidgetShowOutline": "Outline", "settingsWidgetShowOutline": "Outline",
"settingsWidgetOpenPage": "When tapping on the widget", "settingsWidgetOpenPage": "When tapping on the widget",
"settingsWidgetDisplayedItem": "Displayed item",
"settingsCollectionTile": "Collection", "settingsCollectionTile": "Collection",

View file

@ -137,6 +137,7 @@ class SettingsDefaults {
static const widgetOutline = false; static const widgetOutline = false;
static const widgetShape = WidgetShape.rrect; static const widgetShape = WidgetShape.rrect;
static const widgetOpenPage = WidgetOpenPage.viewer; static const widgetOpenPage = WidgetOpenPage.viewer;
static const widgetDisplayedItem = WidgetDisplayedItem.random;
// platform settings // platform settings
static const isRotationLocked = false; static const isRotationLocked = false;

View file

@ -32,6 +32,8 @@ enum VideoAutoPlayMode { disabled, playMuted, playWithSound }
enum ViewerTransition { slide, parallax, fade, zoomIn, none } enum ViewerTransition { slide, parallax, fade, zoomIn, none }
enum WidgetDisplayedItem { random, mostRecent }
enum WidgetOpenPage { home, collection, viewer } enum WidgetOpenPage { home, collection, viewer }
enum WidgetShape { rrect, circle, heart } enum WidgetShape { rrect, circle, heart }

View file

@ -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;
}
}
}

View file

@ -173,6 +173,7 @@ class Settings extends ChangeNotifier {
static const widgetShapePrefixKey = '${_widgetKeyPrefix}shape_'; static const widgetShapePrefixKey = '${_widgetKeyPrefix}shape_';
static const widgetCollectionFiltersPrefixKey = '${_widgetKeyPrefix}collection_filters_'; static const widgetCollectionFiltersPrefixKey = '${_widgetKeyPrefix}collection_filters_';
static const widgetOpenPagePrefixKey = '${_widgetKeyPrefix}open_page_'; static const widgetOpenPagePrefixKey = '${_widgetKeyPrefix}open_page_';
static const widgetDisplayedItemPrefixKey = '${_widgetKeyPrefix}displayed_item_';
static const widgetUriPrefixKey = '${_widgetKeyPrefix}uri_'; static const widgetUriPrefixKey = '${_widgetKeyPrefix}uri_';
// platform settings // platform settings
@ -732,6 +733,10 @@ class Settings extends ChangeNotifier {
void setWidgetOpenPage(int widgetId, WidgetOpenPage newValue) => setAndNotify('$widgetOpenPagePrefixKey$widgetId', newValue.toString()); 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'); String? getWidgetUri(int widgetId) => getString('$widgetUriPrefixKey$widgetId');
void setWidgetUri(int widgetId, String? newValue) => setAndNotify('$widgetUriPrefixKey$widgetId', newValue); void setWidgetUri(int widgetId, String? newValue) => setAndNotify('$widgetUriPrefixKey$widgetId', newValue);

View file

@ -2,6 +2,7 @@ import 'dart:async';
import 'package:aves/app_flavor.dart'; import 'package:aves/app_flavor.dart';
import 'package:aves/model/entry.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/settings/settings.dart';
import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/model/source/media_store_source.dart'; import 'package:aves/model/source/media_store_source.dart';
@ -74,7 +75,14 @@ Future<AvesEntry?> _getWidgetEntry(int widgetId, bool reuseEntry) async {
await readyCompleter.future; await readyCompleter.future;
final entries = CollectionLens(source: source, filters: filters).sortedEntries; 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; final entry = entries.firstOrNull;
if (entry != null) { if (entry != null) {
settings.setWidgetUri(widgetId, entry.uri); settings.setWidgetUri(widgetId, entry.uri);

View file

@ -1,5 +1,6 @@
import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/settings/enums/enums.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_open_action.dart';
import 'package:aves/model/settings/enums/widget_shape.dart'; import 'package:aves/model/settings/enums/widget_shape.dart';
import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/settings/settings.dart';
@ -36,6 +37,7 @@ class _HomeWidgetSettingsPageState extends State<HomeWidgetSettingsPage> {
late WidgetShape _shape; late WidgetShape _shape;
late Color? _outline; late Color? _outline;
late WidgetOpenPage _openPage; late WidgetOpenPage _openPage;
late WidgetDisplayedItem _displayedItem;
late Set<CollectionFilter> _collectionFilters; late Set<CollectionFilter> _collectionFilters;
int get widgetId => widget.widgetId; int get widgetId => widget.widgetId;
@ -59,6 +61,7 @@ class _HomeWidgetSettingsPageState extends State<HomeWidgetSettingsPage> {
_shape = settings.getWidgetShape(widgetId); _shape = settings.getWidgetShape(widgetId);
_outline = settings.getWidgetOutline(widgetId); _outline = settings.getWidgetOutline(widgetId);
_openPage = settings.getWidgetOpenPage(widgetId); _openPage = settings.getWidgetOpenPage(widgetId);
_displayedItem = settings.getWidgetDisplayedItem(widgetId);
_collectionFilters = settings.getWidgetCollectionFilters(widgetId); _collectionFilters = settings.getWidgetCollectionFilters(widgetId);
} }
@ -91,6 +94,13 @@ class _HomeWidgetSettingsPageState extends State<HomeWidgetSettingsPage> {
onSelection: (v) => setState(() => _openPage = v), onSelection: (v) => setState(() => _openPage = v),
tileTitle: l10n.settingsWidgetOpenPage, tileTitle: l10n.settingsWidgetOpenPage,
), ),
SettingsSelectionListTile<WidgetDisplayedItem>(
values: WidgetDisplayedItem.values,
getName: (context, v) => v.getName(context),
selector: (context, s) => _displayedItem,
onSelection: (v) => setState(() => _displayedItem = v),
tileTitle: l10n.settingsWidgetDisplayedItem,
),
SettingsCollectionTile( SettingsCollectionTile(
filters: _collectionFilters, filters: _collectionFilters,
onSelection: (v) => setState(() => _collectionFilters = v), onSelection: (v) => setState(() => _collectionFilters = v),
@ -148,11 +158,15 @@ class _HomeWidgetSettingsPageState extends State<HomeWidgetSettingsPage> {
} }
void _saveSettings() { void _saveSettings() {
final invalidateUri = _displayedItem != settings.getWidgetDisplayedItem(widgetId) || !const SetEquality().equals(_collectionFilters, settings.getWidgetCollectionFilters(widgetId));
settings.setWidgetShape(widgetId, _shape); settings.setWidgetShape(widgetId, _shape);
settings.setWidgetOutline(widgetId, _outline); settings.setWidgetOutline(widgetId, _outline);
settings.setWidgetOpenPage(widgetId, _openPage); settings.setWidgetOpenPage(widgetId, _openPage);
if (!const SetEquality().equals(_collectionFilters, settings.getWidgetCollectionFilters(widgetId))) { settings.setWidgetDisplayedItem(widgetId, _displayedItem);
settings.setWidgetCollectionFilters(widgetId, _collectionFilters); settings.setWidgetCollectionFilters(widgetId, _collectionFilters);
if (invalidateUri) {
settings.setWidgetUri(widgetId, null); settings.setWidgetUri(widgetId, null);
} }
} }

View file

@ -3,16 +3,22 @@
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle" "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem"
], ],
"el": [ "el": [
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle", "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem",
"tagEditorSectionPlaceholders" "tagEditorSectionPlaceholders"
], ],
@ -20,8 +26,11 @@
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle" "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem"
], ],
"fa": [ "fa": [
@ -179,6 +188,8 @@
"wallpaperTargetHome", "wallpaperTargetHome",
"wallpaperTargetLock", "wallpaperTargetLock",
"wallpaperTargetHomeLock", "wallpaperTargetHomeLock",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"widgetOpenPageHome", "widgetOpenPageHome",
"widgetOpenPageCollection", "widgetOpenPageCollection",
"widgetOpenPageViewer", "widgetOpenPageViewer",
@ -549,6 +560,7 @@
"settingsWidgetPageTitle", "settingsWidgetPageTitle",
"settingsWidgetShowOutline", "settingsWidgetShowOutline",
"settingsWidgetOpenPage", "settingsWidgetOpenPage",
"settingsWidgetDisplayedItem",
"settingsCollectionTile", "settingsCollectionTile",
"statsPageTitle", "statsPageTitle",
"statsWithGps", "statsWithGps",
@ -615,8 +627,11 @@
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle" "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem"
], ],
"gl": [ "gl": [
@ -641,6 +656,8 @@
"wallpaperTargetHome", "wallpaperTargetHome",
"wallpaperTargetLock", "wallpaperTargetLock",
"wallpaperTargetHomeLock", "wallpaperTargetHomeLock",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"widgetOpenPageHome", "widgetOpenPageHome",
"widgetOpenPageCollection", "widgetOpenPageCollection",
"widgetOpenPageViewer", "widgetOpenPageViewer",
@ -1011,6 +1028,7 @@
"settingsWidgetPageTitle", "settingsWidgetPageTitle",
"settingsWidgetShowOutline", "settingsWidgetShowOutline",
"settingsWidgetOpenPage", "settingsWidgetOpenPage",
"settingsWidgetDisplayedItem",
"settingsCollectionTile", "settingsCollectionTile",
"statsPageTitle", "statsPageTitle",
"statsWithGps", "statsWithGps",
@ -1077,16 +1095,22 @@
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle" "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem"
], ],
"it": [ "it": [
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle" "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem"
], ],
"ja": [ "ja": [
@ -1094,16 +1118,22 @@
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle" "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem"
], ],
"ko": [ "ko": [
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle" "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem"
], ],
"nb": [ "nb": [
@ -1120,6 +1150,8 @@
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"viewerTransitionFade", "viewerTransitionFade",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"albumTierSpecial", "albumTierSpecial",
"storageAccessDialogMessage", "storageAccessDialogMessage",
"restrictedAccessDialogMessage", "restrictedAccessDialogMessage",
@ -1212,6 +1244,7 @@
"settingsThemeColorHighlights", "settingsThemeColorHighlights",
"settingsDisplayRefreshRateModeTile", "settingsDisplayRefreshRateModeTile",
"settingsDisplayRefreshRateModeDialogTitle", "settingsDisplayRefreshRateModeDialogTitle",
"settingsWidgetDisplayedItem",
"statsWithGps", "statsWithGps",
"viewerErrorDoesNotExist", "viewerErrorDoesNotExist",
"mapAttributionStamen", "mapAttributionStamen",
@ -1228,8 +1261,11 @@
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle" "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem"
], ],
"pl": [ "pl": [
@ -1294,6 +1330,8 @@
"wallpaperTargetHome", "wallpaperTargetHome",
"wallpaperTargetLock", "wallpaperTargetLock",
"wallpaperTargetHomeLock", "wallpaperTargetHomeLock",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"widgetOpenPageHome", "widgetOpenPageHome",
"widgetOpenPageCollection", "widgetOpenPageCollection",
"widgetOpenPageViewer", "widgetOpenPageViewer",
@ -1664,6 +1702,7 @@
"settingsWidgetPageTitle", "settingsWidgetPageTitle",
"settingsWidgetShowOutline", "settingsWidgetShowOutline",
"settingsWidgetOpenPage", "settingsWidgetOpenPage",
"settingsWidgetDisplayedItem",
"settingsCollectionTile", "settingsCollectionTile",
"statsPageTitle", "statsPageTitle",
"statsWithGps", "statsWithGps",
@ -1730,34 +1769,46 @@
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle" "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem"
], ],
"ru": [ "ru": [
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle" "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem"
], ],
"tr": [ "tr": [
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle" "settingsSubtitleThemeTextPositionDialogTitle",
"settingsWidgetDisplayedItem"
], ],
"zh": [ "zh": [
"entryInfoActionExportMetadata", "entryInfoActionExportMetadata",
"subtitlePositionTop", "subtitlePositionTop",
"subtitlePositionBottom", "subtitlePositionBottom",
"widgetDisplayedItemRandom",
"widgetDisplayedItemMostRecent",
"editEntryLocationDialogSetCustom", "editEntryLocationDialogSetCustom",
"settingsSubtitleThemeTextPositionTile", "settingsSubtitleThemeTextPositionTile",
"settingsSubtitleThemeTextPositionDialogTitle", "settingsSubtitleThemeTextPositionDialogTitle",
"settingsAllowMediaManagement", "settingsAllowMediaManagement",
"settingsWidgetDisplayedItem",
"tagEditorSectionPlaceholders", "tagEditorSectionPlaceholders",
"tagPlaceholderCountry", "tagPlaceholderCountry",
"tagPlaceholderPlace" "tagPlaceholderPlace"