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;