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. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }} build-mode: ${{ matrix.build-mode }}
@ -83,6 +83,6 @@ jobs:
./flutterw build apk --profile -t lib/main_play.dart --flavor play ./flutterw build apk --profile -t lib/main_play.dart --flavor play
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4
with: with:
category: "/language:${{matrix.language}}" category: "/language:${{matrix.language}}"

View file

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

View file

@ -71,6 +71,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard. # Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning" - 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: with:
sarif_file: results.sarif 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="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 ## <a id="v1.11.17"></a>[v1.11.17] - 2024-10-30
### Added ### Added

View file

@ -154,12 +154,12 @@ dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1'
implementation "androidx.appcompat:appcompat:1.7.0" implementation "androidx.appcompat:appcompat:1.7.0"
implementation 'androidx.core:core-ktx:1.13.1' implementation 'androidx.core:core-ktx:1.15.0'
implementation 'androidx.lifecycle:lifecycle-process:2.8.6' implementation 'androidx.lifecycle:lifecycle-process:2.8.7'
implementation 'androidx.media:media:1.7.0' implementation 'androidx.media:media:1.7.0'
implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.security:security-crypto:1.1.0-alpha06' 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.caverock:androidsvg-aar:1.4'
implementation 'com.commonsware.cwac:document:0.5.0' implementation 'com.commonsware.cwac:document:0.5.0'
@ -181,7 +181,7 @@ dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.3' 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" ksp "com.github.bumptech.glide:ksp:$glide_version"
compileOnly rootProject.findProject(':streams_channel') 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 { private fun hasAppleHdrGainMap(uri: Uri, sizeBytes: Long?): Boolean {
val mpEntries = MultiPage.getJpegMpfEntries(context, uri, sizeBytes) ?: return false 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 var dataOffset = mpEntry.dataOffset
if (dataOffset > 0) { if (dataOffset > 0) {
val baseOffset = MultiPage.getJpegMpfBaseOffset(context, uri, sizeBytes) val baseOffset = MultiPage.getJpegMpfBaseOffset(context, uri, sizeBytes)
@ -802,9 +802,13 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler {
} }
StorageUtils.openInputStream(context, uri)?.let { input -> StorageUtils.openInputStream(context, uri)?.let { input ->
input.skip(dataOffset) input.skip(dataOffset)
val pageMetadata = Helper.safeRead(input, sizeBytes) try {
if (pageMetadata.getDirectoriesOfType(XmpDirectory::class.java).any { it.xmpMeta.hasHdrGainMap() }) { val pageMetadata = Helper.safeRead(input, sizeBytes)
return true 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)
} }
} }
} }

View file

@ -99,9 +99,12 @@ object MimeTypes {
else -> true else -> true
} }
// as of `ExifInterface` v1.3.1, `isSupportedMimeType` reports // as of `ExifInterface` v1.4.0-alpha01, `isSupportedMimeType` reports
// no support for TIFF images, but it can actually open them (maybe other formats too) // no support for AVIF/TIFF images, but it can actually open them (maybe other formats too)
fun canReadWithExifInterface(mimeType: String, strict: Boolean = true) = ExifInterface.isSupportedMimeType(mimeType) || !strict fun canReadWithExifInterface(mimeType: String, strict: Boolean = true): Boolean {
if (!strict) return true
return ExifInterface.isSupportedMimeType(mimeType) || mimeType == AVIF
}
// as of latest PixyMeta // as of latest PixyMeta
fun canReadWithPixyMeta(mimeType: String) = when (mimeType) { fun canReadWithPixyMeta(mimeType: String) = when (mimeType) {
@ -143,7 +146,7 @@ object MimeTypes {
return if (pageId != null && MultiPageImage.isSupported(mimeType)) { return if (pageId != null && MultiPageImage.isSupported(mimeType)) {
true true
} else when (mimeType) { } else when (mimeType) {
DNG, DNG_ADOBE, HEIC, HEIF, PNG, WEBP -> true AVIF, DNG, DNG_ADOBE, HEIC, HEIF, PNG, WEBP -> true
else -> false 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_channel_name">Сканировать медия</string>
<string name="analysis_notification_default_title">Сканирование медиа</string> <string name="analysis_notification_default_title">Сканирование медиа</string>
<string name="analysis_notification_action_stop">Стоп</string> <string name="analysis_notification_action_stop">Стоп</string>
<string name="map_shortcut_short_label">Карта</string>
</resources> </resources>

View file

@ -26,5 +26,6 @@ android {
} }
dependencies { 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"?> <?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.MediaDataSource;
import android.media.MediaMetadataRetriever; import android.media.MediaMetadataRetriever;
import android.os.Build;
import android.system.ErrnoException; import android.system.ErrnoException;
import android.system.Os; import android.system.Os;
import android.util.Log; import android.util.Log;
import androidx.annotation.DoNotInline;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import java.io.Closeable; import java.io.Closeable;
@ -32,12 +30,19 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; 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 { class ExifInterfaceUtilsFork {
private static final String TAG = "ExifInterfaceUtils"; private static final String TAG = "ExifInterfaceUtils";
private ExifInterfaceUtilsFork() { private ExifInterfaceUtilsFork() {
// Prevent instantiation // Prevent instantiation
} }
/** /**
* Copies all of the bytes from {@code in} to {@code out}. Neither stream is closed. * Copies all of the bytes from {@code in} to {@code out}. Neither stream is closed.
* Returns the total number of bytes transferred. * Returns the total number of bytes transferred.
@ -146,45 +151,18 @@ class ExifInterfaceUtilsFork {
* Closes a file descriptor that has been duplicated. * Closes a file descriptor that has been duplicated.
*/ */
static void closeFileDescriptor(FileDescriptor fd) { static void closeFileDescriptor(FileDescriptor fd) {
// Os.dup and Os.close was introduced in API 21 so this method shouldn't be called try {
// 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); Os.close(fd);
} catch (ErrnoException ex) {
Log.e(TAG, "Error closing fd.", ex);
} }
} }
@RequiresApi(23) @RequiresApi(23)
static class Api23Impl { static class Api23Impl {
private Api23Impl() {} private Api23Impl() {
}
@DoNotInline
static void setDataSource(MediaMetadataRetriever retriever, MediaDataSource dataSource) { static void setDataSource(MediaMetadataRetriever retriever, MediaDataSource dataSource) {
retriever.setDataSource(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": {}, "@tileLayoutGrid": {},
"settingsDisplayUseTvInterface": "واجهة أندرويد TV", "settingsDisplayUseTvInterface": "واجهة أندرويد TV",
"@settingsDisplayUseTvInterface": {}, "@settingsDisplayUseTvInterface": {},
"settingsTimeToTakeActionTile": "حان الوقت لاتخاذ الإجراءات اللازمة", "settingsTimeToTakeActionTile": "وقت إتخاذ الإجراءات",
"@settingsTimeToTakeActionTile": {}, "@settingsTimeToTakeActionTile": {},
"aboutCreditsWorldAtlas1": "يستخدم هذا التطبيق ملف TopoJSON من", "aboutCreditsWorldAtlas1": "يستخدم هذا التطبيق ملف TopoJSON من",
"@aboutCreditsWorldAtlas1": {}, "@aboutCreditsWorldAtlas1": {},
@ -1544,5 +1544,11 @@
"mapStyleOsmLiberty": "حرية خرائط OSM", "mapStyleOsmLiberty": "حرية خرائط OSM",
"@mapStyleOsmLiberty": {}, "@mapStyleOsmLiberty": {},
"mapAttributionOsmLiberty": "البلاط بواسطة [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • مُستضاف بواسطة [OSM Americana](https://tile.ourmap.us)", "mapAttributionOsmLiberty": "البلاط بواسطة [OpenMapTiles](https://www.openmaptiles.org/), [CC BY](http://creativecommons.org/licenses/by/4.0) • مُستضاف بواسطة [OSM Americana](https://tile.ourmap.us)",
"@mapAttributionOsmLiberty": {} "@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": {}, "@settingsRemoveAnimationsDialogTitle": {},
"settingsTimeToTakeActionTile": "Zeit zum Reagieren", "settingsTimeToTakeActionTile": "Zeit zum Reagieren",
"@settingsTimeToTakeActionTile": {}, "@settingsTimeToTakeActionTile": {},
"settingsDisplaySectionTitle": "Anzeige", "settingsDisplaySectionTitle": "Darstellung",
"@settingsDisplaySectionTitle": {}, "@settingsDisplaySectionTitle": {},
"settingsThemeBrightnessTile": "Thema", "settingsThemeBrightnessTile": "Thema",
"@settingsThemeBrightnessTile": {}, "@settingsThemeBrightnessTile": {},
@ -1378,5 +1378,19 @@
"explorerPageTitle": "Explorer", "explorerPageTitle": "Explorer",
"@explorerPageTitle": {}, "@explorerPageTitle": {},
"mapAttributionOsmData": "Kartendaten © [OpenStreetMap](https://www.openstreetmap.org/copyright) Mitwirkende", "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", "newAlbumDialogTitle": "New Album",
"newAlbumDialogNameLabel": "Album name", "newAlbumDialogNameLabel": "Album name",
"newAlbumDialogAlbumAlreadyExistsHelper": "Album already exists",
"newAlbumDialogNameLabelAlreadyExistsHelper": "Directory already exists", "newAlbumDialogNameLabelAlreadyExistsHelper": "Directory already exists",
"newAlbumDialogStorageLabel": "Storage:", "newAlbumDialogStorageLabel": "Storage:",

View file

@ -1390,5 +1390,7 @@
"videoActionShowPreviousFrame": "Mostrar fotograma anterior", "videoActionShowPreviousFrame": "Mostrar fotograma anterior",
"@videoActionShowPreviousFrame": {}, "@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "Mostrar fotograma siguiente", "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

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

View file

@ -1390,5 +1390,7 @@
"videoActionShowNextFrame": "Montrer limage suivante", "videoActionShowNextFrame": "Montrer limage suivante",
"@videoActionShowNextFrame": {}, "@videoActionShowNextFrame": {},
"videoActionShowPreviousFrame": "Montrer limage précédente", "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": "Tampilkan bingkai sebelumnya",
"@videoActionShowPreviousFrame": {}, "@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "Tampilkan bingkai berikutnya", "videoActionShowNextFrame": "Tampilkan bingkai berikutnya",
"@videoActionShowNextFrame": {} "@videoActionShowNextFrame": {},
"newAlbumDialogAlbumAlreadyExistsHelper": "Album sudah ada",
"@newAlbumDialogAlbumAlreadyExistsHelper": {}
} }

View file

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

View file

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

View file

@ -1548,5 +1548,7 @@
"videoActionShowPreviousFrame": "Pokaż poprzednią klatkę", "videoActionShowPreviousFrame": "Pokaż poprzednią klatkę",
"@videoActionShowPreviousFrame": {}, "@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "Pokaż kolejną klatkę", "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": "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": {}, "@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": "[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": "OSM Slobody",
"@mapStyleOsmLiberty": {}, "@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": "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": "Visa föregående bildruta",
"@videoActionShowPreviousFrame": {}, "@videoActionShowPreviousFrame": {},
"videoActionShowNextFrame": "Visa nästa bildruta", "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": "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": {}, "@mapAttributionOsmLiberty": {},
"mapAttributionOsmData": "Harita verileri © [OpenStreetMap](https://www.openstreetmap.org/copyright) katkıda bulunanlar", "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": "[SRTM](https://www.earthdata.nasa.gov/sensors/srtm) | 图块由 [OpenTopoMap](https://opentopomap.org/)提供,[CC BY-SA](https://creativecommons.org/licenses/by-sa/3.0/)",
"@mapAttributionOpenTopoMap": {}, "@mapAttributionOpenTopoMap": {},
"mapAttributionOsmData": "地图数据由 © [OpenStreetMap](https://www.openstreetmap.org/copyright) 贡献", "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('Your Average Code', 'neumeiersi91358@th-nuernberg.de'),
Contributor('Paranoid Android', 'f.cherdzhiev@innopolis.university'), Contributor('Paranoid Android', 'f.cherdzhiev@innopolis.university'),
Contributor('Noah Kenzie Rodriguez-Beus', 'noahbeus@protonmail.com'), 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('Alvi Khan', 'aveenalvi@gmail.com'), // Bengali
// Contributor('Htet Oo Hlaing', 'htetoh2006@outlook.com'), // Burmese // Contributor('Htet Oo Hlaing', 'htetoh2006@outlook.com'), // Burmese
// Contributor('Khant', 'khant@users.noreply.hosted.weblate.org'), // Burmese // Contributor('Khant', 'khant@users.noreply.hosted.weblate.org'), // Burmese
// Contributor('Grooty12', 'Rasmus@rosendahl-kaa.name'), // Danish // Contributor('Grooty12', 'Rasmus@rosendahl-kaa.name'), // Danish
// Contributor('Victor M', 'victormorita@tuta.io'), // 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('Åzze', 'laitinen.jere222@gmail.com'), // Finnish
// Contributor('Olli', 'ollinen@ollit.dev'), // Finnish // Contributor('Olli', 'ollinen@ollit.dev'), // Finnish
// Contributor('Idj', 'joneltmp+goahn@gmail.com'), // Hebrew // Contributor('Idj', 'joneltmp+goahn@gmail.com'), // Hebrew

View file

@ -33,7 +33,13 @@ extension ExtraAvesEntryCatalog on AvesEntry {
if ((isVideo && (!isSized || durationMillis == 0)) || mimeType == MimeTypes.avif) { if ((isVideo && (!isSized || durationMillis == 0)) || mimeType == MimeTypes.avif) {
// exotic video that is not sized during loading // exotic video that is not sized during loading
final fields = await VideoMetadataFormatter.getLoadingMetadata(this); final fields = await VideoMetadataFormatter.getLoadingMetadata(this);
await applyNewFields(fields, persist: persist); // 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 // cataloguing on platform

View file

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

View file

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

View file

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:ui';
import 'package:aves/model/covers.dart'; import 'package:aves/model/covers.dart';
import 'package:aves/model/entry/entry.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/analysis_service.dart';
import 'package:aves/services/common/image_op_events.dart'; import 'package:aves/services/common/image_op_events.dart';
import 'package:aves/services/common/services.dart'; import 'package:aves/services/common/services.dart';
import 'package:aves/widgets/aves_app.dart';
import 'package:aves_model/aves_model.dart'; import 'package:aves_model/aves_model.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:event_bus/event_bus.dart'; import 'package:event_bus/event_bus.dart';
@ -498,11 +500,19 @@ abstract class CollectionSource with SourceBase, AlbumMixin, CountryMixin, Place
} }
} }
} }
if (startAnalysisService) { if (startAnalysisService) {
await AnalysisService.startService( final lifecycleState = AvesApp.lifecycleStateNotifier.value;
force: force, switch (lifecycleState) {
entryIds: entries?.map((entry) => entry.id).toList(), 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 { } else {
// explicit GC before cataloguing multiple items // explicit GC before cataloguing multiple items
await deviceService.requestGarbageCollection(); await deviceService.requestGarbageCollection();

View file

@ -63,7 +63,7 @@ class MediaStoreSource extends CollectionSource {
if (currentTimeZoneOffset != null) { if (currentTimeZoneOffset != null) {
final catalogTimeZoneOffset = settings.catalogTimeZoneRawOffsetMillis; final catalogTimeZoneOffset = settings.catalogTimeZoneRawOffsetMillis;
if (currentTimeZoneOffset != catalogTimeZoneOffset) { 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.clearDates();
await localMediaDb.clearCatalogMetadata(); await localMediaDb.clearCatalogMetadata();
settings.catalogTimeZoneRawOffsetMillis = currentTimeZoneOffset; settings.catalogTimeZoneRawOffsetMillis = currentTimeZoneOffset;

View file

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

View file

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

View file

@ -689,7 +689,7 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
}, },
routeSettings: const RouteSettings(name: TileViewDialog.routeName), 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); await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
if (value != null && initialValue != value) { if (value != null && initialValue != value) {
settings.collectionSortFactor = value.$1!; settings.collectionSortFactor = value.$1!;

View file

@ -512,7 +512,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware
); );
if (confirmed == null || !confirmed) return null; 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); await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
return supported; return supported;
} }

View file

@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:aves/model/source/collection_source.dart';
import 'package:aves/services/common/services.dart'; import 'package:aves/services/common/services.dart';
import 'package:aves/theme/durations.dart'; import 'package:aves/theme/durations.dart';
import 'package:aves/utils/android_file_utils.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:aves_model/aves_model.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class CreateAlbumDialog extends StatefulWidget { class CreateAlbumDialog extends StatefulWidget {
static const routeName = '/dialog/create_album'; static const routeName = '/dialog/create_album';
@ -23,7 +25,8 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
final ScrollController _scrollController = ScrollController(); final ScrollController _scrollController = ScrollController();
final TextEditingController _nameController = TextEditingController(); final TextEditingController _nameController = TextEditingController();
final FocusNode _nameFieldFocusNode = FocusNode(); 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); final ValueNotifier<bool> _isValidNotifier = ValueNotifier(false);
late Set<StorageVolume> _allVolumes; late Set<StorageVolume> _allVolumes;
late StorageVolume? _primaryVolume, _selectedVolume; late StorageVolume? _primaryVolume, _selectedVolume;
@ -43,13 +46,14 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
_nameController.dispose(); _nameController.dispose();
_nameFieldFocusNode.removeListener(_onFocus); _nameFieldFocusNode.removeListener(_onFocus);
_nameFieldFocusNode.dispose(); _nameFieldFocusNode.dispose();
_existsNotifier.dispose(); _directoryExistsNotifier.dispose();
_isValidNotifier.dispose(); _isValidNotifier.dispose();
super.dispose(); super.dispose();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final l10n = context.l10n;
const contentHorizontalPadding = EdgeInsets.symmetric(horizontal: AvesDialog.defaultHorizontalContentPadding); const contentHorizontalPadding = EdgeInsets.symmetric(horizontal: AvesDialog.defaultHorizontalContentPadding);
final volumeTiles = <Widget>[]; final volumeTiles = <Widget>[];
@ -61,7 +65,7 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
volumeTiles.addAll([ volumeTiles.addAll([
Padding( Padding(
padding: contentHorizontalPadding + const EdgeInsets.only(top: 20), padding: contentHorizontalPadding + const EdgeInsets.only(top: 20),
child: Text(context.l10n.newAlbumDialogStorageLabel), child: Text(l10n.newAlbumDialogStorageLabel),
), ),
...primaryVolumes.map((volume) => _buildVolumeTile(context, volume)), ...primaryVolumes.map((volume) => _buildVolumeTile(context, volume)),
...otherVolumes.map((volume) => _buildVolumeTile(context, volume)), ...otherVolumes.map((volume) => _buildVolumeTile(context, volume)),
@ -70,21 +74,27 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
} }
return AvesDialog( return AvesDialog(
title: context.l10n.newAlbumDialogTitle, title: l10n.newAlbumDialogTitle,
scrollController: _scrollController, scrollController: _scrollController,
scrollableContent: [ scrollableContent: [
...volumeTiles, ...volumeTiles,
Padding( Padding(
padding: contentHorizontalPadding + const EdgeInsets.only(bottom: 8), padding: contentHorizontalPadding + const EdgeInsets.only(bottom: 8),
child: ValueListenableBuilder<bool>( child: AnimatedBuilder(
valueListenable: _existsNotifier, animation: Listenable.merge([_albumExistsNotifier, _directoryExistsNotifier]),
builder: (context, exists, child) { builder: (context, child) {
var helperText = '';
if (_albumExistsNotifier.value) {
helperText = l10n.newAlbumDialogAlbumAlreadyExistsHelper;
} else if (_directoryExistsNotifier.value) {
helperText = l10n.newAlbumDialogNameLabelAlreadyExistsHelper;
}
return TextField( return TextField(
controller: _nameController, controller: _nameController,
focusNode: _nameFieldFocusNode, focusNode: _nameFieldFocusNode,
decoration: InputDecoration( decoration: InputDecoration(
labelText: context.l10n.newAlbumDialogNameLabel, labelText: l10n.newAlbumDialogNameLabel,
helperText: exists ? context.l10n.newAlbumDialogNameLabelAlreadyExistsHelper : '', helperText: helperText,
), ),
autofocus: _allVolumes.length == 1, autofocus: _allVolumes.length == 1,
onChanged: (_) => _validate(), onChanged: (_) => _validate(),
@ -96,11 +106,16 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
actions: [ actions: [
const CancelButton(), const CancelButton(),
ValueListenableBuilder<bool>( ValueListenableBuilder<bool>(
valueListenable: _isValidNotifier, valueListenable: _albumExistsNotifier,
builder: (context, isValid, child) { builder: (context, albumExists, child) {
return TextButton( return ValueListenableBuilder<bool>(
onPressed: isValid ? () => _submit(context) : null, valueListenable: _isValidNotifier,
child: Text(context.l10n.createAlbumButtonLabel), builder: (context, isValid, child) {
return TextButton(
onPressed: isValid ? () => _submit(context) : null,
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; 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 // uses resolved directory name case if it exists
var resolvedPath = volumePath; 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) { for (final targetSegment in relativePathSegments) {
String? resolvedSegment; String? resolvedSegment;
final directory = Directory(resolvedPath); final directory = Directory(resolvedPath);
@ -184,6 +183,22 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
} }
resolvedPath = pContext.join(resolvedPath, resolvedSegment ?? targetSegment); 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; 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); await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
_pickAlbum(directory); _pickAlbum(directory);
@ -274,7 +274,7 @@ class _AlbumPickPageState extends State<_AlbumPickPage> {
); );
if (details == null) return; 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 Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
await vaults.create(details); await vaults.create(details);

View file

@ -13,7 +13,7 @@ Future<void> showSelectionDialog<T>({
builder: builder, builder: builder,
routeSettings: const RouteSettings(name: AvesSingleSelectionDialog.routeName), 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); await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
if (value != null) { if (value != null) {
onSelection(value); onSelection(value);

View file

@ -186,7 +186,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
}, },
routeSettings: const RouteSettings(name: TileViewDialog.routeName), 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); await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
if (value != null && initialValue != value) { if (value != null && initialValue != value) {
sortFactor = value.$1!; sortFactor = value.$1!;
@ -199,6 +199,11 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
void _createAlbum(BuildContext context, {required bool locked}) async { void _createAlbum(BuildContext context, {required bool locked}) async {
final l10n = context.l10n; final l10n = context.l10n;
final source = context.read<CollectionSource>(); 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; late final String? directory;
if (locked) { if (locked) {
if (!await showSkippableConfirmationDialog( if (!await showSkippableConfirmationDialog(
@ -226,36 +231,46 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
routeSettings: const RouteSettings(name: CreateAlbumDialog.routeName), routeSettings: const RouteSettings(name: CreateAlbumDialog.routeName),
); );
if (directory == null) return; if (directory == null) return;
}
source.createAlbum(directory);
// wait for the dialog to hide
await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
}
final filter = AlbumFilter(directory, source.getAlbumDisplayName(context, directory)); final filter = AlbumFilter(directory, source.getAlbumDisplayName(context, directory));
// get navigator beforehand because
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 showAction = SnackBarAction(
label: l10n.showButtonLabel,
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 // local context may be deactivated when action is triggered after navigation
final navigator = Navigator.maybeOf(context); if (navigator != null) {
final showAction = SnackBarAction( final context = navigator.context;
label: l10n.showButtonLabel, final highlightInfo = context.read<HighlightInfo>();
onPressed: () async { if (context.currentRouteName == AlbumListPage.routeName) {
// local context may be deactivated when action is triggered after navigation highlightInfo.trackItem(FilterGridItem(filter, null), highlightItem: filter);
if (navigator != null) { } else {
final context = navigator.context; highlightInfo.set(filter);
final highlightInfo = context.read<HighlightInfo>(); await navigator.pushAndRemoveUntil(
if (context.currentRouteName == AlbumListPage.routeName) { MaterialPageRoute(
highlightInfo.trackItem(FilterGridItem(filter, null), highlightItem: filter); settings: const RouteSettings(name: AlbumListPage.routeName),
} else { builder: (_) => const AlbumListPage(),
highlightInfo.set(filter); ),
await navigator.pushAndRemoveUntil( (route) => false,
MaterialPageRoute( );
settings: const RouteSettings(name: AlbumListPage.routeName), }
builder: (_) => const AlbumListPage(), }
),
(route) => false,
);
}
}
},
);
showFeedback(context, FeedbackType.info, l10n.genericSuccessFeedback, showAction);
} }
Future<void> _delete(BuildContext context) async { 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), 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); await Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
if (value != null && initialValue != value) { if (value != null && initialValue != value) {
sortFactor = value.$1!; sortFactor = value.$1!;

View file

@ -31,7 +31,7 @@ class LocaleTile extends StatelessWidget {
builder: (context) => const LocaleSelectionPage(), 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); await Future.delayed(ADurations.pageTransitionLoose * timeDilation);
if (value != null) { if (value != null) {
settings.locale = value == systemLocaleOption ? null : value; 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; 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 Future.delayed(ADurations.dialogTransitionLoose * timeDilation);
await rename( await rename(
context, context,

View file

@ -105,23 +105,27 @@ class EntryPrinter with FeedbackMixin {
} }
Future<pdf.Widget?> _buildPageImage(AvesEntry entry) async { Future<pdf.Widget?> _buildPageImage(AvesEntry entry) async {
if (entry.isSvg) { try {
final data = await mediaFetchService.getSvg( if (entry.isSvg) {
entry.uri, final data = await mediaFetchService.getSvg(
entry.mimeType, entry.uri,
sizeBytes: entry.sizeBytes, entry.mimeType,
); sizeBytes: entry.sizeBytes,
if (data.isNotEmpty) { );
return pdf.SvgImage( if (data.isNotEmpty) {
svg: utf8.decode(data), return pdf.SvgImage(
svg: utf8.decode(data),
fit: _fit,
);
}
} else {
return pdf.Image(
await flutterImageProvider(entry.uriImage),
fit: _fit, fit: _fit,
); );
} }
} else { } catch (error) {
return pdf.Image( debugPrint('failed to load image for entry=$entry, error=$error');
await flutterImageProvider(entry.uriImage),
fit: _fit,
);
} }
return null; return null;
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -13,10 +13,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: _flutterfire_internals name: _flutterfire_internals
sha256: "5534e701a2c505fed1f0799e652dd6ae23bd4d2c4cf797220e5ced5764a7c1c2" sha256: "71c01c1998c40b3af1944ad0a5f374b4e6fef7f3d2df487f3970dbeadaeb25a1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.44" version: "1.3.46"
_macros: _macros:
dependency: transitive dependency: transitive
description: dart description: dart
@ -247,10 +247,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: coverage name: coverage
sha256: "88b0fddbe4c92910fefc09cc0248f5e7f0cd23e450ded4c28f16ab8ee8f83268" sha256: "4b03e11f6d5b8f6e5bb5e9f7889a56fe6c5cbe942da5378ea4d4d7f73ef9dfe5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.10.0" version: "1.11.0"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
@ -263,10 +263,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: csslib name: csslib
sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.0" version: "1.0.2"
custom_rounded_rectangle_border: custom_rounded_rectangle_border:
dependency: transitive dependency: transitive
description: description:
@ -303,10 +303,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: device_info_plus name: device_info_plus
sha256: c4af09051b4f0508f6c1dc0a5c085bf014d5c9a4a0678ce1799c2b4d716387a0 sha256: f545ffbadee826f26f2e1a0f0cbd667ae9a6011cc0f77c0f8f00a969655e6e95
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "11.1.0" version: "11.1.1"
device_info_plus_platform_interface: device_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -409,10 +409,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: firebase_core name: firebase_core
sha256: "51dfe2fbf3a984787a2e7b8592f2f05c986bfedd6fdacea3f9e0a7beb334de96" sha256: "2438a75ad803e818ad3bd5df49137ee619c46b6fc7101f4dbc23da07305ce553"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.6.0" version: "3.8.0"
firebase_core_platform_interface: firebase_core_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -433,18 +433,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: firebase_crashlytics name: firebase_crashlytics
sha256: "6899800fff1af819955aef740f18c4c8600f8b952a2a1ea97bc0872ebb257387" sha256: "4e80ef22428dfecf609df8049419c7446c6e1d797d7f307cad3c7ab70e72ddc5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.1.3" version: "4.1.5"
firebase_crashlytics_platform_interface: firebase_crashlytics_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_crashlytics_platform_interface name: firebase_crashlytics_platform_interface
sha256: "97c47b0a1779a3d4118416a3f0c6c564cc59ad89095e899893204d4b2ad08f4c" sha256: "1104f428ec5249fff62016985719bb232ca91c4bde0d1a033af9b7d8b7451d70"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.6.44" version: "3.6.46"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
@ -473,10 +473,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: floating name: floating
sha256: aaebbbf0cef0454f68476edb6d79ca9734ee0e0080a03cee75db42fcc462efb5 sha256: d6e7046bfec4c1ab9e09ef9d88fee104b1eb41171d6e083099bf310535d26b79
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.0" version: "5.0.1"
fluster: fluster:
dependency: "direct main" dependency: "direct main"
description: description:
@ -600,10 +600,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: get_it name: get_it
sha256: "35c253f83f9e03cbac65ffa159510e41ae15f49b37291ab8c522d7a0b6f330cd" sha256: c49895c1ecb0ee2a0ec568d39de882e2c299ba26355aa6744ab1001f98cebd15
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.0.1" version: "8.0.2"
glob: glob:
dependency: transitive dependency: transitive
description: description:
@ -648,18 +648,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: google_maps_flutter name: google_maps_flutter
sha256: "2e302fa3aaf4e2a297f0342d83ebc5e8e9f826e9a716aef473fe7f404ec630a7" sha256: "209856c8e5571626afba7182cf634b2910069dc567954e76ec3e3fb37f5e9db3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.9.0" version: "2.10.0"
google_maps_flutter_android: google_maps_flutter_android:
dependency: transitive dependency: transitive
description: description:
name: google_maps_flutter_android name: google_maps_flutter_android
sha256: "6caec25edb8014ec7d503babc597794de2d4c1baf3e3d20b57c41bd3e439b916" sha256: bccf64ccbb2ea672dc62a61177b315a340af86b0228564484b023657544a3fd5
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.14.10" version: "2.14.11"
google_maps_flutter_ios: google_maps_flutter_ios:
dependency: transitive dependency: transitive
description: description:
@ -696,10 +696,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: html name: html
sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.15.4" version: "0.15.5"
http: http:
dependency: "direct main" dependency: "direct main"
description: description:
@ -848,10 +848,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: logger name: logger
sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32" sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.0" version: "2.5.0"
logging: logging:
dependency: transitive dependency: transitive
description: description:
@ -904,8 +904,8 @@ packages:
dependency: "direct overridden" dependency: "direct overridden"
description: description:
path: media_kit path: media_kit
ref: "18f155fe81cae93db712307411a17b2b93760eb6" ref: d094ba83715b0ac893e546781b2862e855d34502
resolved-ref: "18f155fe81cae93db712307411a17b2b93760eb6" resolved-ref: d094ba83715b0ac893e546781b2862e855d34502
url: "https://github.com/media-kit/media-kit.git" url: "https://github.com/media-kit/media-kit.git"
source: git source: git
version: "1.1.11" version: "1.1.11"
@ -921,8 +921,8 @@ packages:
dependency: "direct overridden" dependency: "direct overridden"
description: description:
path: media_kit_video path: media_kit_video
ref: "18f155fe81cae93db712307411a17b2b93760eb6" ref: d094ba83715b0ac893e546781b2862e855d34502
resolved-ref: "18f155fe81cae93db712307411a17b2b93760eb6" resolved-ref: d094ba83715b0ac893e546781b2862e855d34502
url: "https://github.com/media-kit/media-kit.git" url: "https://github.com/media-kit/media-kit.git"
source: git source: git
version: "1.2.5" version: "1.2.5"
@ -971,10 +971,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: network_info_plus name: network_info_plus
sha256: "89bad7bf9614e78716f0f86c905fe2a850dbdcc00c377968d5260c49c2c6f2eb" sha256: bf9e39e523e9951d741868dc33ac386b0bc24301e9b7c8a7d60dbc34879150a8
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.0" version: "6.1.1"
network_info_plus_platform_interface: network_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -1019,10 +1019,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: package_info_plus name: package_info_plus
sha256: df3eb3e0aed5c1107bb0fdb80a8e82e778114958b1c5ac5644fb1ac9cae8a998 sha256: da8d9ac8c4b1df253d1a328b7bf01ae77ef132833479ab40763334db13b91cce
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.1.0" version: "8.1.1"
package_info_plus_platform_interface: package_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -1035,10 +1035,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: palette_generator name: palette_generator
sha256: d50fbcd69abb80c5baec66d700033b1a320108b1aa17a5961866a12c0abb7c0c sha256: "0b20245c451f14a5ca0818ab7a377765162389f8e8f0db361cceabf0fed9d1ea"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.3.3+4" version: "0.3.3+5"
panorama: panorama:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1060,18 +1060,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path_parsing name: path_parsing
sha256: "45f7d6bba1128761de5540f39d5ca000ea8a1f22f06b76b61094a60a2997bd0e" sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "1.1.0"
path_provider: path_provider:
dependency: transitive dependency: transitive
description: description:
name: path_provider name: path_provider
sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.1.5"
path_provider_android: path_provider_android:
dependency: transitive dependency: transitive
description: description:
@ -1244,10 +1244,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: printing name: printing
sha256: b576764370c920b510cedf3eac7dc199d6d4af34336d608e97546392c0113362 sha256: b535d177fc6e8f8908e19b0ff5c1d4a87e3c4d0bf675e05aa2562af1b7853906
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.13.3" version: "5.13.4"
process: process:
dependency: transitive dependency: transitive
description: description:
@ -1364,10 +1364,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: shared_preferences name: shared_preferences
sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.2" version: "2.3.3"
shared_preferences_android: shared_preferences_android:
dependency: transitive dependency: transitive
description: description:
@ -1497,10 +1497,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: sqflite name: sqflite
sha256: "79a297dc3cc137e758c6a4baf83342b039e5a6d2436fcdf3f96a00adaaf2ad62" sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.0" version: "2.4.1"
sqflite_android: sqflite_android:
dependency: transitive dependency: transitive
description: description:
@ -1521,10 +1521,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: sqflite_darwin name: sqflite_darwin
sha256: "769733dddf94622d5541c73e4ddc6aa7b252d865285914b6fcd54a63c4b4f027" sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.1-1" version: "2.4.1"
sqflite_platform_interface: sqflite_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -1674,10 +1674,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_android name: url_launcher_android
sha256: "0dea215895a4d254401730ca0ba8204b29109a34a99fb06ae559a2b60988d2de" sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.3.13" version: "6.3.14"
url_launcher_ios: url_launcher_ios:
dependency: transitive dependency: transitive
description: description:
@ -1690,10 +1690,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_linux name: url_launcher_linux
sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.2.0" version: "3.2.1"
url_launcher_macos: url_launcher_macos:
dependency: transitive dependency: transitive
description: description:
@ -1762,10 +1762,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: vector_tile_renderer name: vector_tile_renderer
sha256: b58fa02b472ced87de00de2b4d5837576239bddb21b562481f25bde39bd117ae sha256: "89746f1108eccbc0b6f33fbbef3fcf394cda3733fc0d5064ea03d53a459b56d3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.2.0" version: "5.2.1"
vm_service: vm_service:
dependency: transitive dependency: transitive
description: description:
@ -1850,10 +1850,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: e1d0cc62e65dc2561f5071fcbccecf58ff20c344f8f3dc7d4922df372a11df1f sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.7.1" version: "5.8.0"
win32_registry: win32_registry:
dependency: transitive dependency: transitive
description: description:
@ -1896,4 +1896,4 @@ packages:
version: "3.1.2" version: "3.1.2"
sdks: sdks:
dart: ">=3.5.0 <4.0.0" 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 # - play changelog: /whatsnew/whatsnew-en-US
# - izzy changelog: /fastlane/metadata/android/en-US/changelogs/XXX01.txt # - izzy changelog: /fastlane/metadata/android/en-US/changelogs/XXX01.txt
# - libre changelog: /fastlane/metadata/android/en-US/changelogs/XXX.txt # - libre changelog: /fastlane/metadata/android/en-US/changelogs/XXX.txt
version: 1.11.17+136 version: 1.11.18+137
publish_to: none publish_to: none
environment: environment:
# this project bundles Flutter SDK via `flutter_wrapper` # this project bundles Flutter SDK via `flutter_wrapper`
# cf https://github.com/passsy/flutter_wrapper # cf https://github.com/passsy/flutter_wrapper
flutter: 3.24.4 flutter: 3.24.5
sdk: '>=3.5.0 <4.0.0' sdk: '>=3.5.0 <4.0.0'
# use `scripts/apply_flavor_{flavor}.sh` to set the right dependencies for the flavor # use `scripts/apply_flavor_{flavor}.sh` to set the right dependencies for the flavor
@ -122,12 +122,12 @@ dependency_overrides:
media_kit: media_kit:
git: git:
url: https://github.com/media-kit/media-kit.git url: https://github.com/media-kit/media-kit.git
ref: 18f155fe81cae93db712307411a17b2b93760eb6 ref: d094ba83715b0ac893e546781b2862e855d34502
path: media_kit path: media_kit
media_kit_video: media_kit_video:
git: git:
url: https://github.com/media-kit/media-kit.git url: https://github.com/media-kit/media-kit.git
ref: 18f155fe81cae93db712307411a17b2b93760eb6 ref: d094ba83715b0ac893e546781b2862e855d34502
path: media_kit_video path: media_kit_video
dev_dependencies: 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 - peruse your videos frame by frame
- create map shortcuts to filtered collections - create map shortcuts to filtered collections
- enjoy the app in Shavian - enjoy the app in Shavian