diff --git a/lib/config/routes.dart b/lib/config/routes.dart index d525b94e..a2f6f09e 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -383,14 +383,16 @@ abstract class AppRoutes { static Page defaultPageBuilder(BuildContext context, Widget child) => CustomTransitionPage( child: child, - transitionsBuilder: (context, animation, secondaryAnimation, child) => - FluffyThemes.isColumnMode(context) - ? FadeTransition(opacity: animation, child: child) - : CupertinoPageTransition( - primaryRouteAnimation: animation, - secondaryRouteAnimation: secondaryAnimation, - linearTransition: false, - child: child, - ), + transitionsBuilder: (context, animation, secondaryAnimation, child) { + Matrix.of(context).navigatorContext = context; + return FluffyThemes.isColumnMode(context) + ? FadeTransition(opacity: animation, child: child) + : CupertinoPageTransition( + primaryRouteAnimation: animation, + secondaryRouteAnimation: secondaryAnimation, + linearTransition: false, + child: child, + ); + }, ); } diff --git a/lib/pages/archive/archive.dart b/lib/pages/archive/archive.dart index a3c35c34..ad4241be 100644 --- a/lib/pages/archive/archive.dart +++ b/lib/pages/archive/archive.dart @@ -40,7 +40,6 @@ class ArchiveController extends State { final client = Matrix.of(context).client; if (archive.isEmpty) return; if (await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.areYouSure, okLabel: L10n.of(context)!.yes, diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart index 4cb276ba..4f697202 100644 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -378,7 +378,6 @@ class BootstrapDialogState extends State { : () async { if (OkCancelResult.ok == await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.recoveryKeyLost, message: L10n.of(context)!.wipeChatBackup, diff --git a/lib/pages/chat/events/image_bubble.dart b/lib/pages/chat/events/image_bubble.dart index 71b03b6e..b40c6355 100644 --- a/lib/pages/chat/events/image_bubble.dart +++ b/lib/pages/chat/events/image_bubble.dart @@ -77,7 +77,6 @@ class ImageBubble extends StatelessWidget { if (!tapToView) return; showDialog( context: context, - useRootNavigator: false, builder: (_) => ImageViewer(event), ); } diff --git a/lib/pages/chat/events/message_reactions.dart b/lib/pages/chat/events/message_reactions.dart index 755f8992..d3589017 100644 --- a/lib/pages/chat/events/message_reactions.dart +++ b/lib/pages/chat/events/message_reactions.dart @@ -193,7 +193,6 @@ class _AdaptableReactorsDialog extends StatelessWidget { context: context, builder: (context) => this, barrierDismissible: true, - useRootNavigator: false, ); @override diff --git a/lib/pages/chat/events/video_player.dart b/lib/pages/chat/events/video_player.dart index 573e1eb1..9f204a59 100644 --- a/lib/pages/chat/events/video_player.dart +++ b/lib/pages/chat/events/video_player.dart @@ -59,7 +59,6 @@ class EventVideoPlayerState extends State { ); } else if (!kIsWeb && tmpFile != null && _chewieManager == null) { _chewieManager ??= ChewieController( - useRootNavigator: false, videoPlayerController: VideoPlayerController.file(tmpFile), autoPlay: true, autoInitialize: true, diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 8968121d..bec082c3 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -176,7 +176,6 @@ class ChatListController extends State void setServer() async { final newServer = await showTextInputDialog( - useRootNavigator: false, title: L10n.of(context)!.changeTheHomeserver, context: context, okLabel: L10n.of(context)!.ok, @@ -473,12 +472,12 @@ class ChatListController extends State Future archiveAction() async { final confirmed = await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.areYouSure, okLabel: L10n.of(context)!.yes, cancelLabel: L10n.of(context)!.cancel, message: L10n.of(context)!.archiveRoomDescription, + isDestructiveAction: true, ) == OkCancelResult.ok; if (!confirmed) return; @@ -493,7 +492,6 @@ class ChatListController extends State final client = Matrix.of(context).client; final currentPresence = await client.fetchCurrentPresence(client.userID!); final input = await showTextInputDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.setStatus, message: L10n.of(context)!.leaveEmptyToClearStatus, diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index fbaa13a9..226d64eb 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -118,7 +118,6 @@ class ChatListItem extends StatelessWidget { shareFile != null) { await showDialog( context: context, - useRootNavigator: false, builder: (c) => SendFileDialog( files: [shareFile], room: room, @@ -160,12 +159,12 @@ class ChatListItem extends StatelessWidget { return; } final confirmed = await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.areYouSure, okLabel: L10n.of(context)!.yes, cancelLabel: L10n.of(context)!.no, message: L10n.of(context)!.archiveRoomDescription, + isDestructiveAction: true, ); if (confirmed == OkCancelResult.cancel) return; await showFutureLoadingDialog( diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart index a6cdcbef..f10fbf38 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart @@ -94,7 +94,6 @@ class ChatPermissionsSettingsController extends State { if (newVersion == null || OkCancelResult.cancel == await showOkCancelAlertDialog( - useRootNavigator: false, context: context, okLabel: L10n.of(context)!.yes, cancelLabel: L10n.of(context)!.cancel, diff --git a/lib/pages/key_verification/key_verification_dialog.dart b/lib/pages/key_verification/key_verification_dialog.dart index 99d082a7..8d2f21c5 100644 --- a/lib/pages/key_verification/key_verification_dialog.dart +++ b/lib/pages/key_verification/key_verification_dialog.dart @@ -85,7 +85,6 @@ class KeyVerificationPageState extends State { ); if (valid.error != null) { await showOkAlertDialog( - useRootNavigator: false, context: context, message: L10n.of(context)!.incorrectPassphraseOrKey, ); diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index c62e2100..78a5353d 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -127,7 +127,6 @@ class LoginController extends State { ); final dialogResult = await showOkCancelAlertDialog( context: context, - useRootNavigator: false, message: L10n.of(context)!.noMatrixServer(newDomain, oldHomeserver!), okLabel: L10n.of(context)!.ok, @@ -157,7 +156,6 @@ class LoginController extends State { void passwordForgotten() async { final input = await showTextInputDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.passwordForgotten, message: L10n.of(context)!.enterAnEmailAddress, @@ -186,7 +184,6 @@ class LoginController extends State { ); if (response.error != null) return; final password = await showTextInputDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.passwordForgotten, message: L10n.of(context)!.chooseAStrongPassword, @@ -204,7 +201,6 @@ class LoginController extends State { ); if (password == null) return; final ok = await showOkAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.weSentYouAnEmail, message: L10n.of(context)!.pleaseClickOnLink, diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 97bbec66..eb600ab1 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -35,7 +35,6 @@ class SettingsController extends State { void setDisplaynameAction() async { final profile = await profileFuture; final input = await showTextInputDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.editDisplayname, okLabel: L10n.of(context)!.ok, @@ -62,7 +61,6 @@ class SettingsController extends State { void logoutAction() async { final noBackup = showChatBackupBanner == true; if (await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.areYouSureYouWantToLogout, message: L10n.of(context)!.noBackupWarning, diff --git a/lib/pages/settings_3pid/settings_3pid.dart b/lib/pages/settings_3pid/settings_3pid.dart index d46cac2a..94b1d6f7 100644 --- a/lib/pages/settings_3pid/settings_3pid.dart +++ b/lib/pages/settings_3pid/settings_3pid.dart @@ -20,7 +20,6 @@ class Settings3Pid extends StatefulWidget { class Settings3PidController extends State { void add3PidAction() async { final input = await showTextInputDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.enterAnEmailAddress, okLabel: L10n.of(context)!.ok, @@ -44,7 +43,6 @@ class Settings3PidController extends State { ); if (response.error != null) return; final ok = await showOkAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.weSentYouAnEmail, message: L10n.of(context)!.pleaseClickOnLink, @@ -69,7 +67,6 @@ class Settings3PidController extends State { void delete3Pid(ThirdPartyIdentifier identifier) async { if (await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.areYouSure, okLabel: L10n.of(context)!.yes, diff --git a/lib/pages/settings_emotes/import_archive_dialog.dart b/lib/pages/settings_emotes/import_archive_dialog.dart index 0ed5bb21..0ab00042 100644 --- a/lib/pages/settings_emotes/import_archive_dialog.dart +++ b/lib/pages/settings_emotes/import_archive_dialog.dart @@ -119,7 +119,6 @@ class _ImportEmoteArchiveDialogState extends State { final completer = Completer(); WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { final result = await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.emoteExists, message: imageCode, diff --git a/lib/pages/settings_emotes/settings_emotes.dart b/lib/pages/settings_emotes/settings_emotes.dart index 2ef905b1..ebdf10e2 100644 --- a/lib/pages/settings_emotes/settings_emotes.dart +++ b/lib/pages/settings_emotes/settings_emotes.dart @@ -138,7 +138,6 @@ class EmotesSettingsController extends State { if (pack!.images.keys.any((k) => k == imageCode && k != oldImageCode)) { controller.text = oldImageCode; showOkAlertDialog( - useRootNavigator: false, context: context, message: L10n.of(context)!.emoteExists, okLabel: L10n.of(context)!.ok, @@ -148,7 +147,6 @@ class EmotesSettingsController extends State { if (!RegExp(r'^[-\w]+$').hasMatch(imageCode)) { controller.text = oldImageCode; showOkAlertDialog( - useRootNavigator: false, context: context, message: L10n.of(context)!.emoteInvalid, okLabel: L10n.of(context)!.ok, @@ -184,7 +182,6 @@ class EmotesSettingsController extends State { if (newImageCodeController.text.isEmpty || newImageController.value == null) { await showOkAlertDialog( - useRootNavigator: false, context: context, message: L10n.of(context)!.emoteWarnNeedToPick, okLabel: L10n.of(context)!.ok, @@ -194,7 +191,6 @@ class EmotesSettingsController extends State { final imageCode = newImageCodeController.text; if (pack!.images.containsKey(imageCode)) { await showOkAlertDialog( - useRootNavigator: false, context: context, message: L10n.of(context)!.emoteExists, okLabel: L10n.of(context)!.ok, @@ -203,7 +199,6 @@ class EmotesSettingsController extends State { } if (!RegExp(r'^[-\w]+$').hasMatch(imageCode)) { await showOkAlertDialog( - useRootNavigator: false, context: context, message: L10n.of(context)!.emoteInvalid, okLabel: L10n.of(context)!.ok, @@ -310,7 +305,7 @@ class EmotesSettingsController extends State { await showDialog( context: context, // breaks [Matrix.of] calls otherwise - useRootNavigator: false, + builder: (context) => ImportEmoteArchiveDialog( controller: this, archive: archive, diff --git a/lib/pages/settings_security/settings_security.dart b/lib/pages/settings_security/settings_security.dart index 4482f764..6c2ee953 100644 --- a/lib/pages/settings_security/settings_security.dart +++ b/lib/pages/settings_security/settings_security.dart @@ -28,7 +28,6 @@ class SettingsSecurityController extends State { AppLock.of(context).showLockScreen(); } final newLock = await showTextInputDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.pleaseChooseAPasscode, message: L10n.of(context)!.pleaseEnter4Digits, @@ -57,7 +56,6 @@ class SettingsSecurityController extends State { void deleteAccountAction() async { if (await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.warning, message: L10n.of(context)!.deactivateAccountWarning, @@ -69,7 +67,6 @@ class SettingsSecurityController extends State { } final supposedMxid = Matrix.of(context).client.userID!; final mxids = await showTextInputDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.confirmMatrixId, textFields: [ @@ -86,7 +83,6 @@ class SettingsSecurityController extends State { return; } final input = await showTextInputDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.pleaseEnterYourPassword, okLabel: L10n.of(context)!.ok, diff --git a/lib/pages/user_bottom_sheet/user_bottom_sheet.dart b/lib/pages/user_bottom_sheet/user_bottom_sheet.dart index e2ae9c9f..ac127987 100644 --- a/lib/pages/user_bottom_sheet/user_bottom_sheet.dart +++ b/lib/pages/user_bottom_sheet/user_bottom_sheet.dart @@ -120,7 +120,6 @@ class UserBottomSheetController extends State { ); if (score == null) return; final reason = await showTextInputDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.whyDoYouWantToReportThis, okLabel: L10n.of(context)!.ok, @@ -150,12 +149,12 @@ class UserBottomSheetController extends State { case UserBottomSheetAction.ban: if (user == null) throw ('User must not be null for this action!'); if (await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.areYouSure, okLabel: L10n.of(context)!.yes, cancelLabel: L10n.of(context)!.no, message: L10n.of(context)!.banUserDescription, + isDestructiveAction: true, ) == OkCancelResult.ok) { await showFutureLoadingDialog( @@ -168,7 +167,6 @@ class UserBottomSheetController extends State { case UserBottomSheetAction.unban: if (user == null) throw ('User must not be null for this action!'); if (await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.areYouSure, okLabel: L10n.of(context)!.yes, @@ -186,7 +184,6 @@ class UserBottomSheetController extends State { case UserBottomSheetAction.kick: if (user == null) throw ('User must not be null for this action!'); if (await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.areYouSure, okLabel: L10n.of(context)!.yes, @@ -210,7 +207,6 @@ class UserBottomSheetController extends State { if (newPermission != null) { if (newPermission == 100 && await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.areYouSure, okLabel: L10n.of(context)!.yes, diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index ff2b432b..9687be2c 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -324,7 +324,7 @@ class BackgroundPush { } Future setupUp() async { - await UnifiedPush.registerAppWithDialog(matrix!.context); + await UnifiedPush.registerAppWithDialog(matrix!.navigatorContext); } Future _newUpEndpoint(String newEndpoint, String i) async { diff --git a/lib/utils/uia_request_manager.dart b/lib/utils/uia_request_manager.dart index 04c8b484..06083002 100644 --- a/lib/utils/uia_request_manager.dart +++ b/lib/utils/uia_request_manager.dart @@ -22,7 +22,7 @@ extension UiaRequestManager on MatrixState { case AuthenticationTypes.password: final input = cachedPassword ?? (await showTextInputDialog( - context: context, + context: navigatorContext, title: l10n.pleaseEnterYourPassword, okLabel: l10n.ok, cancelLabel: l10n.cancel, @@ -62,8 +62,7 @@ extension UiaRequestManager on MatrixState { ); if (OkCancelResult.ok == await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, + context: navigatorContext, title: l10n.weSentYouAnEmail, message: l10n.pleaseClickOnLink, okLabel: l10n.iHaveClickedOnLink, @@ -86,9 +85,8 @@ extension UiaRequestManager on MatrixState { launchUrlString(url.toString()); if (OkCancelResult.ok == await showOkCancelAlertDialog( - useRootNavigator: false, message: l10n.pleaseFollowInstructionsOnWeb, - context: context, + context: navigatorContext, okLabel: l10n.next, cancelLabel: l10n.cancel, )) { diff --git a/lib/utils/url_launcher.dart b/lib/utils/url_launcher.dart index 808f64f6..fa724f40 100644 --- a/lib/utils/url_launcher.dart +++ b/lib/utils/url_launcher.dart @@ -189,7 +189,6 @@ class UrlLauncher { } if (roomIdOrAlias.sigil == '!') { if (await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: 'Join room $roomIdOrAlias', ) == diff --git a/lib/utils/voip/callkeep_manager.dart b/lib/utils/voip/callkeep_manager.dart index 6de7cb6e..7d9f98aa 100644 --- a/lib/utils/voip/callkeep_manager.dart +++ b/lib/utils/voip/callkeep_manager.dart @@ -247,7 +247,6 @@ class CallKeepManager { showDialog( context: context, barrierDismissible: true, - useRootNavigator: false, builder: (_) => AlertDialog( title: Text(L10n.of(context)!.callingPermissions), content: Column( diff --git a/lib/widgets/chat_settings_popup_menu.dart b/lib/widgets/chat_settings_popup_menu.dart index 277e7170..a79f441e 100644 --- a/lib/widgets/chat_settings_popup_menu.dart +++ b/lib/widgets/chat_settings_popup_menu.dart @@ -106,12 +106,12 @@ class ChatSettingsPopupMenuState extends State { switch (choice) { case 'leave': final confirmed = await showOkCancelAlertDialog( - useRootNavigator: false, context: context, title: L10n.of(context)!.areYouSure, okLabel: L10n.of(context)!.ok, cancelLabel: L10n.of(context)!.cancel, message: L10n.of(context)!.archiveRoomDescription, + isDestructiveAction: true, ); if (confirmed == OkCancelResult.ok) { final success = await showFutureLoadingDialog( diff --git a/lib/widgets/fluffy_chat_app.dart b/lib/widgets/fluffy_chat_app.dart index d9d2f042..b5838804 100644 --- a/lib/widgets/fluffy_chat_app.dart +++ b/lib/widgets/fluffy_chat_app.dart @@ -52,16 +52,10 @@ class FluffyChatApp extends StatelessWidget { builder: (context, child) => AppLockWidget( pincode: pincode, clients: clients, - // Need a navigator above the Matrix widget for - // displaying dialogs - child: Navigator( - onGenerateRoute: (_) => MaterialPageRoute( - builder: (_) => Matrix( - clients: clients, - store: store, - child: testWidget ?? child, - ), - ), + child: Matrix( + clients: clients, + store: store, + child: testWidget ?? child, ), ), ), diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index d6d526c3..4c9d97a5 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -71,6 +71,8 @@ class MatrixState extends State with WidgetsBindingObserver { BackgroundPush? backgroundPush; + late BuildContext navigatorContext; + Client get client { if (widget.clients.isEmpty) { widget.clients.add(getLoginClient()); @@ -311,7 +313,8 @@ class MatrixState extends State with WidgetsBindingObserver { }; request.onUpdate = null; hidPopup = true; - await KeyVerificationDialog(request: request).show(context); + + await KeyVerificationDialog(request: request).show(navigatorContext); }); onLoginStateChanged[name] ??= c.onLoginStateChanged.stream.listen((state) { final loggedInWithMultipleClients = widget.clients.length > 1; @@ -322,7 +325,7 @@ class MatrixState extends State with WidgetsBindingObserver { _cancelSubs(c.clientName); widget.clients.remove(c); ClientManager.removeClientNameFromStore(c.clientName, store); - ScaffoldMessenger.of(context).showSnackBar( + ScaffoldMessenger.of(navigatorContext).showSnackBar( SnackBar( content: Text(L10n.of(context)!.oneClientLoggedOut), ), @@ -382,7 +385,7 @@ class MatrixState extends State with WidgetsBindingObserver { onFcmError: (errorMsg, {Uri? link}) async { final result = await showOkCancelAlertDialog( barrierDismissible: true, - context: context, + context: navigatorContext, title: L10n.of(context)!.pushNotificationsNotAvailable, message: errorMsg, fullyCapitalizedForMaterial: false,