diff --git a/CHANGELOG.md b/CHANGELOG.md index d65bdca23..6ad280197 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +## [v1.6.8] - 2022-05-27 + +### Fixed + +- wrong window metrics on startup in some cases +- home albums not updated on startup in some cases +- crash when cataloguing large TIFF + ## [v1.6.7] - 2022-05-25 ### Added diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt index 4093ed403..e1b78809a 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt @@ -5,9 +5,7 @@ import android.app.SearchManager import android.content.ClipData import android.content.Intent import android.net.Uri -import android.os.Build -import android.os.Bundle -import android.os.Parcelable +import android.os.* import android.util.Log import androidx.annotation.RequiresApi import androidx.core.content.pm.ShortcutInfoCompat @@ -125,6 +123,15 @@ class MainActivity : FlutterActivity() { Log.i(LOG_TAG, "onStart") super.onStart() analysisHandler.attachToActivity() + + // as of Flutter v3.0.1, the window `viewInsets` and `viewPadding` + // are incorrect on startup in some environments (e.g. API 29 emulator), + // so we manually request to apply the insets to update the window metrics + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { + Handler(Looper.getMainLooper()).postDelayed({ + window.decorView.requestApplyInsets() + }, 100) + } } override fun onStop() { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt index 84f6db94f..a9d23fe13 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DebugHandler.kt @@ -284,7 +284,7 @@ class DebugHandler(private val context: Context) : MethodCallHandler { if (canReadWithMetadataExtractor(mimeType)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> - val metadata = MetadataExtractorHelper.safeRead(input, sizeBytes) + val metadata = MetadataExtractorHelper.safeRead(input) metadataMap["mimeType"] = metadata.getDirectoriesOfType(FileTypeDirectory::class.java).joinToString { dir -> if (dir.containsTag(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE)) { dir.getString(FileTypeDirectory.TAG_DETECTED_FILE_MIME_TYPE) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt index f09bf8ce1..ef9210cf1 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/EmbeddedDataHandler.kt @@ -150,7 +150,7 @@ class EmbeddedDataHandler(private val context: Context) : MethodCallHandler { if (canReadWithMetadataExtractor(mimeType)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> - val metadata = MetadataExtractorHelper.safeRead(input, sizeBytes) + val metadata = MetadataExtractorHelper.safeRead(input) // data can be large and stored in "Extended XMP", // which is returned as a second XMP directory val xmpDirs = metadata.getDirectoriesOfType(XmpDirectory::class.java) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt index ce3d27742..b76620d2c 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataFetchHandler.kt @@ -126,7 +126,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { if (canReadWithMetadataExtractor(mimeType)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> - val metadata = MetadataExtractorHelper.safeRead(input, sizeBytes) + val metadata = MetadataExtractorHelper.safeRead(input) foundExif = metadata.directories.any { it is ExifDirectoryBase && it.tagCount > 0 } foundXmp = metadata.directories.any { it is XmpDirectory && it.tagCount > 0 } val uuidDirCount = HashMap() @@ -451,7 +451,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { if (canReadWithMetadataExtractor(mimeType)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> - val metadata = MetadataExtractorHelper.safeRead(input, sizeBytes) + val metadata = MetadataExtractorHelper.safeRead(input) foundExif = metadata.directories.any { it is ExifDirectoryBase && it.tagCount > 0 } // File type @@ -718,7 +718,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { if (canReadWithMetadataExtractor(mimeType)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> - val metadata = MetadataExtractorHelper.safeRead(input, sizeBytes) + val metadata = MetadataExtractorHelper.safeRead(input) for (dir in metadata.getDirectoriesOfType(ExifSubIFDDirectory::class.java)) { foundExif = true dir.getSafeRational(ExifDirectoryBase.TAG_FNUMBER) { metadataMap[KEY_APERTURE] = it.numerator.toDouble() / it.denominator } @@ -768,7 +768,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { if (canReadWithMetadataExtractor(mimeType)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> - val metadata = MetadataExtractorHelper.safeRead(input, sizeBytes) + val metadata = MetadataExtractorHelper.safeRead(input) val fields = HashMap() for (dir in metadata.getDirectoriesOfType(ExifIFD0Directory::class.java)) { if (dir.containsGeoTiffTags()) { @@ -831,7 +831,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { if (canReadWithMetadataExtractor(mimeType)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> - val metadata = MetadataExtractorHelper.safeRead(input, sizeBytes) + val metadata = MetadataExtractorHelper.safeRead(input) val fields: FieldMap = hashMapOf( "projectionType" to XMP.GPANO_PROJECTION_TYPE_DEFAULT, ) @@ -895,7 +895,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { if (canReadWithMetadataExtractor(mimeType)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> - val metadata = MetadataExtractorHelper.safeRead(input, sizeBytes) + val metadata = MetadataExtractorHelper.safeRead(input) val xmpStrings = metadata.getDirectoriesOfType(XmpDirectory::class.java).mapNotNull { XMPMetaFactory.serializeToString(it.xmpMeta, xmpSerializeOptions) } result.success(xmpStrings.toMutableList()) return @@ -1000,7 +1000,7 @@ class MetadataFetchHandler(private val context: Context) : MethodCallHandler { if (canReadWithMetadataExtractor(mimeType)) { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> - val metadata = MetadataExtractorHelper.safeRead(input, sizeBytes) + val metadata = MetadataExtractorHelper.safeRead(input) val tag = when (field) { ExifInterface.TAG_DATETIME -> ExifIFD0Directory.TAG_DATETIME ExifInterface.TAG_DATETIME_DIGITIZED -> ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MetadataExtractorHelper.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MetadataExtractorHelper.kt index bbd790fcf..ef5639d22 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MetadataExtractorHelper.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MetadataExtractorHelper.kt @@ -48,15 +48,15 @@ object MetadataExtractorHelper { return FileTypeDetector.detectFileType(bufferedInputStream).mimeType } - fun safeRead(input: InputStream, sizeBytes: Long?): com.drew.metadata.Metadata { - val streamLength = sizeBytes ?: -1 + fun safeRead(input: InputStream): com.drew.metadata.Metadata { val bufferedInputStream = if (input is BufferedInputStream) input else BufferedInputStream(input) val fileType = FileTypeDetector.detectFileType(bufferedInputStream) val metadata = if (fileType == FileType.Jpeg) { safeReadJpeg(bufferedInputStream) } else { - ImageMetadataReader.readMetadata(bufferedInputStream, streamLength, fileType) + // providing the stream length is risky, as it may crash if it is incorrect + ImageMetadataReader.readMetadata(bufferedInputStream, -1L, fileType) } metadata.addDirectory(FileTypeDirectory(fileType)) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt index e9a5dcabf..6d17f94e2 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiPage.kt @@ -140,7 +140,7 @@ object MultiPage { fun getMotionPhotoOffset(context: Context, uri: Uri, mimeType: String, sizeBytes: Long): Long? { try { Metadata.openSafeInputStream(context, uri, mimeType, sizeBytes)?.use { input -> - val metadata = MetadataExtractorHelper.safeRead(input, sizeBytes) + val metadata = MetadataExtractorHelper.safeRead(input) for (dir in metadata.getDirectoriesOfType(XmpDirectory::class.java)) { var offsetFromEnd: Long? = null val xmpMeta = dir.xmpMeta @@ -194,7 +194,7 @@ object MultiPage { return pages } - fun isMultiPageTiff(context: Context, uri: Uri) = getTiffPageInfo(context, uri, 0)?.outDirectoryCount ?: 1 > 1 + fun isMultiPageTiff(context: Context, uri: Uri) = (getTiffPageInfo(context, uri, 0)?.outDirectoryCount ?: 1) > 1 private fun getTiffPageInfo(context: Context, uri: Uri, page: Int): TiffBitmapFactory.Options? { try { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceEntry.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceEntry.kt index 09406b448..347835fef 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceEntry.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/SourceEntry.kt @@ -97,10 +97,10 @@ class SourceEntry { get() = if (uri.scheme == ContentResolver.SCHEME_CONTENT) uri.tryParseId() else null val isSized: Boolean - get() = width ?: 0 > 0 && height ?: 0 > 0 + get() = (width ?: 0) > 0 && (height ?: 0) > 0 private val hasDuration: Boolean - get() = durationMillis ?: 0 > 0 + get() = (durationMillis ?: 0) > 0 val isVideo: Boolean get() = MimeTypes.isVideo(sourceMimeType) @@ -161,7 +161,7 @@ class SourceEntry { try { Metadata.openSafeInputStream(context, uri, sourceMimeType, sizeBytes)?.use { input -> - val metadata = MetadataExtractorHelper.safeRead(input, sizeBytes) + val metadata = MetadataExtractorHelper.safeRead(input) // do not switch on specific MIME types, as the reported MIME type could be wrong // (e.g. PNG registered as JPG) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt index c1a41b665..55a134192 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt @@ -84,7 +84,7 @@ object MimeTypes { // as of Flutter v1.22.0, with additional custom handling for SVG fun canDecodeWithFlutter(mimeType: String, rotationDegrees: Int?, isFlipped: Boolean?) = when (mimeType) { JPEG, GIF, WEBP, BMP, WBMP, ICO, SVG -> true - PNG -> rotationDegrees ?: 0 == 0 && !(isFlipped ?: false) + PNG -> (rotationDegrees ?: 0) == 0 && !(isFlipped ?: false) else -> false } diff --git a/fastlane/metadata/android/en-US/changelogs/1074.txt b/fastlane/metadata/android/en-US/changelogs/1074.txt new file mode 100644 index 000000000..8b9f35460 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1074.txt @@ -0,0 +1,5 @@ +In v1.6.8: +- bottom navigation bar +- fast scroll with breadcrumbs +- settings search +Full changelog available on GitHub diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 024d7b1ea..87b28c143 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -408,6 +408,8 @@ "settingsSystemDefault": "Система", "settingsDefault": "По умолчанию", + "settingsSearchFieldLabel": "Поиск настроек", + "settingsSearchEmpty": "Нет соответствующих настроек", "settingsActionExport": "Экспорт", "settingsActionImport": "Импорт", @@ -417,6 +419,7 @@ "settingsSectionNavigation": "Навигация", "settingsHome": "Домашний каталог", + "settingsShowBottomNavigationBar": "Показать нижнюю панель навигации", "settingsKeepScreenOnTile": "Держать экран включенным", "settingsKeepScreenOnTitle": "Держать экран включенным", "settingsDoubleBackExit": "Дважды нажмите «Назад», чтобы выйти", @@ -439,6 +442,7 @@ "settingsThumbnailOverlayTile": "Наложение", "settingsThumbnailOverlayTitle": "Наложение", "settingsThumbnailShowFavouriteIcon": "Показать значок избранного", + "settingsThumbnailShowTagIcon": "Показать значок тега", "settingsThumbnailShowLocationIcon": "Показать значок местоположения", "settingsThumbnailShowMotionPhotoIcon": "Показать значок «живого фото»", "settingsThumbnailShowRating": "Показать рейтинг", diff --git a/lib/model/source/album.dart b/lib/model/source/album.dart index 1fd58d204..4eedac52b 100644 --- a/lib/model/source/album.dart +++ b/lib/model/source/album.dart @@ -26,10 +26,14 @@ mixin AlbumMixin on SourceBase { return compareAsciiUpperCase(va, vb); } + void notifyAlbumsChanged() { + eventBus.fire(AlbumsChangedEvent()); + } + void _onAlbumChanged({bool notify = true}) { invalidateAlbumDisplayNames(); if (notify) { - eventBus.fire(AlbumsChangedEvent()); + notifyAlbumsChanged(); } } diff --git a/lib/model/source/media_store_source.dart b/lib/model/source/media_store_source.dart index 8bd93063f..28fbc4b76 100644 --- a/lib/model/source/media_store_source.dart +++ b/lib/model/source/media_store_source.dart @@ -184,6 +184,11 @@ class MediaStoreSource extends CollectionSource { } await analyze(analysisController, entries: analysisEntries); + // the home page may not reflect the current derived filters + // as the initial addition of entries is silent, + // so we manually notify change for potential home screen filters + notifyAlbumsChanged(); + debugPrint('$runtimeType refresh ${stopwatch.elapsed} done for ${knownEntries.length} known, ${allNewEntries.length} new, ${removedEntries.length} removed'); }, onError: (error) => debugPrint('$runtimeType stream error=$error'), diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index 2ea40a119..14a878eac 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -55,6 +55,16 @@ class AvesApp extends StatefulWidget { @override State createState() => _AvesAppState(); + + static void showSystemUI() { + if (device.supportEdgeToEdgeUIMode) { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); + } else { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); + } + } + + static void hideSystemUI() => SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); } class _AvesAppState extends State with WidgetsBindingObserver { diff --git a/lib/widgets/filter_grids/albums_page.dart b/lib/widgets/filter_grids/albums_page.dart index 9ebb50c89..fec6279e6 100644 --- a/lib/widgets/filter_grids/albums_page.dart +++ b/lib/widgets/filter_grids/albums_page.dart @@ -35,29 +35,31 @@ class AlbumListPage extends StatelessWidget { builder: (context, s, child) { return ValueListenableBuilder( valueListenable: androidFileUtils.areAppNamesReadyNotifier, - builder: (context, areAppNamesReady, child) => StreamBuilder( - stream: source.eventBus.on(), - builder: (context, snapshot) { - final gridItems = getAlbumGridItems(context, source); - return StreamBuilder?>( - // to update sections by tier - stream: covers.packageChangeStream, - builder: (context, snapshot) => FilterNavigationPage( - source: source, - title: context.l10n.albumPageTitle, - sortFactor: settings.albumSortFactor, - showHeaders: settings.albumGroupFactor != AlbumChipGroupFactor.none, - actionDelegate: AlbumChipSetActionDelegate(gridItems), - filterSections: groupToSections(context, source, gridItems), - newFilters: source.getNewAlbumFilters(context), - emptyBuilder: () => EmptyContent( - icon: AIcons.album, - text: context.l10n.albumEmpty, + builder: (context, areAppNamesReady, child) { + return StreamBuilder( + stream: source.eventBus.on(), + builder: (context, snapshot) { + final gridItems = getAlbumGridItems(context, source); + return StreamBuilder?>( + // to update sections by tier + stream: covers.packageChangeStream, + builder: (context, snapshot) => FilterNavigationPage( + source: source, + title: context.l10n.albumPageTitle, + sortFactor: settings.albumSortFactor, + showHeaders: settings.albumGroupFactor != AlbumChipGroupFactor.none, + actionDelegate: AlbumChipSetActionDelegate(gridItems), + filterSections: groupToSections(context, source, gridItems), + newFilters: source.getNewAlbumFilters(context), + emptyBuilder: () => EmptyContent( + icon: AIcons.album, + text: context.l10n.albumEmpty, + ), ), - ), - ); - }, - ), + ); + }, + ); + }, ); }, ); diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index a6fdf3aa1..ed16e8c82 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -2,7 +2,6 @@ import 'dart:math'; import 'package:aves/app_mode.dart'; import 'package:aves/model/actions/move_type.dart'; -import 'package:aves/model/device.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/trash.dart'; @@ -13,6 +12,7 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/utils/change_notifier.dart'; +import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/basic/insets.dart'; @@ -584,22 +584,10 @@ class _EntryViewerStackState extends State with FeedbackMixin, windowService.keepScreenOn(false); } - _showSystemUI(); + AvesApp.showSystemUI(); windowService.requestOrientation(); } - // system UI - - static void _showSystemUI() { - if (device.supportEdgeToEdgeUIMode) { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); - } else { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); - } - } - - static void _hideSystemUI() => SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); - // overlay Future _initOverlay() async { @@ -611,7 +599,7 @@ class _EntryViewerStackState extends State with FeedbackMixin, Future _onOverlayVisibleChange({bool animate = true}) async { if (_overlayVisible.value) { - _showSystemUI(); + AvesApp.showSystemUI(); if (animate) { await _overlayAnimationController.forward(); } else { @@ -623,7 +611,7 @@ class _EntryViewerStackState extends State with FeedbackMixin, _frozenViewInsets = mediaQuery.viewInsets; _frozenViewPadding = mediaQuery.viewPadding; }); - _hideSystemUI(); + AvesApp.hideSystemUI(); if (animate) { await _overlayAnimationController.reverse(); } else { diff --git a/lib/widgets/viewer/panorama_page.dart b/lib/widgets/viewer/panorama_page.dart index dabe95efb..5d97c62ea 100644 --- a/lib/widgets/viewer/panorama_page.dart +++ b/lib/widgets/viewer/panorama_page.dart @@ -1,10 +1,10 @@ import 'dart:math'; -import 'package:aves/model/device.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_images.dart'; import 'package:aves/model/panorama.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/basic/insets.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/media_query.dart'; @@ -13,7 +13,6 @@ import 'package:aves/widgets/viewer/overlay/common.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; -import 'package:flutter/services.dart'; import 'package:latlong2/latlong.dart'; import 'package:panorama/panorama.dart'; import 'package:provider/provider.dart'; @@ -164,21 +163,11 @@ class _PanoramaPageState extends State { } void _onLeave() { - _showSystemUI(); + AvesApp.showSystemUI(); } // system UI - static void _showSystemUI() { - if (device.supportEdgeToEdgeUIMode) { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); - } else { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); - } - } - - static void _hideSystemUI() => SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); - // overlay Future _initOverlay() async { @@ -190,9 +179,9 @@ class _PanoramaPageState extends State { Future _onOverlayVisibleChange() async { if (_overlayVisible.value) { - _showSystemUI(); + AvesApp.showSystemUI(); } else { - _hideSystemUI(); + AvesApp.hideSystemUI(); } } } diff --git a/pubspec.yaml b/pubspec.yaml index 403fa8959..5b6dd1b14 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,7 +6,7 @@ repository: https://github.com/deckerst/aves # - github changelog: /CHANGELOG.md # - play changelog: /whatsnew/whatsnew-en-US # - izzy changelog: /fastlane/metadata/android/en-US/changelogs/1XXX.txt -version: 1.6.7+73 +version: 1.6.8+74 publish_to: none environment: diff --git a/untranslated.json b/untranslated.json index 7735d6704..3da227021 100644 --- a/untranslated.json +++ b/untranslated.json @@ -2,12 +2,5 @@ "es": [ "settingsShowBottomNavigationBar", "settingsThumbnailShowTagIcon" - ], - - "ru": [ - "settingsSearchFieldLabel", - "settingsSearchEmpty", - "settingsShowBottomNavigationBar", - "settingsThumbnailShowTagIcon" ] } diff --git a/whatsnew/whatsnew-en-US b/whatsnew/whatsnew-en-US index 5da320065..c34d25bfb 100644 --- a/whatsnew/whatsnew-en-US +++ b/whatsnew/whatsnew-en-US @@ -1,4 +1,4 @@ -In v1.6.7: +In v1.6.8: - bottom navigation bar - fast scroll with breadcrumbs - settings search