From 028e5639221f789c5cd85f7010c668a1a38139d3 Mon Sep 17 00:00:00 2001 From: primozratej Date: Sat, 19 Aug 2023 08:52:02 +0200 Subject: [PATCH 1/3] Handle unregisterFcmDevice message --- lib/models/channel_message.dart | 3 +- lib/pages/opener.dart | 1 - lib/pages/web_view.dart | 82 +++++++++++++++++++-------------- 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/lib/models/channel_message.dart b/lib/models/channel_message.dart index 28cfde1..c59f639 100644 --- a/lib/models/channel_message.dart +++ b/lib/models/channel_message.dart @@ -2,7 +2,7 @@ import 'dart:convert'; part 'channel_message.g.dart'; -enum ChannelAction { showOpener, hideOpener, registerFcmDevice, updateNotificationCount, none } +enum ChannelAction { showOpener, hideOpener, registerFcmDevice, unregisterFcmDevice, updateNotificationCount, none } class ChannelMessage { final String type; @@ -12,6 +12,7 @@ class ChannelMessage { if (type == "showOpener") return ChannelAction.showOpener; if (type == "hideOpener") return ChannelAction.hideOpener; if (type == "registerFcmDevice") return ChannelAction.registerFcmDevice; + if (type == "unregisterFcmDevice") return ChannelAction.registerFcmDevice; if (type == "updateNotificationCount") return ChannelAction.updateNotificationCount; return ChannelAction.none; diff --git a/lib/pages/opener.dart b/lib/pages/opener.dart index 90cca81..8cfac8d 100644 --- a/lib/pages/opener.dart +++ b/lib/pages/opener.dart @@ -137,7 +137,6 @@ class OpenerState extends ConsumerState with SingleTickerProviderStateMi child: TextButton( onPressed: () async { await controlLer.initHumHub(); - setState(() {}); if (controlLer.allOk) { ref.read(humHubProvider).getInstance().then((value) { Navigator.pushNamed(ref.context, WebViewApp.path, arguments: value.manifest); diff --git a/lib/pages/web_view.dart b/lib/pages/web_view.dart index 0b7f171..2187309 100644 --- a/lib/pages/web_view.dart +++ b/lib/pages/web_view.dart @@ -129,41 +129,7 @@ class WebViewAppState extends ConsumerState { onPostMessage: (inMessage, sourceOrigin, isMainFrame, replyProxy) async { logInfo(inMessage); ChannelMessage message = ChannelMessage.fromJson(inMessage!); - switch (message.action) { - case ChannelAction.showOpener: - ref.read(humHubProvider).setIsHideOpener(false); - ref.read(humHubProvider).clearSafeStorage(); - Navigator.of(context).pushNamedAndRemoveUntil(Opener.path, (Route route) => false); - break; - case ChannelAction.hideOpener: - ref.read(humHubProvider).setIsHideOpener(true); - ref.read(humHubProvider).setHash(HumHub.generateHash(32)); - break; - case ChannelAction.registerFcmDevice: - 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); - // Works but it blinks because new navigation request is called on dart level. - /*RegisterPushInAppBrowser(request: request).register();*/ - - // Works but for admin to see the changes it need to reload a page because a request is called on separate instance. - headlessWebView = HeadlessInAppWebView(onWebViewCreated: (controller) { - controller.postUrl(url: request.url!, postData: postData); - }); - headlessWebView!.run(); - } - var status = await Permission.notification.status; - // status.isDenied: The user has previously denied the notification permission - // !status.isGranted: The user has never been asked for the notification permission - if (status.isDenied || !status.isGranted) askForNotificationPermissions(); - break; - case ChannelAction.updateNotificationCount: - if (message.count != null) FlutterAppBadger.updateBadgeCount(message.count!); - break; - case ChannelAction.none: - break; - } + await _handleJSMessage(message); }, ), ); @@ -265,6 +231,52 @@ class WebViewAppState extends ConsumerState { log(jsResponse != null ? jsResponse.toString() : "Script returned null value"); } + Future _handleJSMessage(ChannelMessage message) async { + switch (message.action) { + case ChannelAction.showOpener: + ref.read(humHubProvider).setIsHideOpener(false); + ref.read(humHubProvider).clearSafeStorage(); + Navigator.of(context).pushNamedAndRemoveUntil(Opener.path, (Route route) => false); + break; + case ChannelAction.hideOpener: + ref.read(humHubProvider).setIsHideOpener(true); + ref.read(humHubProvider).setHash(HumHub.generateHash(32)); + break; + case ChannelAction.registerFcmDevice: + 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); + headlessWebView = HeadlessInAppWebView(onWebViewCreated: (controller) { + controller.loadUrl(urlRequest: request); + }); + headlessWebView!.run(); + } + var status = await Permission.notification.status; + // status.isDenied: The user has previously denied the notification permission + // !status.isGranted: The user has never been asked for the notification permission + if (status.isDenied || !status.isGranted) askForNotificationPermissions(); + break; + case ChannelAction.updateNotificationCount: + if (message.count != null) FlutterAppBadger.updateBadgeCount(message.count!); + break; + case ChannelAction.unregisterFcmDevice: + 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); + // Works but for admin to see the changes it need to reload a page because a request is called on separate instance. + headlessWebView = HeadlessInAppWebView(onWebViewCreated: (controller) { + controller.loadUrl(urlRequest: request); + }); + headlessWebView!.run(); + } + break; + case ChannelAction.none: + break; + } + } + @override void dispose() { super.dispose(); From c0ebfa4c6ca2ea3ae4f55ffd1ffa4dd56669aff4 Mon Sep 17 00:00:00 2001 From: primozratej Date: Tue, 22 Aug 2023 21:53:23 +0200 Subject: [PATCH 2/3] Set unregisterFcmDevice action --- lib/models/channel_message.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/models/channel_message.dart b/lib/models/channel_message.dart index c59f639..cc4dec2 100644 --- a/lib/models/channel_message.dart +++ b/lib/models/channel_message.dart @@ -12,7 +12,7 @@ class ChannelMessage { if (type == "showOpener") return ChannelAction.showOpener; if (type == "hideOpener") return ChannelAction.hideOpener; if (type == "registerFcmDevice") return ChannelAction.registerFcmDevice; - if (type == "unregisterFcmDevice") return ChannelAction.registerFcmDevice; + if (type == "unregisterFcmDevice") return ChannelAction.unregisterFcmDevice; if (type == "updateNotificationCount") return ChannelAction.updateNotificationCount; return ChannelAction.none; From 1adf91c23648becd72d904c903a86476ab6fc729 Mon Sep 17 00:00:00 2001 From: primozratej Date: Wed, 23 Aug 2023 11:16:28 +0200 Subject: [PATCH 3/3] trigger in correct order, while unawaited --- lib/pages/web_view.dart | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/pages/web_view.dart b/lib/pages/web_view.dart index 2187309..ed0bfdb 100644 --- a/lib/pages/web_view.dart +++ b/lib/pages/web_view.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:convert'; import 'dart:developer'; import 'dart:io'; @@ -123,13 +124,15 @@ class WebViewAppState extends ConsumerState { } _onWebViewCreated(InAppWebViewController controller) async { + headlessWebView = HeadlessInAppWebView(); + headlessWebView!.run(); await controller.addWebMessageListener( WebMessageListener( jsObjectName: "flutterChannel", onPostMessage: (inMessage, sourceOrigin, isMainFrame, replyProxy) async { logInfo(inMessage); ChannelMessage message = ChannelMessage.fromJson(inMessage!); - await _handleJSMessage(message); + await _handleJSMessage(message, headlessWebView!); }, ), ); @@ -231,7 +234,7 @@ class WebViewAppState extends ConsumerState { log(jsResponse != null ? jsResponse.toString() : "Script returned null value"); } - Future _handleJSMessage(ChannelMessage message) async { + Future _handleJSMessage(ChannelMessage message, HeadlessInAppWebView headlessWebView) async { switch (message.action) { case ChannelAction.showOpener: ref.read(humHubProvider).setIsHideOpener(false); @@ -247,10 +250,7 @@ class WebViewAppState extends ConsumerState { if (token != null) { var postData = Uint8List.fromList(utf8.encode("token=$token")); URLRequest request = URLRequest(url: Uri.parse(message.url!), method: "POST", body: postData); - headlessWebView = HeadlessInAppWebView(onWebViewCreated: (controller) { - controller.loadUrl(urlRequest: request); - }); - headlessWebView!.run(); + await headlessWebView.webViewController.loadUrl(urlRequest: request); } var status = await Permission.notification.status; // status.isDenied: The user has previously denied the notification permission @@ -266,10 +266,7 @@ class WebViewAppState extends ConsumerState { var postData = Uint8List.fromList(utf8.encode("token=$token")); URLRequest request = URLRequest(url: Uri.parse(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. - headlessWebView = HeadlessInAppWebView(onWebViewCreated: (controller) { - controller.loadUrl(urlRequest: request); - }); - headlessWebView!.run(); + await headlessWebView.webViewController.loadUrl(urlRequest: request); } break; case ChannelAction.none: