driver: fixed language selection; l10n: added TR images for izzy
13
CHANGELOG.md
|
@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## <a id="unreleased"></a>[Unreleased]
|
## <a id="unreleased"></a>[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
|
||||||
|
|
||||||
## <a id="v1.6.8"></a>[v1.6.8] - 2022-05-27
|
## <a id="v1.6.8"></a>[v1.6.8] - 2022-05-27
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
|
@ -93,7 +93,7 @@ At this stage this project does *not* accept PRs, except for translations.
|
||||||
|
|
||||||
### 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
|
### Donations
|
||||||
|
|
||||||
|
|
BIN
fastlane/metadata/android/tr/images/featureGraphic.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
fastlane/metadata/android/tr/images/phoneScreenshots/1.png
Normal file
After Width: | Height: | Size: 245 KiB |
BIN
fastlane/metadata/android/tr/images/phoneScreenshots/2.png
Normal file
After Width: | Height: | Size: 494 KiB |
BIN
fastlane/metadata/android/tr/images/phoneScreenshots/3.png
Normal file
After Width: | Height: | Size: 208 KiB |
BIN
fastlane/metadata/android/tr/images/phoneScreenshots/4.png
Normal file
After Width: | Height: | Size: 92 KiB |
BIN
fastlane/metadata/android/tr/images/phoneScreenshots/5.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
fastlane/metadata/android/tr/images/phoneScreenshots/6.png
Normal file
After Width: | Height: | Size: 338 KiB |
|
@ -7,6 +7,7 @@ import 'package:flutter/material.dart';
|
||||||
class QueryBar extends StatefulWidget {
|
class QueryBar extends StatefulWidget {
|
||||||
final ValueNotifier<String> queryNotifier;
|
final ValueNotifier<String> queryNotifier;
|
||||||
final FocusNode? focusNode;
|
final FocusNode? focusNode;
|
||||||
|
final EdgeInsetsGeometry? leadingPadding;
|
||||||
final IconData? icon;
|
final IconData? icon;
|
||||||
final String? hintText;
|
final String? hintText;
|
||||||
final bool editable;
|
final bool editable;
|
||||||
|
@ -15,6 +16,7 @@ class QueryBar extends StatefulWidget {
|
||||||
super.key,
|
super.key,
|
||||||
required this.queryNotifier,
|
required this.queryNotifier,
|
||||||
this.focusNode,
|
this.focusNode,
|
||||||
|
this.leadingPadding,
|
||||||
this.icon,
|
this.icon,
|
||||||
this.hintText,
|
this.hintText,
|
||||||
this.editable = true,
|
this.editable = true,
|
||||||
|
@ -60,7 +62,7 @@ class _QueryBarState extends State<QueryBar> {
|
||||||
focusNode: widget.focusNode ?? FocusNode(),
|
focusNode: widget.focusNode ?? FocusNode(),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
icon: Padding(
|
icon: Padding(
|
||||||
padding: const EdgeInsetsDirectional.only(start: 16),
|
padding: widget.leadingPadding ?? const EdgeInsetsDirectional.only(start: 16),
|
||||||
child: Icon(widget.icon ?? AIcons.filter),
|
child: Icon(widget.icon ?? AIcons.filter),
|
||||||
),
|
),
|
||||||
hintText: widget.hintText ?? MaterialLocalizations.of(context).searchFieldLabel,
|
hintText: widget.hintText ?? MaterialLocalizations.of(context).searchFieldLabel,
|
||||||
|
|
|
@ -63,15 +63,16 @@ class _AppPickDialogState extends State<AppPickDialog> {
|
||||||
ValueListenableBuilder<String>(
|
ValueListenableBuilder<String>(
|
||||||
valueListenable: _queryNotifier,
|
valueListenable: _queryNotifier,
|
||||||
builder: (context, query, child) {
|
builder: (context, query, child) {
|
||||||
|
final upQuery = query.toUpperCase().trim();
|
||||||
final visiblePackages = packages.where((package) {
|
final visiblePackages = packages.where((package) {
|
||||||
return {
|
return {
|
||||||
package.packageName,
|
package.packageName,
|
||||||
package.currentLabel,
|
package.currentLabel,
|
||||||
package.englishLabel,
|
package.englishLabel,
|
||||||
...package.potentialDirs,
|
...package.potentialDirs,
|
||||||
}.any((v) => v != null && v.toLowerCase().contains(query.toLowerCase()));
|
}.any((v) => v != null && v.toUpperCase().contains(upQuery));
|
||||||
}).toList();
|
}).toList();
|
||||||
final showNoneOption = query.isEmpty;
|
final showNoneOption = upQuery.isEmpty;
|
||||||
final itemCount = visiblePackages.length + (showNoneOption ? 1 : 0);
|
final itemCount = visiblePackages.length + (showNoneOption ? 1 : 0);
|
||||||
return Expanded(
|
return Expanded(
|
||||||
child: ListView.builder(
|
child: ListView.builder(
|
||||||
|
|
|
@ -3,6 +3,7 @@ import 'dart:collection';
|
||||||
import 'package:aves/l10n/l10n.dart';
|
import 'package:aves/l10n/l10n.dart';
|
||||||
import 'package:aves/model/settings/settings.dart';
|
import 'package:aves/model/settings/settings.dart';
|
||||||
import 'package:aves/theme/durations.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/basic/reselectable_radio_list_tile.dart';
|
||||||
import 'package:aves/widgets/common/extensions/build_context.dart';
|
import 'package:aves/widgets/common/extensions/build_context.dart';
|
||||||
import 'package:aves/widgets/common/providers/media_query_data_provider.dart';
|
import 'package:aves/widgets/common/providers/media_query_data_provider.dart';
|
||||||
|
@ -64,6 +65,7 @@ class LocaleSelectionPage extends StatefulWidget {
|
||||||
|
|
||||||
class _LocaleSelectionPageState extends State<LocaleSelectionPage> {
|
class _LocaleSelectionPageState extends State<LocaleSelectionPage> {
|
||||||
late Locale _selectedValue;
|
late Locale _selectedValue;
|
||||||
|
final ValueNotifier<String> _queryNotifier = ValueNotifier('');
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
@ -79,8 +81,21 @@ class _LocaleSelectionPageState extends State<LocaleSelectionPage> {
|
||||||
title: Text(context.l10n.settingsLanguage),
|
title: Text(context.l10n.settingsLanguage),
|
||||||
),
|
),
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: ListView(
|
child: ValueListenableBuilder<String>(
|
||||||
children: _getLocaleOptions(context).entries.map((kv) {
|
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 value = kv.key;
|
||||||
final title = kv.value;
|
final title = kv.value;
|
||||||
return ReselectableRadioListTile<Locale>(
|
return ReselectableRadioListTile<Locale>(
|
||||||
|
@ -97,7 +112,10 @@ class _LocaleSelectionPageState extends State<LocaleSelectionPage> {
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}).toList(),
|
}),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -18,10 +18,13 @@ Future<void> configureAndLaunch() async {
|
||||||
..hasAcceptedTerms = true
|
..hasAcceptedTerms = true
|
||||||
..isInstalledAppAccessAllowed = true
|
..isInstalledAppAccessAllowed = true
|
||||||
..isErrorReportingAllowed = false
|
..isErrorReportingAllowed = false
|
||||||
..themeBrightness = AvesThemeBrightness.dark
|
|
||||||
..themeColorMode = AvesThemeColorMode.polychrome
|
|
||||||
..setTileExtent(CountryListPage.routeName, 112)
|
..setTileExtent(CountryListPage.routeName, 112)
|
||||||
..setTileLayout(CountryListPage.routeName, TileLayout.grid)
|
..setTileLayout(CountryListPage.routeName, TileLayout.grid)
|
||||||
|
// display
|
||||||
|
..themeBrightness = AvesThemeBrightness.dark
|
||||||
|
..themeColorMode = AvesThemeColorMode.polychrome
|
||||||
|
..enableDynamicColor = false
|
||||||
|
..enableBlurEffect = true
|
||||||
// navigation
|
// navigation
|
||||||
..keepScreenOn = KeepScreenOn.always
|
..keepScreenOn = KeepScreenOn.always
|
||||||
..homePage = HomePageSetting.collection
|
..homePage = HomePageSetting.collection
|
||||||
|
@ -41,7 +44,6 @@ Future<void> configureAndLaunch() async {
|
||||||
..showOverlayInfo = true
|
..showOverlayInfo = true
|
||||||
..showOverlayShootingDetails = false
|
..showOverlayShootingDetails = false
|
||||||
..showOverlayThumbnailPreview = false
|
..showOverlayThumbnailPreview = false
|
||||||
..enableBlurEffect = true
|
|
||||||
..viewerUseCutout = true
|
..viewerUseCutout = true
|
||||||
// info
|
// info
|
||||||
..infoMapStyle = EntryMapStyle.stamenWatercolor
|
..infoMapStyle = EntryMapStyle.stamenWatercolor
|
||||||
|
|
|
@ -83,6 +83,11 @@ void setLanguage(String languageCode) {
|
||||||
await driver.tapKeyAndWait('drawer-settings-button');
|
await driver.tapKeyAndWait('drawer-settings-button');
|
||||||
await driver.tapKeyAndWait('section-language');
|
await driver.tapKeyAndWait('section-language');
|
||||||
await driver.tapKeyAndWait('tile-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);
|
await driver.tapKeyAndWait(languageCode);
|
||||||
_languageCode = languageCode;
|
_languageCode = languageCode;
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,15 @@ Future<void> configureAndLaunch() async {
|
||||||
..isInstalledAppAccessAllowed = true
|
..isInstalledAppAccessAllowed = true
|
||||||
..isErrorReportingAllowed = false
|
..isErrorReportingAllowed = false
|
||||||
..locale = const Locale('en')
|
..locale = const Locale('en')
|
||||||
|
// display
|
||||||
|
..themeBrightness = AvesThemeBrightness.dark
|
||||||
|
..themeColorMode = AvesThemeColorMode.polychrome
|
||||||
|
..enableDynamicColor = false
|
||||||
|
..enableBlurEffect = true
|
||||||
|
// navigation
|
||||||
..keepScreenOn = KeepScreenOn.always
|
..keepScreenOn = KeepScreenOn.always
|
||||||
..homePage = HomePageSetting.collection
|
..homePage = HomePageSetting.collection
|
||||||
|
..showBottomNavigationBar = true
|
||||||
// collection
|
// collection
|
||||||
..collectionBrowsingQuickActions = SettingsDefaults.collectionBrowsingQuickActions
|
..collectionBrowsingQuickActions = SettingsDefaults.collectionBrowsingQuickActions
|
||||||
// viewer
|
// viewer
|
||||||
|
@ -29,7 +36,6 @@ Future<void> configureAndLaunch() async {
|
||||||
..showOverlayInfo = true
|
..showOverlayInfo = true
|
||||||
..showOverlayShootingDetails = true
|
..showOverlayShootingDetails = true
|
||||||
..showOverlayThumbnailPreview = true
|
..showOverlayThumbnailPreview = true
|
||||||
..enableBlurEffect = true
|
|
||||||
..imageBackground = EntryBackground.checkered
|
..imageBackground = EntryBackground.checkered
|
||||||
// info
|
// info
|
||||||
..infoMapStyle = EntryMapStyle.googleNormal;
|
..infoMapStyle = EntryMapStyle.googleNormal;
|
||||||
|
|