feat: add accessibility setting and conditionally disable animations

This commit is contained in:
Anton Stubenbord
2023-11-16 23:44:02 +01:00
parent a17f658df5
commit 12be81d93b
21 changed files with 304 additions and 77 deletions

View File

@@ -0,0 +1,89 @@
import 'dart:ui';
import 'package:flutter/widgets.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:hive/hive.dart';
import 'package:paperless_mobile/core/database/hive/hive_config.dart';
import 'package:paperless_mobile/core/database/hive/hive_extensions.dart';
import 'package:paperless_mobile/features/settings/view/widgets/global_settings_builder.dart';
import 'package:paperless_mobile/routing/navigation_keys.dart';
extension AccessibilityAwareAnimationDurationExtension on Duration {
Duration accessible() {
bool shouldDisableAnimations = WidgetsBinding.instance.disableAnimations ||
Hive.globalSettingsBox.getValue()!.disableAnimations;
// print(shouldDisableAnimations);
if (shouldDisableAnimations) {
return 0.seconds;
}
return this;
}
}
extension AccessibleHero on Hero {
Widget accessible() {
return GlobalSettingsBuilder(
builder: (context, settings) {
return HeroMode(
enabled: WidgetsBinding.instance.disableAnimations ||
!settings.disableAnimations,
child: this,
);
},
);
// bool shouldDisableAnimations = WidgetsBinding.instance.disableAnimations ||
// Hive.globalSettingsBox.getValue()!.disableAnimations;
// return _AccessibilityAwareObserverWidget(
// accessibilityAwareBuilder: (context, accessibilityFeatures) {
// return HeroMode(
// enabled: !accessibilityFeatures.disableAnimations,
// child: this,
// );
// },
// );
}
}
class _AccessibilityAwareObserverWidget extends StatefulWidget {
final Widget Function(
BuildContext context,
AccessibilityFeatures accessibilityFeatures,
) accessibilityAwareBuilder;
const _AccessibilityAwareObserverWidget({
super.key,
required this.accessibilityAwareBuilder,
});
@override
State<_AccessibilityAwareObserverWidget> createState() =>
_AccessibilityAwareObserverWidgetState();
}
class _AccessibilityAwareObserverWidgetState
extends State<_AccessibilityAwareObserverWidget>
with WidgetsBindingObserver {
late final AccessibilityFeatures _accessibilityFeatures;
@override
void initState() {
super.initState();
_accessibilityFeatures = WidgetsBinding.instance.accessibilityFeatures;
}
@override
void didChangeAccessibilityFeatures() {
super.didChangeAccessibilityFeatures();
setState(() {
_accessibilityFeatures = WidgetsBinding.instance.accessibilityFeatures;
});
print("Accessibility features changed");
}
@override
Widget build(BuildContext context) {
return widget.accessibilityAwareBuilder(
context,
_accessibilityFeatures,
);
}
}

View File

@@ -0,0 +1,58 @@
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:go_router/go_router.dart';
import 'package:hive/hive.dart';
import 'package:paperless_mobile/core/database/hive/hive_config.dart';
import 'package:paperless_mobile/core/database/hive/hive_extensions.dart';
Page<T> accessiblePlatformPage<T>({
required Widget child,
String? name,
Object? arguments,
String? restorationId,
LocalKey? key,
bool allowSnapshotting = true,
bool fullscreenDialog = false,
bool maintainState = true,
String? title,
}) {
final shouldDisableAnimations = WidgetsBinding.instance.disableAnimations ||
Hive.globalSettingsBox.getValue()!.disableAnimations;
if (shouldDisableAnimations) {
return NoTransitionPage(
key: key,
name: name,
arguments: arguments,
restorationId: restorationId,
child: child,
);
}
if (Platform.isAndroid) {
return MaterialPage(
child: child,
name: name,
restorationId: restorationId,
arguments: arguments,
allowSnapshotting: allowSnapshotting,
fullscreenDialog: fullscreenDialog,
key: key,
maintainState: maintainState,
);
} else if (Platform.isIOS) {
return CupertinoPage(
child: child,
allowSnapshotting: allowSnapshotting,
arguments: arguments,
fullscreenDialog: fullscreenDialog,
key: key,
maintainState: maintainState,
name: name,
restorationId: restorationId,
title: title,
);
}
throw UnsupportedError("The current platform is not supported.");
}