diff --git a/lib/pages/add_story/add_story.dart b/lib/pages/add_story/add_story.dart index 6b1bc6a46..323d103b4 100644 --- a/lib/pages/add_story/add_story.dart +++ b/lib/pages/add_story/add_story.dart @@ -17,6 +17,7 @@ import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dar import 'package:fluffychat/utils/resize_image.dart'; import 'package:fluffychat/utils/story_theme_data.dart'; import 'package:fluffychat/utils/string_color.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../utils/matrix_sdk_extensions/client_stories_extension.dart'; @@ -69,9 +70,11 @@ class AddStoryController extends State { } void importMedia() async { - final picked = await FilePicker.platform.pickFiles( - type: FileType.image, - withData: true, + final picked = await AppLock.of(context).pauseWhile( + FilePicker.platform.pickFiles( + type: FileType.image, + withData: true, + ), ); final file = picked?.files.firstOrNull; if (file == null) return; diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 874b84f03..f6948daf8 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -30,6 +30,7 @@ import 'package:fluffychat/utils/error_reporter.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../utils/account_bundles.dart'; import '../../utils/localized_exception_extension.dart'; @@ -469,9 +470,11 @@ class ChatController extends State { } void sendFileAction() async { - final result = await FilePicker.platform.pickFiles( - allowMultiple: true, - withData: true, + final result = await AppLock.of(context).pauseWhile( + FilePicker.platform.pickFiles( + allowMultiple: true, + withData: true, + ), ); if (result == null || result.files.isEmpty) return; await showDialog( @@ -508,10 +511,13 @@ class ChatController extends State { } void sendImageAction() async { - final result = await FilePicker.platform.pickFiles( - type: FileType.image, - withData: true, - allowMultiple: true, + //AppLock.of(context).pauseWhile(); + final result = await AppLock.of(context).pauseWhile( + FilePicker.platform.pickFiles( + type: FileType.image, + withData: true, + allowMultiple: true, + ), ); if (result == null || result.files.isEmpty) return; diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index df8c9ef99..b9da5c654 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -15,6 +15,7 @@ import 'package:fluffychat/pages/chat_details/chat_details_view.dart'; import 'package:fluffychat/pages/settings/settings.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; import 'package:fluffychat/widgets/matrix.dart'; enum AliasActions { copy, delete, setCanonical } @@ -376,9 +377,11 @@ class ChatDetailsController extends State { name: result.path, ); } else { - final picked = await FilePicker.platform.pickFiles( - type: FileType.image, - withData: true, + final picked = await AppLock.of(context).pauseWhile( + FilePicker.platform.pickFiles( + type: FileType.image, + withData: true, + ), ); final pickedFile = picked?.files.firstOrNull; if (pickedFile == null) return; diff --git a/lib/pages/homeserver_picker/homeserver_picker.dart b/lib/pages/homeserver_picker/homeserver_picker.dart index 865e91b0c..a5df23a51 100644 --- a/lib/pages/homeserver_picker/homeserver_picker.dart +++ b/lib/pages/homeserver_picker/homeserver_picker.dart @@ -17,6 +17,7 @@ import 'package:universal_html/html.dart' as html; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../utils/localized_exception_extension.dart'; @@ -168,7 +169,9 @@ class HomeserverPickerController extends State { Widget build(BuildContext context) => HomeserverPickerView(this); Future restoreBackup() async { - final picked = await FilePicker.platform.pickFiles(withData: true); + final picked = await AppLock.of(context).pauseWhile( + FilePicker.platform.pickFiles(withData: true), + ); final file = picked?.files.firstOrNull; if (file == null) return; await showFutureLoadingDialog( diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 368f09866..b4b9c2f1f 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -11,6 +11,7 @@ import 'package:image_picker/image_picker.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; import '../../widgets/matrix.dart'; import '../bootstrap/bootstrap_dialog.dart'; import 'settings_view.dart'; @@ -135,9 +136,11 @@ class SettingsController extends State { name: result.path, ); } else { - final result = await FilePicker.platform.pickFiles( - type: FileType.image, - withData: true, + final result = await AppLock.of(context).pauseWhile( + FilePicker.platform.pickFiles( + type: FileType.image, + withData: true, + ), ); final pickedFile = result?.files.firstOrNull; if (pickedFile == null) return; diff --git a/lib/pages/settings_emotes/settings_emotes.dart b/lib/pages/settings_emotes/settings_emotes.dart index 626622d42..98d5a214d 100644 --- a/lib/pages/settings_emotes/settings_emotes.dart +++ b/lib/pages/settings_emotes/settings_emotes.dart @@ -14,6 +14,7 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/utils/client_manager.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; import '../../widgets/matrix.dart'; import 'import_archive_dialog.dart'; import 'settings_emotes_view.dart'; @@ -221,9 +222,11 @@ class EmotesSettingsController extends State { void imagePickerAction( ValueNotifier controller, ) async { - final result = await FilePicker.platform.pickFiles( - type: FileType.image, - withData: true, + final result = await AppLock.of(context).pauseWhile( + FilePicker.platform.pickFiles( + type: FileType.image, + withData: true, + ), ); final pickedFile = result?.files.firstOrNull; if (pickedFile == null) return; @@ -279,14 +282,16 @@ class EmotesSettingsController extends State { final result = await showFutureLoadingDialog( context: context, future: () async { - final result = await FilePicker.platform.pickFiles( - type: FileType.custom, - allowedExtensions: [ - 'zip', - // TODO: add further encoders - ], - // TODO: migrate to stream, currently brrrr because of `archive_io`. - withData: true, + final result = await AppLock.of(context).pauseWhile( + FilePicker.platform.pickFiles( + type: FileType.custom, + allowedExtensions: [ + 'zip', + // TODO: add further encoders + ], + // TODO: migrate to stream, currently brrrr because of `archive_io`. + withData: true, + ), ); if (result == null) return null; diff --git a/lib/pages/settings_style/settings_style.dart b/lib/pages/settings_style/settings_style.dart index e46392c39..619dc2c6d 100644 --- a/lib/pages/settings_style/settings_style.dart +++ b/lib/pages/settings_style/settings_style.dart @@ -5,6 +5,7 @@ import 'package:file_picker/file_picker.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; import 'package:fluffychat/widgets/theme_builder.dart'; import '../../widgets/matrix.dart'; import 'settings_style_view.dart'; @@ -18,9 +19,11 @@ class SettingsStyle extends StatefulWidget { class SettingsStyleController extends State { void setWallpaperAction() async { - final picked = await FilePicker.platform.pickFiles( - type: FileType.image, - withData: false, + final picked = await AppLock.of(context).pauseWhile( + FilePicker.platform.pickFiles( + type: FileType.image, + withData: false, + ), ); final pickedFile = picked?.files.firstOrNull; diff --git a/lib/widgets/app_lock.dart b/lib/widgets/app_lock.dart index 2e25f95e2..8faadb52f 100644 --- a/lib/widgets/app_lock.dart +++ b/lib/widgets/app_lock.dart @@ -28,10 +28,12 @@ class AppLockWidget extends StatefulWidget { class AppLock extends State with WidgetsBindingObserver { String? _pincode; bool _isLocked = false; + bool _paused = false; bool get isActive => _pincode != null && int.tryParse(_pincode!) != null && - _pincode!.length == 4; + _pincode!.length == 4 && + !_paused; @override void initState() { @@ -86,6 +88,15 @@ class AppLock extends State with WidgetsBindingObserver { _isLocked = true; }); + Future pauseWhile(Future future) async { + _paused = true; + try { + return await future; + } finally { + _paused = false; + } + } + static AppLock of(BuildContext context) => Provider.of( context, listen: false,