minor fixes

This commit is contained in:
Thibault Deckers 2023-02-28 10:49:36 +01:00
parent e22f294e05
commit 6696f97ab2
15 changed files with 109 additions and 94 deletions

View file

@ -62,8 +62,12 @@ class EntryDir {
final dir = Directory(resolved); final dir = Directory(resolved);
if (dir.existsSync()) { if (dir.existsSync()) {
final partLower = part.toLowerCase(); final partLower = part.toLowerCase();
try {
final childrenDirs = dir.listSync().where((v) => v.absolute is Directory).toSet(); final childrenDirs = dir.listSync().where((v) => v.absolute is Directory).toSet();
found = childrenDirs.firstWhereOrNull((v) => pContext.basename(v.path).toLowerCase() == partLower); found = childrenDirs.firstWhereOrNull((v) => pContext.basename(v.path).toLowerCase() == partLower);
} catch (error) {
// ignore, could be IO issue when listing directory
}
} }
resolved = found?.path ?? '$resolved${pContext.separator}$part'; resolved = found?.path ?? '$resolved${pContext.separator}$part';
} }

View file

@ -25,7 +25,7 @@ extension ExtraAvesEntryMetadataEdition on AvesEntry {
final appliedModifier = await _applyDateModifierToEntry(userModifier); final appliedModifier = await _applyDateModifierToEntry(userModifier);
if (appliedModifier == null) { if (appliedModifier == null) {
if (!isMissingAtPath) { if (!isMissingAtPath && userModifier.action != DateEditAction.copyField) {
await reportService.recordError('failed to get date for modifier=$userModifier, entry=$this', null); await reportService.recordError('failed to get date for modifier=$userModifier, entry=$this', null);
} }
return {}; return {};

View file

@ -255,11 +255,12 @@ class Settings extends ChangeNotifier {
} }
} }
if (settings.useTvLayout) {
applyTvSettings(); applyTvSettings();
} }
}
void applyTvSettings() { void applyTvSettings() {
if (settings.useTvLayout) {
themeBrightness = AvesThemeBrightness.dark; themeBrightness = AvesThemeBrightness.dark;
mustBackTwiceToExit = false; mustBackTwiceToExit = false;
// address `TV-BU` / `TV-BY` requirements from https://developer.android.com/docs/quality-guidelines/tv-app-quality // address `TV-BU` / `TV-BY` requirements from https://developer.android.com/docs/quality-guidelines/tv-app-quality
@ -289,7 +290,6 @@ class Settings extends ChangeNotifier {
enableBin = false; enableBin = false;
showPinchGestureAlternatives = true; showPinchGestureAlternatives = true;
} }
}
Future<void> sanitize() async { Future<void> sanitize() async {
if (timeToTakeAction == AccessibilityTimeout.system && !await AccessibilityService.hasRecommendedTimeouts()) { if (timeToTakeAction == AccessibilityTimeout.system && !await AccessibilityService.hasRecommendedTimeouts()) {
@ -884,7 +884,7 @@ class Settings extends ChangeNotifier {
bool? getBool(String key) { bool? getBool(String key) {
try { try {
return settingsStore.getBool(key); return settingsStore.getBool(key);
} catch (e) { } catch (error) {
// ignore, could be obsolete value of different type // ignore, could be obsolete value of different type
return null; return null;
} }
@ -893,7 +893,7 @@ class Settings extends ChangeNotifier {
int? getInt(String key) { int? getInt(String key) {
try { try {
return settingsStore.getInt(key); return settingsStore.getInt(key);
} catch (e) { } catch (error) {
// ignore, could be obsolete value of different type // ignore, could be obsolete value of different type
return null; return null;
} }
@ -902,7 +902,7 @@ class Settings extends ChangeNotifier {
double? getDouble(String key) { double? getDouble(String key) {
try { try {
return settingsStore.getDouble(key); return settingsStore.getDouble(key);
} catch (e) { } catch (error) {
// ignore, could be obsolete value of different type // ignore, could be obsolete value of different type
return null; return null;
} }
@ -911,7 +911,7 @@ class Settings extends ChangeNotifier {
String? getString(String key) { String? getString(String key) {
try { try {
return settingsStore.getString(key); return settingsStore.getString(key);
} catch (e) { } catch (error) {
// ignore, could be obsolete value of different type // ignore, could be obsolete value of different type
return null; return null;
} }
@ -920,7 +920,7 @@ class Settings extends ChangeNotifier {
List<String>? getStringList(String key) { List<String>? getStringList(String key) {
try { try {
return settingsStore.getStringList(key); return settingsStore.getStringList(key);
} catch (e) { } catch (error) {
// ignore, could be obsolete value of different type // ignore, could be obsolete value of different type
return null; return null;
} }
@ -934,7 +934,7 @@ class Settings extends ChangeNotifier {
return v; return v;
} }
} }
} catch (e) { } catch (error) {
// ignore, could be obsolete value of different type // ignore, could be obsolete value of different type
} }
return defaultValue; return defaultValue;

View file

@ -154,8 +154,11 @@ class Vaults extends ChangeNotifier {
localizedReason: context.l10n.authenticateToUnlockVault, localizedReason: context.l10n.authenticateToUnlockVault,
); );
} on PlatformException catch (e, stack) { } on PlatformException catch (e, stack) {
if (e.code != 'auth_in_progress') {
// `auth_in_progress`: `Authentication in progress`
await reportService.recordError(e, stack); await reportService.recordError(e, stack);
} }
}
break; break;
case VaultLockType.pin: case VaultLockType.pin:
final pin = await showDialog<String>( final pin = await showDialog<String>(

View file

@ -27,9 +27,9 @@ class OptionalEventChannel extends EventChannel {
}); });
try { try {
await methodChannel.invokeMethod<void>('listen', arguments); await methodChannel.invokeMethod<void>('listen', arguments);
} catch (exception, stack) { } catch (error, stack) {
FlutterError.reportError(FlutterErrorDetails( FlutterError.reportError(FlutterErrorDetails(
exception: exception, exception: error,
stack: stack, stack: stack,
library: 'services library', library: 'services library',
context: ErrorDescription('while activating platform stream on channel $name'), context: ErrorDescription('while activating platform stream on channel $name'),
@ -39,9 +39,9 @@ class OptionalEventChannel extends EventChannel {
binaryMessenger.setMessageHandler(name, null); binaryMessenger.setMessageHandler(name, null);
try { try {
await methodChannel.invokeMethod<void>('cancel', arguments); await methodChannel.invokeMethod<void>('cancel', arguments);
} catch (exception, stack) { } catch (error, stack) {
FlutterError.reportError(FlutterErrorDetails( FlutterError.reportError(FlutterErrorDetails(
exception: exception, exception: error,
stack: stack, stack: stack,
library: 'services library', library: 'services library',
context: ErrorDescription('while de-activating platform stream on channel $name'), context: ErrorDescription('while de-activating platform stream on channel $name'),

View file

@ -36,7 +36,7 @@ DateTime? dateTimeFromMillis(int? millis, {bool isUtc = false}) {
if (millis == null || millis == 0) return null; if (millis == null || millis == 0) return null;
try { try {
return DateTime.fromMillisecondsSinceEpoch(millis, isUtc: isUtc); return DateTime.fromMillisecondsSinceEpoch(millis, isUtc: isUtc);
} catch (e) { } catch (error) {
// `DateTime`s can represent time values that are at a distance of at most 100,000,000 // `DateTime`s can represent time values that are at a distance of at most 100,000,000
// days from epoch (1970-01-01 UTC): -271821-04-20 to 275760-09-13. // days from epoch (1970-01-01 UTC): -271821-04-20 to 275760-09-13.
debugPrint('failed to build DateTime from timestamp in millis=$millis'); debugPrint('failed to build DateTime from timestamp in millis=$millis');

View file

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:ui';
import 'package:aves/app_flavor.dart'; import 'package:aves/app_flavor.dart';
import 'package:aves/flutter_version.dart'; import 'package:aves/flutter_version.dart';
@ -141,6 +142,7 @@ class _BugReportState extends State<BugReport> with FeedbackMixin {
} }
Future<String> _getInfo(BuildContext context) async { Future<String> _getInfo(BuildContext context) async {
final accessibility = window.accessibilityFeatures;
final packageInfo = await PackageInfo.fromPlatform(); final packageInfo = await PackageInfo.fromPlatform();
final androidInfo = await DeviceInfoPlugin().androidInfo; final androidInfo = await DeviceInfoPlugin().androidInfo;
final flavor = context.read<AppFlavor>().toString().split('.')[1]; final flavor = context.read<AppFlavor>().toString().split('.')[1];
@ -159,6 +161,7 @@ class _BugReportState extends State<BugReport> with FeedbackMixin {
'System locales: ${WidgetsBinding.instance.window.locales.join(', ')}', 'System locales: ${WidgetsBinding.instance.window.locales.join(', ')}',
'Aves locale: ${settings.locale ?? 'system'} -> ${settings.appliedLocale}', 'Aves locale: ${settings.locale ?? 'system'} -> ${settings.appliedLocale}',
'Installer: ${packageInfo.installerStore}', 'Installer: ${packageInfo.installerStore}',
'Accessibility: accessibleNavigation=${accessibility.accessibleNavigation}, disableAnimations=${accessibility.disableAnimations}',
].join('\n'); ].join('\n');
} }

View file

@ -26,7 +26,7 @@ mixin FeedbackMixin {
ScaffoldMessengerState? scaffoldMessenger; ScaffoldMessengerState? scaffoldMessenger;
try { try {
scaffoldMessenger = ScaffoldMessenger.of(context); scaffoldMessenger = ScaffoldMessenger.of(context);
} catch (e) { } catch (error) {
// minor issue: the page triggering this feedback likely // minor issue: the page triggering this feedback likely
// allows the user to navigate away and they did so // allows the user to navigate away and they did so
debugPrint('failed to find ScaffoldMessenger in context'); debugPrint('failed to find ScaffoldMessenger in context');

View file

@ -289,7 +289,7 @@ class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> {
double? tryParse(String text) { double? tryParse(String text) {
try { try {
return double.tryParse(text) ?? (coordinateFormatter.parse(text).toDouble()); return double.tryParse(text) ?? (coordinateFormatter.parse(text).toDouble());
} catch (e) { } catch (error) {
// ignore // ignore
return null; return null;
} }

View file

@ -11,6 +11,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart';
import 'package:aves/widgets/settings/common/tile_leading.dart'; import 'package:aves/widgets/settings/common/tile_leading.dart';
import 'package:aves/widgets/settings/common/tiles.dart'; import 'package:aves/widgets/settings/common/tiles.dart';
import 'package:aves/widgets/settings/privacy/privacy.dart';
import 'package:aves/widgets/settings/settings_definition.dart'; import 'package:aves/widgets/settings/settings_definition.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -134,6 +135,8 @@ class SettingsTileDisplayForceTvLayout extends SettingsTile {
if (confirmed == null || !confirmed) return; if (confirmed == null || !confirmed) return;
} }
if (v && !(await SettingsTilePrivacyEnableBin.setBinUsage(context, false))) return;
settings.forceTvLayout = v; settings.forceTvLayout = v;
}, },
title: title(context), title: title(context),

View file

@ -97,9 +97,14 @@ class SettingsTilePrivacyEnableBin extends SettingsTile {
@override @override
Widget build(BuildContext context) => SettingsSwitchListTile( Widget build(BuildContext context) => SettingsSwitchListTile(
selector: (context, s) => s.enableBin, selector: (context, s) => s.enableBin,
onChanged: (v) async { onChanged: (v) => setBinUsage(context, v),
title: title(context),
subtitle: context.l10n.settingsEnableBinSubtitle,
);
static Future<bool> setBinUsage(BuildContext context, bool enabled) async {
final l10n = context.l10n; final l10n = context.l10n;
if (!v) { if (!enabled) {
if (vaults.all.any((v) => v.useBin)) { if (vaults.all.any((v) => v.useBin)) {
await showDialog<bool>( await showDialog<bool>(
context: context, context: context,
@ -108,7 +113,7 @@ class SettingsTilePrivacyEnableBin extends SettingsTile {
actions: const [OkButton()], actions: const [OkButton()],
), ),
); );
return; return false;
} }
final source = context.read<CollectionSource>(); final source = context.read<CollectionSource>();
@ -118,7 +123,7 @@ class SettingsTilePrivacyEnableBin extends SettingsTile {
context: context, context: context,
message: l10n.settingsDisablingBinWarningDialogMessage, message: l10n.settingsDisablingBinWarningDialogMessage,
confirmationButtonLabel: l10n.applyButtonLabel, confirmationButtonLabel: l10n.applyButtonLabel,
)) return; )) return false;
// delete forever trashed items // delete forever trashed items
await EntrySetActionDelegate().doDelete( await EntrySetActionDelegate().doDelete(
@ -128,18 +133,15 @@ class SettingsTilePrivacyEnableBin extends SettingsTile {
); );
// in case of failure or cancellation // in case of failure or cancellation
if (source.trashedEntries.isNotEmpty) return; if (source.trashedEntries.isNotEmpty) return false;
}
} }
settings.enableBin = v;
if (!v) {
settings.searchHistory = []; settings.searchHistory = [];
} }
},
title: title(context), settings.enableBin = enabled;
subtitle: context.l10n.settingsEnableBinSubtitle, return true;
); }
} }
class SettingsTilePrivacyHiddenItems extends SettingsTile { class SettingsTilePrivacyHiddenItems extends SettingsTile {

View file

@ -55,8 +55,8 @@ mixin SingleEntryEditorMixin on FeedbackMixin, PermissionAwareMixin {
} else { } else {
showFeedback(context, l10n.genericFailureFeedback); showFeedback(context, l10n.genericFailureFeedback);
} }
} catch (e, stack) { } catch (error, stack) {
await reportService.recordError(e, stack); await reportService.recordError(error, stack);
} }
source?.resumeMonitoring(); source?.resumeMonitoring();
} }

View file

@ -55,7 +55,7 @@ class ViewerDebugPage extends StatelessWidget {
if (time != null && time > 0) { if (time != null && time > 0) {
try { try {
value += ' (${DateTime.fromMillisecondsSinceEpoch(time * factor)})'; value += ' (${DateTime.fromMillisecondsSinceEpoch(time * factor)})';
} catch (e) { } catch (error) {
value += ' (invalid DateTime})'; value += ' (invalid DateTime})';
} }
} }

View file

@ -62,7 +62,7 @@ class _MetadataTabState extends State<MetadataTab> {
} }
try { try {
value += ' (${DateTime.fromMillisecondsSinceEpoch(v)})'; value += ' (${DateTime.fromMillisecondsSinceEpoch(v)})';
} catch (e) { } catch (error) {
value += ' (invalid DateTime})'; value += ' (invalid DateTime})';
} }
} }

View file

@ -39,11 +39,11 @@ class _WelcomePageState extends State<WelcomePage> {
WidgetsBinding.instance.addPostFrameCallback((_) => _initWelcomeSettings()); WidgetsBinding.instance.addPostFrameCallback((_) => _initWelcomeSettings());
} }
// explicitly set consent values to current defaults
// so they are not subject to future default changes
void _initWelcomeSettings() { void _initWelcomeSettings() {
// this should be done outside of `initState`/`build` // this should be done outside of `initState`/`build`
settings.setContextualDefaults(context.read<AppFlavor>()); settings.setContextualDefaults(context.read<AppFlavor>());
// explicitly set consent values to current defaults
// so they are not subject to future default changes
settings.isInstalledAppAccessAllowed = SettingsDefaults.isInstalledAppAccessAllowed; settings.isInstalledAppAccessAllowed = SettingsDefaults.isInstalledAppAccessAllowed;
settings.isErrorReportingAllowed = SettingsDefaults.isErrorReportingAllowed; settings.isErrorReportingAllowed = SettingsDefaults.isErrorReportingAllowed;
} }