diff --git a/lib/components/register_push_in_app_browser.dart b/lib/components/register_push_in_app_browser.dart index 2707228..8b6bbaf 100644 --- a/lib/components/register_push_in_app_browser.dart +++ b/lib/components/register_push_in_app_browser.dart @@ -2,19 +2,17 @@ import 'package:flutter_inappwebview/flutter_inappwebview.dart'; class RegisterPushInAppBrowser extends InAppBrowser { final URLRequest request; - late InAppBrowserClassOptions options; + late InAppBrowserClassSettings settings; RegisterPushInAppBrowser({required this.request}) { - options = InAppBrowserClassOptions( - crossPlatform: InAppBrowserOptions(hidden: true), - inAppWebViewGroupOptions: InAppWebViewGroupOptions( - crossPlatform: InAppWebViewOptions(javaScriptEnabled: true), - ), + settings = InAppBrowserClassSettings( + browserSettings: InAppBrowserSettings(hidden: true), + webViewSettings: InAppWebViewSettings(javaScriptEnabled: true), ); } Future register() async { - await openUrlRequest(urlRequest: request, options: options); + await openUrlRequest(urlRequest: request, settings: settings); close(); } } diff --git a/lib/flavored/web_view.f.dart b/lib/flavored/web_view.f.dart index 38a4cdb..28d06d5 100644 --- a/lib/flavored/web_view.f.dart +++ b/lib/flavored/web_view.f.dart @@ -49,7 +49,7 @@ class FlavoredWebViewState extends ConsumerState { super.initState(); pullToRefreshController = PullToRefreshController( - options: PullToRefreshOptions( + settings: PullToRefreshSettings( color: HexColor(instance.manifest.themeColor), ), onRefresh: () async { @@ -74,7 +74,7 @@ class FlavoredWebViewState extends ConsumerState { bottom: false, child: InAppWebView( initialUrlRequest: _initialRequest, - initialOptions: _options, + initialSettings: _settings, pullToRefreshController: pullToRefreshController, shouldOverrideUrlLoading: _shouldOverrideUrlLoading, shouldInterceptFetchRequest: _shouldInterceptFetchRequest, @@ -82,7 +82,7 @@ class FlavoredWebViewState extends ConsumerState { onCreateWindow: _onCreateWindow, onLoadStop: _onLoadStop, onLoadStart: _onLoadStart, - onLoadError: _onLoadError, + onReceivedError: _onLoadError, onProgressChanged: _onProgressChanged, ), ), @@ -98,24 +98,18 @@ class FlavoredWebViewState extends ConsumerState { if (payload is String) payloadFromPush = payload; if (payloadForInitFromPush != null) url = payloadForInitFromPush; if (payloadFromPush != null) url = payloadFromPush; - return URLRequest(url: Uri.parse(url), headers: instance.customHeaders); + return URLRequest(url: WebUri(url), headers: instance.customHeaders); } - InAppWebViewGroupOptions get _options => InAppWebViewGroupOptions( - crossPlatform: InAppWebViewOptions( - useShouldOverrideUrlLoading: true, - useShouldInterceptFetchRequest: true, - javaScriptEnabled: true, - supportZoom: false, - javaScriptCanOpenWindowsAutomatically: true, - ), - android: AndroidInAppWebViewOptions( - supportMultipleWindows: true, - useHybridComposition: true, - ), - ios: IOSInAppWebViewOptions( - allowsInlineMediaPlayback: true, - ), + InAppWebViewSettings get _settings => InAppWebViewSettings( + useShouldOverrideUrlLoading: true, + useShouldInterceptFetchRequest: true, + javaScriptEnabled: true, + supportZoom: false, + javaScriptCanOpenWindowsAutomatically: true, + supportMultipleWindows: true, + useHybridComposition: true, + allowsInlineMediaPlayback: true, ); Future _shouldOverrideUrlLoading( @@ -129,8 +123,8 @@ class FlavoredWebViewState extends ConsumerState { } // 2nd Append customHeader if url is in app redirect and CANCEL the requests without custom headers if (Platform.isAndroid || - action.iosWKNavigationType == IOSWKNavigationType.LINK_ACTIVATED || - action.iosWKNavigationType == IOSWKNavigationType.FORM_SUBMITTED) { + action.navigationType == NavigationType.LINK_ACTIVATED || + action.navigationType == NavigationType.FORM_SUBMITTED) { Map mergedMap = {...instance.customHeaders, ...?action.request.headers}; URLRequest newRequest = action.request.copyWith(headers: mergedMap); controller.loadUrl(urlRequest: newRequest); @@ -147,7 +141,7 @@ class FlavoredWebViewState extends ConsumerState { WebMessageListener( jsObjectName: "flutterChannel", onPostMessage: (inMessage, sourceOrigin, isMainFrame, replyProxy) async { - ChannelMessage message = ChannelMessage.fromJson(inMessage!); + ChannelMessage message = ChannelMessage.fromJson(inMessage!.data); await _handleJSMessage(message, headlessWebView!); }, ), @@ -191,8 +185,9 @@ class FlavoredWebViewState extends ConsumerState { _setAjaxHeadersJQuery(controller); } - void _onLoadError(InAppWebViewController controller, Uri? url, int code, String message) async { - if (code == -1009) ShowDialog.of(context).noInternetPopup(); + void _onLoadError(InAppWebViewController controller, WebResourceRequest request, + WebResourceError error) async { + if (error.description == 'net::ERR_INTERNET_DISCONNECTED') ShowDialog.of(context).noInternetPopup(); pullToRefreshController.endRefreshing(); setState(() {}); } @@ -221,7 +216,7 @@ class FlavoredWebViewState extends ConsumerState { String? token = ref.read(pushTokenProvider).value; if (token != null) { var postData = Uint8List.fromList(utf8.encode("token=$token")); - await headlessWebView.webViewController.postUrl(url: Uri.parse(message.url!), postData: postData); + await headlessWebView.webViewController?.postUrl(url: WebUri(message.url!), postData: postData); } var status = await Permission.notification.status; // status.isDenied: The user has previously denied the notification permission @@ -237,9 +232,9 @@ class FlavoredWebViewState extends ConsumerState { String? token = ref.read(pushTokenProvider).value; if (token != null) { var postData = Uint8List.fromList(utf8.encode("token=$token")); - URLRequest request = URLRequest(url: Uri.parse(message.url!), method: "POST", body: postData); + URLRequest request = URLRequest(url: WebUri(message.url!), method: "POST", body: postData); // Works but for admin to see the changes it need to reload a page because a request is called on separate instance. - await headlessWebView.webViewController.loadUrl(urlRequest: request); + await headlessWebView.webViewController?.loadUrl(urlRequest: request); } break; default: diff --git a/lib/pages/web_view.dart b/lib/pages/web_view.dart index 087bde4..44ff5cc 100644 --- a/lib/pages/web_view.dart +++ b/lib/pages/web_view.dart @@ -40,17 +40,13 @@ class WebViewAppState extends ConsumerState { late AuthInAppBrowser authBrowser; late Manifest manifest; late URLRequest _initialRequest; - final _options = InAppWebViewGroupOptions( - crossPlatform: InAppWebViewOptions( - useShouldOverrideUrlLoading: true, - useShouldInterceptFetchRequest: true, - javaScriptEnabled: true, - supportZoom: false, - javaScriptCanOpenWindowsAutomatically: true, - ), - android: AndroidInAppWebViewOptions( - supportMultipleWindows: true, - ), + final _settings = InAppWebViewSettings( + useShouldOverrideUrlLoading: true, + useShouldInterceptFetchRequest: true, + javaScriptEnabled: true, + supportZoom: false, + javaScriptCanOpenWindowsAutomatically: true, + supportMultipleWindows: true, ); late PullToRefreshController _pullToRefreshController; @@ -63,7 +59,7 @@ class WebViewAppState extends ConsumerState { SchedulerBinding.instance.addPostFrameCallback((_) { _initialRequest = _initRequest; _pullToRefreshController = PullToRefreshController( - options: PullToRefreshOptions( + settings: PullToRefreshSettings( color: HexColor(manifest.themeColor), ), onRefresh: () async { @@ -96,7 +92,7 @@ class WebViewAppState extends ConsumerState { bottom: false, child: InAppWebView( initialUrlRequest: _initialRequest, - initialOptions: _options, + initialSettings: _settings, pullToRefreshController: _pullToRefreshController, shouldOverrideUrlLoading: _shouldOverrideUrlLoading, onWebViewCreated: _onWebViewCreated, @@ -121,8 +117,9 @@ class WebViewAppState extends ConsumerState { _setAjaxHeadersJQuery(controller); }, onProgressChanged: _onProgressChanged, - onLoadError: (InAppWebViewController controller, Uri? url, int code, String message) { - if (code == -1009) NoConnectionDialog.show(context); + onReceivedError: (InAppWebViewController controller, WebResourceRequest request, + WebResourceError error) { + if (error.description == 'net::ERR_INTERNET_DISCONNECTED') NoConnectionDialog.show(context); }, ), ), @@ -141,8 +138,8 @@ class WebViewAppState extends ConsumerState { } // 2nd Append customHeader if url is in app redirect and CANCEL the requests without custom headers if (Platform.isAndroid || - action.iosWKNavigationType == IOSWKNavigationType.LINK_ACTIVATED || - action.iosWKNavigationType == IOSWKNavigationType.FORM_SUBMITTED) { + action.navigationType == NavigationType.LINK_ACTIVATED || + action.navigationType == NavigationType.FORM_SUBMITTED) { Map mergedMap = {...?_initialRequest.headers, ...?action.request.headers}; URLRequest newRequest = action.request.copyWith(headers: mergedMap); controller.loadUrl(urlRequest: newRequest); @@ -164,7 +161,7 @@ class WebViewAppState extends ConsumerState { jsObjectName: "flutterChannel", onPostMessage: (inMessage, sourceOrigin, isMainFrame, replyProxy) async { logInfo(inMessage); - ChannelMessage message = ChannelMessage.fromJson(inMessage!); + ChannelMessage message = ChannelMessage.fromJson(inMessage!.data); await _handleJSMessage(message, headlessWebView!); logDebug('flutterChannel triggered: ${message.type}'); }, @@ -201,7 +198,7 @@ class WebViewAppState extends ConsumerState { } String? payloadFromPush = InitFromPush.usePayload(); if (payloadFromPush != null) url = payloadFromPush; - return URLRequest(url: Uri.parse(url ?? manifest.startUrl), headers: ref.read(humHubProvider).customHeaders); + return URLRequest(url: WebUri(url ?? manifest.startUrl), headers: ref.read(humHubProvider).customHeaders); } _onLoadStop(InAppWebViewController controller, Uri? url) { @@ -270,8 +267,8 @@ class WebViewAppState extends ConsumerState { String? token = ref.read(pushTokenProvider).value; if (token != null) { var postData = Uint8List.fromList(utf8.encode("token=$token")); - URLRequest request = URLRequest(url: Uri.parse(message.url!), method: "POST", body: postData); - await headlessWebView.webViewController.loadUrl(urlRequest: request); + URLRequest request = URLRequest(url: WebUri(message.url!), method: "POST", body: postData); + await headlessWebView.webViewController?.loadUrl(urlRequest: request); } var status = await Permission.notification.status; // status.isDenied: The user has previously denied the notification permission @@ -285,9 +282,9 @@ class WebViewAppState extends ConsumerState { String? token = ref.read(pushTokenProvider).value; if (token != null) { var postData = Uint8List.fromList(utf8.encode("token=$token")); - URLRequest request = URLRequest(url: Uri.parse(message.url!), method: "POST", body: postData); + URLRequest request = URLRequest(url: WebUri(message.url!), method: "POST", body: postData); // Works but for admin to see the changes it need to reload a page because a request is called on separate instance. - await headlessWebView.webViewController.loadUrl(urlRequest: request); + await headlessWebView.webViewController?.loadUrl(urlRequest: request); } break; case ChannelAction.none: diff --git a/lib/util/auth_in_app_browser.dart b/lib/util/auth_in_app_browser.dart index 00e50e0..88f6d65 100644 --- a/lib/util/auth_in_app_browser.dart +++ b/lib/util/auth_in_app_browser.dart @@ -6,24 +6,22 @@ import 'package:loggy/loggy.dart'; class AuthInAppBrowser extends InAppBrowser { final Manifest manifest; - late InAppBrowserClassOptions options; + late InAppBrowserClassSettings settings; final Function concludeAuth; static const String userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'; AuthInAppBrowser({required this.manifest, required this.concludeAuth}) { - options = InAppBrowserClassOptions( - crossPlatform: InAppBrowserOptions( + settings = InAppBrowserClassSettings( + browserSettings: InAppBrowserSettings( hideUrlBar: false, toolbarTopBackgroundColor: HexColor(manifest.themeColor), ), - inAppWebViewGroupOptions: InAppWebViewGroupOptions( - crossPlatform: InAppWebViewOptions( - javaScriptEnabled: true, - useShouldOverrideUrlLoading: true, - userAgent: userAgent, - applicationNameForUserAgent: 'HumHub-Mobile'), - ), + webViewSettings: InAppWebViewSettings( + javaScriptEnabled: true, + useShouldOverrideUrlLoading: true, + userAgent: userAgent, + applicationNameForUserAgent: 'HumHub-Mobile'), ); } @@ -39,6 +37,6 @@ class AuthInAppBrowser extends InAppBrowser { } launchUrl(URLRequest urlRequest) { - openUrlRequest(urlRequest: urlRequest, options: options); + openUrlRequest(urlRequest: urlRequest, settings: settings); } } diff --git a/lib/util/extensions.dart b/lib/util/extensions.dart index 524afc8..67a3af2 100644 --- a/lib/util/extensions.dart +++ b/lib/util/extensions.dart @@ -41,34 +41,34 @@ extension FutureAsyncValueX on Future> { extension URLRequestExtension on URLRequest { URLRequest copyWith({ - Uri? url, + WebUri? url, String? method, Uint8List? body, Map? headers, bool? iosAllowsCellularAccess, bool? iosAllowsConstrainedNetworkAccess, bool? iosAllowsExpensiveNetworkAccess, - IOSURLRequestCachePolicy? iosCachePolicy, + URLRequestCachePolicy? iosCachePolicy, bool? iosHttpShouldHandleCookies, bool? iosHttpShouldUsePipelining, - IOSURLRequestNetworkServiceType? iosNetworkServiceType, + URLRequestNetworkServiceType? iosNetworkServiceType, double? iosTimeoutInterval, - Uri? iosMainDocumentURL, + WebUri? iosMainDocumentURL, }) { return URLRequest( url: url ?? this.url, method: method ?? this.method, headers: headers ?? this.headers, body: body ?? this.body, - iosAllowsCellularAccess: iosAllowsCellularAccess ?? this.iosAllowsCellularAccess, - iosAllowsConstrainedNetworkAccess: iosAllowsConstrainedNetworkAccess ?? this.iosAllowsConstrainedNetworkAccess, - iosAllowsExpensiveNetworkAccess: iosAllowsExpensiveNetworkAccess ?? this.iosAllowsExpensiveNetworkAccess, - iosCachePolicy: iosCachePolicy ?? this.iosCachePolicy, - iosHttpShouldHandleCookies: iosHttpShouldHandleCookies ?? this.iosHttpShouldHandleCookies, - iosHttpShouldUsePipelining: iosHttpShouldUsePipelining ?? this.iosHttpShouldUsePipelining, - iosNetworkServiceType: iosNetworkServiceType ?? this.iosNetworkServiceType, - iosTimeoutInterval: iosTimeoutInterval ?? this.iosTimeoutInterval, - iosMainDocumentURL: iosMainDocumentURL ?? this.iosMainDocumentURL, + allowsCellularAccess: iosAllowsCellularAccess ?? allowsCellularAccess, + allowsConstrainedNetworkAccess: iosAllowsConstrainedNetworkAccess ?? allowsConstrainedNetworkAccess, + allowsExpensiveNetworkAccess: iosAllowsExpensiveNetworkAccess ?? allowsExpensiveNetworkAccess, + cachePolicy: iosCachePolicy, + httpShouldHandleCookies: iosHttpShouldHandleCookies ?? httpShouldHandleCookies, + httpShouldUsePipelining: iosHttpShouldUsePipelining ?? httpShouldUsePipelining, + networkServiceType: iosNetworkServiceType, + timeoutInterval: iosTimeoutInterval, + mainDocumentURL: iosMainDocumentURL, ); } } diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 974d4d1..d04284f 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,6 +9,7 @@ import connectivity_plus import firebase_core import firebase_messaging import flutter_app_badger +import flutter_inappwebview_macos import flutter_local_notifications import flutter_native_timezone import flutter_secure_storage_macos @@ -21,6 +22,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) FlutterAppBadgerPlugin.register(with: registry.registrar(forPlugin: "FlutterAppBadgerPlugin")) + InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterNativeTimezonePlugin.register(with: registry.registrar(forPlugin: "FlutterNativeTimezonePlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) diff --git a/pubspec.lock b/pubspec.lock index 5c38660..2dba991 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -290,10 +290,58 @@ packages: dependency: "direct main" description: name: flutter_inappwebview - sha256: d198297060d116b94048301ee6749cd2e7d03c1f2689783f52d210a6b7aba350 + sha256: "3e9a443a18ecef966fb930c3a76ca5ab6a7aafc0c7b5e14a4a850cf107b09959" url: "https://pub.dev" source: hosted - version: "5.8.0" + version: "6.0.0" + flutter_inappwebview_android: + dependency: transitive + description: + name: flutter_inappwebview_android + sha256: d247f6ed417f1f8c364612fa05a2ecba7f775c8d0c044c1d3b9ee33a6515c421 + url: "https://pub.dev" + source: hosted + version: "1.0.13" + flutter_inappwebview_internal_annotations: + dependency: transitive + description: + name: flutter_inappwebview_internal_annotations + sha256: "5f80fd30e208ddded7dbbcd0d569e7995f9f63d45ea3f548d8dd4c0b473fb4c8" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter_inappwebview_ios: + dependency: transitive + description: + name: flutter_inappwebview_ios + sha256: f363577208b97b10b319cd0c428555cd8493e88b468019a8c5635a0e4312bd0f + url: "https://pub.dev" + source: hosted + version: "1.0.13" + flutter_inappwebview_macos: + dependency: transitive + description: + name: flutter_inappwebview_macos + sha256: b55b9e506c549ce88e26580351d2c71d54f4825901666bd6cfa4be9415bb2636 + url: "https://pub.dev" + source: hosted + version: "1.0.11" + flutter_inappwebview_platform_interface: + dependency: transitive + description: + name: flutter_inappwebview_platform_interface + sha256: "545fd4c25a07d2775f7d5af05a979b2cac4fbf79393b0a7f5d33ba39ba4f6187" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + flutter_inappwebview_web: + dependency: transitive + description: + name: flutter_inappwebview_web + sha256: d8c680abfb6fec71609a700199635d38a744df0febd5544c5a020bd73de8ee07 + url: "https://pub.dev" + source: hosted + version: "1.0.8" flutter_lints: dependency: "direct dev" description: @@ -665,10 +713,10 @@ packages: dependency: transitive description: name: plugin_platform_interface - sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.8" process: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index d57756f..3767337 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,7 +41,7 @@ dependencies: flutter_riverpod: ^2.1.3 permission_handler: ^11.3.1 flutter_secure_storage: ^7.0.1 - flutter_inappwebview: ^5.8.0 + flutter_inappwebview: ^6.0.0 receive_sharing_intent: ^1.4.5 package_info_plus: ^3.0.3 uni_links: ^0.5.1