Skip to content

Commit

Permalink
Improve clearing push notifications (#266)
Browse files Browse the repository at this point in the history
  • Loading branch information
Airyzz authored Jun 16, 2024
1 parent 947f243 commit 64ede50
Show file tree
Hide file tree
Showing 9 changed files with 55 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ class AndroidNotifier implements Notifier {
onDidReceiveBackgroundNotificationResponse: onBackgroundResponse,
onDidReceiveNotificationResponse: onResponse);

EventBus.onSelectedRoomChanged.stream.listen(onRoomOpened);

if (!isHeadless) {
checkPermission();
}
Expand Down Expand Up @@ -198,11 +196,8 @@ class AndroidNotifier implements Notifier {
return null;
}

void onRoomOpened(Room? room) async {
if (room == null) {
return;
}

@override
Future<void> clearNotifications(Room room) async {
var notifications =
await flutterLocalNotificationsPlugin?.getActiveNotifications();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:commet/client/components/push_notification/android/android_notif
import 'package:commet/client/components/push_notification/notification_content.dart';
import 'package:commet/client/components/push_notification/notification_manager.dart';
import 'package:commet/client/components/push_notification/notifier.dart';
import 'package:commet/client/room.dart';
import 'package:commet/debug/log.dart';
import 'package:commet/main.dart';
import 'package:commet/service/background_service.dart';
Expand Down Expand Up @@ -114,4 +115,9 @@ class FirebasePushNotifier implements Notifier {
Map<String, dynamic>? extraRegistrationData() {
return {"type": "fcm"};
}

@override
Future<void> clearNotifications(Room room) {
return notifier.clearNotifications(room);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:commet/client/components/push_notification/notification_content.
import 'package:commet/client/components/push_notification/notification_manager.dart';
import 'package:commet/client/components/push_notification/notifier.dart';
import 'package:commet/client/components/push_notification/push_notification_component.dart';
import 'package:commet/client/room.dart';
import 'package:commet/debug/log.dart';
import 'package:commet/main.dart';
import 'package:commet/service/background_service.dart';
Expand Down Expand Up @@ -164,4 +165,9 @@ class UnifiedPushNotifier implements Notifier {
Map<String, dynamic>? extraRegistrationData() {
return null;
}

@override
Future<void> clearNotifications(Room room) {
return notifier.clearNotifications(room);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:async';

import 'package:commet/client/components/push_notification/notification_content.dart';
import 'package:commet/client/components/push_notification/notifier.dart';
import 'package:commet/client/room.dart';
import 'package:commet/main.dart';
import 'package:commet/utils/event_bus.dart';
import 'package:commet/utils/image/lod_image.dart';
Expand Down Expand Up @@ -117,4 +118,7 @@ class LinuxNotifier implements Notifier {

@override
bool get needsToken => false;

@override
Future<void> clearNotifications(Room room) async {}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:commet/client/alert.dart';
import 'package:commet/client/client.dart';
import 'package:commet/client/components/push_notification/android/android_notifier.dart';
import 'package:commet/client/components/push_notification/android/firebase_push_notifier.dart';
import 'package:commet/client/components/push_notification/android/unified_push_notifier.dart';
Expand Down Expand Up @@ -90,6 +91,10 @@ class NotificationManager {
_modifiers.remove(modifier);
}

static Future<void> clearNotifications(Room room) async {
await notifier?.clearNotifications(room);
}

static Future<void> notify(NotificationContent notification,
{bool bypassModifiers = false}) async {
if (_notifier == null) return;
Expand Down
3 changes: 3 additions & 0 deletions commet/lib/client/components/push_notification/notifier.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:commet/client/components/push_notification/notification_content.dart';
import 'package:commet/client/room.dart';

abstract class Notifier {
Future<void> notify(NotificationContent notification);
Expand All @@ -16,4 +17,6 @@ abstract class Notifier {
Map<String, dynamic>? extraRegistrationData();

Future<void> init();

Future<void> clearNotifications(Room room);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:io';
import 'package:commet/client/components/push_notification/notification_content.dart';
import 'package:commet/client/components/push_notification/notifier.dart';
import 'package:commet/client/room.dart';
import 'package:commet/main.dart';
import 'package:commet/utils/event_bus.dart';
import 'package:commet/utils/shortcuts_manager.dart';
Expand Down Expand Up @@ -155,4 +156,7 @@ class WindowsNotifier implements Notifier {
Future<String?> getToken() async {
return null;
}

@override
Future<void> clearNotifications(Room room) async {}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:async';

import 'package:commet/client/components/push_notification/notification_manager.dart';
import 'package:commet/client/timeline.dart';
import 'package:commet/ui/molecules/room_timeline_widget/room_timeline_widget_view.dart';
import 'package:flutter/material.dart';
Expand All @@ -20,7 +21,8 @@ class RoomTimelineWidget extends StatefulWidget {
State<RoomTimelineWidget> createState() => _RoomTimelineWidgetState();
}

class _RoomTimelineWidgetState extends State<RoomTimelineWidget> {
class _RoomTimelineWidgetState extends State<RoomTimelineWidget>
with WidgetsBindingObserver {
Future? loadingHistory;

GlobalKey timelineViewKey = GlobalKey();
Expand All @@ -30,25 +32,43 @@ class _RoomTimelineWidgetState extends State<RoomTimelineWidget> {
@override
void initState() {
sub = widget.timeline.onEventAdded.stream.listen(onEventReceived);

WidgetsBinding.instance.addObserver(this);
super.initState();
}

@override
void dispose() {
sub?.cancel();
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}

void onEventReceived(int index) {
if (index == 0) {
var state = timelineViewKey.currentState as RoomTimelineWidgetViewState?;
if (state?.attachedToBottom == true) {
widget.timeline.markAsRead(widget.timeline.events[index]);
markAsRead(widget.timeline.events[index]);
}
}
}

@override
void didChangeAppLifecycleState(AppLifecycleState state) async {
if (state == AppLifecycleState.resumed) {
var state = timelineViewKey.currentState as RoomTimelineWidgetViewState?;
if (state?.attachedToBottom == true) {
markAsRead(widget.timeline.events.first);
}
}

super.didChangeAppLifecycleState(state);
}

Future<void> markAsRead(TimelineEvent event) async {
widget.timeline.markAsRead(event);
NotificationManager.clearNotifications(widget.timeline.room);
}

@override
Widget build(BuildContext context) {
return RoomTimelineWidgetView(
Expand All @@ -59,6 +79,7 @@ class _RoomTimelineWidgetState extends State<RoomTimelineWidget> {
isThreadTimeline: widget.isThreadTimeline,
setReplyingEvent: widget.setReplyingEvent,
setEditingEvent: widget.setEditingEvent,
markAsRead: markAsRead,
);
}

Expand All @@ -85,7 +106,7 @@ class _RoomTimelineWidgetState extends State<RoomTimelineWidget> {

void onAttachedToBottom() {
if (widget.timeline.events.isNotEmpty) {
widget.timeline.markAsRead(widget.timeline.events.first);
markAsRead(widget.timeline.events.first);
}
}

Expand Down
8 changes: 0 additions & 8 deletions commet/lib/ui/organisms/chat/chat_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,19 +52,11 @@ class ChatView extends StatelessWidget {
: RoomTimelineWidget(
key: ValueKey("${state.room.identifier}-timeline"),
timeline: state.timeline!,
// markAsRead: handleMarkAsRead,
setReplyingEvent: (event) => state.setInteractingEvent(event,
type: EventInteractionType.reply),
setEditingEvent: (event) => state.setInteractingEvent(event,
type: EventInteractionType.edit),
isThreadTimeline: state.isThread,
// onThreadOpened: (event) {
// EventBus.openThread.add((
// state.room.client.identifier,
// state.room.identifier,
// event.eventId
// ));
// },
);
}

Expand Down

0 comments on commit 64ede50

Please sign in to comment.