flutter vNext prep

This commit is contained in:
Thibault Deckers 2023-08-11 23:04:30 +02:00
parent 05d4d01ef7
commit 129b76e488
71 changed files with 98 additions and 98 deletions

View file

@ -1,5 +1,5 @@
{
"@@locale" : "ckb",
"@@locale": "ckb",
"welcomeOptional": "ئارەزومەندانە",
"@welcomeOptional": {},
"welcomeTermsToggle": "ڕازیم بە مەرج و یاساکانی بەکارهێنان",

View file

@ -8,8 +8,8 @@ import 'package:aves/model/entry/extensions/props.dart';
import 'package:aves/model/metadata/date_modifier.dart';
import 'package:aves/ref/metadata/exif.dart';
import 'package:aves/ref/metadata/iptc.dart';
import 'package:aves/ref/mime_types.dart';
import 'package:aves/ref/metadata/xmp.dart';
import 'package:aves/ref/mime_types.dart';
import 'package:aves/services/common/services.dart';
import 'package:aves/services/metadata/xmp.dart';
import 'package:aves/utils/time_utils.dart';

View file

@ -7,9 +7,9 @@ extension ExtraAccessibilityTimeout on AccessibilityTimeout {
switch (this) {
case AccessibilityTimeout.system:
if (hasAction) {
return Duration(milliseconds: await (AccessibilityService.getRecommendedTimeToTakeAction(Durations.opToastActionDisplay)));
return Duration(milliseconds: await (AccessibilityService.getRecommendedTimeToTakeAction(ADurations.opToastActionDisplay)));
} else {
return Duration(milliseconds: await (AccessibilityService.getRecommendedTimeToRead(Durations.opToastTextDisplay)));
return Duration(milliseconds: await (AccessibilityService.getRecommendedTimeToRead(ADurations.opToastTextDisplay)));
}
case AccessibilityTimeout.s1:
return const Duration(seconds: 1);

View file

@ -1,8 +1,8 @@
import 'dart:async';
import 'package:aves/model/entry/entry.dart';
import 'package:aves_utils/aves_utils.dart';
import 'package:aves/services/common/services.dart';
import 'package:aves_utils/aves_utils.dart';
import 'package:aves_video/aves_video.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/foundation.dart';

View file

@ -1,6 +1,6 @@
import 'package:flutter/foundation.dart';
class Durations {
class ADurations {
// Flutter animations (with margin)
static const popupMenuAnimation = Duration(milliseconds: 300 + 20); // ref `_kMenuDuration` used in `_PopupMenuRoute`
// page transition duration also available via `ModalRoute.of(context)!.transitionDuration * timeDilation`

View file

@ -156,7 +156,7 @@ class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver {
late final Future<CorePalette?> _dynamicColorPaletteLoader;
final TvRailController _tvRailController = TvRailController();
final CollectionSource _mediaStoreSource = MediaStoreSource();
final Debouncer _mediaStoreChangeDebouncer = Debouncer(delay: Durations.mediaContentChangeDebounceDelay);
final Debouncer _mediaStoreChangeDebouncer = Debouncer(delay: ADurations.mediaContentChangeDebounceDelay);
final Set<String> _changedUris = {};
Size? _screenSize;

View file

@ -433,7 +433,7 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
},
onSelected: (action) async {
// wait for the popup menu to hide before proceeding with the action
await Future.delayed(Durations.popupMenuAnimation * timeDilation);
await Future.delayed(ADurations.popupMenuAnimation * timeDilation);
await _onActionSelected(action);
},
),
@ -670,7 +670,7 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
routeSettings: const RouteSettings(name: TileViewDialog.routeName),
);
// wait for the dialog to hide as applying the change may block the UI
await Future.delayed(Durations.dialogTransitionAnimation * timeDilation);
await Future.delayed(ADurations.dialogTransitionAnimation * timeDilation);
if (value != null && initialValue != value) {
settings.collectionSortFactor = value.item1!;
settings.collectionSectionFactor = value.item2!;

View file

@ -641,7 +641,7 @@ class _CollectionScrollViewState extends State<_CollectionScrollView> with Widge
void _onScrollChanged() {
widget.isScrollingNotifier.value = true;
_stopScrollMonitoringTimer();
_scrollMonitoringTimer = Timer(Durations.collectionScrollMonitoringTimerDelay, () {
_scrollMonitoringTimer = Timer(ADurations.collectionScrollMonitoringTimerDelay, () {
widget.isScrollingNotifier.value = false;
});
}

View file

@ -222,7 +222,7 @@ class _CollectionPageState extends State<CollectionPage> {
if (item == null) return;
final delayDuration = context.read<DurationsData>().staggeredAnimationPageTarget;
await Future.delayed(delayDuration + Durations.highlightScrollInitDelay);
await Future.delayed(delayDuration + ADurations.highlightScrollInitDelay);
if (!mounted) return;
final animate = context.read<Settings>().accessibilityAnimations.animate;

View file

@ -487,7 +487,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware
if (confirmed == null || !confirmed) return null;
// wait for the dialog to hide as applying the change may block the UI
await Future.delayed(Durations.dialogTransitionAnimation * timeDilation);
await Future.delayed(ADurations.dialogTransitionAnimation * timeDilation);
return supported;
}

View file

@ -62,7 +62,7 @@ class _FilterBarState extends State<FilterBar> {
);
}
: (context, animation) => const SizedBox(),
duration: animate ? Durations.filterBarRemovalAnimation : Duration.zero,
duration: animate ? ADurations.filterBarRemovalAnimation : Duration.zero,
);
});
added.forEach((filter) {

View file

@ -437,7 +437,7 @@ mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin {
));
} else {
// track in current page, without navigation
await Future.delayed(Durations.highlightScrollInitDelay);
await Future.delayed(ADurations.highlightScrollInitDelay);
final targetEntry = collection.sortedEntries.firstWhereOrNull(highlightTest);
if (targetEntry != null) {
context.read<HighlightInfo>().trackItem(targetEntry, highlightItem: targetEntry);

View file

@ -171,7 +171,7 @@ class _ReportOverlayState<T> extends State<ReportOverlay<T>> with SingleTickerPr
super.initState();
_animationController = AnimationController(
duration: Durations.collectionOpOverlayAnimation,
duration: ADurations.collectionOpOverlayAnimation,
vsync: this,
);
_animation = CurvedAnimation(
@ -395,7 +395,7 @@ class _ActionFeedbackState extends State<ActionFeedback> with SingleTickerProvid
void initState() {
super.initState();
_animationController = AnimationController(
duration: Durations.viewerActionFeedbackAnimation,
duration: ADurations.viewerActionFeedbackAnimation,
vsync: this,
);
}

View file

@ -29,7 +29,7 @@ class SourceStateAwareAppBarTitle extends StatelessWidget {
valueListenable: source.stateNotifier,
builder: (context, sourceState, child) {
return AnimatedSwitcher(
duration: Durations.appBarTitleAnimation,
duration: ADurations.appBarTitleAnimation,
transitionBuilder: (child, animation) => FadeTransition(
opacity: animation,
child: SizeTransition(

View file

@ -30,7 +30,7 @@ class QueryBar extends StatefulWidget {
}
class _QueryBarState extends State<QueryBar> {
final Debouncer _debouncer = Debouncer(delay: Durations.searchDebounceDelay);
final Debouncer _debouncer = Debouncer(delay: ADurations.searchDebounceDelay);
late TextEditingController _controller;
ValueNotifier<String> get queryNotifier => widget.queryNotifier;
@ -85,7 +85,7 @@ class _QueryBarState extends State<QueryBar> {
child: ValueListenableBuilder<TextEditingValue>(
valueListenable: _controller,
builder: (context, value, child) => AnimatedSwitcher(
duration: Durations.appBarActionChangeAnimation,
duration: ADurations.appBarActionChangeAnimation,
transitionBuilder: (child, animation) => FadeTransition(
opacity: animation,
child: SizeTransition(

View file

@ -18,10 +18,10 @@ class DoubleBackPopHandler {
if (!Navigator.canPop(context) && settings.mustBackTwiceToExit && !_backOnce) {
_backOnce = true;
_stopBackTimer();
_backTimer = Timer(Durations.doubleBackTimerDelay, () => _backOnce = false);
_backTimer = Timer(ADurations.doubleBackTimerDelay, () => _backOnce = false);
toast(
context.l10n.doubleBackExitMessage,
duration: Durations.doubleBackTimerDelay,
duration: ADurations.doubleBackTimerDelay,
);
return false;
}

View file

@ -119,7 +119,7 @@ class ExpandableFilterRow extends StatelessWidget {
Widget build(BuildContext context) {
if (filters.isEmpty) return const SizedBox();
return AnimatedSwitcher(
duration: Durations.filterRowExpandAnimation,
duration: ADurations.filterRowExpandAnimation,
layoutBuilder: (currentChild, previousChildren) => Stack(
children: [
...previousChildren,

View file

@ -1,5 +1,5 @@
import 'dart:ui' as ui;
import 'dart:math' as math;
import 'dart:ui' as ui;
import 'package:flutter/material.dart';

View file

@ -40,7 +40,7 @@ class _SweeperState extends State<Sweeper> with SingleTickerProviderStateMixin {
void initState() {
super.initState();
_angleAnimationController = AnimationController(
duration: Durations.sweepingAnimation,
duration: ADurations.sweepingAnimation,
vsync: this,
);
final startAngle = widget.startAngle;
@ -85,7 +85,7 @@ class _SweeperState extends State<Sweeper> with SingleTickerProviderStateMixin {
return IgnorePointer(
child: AnimatedOpacity(
opacity: isToggled && (_isAppearing || _angleAnimationController.status == AnimationStatus.forward) ? 1 : 0,
duration: Durations.sweeperOpacityAnimation,
duration: ADurations.sweeperOpacityAnimation,
child: ValueListenableBuilder<double>(
valueListenable: _angleAnimationController,
builder: (context, value, child) {
@ -112,7 +112,7 @@ class _SweeperState extends State<Sweeper> with SingleTickerProviderStateMixin {
if (isToggled) {
_isAppearing = true;
setState(() {});
await Future.delayed(Durations.sweeperOpacityAnimation * timeDilation);
await Future.delayed(ADurations.sweeperOpacityAnimation * timeDilation);
_isAppearing = false;
if (mounted) {
_angleAnimationController.reset();

View file

@ -182,7 +182,7 @@ class _SectionSelectableLeading<T> extends StatelessWidget {
descendantsAreFocusable: false,
descendantsAreTraversable: false,
child: AnimatedSwitcher(
duration: Durations.sectionHeaderAnimation,
duration: ADurations.sectionHeaderAnimation,
switchInCurve: Curves.easeInOut,
switchOutCurve: Curves.easeInOut,
transitionBuilder: (child, animation) {
@ -225,7 +225,7 @@ class _SectionSelectingLeading<T> extends StatelessWidget {
final selection = context.watch<Selection<T>>();
final isSelected = selection.isSelected(sectionEntries);
return AnimatedSwitcher(
duration: Durations.sectionHeaderAnimation,
duration: ADurations.sectionHeaderAnimation,
switchInCurve: Curves.easeOutBack,
switchOutCurve: Curves.easeOutBack,
transitionBuilder: (child, animation) => ScaleTransition(

View file

@ -115,12 +115,12 @@ class _GridItemTrackerState<T> extends State<GridItemTracker<T>> with WidgetsBin
if (event.animate) {
await scrollController.animateTo(
scrollOffset,
duration: Duration(milliseconds: (scrollOffset / 2).round().clamp(Durations.highlightScrollAnimationMinMillis, Durations.highlightScrollAnimationMaxMillis)),
duration: Duration(milliseconds: (scrollOffset / 2).round().clamp(ADurations.highlightScrollAnimationMinMillis, ADurations.highlightScrollAnimationMaxMillis)),
curve: Curves.easeInOutCubic,
);
} else {
scrollController.jumpTo(scrollOffset);
await Future.delayed(Durations.highlightJumpDelay);
await Future.delayed(ADurations.highlightJumpDelay);
}
}

View file

@ -10,7 +10,7 @@ class GridItemSelectionOverlay<T> extends StatelessWidget {
final BorderRadius? borderRadius;
final EdgeInsets? padding;
static const duration = Durations.thumbnailOverlayAnimation;
static const duration = ADurations.thumbnailOverlayAnimation;
const GridItemSelectionOverlay({
super.key,

View file

@ -93,7 +93,7 @@ class _OverlayBackgroundState extends State<_OverlayBackground> {
Widget build(BuildContext context) {
return AnimatedContainer(
decoration: _buildBackgroundDecoration(context),
duration: Durations.scalingGridBackgroundAnimation,
duration: ADurations.scalingGridBackgroundAnimation,
child: widget.child,
);
}

View file

@ -57,7 +57,7 @@ class MosaicGrid extends StatelessWidget {
top: dy,
width: itemWidth,
height: itemHeight,
duration: Durations.scalingGridPositionAnimation,
duration: ADurations.scalingGridPositionAnimation,
child: builder(i, targetExtent),
),
);

View file

@ -98,7 +98,7 @@ class _OverlayBackgroundState extends State<_OverlayBackground> {
Widget build(BuildContext context) {
return AnimatedContainer(
decoration: _buildBackgroundDecoration(context),
duration: Durations.scalingGridBackgroundAnimation,
duration: ADurations.scalingGridBackgroundAnimation,
child: widget.child,
);
}

View file

@ -152,7 +152,7 @@ class AvesFilterChip extends StatefulWidget {
);
if (selectedAction != null) {
// wait for the popup menu to hide before proceeding with the action
await Future.delayed(Durations.popupMenuAnimation * timeDilation);
await Future.delayed(ADurations.popupMenuAnimation * timeDilation);
actionDelegate.onActionSelected(context, filter, selectedAction);
}
}

View file

@ -25,7 +25,7 @@ class OverlayCoordinateFilterChip extends StatefulWidget {
}
class _OverlayCoordinateFilterChipState extends State<OverlayCoordinateFilterChip> {
final Debouncer _debouncer = Debouncer(delay: Durations.mapInfoDebounceDelay);
final Debouncer _debouncer = Debouncer(delay: ADurations.mapInfoDebounceDelay);
final ValueNotifier<ZoomedBounds?> _idleBoundsNotifier = ValueNotifier(null);
@override

View file

@ -261,7 +261,7 @@ class _GeoMapState extends State<GeoMap> {
return AnimatedSize(
alignment: Alignment.topCenter,
curve: Curves.easeInOutCubic,
duration: Durations.mapStyleSwitchAnimation,
duration: ADurations.mapStyleSwitchAnimation,
child: ValueListenableBuilder<bool>(
valueListenable: widget.isAnimatingNotifier,
builder: (context, animating, child) {

View file

@ -62,7 +62,7 @@ class _EntryLeafletMapState<T> extends State<EntryLeafletMap<T>> with TickerProv
final MapController _leafletMapController = MapController();
final List<StreamSubscription> _subscriptions = [];
Map<MarkerKey<T>, GeoEntry<T>> _geoEntryByMarkerKey = {};
final Debouncer _debouncer = Debouncer(delay: Durations.mapIdleDebounceDelay);
final Debouncer _debouncer = Debouncer(delay: ADurations.mapIdleDebounceDelay);
ValueNotifier<ZoomedBounds> get boundsNotifier => widget.boundsNotifier;

View file

@ -29,7 +29,7 @@ class SearchPage extends StatefulWidget {
}
class _SearchPageState extends State<SearchPage> {
final Debouncer _debouncer = Debouncer(delay: Durations.searchDebounceDelay);
final Debouncer _debouncer = Debouncer(delay: ADurations.searchDebounceDelay);
final FocusNode _searchFieldFocusNode = FocusNode();
final DoubleBackPopHandler _doubleBackPopHandler = DoubleBackPopHandler();
@ -77,7 +77,7 @@ class _SearchPageState extends State<SearchPage> {
return;
}
widget.animation.removeStatusListener(_onAnimationStatusChanged);
Future.delayed(Durations.pageTransitionAnimation * timeDilation).then((_) {
Future.delayed(ADurations.pageTransitionAnimation * timeDilation).then((_) {
if (!mounted) return;
_searchFieldFocusNode.requestFocus();
});

View file

@ -83,7 +83,7 @@ class ThumbnailZoomOverlay extends StatelessWidget {
});
static const alignment = AlignmentDirectional.bottomEnd;
static const duration = Durations.thumbnailOverlayAnimation;
static const duration = ADurations.thumbnailOverlayAnimation;
@override
Widget build(BuildContext context) {

View file

@ -151,7 +151,7 @@ class _ThumbnailScrollerState extends State<ThumbnailScroller> {
color: currentIndex == index ? Colors.transparent : Colors.black45,
width: thumbnailExtent,
height: thumbnailExtent,
duration: Durations.thumbnailScrollerShadeAnimation,
duration: ADurations.thumbnailScrollerShadeAnimation,
);
},
),
@ -172,7 +172,7 @@ class _ThumbnailScrollerState extends State<ThumbnailScroller> {
_isAnimating = true;
await _scrollController.animateTo(
targetOffset,
duration: Durations.thumbnailScrollerScrollAnimation,
duration: ADurations.thumbnailScrollerScrollAnimation,
curve: Curves.easeOutCubic,
);
_isAnimating = false;

View file

@ -65,7 +65,7 @@ class _AppDebugPageState extends State<AppDebugPage> {
.toList(),
onSelected: (action) async {
// wait for the popup menu to hide before proceeding with the action
await Future.delayed(Durations.popupMenuAnimation * timeDilation);
await Future.delayed(ADurations.popupMenuAnimation * timeDilation);
unawaited(_onActionSelected(action));
},
),

View file

@ -103,7 +103,7 @@ class _RenameEntrySetPageState extends State<RenameEntrySetPage> {
},
onSelected: (key) async {
// wait for the popup menu to hide before proceeding with the action
await Future.delayed(Durations.popupMenuAnimation * timeDilation);
await Future.delayed(ADurations.popupMenuAnimation * timeDilation);
_insertProcessor(key);
},
tooltip: l10n.renameEntrySetPageInsertTooltip,

View file

@ -204,7 +204,7 @@ class _TagEditorPageState extends State<TagEditorPage> {
onLongPress: null,
),
crossFadeState: sortedTags.isEmpty ? CrossFadeState.showFirst : CrossFadeState.showSecond,
duration: Durations.tagEditorTransition,
duration: ADurations.tagEditorTransition,
),
),
const Divider(height: 0),

View file

@ -133,7 +133,7 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
// when the field gets focus, we wait for the soft keyboard to appear
// then scroll to the bottom to make sure the field is in view
if (_nameFieldFocusNode.hasFocus) {
await Future.delayed(Durations.softKeyboardDisplayDelay + const Duration(milliseconds: 500));
await Future.delayed(ADurations.softKeyboardDisplayDelay + const Duration(milliseconds: 500));
_scrollToBottom();
}
}
@ -141,7 +141,7 @@ class _CreateAlbumDialogState extends State<CreateAlbumDialog> {
void _scrollToBottom() {
_scrollController.animateTo(
_scrollController.position.maxScrollExtent,
duration: Durations.dialogFieldReachAnimation,
duration: ADurations.dialogFieldReachAnimation,
curve: Curves.easeInOut,
);
}

View file

@ -227,7 +227,7 @@ class _AlbumPickPageState extends State<_AlbumPickPage> {
FocusManager.instance.primaryFocus?.unfocus();
// wait for the popup menu to hide before proceeding with the action
await Future.delayed(Durations.popupMenuAnimation * timeDilation);
await Future.delayed(ADurations.popupMenuAnimation * timeDilation);
onActionSelected(action);
},
),
@ -243,7 +243,7 @@ class _AlbumPickPageState extends State<_AlbumPickPage> {
if (directory == null) return;
// wait for the dialog to hide as applying the change may block the UI
await Future.delayed(Durations.dialogTransitionAnimation * timeDilation);
await Future.delayed(ADurations.dialogTransitionAnimation * timeDilation);
_pickAlbum(directory);
}
@ -265,7 +265,7 @@ class _AlbumPickPageState extends State<_AlbumPickPage> {
if (details == null) return;
// wait for the dialog to hide as applying the change may block the UI
await Future.delayed(Durations.dialogTransitionAnimation * timeDilation);
await Future.delayed(ADurations.dialogTransitionAnimation * timeDilation);
await vaults.create(details);
_pickAlbum(details.path);

View file

@ -68,7 +68,7 @@ class _ContentState extends State<_Content> with SingleTickerProviderStateMixin
final AvesMapController _mapController = AvesMapController();
late final ValueNotifier<bool> _isPageAnimatingNotifier;
final ValueNotifier<LatLng?> _dotLocationNotifier = ValueNotifier(null), _infoLocationNotifier = ValueNotifier(null);
final Debouncer _infoDebouncer = Debouncer(delay: Durations.mapInfoDebounceDelay);
final Debouncer _infoDebouncer = Debouncer(delay: ADurations.mapInfoDebounceDelay);
CollectionLens? get openingCollection => widget.collection;
@ -78,7 +78,7 @@ class _ContentState extends State<_Content> with SingleTickerProviderStateMixin
if (ExtraEntryMapStyle.isHeavy(settings.mapStyle)) {
_isPageAnimatingNotifier = ValueNotifier(true);
Future.delayed(Durations.pageTransitionAnimation * timeDilation).then((_) {
Future.delayed(ADurations.pageTransitionAnimation * timeDilation).then((_) {
if (!mounted) return;
_isPageAnimatingNotifier.value = false;
});

View file

@ -14,7 +14,7 @@ Future<void> showSelectionDialog<T>({
routeSettings: const RouteSettings(name: AvesSingleSelectionDialog.routeName),
);
// wait for the dialog to hide as applying the change may block the UI
await Future.delayed(Durations.dialogTransitionAnimation * timeDilation);
await Future.delayed(ADurations.dialogTransitionAnimation * timeDilation);
if (value != null) {
onSelection(value);
}

View file

@ -190,7 +190,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
routeSettings: const RouteSettings(name: TileViewDialog.routeName),
);
// wait for the dialog to hide as applying the change may block the UI
await Future.delayed(Durations.dialogTransitionAnimation * timeDilation);
await Future.delayed(ADurations.dialogTransitionAnimation * timeDilation);
if (value != null && initialValue != value) {
sortFactor = value.item1!;
settings.albumGroupFactor = value.item2!;

View file

@ -237,7 +237,7 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
routeSettings: const RouteSettings(name: TileViewDialog.routeName),
);
// wait for the dialog to hide as applying the change may block the UI
await Future.delayed(Durations.dialogTransitionAnimation * timeDilation);
await Future.delayed(ADurations.dialogTransitionAnimation * timeDilation);
if (value != null && initialValue != value) {
sortFactor = value.item1!;
tileLayout = value.item3!;

View file

@ -366,7 +366,7 @@ class _FilterGridAppBarState<T extends CollectionFilter, CSAD extends ChipSetAct
FocusManager.instance.primaryFocus?.unfocus();
// wait for the popup menu to hide before proceeding with the action
await Future.delayed(Durations.popupMenuAnimation * timeDilation);
await Future.delayed(ADurations.popupMenuAnimation * timeDilation);
_onActionSelected(context, action, actionDelegate);
},
),

View file

@ -1,5 +1,6 @@
import 'dart:math';
import 'package:aves/model/apps.dart';
import 'package:aves/model/covers.dart';
import 'package:aves/model/filters/album.dart';
import 'package:aves/model/filters/filters.dart';
@ -13,7 +14,6 @@ import 'package:aves/model/vaults/vaults.dart';
import 'package:aves/theme/durations.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/theme/text.dart';
import 'package:aves/model/apps.dart';
import 'package:aves/utils/android_file_utils.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/identity/aves_filter_chip.dart';
@ -183,7 +183,7 @@ class CoveredFilterChip<T extends CollectionFilter> extends StatelessWidget {
if (pinned)
AnimatedPadding(
padding: EdgeInsetsDirectional.only(end: padding),
duration: Durations.chipDecorationAnimation,
duration: ADurations.chipDecorationAnimation,
child: Icon(
AIcons.pin,
color: _detailColor(context),
@ -193,7 +193,7 @@ class CoveredFilterChip<T extends CollectionFilter> extends StatelessWidget {
if (filter is AlbumFilter && androidFileUtils.isOnRemovableStorage(filter.album))
AnimatedPadding(
padding: EdgeInsetsDirectional.only(end: padding),
duration: Durations.chipDecorationAnimation,
duration: ADurations.chipDecorationAnimation,
child: Icon(
AIcons.removableStorage,
color: _detailColor(context),
@ -203,7 +203,7 @@ class CoveredFilterChip<T extends CollectionFilter> extends StatelessWidget {
if (filter is AlbumFilter && vaults.isVault(filter.album))
AnimatedPadding(
padding: EdgeInsetsDirectional.only(end: padding),
duration: Durations.chipDecorationAnimation,
duration: ADurations.chipDecorationAnimation,
child: Icon(
AIcons.locked,
color: _detailColor(context),

View file

@ -546,7 +546,7 @@ class _FilterSectionedContentState<T extends CollectionFilter> extends State<_Fi
final item = visibleSections.values.expand((list) => list).firstWhereOrNull((gridItem) => gridItem.filter == filter);
if (item == null) return;
await Future.delayed(Durations.highlightScrollInitDelay);
await Future.delayed(ADurations.highlightScrollInitDelay);
final animate = context.read<Settings>().accessibilityAnimations.animate;
highlightInfo.trackItem(item, animate: animate, highlightItem: filter);

View file

@ -115,7 +115,7 @@ class _ContentState extends State<_Content> with SingleTickerProviderStateMixin
if (ExtraEntryMapStyle.isHeavy(settings.mapStyle)) {
_isPageAnimatingNotifier.value = true;
Future.delayed(Durations.pageTransitionAnimation * timeDilation).then((_) {
Future.delayed(ADurations.pageTransitionAnimation * timeDilation).then((_) {
if (!mounted) return;
_isPageAnimatingNotifier.value = false;
});
@ -139,7 +139,7 @@ class _ContentState extends State<_Content> with SingleTickerProviderStateMixin
_subscriptions.add(openingCollection.source.eventBus.on<CatalogMetadataChangedEvent>().listen((e) => _updateRegionCollection()));
_selectedIndexNotifier.addListener(_onThumbnailIndexChanged);
Future.delayed(Durations.pageTransitionAnimation * timeDilation + const Duration(seconds: 1), () {
Future.delayed(ADurations.pageTransitionAnimation * timeDilation + const Duration(seconds: 1), () {
final regionEntries = regionCollection?.sortedEntries ?? [];
final initialEntry = widget.initialEntry ?? regionEntries.firstOrNull;
if (initialEntry != null) {
@ -475,7 +475,7 @@ class _ContentState extends State<_Content> with SingleTickerProviderStateMixin
);
if (selectedAction != null) {
// wait for the popup menu to hide before proceeding with the action
await Future.delayed(Durations.popupMenuAnimation * timeDilation);
await Future.delayed(ADurations.popupMenuAnimation * timeDilation);
final delegate = EntrySetActionDelegate();
switch (selectedAction) {
case MapClusterAction.editLocation:

View file

@ -28,7 +28,7 @@ class MapEntryScroller extends StatefulWidget {
class _MapEntryScrollerState extends State<MapEntryScroller> {
final ValueNotifier<AvesEntry?> _infoEntryNotifier = ValueNotifier(null);
final Debouncer _infoDebouncer = Debouncer(delay: Durations.mapInfoDebounceDelay);
final Debouncer _infoDebouncer = Debouncer(delay: ADurations.mapInfoDebounceDelay);
@override
void initState() {

View file

@ -111,7 +111,7 @@ class _AppDrawerState extends State<AppDrawer> {
Widget _buildHeader(BuildContext context) {
Future<void> goTo(String routeName, WidgetBuilder pageBuilder) async {
Navigator.maybeOf(context)?.pop();
await Future.delayed(Durations.drawerTransitionAnimation);
await Future.delayed(ADurations.drawerTransitionAnimation);
await Navigator.maybeOf(context)?.push(MaterialPageRoute(
settings: RouteSettings(name: routeName),
builder: pageBuilder,

View file

@ -29,7 +29,7 @@ class ActionPanel extends StatelessWidget {
borderRadius: const BorderRadius.all(Radius.circular(8)),
),
margin: const EdgeInsets.all(16),
duration: Durations.quickActionHighlightAnimation,
duration: ADurations.quickActionHighlightAnimation,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(8)),
child: child,

View file

@ -111,7 +111,7 @@ class _QuickActionEditorBodyState<T extends Object> extends State<QuickActionEdi
void _onQuickActionTargetLeave() {
_stopLeavingTimer();
final action = _draggedAvailableAction.value;
_targetLeavingTimer = Timer(Durations.quickActionListAnimation + const Duration(milliseconds: 50), () {
_targetLeavingTimer = Timer(ADurations.quickActionListAnimation + const Duration(milliseconds: 50), () {
_removeQuickAction(action);
_quickActionHighlight.value = false;
});
@ -329,10 +329,10 @@ class _QuickActionEditorBodyState<T extends Object> extends State<QuickActionEdi
_quickActions.insert(targetIndex, action);
_animatedListKey.currentState!.insertItem(
targetIndex,
duration: Durations.quickActionListAnimation,
duration: ADurations.quickActionListAnimation,
);
_quickActionsChangeNotifier.notify();
Future.delayed(Durations.quickActionListAnimation).then((value) => _reordering = false);
Future.delayed(ADurations.quickActionListAnimation).then((value) => _reordering = false);
return true;
}
@ -344,7 +344,7 @@ class _QuickActionEditorBodyState<T extends Object> extends State<QuickActionEdi
_animatedListKey.currentState!.removeItem(
index,
(context, animation) => DraggedPlaceholder(child: _buildQuickActionButton(action, animation)),
duration: Durations.quickActionListAnimation,
duration: ADurations.quickActionListAnimation,
);
_quickActionsChangeNotifier.notify();
return true;

View file

@ -25,7 +25,7 @@ class SettingsTileLeading extends StatelessWidget {
)),
shape: BoxShape.circle,
),
duration: Durations.themeColorModeAnimation,
duration: ADurations.themeColorModeAnimation,
child: DecoratedIcon(
icon,
size: 18,

View file

@ -68,7 +68,7 @@ class SettingsSwitchListTile extends StatelessWidget {
Expanded(child: titleWidget),
AnimatedOpacity(
opacity: current ? 1 : disabledOpacity,
duration: Durations.toggleableTransitionAnimation,
duration: ADurations.toggleableTransitionAnimation,
child: trailing,
),
],

View file

@ -32,7 +32,7 @@ class LocaleTile extends StatelessWidget {
),
);
// wait for the dialog to hide as applying the change may block the UI
await Future.delayed(Durations.pageTransitionAnimation * timeDilation);
await Future.delayed(ADurations.pageTransitionAnimation * timeDilation);
if (value != null) {
settings.locale = value == systemLocaleOption ? null : value;
}

View file

@ -83,7 +83,7 @@ class _FilePickerPageState extends State<FilePickerPage> {
},
onSelected: (action) async {
// wait for the popup menu to hide before proceeding with the action
await Future.delayed(Durations.popupMenuAnimation * timeDilation);
await Future.delayed(ADurations.popupMenuAnimation * timeDilation);
switch (action) {
case _PickerAction.toggleHiddenView:
settings.filePickerShowHiddenFiles = !showHidden;
@ -168,7 +168,7 @@ class _FilePickerPageState extends State<FilePickerPage> {
title: Text(v.getDescription(context)),
onTap: () async {
Navigator.maybeOf(context)?.pop();
await Future.delayed(Durations.drawerTransitionAnimation);
await Future.delayed(ADurations.drawerTransitionAnimation);
_goTo(v.path);
setState(() {});
},

View file

@ -155,7 +155,7 @@ class _HiddenPaths extends StatelessWidget {
),
);
// wait for the dialog to hide as applying the change may block the UI
await Future.delayed(Durations.pageTransitionAnimation * timeDilation);
await Future.delayed(ADurations.pageTransitionAnimation * timeDilation);
if (path != null && path.isNotEmpty) {
settings.changeFilterVisibility({PathFilter(path)}, false);
}

View file

@ -71,7 +71,7 @@ class _SettingsMobilePageState extends State<SettingsMobilePage> with FeedbackMi
},
onSelected: (action) async {
// wait for the popup menu to hide before proceeding with the action
await Future.delayed(Durations.popupMenuAnimation * timeDilation);
await Future.delayed(ADurations.popupMenuAnimation * timeDilation);
_onActionSelected(action);
},
),

View file

@ -68,7 +68,7 @@ class _StatsPageState extends State<StatsPage> with FeedbackMixin, VaultAwareMix
super.initState();
_isPageAnimatingNotifier = ValueNotifier(true);
Future.delayed(Durations.pageTransitionAnimation * timeDilation).then((_) {
Future.delayed(ADurations.pageTransitionAnimation * timeDilation).then((_) {
if (!mounted) return;
_isPageAnimatingNotifier.value = false;
});

View file

@ -401,7 +401,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix
if (newName == null || newName.isEmpty || newName == targetEntry.filenameWithoutExtension) return;
// wait for the dialog to hide as applying the change may block the UI
await Future.delayed(Durations.dialogTransitionAnimation * timeDilation);
await Future.delayed(ADurations.dialogTransitionAnimation * timeDilation);
await rename(
context,
entriesToNewName: {targetEntry: '$newName${targetEntry.extension}'},

View file

@ -205,7 +205,7 @@ class VideoActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix
await controller.play();
}
// hide overlay
_overlayHidingTimer = Timer(context.read<DurationsData>().iconAnimation + Durations.videoOverlayHideDelay, () {
_overlayHidingTimer = Timer(context.read<DurationsData>().iconAnimation + ADurations.videoOverlayHideDelay, () {
const ToggleOverlayNotification(visible: false).dispatch(context);
});
}

View file

@ -100,7 +100,7 @@ class ViewerController {
),
));
_autopilotAnimationControllers[vsync] = animationController;
Future.delayed(Durations.viewerHorizontalPageAnimation).then((_) => _autopilotAnimationControllers[vsync]?.forward());
Future.delayed(ADurations.viewerHorizontalPageAnimation).then((_) => _autopilotAnimationControllers[vsync]?.forward());
}
}

View file

@ -309,7 +309,7 @@ class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> {
if (animate) {
pageController.animateToPage(
target,
duration: Durations.viewerHorizontalPageAnimation,
duration: ADurations.viewerHorizontalPageAnimation,
curve: Curves.easeInOutCubic,
);
} else {
@ -333,7 +333,7 @@ class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> {
_isVerticallyScrollingNotifier.value = true;
_stopScrollMonitoringTimer();
_verticalScrollMonitoringTimer = Timer(Durations.infoScrollMonitoringTimerDelay, () {
_verticalScrollMonitoringTimer = Timer(ADurations.infoScrollMonitoringTimerDelay, () {
_isVerticallyScrollingNotifier.value = false;
});
}

View file

@ -90,7 +90,7 @@ class InfoAppBar extends StatelessWidget {
],
onSelected: (action) async {
// wait for the popup menu to hide before proceeding with the action
await Future.delayed(Durations.popupMenuAnimation * timeDilation);
await Future.delayed(ADurations.popupMenuAnimation * timeDilation);
actionDelegate.onActionSelected(context, entry, collection, action);
},
),

View file

@ -122,7 +122,7 @@ class _InfoPageState extends State<InfoPage> {
ShowImageNotification().dispatch(context);
_scrollController.animateTo(
0,
duration: Durations.pageTransitionAnimation,
duration: ADurations.pageTransitionAnimation,
curve: Curves.easeInOut,
);
}
@ -271,7 +271,7 @@ class _InfoPageContentState extends State<_InfoPageContent> {
}
void _onActionDelegateEvent(ActionEvent<EntryAction> event) {
Future.delayed(Durations.dialogTransitionAnimation).then((_) {
Future.delayed(ADurations.dialogTransitionAnimation).then((_) {
if (event is ActionStartedEvent) {
_isEditingMetadataNotifier.value = event.action;
} else if (event is ActionEndedEvent) {

View file

@ -116,7 +116,7 @@ class _XmpCardState extends State<XmpCard> {
),
),
MultiCrossFader(
duration: Durations.xmpStructArrayCardTransition,
duration: ADurations.xmpStructArrayCardTransition,
sizeCurve: Curves.easeOutBack,
alignment: AlignmentDirectional.topStart,
child: Padding(

View file

@ -1,5 +1,5 @@
import 'package:aves/ref/mime_types.dart';
import 'package:aves/ref/metadata/xmp.dart';
import 'package:aves/ref/mime_types.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/viewer/info/common.dart';
import 'package:aves/widgets/viewer/info/embedded/notifications.dart';

View file

@ -14,7 +14,7 @@ class SelectionButton extends StatelessWidget {
final Animation<double> scale;
static const double padding = 8;
static const duration = Durations.thumbnailOverlayAnimation;
static const duration = ADurations.thumbnailOverlayAnimation;
const SelectionButton({
super.key,

View file

@ -25,7 +25,7 @@ class ViewerThumbnailPreview extends StatefulWidget {
class _ViewerThumbnailPreviewState extends State<ViewerThumbnailPreview> {
final ValueNotifier<int> _entryIndexNotifier = ValueNotifier(0);
final Debouncer _debouncer = Debouncer(delay: Durations.viewerThumbnailScrollDebounceDelay);
final Debouncer _debouncer = Debouncer(delay: ADurations.viewerThumbnailScrollDebounceDelay);
List<AvesEntry> get entries => widget.entries;

View file

@ -282,7 +282,7 @@ class ViewerButtonRowContent extends StatelessWidget {
onSelected: (action) {
_popupExpandedNotifier.value = null;
// wait for the popup menu to hide before proceeding with the action
Future.delayed(Durations.popupMenuAnimation * timeDilation, () => actionDelegate.onActionSelected(context, action));
Future.delayed(ADurations.popupMenuAnimation * timeDilation, () => actionDelegate.onActionSelected(context, action));
},
onCanceled: () {
_popupExpandedNotifier.value = null;

View file

@ -5,7 +5,6 @@ import 'dart:ui' as ui;
import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/entry/extensions/images.dart';
import 'package:aves/model/entry/extensions/props.dart';
import 'package:aves_model/aves_model.dart';
import 'package:aves/services/wallpaper_service.dart';
import 'package:aves/widgets/common/action_mixins/feedback.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
@ -14,6 +13,7 @@ import 'package:aves/widgets/dialogs/wallpaper_settings_dialog.dart';
import 'package:aves/widgets/viewer/overlay/viewer_buttons.dart';
import 'package:aves/widgets/viewer/video/conductor.dart';
import 'package:aves/widgets/viewer/view/conductor.dart';
import 'package:aves_model/aves_model.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:latlong2/latlong.dart';

View file

@ -174,7 +174,7 @@ mixin EntryViewControllerMixin<T extends StatefulWidget> on State<T> {
await _onPageChanged();
if (entry.isMotionPhoto && shouldAutoPlayMotionPhoto) {
await Future.delayed(Durations.motionPhotoAutoPlayDelay);
await Future.delayed(ADurations.motionPhotoAutoPlayDelay);
if (entry == entryNotifier.value) {
multiPageController.page = 1;
}

View file

@ -5,10 +5,10 @@ import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/entry/extensions/images.dart';
import 'package:aves/model/settings/enums/entry_background.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/model/view_state.dart';
import 'package:aves/utils/math_utils.dart';
import 'package:aves/widgets/common/fx/checkered_decoration.dart';
import 'package:aves/widgets/viewer/visual/entry_page_view.dart';
import 'package:aves/model/view_state.dart';
import 'package:aves_model/aves_model.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

View file

@ -3,8 +3,8 @@ import 'package:aves/model/entry/extensions/images.dart';
import 'package:aves/model/entry/extensions/multipage.dart';
import 'package:aves/theme/durations.dart';
import 'package:aves/widgets/common/thumbnail/image.dart';
import 'package:aves_video/aves_video.dart';
import 'package:aves_magnifier/aves_magnifier.dart';
import 'package:aves_video/aves_video.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
@ -106,7 +106,7 @@ class _VideoCoverState extends State<VideoCover> {
child: AnimatedOpacity(
opacity: showCover ? 1 : 0,
curve: Curves.easeInCirc,
duration: Durations.viewerVideoPlayerTransition,
duration: ADurations.viewerVideoPlayerTransition,
onEnd: () {
// while cover is fading out, the same controller is used for both the cover and the video,
// and both fire scale boundaries events, so we make sure that in the end