fix: Cancel notifications for read rooms and clear app badge on iOS

pull/498/head
krille-chan 2 years ago
parent a833bbcee5
commit 18b270a15c
No known key found for this signature in database

@ -359,6 +359,9 @@ class ChatController extends State<ChatPageWithRoom> {
_setReadMarkerFuture = timeline.setReadMarker(eventId: eventId).then((_) { _setReadMarkerFuture = timeline.setReadMarker(eventId: eventId).then((_) {
_setReadMarkerFuture = null; _setReadMarkerFuture = null;
}); });
if (eventId == timeline.events.first.eventId) {
Matrix.of(context).backgroundPush?.cancelNotification(roomId);
}
} }
@override @override

@ -25,6 +25,7 @@ import 'dart:ui';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_app_badger/flutter_app_badger.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
@ -114,6 +115,25 @@ class BackgroundPush {
return instance; return instance;
} }
Future<void> cancelNotification(String roomId) async {
Logs().v('Cancel notification for room', roomId);
final id = await mapRoomIdToInt(roomId);
await FlutterLocalNotificationsPlugin().cancel(id);
// Workaround for app icon badge not updating
if (Platform.isIOS) {
final unreadCount = client.rooms
.where((room) => room.isUnreadOrInvited && room.id != roomId)
.length;
if (unreadCount == 0) {
FlutterAppBadger.removeBadge();
} else {
FlutterAppBadger.updateBadgeCount(unreadCount);
}
return;
}
}
StreamSubscription<SyncUpdate>? onRoomSync; StreamSubscription<SyncUpdate>? onRoomSync;
Future<void> setupPusher({ Future<void> setupPusher({
@ -390,26 +410,6 @@ class BackgroundPush {
); );
} }
Future<int> mapRoomIdToInt(String roomId) async {
await _loadIdMap();
int? currentInt;
try {
currentInt = idMap[roomId];
} catch (_) {
currentInt = null;
}
if (currentInt != null) {
return currentInt;
}
var nCurrentInt = 0;
while (idMap.values.contains(currentInt)) {
nCurrentInt++;
}
idMap[roomId] = nCurrentInt;
await store.setItem(SettingKeys.notificationCurrentIds, json.encode(idMap));
return nCurrentInt;
}
bool _clearingPushLock = false; bool _clearingPushLock = false;
Future<void> _onClearingPush({bool getFromServer = true}) async { Future<void> _onClearingPush({bool getFromServer = true}) async {
if (_clearingPushLock) { if (_clearingPushLock) {

@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart';
import 'package:desktop_lifecycle/desktop_lifecycle.dart'; import 'package:desktop_lifecycle/desktop_lifecycle.dart';
import 'package:desktop_notifications/desktop_notifications.dart'; import 'package:desktop_notifications/desktop_notifications.dart';
import 'package:flutter_app_badger/flutter_app_badger.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
@ -33,18 +32,6 @@ extension LocalNotificationsExtension on MatrixState {
} }
if (room.notificationCount == 0) return; if (room.notificationCount == 0) return;
// Workaround for app icon badge not updating
if (Platform.isIOS) {
final unreadCount =
client.rooms.where((room) => room.isUnreadOrInvited).length;
if (unreadCount == 0) {
FlutterAppBadger.removeBadge();
} else {
FlutterAppBadger.updateBadgeCount(unreadCount);
}
return;
}
final event = Event.fromJson(eventUpdate.content, room); final event = Event.fromJson(eventUpdate.content, room);
final title = final title =
room.getLocalizedDisplayname(MatrixLocals(L10n.of(widget.context)!)); room.getLocalizedDisplayname(MatrixLocals(L10n.of(widget.context)!));

Loading…
Cancel
Save