From 3840b79389c8a330669336a9ddd26bada51ef1ae Mon Sep 17 00:00:00 2001 From: primozratej Date: Thu, 9 Jan 2025 17:32:42 +0100 Subject: [PATCH] Fix exitApp --- lib/app_opener.dart | 1 - lib/models/hum_hub.dart | 12 +++--- lib/pages/web_view.dart | 84 ++++++++++++++--------------------------- 3 files changed, 35 insertions(+), 62 deletions(-) diff --git a/lib/app_opener.dart b/lib/app_opener.dart index 0795dd8e..55c37a31 100644 --- a/lib/app_opener.dart +++ b/lib/app_opener.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:humhub/util/const.dart'; import 'package:humhub/util/intent/intent_plugin.dart'; diff --git a/lib/models/hum_hub.dart b/lib/models/hum_hub.dart index b43ba756..2dd7098b 100644 --- a/lib/models/hum_hub.dart +++ b/lib/models/hum_hub.dart @@ -19,15 +19,15 @@ enum OpenerState { shown(true), hidden(false); - final bool value; + final bool isShown; - const OpenerState(this.value); + const OpenerState(this.isShown); - String get headerValue => value ? '1' : '0'; + String get headerValue => isShown ? '1' : '0'; @override String toString() { - return value ? "shown" : "hidden"; + return isShown ? "shown" : "hidden"; } } @@ -55,7 +55,7 @@ class HumHub { Map toJson() => { 'manifest': manifest?.toJson(), 'manifestUri': manifestUrl, - 'openerState': openerState.value, + 'openerState': openerState.isShown, 'randomHash': randomHash, 'appVersion': appVersion, 'pushToken': pushToken, @@ -130,7 +130,7 @@ class HumHub { } Future action(ref) async { - if (openerState.value) { + if (openerState.isShown) { return RedirectAction.opener; } else { if (manifest != null) { diff --git a/lib/pages/web_view.dart b/lib/pages/web_view.dart index 372cc6e6..f181b2c4 100644 --- a/lib/pages/web_view.dart +++ b/lib/pages/web_view.dart @@ -100,8 +100,7 @@ class WebViewAppState extends ConsumerState { onProgressChanged: _onProgressChanged, onReceivedError: _onReceivedError, onDownloadStartRequest: _onDownloadStartRequest, - onLongPressHitTestResult: - WebViewGlobalController.onLongPressHitTestResult, + onLongPressHitTestResult: WebViewGlobalController.onLongPressHitTestResult, ), )), ); @@ -129,15 +128,12 @@ class WebViewAppState extends ConsumerState { } String? payloadFromPush = InitFromUrl.usePayload(); if (payloadFromPush != null) url = payloadFromPush; - return URLRequest( - url: WebUri(url ?? _manifest.startUrl), - headers: ref.read(humHubProvider).customHeaders); + return URLRequest(url: WebUri(url ?? _manifest.startUrl), headers: ref.read(humHubProvider).customHeaders); } Future _shouldOverrideUrlLoading( InAppWebViewController controller, NavigationAction action) async { - WebViewGlobalController.ajaxSetHeaders( - headers: ref.read(humHubProvider).customHeaders); + WebViewGlobalController.ajaxSetHeaders(headers: ref.read(humHubProvider).customHeaders); WebViewGlobalController.listenToImageOpen(); WebViewGlobalController.appendViewportFitCover(); @@ -156,18 +152,14 @@ class WebViewAppState extends ConsumerState { if (!url.startsWith(_manifest.baseUrl) && !action.isForMainFrame && action.navigationType == NavigationType.LINK_ACTIVATED) { - await launchUrl(action.request.url!.uriValue, - mode: LaunchMode.externalApplication); + await launchUrl(action.request.url!.uriValue, mode: LaunchMode.externalApplication); return NavigationActionPolicy.CANCEL; } // 2nd Append customHeader if url is in app redirect and CANCEL the requests without custom headers if (Platform.isAndroid || action.navigationType == NavigationType.LINK_ACTIVATED || action.navigationType == NavigationType.FORM_SUBMITTED) { - Map mergedMap = { - ...?_initialRequest.headers, - ...?action.request.headers - }; + Map mergedMap = {...?_initialRequest.headers, ...?action.request.headers}; URLRequest newRequest = action.request.copyWith(headers: mergedMap); controller.loadUrl(urlRequest: newRequest); return NavigationActionPolicy.CANCEL; @@ -182,8 +174,7 @@ class WebViewAppState extends ConsumerState { await controller.addWebMessageListener( WebMessageListener( jsObjectName: "flutterChannel", - onPostMessage: - (inMessage, sourceOrigin, isMainFrame, replyProxy) async { + onPostMessage: (inMessage, sourceOrigin, isMainFrame, replyProxy) async { logInfo(inMessage); ChannelMessage message = ChannelMessage.fromJson(inMessage!.data); await _handleJSMessage(message, _headlessWebView!); @@ -194,15 +185,13 @@ class WebViewAppState extends ConsumerState { WebViewGlobalController.setValue(controller); } - Future _shouldInterceptFetchRequest( - InAppWebViewController controller, FetchRequest request) async { + Future _shouldInterceptFetchRequest(InAppWebViewController controller, FetchRequest request) async { logDebug("_shouldInterceptFetchRequest"); request.headers!.addAll(_initialRequest.headers!); return request; } - Future _onCreateWindow(InAppWebViewController controller, - CreateWindowAction createWindowAction) async { + Future _onCreateWindow(InAppWebViewController controller, CreateWindowAction createWindowAction) async { WebUri? urlToOpen = createWindowAction.request.url; if (urlToOpen == null) return Future.value(false); @@ -226,22 +215,20 @@ class WebViewAppState extends ConsumerState { _onLoadStop(InAppWebViewController controller, Uri? url) { // Disable remember me checkbox on login and set def. value to true: check if the page is actually login page, if it is inject JS that hides element if (url!.path.contains('/user/auth/login')) { - WebViewGlobalController.value!.evaluateJavascript( - source: "document.querySelector('#login-rememberme').checked=true"); + WebViewGlobalController.value! + .evaluateJavascript(source: "document.querySelector('#login-rememberme').checked=true"); WebViewGlobalController.value!.evaluateJavascript( source: "document.querySelector('#account-login-form > div.form-group.field-login-rememberme').style.display='none';"); } - WebViewGlobalController.ajaxSetHeaders( - headers: ref.read(humHubProvider).customHeaders); + WebViewGlobalController.ajaxSetHeaders(headers: ref.read(humHubProvider).customHeaders); WebViewGlobalController.listenToImageOpen(); WebViewGlobalController.appendViewportFitCover(); LoadingProvider.of(ref).dismissAll(); } void _onLoadStart(InAppWebViewController controller, Uri? url) async { - WebViewGlobalController.ajaxSetHeaders( - headers: ref.read(humHubProvider).customHeaders); + WebViewGlobalController.ajaxSetHeaders(headers: ref.read(humHubProvider).customHeaders); WebViewGlobalController.listenToImageOpen(); WebViewGlobalController.appendViewportFitCover(); } @@ -252,8 +239,7 @@ class WebViewAppState extends ConsumerState { } } - void _onReceivedError(InAppWebViewController controller, - WebResourceRequest request, WebResourceError error) { + void _onReceivedError(InAppWebViewController controller, WebResourceRequest request, WebResourceError error) { if (error.description == 'net::ERR_INTERNET_DISCONNECTED') { NoConnectionDialog.show(context); } @@ -264,21 +250,18 @@ class WebViewAppState extends ConsumerState { WebViewGlobalController.value!.loadUrl(urlRequest: request); } - Future _handleJSMessage( - ChannelMessage message, HeadlessInAppWebView headlessWebView) async { + Future _handleJSMessage(ChannelMessage message, HeadlessInAppWebView headlessWebView) async { switch (message.action) { case ChannelAction.showOpener: ref.read(humHubProvider).setOpenerState(OpenerState.shown); - Navigator.of(context).pushNamedAndRemoveUntil( - OpenerPage.path, (Route route) => false); + Navigator.of(context).pushNamedAndRemoveUntil(OpenerPage.path, (Route route) => false); break; case ChannelAction.hideOpener: ref.read(humHubProvider).setOpenerState(OpenerState.hidden); ref.read(humHubProvider).setHash(HumHub.generateHash(32)); break; case ChannelAction.registerFcmDevice: - String? token = ref.read(pushTokenProvider).value ?? - await FirebaseMessaging.instance.getToken(); + String? token = ref.read(pushTokenProvider).value ?? await FirebaseMessaging.instance.getToken(); if (token != null) { WebViewGlobalController.ajaxPost( url: message.url!, @@ -293,8 +276,7 @@ class WebViewAppState extends ConsumerState { } break; case ChannelAction.unregisterFcmDevice: - String? token = ref.read(pushTokenProvider).value ?? - await FirebaseMessaging.instance.getToken(); + String? token = ref.read(pushTokenProvider).value ?? await FirebaseMessaging.instance.getToken(); if (token != null) { WebViewGlobalController.ajaxPost( url: message.url!, @@ -308,20 +290,19 @@ class WebViewAppState extends ConsumerState { } } - Future exitApp(context, ref) async { + Future exitApp(BuildContext context, WidgetRef ref) async { bool canGoBack = await WebViewGlobalController.value!.canGoBack(); if (canGoBack) { WebViewGlobalController.value!.goBack(); return Future.value(false); } else { final exitConfirmed = await showDialog( + // ignore: use_build_context_synchronously context: context, builder: (context) => AlertDialog( - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(10.0))), + shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10.0))), title: Text(AppLocalizations.of(context)!.web_view_exit_popup_title), - content: - Text(AppLocalizations.of(context)!.web_view_exit_popup_content), + content: Text(AppLocalizations.of(context)!.web_view_exit_popup_content), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(false), @@ -329,11 +310,9 @@ class WebViewAppState extends ConsumerState { ), TextButton( onPressed: () { - var isHide = ref.read(humHubProvider).isHideDialog; - isHide - ? SystemNavigator.pop() - : Navigator.of(context).pushNamedAndRemoveUntil( - OpenerPage.path, (Route route) => false); + ref.read(humHubProvider).openerState.isShown + ? Navigator.of(context).pushNamedAndRemoveUntil(OpenerPage.path, (Route route) => false) + : SystemNavigator.pop(); }, child: Text(AppLocalizations.of(context)!.yes), ), @@ -344,8 +323,7 @@ class WebViewAppState extends ConsumerState { } } - void _onDownloadStartRequest(InAppWebViewController controller, - DownloadStartRequest downloadStartRequest) async { + void _onDownloadStartRequest(InAppWebViewController controller, DownloadStartRequest downloadStartRequest) async { PersistentBottomSheetController? persistentController; //bool isBottomSheetVisible = false; @@ -365,8 +343,7 @@ class WebViewAppState extends ConsumerState { isDone = true; scaffoldMessengerStateKey.currentState?.showSnackBar( SnackBar( - content: Text( - '${AppLocalizations.of(context)!.file_download}: $filename'), + content: Text('${AppLocalizations.of(context)!.file_download}: $filename'), action: SnackBarAction( label: AppLocalizations.of(context)!.open, onPressed: () { @@ -383,22 +360,19 @@ class WebViewAppState extends ConsumerState { downloadTimer = Timer(const Duration(seconds: 1), () { // Show the persistent bottom sheet if not already shown if (!isDone) { - persistentController = - _scaffoldKey.currentState!.showBottomSheet((context) { + persistentController = _scaffoldKey.currentState!.showBottomSheet((context) { return Container( width: MediaQuery.of(context).size.width, height: 100, color: const Color(0xff313033), child: Padding( - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 16), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "${AppLocalizations.of(context)!.downloading}...", - style: const TextStyle( - fontWeight: FontWeight.bold, color: Colors.white), + style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.white), ), Stack( alignment: Alignment.center,