diff --git a/lib/views/key_verification.dart b/lib/components/dialogs/key_verification_dialog.dart similarity index 71% rename from lib/views/key_verification.dart rename to lib/components/dialogs/key_verification_dialog.dart index 2b92d5e1..96c94ede 100644 --- a/lib/views/key_verification.dart +++ b/lib/components/dialogs/key_verification_dialog.dart @@ -1,40 +1,28 @@ import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:famedlysdk/encryption.dart'; import 'package:famedlysdk/matrix_api.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; +import '../avatar.dart'; +import 'simple_dialogs.dart'; +import '../../utils/string_color.dart'; -import '../components/adaptive_page_layout.dart'; -import '../components/avatar.dart'; -import '../components/dialogs/simple_dialogs.dart'; -import '../utils/string_color.dart'; -import 'chat_list.dart'; +class KeyVerificationDialog extends StatefulWidget { + Future show(BuildContext context) => PlatformInfos.isCupertinoStyle + ? showCupertinoDialog(context: context, builder: (context) => this) + : showDialog(context: context, builder: (context) => this); -class KeyVerificationView extends StatelessWidget { final KeyVerification request; - KeyVerificationView({this.request}); - - @override - Widget build(BuildContext context) { - return AdaptivePageLayout( - primaryPage: FocusPage.SECOND, - firstScaffold: ChatList(), - secondScaffold: KeyVerificationPage(request: request), - ); - } -} - -class KeyVerificationPage extends StatefulWidget { - final KeyVerification request; - - KeyVerificationPage({this.request}); + KeyVerificationDialog({this.request}); @override _KeyVerificationPageState createState() => _KeyVerificationPageState(); } -class _KeyVerificationPageState extends State { +class _KeyVerificationPageState extends State { void Function() originalOnUpdate; @override @@ -133,20 +121,14 @@ class _KeyVerificationPageState extends State { mainAxisSize: MainAxisSize.min, ), ); - buttons.add(RaisedButton( - color: Theme.of(context).primaryColor, - elevation: 5, - textColor: Colors.white, + buttons.add(_AdaptiveFlatButton( child: Text(L10n.of(context).submit), onPressed: () { input = textEditingController.text; checkInput(); }, )); - buttons.add(RaisedButton( - textColor: Theme.of(context).primaryColor, - elevation: 5, - color: Colors.white, + buttons.add(_AdaptiveFlatButton( child: Text(L10n.of(context).skip), onPressed: () => widget.request.openSSSS(skip: true), )); @@ -158,17 +140,11 @@ class _KeyVerificationPageState extends State { style: TextStyle(fontSize: 20)), margin: EdgeInsets.only(left: 8.0, right: 8.0), ); - buttons.add(RaisedButton( - color: Theme.of(context).primaryColor, - elevation: 5, - textColor: Colors.white, + buttons.add(_AdaptiveFlatButton( child: Text(L10n.of(context).accept), onPressed: () => widget.request.acceptVerification(), )); - buttons.add(RaisedButton( - textColor: Theme.of(context).primaryColor, - elevation: 5, - color: Colors.white, + buttons.add(_AdaptiveFlatButton( child: Text(L10n.of(context).reject), onPressed: () { widget.request.rejectVerification().then((_) { @@ -180,7 +156,9 @@ class _KeyVerificationPageState extends State { case KeyVerificationState.waitingAccept: body = Column( children: [ - CircularProgressIndicator(), + PlatformInfos.isCupertinoStyle + ? CupertinoActivityIndicator() + : CircularProgressIndicator(), SizedBox(height: 10), Text( L10n.of(context).waitingPartnerAcceptRequest, @@ -214,7 +192,7 @@ class _KeyVerificationPageState extends State { Center( child: Text( compareText, - style: TextStyle(fontSize: 20), + style: TextStyle(fontSize: 16), textAlign: TextAlign.center, ), ), @@ -226,23 +204,12 @@ class _KeyVerificationPageState extends State { ], mainAxisSize: MainAxisSize.min, ); - buttons.add(RaisedButton( - color: Theme.of(context).primaryColor, - elevation: 7, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(6), - ), - textColor: Colors.white, + buttons.add(_AdaptiveFlatButton( child: Text(L10n.of(context).theyMatch), onPressed: () => widget.request.acceptSas(), )); - buttons.add(RaisedButton( - textColor: Theme.of(context).primaryColor, - elevation: 7, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(6), - ), - color: Colors.white, + buttons.add(_AdaptiveFlatButton( + textColor: Colors.red, child: Text(L10n.of(context).theyDontMatch), onPressed: () => widget.request.rejectSas(), )); @@ -253,7 +220,9 @@ class _KeyVerificationPageState extends State { : L10n.of(context).waitingPartnerNumbers; body = Column( children: [ - CircularProgressIndicator(), + PlatformInfos.isCupertinoStyle + ? CupertinoActivityIndicator() + : CircularProgressIndicator(), SizedBox(height: 10), Text( acceptText, @@ -275,13 +244,7 @@ class _KeyVerificationPageState extends State { ], mainAxisSize: MainAxisSize.min, ); - buttons.add(RaisedButton( - color: Theme.of(context).primaryColor, - elevation: 7, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(6), - ), - textColor: Colors.white, + buttons.add(_AdaptiveFlatButton( child: Text(L10n.of(context).close), onPressed: () => Navigator.of(context).pop(), )); @@ -298,13 +261,7 @@ class _KeyVerificationPageState extends State { ], mainAxisSize: MainAxisSize.min, ); - buttons.add(RaisedButton( - color: Theme.of(context).primaryColor, - elevation: 7, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(6), - ), - textColor: Colors.white, + buttons.add(FlatButton( child: Text(L10n.of(context).close), onPressed: () => Navigator.of(context).pop(), )); @@ -328,52 +285,59 @@ class _KeyVerificationPageState extends State { style: TextStyle(color: Theme.of(context).textTheme.caption.color)), ); } - return Scaffold( - appBar: AppBar( - title: ListTile( - leading: Avatar(profile?.avatarUrl, otherName), - contentPadding: EdgeInsets.zero, - subtitle: Text(L10n.of(context).verifyTitle, maxLines: 1), - title: Row( - children: [ - Text( - otherName, - maxLines: 1, - style: TextStyle( - color: otherName.color, - fontWeight: FontWeight.bold, - ), - ), - if (otherName != widget.request.userId) - Text( - ' - ' + widget.request.userId, - maxLines: 1, - style: TextStyle( - fontStyle: FontStyle.italic, - ), - ), - ], - crossAxisAlignment: CrossAxisAlignment.start, + final userNameTitle = Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + otherName, + maxLines: 1, + style: TextStyle( + color: otherName.color, + fontWeight: FontWeight.bold, ), ), - elevation: 0, - ), - body: SafeArea( - child: Column( - children: [ - Expanded( - child: Center( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: body, - ), - ), + if (otherName != widget.request.userId) + Text( + ' - ' + widget.request.userId, + maxLines: 1, + style: TextStyle( + fontStyle: FontStyle.italic, ), - if (bottom != null) bottom, - ], - ), - ), - persistentFooterButtons: buttons.isEmpty ? null : buttons, + ), + ], + crossAxisAlignment: CrossAxisAlignment.start, + ); + final title = PlatformInfos.isCupertinoStyle + ? Text(L10n.of(context).verifyTitle) + : ListTile( + leading: Avatar(profile?.avatarUrl, otherName), + contentPadding: EdgeInsets.zero, + subtitle: Text(L10n.of(context).verifyTitle, maxLines: 1), + title: userNameTitle, + ); + final content = Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (PlatformInfos.isCupertinoStyle) ...{ + SizedBox(height: 8), + Center(child: userNameTitle), + SizedBox(height: 12), + }, + body, + if (bottom != null) bottom, + ], + ); + if (PlatformInfos.isCupertinoStyle) { + return CupertinoAlertDialog( + title: title, + content: content, + actions: buttons, + ); + } + return AlertDialog( + title: title, + content: content, + actions: buttons, ); } } @@ -395,3 +359,32 @@ class _Emoji extends StatelessWidget { ); } } + +class _AdaptiveFlatButton extends StatelessWidget { + final Widget child; + final Color textColor; + final Function onPressed; + + const _AdaptiveFlatButton({ + Key key, + this.child, + this.textColor, + this.onPressed, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + if (PlatformInfos.isCupertinoStyle) { + return CupertinoDialogAction( + child: child, + onPressed: onPressed, + textStyle: textColor != null ? TextStyle(color: textColor) : null, + ); + } + return FlatButton( + child: child, + textColor: textColor, + onPressed: onPressed, + ); + } +} diff --git a/lib/components/matrix.dart b/lib/components/matrix.dart index 7c06b42e..113678cf 100644 --- a/lib/components/matrix.dart +++ b/lib/components/matrix.dart @@ -20,10 +20,9 @@ import 'package:fluffychat/config/app_config.dart'; import 'package:dbus/dbus.dart'; import 'package:desktop_notifications/desktop_notifications.dart';*/ -import '../utils/app_route.dart'; import '../utils/beautify_string_extension.dart'; import '../utils/famedlysdk_store.dart'; -import '../views/key_verification.dart'; +import 'dialogs/key_verification_dialog.dart'; import '../utils/platform_infos.dart'; import '../config/app_config.dart'; import '../config/setting_keys.dart'; @@ -324,12 +323,7 @@ class MatrixState extends State { request.onUpdate = null; hidPopup = true; await request.acceptVerification(); - await Navigator.of(context).push( - AppRoute.defaultRoute( - context, - KeyVerificationView(request: request), - ), - ); + await KeyVerificationDialog(request: request).show(context); } else { request.onUpdate = null; hidPopup = true; diff --git a/lib/components/message_content.dart b/lib/components/message_content.dart index efb193e1..87586149 100644 --- a/lib/components/message_content.dart +++ b/lib/components/message_content.dart @@ -3,10 +3,9 @@ import 'package:famedlysdk/famedlysdk.dart'; import 'package:fluffychat/components/audio_player.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/image_bubble.dart'; -import 'package:fluffychat/utils/app_route.dart'; import 'package:fluffychat/utils/event_extension.dart'; import 'package:fluffychat/utils/matrix_locals.dart'; -import 'package:fluffychat/views/key_verification.dart'; +import 'package:fluffychat/components/dialogs/key_verification_dialog.dart'; import 'package:flushbar/flushbar_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -53,12 +52,7 @@ class MessageContent extends StatelessWidget { timeline.cancelSubscriptions(); } }; - await Navigator.of(context).push( - AppRoute.defaultRoute( - context, - KeyVerificationView(request: req), - ), - ); + await KeyVerificationDialog(request: req).show(context); } else { final success = await SimpleDialogs(context).tryRequestWithLoadingDialog( event.requestKey(), diff --git a/lib/components/user_bottom_sheet.dart b/lib/components/user_bottom_sheet.dart index c4bc2e49..d2081f5b 100644 --- a/lib/components/user_bottom_sheet.dart +++ b/lib/components/user_bottom_sheet.dart @@ -13,7 +13,7 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import '../utils/presence_extension.dart'; import 'dialogs/simple_dialogs.dart'; import 'matrix.dart'; -import '../views/key_verification.dart'; +import 'dialogs/key_verification_dialog.dart'; import '../utils/app_route.dart'; class UserBottomSheet extends StatelessWidget { @@ -88,12 +88,7 @@ class UserBottomSheet extends StatelessWidget { void _verifyAction(BuildContext context) async { final client = Matrix.of(context).client; final req = await client.userDeviceKeys[user.id].startVerification(); - await Navigator.of(context).push( - AppRoute.defaultRoute( - context, - KeyVerificationView(request: req), - ), - ); + await KeyVerificationDialog(request: req).show(context); } @override diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart index 3bc4898b..2d11ab2e 100644 --- a/lib/utils/platform_infos.dart +++ b/lib/utils/platform_infos.dart @@ -5,6 +5,9 @@ import 'package:flutter/foundation.dart'; abstract class PlatformInfos { static bool get isWeb => kIsWeb; + static bool get isCupertinoStyle => + !kIsWeb && (Platform.isIOS || Platform.isMacOS); + static bool get isMobile => !kIsWeb && (Platform.isAndroid || Platform.isIOS); /// For desktops which don't support ChachedNetworkImage yet diff --git a/lib/views/chat_encryption_settings.dart b/lib/views/chat_encryption_settings.dart index b2c14ecd..29c27e23 100644 --- a/lib/views/chat_encryption_settings.dart +++ b/lib/views/chat_encryption_settings.dart @@ -9,8 +9,7 @@ import 'package:fluffychat/views/chat_list.dart'; import 'package:flushbar/flushbar_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import '../utils/app_route.dart'; -import 'key_verification.dart'; +import '../components/dialogs/key_verification_dialog.dart'; class ChatEncryptionSettingsView extends StatelessWidget { final String id; @@ -55,12 +54,7 @@ class _ChatEncryptionSettingsState extends State { setState(() => null); } }; - await Navigator.of(context).push( - AppRoute.defaultRoute( - context, - KeyVerificationView(request: req), - ), - ); + await KeyVerificationDialog(request: req).show(context); break; case 'verify_manual': if (await showOkCancelAlertDialog( @@ -83,12 +77,7 @@ class _ChatEncryptionSettingsState extends State { setState(() => null); } }; - await Navigator.of(context).push( - AppRoute.defaultRoute( - context, - KeyVerificationView(request: req), - ), - ); + await KeyVerificationDialog(request: req).show(context); break; case 'block': if (key.directVerified) {