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