Merge branch 'develop'

This commit is contained in:
Thibault Deckers 2025-01-05 16:35:42 +01:00
commit 6803dae438
62 changed files with 1797 additions and 233 deletions

View file

@ -69,7 +69,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9
uses: github/codeql-action/init@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3.28.0
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
@ -83,6 +83,6 @@ jobs:
./flutterw build apk --profile -t lib/main_play.dart --flavor play
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9
uses: github/codeql-action/analyze@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3.28.0
with:
category: "/language:${{matrix.language}}"

View file

@ -71,6 +71,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9
uses: github/codeql-action/upload-sarif@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3.28.0
with:
sarif_file: results.sarif

View file

@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file.
## <a id="unreleased"></a>[Unreleased]
## <a id="v1.12.1"></a>[v1.12.1] - 2025-01-05
### Added
- dynamic album decompose action
- Danish translation (thanks Grooty12, Victor M, cat)
### Fixed
- analysis service not triggering because of uninitialized app lifecycle
- Viewer: displaying neighbour items when the initial item of a view intent is a new one
- Search: dynamic album name filtering
## <a id="v1.12.0"></a>[v1.12.0] - 2024-12-19
### Added

View file

@ -3,9 +3,10 @@
<string name="app_widget_label">Fotoramme</string>
<string name="wallpaper">Baggrund</string>
<string name="videos_shortcut_short_label">Videoer</string>
<string name="analysis_channel_name">Mediascanning</string>
<string name="analysis_channel_name">Mediescanning</string>
<string name="analysis_notification_default_title">Scanner medier</string>
<string name="analysis_notification_action_stop">Stop</string>
<string name="app_name">Aves</string>
<string name="search_shortcut_short_label">Søg</string>
<string name="map_shortcut_short_label">Kort</string>
</resources>

View file

@ -6,7 +6,7 @@
<string name="videos_shortcut_short_label">Videók</string>
<string name="analysis_notification_action_stop">Állj</string>
<string name="app_widget_label">Fotó keret</string>
<string name="analysis_channel_name">Tartalom keresése</string>
<string name="analysis_channel_name">Médiafájlok keresése</string>
<string name="analysis_notification_default_title">Média beolvasása</string>
<string name="map_shortcut_short_label">Térkép</string>
</resources>

View file

@ -1,5 +1,5 @@
<i>Aves</i> can handle all sorts of images and videos, including your typical JPEGs and MP4s, but also more exotic things like <b>multi-page TIFFs, SVGs, old AVIs and more</b>! It scans your media collection to identify <b>motion photos</b>, <b>panoramas</b> (aka photo spheres), <b>360° videos</b>, as well as <b>GeoTIFF</b> files.
<i>Aves</i> kan håndtere alle slags billeder og videoer, inklusive de typiske JPEG'er og MP4'er, men også mere usædvanlige ting som <b>flersidede TIFF'er, SVG'er, gamle AVI'er og mere</b>! Den scanner din mediesamling for at identificere <b>bevægelsesfotos</b>, <b>panoramaer</b> (også kaldet fotosfærer), <b>360° videoer</b> samt <b>GeoTIFF</b>-filer.
<b>Navigation and search</b> is an important part of <i>Aves</i>. The goal is for users to easily flow from albums to photos to tags to maps, etc.
<b>Navigation og søgning</b> er en vigtig del af <i>Aves</i>. Målet er, at brugerne nemt kan gå fra album til fotos til tags til kort osv.
<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>.
<i>Aves</i> integreres med Android (inklusive Android TV) med funktioner som <b>widgets</b>, <b>app-genveje</b>, <b>pauseskærm</b> og håndtering af <b>global søgning</b>. Den fungerer også som <b>medieviser og -vælger</b>.

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

View file

@ -1 +1 @@
Gallery and metadata explorer
Galleri og metadataudforsker

View file

@ -0,0 +1,3 @@
In v1.12.1:
- enjoy the app in Danish
Full changelog available on GitHub

View file

@ -0,0 +1,3 @@
In v1.12.1:
- enjoy the app in Danish
Full changelog available on GitHub

View file

@ -1,5 +1,5 @@
<i>ஏவ்ச்</i> உங்கள் வழக்கமான JPEG கள் மற்றும் MP4 கள் உட்பட அனைத்து வகையான படங்கள் மற்றும் வீடியோக்களைக் கையாள முடியும், ஆனால் <b> பல பக்க டிஐஎஃப்பிஎச், எச்விசிகள், பழைய அவிச் மற்றும் மேலும் </b> போன்ற கவர்ச்சியான விசயங்களையும் கையாள முடியும்! <b> மோசன் புகைப்படங்கள் </b>, <b> பனோரமாச் </b> (புகைப்படக் கோளங்கள்), <b> 360 ° வீடியோக்கள் </b>, அத்துடன் <b> சியோடிஃப் < /b> கோப்புகள்.
<i>ஏவ்ச்</i> உங்கள் வழக்கமான செபிஇசிகள் மற்றும் எம்பி4கள் உட்பட அனைத்து வகையான படங்கள் மற்றும் காணொளிகளைக் கையாள முடியும், ஆனால் <b> பல பக்க டிஐஎப்எப்கள், எச்விசிகள், பழைய அவிச் மற்றும் மேலும் </b> போன்ற கவர்ச்சியான உருப்படிகளையும் கையாள முடியும்! <b> இயக்கபுகைப்படங்கள் </b>, <b> பனோரமாகள் </b> (புகைப்படக் கோளங்கள்), <b> 360 ° காணொளிகள் </b>, அத்துடன் <b> சியோடிஐஎப்எப்கள்</b> கோப்புகள்.
<b> வழிசெலுத்தல் மற்றும் தேடல் </b> <i> ஏவ்ச் </i> இன் ஒரு முக்கிய பகுதியாகும். பயனர்கள் ஆல்பங்களிலிருந்து புகைப்படங்கள் வரை குறிச்சொற்களுக்கு வரைபடங்கள் போன்றவற்றுக்கு எளிதாக பாய வேண்டும்.
<b> வழிசெலுத்தல் மற்றும் தேடல் </b> <i> ஏவ்ச் </i> இன் ஒரு முக்கிய பகுதியாகும். பயனர்கள் ஆல்பங்களிலிருந்து புகைப்படங்கள்வரை குறிச்சொற்களுக்கு வரைபடங்கள் போன்றவற்றுக்கு எளிதாகப் பாய வேண்டும்.
<i>Aves</i> integrates with Android (including Android TV) with features such as <b>widgets</b>, <b>app shortcuts</b>, <b>screen saver</b> and <b>global search</b> handling. It also works as a <b>media viewer and picker</b>.
<i>ஏவ்ச்</i> ஆனது ஆண்ட்ராய்டு உடன் (ஆண்ட்ராய்டு தொலைக்காட்சி உட்பட) ஒருங்கிணைக்கிறது, இதில் <b>நிரல்பலகைகள்</b>, <b>பயன்பாட்டு குறுக்குவழிகள்</b>, <b>திரை காப்பான்</b> மற்றும் <b>உலகளாவிய தேடல்</b> கையாளுதல் போன்ற நற்பண்புகள் உள்ளன. இது ஒரு <b>ஊடக காட்டி மற்றும் தேர்வியாகவும்</b> செயல்படுகிறது.

View file

@ -1562,5 +1562,7 @@
"appExportDynamicAlbums": "الألبومات الديناميكية",
"@appExportDynamicAlbums": {},
"newDynamicAlbumDialogTitle": "ألبوم ديناميكي جديد",
"@newDynamicAlbumDialogTitle": {}
"@newDynamicAlbumDialogTitle": {},
"chipActionDecompose": "فصل",
"@chipActionDecompose": {}
}

View file

@ -202,7 +202,7 @@
"@sortOrderShortestFirst": {},
"albumGroupTier": "По нива",
"@albumGroupTier": {},
"explorerPageTitle": "Explorer",
"explorerPageTitle": "Файлов мениджър",
"@explorerPageTitle": {},
"explorerActionSelectStorageVolume": "Избери място за съхранение",
"@explorerActionSelectStorageVolume": {},
@ -427,11 +427,11 @@
"@filterNoTagLabel": {},
"filterOnThisDayLabel": "Днес",
"@filterOnThisDayLabel": {},
"filterRecentlyAddedLabel": "Наскоро добавен",
"filterRecentlyAddedLabel": "Наскоро добавени",
"@filterRecentlyAddedLabel": {},
"filterRatingRejectedLabel": "Отхвърлени",
"@filterRatingRejectedLabel": {},
"filterTypeAnimatedLabel": "Анимиран",
"filterTypeAnimatedLabel": "Анимирани",
"@filterTypeAnimatedLabel": {},
"filterTypeMotionPhotoLabel": "Снимка с движение",
"@filterTypeMotionPhotoLabel": {},
@ -975,7 +975,7 @@
"@albumPickPageTitlePick": {},
"albumCamera": "Камера",
"@albumCamera": {},
"albumDownload": "Изтегляне",
"albumDownload": "Изтеглени",
"@albumDownload": {},
"albumScreenshots": "Екранни снимки",
"@albumScreenshots": {},
@ -1201,7 +1201,7 @@
"@settingsCollectionQuickActionTabBrowsing": {},
"settingsCollectionQuickActionTabSelecting": "Избиране",
"@settingsCollectionQuickActionTabSelecting": {},
"settingsCollectionBurstPatternsTile": "Burst patterns",
"settingsCollectionBurstPatternsTile": "Шаблон серийни снимки",
"@settingsCollectionBurstPatternsTile": {},
"settingsCollectionBurstPatternsNone": "Няма",
"@settingsCollectionBurstPatternsNone": {},
@ -1337,7 +1337,7 @@
"@viewerInfoLabelTitle": {},
"viewerInfoLabelOwner": "Собственик",
"@viewerInfoLabelOwner": {},
"mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Tiles by [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)",
"mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Плочки от [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)",
"@mapAttributionOpenTopoMap": {},
"mapEmptyRegion": "Няма изображения в този регион",
"@mapEmptyRegion": {},
@ -1367,7 +1367,7 @@
"@filePickerShowHiddenFiles": {},
"chipActionRemove": "Премахване",
"@chipActionRemove": {},
"albumTierDynamic": "Dynamic",
"albumTierDynamic": "Динамични",
"@albumTierDynamic": {},
"collectionActionAddDynamicAlbum": "Добави динамичен албум",
"@collectionActionAddDynamicAlbum": {},
@ -1521,9 +1521,9 @@
"@mapZoomOutTooltip": {},
"mapPointNorthUpTooltip": "Север нагоре",
"@mapPointNorthUpTooltip": {},
"mapAttributionOsmHot": "Tiles by [HOT](https://www.hotosm.org/) • Hosted by [OSM France](https://openstreetmap.fr/)",
"mapAttributionOsmHot": "Плочки от[HOT](https://www.hotosm.org/) • Хоствано от [OSM France](https://openstreetmap.fr/)",
"@mapAttributionOsmHot": {},
"mapAttributionStamen": "Tiles by [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)",
"mapAttributionStamen": "Плочки от [Stamen Design](https://stamen.com), [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)",
"@mapAttributionStamen": {},
"openMapPageTooltip": "Преглед на страницата с карта",
"@openMapPageTooltip": {},
@ -1569,7 +1569,7 @@
"@appExportDynamicAlbums": {},
"settingsViewerShowOverlayThumbnails": "Показване на миниатюри",
"@settingsViewerShowOverlayThumbnails": {},
"mapAttributionOsmLiberty": "Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)",
"mapAttributionOsmLiberty": "Предварително генерирани плочки от [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • • Хоствано от [OSM Americana](https://tile.ourmap.us)",
"@mapAttributionOsmLiberty": {},
"settingsDisablingBinWarningDialogMessage": "Елементите в кошчето ще бъдат изтрити завинаги.",
"@settingsDisablingBinWarningDialogMessage": {},
@ -1593,7 +1593,7 @@
"@settingsLanguageTile": {},
"viewerErrorDoesNotExist": "Файлът не съществува.",
"@viewerErrorDoesNotExist": {},
"mapAttributionOsmData": "Map data © [OpenStreetMap](https://www.openstreetmap.org/copyright) contributors",
"mapAttributionOsmData": "Данни карта © [OpenStreetMap](https://www.openstreetmap.org/copyright) участници",
"@mapAttributionOsmData": {},
"filePickerNoItems": "Не откривам нищо",
"@filePickerNoItems": {},

File diff suppressed because it is too large Load diff

View file

@ -1392,5 +1392,19 @@
"mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Kacheln von [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)",
"@mapAttributionOpenTopoMap": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "Album existiert bereits",
"@newAlbumDialogAlbumAlreadyExistsHelper": {}
"@newAlbumDialogAlbumAlreadyExistsHelper": {},
"appExportDynamicAlbums": "Dynamische Alben",
"@appExportDynamicAlbums": {},
"dynamicAlbumAlreadyExists": "Dynamisches Album existiert bereits",
"@dynamicAlbumAlreadyExists": {},
"chipActionRemove": "Entfernen",
"@chipActionRemove": {},
"newDynamicAlbumDialogTitle": "Neues Dynamisches Album",
"@newDynamicAlbumDialogTitle": {},
"collectionActionAddDynamicAlbum": "Dynamisches Album hinzufügen",
"@collectionActionAddDynamicAlbum": {},
"albumTierDynamic": "Dynamisch",
"@albumTierDynamic": {},
"chipActionDecompose": "Aufschlüsseln",
"@chipActionDecompose": {}
}

View file

@ -92,6 +92,7 @@
"chipActionGoToPlacePage": "Show in Places",
"chipActionGoToTagPage": "Show in Tags",
"chipActionGoToExplorerPage": "Show in Explorer",
"chipActionDecompose": "Split",
"chipActionFilterOut": "Filter out",
"chipActionFilterIn": "Filter in",
"chipActionHide": "Hide",

View file

@ -1404,5 +1404,7 @@
"albumTierDynamic": "Dinámico",
"@albumTierDynamic": {},
"newDynamicAlbumDialogTitle": "Nuevo álbum dinámico",
"@newDynamicAlbumDialogTitle": {}
"@newDynamicAlbumDialogTitle": {},
"chipActionDecompose": "Separar",
"@chipActionDecompose": {}
}

View file

@ -1602,5 +1602,7 @@
"settingsLanguagePageTitle": "Keel",
"@settingsLanguagePageTitle": {},
"viewerInfoViewXmlLinkText": "Vaata XMLi",
"@viewerInfoViewXmlLinkText": {}
"@viewerInfoViewXmlLinkText": {},
"chipActionDecompose": "Poolita",
"@chipActionDecompose": {}
}

View file

@ -1404,5 +1404,7 @@
"appExportDynamicAlbums": "Albums dynamiques",
"@appExportDynamicAlbums": {},
"collectionActionAddDynamicAlbum": "Ajouter un album dynamique",
"@collectionActionAddDynamicAlbum": {}
"@collectionActionAddDynamicAlbum": {},
"chipActionDecompose": "Scinder",
"@chipActionDecompose": {}
}

View file

@ -1544,5 +1544,23 @@
"settingsForceWesternArabicNumeralsTile": "Arab számok használata",
"@settingsForceWesternArabicNumeralsTile": {},
"chipActionGoToExplorerPage": "Mutatás a böngészőben",
"@chipActionGoToExplorerPage": {}
"@chipActionGoToExplorerPage": {},
"videoActionShowNextFrame": "Következő képkocka mutatása",
"@videoActionShowNextFrame": {},
"videoActionShowPreviousFrame": "Előző képkocka mutatása",
"@videoActionShowPreviousFrame": {},
"dynamicAlbumAlreadyExists": "A dinamikus album már létezik",
"@dynamicAlbumAlreadyExists": {},
"collectionActionAddDynamicAlbum": "Dinamikus album hozzáadása",
"@collectionActionAddDynamicAlbum": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "Az album már létezik",
"@newAlbumDialogAlbumAlreadyExistsHelper": {},
"chipActionRemove": "Eltávolítás",
"@chipActionRemove": {},
"albumTierDynamic": "Dinamikus",
"@albumTierDynamic": {},
"newDynamicAlbumDialogTitle": "Új Dinamikus Album",
"@newDynamicAlbumDialogTitle": {},
"appExportDynamicAlbums": "Dinamikus albumok",
"@appExportDynamicAlbums": {}
}

View file

@ -1404,5 +1404,7 @@
"dynamicAlbumAlreadyExists": "Album dinamis sudah ada",
"@dynamicAlbumAlreadyExists": {},
"newDynamicAlbumDialogTitle": "Album Dinamis Baru",
"@newDynamicAlbumDialogTitle": {}
"@newDynamicAlbumDialogTitle": {},
"chipActionDecompose": "Pisah",
"@chipActionDecompose": {}
}

View file

@ -1341,7 +1341,7 @@
"@entryActionCast": {},
"aboutDataUsageClearCache": "Svuota cache",
"@aboutDataUsageClearCache": {},
"castDialogTitle": "Dispositivi cast",
"castDialogTitle": "Dispositivi Cast",
"@castDialogTitle": {},
"stopTooltip": "Ferma",
"@stopTooltip": {},

View file

@ -1404,5 +1404,7 @@
"collectionActionAddDynamicAlbum": "동적 앨범 추가",
"@collectionActionAddDynamicAlbum": {},
"appExportDynamicAlbums": "동적 앨범",
"@appExportDynamicAlbums": {}
"@appExportDynamicAlbums": {},
"chipActionDecompose": "나누기",
"@chipActionDecompose": {}
}

View file

@ -1406,5 +1406,7 @@
"appExportDynamicAlbums": "Dynamische albums",
"@appExportDynamicAlbums": {},
"chipActionRemove": "Verwijderen",
"@chipActionRemove": {}
"@chipActionRemove": {},
"chipActionDecompose": "Splitsen",
"@chipActionDecompose": {}
}

View file

@ -1562,5 +1562,7 @@
"collectionActionAddDynamicAlbum": "Dodaj dynamiczny album",
"@collectionActionAddDynamicAlbum": {},
"appExportDynamicAlbums": "Dynamiczne albumy",
"@appExportDynamicAlbums": {}
"@appExportDynamicAlbums": {},
"chipActionDecompose": "Podziel",
"@chipActionDecompose": {}
}

View file

@ -1404,5 +1404,7 @@
"collectionActionAddDynamicAlbum": "Adicionar álbum dinâmico",
"@collectionActionAddDynamicAlbum": {},
"appExportDynamicAlbums": "Álbuns dinâmicos",
"@appExportDynamicAlbums": {}
"@appExportDynamicAlbums": {},
"chipActionDecompose": "Separar",
"@chipActionDecompose": {}
}

View file

@ -1389,8 +1389,22 @@
"@videoActionShowNextFrame": {},
"mapStyleOsmLiberty": "OSM Liberty",
"@mapStyleOsmLiberty": {},
"mapAttributionOsmLiberty": "Tiles by [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hosted by [OSM Americana](https://tile.ourmap.us)",
"mapAttributionOsmLiberty": "Плитки от [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Размещено на [OSM Americana](https://tile.ourmap.us)",
"@mapAttributionOsmLiberty": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "Альбом уже существует",
"@newAlbumDialogAlbumAlreadyExistsHelper": {}
"@newAlbumDialogAlbumAlreadyExistsHelper": {},
"chipActionDecompose": "Раздел",
"@chipActionDecompose": {},
"chipActionRemove": "Удалить",
"@chipActionRemove": {},
"albumTierDynamic": "Динамический",
"@albumTierDynamic": {},
"newDynamicAlbumDialogTitle": "Новый динамический альбом",
"@newDynamicAlbumDialogTitle": {},
"dynamicAlbumAlreadyExists": "Динамический альбом уже существует",
"@dynamicAlbumAlreadyExists": {},
"collectionActionAddDynamicAlbum": "Добавить динамический альбом",
"@collectionActionAddDynamicAlbum": {},
"appExportDynamicAlbums": "Динамические альбомы",
"@appExportDynamicAlbums": {}
}

View file

@ -475,21 +475,21 @@
"@settingsThumbnailOverlayTile": {},
"settingsThumbnailOverlayPageTitle": "மேலடுக்கு",
"@settingsThumbnailOverlayPageTitle": {},
"settingsThumbnailShowHdrIcon": "எச்டிஆர் ஐகானைக் காட்டு",
"settingsThumbnailShowHdrIcon": "எச்டிஆர் படவுருவைக் காட்டு",
"@settingsThumbnailShowHdrIcon": {},
"settingsThumbnailShowFavouriteIcon": "பிடித்த ஐகானைக் காட்டு",
"settingsThumbnailShowFavouriteIcon": "பிடித்த படவுருவைக் காட்டு",
"@settingsThumbnailShowFavouriteIcon": {},
"settingsThumbnailShowTagIcon": "டேக் ஐகானைக் காட்டு",
"settingsThumbnailShowTagIcon": "குறிச்சொல் படவுருவைக் காட்டு",
"@settingsThumbnailShowTagIcon": {},
"settingsThumbnailShowLocationIcon": "இருப்பிட ஐகானைக் காட்டு",
"settingsThumbnailShowLocationIcon": "இருப்பிட படவுருவைக் காட்டு",
"@settingsThumbnailShowLocationIcon": {},
"settingsThumbnailShowMotionPhotoIcon": "மோசன் ஃபோட்டோ ஐகானைக் காட்டு",
"settingsThumbnailShowMotionPhotoIcon": "இயக்கப் படப் படவுருவைக் காட்டு",
"@settingsThumbnailShowMotionPhotoIcon": {},
"settingsThumbnailShowRating": "மதிப்பீட்டைக் காட்டு",
"@settingsThumbnailShowRating": {},
"settingsThumbnailShowRawIcon": "மூல ஐகானைக் காட்டு",
"settingsThumbnailShowRawIcon": "மூல படவுருவைக் காட்டு",
"@settingsThumbnailShowRawIcon": {},
"settingsThumbnailShowVideoDuration": "காட்டு ஒளிதோற்றம் duration",
"settingsThumbnailShowVideoDuration": "காணொளி காலம் காட்டு",
"@settingsThumbnailShowVideoDuration": {},
"settingsCollectionQuickActionsTile": "விரைவான செயல்கள்",
"@settingsCollectionQuickActionsTile": {},
@ -499,21 +499,21 @@
"@settingsCollectionQuickActionTabBrowsing": {},
"settingsCollectionQuickActionTabSelecting": "தேர்ந்தெடுப்பது",
"@settingsCollectionQuickActionTabSelecting": {},
"settingsCollectionBrowsingQuickActionEditorBanner": "பொத்தான்களை நகர்த்தவும், உருப்படிகளை உலாவும்போது எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடுக்கவும்.",
"settingsCollectionBrowsingQuickActionEditorBanner": "பொத்தான்களை நகர்த்தவும், உருப்படிகளை உலாவும்போது எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடு.",
"@settingsCollectionBrowsingQuickActionEditorBanner": {},
"settingsCollectionBurstPatternsNone": "எதுவுமில்லை",
"@settingsCollectionBurstPatternsNone": {},
"settingsViewerSectionTitle": "பார்வையாளர்",
"@settingsViewerSectionTitle": {},
"settingsCollectionSelectionQuickActionEditorBanner": "பொத்தான்களை நகர்த்தவும், உருப்படிகளைத் தேர்ந்தெடுக்கும்போது எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடுக்கவும்.",
"settingsCollectionSelectionQuickActionEditorBanner": "பொத்தான்களை நகர்த்தவும், உருப்படிகளைத் தேர்ந்தெடுக்கும்போது எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடு.",
"@settingsCollectionSelectionQuickActionEditorBanner": {},
"settingsViewerGestureSideTapNext": "முந்தைய/அடுத்த உருப்படியைக் காட்ட திரை விளிம்புகளில் தட்டு",
"@settingsViewerGestureSideTapNext": {},
"settingsViewerUseCutout": "கட்அவுட் பகுதியைப் பயன்படுத்தவும்",
"settingsViewerUseCutout": "வெட்டு வெளியைப் பயன்படுத்து",
"@settingsViewerUseCutout": {},
"settingsViewerMaximumBrightness": "அதிகபட்ச ஒளி",
"@settingsViewerMaximumBrightness": {},
"settingsMotionPhotoAutoPlay": "ஆட்டோ பிளே மோசன் புகைப்படங்கள்",
"settingsMotionPhotoAutoPlay": "தானியங்கு இயக்கப் புகைப்படங்கள்",
"@settingsMotionPhotoAutoPlay": {},
"settingsImageBackground": "படப் பின்னணி",
"@settingsImageBackground": {},
@ -523,7 +523,7 @@
"@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {},
"settingsViewerQuickActionEditorPageTitle": "விரைவான செயல்கள்",
"@settingsViewerQuickActionEditorPageTitle": {},
"settingsViewerQuickActionEditorBanner": "பொத்தான்களை நகர்த்தவும், பார்வையாளரில் எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடுக்கவும்.",
"settingsViewerQuickActionEditorBanner": "பொத்தான்களை நகர்த்தவும், பார்வையாளரில் எந்த நடவடிக்கைகள் காண்பிக்கப்படுகின்றன என்பதைத் தேர்ந்தெடு.",
"@settingsViewerQuickActionEditorBanner": {},
"settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "கிடைக்கும் பொத்தான்கள்",
"@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {},
@ -555,15 +555,15 @@
"@settingsSlideshowShuffle": {},
"settingsSlideshowFillScreen": "திரை நிரப்பு",
"@settingsSlideshowFillScreen": {},
"settingsSlideshowAnimatedZoomEffect": "அசைவூட்டம் சூம் விளைவு",
"settingsSlideshowAnimatedZoomEffect": "அசைவூட்டம் மலர்ச்சி விளைவு",
"@settingsSlideshowAnimatedZoomEffect": {},
"settingsSlideshowTransitionTile": "மாற்றம்",
"@settingsSlideshowTransitionTile": {},
"settingsSlideshowIntervalTile": "இடைவேளை",
"@settingsSlideshowIntervalTile": {},
"settingsSlideshowVideoPlaybackTile": "காணொளி பிளேபேக்",
"settingsSlideshowVideoPlaybackTile": "காணொளி மீட்பொலி",
"@settingsSlideshowVideoPlaybackTile": {},
"settingsSlideshowVideoPlaybackDialogTitle": "காணொளி பிளேபேக்",
"settingsSlideshowVideoPlaybackDialogTitle": "காணொளி மீட்பொலி",
"@settingsSlideshowVideoPlaybackDialogTitle": {},
"settingsVideoPageTitle": "காணொளி அமைப்புகள்",
"@settingsVideoPageTitle": {},
@ -571,7 +571,7 @@
"@settingsVideoSectionTitle": {},
"settingsVideoShowVideos": "காணொளிகளைக் காட்டு",
"@settingsVideoShowVideos": {},
"settingsVideoPlaybackTile": "பின்னணி",
"settingsVideoPlaybackTile": "மீட்பொலி",
"@settingsVideoPlaybackTile": {},
"focalLength": "{length} மிமீ",
"@focalLength": {
@ -712,9 +712,9 @@
}
}
},
"statsTopAlbumsSectionTitle": "சிறந்த ஆல்பங்கள்",
"statsTopAlbumsSectionTitle": "மேல் தொகுப்புகள்",
"@statsTopAlbumsSectionTitle": {},
"viewerOpenPanoramaButtonLabel": "திறந்த பனோரமா",
"viewerOpenPanoramaButtonLabel": "பனோரமா திற",
"@viewerOpenPanoramaButtonLabel": {},
"viewerErrorUnknown": "அச்சச்சோ!",
"@viewerErrorUnknown": {},
@ -1345,19 +1345,19 @@
"@editEntryDateDialogExtractFromTitle": {},
"editEntryDateDialogShift": "பெயர்வு",
"@editEntryDateDialogShift": {},
"settingsVideoAutoPlay": "ஆட்டோ நாடகம்",
"settingsVideoAutoPlay": "தானியங்கு",
"@settingsVideoAutoPlay": {},
"settingsVideoLoopModeTile": "சுழல் பயன்முறை",
"@settingsVideoLoopModeTile": {},
"settingsVideoPlaybackPageTitle": "பின்னணி",
"settingsVideoPlaybackPageTitle": "மீட்பொலி",
"@settingsVideoPlaybackPageTitle": {},
"settingsVideoEnableHardwareAcceleration": "வன்பொருள் முடுக்கம்",
"@settingsVideoEnableHardwareAcceleration": {},
"settingsVideoLoopModeDialogTitle": "சுழல் பயன்முறை",
"@settingsVideoLoopModeDialogTitle": {},
"settingsVideoResumptionModeTile": "பிளேபேக்கை மீண்டும் தொடங்குங்கள்",
"settingsVideoResumptionModeTile": "காணொளி மீட்பொலி",
"@settingsVideoResumptionModeTile": {},
"settingsVideoResumptionModeDialogTitle": "பிளேபேக்கை மீண்டும் தொடங்குங்கள்",
"settingsVideoResumptionModeDialogTitle": "மீட்பொலியை மீண்டும் தொடங்கு",
"@settingsVideoResumptionModeDialogTitle": {},
"settingsVideoBackgroundMode": "பின்னணி முறை",
"@settingsVideoBackgroundMode": {},
@ -1373,7 +1373,7 @@
"@settingsVideoGestureDoubleTapTogglePlay": {},
"settingsVideoGestureSideDoubleTapSeek": "பின்தங்கிய/முன்னோக்கி தேட திரை விளிம்புகளில் இரட்டை தட்டவும்",
"@settingsVideoGestureSideDoubleTapSeek": {},
"settingsVideoGestureVerticalDragBrightnessVolume": "பிரகாசம்/அளவை சரிசெய்ய மேலே அல்லது கீழே ச்வைப் செய்யவும்",
"settingsVideoGestureVerticalDragBrightnessVolume": "பொலிவு/அளவை சரிசெய்ய மேலே அல்லது கீழே தேய்",
"@settingsVideoGestureVerticalDragBrightnessVolume": {},
"settingsSubtitleThemePageTitle": "வசன வரிகள்",
"@settingsSubtitleThemePageTitle": {},
@ -1389,7 +1389,7 @@
"@settingsSubtitleThemeTextPositionDialogTitle": {},
"settingsSubtitleThemeTextSize": "உரை அளவு",
"@settingsSubtitleThemeTextSize": {},
"settingsSubtitleThemeShowOutline": "அவுட்லைன் மற்றும் நிழலைக் காட்டுங்கள்",
"settingsSubtitleThemeShowOutline": "சுருக்கம் மற்றும் நிழலைக் காட்டுங்கள்",
"@settingsSubtitleThemeShowOutline": {},
"settingsSubtitleThemeTextColor": "உரை நிறம்",
"@settingsSubtitleThemeTextColor": {},
@ -1411,7 +1411,7 @@
"@settingsAllowInstalledAppAccess": {},
"settingsAllowInstalledAppAccessSubtitle": "தொகுப்புக் காட்சியை மேம்படுத்தப் பயன்படுகிறது",
"@settingsAllowInstalledAppAccessSubtitle": {},
"settingsAllowErrorReporting": "அநாமதேய பிழை அறிக்கையை அனுமதி",
"settingsAllowErrorReporting": "பெயரிலி பிழை அறிக்கையை அனுமதி",
"@settingsAllowErrorReporting": {},
"settingsSaveSearchHistory": "தேடல் வரலாற்றைச் சேமி",
"@settingsSaveSearchHistory": {},
@ -1439,7 +1439,7 @@
"@settingsStorageAccessBanner": {},
"settingsStorageAccessEmpty": "அணுகல் மானியங்கள் இல்லை",
"@settingsStorageAccessEmpty": {},
"settingsStorageAccessRevokeTooltip": "ரத்து செய்யுங்கள்",
"settingsStorageAccessRevokeTooltip": "திரும்பப்பெறு",
"@settingsStorageAccessRevokeTooltip": {},
"settingsAccessibilitySectionTitle": "அணுகுதிறன்",
"@settingsAccessibilitySectionTitle": {},
@ -1465,43 +1465,43 @@
"@settingsDisplayRefreshRateModeTile": {},
"settingsDisplayRefreshRateModeDialogTitle": "புதுப்பிப்பு வீதம்",
"@settingsDisplayRefreshRateModeDialogTitle": {},
"settingsDisplayUseTvInterface": "ஆண்ட்ராய்டு டிவி இடைமுகம்",
"settingsDisplayUseTvInterface": "ஆண்ட்ராய்டு தொலைகாட்சி இடைமுகம்",
"@settingsDisplayUseTvInterface": {},
"settingsLanguageSectionTitle": "மொழி & வடிவங்கள்",
"@settingsLanguageSectionTitle": {},
"settingsLanguagePageTitle": "மொழி",
"@settingsLanguagePageTitle": {},
"settingsCoordinateFormatTile": "ஒருங்கிணைப்பு வடிவம்",
"settingsCoordinateFormatTile": "ஆய வடிவம்",
"@settingsCoordinateFormatTile": {},
"settingsCoordinateFormatDialogTitle": "ஒருங்கிணைப்பு வடிவம்",
"settingsCoordinateFormatDialogTitle": "ஆய வடிவம்",
"@settingsCoordinateFormatDialogTitle": {},
"settingsUnitSystemTile": "அலகுகள்",
"@settingsUnitSystemTile": {},
"settingsUnitSystemDialogTitle": "அலகுகள்",
"@settingsUnitSystemDialogTitle": {},
"settingsForceWesternArabicNumeralsTile": "அரபு எண்களை கட்டாயப்படுத்துங்கள்",
"settingsForceWesternArabicNumeralsTile": "அரபு எண்களைக் கட்டாயப்படுத்துங்கள்",
"@settingsForceWesternArabicNumeralsTile": {},
"settingsScreenSaverPageTitle": "திரை சேவர்",
"settingsScreenSaverPageTitle": "திரை சேமிப்பான்",
"@settingsScreenSaverPageTitle": {},
"settingsWidgetPageTitle": "புகைப்பட சட்டகம்",
"@settingsWidgetPageTitle": {},
"settingsWidgetShowOutline": "அவுட்லைன்",
"settingsWidgetShowOutline": "சுருக்கம்",
"@settingsWidgetShowOutline": {},
"settingsWidgetOpenPage": "விட்செட்டில் தட்டும்போது",
"settingsWidgetOpenPage": "நிரல் பலகையில் தட்டும்போது",
"@settingsWidgetOpenPage": {},
"settingsWidgetDisplayedItem": "காட்டப்பட்ட உருப்படி",
"@settingsWidgetDisplayedItem": {},
"settingsCollectionTile": "சேகரிப்பு",
"@settingsCollectionTile": {},
"statsTopPlacesSectionTitle": "சிறந்த இடங்கள்",
"statsTopPlacesSectionTitle": "மேல் இடங்கள்",
"@statsTopPlacesSectionTitle": {},
"statsTopCountriesSectionTitle": "சிறந்த நாடுகள்",
"statsTopCountriesSectionTitle": "மேல் நாடுகள்",
"@statsTopCountriesSectionTitle": {},
"statsTopStatesSectionTitle": "சிறந்த மாநிலங்கள்",
"statsTopStatesSectionTitle": "மேல் மாநிலங்கள்",
"@statsTopStatesSectionTitle": {},
"statsTopTagsSectionTitle": "சிறந்த குறிச்சொற்கள்",
"statsTopTagsSectionTitle": "மேல் குறிச்சொற்கள்",
"@statsTopTagsSectionTitle": {},
"viewerSetWallpaperButtonLabel": "வால்பேப்பரை அமைக்கவும்",
"viewerSetWallpaperButtonLabel": "சுவர்த்தாளை அமை",
"@viewerSetWallpaperButtonLabel": {},
"viewerErrorDoesNotExist": "கோப்பு இனி இல்லை.",
"@viewerErrorDoesNotExist": {},
@ -1519,9 +1519,9 @@
"@viewerInfoPageTitle": {},
"viewerInfoBackToViewerTooltip": "பார்வையாளருக்குத் திரும்பு",
"@viewerInfoBackToViewerTooltip": {},
"viewerInfoUnknown": "தெரியவில்லை",
"viewerInfoUnknown": "தெரியாத",
"@viewerInfoUnknown": {},
"viewerInfoLabelUri": "யூரி",
"viewerInfoLabelUri": "இணையமுகவரி",
"@viewerInfoLabelUri": {},
"viewerInfoLabelPath": "பாதை",
"@viewerInfoLabelPath": {},
@ -1529,17 +1529,17 @@
"@viewerInfoLabelDuration": {},
"viewerInfoLabelOwner": "உரிமையாளர்",
"@viewerInfoLabelOwner": {},
"viewerInfoLabelCoordinates": "ஒருங்கிணைப்புகள்",
"viewerInfoLabelCoordinates": "அச்சுத்தூரங்கள்",
"@viewerInfoLabelCoordinates": {},
"viewerInfoLabelAddress": "முகவரி",
"@viewerInfoLabelAddress": {},
"mapStyleDialogTitle": "வரைபட நடை",
"@mapStyleDialogTitle": {},
"mapStyleTooltip": "வரைபட பாணியைத் தேர்ந்தெடுக்கவும்",
"mapStyleTooltip": "வரைபட பாணியைத் தேர்ந்தெடு",
"@mapStyleTooltip": {},
"mapZoomOutTooltip": "சிறிதாக்கு",
"@mapZoomOutTooltip": {},
"mapPointNorthUpTooltip": "வடக்கே சுட்டிக்காட்டவும்",
"mapPointNorthUpTooltip": "வடக்கு மேலே காட்டு",
"@mapPointNorthUpTooltip": {},
"mapAttributionOsmData": "வரைபட தரவு © [OpenStreetMap](https://www.openstreetmap.org/copyright) பங்களிப்பாளர்கள்",
"@mapAttributionOsmData": {},
@ -1551,29 +1551,29 @@
"@mapAttributionOsmHot": {},
"mapAttributionStamen": "[Stamen Design](https://stamen.com) மூலம் ஓடுகள், [CC BY 3.0](https://creativecommons.org/licenses/by/3.0)",
"@mapAttributionStamen": {},
"mapEmptyRegion": "இந்த பிராந்தியத்தில் படங்கள் இல்லை",
"mapEmptyRegion": "இந்தப் வட்டாரத்தில் படங்கள் இல்லை",
"@mapEmptyRegion": {},
"viewerInfoOpenEmbeddedFailureFeedback": "உட்பொதிக்கப்பட்ட தரவைப் பிரித்தெடுப்பதில் தோல்வி",
"@viewerInfoOpenEmbeddedFailureFeedback": {},
"viewerInfoOpenLinkText": "திற",
"@viewerInfoOpenLinkText": {},
"viewerInfoViewXmlLinkText": "எக்ச்எம்எல் காண்க",
"viewerInfoViewXmlLinkText": "நீகுமொ காண்க",
"@viewerInfoViewXmlLinkText": {},
"viewerInfoSearchFieldLabel": "மெட்டாடேட்டாவைத் தேடுங்கள்",
"viewerInfoSearchFieldLabel": "மேனிலை தரவைத் தேடு",
"@viewerInfoSearchFieldLabel": {},
"viewerInfoSearchEmpty": "பொருந்தக்கூடிய விசைகள் இல்லை",
"viewerInfoSearchEmpty": "பொருந்தக்கூடிய திறவுகோல்கள் இல்லை",
"@viewerInfoSearchEmpty": {},
"viewerInfoSearchSuggestionResolution": "பகுத்தல்",
"@viewerInfoSearchSuggestionResolution": {},
"viewerInfoSearchSuggestionRights": "உரிமைகள்",
"@viewerInfoSearchSuggestionRights": {},
"wallpaperUseScrollEffect": "முகப்புத் திரையில் உருள் விளைவைப் பயன்படுத்தவும்",
"wallpaperUseScrollEffect": "முகப்புத் திரையில் உருள் விளைவைப் பயன்படுத்த",
"@wallpaperUseScrollEffect": {},
"tagEditorPageTitle": "குறிச்சொற்களைத் திருத்து",
"@tagEditorPageTitle": {},
"tagEditorPageNewTagFieldLabel": "புதிய குறிச்சொல்",
"@tagEditorPageNewTagFieldLabel": {},
"tagEditorPageAddTagTooltip": "குறிச்சொல்லைச் சேர்க்கவும்",
"tagEditorPageAddTagTooltip": "குறிச்சொல்லைச் சேர்",
"@tagEditorPageAddTagTooltip": {},
"tagEditorSectionRecent": "அண்மைக் கால",
"@tagEditorSectionRecent": {},
@ -1587,9 +1587,9 @@
"@tagPlaceholderState": {},
"tagPlaceholderPlace": "இடம்",
"@tagPlaceholderPlace": {},
"panoramaEnableSensorControl": "சென்சார் கட்டுப்பாட்டை இயக்கவும்",
"panoramaEnableSensorControl": "உணரி கட்டுப்பாட்டை இயக்கு",
"@panoramaEnableSensorControl": {},
"panoramaDisableSensorControl": "சென்சார் கட்டுப்பாட்டை முடக்கு",
"panoramaDisableSensorControl": "உணரி கட்டுப்பாட்டை முடக்கு",
"@panoramaDisableSensorControl": {},
"sourceViewerPageTitle": "மூலம்",
"@sourceViewerPageTitle": {},
@ -1601,6 +1601,6 @@
"@filePickerOpenFrom": {},
"filePickerNoItems": "உருப்படிகள் இல்லை",
"@filePickerNoItems": {},
"filePickerUseThisFolder": "இந்த கோப்புறையைப் பயன்படுத்தவும்",
"filePickerUseThisFolder": "இந்தக் கோப்புறையைப் பயன்படுத்த",
"@filePickerUseThisFolder": {}
}

View file

@ -1562,5 +1562,7 @@
"collectionActionAddDynamicAlbum": "Додати динамічний альбом",
"@collectionActionAddDynamicAlbum": {},
"appExportDynamicAlbums": "Динамічні альбоми",
"@appExportDynamicAlbums": {}
"@appExportDynamicAlbums": {},
"chipActionDecompose": "Спліт",
"@chipActionDecompose": {}
}

View file

@ -1544,5 +1544,23 @@
"sortOrderLongestFirst": "Dài nhất trước",
"@sortOrderLongestFirst": {},
"mapAttributionOsmLiberty": "Cung cấp bởi [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Được lưu trữ bởi [OSM Americana](https://tile.ourmap.us)",
"@mapAttributionOsmLiberty": {}
"@mapAttributionOsmLiberty": {},
"videoActionShowPreviousFrame": "Hiển thị khung hình trước đó",
"@videoActionShowPreviousFrame": {},
"chipActionRemove": "Loại bỏ",
"@chipActionRemove": {},
"albumTierDynamic": "Động",
"@albumTierDynamic": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "Album đã tồn tại",
"@newAlbumDialogAlbumAlreadyExistsHelper": {},
"dynamicAlbumAlreadyExists": "Album động đã tồn tại",
"@dynamicAlbumAlreadyExists": {},
"collectionActionAddDynamicAlbum": "Thêm album động",
"@collectionActionAddDynamicAlbum": {},
"appExportDynamicAlbums": "Album động",
"@appExportDynamicAlbums": {},
"videoActionShowNextFrame": "Hiển thị khung hình tiếp theo",
"@videoActionShowNextFrame": {},
"newDynamicAlbumDialogTitle": "Album động mới",
"@newDynamicAlbumDialogTitle": {}
}

View file

@ -27,7 +27,7 @@ class Contributors {
Contributor('Oğuz Ersen', 'oguz@ersen.moe'),
Contributor('Allan Nordhøy', 'epost@anotheragency.no'),
Contributor('pemibe', 'pemibe4634@dmonies.com'),
Contributor('Linerly', 'linerly@protonmail.com'),
Contributor('Linerly', 'linerly@proton.me'),
Contributor('Skrripy', 'rozihrash.ya6w7@simplelogin.com'),
Contributor('vesp', 'vesp@post.cz'),
Contributor('Dan', 'denqwerta@gmail.com'),
@ -117,14 +117,17 @@ class Contributors {
Contributor('Petrov', 'i_v_c@mail.ru'),
Contributor('தமிழ்நேரம்', 'anishprabu.t@gmail.com'),
Contributor('bovirus', 'roberto.boriotti@canon.it'),
Contributor('Максим Горпиніч', 'mgorpinic2005@gmail.com'),
Contributor('Максим Горпиніч', 'maksimgorpinic2005a@gmail.com'),
Contributor('Priit Jõerüüt', 'hwlate@joeruut.com'),
Contributor('Dr Hieu', 'v7pvas7m@anonaddy.com'),
Contributor('Saúl Palacios', 'palacios22c@gmail.com'),
Contributor('Grooty12', 'Rasmus@rosendahl-kaa.name'),
Contributor('Victor M', 'victormorita@tuta.io'),
Contributor('cat', 'catsnote@proton.me'),
// Contributor('Femini', 'nizamismidov4@gmail.com'), // Azerbaijani
// Contributor('Alvi Khan', 'aveenalvi@gmail.com'), // Bengali
// Contributor('Htet Oo Hlaing', 'htetoh2006@outlook.com'), // Burmese
// Contributor('Khant', 'khant@users.noreply.hosted.weblate.org'), // Burmese
// Contributor('Grooty12', 'Rasmus@rosendahl-kaa.name'), // Danish
// Contributor('Victor M', 'victormorita@tuta.io'), // Danish
// Contributor('Åzze', 'laitinen.jere222@gmail.com'), // Finnish
// Contributor('Olli', 'ollinen@ollit.dev'), // Finnish
// Contributor('Idj', 'joneltmp+goahn@gmail.com'), // Hebrew

View file

@ -18,6 +18,8 @@ class SetAndFilter extends CollectionFilter {
CollectionFilter get _first => _filters.first;
Set<CollectionFilter> get innerFilters => _filters.toSet();
SetAndFilter(Set<CollectionFilter> filters, {super.reversed = false}) {
_filters = filters.toList().sorted();
_test = (entry) => _filters.every((v) => v.test(entry));

View file

@ -167,10 +167,12 @@ class CollectionLens with ChangeNotifier {
}
}
void addFilter(CollectionFilter filter) {
if (filters.contains(filter)) return;
filters.removeWhere((other) => !filter.isCompatible(other));
filters.add(filter);
void addFilters(Set<CollectionFilter> newFilters) {
if (filters.containsAll(newFilters)) return;
for (final filter in newFilters) {
filters.removeWhere((other) => !filter.isCompatible(other));
}
filters.addAll(newFilters);
_onFilterChanged();
}

View file

@ -493,17 +493,13 @@ abstract class CollectionSource with SourceBase, AlbumMixin, CountryMixin, Place
// cataloguing
if (!startAnalysisService) {
final opCount = (force ? todoEntries : todoEntries.where(TagMixin.catalogEntriesTest)).length;
if (opCount > TagMixin.commitCountThreshold) {
startAnalysisService = true;
}
startAnalysisService = opCount > TagMixin.commitCountThreshold;
}
// ignore locating countries
// locating places
if (!startAnalysisService && await availability.canLocatePlaces) {
final opCount = (force ? todoEntries.where((entry) => entry.hasGps) : todoEntries.where(LocationMixin.locatePlacesTest)).length;
if (opCount > LocationMixin.commitCountThreshold) {
startAnalysisService = true;
}
startAnalysisService = opCount > LocationMixin.commitCountThreshold;
}
}

View file

@ -65,7 +65,7 @@ class MediaStoreSource extends CollectionSource {
final deviceOffset = DateTime.now().timeZoneOffset.inMilliseconds;
final catalogOffset = settings.catalogTimeZoneOffsetMillis;
if (deviceOffset != catalogOffset) {
unawaited(reportService.recordError('Time zone offset change: $catalogOffset -> $deviceOffset. Clear catalog metadata to get correct date/times.'));
unawaited(reportService.log('Time zone offset change: $catalogOffset -> $deviceOffset. Clear catalog metadata to get correct date/times.'));
await localMediaDb.clearDates();
await localMediaDb.clearCatalogMetadata();
settings.catalogTimeZoneOffsetMillis = deviceOffset;

View file

@ -145,6 +145,7 @@ class AIcons {
static final showFullscreenArrows = MdiIcons.arrowExpand;
static const showFullscreenCorners = Icons.fullscreen_outlined;
static const slideshow = Icons.slideshow_outlined;
static const split = Icons.call_split_outlined;
static const stats = Icons.donut_small_outlined;
static const vaultLock = Icons.lock_outlined;
static const vaultAdd = Icons.enhanced_encryption_outlined;

View file

@ -16,6 +16,7 @@ extension ExtraChipActionView on ChipAction {
ChipAction.ratingOrLower =>
// different data depending on state
toString(),
ChipAction.decompose => l10n.chipActionDecompose,
ChipAction.reverse =>
// different data depending on state
l10n.chipActionFilterOut,
@ -33,6 +34,7 @@ extension ExtraChipActionView on ChipAction {
ChipAction.goToTagPage => AIcons.tag,
ChipAction.goToExplorerPage => AIcons.explorer,
ChipAction.ratingOrGreater || ChipAction.ratingOrLower => AIcons.rating,
ChipAction.decompose => AIcons.split,
ChipAction.reverse => AIcons.reverse,
ChipAction.hide => AIcons.hide,
ChipAction.lockVault => AIcons.vaultLock,

View file

@ -67,7 +67,6 @@ class AvesApp extends StatefulWidget {
'az', // Azerbaijani
'bn', // Bengali
'ckb', // Kurdish (Central)
'da', // Danish
'fi', // Finnish
'gl', // Galician
'he', // Hebrew
@ -203,7 +202,10 @@ class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver {
_subscriptions.add(_errorChannel.receiveBroadcastStream().listen((event) => _onError(event as String?)));
_updateCutoutInsets();
_appModeNotifier.addListener(_onAppModeChanged);
debugPrint('start listening to app lifecycle');
WidgetsBinding.instance.addObserver(this);
AvesApp.lifecycleStateNotifier.value = WidgetsBinding.instance.lifecycleState ?? AppLifecycleState.detached;
}
@override
@ -211,7 +213,10 @@ class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver {
_subscriptions
..forEach((sub) => sub.cancel())
..clear();
debugPrint('stop listening to app lifecycle');
WidgetsBinding.instance.removeObserver(this);
_pageTransitionsBuilderNotifier.dispose();
_tvMediaQueryModifierNotifier.dispose();
_appModeNotifier.dispose();

View file

@ -3,8 +3,10 @@ import 'dart:math';
import 'package:aves/app_mode.dart';
import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/filters/covered/dynamic_album.dart';
import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/filters/query.dart';
import 'package:aves/model/filters/set_and.dart';
import 'package:aves/model/filters/trash.dart';
import 'package:aves/model/query.dart';
import 'package:aves/model/selection.dart';
@ -33,8 +35,8 @@ import 'package:aves/widgets/common/identity/buttons/captioned_button.dart';
import 'package:aves/widgets/common/search/route.dart';
import 'package:aves/widgets/common/tile_extent_controller.dart';
import 'package:aves/widgets/dialogs/tile_view_dialog.dart';
import 'package:aves/widgets/filter_grids/common/action_delegates/chip.dart';
import 'package:aves/widgets/search/search_delegate.dart';
import 'package:aves/widgets/viewer/controls/notifications.dart';
import 'package:aves_model/aves_model.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
@ -199,10 +201,22 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
),
),
if (showFilterBar)
NotificationListener<FilterNotification>(
NotificationListener(
onNotification: (notification) {
collection.addFilter(notification.filter);
return true;
if (notification is SelectFilterNotification) {
collection.addFilters({notification.filter});
return true;
} else if (notification is DecomposeFilterNotification) {
final filter = notification.filter;
if (filter is DynamicAlbumFilter) {
final innerFilter = filter.filter;
final newFilters = innerFilter is SetAndFilter ? innerFilter.innerFilters : {innerFilter};
collection.addFilters(newFilters);
collection.removeFilter(filter);
return true;
}
}
return false;
},
child: FilterBar(
filters: visibleFilters,

View file

@ -3,12 +3,8 @@ import 'dart:math';
import 'package:aves/app_mode.dart';
import 'package:aves/model/covers.dart';
import 'package:aves/model/filters/covered/stored_album.dart';
import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/filters/covered/location.dart';
import 'package:aves/model/filters/path.dart';
import 'package:aves/model/filters/rating.dart';
import 'package:aves/model/filters/covered/tag.dart';
import 'package:aves/model/settings/enums/accessibility_animations.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/theme/colors.dart';
@ -101,21 +97,6 @@ class AvesFilterChip extends StatefulWidget {
static Future<void> showDefaultLongPressMenu(BuildContext context, CollectionFilter filter, Offset tapPosition) async {
if (context.read<ValueNotifier<AppMode>>().value.canNavigate) {
final actions = <ChipAction>[
if (filter is AlbumBaseFilter) ChipAction.goToAlbumPage,
if (filter is StoredAlbumFilter || filter is PathFilter) ChipAction.goToExplorerPage,
if ((filter is LocationFilter && filter.level == LocationLevel.country)) ChipAction.goToCountryPage,
if ((filter is LocationFilter && filter.level == LocationLevel.place)) ChipAction.goToPlacePage,
if (filter is TagFilter) ChipAction.goToTagPage,
if (filter is RatingFilter && 1 < filter.rating && filter.rating < 5) ...[
if (filter.op != RatingFilter.opOrGreater) ChipAction.ratingOrGreater,
if (filter.op != RatingFilter.opOrLower) ChipAction.ratingOrLower,
],
ChipAction.reverse,
ChipAction.hide,
ChipAction.lockVault,
];
// remove focus, if any, to prevent the keyboard from showing up
// after the user is done with the popup menu
FocusManager.instance.primaryFocus?.unfocus();
@ -132,7 +113,7 @@ class AvesFilterChip extends StatefulWidget {
child: Text(filter.getLabel(context)),
),
const PopupMenuDivider(),
...actions.where((action) => actionDelegate.isVisible(action, filter: filter)).map((action) {
...ChipAction.values.where((action) => actionDelegate.isVisible(action, filter: filter)).map((action) {
late String text;
switch (action) {
case ChipAction.reverse:

View file

@ -92,7 +92,7 @@ class _OverlayCoordinateFilterChipState extends State<OverlayCoordinateFilterChi
useFilterColor: false,
background: Themes.overlayBackgroundColor(brightness: theme.brightness, blurred: blurred),
maxWidth: double.infinity,
onTap: (filter) => FilterSelectedNotification(CoordinateFilter(bounds.sw, bounds.ne)).dispatch(context),
onTap: (filter) => SelectFilterNotification(CoordinateFilter(bounds.sw, bounds.ne)).dispatch(context),
),
),
);

View file

@ -97,7 +97,12 @@ class ExplorerActionDelegate with FeedbackMixin {
}
void _hide(BuildContext context) {
ChipActionDelegate().onActionSelected(context, _getPathFilter(), ChipAction.hide);
final chipActionDelegate = ChipActionDelegate();
const action = ChipAction.hide;
final pathFilter = _getPathFilter();
if (chipActionDelegate.isVisible(action, filter: pathFilter)) {
chipActionDelegate.onActionSelected(context, pathFilter, action);
}
}
void _goToStats(BuildContext context) {

View file

@ -1,4 +1,7 @@
import 'package:aves/model/filters/covered/dynamic_album.dart';
import 'package:aves/model/filters/covered/location.dart';
import 'package:aves/model/filters/covered/stored_album.dart';
import 'package:aves/model/filters/covered/tag.dart';
import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/filters/path.dart';
import 'package:aves/model/filters/rating.dart';
@ -15,6 +18,7 @@ import 'package:aves/widgets/filter_grids/albums_page.dart';
import 'package:aves/widgets/filter_grids/countries_page.dart';
import 'package:aves/widgets/filter_grids/places_page.dart';
import 'package:aves/widgets/filter_grids/tags_page.dart';
import 'package:aves/widgets/viewer/controls/notifications.dart';
import 'package:aves_model/aves_model.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@ -26,12 +30,21 @@ class ChipActionDelegate with FeedbackMixin, VaultAwareMixin {
}) {
switch (action) {
case ChipAction.goToAlbumPage:
return filter is AlbumBaseFilter;
case ChipAction.goToCountryPage:
return filter is LocationFilter && filter.level == LocationLevel.country;
case ChipAction.goToPlacePage:
return filter is LocationFilter && filter.level == LocationLevel.place;
case ChipAction.goToTagPage:
return filter is TagFilter;
case ChipAction.goToExplorerPage:
return filter is StoredAlbumFilter || filter is PathFilter;
case ChipAction.ratingOrGreater:
return filter is RatingFilter && 1 < filter.rating && filter.rating < 5 && filter.op != RatingFilter.opOrGreater;
case ChipAction.ratingOrLower:
return filter is RatingFilter && 1 < filter.rating && filter.rating < 5 && filter.op != RatingFilter.opOrLower;
case ChipAction.decompose:
return filter is DynamicAlbumFilter;
case ChipAction.reverse:
return true;
case ChipAction.hide:
@ -69,11 +82,13 @@ class ChipActionDelegate with FeedbackMixin, VaultAwareMixin {
);
}
case ChipAction.ratingOrGreater:
FilterNotification((filter as RatingFilter).copyWith(RatingFilter.opOrGreater)).dispatch(context);
SelectFilterNotification((filter as RatingFilter).copyWith(RatingFilter.opOrGreater)).dispatch(context);
case ChipAction.ratingOrLower:
FilterNotification((filter as RatingFilter).copyWith(RatingFilter.opOrLower)).dispatch(context);
SelectFilterNotification((filter as RatingFilter).copyWith(RatingFilter.opOrLower)).dispatch(context);
case ChipAction.decompose:
DecomposeFilterNotification(filter).dispatch(context);
case ChipAction.reverse:
FilterNotification(filter.reverse()).dispatch(context);
SelectFilterNotification(filter.reverse()).dispatch(context);
case ChipAction.hide:
_hide(context, filter);
case ChipAction.lockVault:
@ -119,10 +134,3 @@ class ChipActionDelegate with FeedbackMixin, VaultAwareMixin {
settings.changeFilterVisibility({filter}, false);
}
}
@immutable
class FilterNotification extends Notification {
final CollectionFilter filter;
const FilterNotification(this.filter);
}

View file

@ -240,7 +240,8 @@ class _HomePageState extends State<HomePage> {
unawaited(AnalysisService.registerCallback());
await reportService.log('Initialize source to view item in directory $directory');
final source = context.read<CollectionSource>();
source.canAnalyze = false;
// analysis is necessary to display neighbour items when the initial item is a new one
source.canAnalyze = true;
await source.init(scope: {StoredAlbumFilter(directory, null)});
}
} else {

View file

@ -4,8 +4,8 @@ import 'package:aves/app_mode.dart';
import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/entry/extensions/location.dart';
import 'package:aves/model/filters/coordinate.dart';
import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/filters/covered/location.dart';
import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/highlight.dart';
import 'package:aves/model/media/geotiff.dart';
import 'package:aves/model/settings/enums/accessibility_animations.dart';
@ -31,7 +31,6 @@ import 'package:aves/widgets/common/map/map_action_delegate.dart';
import 'package:aves/widgets/common/providers/highlight_info_provider.dart';
import 'package:aves/widgets/common/providers/map_theme_provider.dart';
import 'package:aves/widgets/dialogs/aves_dialog.dart';
import 'package:aves/widgets/filter_grids/common/action_delegates/chip.dart';
import 'package:aves/widgets/map/scroller.dart';
import 'package:aves/widgets/viewer/controls/notifications.dart';
import 'package:aves/widgets/viewer/entry_viewer_page.dart';
@ -203,9 +202,7 @@ class _ContentState extends State<_Content> with SingleTickerProviderStateMixin
Widget build(BuildContext context) {
return NotificationListener(
onNotification: (notification) {
if (notification is FilterSelectedNotification) {
_goToCollection(notification.filter);
} else if (notification is FilterNotification) {
if (notification is SelectFilterNotification) {
_goToCollection(notification.filter);
} else if (notification is OpenMapAppNotification) {
_openMapApp();

View file

@ -1,16 +1,18 @@
import 'package:aves/model/dynamic_albums.dart';
import 'package:aves/model/filters/covered/stored_album.dart';
import 'package:aves/model/filters/aspect_ratio.dart';
import 'package:aves/model/filters/covered/dynamic_album.dart';
import 'package:aves/model/filters/covered/location.dart';
import 'package:aves/model/filters/covered/stored_album.dart';
import 'package:aves/model/filters/covered/tag.dart';
import 'package:aves/model/filters/date.dart';
import 'package:aves/model/filters/favourite.dart';
import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/filters/covered/location.dart';
import 'package:aves/model/filters/mime.dart';
import 'package:aves/model/filters/missing.dart';
import 'package:aves/model/filters/query.dart';
import 'package:aves/model/filters/rating.dart';
import 'package:aves/model/filters/recent.dart';
import 'package:aves/model/filters/covered/tag.dart';
import 'package:aves/model/filters/set_and.dart';
import 'package:aves/model/filters/type.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/model/source/album.dart';
@ -29,7 +31,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/identity/aves_filter_chip.dart';
import 'package:aves/widgets/common/search/delegate.dart';
import 'package:aves/widgets/common/search/page.dart';
import 'package:aves/widgets/filter_grids/common/action_delegates/chip.dart';
import 'package:aves/widgets/viewer/controls/notifications.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@ -91,10 +93,21 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va
final upQuery = query.trim().toUpperCase();
bool containQuery(String s) => s.toUpperCase().contains(upQuery);
return SafeArea(
child: NotificationListener<FilterNotification>(
child: NotificationListener(
onNotification: (notification) {
_select(context, notification.filter);
return true;
if (notification is SelectFilterNotification) {
_select(context, {notification.filter});
return true;
} else if (notification is DecomposeFilterNotification) {
final filter = notification.filter;
if (filter is DynamicAlbumFilter) {
final innerFilter = filter.filter;
final newFilters = innerFilter is SetAndFilter ? innerFilter.innerFilters : {innerFilter};
_select(context, newFilters);
return true;
}
}
return false;
},
child: ValueListenableBuilder<String?>(
valueListenable: _expandedSectionNotifier,
@ -159,7 +172,7 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va
required List<CollectionFilter> filters,
HeroType Function(CollectionFilter filter)? heroTypeBuilder,
}) {
void onTap(filter) => _select(context, filter is QueryFilter ? QueryFilter(filter.query) : filter);
void onTap(filter) => _select(context, {filter is QueryFilter ? QueryFilter(filter.query) : filter});
const onLongPress = AvesFilterChip.showDefaultLongPressMenu;
return title != null
? TitledExpandableFilterRow(
@ -205,7 +218,7 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va
source.getStoredAlbumDisplayName(context, album),
))
.where((filter) => containQuery(filter.displayName ?? filter.album)),
...dynamicAlbums.all,
...dynamicAlbums.all.where((filter) => containQuery(filter.name)),
]..sort();
return _buildFilterRow(
context: context,
@ -303,7 +316,7 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va
// `buildResults` is called in the build phase,
// so we post the call that will filter the collection
// and possibly trigger a rebuild here
_select(context, _buildQueryFilter(true));
_select(context, {_buildQueryFilter(true)});
});
}
return const SizedBox();
@ -314,29 +327,33 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va
return cleanQuery.isNotEmpty ? QueryFilter(cleanQuery, colorful: colorful) : null;
}
Future<void> _select(BuildContext context, CollectionFilter? filter) async {
if (filter == null) {
Future<void> _select(BuildContext context, Set<CollectionFilter?> filters) async {
final newFilters = filters.nonNulls.toSet();
if (newFilters.isEmpty) {
goBack(context);
return;
}
if (!await unlockFilter(context, filter)) return;
for (final filter in newFilters) {
if (!await unlockFilter(context, filter)) return;
if (settings.saveSearchHistory) {
final history = settings.searchHistory
..remove(filter)
..insert(0, filter);
settings.searchHistory = history.take(searchHistoryCount).toList();
if (settings.saveSearchHistory) {
final history = settings.searchHistory
..remove(filter)
..insert(0, filter);
settings.searchHistory = history.take(searchHistoryCount).toList();
}
}
if (parentCollection != null) {
_applyToParentCollectionPage(context, filter);
_applyToParentCollectionPage(context, newFilters);
} else {
_jumpToCollectionPage(context, {filter});
_jumpToCollectionPage(context, newFilters);
}
}
void _applyToParentCollectionPage(BuildContext context, CollectionFilter filter) {
parentCollection!.addFilter(filter);
void _applyToParentCollectionPage(BuildContext context, Set<CollectionFilter> filters) {
parentCollection!.addFilters(filters);
if (Navigator.canPop(context)) {
// We delay closing the current page after applying the filter selection
// so that hero animation target is ready in the `FilterBar`,

View file

@ -8,6 +8,7 @@ class SupportedLocales {
'bg': 'Български',
'ca': 'Català',
'cs': 'Čeština',
'da': 'Dansk',
'de': 'Deutsch',
'el': 'Ελληνικά',
'en': 'English',

View file

@ -1,11 +1,11 @@
import 'dart:async';
import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/filters/covered/stored_album.dart';
import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/filters/covered/location.dart';
import 'package:aves/model/filters/rating.dart';
import 'package:aves/model/filters/covered/stored_album.dart';
import 'package:aves/model/filters/covered/tag.dart';
import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/filters/rating.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/model/source/collection_source.dart';
@ -24,11 +24,11 @@ import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/extensions/media_query.dart';
import 'package:aves/widgets/common/identity/aves_filter_chip.dart';
import 'package:aves/widgets/common/identity/empty.dart';
import 'package:aves/widgets/filter_grids/common/action_delegates/chip.dart';
import 'package:aves/widgets/stats/date/histogram.dart';
import 'package:aves/widgets/stats/filter_table.dart';
import 'package:aves/widgets/stats/mime_donut.dart';
import 'package:aves/widgets/stats/percent_text.dart';
import 'package:aves/widgets/viewer/controls/notifications.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
@ -172,7 +172,7 @@ class _StatsPageState extends State<StatsPage> with FeedbackMixin, VaultAwareMix
],
),
);
child = NotificationListener<FilterNotification>(
child = NotificationListener<SelectFilterNotification>(
onNotification: (notification) {
_onFilterSelection(context, notification.filter);
return true;
@ -336,7 +336,7 @@ class _StatsPageState extends State<StatsPage> with FeedbackMixin, VaultAwareMix
}
void _applyToParentCollectionPage(BuildContext context, CollectionFilter filter) {
widget.parentCollection!.addFilter(filter);
widget.parentCollection!.addFilters({filter});
// We delay closing the current page after applying the filter selection
// so that hero animation target is ready in the `FilterBar`,
// even when the target is a child of an `AnimatedList`.
@ -384,7 +384,7 @@ class StatsTopPage extends StatelessWidget {
child: SafeArea(
bottom: false,
child: Builder(builder: (context) {
return NotificationListener<FilterNotification>(
return NotificationListener<SelectFilterNotification>(
onNotification: (notification) {
onFilterSelection(notification.filter);
return true;

View file

@ -89,13 +89,23 @@ class CastNotification extends Notification with EquatableMixin {
}
@immutable
class FilterSelectedNotification extends Notification with EquatableMixin {
class SelectFilterNotification extends Notification with EquatableMixin {
final CollectionFilter filter;
@override
List<Object?> get props => [filter];
const FilterSelectedNotification(this.filter);
const SelectFilterNotification(this.filter);
}
@immutable
class DecomposeFilterNotification extends Notification with EquatableMixin {
final CollectionFilter filter;
@override
List<Object?> get props => [filter];
const DecomposeFilterNotification(this.filter);
}
@immutable

View file

@ -564,7 +564,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with EntryViewContr
}
bool _handleNotification(dynamic notification) {
if (notification is FilterSelectedNotification) {
if (notification is SelectFilterNotification) {
_goToCollection(notification.filter);
} else if (notification is CastNotification) {
_cast(notification.enabled);

View file

@ -10,7 +10,6 @@ import 'package:aves/theme/durations.dart';
import 'package:aves/widgets/common/basic/insets.dart';
import 'package:aves/widgets/common/basic/scaffold.dart';
import 'package:aves/widgets/common/basic/tv_edge_focus.dart';
import 'package:aves/widgets/filter_grids/common/action_delegates/chip.dart';
import 'package:aves/widgets/viewer/action/entry_info_action_delegate.dart';
import 'package:aves/widgets/viewer/controls/notifications.dart';
import 'package:aves/widgets/viewer/info/basic_section.dart';
@ -235,7 +234,7 @@ class _InfoPageContentState extends State<_InfoPageContent> {
),
);
return NotificationListener<FilterNotification>(
return NotificationListener<SelectFilterNotification>(
onNotification: (notification) {
_onFilter(notification.filter);
return true;
@ -288,6 +287,6 @@ class _InfoPageContentState extends State<_InfoPageContent> {
void _onFilter(CollectionFilter filter) {
if (!mounted) return;
FilterSelectedNotification(filter).dispatch(context);
SelectFilterNotification(filter).dispatch(context);
}
}

View file

@ -6,6 +6,7 @@ enum ChipAction {
goToExplorerPage,
ratingOrGreater,
ratingOrLower,
decompose,
reverse,
hide,
lockVault,

View file

@ -13,10 +13,10 @@ packages:
dependency: transitive
description:
name: _flutterfire_internals
sha256: eae3133cbb06de9205899b822e3897fc6a8bc278ad4c944b4ce612689369694b
sha256: daa1d780fdecf8af925680c06c86563cdd445deea995d5c9176f1302a2b10bbe
url: "https://pub.dev"
source: hosted
version: "1.3.47"
version: "1.3.48"
_macros:
dependency: transitive
description: dart
@ -318,26 +318,26 @@ packages:
dependency: transitive
description:
name: firebase_core
sha256: fef81a53ba1ca618def1f8bef4361df07968434e62cb204c1fb90bb880a03da2
sha256: "15d761b95dfa2906dfcc31b7fc6fe293188533d1a3ffe78389ba9e69bd7fdbde"
url: "https://pub.dev"
source: hosted
version: "3.8.1"
version: "3.9.0"
firebase_core_platform_interface:
dependency: transitive
description:
name: firebase_core_platform_interface
sha256: b94b217e3ad745e784960603d33d99471621ecca151c99c670869b76e50ad2a6
sha256: d7253d255ff10f85cfd2adaba9ac17bae878fa3ba577462451163bd9f1d1f0bf
url: "https://pub.dev"
source: hosted
version: "5.3.1"
version: "5.4.0"
firebase_core_web:
dependency: transitive
description:
name: firebase_core_web
sha256: "9e69806bb3d905aeec3c1242e0e1475de6ea6d48f456af29d598fb229a2b4e5e"
sha256: fbc008cf390d909b823763064b63afefe9f02d8afdb13eb3f485b871afee956b
url: "https://pub.dev"
source: hosted
version: "2.18.2"
version: "2.19.0"
firebase_crashlytics:
dependency: transitive
description:
@ -366,18 +366,18 @@ packages:
dependency: "direct main"
description:
name: flex_color_picker
sha256: "12dc855ae8ef5491f529b1fc52c655f06dcdf4114f1f7fdecafa41eec2ec8d79"
sha256: c083b79f1c57eaeed9f464368be376951230b3cb1876323b784626152a86e480
url: "https://pub.dev"
source: hosted
version: "3.6.0"
version: "3.7.0"
flex_seed_scheme:
dependency: transitive
description:
name: flex_seed_scheme
sha256: "7639d2c86268eff84a909026eb169f008064af0fb3696a651b24b0fa24a40334"
sha256: d3ba3c5c92d2d79d45e94b4c6c71d01fac3c15017da1545880c53864da5dfeb0
url: "https://pub.dev"
source: hosted
version: "3.4.1"
version: "3.5.0"
floating:
dependency: "direct main"
description:
@ -462,18 +462,18 @@ packages:
dependency: "direct main"
description:
name: flutter_markdown
sha256: "255b00afa1a7bad19727da6a7780cf3db6c3c12e68d302d85e0ff1fdf173db9e"
sha256: e37f4c69a07b07bb92622ef6b131a53c9aae48f64b176340af9e8e5238718487
url: "https://pub.dev"
source: hosted
version: "0.7.4+3"
version: "0.7.5"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398"
sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e"
url: "https://pub.dev"
source: hosted
version: "2.0.23"
version: "2.0.24"
flutter_staggered_animations:
dependency: "direct main"
description:
@ -629,10 +629,10 @@ packages:
dependency: transitive
description:
name: http_parser
sha256: "76d306a1c3afb33fe82e2bbacad62a61f409b5634c915fceb0d799de1a913360"
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
version: "4.1.1"
version: "4.1.2"
image:
dependency: transitive
description:
@ -701,10 +701,10 @@ packages:
dependency: transitive
description:
name: lints
sha256: "4a16b3f03741e1252fda5de3ce712666d010ba2122f8e912c94f9f7b90e1a4c3"
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
url: "https://pub.dev"
source: hosted
version: "5.1.0"
version: "5.1.1"
lists:
dependency: transitive
description:
@ -1273,10 +1273,10 @@ packages:
dependency: "direct main"
description:
name: shared_preferences
sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a
url: "https://pub.dev"
source: hosted
version: "2.3.3"
version: "2.3.5"
shared_preferences_android:
dependency: transitive
description:
@ -1430,10 +1430,10 @@ packages:
dependency: transitive
description:
name: sqflite_darwin
sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474"
sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
version: "2.4.1+1"
sqflite_platform_interface:
dependency: transitive
description:
@ -1695,18 +1695,18 @@ packages:
dependency: transitive
description:
name: wakelock_plus
sha256: bf4ee6f17a2fa373ed3753ad0e602b7603f8c75af006d5b9bdade263928c0484
sha256: "36c88af0b930121941345306d259ec4cc4ecca3b151c02e3a9e71aede83c615e"
url: "https://pub.dev"
source: hosted
version: "1.2.8"
version: "1.2.10"
wakelock_plus_platform_interface:
dependency: transitive
description:
name: wakelock_plus_platform_interface
sha256: "422d1cdbb448079a8a62a5a770b69baa489f8f7ca21aef47800c726d404f9d16"
sha256: "70e780bc99796e1db82fe764b1e7dcb89a86f1e5b3afb1db354de50f2e41eb7a"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.2.2"
watcher:
dependency: transitive
description:
@ -1759,10 +1759,10 @@ packages:
dependency: transitive
description:
name: win32
sha256: "8b338d4486ab3fbc0ba0db9f9b4f5239b6697fcee427939a40e720cbb9ee0a69"
sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29"
url: "https://pub.dev"
source: hosted
version: "5.9.0"
version: "5.10.0"
win32_registry:
dependency: transitive
description:
@ -1799,10 +1799,10 @@ packages:
dependency: transitive
description:
name: yaml
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
url: "https://pub.dev"
source: hosted
version: "3.1.2"
version: "3.1.3"
sdks:
dart: ">=3.6.0 <4.0.0"
flutter: ">=3.27.1"

View file

@ -7,7 +7,7 @@ repository: https://github.com/deckerst/aves
# - play changelog: /whatsnew/whatsnew-en-US
# - izzy changelog: /fastlane/metadata/android/en-US/changelogs/XXX01.txt
# - libre changelog: /fastlane/metadata/android/en-US/changelogs/XXX.txt
version: 1.12.0+140
version: 1.12.1+141
publish_to: none
environment:
@ -127,7 +127,7 @@ dependencies:
url: https://github.com/deckerst/aves_streams_channel.git
transparent_image:
url_launcher:
vector_map_tiles:
vector_map_tiles: ^8.0.0 # vector_map_tiles v9.0.0-beta.6 has a buggy cross-platform definition for `cacheFolder`
vector_math:
vector_tile_renderer:
volume_controller:

View file

@ -1,4 +1,3 @@
In v1.12.0:
- save your filtered collection as dynamic albums
- enjoy the app in Tamil, Bulgarian and Estonian
In v1.12.1:
- enjoy the app in Danish
Full changelog available on GitHub