diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ad280197..630dfbe0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added + +- optional dynamic accent color on Android 12+ +- Turkish translation (thanks metezd) + +### Changed + +- do not force quit on storage permission denial + +### Fixed + +- merge ambiguously cased directories + ## [v1.6.8] - 2022-05-27 ### Fixed diff --git a/README.md b/README.md index d611460fc..9af7d5a6a 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ At this stage this project does *not* accept PRs, except for translations. ### Translations -If you want to translate this app in your language and share the result, [there is a guide](https://github.com/deckerst/aves/wiki/Contributing-to-Translations). English, Korean and French are already handled by me. Russian, German, Spanish, Portuguese, Indonesian, Japanese, Italian & Chinese are handled by generous volunteers. +If you want to translate this app in your language and share the result, [there is a guide](https://github.com/deckerst/aves/wiki/Contributing-to-Translations). English, Korean and French are already handled by me. Russian, German, Spanish, Portuguese, Indonesian, Japanese, Italian, Chinese & Turkish are handled by generous volunteers. ### Donations diff --git a/fastlane/metadata/android/tr/images/featureGraphic.png b/fastlane/metadata/android/tr/images/featureGraphic.png new file mode 100644 index 000000000..11d0ca7af Binary files /dev/null and b/fastlane/metadata/android/tr/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/1.png b/fastlane/metadata/android/tr/images/phoneScreenshots/1.png new file mode 100644 index 000000000..a8ee2dbe5 Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/1.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/2.png b/fastlane/metadata/android/tr/images/phoneScreenshots/2.png new file mode 100644 index 000000000..2d8ce44ea Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/2.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/3.png b/fastlane/metadata/android/tr/images/phoneScreenshots/3.png new file mode 100644 index 000000000..4daa50af6 Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/3.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/4.png b/fastlane/metadata/android/tr/images/phoneScreenshots/4.png new file mode 100644 index 000000000..94f569bd6 Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/4.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/5.png b/fastlane/metadata/android/tr/images/phoneScreenshots/5.png new file mode 100644 index 000000000..2f293b32d Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/5.png differ diff --git a/fastlane/metadata/android/tr/images/phoneScreenshots/6.png b/fastlane/metadata/android/tr/images/phoneScreenshots/6.png new file mode 100644 index 000000000..afaff9751 Binary files /dev/null and b/fastlane/metadata/android/tr/images/phoneScreenshots/6.png differ diff --git a/lib/widgets/common/basic/query_bar.dart b/lib/widgets/common/basic/query_bar.dart index a19d0e813..d525edeb8 100644 --- a/lib/widgets/common/basic/query_bar.dart +++ b/lib/widgets/common/basic/query_bar.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; class QueryBar extends StatefulWidget { final ValueNotifier queryNotifier; final FocusNode? focusNode; + final EdgeInsetsGeometry? leadingPadding; final IconData? icon; final String? hintText; final bool editable; @@ -15,6 +16,7 @@ class QueryBar extends StatefulWidget { super.key, required this.queryNotifier, this.focusNode, + this.leadingPadding, this.icon, this.hintText, this.editable = true, @@ -60,7 +62,7 @@ class _QueryBarState extends State { focusNode: widget.focusNode ?? FocusNode(), decoration: InputDecoration( icon: Padding( - padding: const EdgeInsetsDirectional.only(start: 16), + padding: widget.leadingPadding ?? const EdgeInsetsDirectional.only(start: 16), child: Icon(widget.icon ?? AIcons.filter), ), hintText: widget.hintText ?? MaterialLocalizations.of(context).searchFieldLabel, diff --git a/lib/widgets/dialogs/app_pick_dialog.dart b/lib/widgets/dialogs/app_pick_dialog.dart index 13a0e22cc..a48215e94 100644 --- a/lib/widgets/dialogs/app_pick_dialog.dart +++ b/lib/widgets/dialogs/app_pick_dialog.dart @@ -63,15 +63,16 @@ class _AppPickDialogState extends State { ValueListenableBuilder( valueListenable: _queryNotifier, builder: (context, query, child) { + final upQuery = query.toUpperCase().trim(); final visiblePackages = packages.where((package) { return { package.packageName, package.currentLabel, package.englishLabel, ...package.potentialDirs, - }.any((v) => v != null && v.toLowerCase().contains(query.toLowerCase())); + }.any((v) => v != null && v.toUpperCase().contains(upQuery)); }).toList(); - final showNoneOption = query.isEmpty; + final showNoneOption = upQuery.isEmpty; final itemCount = visiblePackages.length + (showNoneOption ? 1 : 0); return Expanded( child: ListView.builder( diff --git a/lib/widgets/settings/language/locale.dart b/lib/widgets/settings/language/locale.dart index 882c54f9c..b3ffbb93c 100644 --- a/lib/widgets/settings/language/locale.dart +++ b/lib/widgets/settings/language/locale.dart @@ -3,6 +3,7 @@ import 'dart:collection'; import 'package:aves/l10n/l10n.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; +import 'package:aves/widgets/common/basic/query_bar.dart'; import 'package:aves/widgets/common/basic/reselectable_radio_list_tile.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; @@ -64,6 +65,7 @@ class LocaleSelectionPage extends StatefulWidget { class _LocaleSelectionPageState extends State { late Locale _selectedValue; + final ValueNotifier _queryNotifier = ValueNotifier(''); @override void initState() { @@ -79,25 +81,41 @@ class _LocaleSelectionPageState extends State { title: Text(context.l10n.settingsLanguage), ), body: SafeArea( - child: ListView( - children: _getLocaleOptions(context).entries.map((kv) { - final value = kv.key; - final title = kv.value; - return ReselectableRadioListTile( - // key is expected by test driver - key: Key(value.toString()), - value: value, - groupValue: _selectedValue, - onChanged: (v) => Navigator.pop(context, v), - reselectable: true, - title: Text( - title, - softWrap: false, - overflow: TextOverflow.fade, - maxLines: 1, - ), + child: ValueListenableBuilder( + valueListenable: _queryNotifier, + builder: (context, query, child) { + final upQuery = query.toUpperCase().trim(); + return ListView( + children: [ + QueryBar( + queryNotifier: _queryNotifier, + leadingPadding: const EdgeInsetsDirectional.only(start: 24, end: 8), + ), + ..._getLocaleOptions(context).entries.where((kv) { + if (upQuery.isEmpty) return true; + final title = kv.value; + return title.toUpperCase().contains(upQuery); + }).map((kv) { + final value = kv.key; + final title = kv.value; + return ReselectableRadioListTile( + // key is expected by test driver + key: Key(value.toString()), + value: value, + groupValue: _selectedValue, + onChanged: (v) => Navigator.pop(context, v), + reselectable: true, + title: Text( + title, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ); + }), + ], ); - }).toList(), + }, ), ), ), diff --git a/test_driver/driver_screenshots.dart b/test_driver/driver_screenshots.dart index cfc6ac14c..e08ed8d56 100644 --- a/test_driver/driver_screenshots.dart +++ b/test_driver/driver_screenshots.dart @@ -18,10 +18,13 @@ Future configureAndLaunch() async { ..hasAcceptedTerms = true ..isInstalledAppAccessAllowed = true ..isErrorReportingAllowed = false - ..themeBrightness = AvesThemeBrightness.dark - ..themeColorMode = AvesThemeColorMode.polychrome ..setTileExtent(CountryListPage.routeName, 112) ..setTileLayout(CountryListPage.routeName, TileLayout.grid) + // display + ..themeBrightness = AvesThemeBrightness.dark + ..themeColorMode = AvesThemeColorMode.polychrome + ..enableDynamicColor = false + ..enableBlurEffect = true // navigation ..keepScreenOn = KeepScreenOn.always ..homePage = HomePageSetting.collection @@ -41,7 +44,6 @@ Future configureAndLaunch() async { ..showOverlayInfo = true ..showOverlayShootingDetails = false ..showOverlayThumbnailPreview = false - ..enableBlurEffect = true ..viewerUseCutout = true // info ..infoMapStyle = EntryMapStyle.stamenWatercolor diff --git a/test_driver/driver_screenshots_test.dart b/test_driver/driver_screenshots_test.dart index e9c2ce7a1..0f3158e19 100644 --- a/test_driver/driver_screenshots_test.dart +++ b/test_driver/driver_screenshots_test.dart @@ -83,6 +83,11 @@ void setLanguage(String languageCode) { await driver.tapKeyAndWait('drawer-settings-button'); await driver.tapKeyAndWait('section-language'); await driver.tapKeyAndWait('tile-language'); + + final name = SupportedLocales.languagesByLanguageCode[languageCode] ?? languageCode; + await driver.tap(find.byType('TextField')); + await driver.enterText(name); + await driver.tapKeyAndWait(languageCode); _languageCode = languageCode; diff --git a/test_driver/driver_shaders.dart b/test_driver/driver_shaders.dart index cde043409..168bb3cc9 100644 --- a/test_driver/driver_shaders.dart +++ b/test_driver/driver_shaders.dart @@ -19,8 +19,15 @@ Future configureAndLaunch() async { ..isInstalledAppAccessAllowed = true ..isErrorReportingAllowed = false ..locale = const Locale('en') + // display + ..themeBrightness = AvesThemeBrightness.dark + ..themeColorMode = AvesThemeColorMode.polychrome + ..enableDynamicColor = false + ..enableBlurEffect = true + // navigation ..keepScreenOn = KeepScreenOn.always ..homePage = HomePageSetting.collection + ..showBottomNavigationBar = true // collection ..collectionBrowsingQuickActions = SettingsDefaults.collectionBrowsingQuickActions // viewer @@ -29,7 +36,6 @@ Future configureAndLaunch() async { ..showOverlayInfo = true ..showOverlayShootingDetails = true ..showOverlayThumbnailPreview = true - ..enableBlurEffect = true ..imageBackground = EntryBackground.checkered // info ..infoMapStyle = EntryMapStyle.googleNormal;