diff --git a/lib/constants/values.dart b/lib/constants/values.dart index c7b6cd6..dba729f 100644 --- a/lib/constants/values.dart +++ b/lib/constants/values.dart @@ -13,7 +13,7 @@ const LOCATION_INTERVAL = Duration(minutes: 1); const TRANSFER_DATA_USERNAME = "locus_transfer"; final TRANSFER_SUCCESS_MESSAGE = Uint8List.fromList([1, 2, 3, 4]); -const CURRENT_APP_VERSION = "0.15.1"; +const CURRENT_APP_VERSION = "0.15.2"; const LOG_TAG = "LocusLog"; diff --git a/lib/screens/SharesOverviewScreen.dart b/lib/screens/SharesOverviewScreen.dart index fa4fb5a..0f3c76a 100644 --- a/lib/screens/SharesOverviewScreen.dart +++ b/lib/screens/SharesOverviewScreen.dart @@ -59,10 +59,15 @@ class _SharesOverviewScreenState extends State { floatingActionButton: OpenContainer( transitionDuration: const Duration(milliseconds: 500), transitionType: ContainerTransitionType.fadeThrough, - openBuilder: (_, action) => CreateTaskScreen( - onCreated: () { - Navigator.pop(context); - }, + openBuilder: (_, action) => Scaffold( + appBar: AppBar( + title: Text(l10n.sharesOverviewScreen_createTask_action_create), + ), + body: CreateTaskScreen( + onCreated: () { + Navigator.pop(context); + }, + ), ), closedBuilder: (context, action) => InkWell( onTap: action, diff --git a/lib/screens/shares_overview_screen_widgets/screens/EmptyScreen.dart b/lib/screens/shares_overview_screen_widgets/screens/EmptyScreen.dart index 0c96ce5..be4561f 100644 --- a/lib/screens/shares_overview_screen_widgets/screens/EmptyScreen.dart +++ b/lib/screens/shares_overview_screen_widgets/screens/EmptyScreen.dart @@ -79,10 +79,16 @@ class _EmptyScreenState extends State { OpenContainer( transitionDuration: const Duration(milliseconds: 700), transitionType: ContainerTransitionType.fade, - openBuilder: (context, action) => CreateTaskScreen( - onCreated: () { - Navigator.pop(context); - }, + openBuilder: (context, action) => PlatformScaffold( + appBar: PlatformAppBar( + title: Text( + l10n.sharesOverviewScreen_createTask_action_create), + ), + body: CreateTaskScreen( + onCreated: () { + Navigator.pop(context); + }, + ), ), closedShape: RoundedRectangleBorder( borderRadius: BorderRadius.all( diff --git a/lib/widgets/ModalSheetContent.dart b/lib/widgets/ModalSheetContent.dart index 9bb8be9..08525f5 100644 --- a/lib/widgets/ModalSheetContent.dart +++ b/lib/widgets/ModalSheetContent.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; +import 'package:locus/services/settings_service/index.dart'; import 'package:locus/utils/theme.dart'; import 'package:provider/provider.dart'; import '../constants/spacing.dart'; -import 'package:locus/services/settings_service/index.dart'; class ModalSheetContent extends StatelessWidget { final String title; @@ -61,7 +61,7 @@ class ModalSheetContent extends StatelessWidget { style: getCaptionTextStyle(context), ), ], - const SizedBox(height: LARGE_SPACE), + if (isMaterial(context)) const SizedBox(height: LARGE_SPACE), ...children, if (submitLabel != null) ...[ const SizedBox(height: LARGE_SPACE), diff --git a/lib/widgets/TimerWidget.dart b/lib/widgets/TimerWidget.dart index 97c3d47..be22782 100644 --- a/lib/widgets/TimerWidget.dart +++ b/lib/widgets/TimerWidget.dart @@ -65,12 +65,14 @@ class TimerController extends ChangeNotifier { class TimerWidget extends StatefulWidget { final TimerController? controller; + final ScrollController? scrollController; final List timers; final bool allowEdit; final ScrollPhysics? physics; const TimerWidget({ this.controller, + this.scrollController, this.timers = const [], this.allowEdit = true, this.physics, @@ -126,6 +128,7 @@ class _TimerWidgetState extends State { Widget build(BuildContext context) { return ListView.builder( shrinkWrap: true, + controller: widget.scrollController, physics: widget.physics, itemCount: _controller.timers.length, itemBuilder: (_, index) { diff --git a/lib/widgets/TimerWidgetSheet.dart b/lib/widgets/TimerWidgetSheet.dart index 2accbe4..c0c680e 100644 --- a/lib/widgets/TimerWidgetSheet.dart +++ b/lib/widgets/TimerWidgetSheet.dart @@ -52,62 +52,45 @@ class _TimerWidgetSheetState extends State { final l10n = AppLocalizations.of(context); return DraggableScrollableSheet( - initialChildSize: 0.6, - minChildSize: 0.6, - maxChildSize: 0.6, + initialChildSize: 0.5, + minChildSize: 0.5, + maxChildSize: 1, expand: false, - builder: (_, __) => ModalSheet( - child: ModalSheetContent( - title: l10n.detailsTimersLabel, - submitLabel: l10n.closePositiveSheetAction, - onSubmit: (widget.controller.timers.isEmpty && !widget.allowEmpty) - ? null - : () { - Navigator.of(context).pop(widget.controller.timers); - }, - children: [ - if (widget.controller.timers.isNotEmpty) ...[ - Expanded( - child: TimerWidget( + builder: (context, controller) => ModalSheet( + child: SingleChildScrollView( + controller: controller, + child: ModalSheetContent( + title: l10n.detailsTimersLabel, + submitLabel: l10n.closePositiveSheetAction, + onSubmit: (widget.controller.timers.isEmpty && !widget.allowEmpty) + ? null + : () { + Navigator.of(context).pop(widget.controller.timers); + }, + children: [ + if (widget.controller.timers.isNotEmpty) ...[ + TimerWidget( controller: widget.controller, + physics: const NeverScrollableScrollPhysics(), ), - ), - const SizedBox(height: SMALL_SPACE), - if (findNextStartDate(widget.controller.timers) == null) - Text(l10n.timer_executionStartsImmediately) - else - Text(l10n.timer_nextExecution( - findNextStartDate(widget.controller.timers)!)), - if (widget.controller.timers - .any((timer) => timer.isInfinite())) ...[ const SizedBox(height: SMALL_SPACE), - WarningText(l10n.timer_runsInfiniteMessage), + if (findNextStartDate(widget.controller.timers) == null) + Text(l10n.timer_executionStartsImmediately) + else + Text(l10n.timer_nextExecution( + findNextStartDate(widget.controller.timers)!)), + if (widget.controller.timers + .any((timer) => timer.isInfinite())) ...[ + const SizedBox(height: SMALL_SPACE), + WarningText(l10n.timer_runsInfiniteMessage), + ], ], - ], - const SizedBox(height: MEDIUM_SPACE), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - PlatformPopup( - type: PlatformPopupType.longPress, - items: List>.from( - WEEKDAY_TIMERS.entries.map( - (entry) => PlatformPopupMenuItem( - label: Text(entry.value["name"] as String), - onPressed: () { - widget.controller.clear(); - - final timers = - entry.value["timers"] as List; - widget.controller.addAll(timers); - - Navigator.pop(context); - }, - ), - ), - ), - child: PlatformTextButton( + const SizedBox(height: MEDIUM_SPACE), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + PlatformTextButton( child: Text(l10n.timer_addWeekday), material: (_, __) => MaterialTextButtonData( icon: const Icon(Icons.date_range_rounded), @@ -133,59 +116,59 @@ class _TimerWidgetSheetState extends State { } }, ), - ), - PlatformTextButton( - child: Text(l10n.timer_addDuration), - material: (_, __) => MaterialTextButtonData( - icon: const Icon(Icons.timelapse_rounded), - ), - onPressed: () async { - Duration? duration; - - if (isCupertino(context)) { - await showCupertinoModalPopup( - context: context, - builder: (context) => Container( - height: 300, - padding: const EdgeInsets.only(top: 6.0), - margin: EdgeInsets.only( - bottom: MediaQuery.of(context).viewInsets.bottom, - ), - color: CupertinoColors.systemBackground - .resolveFrom(context), - child: SafeArea( - top: false, - child: CupertinoTimerPicker( - initialTimerDuration: Duration.zero, - minuteInterval: 5, - onTimerDurationChanged: (value) { - duration = value; - }, - mode: CupertinoTimerPickerMode.hm, + PlatformTextButton( + child: Text(l10n.timer_addDuration), + material: (_, __) => MaterialTextButtonData( + icon: const Icon(Icons.timelapse_rounded), + ), + onPressed: () async { + Duration? duration; + + if (isCupertino(context)) { + await showCupertinoModalPopup( + context: context, + builder: (context) => Container( + height: 300, + padding: const EdgeInsets.only(top: 6.0), + margin: EdgeInsets.only( + bottom: MediaQuery.of(context).viewInsets.bottom, + ), + color: CupertinoColors.systemBackground + .resolveFrom(context), + child: SafeArea( + top: false, + child: CupertinoTimerPicker( + initialTimerDuration: Duration.zero, + minuteInterval: 5, + onTimerDurationChanged: (value) { + duration = value; + }, + mode: CupertinoTimerPickerMode.hm, + ), ), ), - ), - ); - } else { - duration = await showDurationPicker( - context: context, - initialTime: Duration.zero, - snapToMins: 15.0, - ); - } + ); + } else { + duration = await showDurationPicker( + context: context, + initialTime: Duration.zero, + snapToMins: 15.0, + ); + } - if (duration != null && duration!.inSeconds > 0) { - widget.controller.add( - DurationTimer( - duration: duration!, - ), - ); - } - }, - ), - ], - ), - ], + if (duration != null && duration!.inSeconds > 0) { + widget.controller.add( + DurationTimer( + duration: duration!, + ), + ); + } + }, + ), + ], + ), + ], + ), ), ), ); diff --git a/pubspec.yaml b/pubspec.yaml index 7bff767..7f87281 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 0.15.1+37 +version: 0.15.2+38 environment: sdk: '>=3.0.0'