Merge branch 'develop'

This commit is contained in:
Thibault Deckers 2024-11-18 23:46:35 +01:00
commit c62e68399c
81 changed files with 1642 additions and 675 deletions

@ -1 +1 @@
Subproject commit 603104015dd692ea3403755b55d07813d5cf8965
Subproject commit dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668

View file

@ -69,7 +69,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
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@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
with:
category: "/language:${{matrix.language}}"

View file

@ -75,7 +75,7 @@ jobs:
AVES_GOOGLE_API_KEY: ${{ secrets.AVES_GOOGLE_API_KEY }}
- name: Generate artifact attestation
uses: actions/attest-build-provenance@1c608d11d69870c2092266b3f9a6f3abbf17002c # v1.4.3
uses: actions/attest-build-provenance@ef244123eb79f2f7a7e75d99086184180e6d0018 # v1.4.4
with:
subject-path: 'outputs/*'

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@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
with:
sarif_file: results.sarif

View file

@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file.
## <a id="unreleased"></a>[Unreleased]
## <a id="v1.11.18"></a>[v1.11.18] - 2024-11-18
### Changed
- Albums: improved album creation feedback
- upgraded Flutter to stable v3.24.5
### Fixed
- crash when playing video with DCL restriction enabled
- cataloguing images with wrong MPF offsets
- printing multi-page items containing some unprintable pages
- English (Shavian) locale tags for store listing
## <a id="v1.11.17"></a>[v1.11.17] - 2024-10-30
### Added

View file

@ -154,12 +154,12 @@ dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
implementation "androidx.appcompat:appcompat:1.7.0"
implementation 'androidx.core:core-ktx:1.13.1'
implementation 'androidx.lifecycle:lifecycle-process:2.8.6'
implementation 'androidx.core:core-ktx:1.15.0'
implementation 'androidx.lifecycle:lifecycle-process:2.8.7'
implementation 'androidx.media:media:1.7.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.security:security-crypto:1.1.0-alpha06'
implementation 'androidx.work:work-runtime-ktx:2.9.1'
implementation 'androidx.work:work-runtime-ktx:2.10.0'
implementation 'com.caverock:androidsvg-aar:1.4'
implementation 'com.commonsware.cwac:document:0.5.0'
@ -181,7 +181,7 @@ dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.3'
kapt 'androidx.annotation:annotation:1.8.2'
kapt 'androidx.annotation:annotation:1.9.1'
ksp "com.github.bumptech.glide:ksp:$glide_version"
compileOnly rootProject.findProject(':streams_channel')

View file

@ -792,7 +792,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler {
private fun hasAppleHdrGainMap(uri: Uri, sizeBytes: Long?): Boolean {
val mpEntries = MultiPage.getJpegMpfEntries(context, uri, sizeBytes) ?: return false
mpEntries.filter { it.type == MpEntry.TYPE_UNDEFINED }.forEach { mpEntry ->
mpEntries.filter { it.type == MpEntry.TYPE_UNDEFINED }.forEachIndexed { mpIndex, mpEntry ->
var dataOffset = mpEntry.dataOffset
if (dataOffset > 0) {
val baseOffset = MultiPage.getJpegMpfBaseOffset(context, uri, sizeBytes)
@ -802,10 +802,14 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler {
}
StorageUtils.openInputStream(context, uri)?.let { input ->
input.skip(dataOffset)
try {
val pageMetadata = Helper.safeRead(input, sizeBytes)
if (pageMetadata.getDirectoriesOfType(XmpDirectory::class.java).any { it.xmpMeta.hasHdrGainMap() }) {
return true
}
} catch (e: Exception) {
Log.w(LOG_TAG, "failed to read metadata by metadata-extractor for uri=$uri mpIndex=$mpIndex mpEntry=$mpEntry", e)
}
}
}
return false

View file

@ -99,9 +99,12 @@ object MimeTypes {
else -> true
}
// as of `ExifInterface` v1.3.1, `isSupportedMimeType` reports
// no support for TIFF images, but it can actually open them (maybe other formats too)
fun canReadWithExifInterface(mimeType: String, strict: Boolean = true) = ExifInterface.isSupportedMimeType(mimeType) || !strict
// as of `ExifInterface` v1.4.0-alpha01, `isSupportedMimeType` reports
// no support for AVIF/TIFF images, but it can actually open them (maybe other formats too)
fun canReadWithExifInterface(mimeType: String, strict: Boolean = true): Boolean {
if (!strict) return true
return ExifInterface.isSupportedMimeType(mimeType) || mimeType == AVIF
}
// as of latest PixyMeta
fun canReadWithPixyMeta(mimeType: String) = when (mimeType) {
@ -143,7 +146,7 @@ object MimeTypes {
return if (pageId != null && MultiPageImage.isSupported(mimeType)) {
true
} else when (mimeType) {
DNG, DNG_ADOBE, HEIC, HEIF, PNG, WEBP -> true
AVIF, DNG, DNG_ADOBE, HEIC, HEIF, PNG, WEBP -> true
else -> false
}
}

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Aves</string>
<string name="app_widget_label">Şəkil Çərçivəsi</string>
<string name="wallpaper">Divar kağızı</string>
<string name="map_shortcut_short_label">Xəritə</string>
<string name="search_shortcut_short_label">Axtarış</string>
<string name="videos_shortcut_short_label">Videolar</string>
<string name="analysis_channel_name">Medianı yoxla</string>
<string name="analysis_notification_default_title">Media yoxlanılır</string>
<string name="analysis_notification_action_stop">Dayandır</string>
</resources>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Aves</string>
<string name="app_widget_label">Fotoraam</string>
<string name="wallpaper">Taustapilt</string>
<string name="map_shortcut_short_label">Kaart</string>
<string name="search_shortcut_short_label">Otsi</string>
<string name="videos_shortcut_short_label">Videod</string>
<string name="analysis_channel_name">Meedia tuvastamine</string>
<string name="analysis_notification_default_title">Tuvastame meediat</string>
<string name="analysis_notification_action_stop">Peata</string>
</resources>

View file

@ -8,4 +8,5 @@
<string name="analysis_channel_name">Сканировать медия</string>
<string name="analysis_notification_default_title">Сканирование медиа</string>
<string name="analysis_notification_action_stop">Стоп</string>
<string name="map_shortcut_short_label">Карта</string>
</resources>

View file

@ -26,5 +26,6 @@ android {
}
dependencies {
implementation 'androidx.annotation:annotation:1.8.2'
implementation 'androidx.annotation:annotation:1.9.1'
implementation 'org.jspecify:jspecify:1.0.0'
}

View file

@ -1,4 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
<manifest />

View file

@ -18,12 +18,10 @@ package androidx.exifinterface.media;
import android.media.MediaDataSource;
import android.media.MediaMetadataRetriever;
import android.os.Build;
import android.system.ErrnoException;
import android.system.Os;
import android.util.Log;
import androidx.annotation.DoNotInline;
import androidx.annotation.RequiresApi;
import java.io.Closeable;
@ -32,12 +30,19 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/*
* Forked from 'androidx.exifinterface:exifinterface:1.4.0-alpha01' on 2024/11/17
* Named differently to let ExifInterface be loaded as subdependency.
* cf https://github.com/androidx/androidx/tree/androidx-main/exifinterface/exifinterface/src/main/java/androidx/exifinterface/media
*/
class ExifInterfaceUtilsFork {
private static final String TAG = "ExifInterfaceUtils";
private ExifInterfaceUtilsFork() {
// Prevent instantiation
}
/**
* Copies all of the bytes from {@code in} to {@code out}. Neither stream is closed.
* Returns the total number of bytes transferred.
@ -146,45 +151,18 @@ class ExifInterfaceUtilsFork {
* Closes a file descriptor that has been duplicated.
*/
static void closeFileDescriptor(FileDescriptor fd) {
// Os.dup and Os.close was introduced in API 21 so this method shouldn't be called
// in API < 21.
if (Build.VERSION.SDK_INT >= 21) {
try {
Api21Impl.close(fd);
// Catching ErrnoException will raise error in API < 21
} catch (Exception ex) {
Log.e(TAG, "Error closing fd.");
}
} else {
Log.e(TAG, "closeFileDescriptor is called in API < 21, which must be wrong.");
}
}
@RequiresApi(21)
static class Api21Impl {
private Api21Impl() {}
@DoNotInline
static FileDescriptor dup(FileDescriptor fileDescriptor) throws ErrnoException {
return Os.dup(fileDescriptor);
}
@DoNotInline
static long lseek(FileDescriptor fd, long offset, int whence) throws ErrnoException {
return Os.lseek(fd, offset, whence);
}
@DoNotInline
static void close(FileDescriptor fd) throws ErrnoException {
Os.close(fd);
} catch (ErrnoException ex) {
Log.e(TAG, "Error closing fd.", ex);
}
}
@RequiresApi(23)
static class Api23Impl {
private Api23Impl() {}
private Api23Impl() {
}
@DoNotInline
static void setDataSource(MediaMetadataRetriever retriever, MediaDataSource dataSource) {
retriever.setDataSource(dataSource);
}

View file

@ -0,0 +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.
<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.
<i>Aves</i> integrates with Android (from KitKat to Android 14, 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>.

View file

@ -0,0 +1 @@
Gallery and metadata explorer

View file

@ -0,0 +1,5 @@
In v1.11.18:
- peruse your videos frame by frame
- create map shortcuts to filtered collections
- enjoy the app in Shavian
Full changelog available on GitHub

View file

@ -0,0 +1,5 @@
In v1.11.18:
- peruse your videos frame by frame
- create map shortcuts to filtered collections
- enjoy the app in Shavian
Full changelog available on GitHub

View file

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View file

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 280 KiB

View file

Before

Width:  |  Height:  |  Size: 496 KiB

After

Width:  |  Height:  |  Size: 496 KiB

View file

Before

Width:  |  Height:  |  Size: 194 KiB

After

Width:  |  Height:  |  Size: 194 KiB

View file

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 117 KiB

View file

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

View file

Before

Width:  |  Height:  |  Size: 325 KiB

After

Width:  |  Height:  |  Size: 325 KiB

View file

Before

Width:  |  Height:  |  Size: 336 KiB

After

Width:  |  Height:  |  Size: 336 KiB

View file

@ -0,0 +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.
<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.
<i>Aves</i> integrates with Android (from KitKat to Android 14, 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>.

View file

@ -0,0 +1 @@
Galerii ja metainfo kuvaja

View file

@ -269,7 +269,7 @@
"@tileLayoutGrid": {},
"settingsDisplayUseTvInterface": "واجهة أندرويد TV",
"@settingsDisplayUseTvInterface": {},
"settingsTimeToTakeActionTile": "حان الوقت لاتخاذ الإجراءات اللازمة",
"settingsTimeToTakeActionTile": "وقت إتخاذ الإجراءات",
"@settingsTimeToTakeActionTile": {},
"aboutCreditsWorldAtlas1": "يستخدم هذا التطبيق ملف TopoJSON من",
"@aboutCreditsWorldAtlas1": {},
@ -1544,5 +1544,11 @@
"mapStyleOsmLiberty": "حرية خرائط OSM",
"@mapStyleOsmLiberty": {},
"mapAttributionOsmLiberty": "البلاط بواسطة [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • مُستضاف بواسطة [OSM Americana](https://tile.ourmap.us)",
"@mapAttributionOsmLiberty": {}
"@mapAttributionOsmLiberty": {},
"videoActionShowPreviousFrame": "إظهار الإطار السابق",
"@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "إظهار الإطار التالي",
"@videoActionShowNextFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "الألبوم موجود بالفعل",
"@newAlbumDialogAlbumAlreadyExistsHelper": {}
}

121
lib/l10n/app_az.arb Normal file
View file

@ -0,0 +1,121 @@
{
"columnCount": "{count, plural, =1{{count} sütun} other{{count} sütun}}",
"@columnCount": {
"placeholders": {
"count": {
"format": "decimalPattern"
}
}
},
"timeSeconds": "{count, plural, =1{{count} saniyə} other{{count} saniyə}}",
"@timeSeconds": {
"placeholders": {
"count": {
"format": "decimalPattern"
}
}
},
"hideTooltip": "Gizlət",
"@hideTooltip": {},
"chipActionGoToAlbumPage": "Albomlarda Göstər",
"@chipActionGoToAlbumPage": {},
"chipActionGoToCountryPage": "Ölkələrdə Göstər",
"@chipActionGoToCountryPage": {},
"welcomeOptional": "Zəruri deyil",
"@welcomeOptional": {},
"welcomeTermsToggle": "Mən hökm və şərtlərlə razıyam",
"@welcomeTermsToggle": {},
"itemCount": "{count, plural, =1{{count} element}\n other{{count} element}}",
"@itemCount": {
"placeholders": {
"count": {
"format": "decimalPattern"
}
}
},
"timeMinutes": "{count, plural, =1{{count} dəqiqə} other{{count} dəqiqə}}",
"@timeMinutes": {
"placeholders": {
"count": {
"format": "decimalPattern"
}
}
},
"timeDays": "{count, plural, =1{{count} gün} other{{count} gün}}",
"@timeDays": {
"placeholders": {
"count": {
"format": "decimalPattern"
}
}
},
"focalLength": "{length} mm",
"@focalLength": {
"placeholders": {
"length": {
"type": "String",
"example": "5.4"
}
}
},
"applyButtonLabel": "TƏTBİQ ET",
"@applyButtonLabel": {},
"deleteButtonLabel": "SİL",
"@deleteButtonLabel": {},
"nextButtonLabel": "NÖVBƏTİ",
"@nextButtonLabel": {},
"showButtonLabel": "GÖSTƏR",
"@showButtonLabel": {},
"hideButtonLabel": "GİZLƏT",
"@hideButtonLabel": {},
"continueButtonLabel": "DAVAM ET",
"@continueButtonLabel": {},
"saveCopyButtonLabel": "NÜSXƏNİ SAXLA",
"@saveCopyButtonLabel": {},
"applyTooltip": "Tətbiq et",
"@applyTooltip": {},
"cancelTooltip": "Ləğv et",
"@cancelTooltip": {},
"changeTooltip": "Dəyişdir",
"@changeTooltip": {},
"clearTooltip": "Təmizlə",
"@clearTooltip": {},
"previousTooltip": "Əvvəlki",
"@previousTooltip": {},
"nextTooltip": "Növbəti",
"@nextTooltip": {},
"showTooltip": "Göstər",
"@showTooltip": {},
"actionRemove": "Təmizlə",
"@actionRemove": {},
"resetTooltip": "Sıfırla",
"@resetTooltip": {},
"saveTooltip": "Saxla",
"@saveTooltip": {},
"stopTooltip": "Dayandır",
"@stopTooltip": {},
"pickTooltip": "Seçin",
"@pickTooltip": {},
"doubleBackExitMessage": "Çıxmaq üçün təkrar “geri”-yə kliklə.",
"@doubleBackExitMessage": {},
"doNotAskAgain": "Təkrar soruşma",
"@doNotAskAgain": {},
"sourceStateLoading": "Yüklənilir",
"@sourceStateLoading": {},
"sourceStateCataloguing": "Sənədləşdirmə",
"@sourceStateCataloguing": {},
"sourceStateLocatingCountries": "Ölkələr yerləşdirilir",
"@sourceStateLocatingCountries": {},
"sourceStateLocatingPlaces": "Yerlər müəyyənləşdirilir",
"@sourceStateLocatingPlaces": {},
"chipActionDelete": "Sil",
"@chipActionDelete": {},
"chipActionShowCollection": "Kolleksiyada Göstər",
"@chipActionShowCollection": {},
"chipActionGoToPlacePage": "Yerlərdə Göstər",
"@chipActionGoToPlacePage": {},
"appName": "Aves",
"@appName": {},
"welcomeMessage": "Aves-ə Xoş Gəlmisiniz",
"@welcomeMessage": {}
}

View file

@ -971,7 +971,7 @@
"@settingsRemoveAnimationsDialogTitle": {},
"settingsTimeToTakeActionTile": "Zeit zum Reagieren",
"@settingsTimeToTakeActionTile": {},
"settingsDisplaySectionTitle": "Anzeige",
"settingsDisplaySectionTitle": "Darstellung",
"@settingsDisplaySectionTitle": {},
"settingsThemeBrightnessTile": "Thema",
"@settingsThemeBrightnessTile": {},
@ -1378,5 +1378,19 @@
"explorerPageTitle": "Explorer",
"@explorerPageTitle": {},
"mapAttributionOsmData": "Kartendaten © [OpenStreetMap](https://www.openstreetmap.org/copyright) Mitwirkende",
"@mapAttributionOsmData": {}
"@mapAttributionOsmData": {},
"videoActionShowPreviousFrame": "Vorigen Frame zeigen",
"@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "Nächsten Frame zeigen",
"@videoActionShowNextFrame": {},
"mapStyleOpenTopoMap": "OpenTopoMap",
"@mapStyleOpenTopoMap": {},
"mapStyleOsmLiberty": "OSM Liberty",
"@mapStyleOsmLiberty": {},
"mapAttributionOsmLiberty": "Kacheln von [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Gehostet von [OSM Americana](https://tile.ourmap.us)",
"@mapAttributionOsmLiberty": {},
"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": {}
}

View file

@ -423,6 +423,7 @@
"newAlbumDialogTitle": "New Album",
"newAlbumDialogNameLabel": "Album name",
"newAlbumDialogAlbumAlreadyExistsHelper": "Album already exists",
"newAlbumDialogNameLabelAlreadyExistsHelper": "Directory already exists",
"newAlbumDialogStorageLabel": "Storage:",

View file

@ -1390,5 +1390,7 @@
"videoActionShowPreviousFrame": "Mostrar fotograma anterior",
"@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "Mostrar fotograma siguiente",
"@videoActionShowNextFrame": {}
"@videoActionShowNextFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "El álbum ya existe",
"@newAlbumDialogAlbumAlreadyExistsHelper": {}
}

468
lib/l10n/app_et.arb Normal file
View file

@ -0,0 +1,468 @@
{
"welcomeMessage": "Tere tulemast kasutama Avest",
"@welcomeMessage": {},
"welcomeOptional": "Pole kohustuslik",
"@welcomeOptional": {},
"itemCount": "{count, plural, =1{{count} objekt} other{{count} objekti}}",
"@itemCount": {
"placeholders": {
"count": {
"format": "decimalPattern"
}
}
},
"timeSeconds": "{count, plural, =1{{count} sekund} other{{count} sekundit}}",
"@timeSeconds": {
"placeholders": {
"count": {
"format": "decimalPattern"
}
}
},
"timeMinutes": "{count, plural, =1{{count} minut} other{{count} minutit}}",
"@timeMinutes": {
"placeholders": {
"count": {
"format": "decimalPattern"
}
}
},
"timeDays": "{count, plural, =1{{count} päev} other{{count} päeva}}",
"@timeDays": {
"placeholders": {
"count": {
"format": "decimalPattern"
}
}
},
"applyTooltip": "Rakenda",
"@applyTooltip": {},
"cancelTooltip": "Katkesta",
"@cancelTooltip": {},
"changeTooltip": "Muuda",
"@changeTooltip": {},
"nextTooltip": "Järgmine",
"@nextTooltip": {},
"showTooltip": "Näita",
"@showTooltip": {},
"hideTooltip": "Peida",
"@hideTooltip": {},
"actionRemove": "Eemalda",
"@actionRemove": {},
"resetTooltip": "Lähtesta",
"@resetTooltip": {},
"saveTooltip": "Salvesta",
"@saveTooltip": {},
"pickTooltip": "Vali",
"@pickTooltip": {},
"doubleBackExitMessage": "Väljumiseks klõpsi uuesti nuppu „Tagasi“.",
"@doubleBackExitMessage": {},
"doNotAskAgain": "Ära küsi enam uuesti",
"@doNotAskAgain": {},
"sourceStateLoading": "Laadime andmeid",
"@sourceStateLoading": {},
"sourceStateCataloguing": "Katalogiseerime",
"@sourceStateCataloguing": {},
"sourceStateLocatingCountries": "Tuvastame riike",
"@sourceStateLocatingCountries": {},
"sourceStateLocatingPlaces": "Tuvastame asukohti",
"@sourceStateLocatingPlaces": {},
"chipActionDelete": "Kustuta",
"@chipActionDelete": {},
"applyButtonLabel": "RAKENDA",
"@applyButtonLabel": {},
"deleteButtonLabel": "KUSTUTA",
"@deleteButtonLabel": {},
"nextButtonLabel": "JÄRGMINE",
"@nextButtonLabel": {},
"showButtonLabel": "NÄITA",
"@showButtonLabel": {},
"continueButtonLabel": "JÄTKA",
"@continueButtonLabel": {},
"saveCopyButtonLabel": "SALVESTA KOOPIA",
"@saveCopyButtonLabel": {},
"chipActionShowCollection": "Näita kogumikus",
"@chipActionShowCollection": {},
"chipActionGoToAlbumPage": "Näita albumites",
"@chipActionGoToAlbumPage": {},
"chipActionGoToCountryPage": "Näita riikides",
"@chipActionGoToCountryPage": {},
"chipActionGoToPlacePage": "Näita asukohtades",
"@chipActionGoToPlacePage": {},
"chipActionGoToTagPage": "Näita siltides",
"@chipActionGoToTagPage": {},
"chipActionGoToExplorerPage": "Näita sirvijas",
"@chipActionGoToExplorerPage": {},
"chipActionFilterOut": "Sõelu välja",
"@chipActionFilterOut": {},
"chipActionFilterIn": "Sõelu sisse",
"@chipActionFilterIn": {},
"chipActionHide": "Peida",
"@chipActionHide": {},
"chipActionLock": "Lukusta",
"@chipActionLock": {},
"chipActionPin": "Kinnita üles äärde",
"@chipActionPin": {},
"stopTooltip": "Lõpeta",
"@stopTooltip": {},
"entryActionOpenMap": "Näita kaardirakenduses",
"@entryActionOpenMap": {},
"chipActionUnpin": "Eemalda ülalt äärest",
"@chipActionUnpin": {},
"chipActionRename": "Muuda nime",
"@chipActionRename": {},
"chipActionShowCountryStates": "Näita riike",
"@chipActionShowCountryStates": {},
"chipActionCreateAlbum": "Loo album",
"@chipActionCreateAlbum": {},
"chipActionCreateVault": "Loo turvaruum",
"@chipActionCreateVault": {},
"chipActionConfigureVault": "Seadista turvaruumi",
"@chipActionConfigureVault": {},
"entryActionCopyToClipboard": "Kopeeri lõikelauale",
"@entryActionCopyToClipboard": {},
"entryActionDelete": "Kustuta",
"@entryActionDelete": {},
"entryActionConvert": "Konverteeri",
"@entryActionConvert": {},
"entryActionExport": "Ekspordi",
"@entryActionExport": {},
"entryActionInfo": "Teave",
"@entryActionInfo": {},
"entryActionRename": "Muuda nime",
"@entryActionRename": {},
"entryActionRotateCCW": "Pööra vastupäeva",
"@entryActionRotateCCW": {},
"entryActionRotateCW": "Pööra päripäeva",
"@entryActionRotateCW": {},
"entryActionFlip": "Pööra ümber horisontaalselt",
"@entryActionFlip": {},
"entryActionPrint": "Trüki",
"@entryActionPrint": {},
"entryActionShareImageOnly": "Jaga vaid pilti",
"@entryActionShareImageOnly": {},
"entryActionShareVideoOnly": "Jaga vaid videot",
"@entryActionShareVideoOnly": {},
"entryActionViewSource": "Vaata allikat",
"@entryActionViewSource": {},
"entryActionShowGeoTiffOnMap": "Näita kaardi ülekattena",
"@entryActionShowGeoTiffOnMap": {},
"entryActionConvertMotionPhotoToStillImage": "Muuda stoppkaadriks",
"@entryActionConvertMotionPhotoToStillImage": {},
"entryActionViewMotionPhotoVideo": "Ava video",
"@entryActionViewMotionPhotoVideo": {},
"entryActionEdit": "Muuda",
"@entryActionEdit": {},
"entryActionOpen": "Ava rakendusega",
"@entryActionOpen": {},
"entryActionSetAs": "Seadista kui",
"@entryActionSetAs": {},
"entryActionRotateScreen": "Pööra ekraani",
"@entryActionRotateScreen": {},
"entryActionAddFavourite": "Lisa lemmikuks",
"@entryActionAddFavourite": {},
"entryActionRemoveFavourite": "Eemalda lemmikute hulgast",
"@entryActionRemoveFavourite": {},
"videoActionMute": "Summuta",
"@videoActionMute": {},
"videoActionUnmute": "Eemalda summutamine",
"@videoActionUnmute": {},
"videoActionPause": "Peata",
"@videoActionPause": {},
"videoActionPlay": "Esita",
"@videoActionPlay": {},
"videoActionReplay10": "Keri tagasi 10 sekundit",
"@videoActionReplay10": {},
"videoActionSkip10": "Keri edasi 10 sekundit",
"@videoActionSkip10": {},
"videoActionShowPreviousFrame": "Näita eelmist kaadrit",
"@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "Näita järgmist kaadrit",
"@videoActionShowNextFrame": {},
"videoActionSelectStreams": "Vali meediavood",
"@videoActionSelectStreams": {},
"videoActionSetSpeed": "Taasesituse kiirus",
"@videoActionSetSpeed": {},
"videoRepeatActionSetStart": "Määra algus",
"@videoRepeatActionSetStart": {},
"videoRepeatActionSetEnd": "Määra lõpp",
"@videoRepeatActionSetEnd": {},
"viewerActionSettings": "Seadistused",
"@viewerActionSettings": {},
"configureVaultDialogTitle": "Seadista turvaruumi",
"@configureVaultDialogTitle": {},
"vaultDialogLockTypeLabel": "Lukustuse tüüp",
"@vaultDialogLockTypeLabel": {},
"authenticateToConfigureVault": "Turvaruumi seadistamiseks autendi",
"@authenticateToConfigureVault": {},
"authenticateToUnlockVault": "Turvaruumi lukustuse eemaldamiseks autendi",
"@authenticateToUnlockVault": {},
"vaultBinUsageDialogMessage": "Mõned turvaruumid kasutavad prügikasti.",
"@vaultBinUsageDialogMessage": {},
"settingsConfirmationVaultDataLoss": "Näita turvaruumi andmekao hoiatust",
"@settingsConfirmationVaultDataLoss": {},
"statsTopPlacesSectionTitle": "Populaarsemad kohad",
"@statsTopPlacesSectionTitle": {},
"statsTopCountriesSectionTitle": "Populaarsemad riigid",
"@statsTopCountriesSectionTitle": {},
"appName": "Aves",
"@appName": {},
"welcomeTermsToggle": "Nõustun kasutustingimustega",
"@welcomeTermsToggle": {},
"columnCount": "{count, plural, =1{{count} veerg} other{{count} veergu}}",
"@columnCount": {
"placeholders": {
"count": {
"format": "decimalPattern"
}
}
},
"focalLength": "{length} mm",
"@focalLength": {
"placeholders": {
"length": {
"type": "String",
"example": "5.4"
}
}
},
"clearTooltip": "Tühjenda",
"@clearTooltip": {},
"previousTooltip": "Eelmine",
"@previousTooltip": {},
"hideButtonLabel": "PEIDA",
"@hideButtonLabel": {},
"chipActionSetCover": "Määra kaanepildiks",
"@chipActionSetCover": {},
"vaultLockTypePattern": "Muster",
"@vaultLockTypePattern": {},
"vaultLockTypePin": "PIN-kood",
"@vaultLockTypePin": {},
"newVaultDialogTitle": "Uus turvaruum",
"@newVaultDialogTitle": {},
"albumTierVaults": "Turvaruumid",
"@albumTierVaults": {},
"vaultLockTypePassword": "Salasõna",
"@vaultLockTypePassword": {},
"vaultDialogLockModeWhenScreenOff": "Ekraani väljalülitumisel lukusta turvaruum",
"@vaultDialogLockModeWhenScreenOff": {},
"newVaultWarningDialogMessage": "Turvaruumis asuvad objektid on nähtavad vaid sellele rakendusele ja mitte ühelgi muul viisil.\n\nKui sa eemaldad nutiseadmest selle rakenduse või kustutad rakenduse andmed, siis kaob igasugune ligipääs nendele objektidele.",
"@newVaultWarningDialogMessage": {},
"entryActionRestore": "Taasta",
"@entryActionRestore": {},
"entryActionShare": "Jaga",
"@entryActionShare": {},
"statsTopTagsSectionTitle": "Populaarsemad sildid",
"@statsTopTagsSectionTitle": {},
"statsTopStatesSectionTitle": "Populaarsemad osariigid",
"@statsTopStatesSectionTitle": {},
"statsTopAlbumsSectionTitle": "Populaarsemad albumid",
"@statsTopAlbumsSectionTitle": {},
"videoActionABRepeat": "A-B kordus",
"@videoActionABRepeat": {},
"viewerActionLock": "Lukusta vaade",
"@viewerActionLock": {},
"viewerActionUnlock": "Eemalda vaate lukustus",
"@viewerActionUnlock": {},
"slideshowActionResume": "Jätka",
"@slideshowActionResume": {},
"slideshowActionShowInCollection": "Näita kogumikus",
"@slideshowActionShowInCollection": {},
"entryInfoActionEditDate": "Muuda kuupäeva ja kellaaega",
"@entryInfoActionEditDate": {},
"entryInfoActionEditLocation": "Muuda asukohta",
"@entryInfoActionEditLocation": {},
"entryInfoActionEditTitleDescription": "Muuda pealkirja ja kirjeldust",
"@entryInfoActionEditTitleDescription": {},
"entryInfoActionEditRating": "Muuda hinnangut",
"@entryInfoActionEditRating": {},
"entryInfoActionEditTags": "Muuda silte",
"@entryInfoActionEditTags": {},
"entryInfoActionRemoveMetadata": "Eemalda metainfo",
"@entryInfoActionRemoveMetadata": {},
"videoActionCaptureFrame": "Tee stoppkaader",
"@videoActionCaptureFrame": {},
"entryInfoActionExportMetadata": "Ekspordi metainfo",
"@entryInfoActionExportMetadata": {},
"entryInfoActionRemoveLocation": "Eemalda asukoht",
"@entryInfoActionRemoveLocation": {},
"editorActionTransform": "Muuda",
"@editorActionTransform": {},
"editorTransformCrop": "Kadreeri",
"@editorTransformCrop": {},
"editorTransformRotate": "Pööra",
"@editorTransformRotate": {},
"cropAspectRatioFree": "Vaba",
"@cropAspectRatioFree": {},
"cropAspectRatioOriginal": "Algne",
"@cropAspectRatioOriginal": {},
"cropAspectRatioSquare": "Ruut",
"@cropAspectRatioSquare": {},
"filterAspectRatioLandscapeLabel": "Rõhtloodis",
"@filterAspectRatioLandscapeLabel": {},
"filterAspectRatioPortraitLabel": "Püstloodis",
"@filterAspectRatioPortraitLabel": {},
"filterBinLabel": "Prügikast",
"@filterBinLabel": {},
"filterFavouriteLabel": "Lemmik",
"@filterFavouriteLabel": {},
"filterNoDateLabel": "Kuupäevata",
"@filterNoDateLabel": {},
"filterNoAddressLabel": "Aadressita",
"@filterNoAddressLabel": {},
"filterNoTagLabel": "Sildistamata",
"@filterNoTagLabel": {},
"filterNoTitleLabel": "Ilma nimeta",
"@filterNoTitleLabel": {},
"filterOnThisDayLabel": "Täna",
"@filterOnThisDayLabel": {},
"filterRecentlyAddedLabel": "Hiljuti lisatud",
"@filterRecentlyAddedLabel": {},
"filterRatingRejectedLabel": "Tagasilükatud",
"@filterRatingRejectedLabel": {},
"filterTypeAnimatedLabel": "Animeeritud",
"@filterTypeAnimatedLabel": {},
"filterTypeMotionPhotoLabel": "Liikuv foto",
"@filterTypeMotionPhotoLabel": {},
"filterTypePanoramaLabel": "Panoraam",
"@filterTypePanoramaLabel": {},
"filterTypeRawLabel": "Töötlemata raw-vormingus foto",
"@filterTypeRawLabel": {},
"filterTypeSphericalVideoLabel": "360° video",
"@filterTypeSphericalVideoLabel": {},
"filterTypeGeotiffLabel": "GeoTIFF",
"@filterTypeGeotiffLabel": {},
"accessibilityAnimationsRemove": "Eemalda ekraanieffektid",
"@accessibilityAnimationsRemove": {},
"accessibilityAnimationsKeep": "Jäta ekraanieffektid alles",
"@accessibilityAnimationsKeep": {},
"albumTierNew": "Uus",
"@albumTierNew": {},
"albumTierPinned": "Esiletõstetud",
"@albumTierPinned": {},
"albumTierSpecial": "Üldised",
"@albumTierSpecial": {},
"albumTierApps": "Rakendused",
"@albumTierApps": {},
"albumTierRegular": "Muud",
"@albumTierRegular": {},
"coordinateFormatDms": "KMS",
"@coordinateFormatDms": {},
"coordinateFormatDecimal": "Kümnendsüsteem",
"@coordinateFormatDecimal": {},
"coordinateDmsWest": "W",
"@coordinateDmsWest": {},
"coordinateDmsNorth": "N",
"@coordinateDmsNorth": {},
"coordinateDmsEast": "E",
"@coordinateDmsEast": {},
"displayRefreshRatePreferLowest": "Madalaim sagedus",
"@displayRefreshRatePreferLowest": {},
"displayRefreshRatePreferHighest": "Kõrgeim sagedus",
"@displayRefreshRatePreferHighest": {},
"keepScreenOnVideoPlayback": "Video taasesitusel",
"@keepScreenOnVideoPlayback": {},
"keepScreenOnViewerOnly": "Vaid vaate lehel",
"@keepScreenOnViewerOnly": {},
"keepScreenOnAlways": "Alati",
"@keepScreenOnAlways": {},
"lengthUnitPixel": "px",
"@lengthUnitPixel": {},
"lengthUnitPercent": "%",
"@lengthUnitPercent": {},
"mapStyleGoogleNormal": "Google Maps",
"@mapStyleGoogleNormal": {},
"mapStyleGoogleHybrid": "Google Maps (hübriidkaart)",
"@mapStyleGoogleHybrid": {},
"mapStyleGoogleTerrain": "Google Maps (maastik)",
"@mapStyleGoogleTerrain": {},
"mapStyleOsmLiberty": "OSM Liberty",
"@mapStyleOsmLiberty": {},
"mapStyleOpenTopoMap": "OpenTopoMap",
"@mapStyleOpenTopoMap": {},
"mapStyleOsmHot": "OSMi humanitaarkaart",
"@mapStyleOsmHot": {},
"mapStyleStamenWatercolor": "Stamen Watercolor",
"@mapStyleStamenWatercolor": {},
"maxBrightnessNever": "Mitte kunagi",
"@maxBrightnessNever": {},
"subtitlePositionTop": "Üleval",
"@subtitlePositionTop": {},
"subtitlePositionBottom": "All",
"@subtitlePositionBottom": {},
"themeBrightnessLight": "Hele kujundus",
"@themeBrightnessLight": {},
"settingsVideoEnablePip": "Pilt pildis",
"@settingsVideoEnablePip": {},
"videoControlsPlayOutside": "Ava välises meediamängijas",
"@videoControlsPlayOutside": {},
"videoLoopModeShortOnly": "Vaid lühivideod",
"@videoLoopModeShortOnly": {},
"videoPlaybackSkip": "Jäta vahele",
"@videoPlaybackSkip": {},
"videoPlaybackMuted": "Esita summutatuna",
"@videoPlaybackMuted": {},
"videoPlaybackWithSound": "Esita heliga",
"@videoPlaybackWithSound": {},
"videoResumptionModeNever": "Mitte kunagi",
"@videoResumptionModeNever": {},
"videoResumptionModeAlways": "Alati",
"@videoResumptionModeAlways": {},
"settingsDisplayRefreshRateModeDialogTitle": "Värskendussagedus",
"@settingsDisplayRefreshRateModeDialogTitle": {},
"settingsDisplayRefreshRateModeTile": "Ekraani värskendussagedus",
"@settingsDisplayRefreshRateModeTile": {},
"filterLocatedLabel": "Asukoht tuvastatud",
"@filterLocatedLabel": {},
"filterNoLocationLabel": "Asukoht tuvastamata",
"@filterNoLocationLabel": {},
"filterNoRatingLabel": "Pole hinnatud",
"@filterNoRatingLabel": {},
"filterTaggedLabel": "Sildistatud",
"@filterTaggedLabel": {},
"filterMimeImageLabel": "Pilt",
"@filterMimeImageLabel": {},
"filterMimeVideoLabel": "Video",
"@filterMimeVideoLabel": {},
"coordinateDms": "{coordinate} {direction}",
"@coordinateDms": {
"placeholders": {
"coordinate": {
"type": "String",
"example": "38° 41 47.72″"
},
"direction": {
"type": "String",
"example": "S"
}
}
},
"coordinateDmsSouth": "S",
"@coordinateDmsSouth": {},
"nameConflictStrategySkip": "Jäta vahele",
"@nameConflictStrategySkip": {},
"overlayHistogramLuminance": "Heledus",
"@overlayHistogramLuminance": {},
"maxBrightnessAlways": "Alati",
"@maxBrightnessAlways": {},
"overlayHistogramNone": "Määratlemata",
"@overlayHistogramNone": {},
"nameConflictStrategyRename": "Muuda nime",
"@nameConflictStrategyRename": {},
"nameConflictStrategyReplace": "Asenda",
"@nameConflictStrategyReplace": {},
"overlayHistogramRGB": "RGB",
"@overlayHistogramRGB": {},
"keepScreenOnNever": "Mitte kunagi",
"@keepScreenOnNever": {},
"videoLoopModeNever": "Mitte kunagi",
"@videoLoopModeNever": {},
"themeBrightnessDark": "Tume kujundus",
"@themeBrightnessDark": {},
"themeBrightnessBlack": "Süsimust kujundus",
"@themeBrightnessBlack": {},
"videoLoopModeAlways": "Alati",
"@videoLoopModeAlways": {},
"unitSystemMetric": "Meetermõõdustik",
"@unitSystemMetric": {}
}

View file

@ -278,17 +278,17 @@
"@exportEntryDialogHeight": {},
"aboutTranslatorsSectionTitle": "مترجم ها",
"@aboutTranslatorsSectionTitle": {},
"aboutLicensesAndroidLibrariesSectionTitle": "کتابخانه های اندروید",
"aboutLicensesAndroidLibrariesSectionTitle": "کتابخانههای اندروید",
"@aboutLicensesAndroidLibrariesSectionTitle": {},
"aboutLicensesFlutterPackagesSectionTitle": "بسته های Flutter",
"aboutLicensesFlutterPackagesSectionTitle": "بستههای Flutter",
"@aboutLicensesFlutterPackagesSectionTitle": {},
"aboutBugReportButton": "گزارش",
"@aboutBugReportButton": {},
"aboutLicensesFlutterPluginsSectionTitle": "پلاگین های Flutter",
"aboutLicensesFlutterPluginsSectionTitle": "افزونه‌های Flutter",
"@aboutLicensesFlutterPluginsSectionTitle": {},
"aboutBugCopyInfoButton": "کپی",
"@aboutBugCopyInfoButton": {},
"aboutLicensesDartPackagesSectionTitle": "بسته های Dart",
"aboutLicensesDartPackagesSectionTitle": "بستههای Dart",
"@aboutLicensesDartPackagesSectionTitle": {},
"policyPageTitle": "سیاست حفظ حریم خصوصی",
"@policyPageTitle": {},
@ -393,7 +393,7 @@
"@keepScreenOnAlways": {},
"albumTierRegular": "سایر",
"@albumTierRegular": {},
"accessibilityAnimationsKeep": "نمایش از جلوه های نمایشگر",
"accessibilityAnimationsKeep": "نمایش از جلوههای نمایشگر",
"@accessibilityAnimationsKeep": {},
"widgetDisplayedItemMostRecent": "جدید‌ترین",
"@widgetDisplayedItemMostRecent": {},
@ -545,7 +545,7 @@
"@albumTierSpecial": {},
"viewerTransitionParallax": "انطباق",
"@viewerTransitionParallax": {},
"coordinateFormatDecimal": "درجه های اعشاری",
"coordinateFormatDecimal": "درجههای اعشاری",
"@coordinateFormatDecimal": {},
"videoResumeButtonLabel": "ادامه",
"@videoResumeButtonLabel": {},
@ -559,7 +559,7 @@
"@videoPlaybackSkip": {},
"setCoverDialogCustom": "شخصی",
"@setCoverDialogCustom": {},
"nameConflictDialogSingleSourceMessage": "برخی از پرونده های موجود در پوشه مقصد به همین نام هستند.",
"nameConflictDialogSingleSourceMessage": "برخی از پروندههای موجود در پوشه مقصد به همین نام هستند.",
"@nameConflictDialogSingleSourceMessage": {},
"missingSystemFilePickerDialogMessage": "انتخابگر پرونده سامانه وجود ندارد یا غیرفعال است. لطفا آن را فعال کنید و دوباره امتحان کنید.",
"@missingSystemFilePickerDialogMessage": {},
@ -603,11 +603,11 @@
"@searchDateSectionTitle": {},
"searchCountriesSectionTitle": "کشور ها",
"@searchCountriesSectionTitle": {},
"settingsConfirmationDialogTitle": "درخواست های‌ تایید",
"settingsConfirmationDialogTitle": "درخواستهای‌ تایید",
"@settingsConfirmationDialogTitle": {},
"settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "دکمه های نمایش داده شده",
"settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": "دکمههای نمایش داده شده",
"@settingsViewerQuickActionEditorDisplayedButtonsSectionTitle": {},
"settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "دکمه های در دسترس",
"settingsViewerQuickActionEditorAvailableButtonsSectionTitle": "دکمههای در دسترس",
"@settingsViewerQuickActionEditorAvailableButtonsSectionTitle": {},
"settingsViewerQuickActionEmpty": "بدون دکمه",
"@settingsViewerQuickActionEmpty": {},
@ -664,7 +664,7 @@
"@editEntryLocationDialogLongitude": {},
"viewerOpenPanoramaButtonLabel": "بازکردن پانوراما",
"@viewerOpenPanoramaButtonLabel": {},
"statsTopAlbumsSectionTitle": "آلبوم های ممتاز",
"statsTopAlbumsSectionTitle": "آلبومهای ممتاز",
"@statsTopAlbumsSectionTitle": {},
"settingsSubtitleThemeTextColor": "رنگ متن",
"@settingsSubtitleThemeTextColor": {},
@ -672,7 +672,7 @@
"@mapStyleTooltip": {},
"viewerInfoSearchFieldLabel": "جستجو فراداده",
"@viewerInfoSearchFieldLabel": {},
"filePickerDoNotShowHiddenFiles": "پرونده های پنهان را نمایش نده",
"filePickerDoNotShowHiddenFiles": "پروندههای پنهان را نمایش نده",
"@filePickerDoNotShowHiddenFiles": {},
"filePickerUseThisFolder": "استفاده از این پوشه",
"@filePickerUseThisFolder": {},
@ -696,7 +696,7 @@
"@sourceViewerPageTitle": {},
"panoramaDisableSensorControl": "خاموش کردن هدایت حسگر",
"@panoramaDisableSensorControl": {},
"filePickerShowHiddenFiles": "نمایش پرونده های پنهان",
"filePickerShowHiddenFiles": "نمایش پروندههای پنهان",
"@filePickerShowHiddenFiles": {},
"setCoverDialogLatest": "آخرین مورد",
"@setCoverDialogLatest": {},
@ -796,7 +796,7 @@
"@settingsCoordinateFormatDialogTitle": {},
"statsTopStatesSectionTitle": "آمارهای ممتاز",
"@statsTopStatesSectionTitle": {},
"statsTopTagsSectionTitle": "برچسب های ممتاز",
"statsTopTagsSectionTitle": "برچسبهای ممتاز",
"@statsTopTagsSectionTitle": {},
"coordinateFormatDms": "DMS",
"@coordinateFormatDms": {},
@ -824,7 +824,7 @@
"@sortByItemCount": {},
"settingsKeepScreenOnTile": "صفحه را روشن نگه دار",
"@settingsKeepScreenOnTile": {},
"settingsViewerGestureSideTapNext": "روی لبه های صفحه ضربه بزنید تا مورد قبلی/بعدی نشان داده شود",
"settingsViewerGestureSideTapNext": "روی لبههای صفحه ضربه بزنید تا مورد قبلی/بعدی نشان داده شود",
"@settingsViewerGestureSideTapNext": {},
"deleteMultiAlbumConfirmationDialogMessage": "{count, plural, =1{این آلبوم ها و مورد موجود در آنها پاک شود؟} other{این آلبوم ها و {count} مورد موجود در آنها پاک شود؟}}",
"@deleteMultiAlbumConfirmationDialogMessage": {
@ -834,7 +834,7 @@
},
"removeEntryMetadataMotionPhotoXmpWarningDialogMessage": "XMP برای پخش ویدیو در داخل یک عکس متحرک مورد نیاز است.\n\nار پاک‌سازی آن اطمینان دارید?",
"@removeEntryMetadataMotionPhotoXmpWarningDialogMessage": {},
"newVaultWarningDialogMessage": "موارد موجود در گاوصندوق تنها برای این برنامه در دسترس هستند و در هیچ برنامه دیگری وجود ندارد.\n\nاگر این برنامه را پاک کنید، یا داده های برنامه را پاک کنید، همه این موارد را از دست خواهید داد.",
"newVaultWarningDialogMessage": "موارد موجود در گاوصندوق تنها برای این برنامه در دسترس هستند و در هیچ برنامه دیگری وجود ندارد.\n\nاگر این برنامه را پاک کنید، یا دادههای برنامه را پاک کنید، همه این موارد را از دست خواهید داد.",
"@newVaultWarningDialogMessage": {},
"deleteEntriesConfirmationDialogMessage": "{count, plural, =1{این مورد پاک شود؟} other{این {count} مورد پاک شوند؟}}",
"@deleteEntriesConfirmationDialogMessage": {
@ -905,7 +905,7 @@
"@sortOrderOldestFirst": {},
"settingsSlideshowFillScreen": "پر کردن صفحه",
"@settingsSlideshowFillScreen": {},
"settingsAccessibilityShowPinchGestureAlternatives": "نمایش جایگزین های چند لمس همزمان",
"settingsAccessibilityShowPinchGestureAlternatives": "نمایش جایگزینهای چند لمس همزمان",
"@settingsAccessibilityShowPinchGestureAlternatives": {},
"viewerInfoLabelDate": "تاریخ",
"@viewerInfoLabelDate": {},
@ -937,9 +937,9 @@
"@settingsHomeTile": {},
"settingsSlideshowAnimatedZoomEffect": "جلوه بزرگنمایی پویانمایی شده",
"@settingsSlideshowAnimatedZoomEffect": {},
"statsTopCountriesSectionTitle": "کشور های ممتاز",
"statsTopCountriesSectionTitle": "کشورهای ممتاز",
"@statsTopCountriesSectionTitle": {},
"statsTopPlacesSectionTitle": "مکان های ممتاز",
"statsTopPlacesSectionTitle": "مکانهای ممتاز",
"@statsTopPlacesSectionTitle": {},
"editEntryDateDialogTitle": "تاریخ و زمان",
"@editEntryDateDialogTitle": {},
@ -1001,7 +1001,7 @@
"@appPickDialogNone": {},
"aboutLinkLicense": "مجوز",
"@aboutLinkLicense": {},
"aboutBugSaveLogInstruction": "ذخیره گزارش های برنامه در یک پرونده",
"aboutBugSaveLogInstruction": "ذخیره گزارشهای برنامه در یک پرونده",
"@aboutBugSaveLogInstruction": {},
"aboutDataUsageDatabase": "پایگاه داده",
"@aboutDataUsageDatabase": {},
@ -1019,7 +1019,7 @@
"@aboutDataUsageClearCache": {},
"aboutCreditsWorldAtlas2": "زیر مجوز ISC.",
"@aboutCreditsWorldAtlas2": {},
"aboutLicensesBanner": "این برنامه از بسته ها و کتابخانه های منبع باز زیر استفاده می کند.",
"aboutLicensesBanner": "این برنامه از بستهها و کتابخانه‌های منبع باز زیر استفاده می کند.",
"@aboutLicensesBanner": {},
"collectionSelectPageTitle": "انتخاب موارد",
"@collectionSelectPageTitle": {},
@ -1071,9 +1071,9 @@
"@albumGroupType": {},
"albumPickPageTitlePick": "انتخاب آلبوم",
"@albumPickPageTitlePick": {},
"albumScreenRecordings": "ضبط های از صفحه",
"albumScreenRecordings": "ضبطهای از صفحه",
"@albumScreenRecordings": {},
"albumVideoCaptures": "ویدیو های ضبط شده",
"albumVideoCaptures": "ویدیوهای ضبط شده",
"@albumVideoCaptures": {},
"albumEmpty": "بدون آلبوم",
"@albumEmpty": {},
@ -1091,21 +1091,21 @@
"@settingsActionImport": {},
"settingsSystemDefault": "پیشفرض سامانه",
"@settingsSystemDefault": {},
"settingsConfirmationTile": "درخواست های تایید",
"settingsConfirmationTile": "درخواستهای تایید",
"@settingsConfirmationTile": {},
"settingsKeepScreenOnDialogTitle": "صفحه را روشن نگه دار",
"@settingsKeepScreenOnDialogTitle": {},
"settingsShowBottomNavigationBar": "نمایش گزینه‌گان پیمایش پایین",
"settingsShowBottomNavigationBar": "نمایش گزینه‌های پیمایش پایین",
"@settingsShowBottomNavigationBar": {},
"settingsDoubleBackExit": "برای خروج دوبار روی «بازگشت» ضربه بزنید",
"@settingsDoubleBackExit": {},
"settingsNavigationDrawerEditorPageTitle": "گزینه‌گان پیمایش",
"settingsNavigationDrawerEditorPageTitle": "گزینه‌های پیمایش",
"@settingsNavigationDrawerEditorPageTitle": {},
"settingsConfirmationBeforeMoveUndatedItems": "پیش از جابجایی موارد بدون تاریخ بپرسید",
"@settingsConfirmationBeforeMoveUndatedItems": {},
"settingsNavigationDrawerBanner": "برای جابجایی و مرتب کردن مجدد موارد، لمس کنید و نگه دارید.",
"@settingsNavigationDrawerBanner": {},
"settingsConfirmationVaultDataLoss": "نمایش هشدار از دست دادن داده های گاوصندوق",
"settingsConfirmationVaultDataLoss": "نمایش هشدار از دست دادن دادههای گاوصندوق",
"@settingsConfirmationVaultDataLoss": {},
"settingsNavigationDrawerTabAlbums": "آلبوم ها",
"@settingsNavigationDrawerTabAlbums": {},
@ -1117,7 +1117,7 @@
"@settingsThumbnailShowHdrIcon": {},
"settingsCollectionQuickActionTabBrowsing": "مرور کردن",
"@settingsCollectionQuickActionTabBrowsing": {},
"settingsCollectionQuickActionEditorPageTitle": "کنش های سریع",
"settingsCollectionQuickActionEditorPageTitle": "کنشهای سریع",
"@settingsCollectionQuickActionEditorPageTitle": {},
"settingsCollectionQuickActionTabSelecting": "انتخاب کردن",
"@settingsCollectionQuickActionTabSelecting": {},
@ -1153,7 +1153,7 @@
"@settingsVideoBackgroundModeDialogTitle": {},
"settingsVideoGestureDoubleTapTogglePlay": "برای پخش/ایست دوبار ضربه زدن",
"@settingsVideoGestureDoubleTapTogglePlay": {},
"settingsVideoGestureSideDoubleTapSeek": "روی لبه های صفحه دوبار ضربه بزنید تا به عقب/جلو بروید",
"settingsVideoGestureSideDoubleTapSeek": "روی لبههای صفحه دوبار ضربه بزنید تا به عقب/جلو بروید",
"@settingsVideoGestureSideDoubleTapSeek": {},
"settingsSubtitleThemePageTitle": "زیرنویس ها",
"@settingsSubtitleThemePageTitle": {},
@ -1179,7 +1179,7 @@
"@settingsAllowErrorReporting": {},
"settingsThemeColorHighlights": "رنگ متون برجسته",
"@settingsThemeColorHighlights": {},
"settingsThemeEnableDynamicColor": "رنگ های پویا",
"settingsThemeEnableDynamicColor": "رنگهای پویا",
"@settingsThemeEnableDynamicColor": {},
"settingsHiddenFiltersEmpty": "پالایشی پنهان نیست",
"@settingsHiddenFiltersEmpty": {},
@ -1271,15 +1271,15 @@
"@settingsNavigationSectionTitle": {},
"settingsNavigationDrawerTabTypes": "انواع",
"@settingsNavigationDrawerTabTypes": {},
"settingsNavigationDrawerTile": "گزینه‌گان پیمایش",
"settingsNavigationDrawerTile": "گزینه‌های پیمایش",
"@settingsNavigationDrawerTile": {},
"settingsSearchEmpty": "تنظیمی منطبق نشد",
"@settingsSearchEmpty": {},
"settingsCollectionBurstPatternsTile": "الگوهای انفجاری",
"settingsCollectionBurstPatternsTile": "الگوهای تصاویر چندتایی",
"@settingsCollectionBurstPatternsTile": {},
"settingsCollectionBurstPatternsNone": "هیچکدام",
"@settingsCollectionBurstPatternsNone": {},
"settingsCollectionQuickActionsTile": "کنش های سریع",
"settingsCollectionQuickActionsTile": "کنشهای سریع",
"@settingsCollectionQuickActionsTile": {},
"settingsUnitSystemTile": "واحد ها",
"@settingsUnitSystemTile": {},
@ -1301,9 +1301,9 @@
"@settingsViewerSectionTitle": {},
"settingsViewerShowInformationSubtitle": "نمایش عنوان، تاریخ، مکان، و...",
"@settingsViewerShowInformationSubtitle": {},
"settingsViewerQuickActionsTile": "کنش های سریع",
"settingsViewerQuickActionsTile": "کنشهای سریع",
"@settingsViewerQuickActionsTile": {},
"settingsViewerQuickActionEditorPageTitle": "کنش های سریع",
"settingsViewerQuickActionEditorPageTitle": "کنشهای سریع",
"@settingsViewerQuickActionEditorPageTitle": {},
"settingsViewerQuickActionEditorBanner": "لمس کنید و نگه دارید تا دکمه ها را حرکت دهید و انتخاب کنید که کدام کنش ها در بیننده نمایش داده می شود.",
"@settingsViewerQuickActionEditorBanner": {},
@ -1339,19 +1339,19 @@
"@searchRatingSectionTitle": {},
"searchMetadataSectionTitle": "فراداده",
"@searchMetadataSectionTitle": {},
"settingsConfirmationBeforeDeleteItems": "همیشه پیش از پاک‌سازی موارد پرسش کن",
"settingsConfirmationBeforeDeleteItems": "همیشه پیش از پاک‌سازی موارد بپرس",
"@settingsConfirmationBeforeDeleteItems": {},
"genericSuccessFeedback": "انجام شد!",
"@genericSuccessFeedback": {},
"aboutLicensesShowAllButtonLabel": "نمایش تمام مجوز ها",
"@aboutLicensesShowAllButtonLabel": {},
"drawerCollectionSphericalVideos": "ویدیو های 360°",
"drawerCollectionSphericalVideos": "ویدیوهای 360°",
"@drawerCollectionSphericalVideos": {},
"searchAlbumsSectionTitle": "آلبوم ها",
"@searchAlbumsSectionTitle": {},
"tagPageTitle": "برچسب ها",
"@tagPageTitle": {},
"settingsEnableBin": "بهره‌وری از سطل زباله",
"settingsEnableBin": "به‌کارگیری سطل زباله",
"@settingsEnableBin": {},
"settingsEnableBinSubtitle": "موارد پاک شده را به مدت 30 روز نگه دارید",
"@settingsEnableBinSubtitle": {},
@ -1445,9 +1445,9 @@
},
"settingsDisablingBinWarningDialogMessage": "موارد موجود در سطل زباله برای همیشه نابود خواهند شد.",
"@settingsDisablingBinWarningDialogMessage": {},
"settingsAllowInstalledAppAccessSubtitle": "برای بهبود نمایش آلبوم بهره‌وری میشود",
"settingsAllowInstalledAppAccessSubtitle": "برای بهبود نمایش آلبوم به‌کارگرفته میشود",
"@settingsAllowInstalledAppAccessSubtitle": {},
"settingsStorageAccessBanner": "برخی پوشه ها برای اصلاح پرونپه های موجود در آنها به یک مجوز دسترسی نیاز دارند. در اینجا می توانید پوشه هایی را که قبلاً به آنها دسترسی داشته اید، مرور کنید.",
"settingsStorageAccessBanner": "برخی پوشه ها برای اصلاح پرونده‌های موجود در آنها به یک مجوز دسترسی نیاز دارند. در اینجا می توانید پوشه هایی را که قبلاً به آنها دسترسی داشته اید، مرور کنید.",
"@settingsStorageAccessBanner": {},
"collectionMoveFailureFeedback": "{count, plural, =1{هدایت ۱ مورد ناموفق بود} other{هدایت {count} مورد ناموفق بود}}",
"@collectionMoveFailureFeedback": {

View file

@ -1390,5 +1390,7 @@
"videoActionShowNextFrame": "Montrer limage suivante",
"@videoActionShowNextFrame": {},
"videoActionShowPreviousFrame": "Montrer limage précédente",
"@videoActionShowPreviousFrame": {}
"@videoActionShowPreviousFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "Lalbum existe déjà",
"@newAlbumDialogAlbumAlreadyExistsHelper": {}
}

View file

@ -1390,5 +1390,7 @@
"videoActionShowPreviousFrame": "Tampilkan bingkai sebelumnya",
"@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "Tampilkan bingkai berikutnya",
"@videoActionShowNextFrame": {}
"@videoActionShowNextFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "Album sudah ada",
"@newAlbumDialogAlbumAlreadyExistsHelper": {}
}

View file

@ -1390,5 +1390,7 @@
"videoActionShowNextFrame": "다음 프레임 보기",
"@videoActionShowNextFrame": {},
"videoActionShowPreviousFrame": "이전 프레임 보기",
"@videoActionShowPreviousFrame": {}
"@videoActionShowPreviousFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "앨범이 이미 있습니다",
"@newAlbumDialogAlbumAlreadyExistsHelper": {}
}

View file

@ -1392,5 +1392,7 @@
"videoActionShowNextFrame": "Volgend frame weergeven",
"@videoActionShowNextFrame": {},
"videoActionShowPreviousFrame": "Vorig frame weergeven",
"@videoActionShowPreviousFrame": {}
"@videoActionShowPreviousFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "Album bestaat al",
"@newAlbumDialogAlbumAlreadyExistsHelper": {}
}

View file

@ -1548,5 +1548,7 @@
"videoActionShowPreviousFrame": "Pokaż poprzednią klatkę",
"@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "Pokaż kolejną klatkę",
"@videoActionShowNextFrame": {}
"@videoActionShowNextFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "Album już istnieje",
"@newAlbumDialogAlbumAlreadyExistsHelper": {}
}

View file

@ -1386,5 +1386,11 @@
"mapAttributionOsmLiberty": "Blocos por [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hospedado por [OSM Americana](https://tile.ourmap.us)",
"@mapAttributionOsmLiberty": {},
"mapAttributionOpenTopoMap": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | Blocos por [OpenTopoMap](https://opentopomap.org/), [CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)",
"@mapAttributionOpenTopoMap": {}
"@mapAttributionOpenTopoMap": {},
"videoActionShowNextFrame": "Mostrar próximo quadro",
"@videoActionShowNextFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "O álbum já existe",
"@newAlbumDialogAlbumAlreadyExistsHelper": {},
"videoActionShowPreviousFrame": "Mostrar quadro anterior",
"@videoActionShowPreviousFrame": {}
}

View file

@ -1544,5 +1544,9 @@
"mapStyleOsmLiberty": "OSM Slobody",
"@mapStyleOsmLiberty": {},
"mapAttributionOsmLiberty": "Dlaždice podľa [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Hostovaný [OSM Americana](https://tile.ourmap.us)",
"@mapAttributionOsmLiberty": {}
"@mapAttributionOsmLiberty": {},
"videoActionShowPreviousFrame": "Zobraziť predchádzajúci rám",
"@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "Zobraziť ďalší rám",
"@videoActionShowNextFrame": {}
}

View file

@ -1570,5 +1570,7 @@
"videoActionShowPreviousFrame": "Visa föregående bildruta",
"@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "Visa nästa bildruta",
"@videoActionShowNextFrame": {}
"@videoActionShowNextFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "Albumet existerar redan",
"@newAlbumDialogAlbumAlreadyExistsHelper": {}
}

View file

@ -1386,5 +1386,11 @@
"mapAttributionOsmLiberty": "Döşemeler [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • Barındıran [OSM Americana](https://tile.ourmap.us)",
"@mapAttributionOsmLiberty": {},
"mapAttributionOsmData": "Harita verileri © [OpenStreetMap](https://www.openstreetmap.org/copyright) katkıda bulunanlar",
"@mapAttributionOsmData": {}
"@mapAttributionOsmData": {},
"videoActionShowNextFrame": "Sonraki kareyi göster",
"@videoActionShowNextFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "Böyle bir albüm zaten var",
"@newAlbumDialogAlbumAlreadyExistsHelper": {},
"videoActionShowPreviousFrame": "Önceki kareyi göster",
"@videoActionShowPreviousFrame": {}
}

View file

@ -1382,5 +1382,13 @@
"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": {},
"mapAttributionOsmData": "地图数据由 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 贡献",
"@mapAttributionOsmData": {}
"@mapAttributionOsmData": {},
"videoActionShowPreviousFrame": "显示上一帧",
"@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "显示下一帧",
"@videoActionShowNextFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "相册已存在",
"@newAlbumDialogAlbumAlreadyExistsHelper": {},
"mapAttributionOsmLiberty": "绘制于 [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • 主办方 [OSM Americana](https://tile.ourmap.us)",
"@mapAttributionOsmLiberty": {}
}

View file

@ -110,11 +110,16 @@ class Contributors {
Contributor('Your Average Code', 'neumeiersi91358@th-nuernberg.de'),
Contributor('Paranoid Android', 'f.cherdzhiev@innopolis.university'),
Contributor('Noah Kenzie Rodriguez-Beus', 'noahbeus@protonmail.com'),
Contributor('5FeetUnder', '15950507+5FeetUnder@users.noreply.github.com'),
Contributor('Cleverson Cândido', 'optimuspraimu@gmail.com'),
Contributor('Hasan Kara', 'hasanbeytullahkara@gmail.com'),
// 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('Priit Jõerüüt', 'hwlate@joeruut.com'), // Estonian
// Contributor('Åzze', 'laitinen.jere222@gmail.com'), // Finnish
// Contributor('Olli', 'ollinen@ollit.dev'), // Finnish
// Contributor('Idj', 'joneltmp+goahn@gmail.com'), // Hebrew

View file

@ -33,8 +33,14 @@ extension ExtraAvesEntryCatalog on AvesEntry {
if ((isVideo && (!isSized || durationMillis == 0)) || mimeType == MimeTypes.avif) {
// exotic video that is not sized during loading
final fields = await VideoMetadataFormatter.getLoadingMetadata(this);
// check size as the video interpreter may fail on some AVIF stills
final width = fields['width'];
final height = fields['height'];
final isValid = (width == null || width > 0) && (height == null || height > 0);
if (isValid) {
await applyNewFields(fields, persist: persist);
}
}
// cataloguing on platform
catalogMetadata = await metadataFetchService.getCatalogMetadata(this, background: background);

View file

@ -50,7 +50,7 @@ extension ExtraAvesEntryInfo on AvesEntry {
);
}).toList();
if (isVideo || (mimeType == MimeTypes.heif && isMultiPage)) {
if (isVideo || (mimeType == MimeTypes.heif && isMultiPage) || mimeType == MimeTypes.avif) {
directories.addAll(await _getStreamDirectories(context));
}

View file

@ -147,9 +147,11 @@ mixin AlbumMixin on SourceBase {
// new albums
void createAlbum(String directory) {
if (!_directories.contains(directory)) {
_newAlbums.add(directory);
addDirectories(albums: {directory});
}
}
void renameNewAlbum(String source, String destination) {
if (_newAlbums.remove(source)) {

View file

@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:ui';
import 'package:aves/model/covers.dart';
import 'package:aves/model/entry/entry.dart';
@ -26,6 +27,7 @@ import 'package:aves/model/vaults/vaults.dart';
import 'package:aves/services/analysis_service.dart';
import 'package:aves/services/common/image_op_events.dart';
import 'package:aves/services/common/services.dart';
import 'package:aves/widgets/aves_app.dart';
import 'package:aves_model/aves_model.dart';
import 'package:collection/collection.dart';
import 'package:event_bus/event_bus.dart';
@ -498,11 +500,19 @@ abstract class CollectionSource with SourceBase, AlbumMixin, CountryMixin, Place
}
}
}
if (startAnalysisService) {
final lifecycleState = AvesApp.lifecycleStateNotifier.value;
switch (lifecycleState) {
case AppLifecycleState.resumed:
case AppLifecycleState.inactive:
await AnalysisService.startService(
force: force,
entryIds: entries?.map((entry) => entry.id).toList(),
);
default:
unawaited(reportService.log('analysis service not started because app is in state=$lifecycleState'));
}
} else {
// explicit GC before cataloguing multiple items
await deviceService.requestGarbageCollection();

View file

@ -63,7 +63,7 @@ class MediaStoreSource extends CollectionSource {
if (currentTimeZoneOffset != null) {
final catalogTimeZoneOffset = settings.catalogTimeZoneRawOffsetMillis;
if (currentTimeZoneOffset != catalogTimeZoneOffset) {
unawaited(reportService.log('Time zone offset change: $currentTimeZoneOffset -> $catalogTimeZoneOffset. Clear catalog metadata to get correct date/times.'));
unawaited(reportService.recordError('Time zone offset change: $currentTimeZoneOffset -> $catalogTimeZoneOffset. Clear catalog metadata to get correct date/times.', null));
await localMediaDb.clearDates();
await localMediaDb.clearCatalogMetadata();
settings.catalogTimeZoneRawOffsetMillis = currentTimeZoneOffset;

View file

@ -19,6 +19,11 @@ class AndroidFileUtils {
// cf https://developer.android.com/reference/android/provider/MediaStore#VOLUME_EXTERNAL
static const externalVolume = 'external';
static const standardDirDcim = 'DCIM';
static const standardDirDownloads = 'Download';
static const standardDirMovies = 'Movies';
static const standardDirPictures = 'Pictures';
static const mediaStoreUriRoot = '$contentScheme://$mediaStoreAuthority/';
static const mediaUriPathRoots = {'/$externalVolume/images/', '/$externalVolume/video/'};
@ -43,12 +48,13 @@ class AndroidFileUtils {
await _initStorageVolumes();
vaultRoot = await storageService.getVaultRoot();
primaryStorage = storageVolumes.firstWhereOrNull((volume) => volume.isPrimary)?.path ?? separator;
// standard
dcimPath = pContext.join(primaryStorage, 'DCIM');
// standard dirs
dcimPath = pContext.join(primaryStorage, standardDirDcim);
// effective download path may have a different case
downloadPath = pContext.join(primaryStorage, 'Download').toLowerCase();
moviesPath = pContext.join(primaryStorage, 'Movies');
picturesPath = pContext.join(primaryStorage, 'Pictures');
downloadPath = pContext.join(primaryStorage, standardDirDownloads).toLowerCase();
moviesPath = pContext.join(primaryStorage, standardDirMovies);
picturesPath = pContext.join(primaryStorage, standardDirPictures);
// custom dirs
avesVideoCapturesPath = pContext.join(dcimPath, 'Video Captures');
videoCapturesPaths = {
// from Samsung

View file

@ -64,9 +64,11 @@ class AvesApp extends StatefulWidget {
// temporary exclude locales not ready yet for prime time
// `ckb`: add `flutter_ckb_localization` and necessary app localization delegates when ready
static final _unsupportedLocales = {
'az', // Azerbaijani
'bn', // Bengali
'ckb', // Kurdish (Central)
'da', // Danish
'et', // Estonian
'fi', // Finnish
'gl', // Galician
'he', // Hebrew

View file

@ -689,7 +689,7 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
},
routeSettings: const RouteSettings(name: TileViewDialog.routeName),
);
// wait for the dialog to hide as applying the change may block the UI
// wait for the dialog to hide
await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
if (value != null && initialValue != value) {
settings.collectionSortFactor = value.$1!;

View file

@ -512,7 +512,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware
);
if (confirmed == null || !confirmed) return null;
// wait for the dialog to hide as applying the change may block the UI
// wait for the dialog to hide
await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
return supported;
}

View file

@ -1,5 +1,6 @@
import 'dart:io';
import 'package:aves/model/source/collection_source.dart';
import 'package:aves/services/common/services.dart';
import 'package:aves/theme/durations.dart';
import 'package:aves/utils/android_file_utils.dart';
@ -9,6 +10,7 @@ import 'package:aves/widgets/dialogs/aves_dialog.dart';
import 'package:aves_model/aves_model.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class CreateAlbumDialog extends StatefulWidget {
static const routeName = '/dialog/create_album';
@ -23,7 +25,8 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
final ScrollController _scrollController = ScrollController();
final TextEditingController _nameController = TextEditingController();
final FocusNode _nameFieldFocusNode = FocusNode();
final ValueNotifier<bool> _existsNotifier = ValueNotifier(false);
final ValueNotifier<bool> _directoryExistsNotifier = ValueNotifier(false);
final ValueNotifier<bool> _albumExistsNotifier = ValueNotifier(false);
final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false);
late Set<StorageVolume> _allVolumes;
late StorageVolume? _primaryVolume, _selectedVolume;
@ -43,13 +46,14 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
_nameController.dispose();
_nameFieldFocusNode.removeListener(_onFocus);
_nameFieldFocusNode.dispose();
_existsNotifier.dispose();
_directoryExistsNotifier.dispose();
_isValidNotifier.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final l10n = context.l10n;
const contentHorizontalPadding = EdgeInsets.symmetric(horizontal: AvesDialog.defaultHorizontalContentPadding);
final volumeTiles = <Widget>[];
@ -61,7 +65,7 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
volumeTiles.addAll([
Padding(
padding: contentHorizontalPadding + const EdgeInsets.only(top: 20),
child: Text(context.l10n.newAlbumDialogStorageLabel),
child: Text(l10n.newAlbumDialogStorageLabel),
),
...primaryVolumes.map((volume) => _buildVolumeTile(context, volume)),
...otherVolumes.map((volume) => _buildVolumeTile(context, volume)),
@ -70,21 +74,27 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
}
return AvesDialog(
title: context.l10n.newAlbumDialogTitle,
title: l10n.newAlbumDialogTitle,
scrollController: _scrollController,
scrollableContent: [
...volumeTiles,
Padding(
padding: contentHorizontalPadding + const EdgeInsets.only(bottom: 8),
child: ValueListenableBuilder<bool>(
valueListenable: _existsNotifier,
builder: (context, exists, child) {
child: AnimatedBuilder(
animation: Listenable.merge([_albumExistsNotifier, _directoryExistsNotifier]),
builder: (context, child) {
var helperText = '';
if (_albumExistsNotifier.value) {
helperText = l10n.newAlbumDialogAlbumAlreadyExistsHelper;
} else if (_directoryExistsNotifier.value) {
helperText = l10n.newAlbumDialogNameLabelAlreadyExistsHelper;
}
return TextField(
controller: _nameController,
focusNode: _nameFieldFocusNode,
decoration: InputDecoration(
labelText: context.l10n.newAlbumDialogNameLabel,
helperText: exists ? context.l10n.newAlbumDialogNameLabelAlreadyExistsHelper : '',
labelText: l10n.newAlbumDialogNameLabel,
helperText: helperText,
),
autofocus: _allVolumes.length == 1,
onChanged: (_) => _validate(),
@ -96,11 +106,16 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
actions: [
const CancelButton(),
ValueListenableBuilder<bool>(
valueListenable: _albumExistsNotifier,
builder: (context, albumExists, child) {
return ValueListenableBuilder<bool>(
valueListenable: _isValidNotifier,
builder: (context, isValid, child) {
return TextButton(
onPressed: isValid ? () => _submit(context) : null,
child: Text(context.l10n.createAlbumButtonLabel),
child: Text(albumExists ? l10n.showButtonLabel : l10n.createAlbumButtonLabel),
);
},
);
},
),
@ -147,34 +162,18 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
);
}
String _sanitize(String input) => input.trim();
Future<String?> _buildAlbumPath() async {
final name = _nameController.text.trim();
if (name.isEmpty) return null;
String? _buildAlbumPath(String name) {
final selectedVolume = _selectedVolume;
if (selectedVolume == null || name.isEmpty) return null;
return pContext.join(selectedVolume.path, 'Pictures', name);
}
Future<void> _validate() async {
final newName = _sanitize(_nameController.text);
final path = _buildAlbumPath(newName);
// this check ignores case
final exists = path != null && await Directory(path).exists();
_existsNotifier.value = exists;
_isValidNotifier.value = path != null && newName.isNotEmpty;
}
Future<void> _submit(BuildContext context) async {
if (!_isValidNotifier.value) return;
final newName = _sanitize(_nameController.text);
final albumPath = _buildAlbumPath(newName);
final volumePath = _selectedVolume?.path;
if (albumPath == null || volumePath == null) return;
if (volumePath == null) return null;
final candidatePath = pContext.join(volumePath, AndroidFileUtils.standardDirPictures, name);
// uses resolved directory name case if it exists
var resolvedPath = volumePath;
final relativePathSegments = pContext.split(pContext.relative(albumPath, from: volumePath));
final relativePathSegments = pContext.split(pContext.relative(candidatePath, from: volumePath));
for (final targetSegment in relativePathSegments) {
String? resolvedSegment;
final directory = Directory(resolvedPath);
@ -184,6 +183,22 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
}
resolvedPath = pContext.join(resolvedPath, resolvedSegment ?? targetSegment);
}
Navigator.maybeOf(context)?.pop(resolvedPath);
return resolvedPath;
}
Future<void> _validate() async {
final path = await _buildAlbumPath();
final isValid = path != null;
_isValidNotifier.value = isValid;
_directoryExistsNotifier.value = isValid && await Directory(path).exists();
_albumExistsNotifier.value = isValid && context.read<CollectionSource>().rawAlbums.contains(path);
}
Future<void> _submit(BuildContext context) async {
final path = await _buildAlbumPath();
if (path == null) return;
Navigator.maybeOf(context)?.pop(path);
}
}

View file

@ -250,7 +250,7 @@ class _AlbumPickPageState extends State<_AlbumPickPage> {
);
if (directory == null) return;
// wait for the dialog to hide as applying the change may block the UI
// wait for the dialog to hide
await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
_pickAlbum(directory);
@ -274,7 +274,7 @@ class _AlbumPickPageState extends State<_AlbumPickPage> {
);
if (details == null) return;
// wait for the dialog to hide as applying the change may block the UI
// wait for the dialog to hide
await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
await vaults.create(details);

View file

@ -13,7 +13,7 @@ Future<void> showSelectionDialog<T>({
builder: builder,
routeSettings: const RouteSettings(name: AvesSingleSelectionDialog.routeName),
);
// wait for the dialog to hide as applying the change may block the UI
// wait for the dialog to hide
await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
if (value != null) {
onSelection(value);

View file

@ -186,7 +186,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
},
routeSettings: const RouteSettings(name: TileViewDialog.routeName),
);
// wait for the dialog to hide as applying the change may block the UI
// wait for the dialog to hide
await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
if (value != null && initialValue != value) {
sortFactor = value.$1!;
@ -199,6 +199,11 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
void _createAlbum(BuildContext context, {required bool locked}) async {
final l10n = context.l10n;
final source = context.read<CollectionSource>();
// get navigator beforehand because
// local context may be deactivated when action is triggered after navigation
final navigator = Navigator.maybeOf(context);
late final String? directory;
if (locked) {
if (!await showSkippableConfirmationDialog(
@ -226,16 +231,29 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
routeSettings: const RouteSettings(name: CreateAlbumDialog.routeName),
);
if (directory == null) return;
// wait for the dialog to hide
await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
}
final filter = AlbumFilter(directory, source.getAlbumDisplayName(context, directory));
final albumExists = source.rawAlbums.contains(directory);
if (albumExists) {
// album already exists, so we just need to highlight it
await _showAlbum(navigator, filter);
} else {
// create the album and mark it as new
source.createAlbum(directory);
final filter = AlbumFilter(directory, source.getAlbumDisplayName(context, directory));
// get navigator beforehand because
// local context may be deactivated when action is triggered after navigation
final navigator = Navigator.maybeOf(context);
final showAction = SnackBarAction(
label: l10n.showButtonLabel,
onPressed: () async {
onPressed: () => _showAlbum(navigator, filter),
);
showFeedback(context, FeedbackType.info, l10n.genericSuccessFeedback, showAction);
}
}
Future<void> _showAlbum(NavigatorState? navigator, AlbumFilter filter) async {
// local context may be deactivated when action is triggered after navigation
if (navigator != null) {
final context = navigator.context;
@ -253,9 +271,6 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
);
}
}
},
);
showFeedback(context, FeedbackType.info, l10n.genericSuccessFeedback, showAction);
}
Future<void> _delete(BuildContext context) async {

View file

@ -249,7 +249,7 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
},
routeSettings: const RouteSettings(name: TileViewDialog.routeName),
);
// wait for the dialog to hide as applying the change may block the UI
// wait for the dialog to hide
await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
if (value != null && initialValue != value) {
sortFactor = value.$1!;

View file

@ -31,7 +31,7 @@ class LocaleTile extends StatelessWidget {
builder: (context) => const LocaleSelectionPage(),
),
);
// wait for the dialog to hide as applying the change may block the UI
// wait for the dialog to hide
await Future.delayed(ADurations.pageTransitionLoose * timeDilation);
if (value != null) {
settings.locale = value == systemLocaleOption ? null : value;

View file

@ -479,7 +479,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix
);
if (newName == null || newName.isEmpty || newName == targetEntry.filenameWithoutExtension) return;
// wait for the dialog to hide as applying the change may block the UI
// wait for the dialog to hide
await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
await rename(
context,

View file

@ -105,6 +105,7 @@ class EntryPrinter with FeedbackMixin {
}
Future<pdf.Widget?> _buildPageImage(AvesEntry entry) async {
try {
if (entry.isSvg) {
final data = await mediaFetchService.getSvg(
entry.uri,
@ -123,6 +124,9 @@ class EntryPrinter with FeedbackMixin {
fit: _fit,
);
}
} catch (error) {
debugPrint('failed to load image for entry=$entry, error=$error');
}
return null;
}
}

View file

@ -20,10 +20,10 @@ packages:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: transitive
description:

View file

@ -28,10 +28,10 @@ packages:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: "direct main"
description:
@ -113,10 +113,10 @@ packages:
dependency: "direct main"
description:
name: intl
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
sha256: "99f282cb0e02edcbbf8c6b3bbc7c90b65635156c412e58f3975a7e55284ce685"
url: "https://pub.dev"
source: hosted
version: "0.19.0"
version: "0.20.0"
latlong2:
dependency: "direct main"
description:
@ -153,10 +153,10 @@ packages:
dependency: transitive
description:
name: logger
sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32"
sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1
url: "https://pub.dev"
source: hosted
version: "2.4.0"
version: "2.5.0"
material_color_utilities:
dependency: transitive
description:
@ -286,10 +286,10 @@ packages:
dependency: transitive
description:
name: web
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
version: "0.5.1"
wkt_parser:
dependency: transitive
description:

View file

@ -5,10 +5,10 @@ packages:
dependency: transitive
description:
name: _flutterfire_internals
sha256: "5534e701a2c505fed1f0799e652dd6ae23bd4d2c4cf797220e5ced5764a7c1c2"
sha256: "71c01c1998c40b3af1944ad0a5f374b4e6fef7f3d2df487f3970dbeadaeb25a1"
url: "https://pub.dev"
source: hosted
version: "1.3.44"
version: "1.3.46"
async:
dependency: transitive
description:
@ -68,10 +68,10 @@ packages:
dependency: "direct main"
description:
name: firebase_core
sha256: "51dfe2fbf3a984787a2e7b8592f2f05c986bfedd6fdacea3f9e0a7beb334de96"
sha256: "2438a75ad803e818ad3bd5df49137ee619c46b6fc7101f4dbc23da07305ce553"
url: "https://pub.dev"
source: hosted
version: "3.6.0"
version: "3.8.0"
firebase_core_platform_interface:
dependency: transitive
description:
@ -92,18 +92,18 @@ packages:
dependency: "direct main"
description:
name: firebase_crashlytics
sha256: "6899800fff1af819955aef740f18c4c8600f8b952a2a1ea97bc0872ebb257387"
sha256: "4e80ef22428dfecf609df8049419c7446c6e1d797d7f307cad3c7ab70e72ddc5"
url: "https://pub.dev"
source: hosted
version: "4.1.3"
version: "4.1.5"
firebase_crashlytics_platform_interface:
dependency: transitive
description:
name: firebase_crashlytics_platform_interface
sha256: "97c47b0a1779a3d4118416a3f0c6c564cc59ad89095e899893204d4b2ad08f4c"
sha256: "1104f428ec5249fff62016985719bb232ca91c4bde0d1a033af9b7d8b7451d70"
url: "https://pub.dev"
source: hosted
version: "3.6.44"
version: "3.6.46"
flutter:
dependency: "direct main"
description: flutter

View file

@ -35,10 +35,10 @@ packages:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: transitive
description:
@ -120,10 +120,10 @@ packages:
dependency: transitive
description:
name: intl
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
sha256: "99f282cb0e02edcbbf8c6b3bbc7c90b65635156c412e58f3975a7e55284ce685"
url: "https://pub.dev"
source: hosted
version: "0.19.0"
version: "0.20.0"
latlong2:
dependency: "direct main"
description:
@ -160,10 +160,10 @@ packages:
dependency: transitive
description:
name: logger
sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32"
sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1
url: "https://pub.dev"
source: hosted
version: "2.4.0"
version: "2.5.0"
material_color_utilities:
dependency: transitive
description:
@ -293,10 +293,10 @@ packages:
dependency: transitive
description:
name: web
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
version: "0.5.1"
wkt_parser:
dependency: transitive
description:

View file

@ -49,10 +49,10 @@ packages:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: transitive
description:
@ -65,10 +65,10 @@ packages:
dependency: transitive
description:
name: csslib
sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
version: "1.0.2"
custom_rounded_rectangle_border:
dependency: transitive
description:
@ -89,10 +89,10 @@ packages:
dependency: "direct main"
description:
name: device_info_plus
sha256: c4af09051b4f0508f6c1dc0a5c085bf014d5c9a4a0678ce1799c2b4d716387a0
sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074
url: "https://pub.dev"
source: hosted
version: "11.1.0"
version: "10.1.2"
device_info_plus_platform_interface:
dependency: transitive
description:
@ -203,18 +203,18 @@ packages:
dependency: "direct main"
description:
name: google_maps_flutter
sha256: "2e302fa3aaf4e2a297f0342d83ebc5e8e9f826e9a716aef473fe7f404ec630a7"
sha256: "209856c8e5571626afba7182cf634b2910069dc567954e76ec3e3fb37f5e9db3"
url: "https://pub.dev"
source: hosted
version: "2.9.0"
version: "2.10.0"
google_maps_flutter_android:
dependency: "direct main"
description:
name: google_maps_flutter_android
sha256: "6caec25edb8014ec7d503babc597794de2d4c1baf3e3d20b57c41bd3e439b916"
sha256: bccf64ccbb2ea672dc62a61177b315a340af86b0228564484b023657544a3fd5
url: "https://pub.dev"
source: hosted
version: "2.14.10"
version: "2.14.11"
google_maps_flutter_ios:
dependency: transitive
description:
@ -243,10 +243,10 @@ packages:
dependency: transitive
description:
name: html
sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec"
url: "https://pub.dev"
source: hosted
version: "0.15.4"
version: "0.15.5"
http:
dependency: transitive
description:
@ -267,10 +267,10 @@ packages:
dependency: transitive
description:
name: intl
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
sha256: "99f282cb0e02edcbbf8c6b3bbc7c90b65635156c412e58f3975a7e55284ce685"
url: "https://pub.dev"
source: hosted
version: "0.19.0"
version: "0.20.0"
latlong2:
dependency: "direct main"
description:
@ -307,10 +307,10 @@ packages:
dependency: transitive
description:
name: logger
sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32"
sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1
url: "https://pub.dev"
source: hosted
version: "2.4.0"
version: "2.5.0"
material_color_utilities:
dependency: transitive
description:
@ -464,18 +464,18 @@ packages:
dependency: transitive
description:
name: web
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
version: "0.5.1"
win32:
dependency: transitive
description:
name: win32
sha256: e1d0cc62e65dc2561f5071fcbccecf58ff20c344f8f3dc7d4922df372a11df1f
sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2"
url: "https://pub.dev"
source: hosted
version: "5.7.1"
version: "5.8.0"
win32_registry:
dependency: transitive
description:

View file

@ -42,10 +42,10 @@ packages:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: transitive
description:
@ -127,10 +127,10 @@ packages:
dependency: transitive
description:
name: intl
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
sha256: "99f282cb0e02edcbbf8c6b3bbc7c90b65635156c412e58f3975a7e55284ce685"
url: "https://pub.dev"
source: hosted
version: "0.19.0"
version: "0.20.0"
latlong2:
dependency: "direct main"
description:
@ -167,10 +167,10 @@ packages:
dependency: transitive
description:
name: logger
sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32"
sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1
url: "https://pub.dev"
source: hosted
version: "2.4.0"
version: "2.5.0"
material_color_utilities:
dependency: transitive
description:
@ -300,10 +300,10 @@ packages:
dependency: transitive
description:
name: web
sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
version: "0.5.1"
wkt_parser:
dependency: transitive
description:

View file

@ -27,10 +27,10 @@ packages:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: transitive
description:

View file

@ -34,10 +34,10 @@ packages:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: transitive
description:

View file

@ -58,10 +58,10 @@ packages:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: "direct main"
description:
@ -156,10 +156,10 @@ packages:
dependency: transitive
description:
name: js
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
url: "https://pub.dev"
source: hosted
version: "0.6.7"
version: "0.7.1"
leak_tracker:
dependency: transitive
description:
@ -188,8 +188,8 @@ packages:
dependency: "direct main"
description:
path: media_kit
ref: "3e7812ac2db4ec19ea501a387c1bf7a9c79bb64e"
resolved-ref: "3e7812ac2db4ec19ea501a387c1bf7a9c79bb64e"
ref: d094ba83715b0ac893e546781b2862e855d34502
resolved-ref: d094ba83715b0ac893e546781b2862e855d34502
url: "https://github.com/media-kit/media-kit.git"
source: git
version: "1.1.11"
@ -205,8 +205,8 @@ packages:
dependency: "direct main"
description:
path: media_kit_video
ref: "3e7812ac2db4ec19ea501a387c1bf7a9c79bb64e"
resolved-ref: "3e7812ac2db4ec19ea501a387c1bf7a9c79bb64e"
ref: d094ba83715b0ac893e546781b2862e855d34502
resolved-ref: d094ba83715b0ac893e546781b2862e855d34502
url: "https://github.com/media-kit/media-kit.git"
source: git
version: "1.2.5"
@ -222,10 +222,10 @@ packages:
dependency: transitive
description:
name: package_info_plus
sha256: df3eb3e0aed5c1107bb0fdb80a8e82e778114958b1c5ac5644fb1ac9cae8a998
sha256: da8d9ac8c4b1df253d1a328b7bf01ae77ef132833479ab40763334db13b91cce
url: "https://pub.dev"
source: hosted
version: "8.1.0"
version: "8.1.1"
package_info_plus_platform_interface:
dependency: transitive
description:
@ -270,50 +270,50 @@ packages:
dependency: transitive
description:
name: screen_brightness
sha256: ed8da4a4511e79422fc1aa88138e920e4008cd312b72cdaa15ccb426c0faaedd
sha256: a43fdbccd5b90044f68057412dde7715cd7499a4c24f5d5da7e01ed4cf41e0af
url: "https://pub.dev"
source: hosted
version: "0.2.2+1"
version: "2.0.0+2"
screen_brightness_android:
dependency: transitive
description:
name: screen_brightness_android
sha256: "3df10961e3a9e968a5e076fe27e7f4741fa8a1d3950bdeb48cf121ed529d0caf"
sha256: "74455f9901ab8a1a45c9097b83855dbbb7498110cc2bc249cb5a86570dd1cf7c"
url: "https://pub.dev"
source: hosted
version: "0.1.0+2"
version: "2.0.0"
screen_brightness_ios:
dependency: transitive
description:
name: screen_brightness_ios
sha256: "99adc3ca5490b8294284aad5fcc87f061ad685050e03cf45d3d018fe398fd9a2"
sha256: caee02b34e0089b138a7aee35c461bd2d7c78446dd417f07613def192598ca08
url: "https://pub.dev"
source: hosted
version: "0.1.0"
version: "2.0.0"
screen_brightness_macos:
dependency: transitive
description:
name: screen_brightness_macos
sha256: "64b34e7e3f4900d7687c8e8fb514246845a73ecec05ab53483ed025bd4a899fd"
sha256: "84fc8ffcbcf19c03d76b7673b0f2c2a2663c09aa2bc37c76ea83ab049294a97a"
url: "https://pub.dev"
source: hosted
version: "0.1.0+1"
version: "2.0.0"
screen_brightness_platform_interface:
dependency: transitive
description:
name: screen_brightness_platform_interface
sha256: b211d07f0c96637a15fb06f6168617e18030d5d74ad03795dd8547a52717c171
sha256: "321e9455b0057e3647fd37700931e063739d94a8aa1b094f98133c01cb56c27b"
url: "https://pub.dev"
source: hosted
version: "0.1.0"
version: "2.0.0"
screen_brightness_windows:
dependency: transitive
description:
name: screen_brightness_windows
sha256: "9261bf33d0fc2707d8cf16339ce25768100a65e70af0fcabaf032fc12408ba86"
sha256: fa97ae838c42f762f04d2d70adb3d957350d6a84e3598ec800e269e7c466eedd
url: "https://pub.dev"
source: hosted
version: "0.1.3"
version: "2.0.0"
sky_engine:
dependency: transitive
description: flutter
@ -443,10 +443,10 @@ packages:
dependency: transitive
description:
name: win32
sha256: e1d0cc62e65dc2561f5071fcbccecf58ff20c344f8f3dc7d4922df372a11df1f
sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2"
url: "https://pub.dev"
source: hosted
version: "5.7.1"
version: "5.8.0"
xml:
dependency: transitive
description:

View file

@ -24,12 +24,12 @@ dependency_overrides:
media_kit:
git:
url: https://github.com/media-kit/media-kit.git
ref: 18f155fe81cae93db712307411a17b2b93760eb6
ref: d094ba83715b0ac893e546781b2862e855d34502
path: media_kit
media_kit_video:
git:
url: https://github.com/media-kit/media-kit.git
ref: 18f155fe81cae93db712307411a17b2b93760eb6
ref: d094ba83715b0ac893e546781b2862e855d34502
path: media_kit_video
dev_dependencies:

View file

@ -13,10 +13,10 @@ packages:
dependency: transitive
description:
name: _flutterfire_internals
sha256: "5534e701a2c505fed1f0799e652dd6ae23bd4d2c4cf797220e5ced5764a7c1c2"
sha256: "71c01c1998c40b3af1944ad0a5f374b4e6fef7f3d2df487f3970dbeadaeb25a1"
url: "https://pub.dev"
source: hosted
version: "1.3.44"
version: "1.3.46"
_macros:
dependency: transitive
description: dart
@ -247,10 +247,10 @@ packages:
dependency: transitive
description:
name: coverage
sha256: "88b0fddbe4c92910fefc09cc0248f5e7f0cd23e450ded4c28f16ab8ee8f83268"
sha256: "4b03e11f6d5b8f6e5bb5e9f7889a56fe6c5cbe942da5378ea4d4d7f73ef9dfe5"
url: "https://pub.dev"
source: hosted
version: "1.10.0"
version: "1.11.0"
crypto:
dependency: transitive
description:
@ -263,10 +263,10 @@ packages:
dependency: transitive
description:
name: csslib
sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
version: "1.0.2"
custom_rounded_rectangle_border:
dependency: transitive
description:
@ -303,10 +303,10 @@ packages:
dependency: "direct main"
description:
name: device_info_plus
sha256: c4af09051b4f0508f6c1dc0a5c085bf014d5c9a4a0678ce1799c2b4d716387a0
sha256: f545ffbadee826f26f2e1a0f0cbd667ae9a6011cc0f77c0f8f00a969655e6e95
url: "https://pub.dev"
source: hosted
version: "11.1.0"
version: "11.1.1"
device_info_plus_platform_interface:
dependency: transitive
description:
@ -409,10 +409,10 @@ packages:
dependency: transitive
description:
name: firebase_core
sha256: "51dfe2fbf3a984787a2e7b8592f2f05c986bfedd6fdacea3f9e0a7beb334de96"
sha256: "2438a75ad803e818ad3bd5df49137ee619c46b6fc7101f4dbc23da07305ce553"
url: "https://pub.dev"
source: hosted
version: "3.6.0"
version: "3.8.0"
firebase_core_platform_interface:
dependency: transitive
description:
@ -433,18 +433,18 @@ packages:
dependency: transitive
description:
name: firebase_crashlytics
sha256: "6899800fff1af819955aef740f18c4c8600f8b952a2a1ea97bc0872ebb257387"
sha256: "4e80ef22428dfecf609df8049419c7446c6e1d797d7f307cad3c7ab70e72ddc5"
url: "https://pub.dev"
source: hosted
version: "4.1.3"
version: "4.1.5"
firebase_crashlytics_platform_interface:
dependency: transitive
description:
name: firebase_crashlytics_platform_interface
sha256: "97c47b0a1779a3d4118416a3f0c6c564cc59ad89095e899893204d4b2ad08f4c"
sha256: "1104f428ec5249fff62016985719bb232ca91c4bde0d1a033af9b7d8b7451d70"
url: "https://pub.dev"
source: hosted
version: "3.6.44"
version: "3.6.46"
fixnum:
dependency: transitive
description:
@ -473,10 +473,10 @@ packages:
dependency: "direct main"
description:
name: floating
sha256: aaebbbf0cef0454f68476edb6d79ca9734ee0e0080a03cee75db42fcc462efb5
sha256: d6e7046bfec4c1ab9e09ef9d88fee104b1eb41171d6e083099bf310535d26b79
url: "https://pub.dev"
source: hosted
version: "5.0.0"
version: "5.0.1"
fluster:
dependency: "direct main"
description:
@ -600,10 +600,10 @@ packages:
dependency: "direct main"
description:
name: get_it
sha256: "35c253f83f9e03cbac65ffa159510e41ae15f49b37291ab8c522d7a0b6f330cd"
sha256: c49895c1ecb0ee2a0ec568d39de882e2c299ba26355aa6744ab1001f98cebd15
url: "https://pub.dev"
source: hosted
version: "8.0.1"
version: "8.0.2"
glob:
dependency: transitive
description:
@ -648,18 +648,18 @@ packages:
dependency: transitive
description:
name: google_maps_flutter
sha256: "2e302fa3aaf4e2a297f0342d83ebc5e8e9f826e9a716aef473fe7f404ec630a7"
sha256: "209856c8e5571626afba7182cf634b2910069dc567954e76ec3e3fb37f5e9db3"
url: "https://pub.dev"
source: hosted
version: "2.9.0"
version: "2.10.0"
google_maps_flutter_android:
dependency: transitive
description:
name: google_maps_flutter_android
sha256: "6caec25edb8014ec7d503babc597794de2d4c1baf3e3d20b57c41bd3e439b916"
sha256: bccf64ccbb2ea672dc62a61177b315a340af86b0228564484b023657544a3fd5
url: "https://pub.dev"
source: hosted
version: "2.14.10"
version: "2.14.11"
google_maps_flutter_ios:
dependency: transitive
description:
@ -696,10 +696,10 @@ packages:
dependency: transitive
description:
name: html
sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec"
url: "https://pub.dev"
source: hosted
version: "0.15.4"
version: "0.15.5"
http:
dependency: "direct main"
description:
@ -848,10 +848,10 @@ packages:
dependency: transitive
description:
name: logger
sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32"
sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1
url: "https://pub.dev"
source: hosted
version: "2.4.0"
version: "2.5.0"
logging:
dependency: transitive
description:
@ -904,8 +904,8 @@ packages:
dependency: "direct overridden"
description:
path: media_kit
ref: "18f155fe81cae93db712307411a17b2b93760eb6"
resolved-ref: "18f155fe81cae93db712307411a17b2b93760eb6"
ref: d094ba83715b0ac893e546781b2862e855d34502
resolved-ref: d094ba83715b0ac893e546781b2862e855d34502
url: "https://github.com/media-kit/media-kit.git"
source: git
version: "1.1.11"
@ -921,8 +921,8 @@ packages:
dependency: "direct overridden"
description:
path: media_kit_video
ref: "18f155fe81cae93db712307411a17b2b93760eb6"
resolved-ref: "18f155fe81cae93db712307411a17b2b93760eb6"
ref: d094ba83715b0ac893e546781b2862e855d34502
resolved-ref: d094ba83715b0ac893e546781b2862e855d34502
url: "https://github.com/media-kit/media-kit.git"
source: git
version: "1.2.5"
@ -971,10 +971,10 @@ packages:
dependency: "direct main"
description:
name: network_info_plus
sha256: "89bad7bf9614e78716f0f86c905fe2a850dbdcc00c377968d5260c49c2c6f2eb"
sha256: bf9e39e523e9951d741868dc33ac386b0bc24301e9b7c8a7d60dbc34879150a8
url: "https://pub.dev"
source: hosted
version: "6.1.0"
version: "6.1.1"
network_info_plus_platform_interface:
dependency: transitive
description:
@ -1019,10 +1019,10 @@ packages:
dependency: "direct main"
description:
name: package_info_plus
sha256: df3eb3e0aed5c1107bb0fdb80a8e82e778114958b1c5ac5644fb1ac9cae8a998
sha256: da8d9ac8c4b1df253d1a328b7bf01ae77ef132833479ab40763334db13b91cce
url: "https://pub.dev"
source: hosted
version: "8.1.0"
version: "8.1.1"
package_info_plus_platform_interface:
dependency: transitive
description:
@ -1035,10 +1035,10 @@ packages:
dependency: "direct main"
description:
name: palette_generator
sha256: d50fbcd69abb80c5baec66d700033b1a320108b1aa17a5961866a12c0abb7c0c
sha256: "0b20245c451f14a5ca0818ab7a377765162389f8e8f0db361cceabf0fed9d1ea"
url: "https://pub.dev"
source: hosted
version: "0.3.3+4"
version: "0.3.3+5"
panorama:
dependency: "direct main"
description:
@ -1060,18 +1060,18 @@ packages:
dependency: transitive
description:
name: path_parsing
sha256: "45f7d6bba1128761de5540f39d5ca000ea8a1f22f06b76b61094a60a2997bd0e"
sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
version: "1.1.0"
path_provider:
dependency: transitive
description:
name: path_provider
sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version: "2.1.5"
path_provider_android:
dependency: transitive
description:
@ -1244,10 +1244,10 @@ packages:
dependency: "direct main"
description:
name: printing
sha256: b576764370c920b510cedf3eac7dc199d6d4af34336d608e97546392c0113362
sha256: b535d177fc6e8f8908e19b0ff5c1d4a87e3c4d0bf675e05aa2562af1b7853906
url: "https://pub.dev"
source: hosted
version: "5.13.3"
version: "5.13.4"
process:
dependency: transitive
description:
@ -1364,10 +1364,10 @@ packages:
dependency: "direct main"
description:
name: shared_preferences
sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051"
sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
version: "2.3.3"
shared_preferences_android:
dependency: transitive
description:
@ -1497,10 +1497,10 @@ packages:
dependency: "direct main"
description:
name: sqflite
sha256: "79a297dc3cc137e758c6a4baf83342b039e5a6d2436fcdf3f96a00adaaf2ad62"
sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
version: "2.4.1"
sqflite_android:
dependency: transitive
description:
@ -1521,10 +1521,10 @@ packages:
dependency: transitive
description:
name: sqflite_darwin
sha256: "769733dddf94622d5541c73e4ddc6aa7b252d865285914b6fcd54a63c4b4f027"
sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474"
url: "https://pub.dev"
source: hosted
version: "2.4.1-1"
version: "2.4.1"
sqflite_platform_interface:
dependency: transitive
description:
@ -1674,10 +1674,10 @@ packages:
dependency: transitive
description:
name: url_launcher_android
sha256: "0dea215895a4d254401730ca0ba8204b29109a34a99fb06ae559a2b60988d2de"
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
url: "https://pub.dev"
source: hosted
version: "6.3.13"
version: "6.3.14"
url_launcher_ios:
dependency: transitive
description:
@ -1690,10 +1690,10 @@ packages:
dependency: transitive
description:
name: url_launcher_linux
sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
version: "3.2.1"
url_launcher_macos:
dependency: transitive
description:
@ -1762,10 +1762,10 @@ packages:
dependency: "direct main"
description:
name: vector_tile_renderer
sha256: b58fa02b472ced87de00de2b4d5837576239bddb21b562481f25bde39bd117ae
sha256: "89746f1108eccbc0b6f33fbbef3fcf394cda3733fc0d5064ea03d53a459b56d3"
url: "https://pub.dev"
source: hosted
version: "5.2.0"
version: "5.2.1"
vm_service:
dependency: transitive
description:
@ -1850,10 +1850,10 @@ packages:
dependency: transitive
description:
name: win32
sha256: e1d0cc62e65dc2561f5071fcbccecf58ff20c344f8f3dc7d4922df372a11df1f
sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2"
url: "https://pub.dev"
source: hosted
version: "5.7.1"
version: "5.8.0"
win32_registry:
dependency: transitive
description:
@ -1896,4 +1896,4 @@ packages:
version: "3.1.2"
sdks:
dart: ">=3.5.0 <4.0.0"
flutter: ">=3.24.4"
flutter: ">=3.24.5"

View file

@ -7,13 +7,13 @@ 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.11.17+136
version: 1.11.18+137
publish_to: none
environment:
# this project bundles Flutter SDK via `flutter_wrapper`
# cf https://github.com/passsy/flutter_wrapper
flutter: 3.24.4
flutter: 3.24.5
sdk: '>=3.5.0 <4.0.0'
# use `scripts/apply_flavor_{flavor}.sh` to set the right dependencies for the flavor
@ -122,12 +122,12 @@ dependency_overrides:
media_kit:
git:
url: https://github.com/media-kit/media-kit.git
ref: 18f155fe81cae93db712307411a17b2b93760eb6
ref: d094ba83715b0ac893e546781b2862e855d34502
path: media_kit
media_kit_video:
git:
url: https://github.com/media-kit/media-kit.git
ref: 18f155fe81cae93db712307411a17b2b93760eb6
ref: d094ba83715b0ac893e546781b2862e855d34502
path: media_kit_video
dev_dependencies:

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
In v1.11.17:
In v1.11.18:
- peruse your videos frame by frame
- create map shortcuts to filtered collections
- enjoy the app in Shavian