diff --git a/lib/pages/new_private_chat.dart b/lib/pages/new_private_chat.dart index 975fed9a..ecdb0f78 100644 --- a/lib/pages/new_private_chat.dart +++ b/lib/pages/new_private_chat.dart @@ -1,3 +1,4 @@ +import 'package:fluffychat/pages/qr_scanner_modal.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/pages/views/new_private_chat_view.dart'; @@ -75,6 +76,11 @@ class NewPrivateChatController extends State { context, ); + void openScannerAction() => showDialog( + context: context, + builder: (_) => QrScannerModal(), + ); + @override Widget build(BuildContext context) => NewPrivateChatView(this); } diff --git a/lib/pages/qr_scanner_modal.dart b/lib/pages/qr_scanner_modal.dart new file mode 100644 index 00000000..f6c1d8bf --- /dev/null +++ b/lib/pages/qr_scanner_modal.dart @@ -0,0 +1,59 @@ +import 'dart:io'; + +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:flutter/material.dart'; +import 'package:qr_code_scanner/qr_code_scanner.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; + +class QrScannerModal extends StatefulWidget { + const QrScannerModal({Key key}) : super(key: key); + + @override + _QrScannerModalState createState() => _QrScannerModalState(); +} + +class _QrScannerModalState extends State { + final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); + QRViewController controller; + + @override + void reassemble() { + super.reassemble(); + if (Platform.isAndroid) { + controller.pauseCamera(); + } else if (Platform.isIOS) { + controller.resumeCamera(); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.close_outlined), + onPressed: Navigator.of(context).pop, + ), + title: Text(L10n.of(context).scanQrCode), + ), + body: QRView( + key: qrKey, + onQRViewCreated: _onQRViewCreated, + ), + ); + } + + void _onQRViewCreated(QRViewController controller) { + this.controller = controller; + controller.scannedDataStream.listen((scanData) { + Navigator.of(context).pop(); + UrlLauncher(context, scanData.code).openMatrixToUrl(); + }); + } + + @override + void dispose() { + controller?.dispose(); + super.dispose(); + } +} diff --git a/lib/pages/views/new_private_chat_view.dart b/lib/pages/views/new_private_chat_view.dart index 9465cfe3..7c25291e 100644 --- a/lib/pages/views/new_private_chat_view.dart +++ b/lib/pages/views/new_private_chat_view.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/new_private_chat.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; @@ -105,11 +106,13 @@ class NewPrivateChatView extends StatelessWidget { ], ), ), - floatingActionButton: FloatingActionButton.extended( - onPressed: () {}, - label: Text(L10n.of(context).scanQrCode), - icon: Icon(Icons.camera_alt_outlined), - ), + floatingActionButton: PlatformInfos.isMobile + ? FloatingActionButton.extended( + onPressed: controller.openScannerAction, + label: Text(L10n.of(context).scanQrCode), + icon: Icon(Icons.camera_alt_outlined), + ) + : null, ); } } diff --git a/pubspec.lock b/pubspec.lock index 390d8525..9f892e3d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1019,6 +1019,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + qr_code_scanner: + dependency: "direct main" + description: + name: qr_code_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.2" qr_flutter: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index db0f3f5a..fc73fcd2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -56,6 +56,7 @@ dependencies: pin_code_text_field: ^1.8.0 provider: ^5.0.0 punycode: ^1.0.0 + qr_code_scanner: ^0.5.2 qr_flutter: ^4.0.0 receive_sharing_intent: ^1.4.5 record: ^3.0.0