Skip to content

Commit

Permalink
Handle push redirect for flavored web-view
Browse files Browse the repository at this point in the history
  • Loading branch information
PrimozRatej committed May 26, 2024
1 parent d742b8e commit 2d92d2e
Show file tree
Hide file tree
Showing 10 changed files with 43 additions and 28 deletions.
2 changes: 0 additions & 2 deletions lib/app_flavored.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:humhub/flavored/models/humhub.f.dart';
import 'package:humhub/flavored/util/notifications/channel.dart';
import 'package:humhub/flavored/util/router.f.dart';
import 'package:humhub/util/intent/intent_plugin.dart';
import 'package:humhub/util/loading_provider.dart';
Expand All @@ -25,7 +24,6 @@ class FlavoredAppState extends ConsumerState<FlavoredApp> {
return IntentPlugin(
child: NotificationPlugin(
child: PushPlugin(
channel: NotificationChannelF(),
child: OverrideLocale(
builder: (overrideLocale) => Builder(
builder: (context) => MaterialApp(
Expand Down
2 changes: 0 additions & 2 deletions lib/app_opener.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:humhub/util/intent/intent_plugin.dart';
import 'package:humhub/util/loading_provider.dart';
import 'package:humhub/util/notifications/channel.dart';
import 'package:humhub/util/notifications/plugin.dart';
import 'package:humhub/util/override_locale.dart';
import 'package:humhub/util/push/push_plugin.dart';
Expand All @@ -24,7 +23,6 @@ class OpenerAppState extends ConsumerState<OpenerApp> {
return IntentPlugin(
child: NotificationPlugin(
child: PushPlugin(
channel: NotificationChannel(),
child: OverrideLocale(
builder: (overrideLocale) => Builder(
builder: (context) => FutureBuilder<String>(
Expand Down
19 changes: 8 additions & 11 deletions lib/flavored/util/notifications/channel.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import 'package:humhub/pages/web_view.dart';
import 'package:humhub/flavored/util/router.f.dart';
import 'package:humhub/flavored/web_view.f.dart';
import 'package:humhub/util/notifications/channel.dart';
import 'package:humhub/util/notifications/init_from_push.dart';
import 'package:humhub/util/openers/universal_opener_controller.dart';
import 'package:humhub/util/router.dart';

class NotificationChannelF extends NotificationChannel {
NotificationChannelF(
const NotificationChannelF(
{super.id = 'redirect',
super.name = 'Redirect flavored app notifications',
super.description = 'These notifications redirect the user to specific url in a payload.'});
Expand All @@ -15,21 +14,19 @@ class NotificationChannelF extends NotificationChannel {
///
@override
Future<void> onTap(String? payload) async {
if (payload != null && navigatorKey.currentState != null) {
if (payload != null && navigatorKeyF.currentState != null) {
bool isNewRouteSameAsCurrent = false;
navigatorKey.currentState!.popUntil((route) {
if (route.settings.name == WebViewApp.path) {
navigatorKeyF.currentState!.popUntil((route) {
if (route.settings.name == WebViewF.path) {
isNewRouteSameAsCurrent = true;
}
return true;
});
UniversalOpenerController opener = UniversalOpenerController(url: payload);
await opener.initHumHub();
if (isNewRouteSameAsCurrent) {
navigatorKey.currentState!.pushNamed(WebViewApp.path, arguments: opener);
navigatorKeyF.currentState!.pushNamed(WebViewF.path, arguments: payload);
return;
}
navigatorKey.currentState!.pushNamed(WebViewApp.path, arguments: opener);
navigatorKeyF.currentState!.pushNamed(WebViewF.path, arguments: payload);
} else {
if (payload != null) {
InitFromPush.setPayload(payload);
Expand Down
6 changes: 5 additions & 1 deletion lib/flavored/web_view.f.dart
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,12 @@ class FlavoredWebViewState extends ConsumerState<WebViewF> {
}

URLRequest get _initialRequest {
var payload = ModalRoute.of(context)!.settings.arguments;
String? url = instance.manifest.startUrl;
String? payloadFromPush = InitFromPush.usePayload();
String? payloadForInitFromPush = InitFromPush.usePayload();
String? payloadFromPush;
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);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ main() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
await dotenv.load(fileName: ".env");
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).then((_) async {
runApp(ProviderScope(child: await HumHub.app(packageInfo.packageName)));
runApp(ProviderScope(child: HumHub.app(packageInfo.packageName)));
});
}
2 changes: 1 addition & 1 deletion lib/models/hum_hub.dart
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class HumHub {
'x-humhub-app-ostate': isHideOpener ? '1' : '0'
};

static Future<Widget> app(String bundleId) async {
static Widget app(String bundleId) {
switch (bundleId) {
case 'com.humhub.app':
return const OpenerApp();
Expand Down
2 changes: 1 addition & 1 deletion lib/pages/opener.dart
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class OpenerState extends ConsumerState<Opener> with SingleTickerProviderStateMi

String? urlIntent = InitFromIntent.usePayloadForInit();
if (urlIntent != null) {
await NotificationChannel().onTap(urlIntent);
await ref.read(notificationChannelProvider).value!.onTap(urlIntent);
}
});
}
Expand Down
20 changes: 19 additions & 1 deletion lib/util/notifications/channel.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:humhub/flavored/util/notifications/channel.dart';
import 'package:humhub/pages/web_view.dart';
import 'package:humhub/util/notifications/init_from_push.dart';
import 'package:humhub/util/openers/universal_opener_controller.dart';
import 'package:humhub/util/router.dart';
import 'package:package_info_plus/package_info_plus.dart';

class NotificationChannel {
final String id;
final String name;
final String description;

NotificationChannel(
const NotificationChannel(
{this.id = 'redirect',
this.name = 'Redirect app notifications',
this.description = 'These notifications are redirect the user to specific url in a payload.'});
Expand Down Expand Up @@ -38,4 +41,19 @@ class NotificationChannel {
}
}
}

static Future<NotificationChannel> getChannel() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform(); // Replace this with the actual condition logic
switch (packageInfo.packageName) {
case 'com.humhub.app':
return const NotificationChannel();
default:
return const NotificationChannelF();
}
}
}

// Providers for NotificationChannel and NotificationChannelF
final notificationChannelProvider = FutureProvider<NotificationChannel>((ref) {
return NotificationChannel.getChannel();
});
3 changes: 2 additions & 1 deletion lib/util/notifications/service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ class NotificationService {
static void handleNotification(NotificationResponse response) async {
final parsed = response.payload != null ? json.decode(response.payload!) : {};
if (parsed["redirectUrl"] != null) {
await NotificationChannel().onTap(parsed['redirectUrl']);
var channel = await NotificationChannel.getChannel();
channel.onTap(parsed['redirectUrl']);
return;
}
}
Expand Down
13 changes: 6 additions & 7 deletions lib/util/push/push_plugin.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,11 @@ import 'package:loggy/loggy.dart';

class PushPlugin extends ConsumerStatefulWidget {
final Widget child;
final NotificationChannel channel;

const PushPlugin({
const PushPlugin({
Key? key,
required this.child,
required this.channel,
}) : super(key: key);
}) : super(key: key, );

@override
PushPluginState createState() => PushPluginState();
Expand All @@ -44,7 +42,7 @@ class PushPluginState extends ConsumerState<PushPlugin> {
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
logInfo("Firebase messaging onMessageOpenedApp");
final data = PushEvent(message).parsedData;
widget.channel.onTap(data.redirectUrl);
ref.read(notificationChannelProvider).value!.onTap(data.redirectUrl);
});

//When the app is terminated, i.e., app is neither in foreground or background.
Expand All @@ -62,14 +60,15 @@ class PushPluginState extends ConsumerState<PushPlugin> {

@override
void initState() {
ref.read(notificationChannelProvider);
_init();
super.initState();
}

_handleInitialMsg(RemoteMessage message) {
final data = PushEvent(message).parsedData;
if (data.redirectUrl != null) {
widget.channel.onTap(data.redirectUrl);
ref.read(notificationChannelProvider).value!.onTap(data.redirectUrl);
}
}

Expand All @@ -81,7 +80,7 @@ class PushPluginState extends ConsumerState<PushPlugin> {
final body = message.notification?.body;
if (title == null || body == null) return;
await notificationService.showNotification(
widget.channel,
ref.read(notificationChannelProvider).value!,
title,
body,
payload: data.channelPayload,
Expand Down

0 comments on commit 2d92d2e

Please sign in to comment.