mirror of
https://github.com/krille-chan/fluffychat
synced 2024-09-10 13:05:11 +00:00
fix: Cancel notifications for read rooms and clear app badge on iOS
This commit is contained in:
parent
a833bbcee5
commit
18b270a15c
3 changed files with 23 additions and 33 deletions
|
@ -359,6 +359,9 @@ class ChatController extends State<ChatPageWithRoom> {
|
|||
_setReadMarkerFuture = timeline.setReadMarker(eventId: eventId).then((_) {
|
||||
_setReadMarkerFuture = null;
|
||||
});
|
||||
if (eventId == timeline.events.first.eventId) {
|
||||
Matrix.of(context).backgroundPush?.cancelNotification(roomId);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -25,6 +25,7 @@ import 'dart:ui';
|
|||
|
||||
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_local_notifications/flutter_local_notifications.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
|
@ -114,6 +115,25 @@ class BackgroundPush {
|
|||
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;
|
||||
|
||||
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;
|
||||
Future<void> _onClearingPush({bool getFromServer = true}) async {
|
||||
if (_clearingPushLock) {
|
||||
|
|
|
@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart';
|
|||
|
||||
import 'package:desktop_lifecycle/desktop_lifecycle.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:http/http.dart' as http;
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
@ -33,18 +32,6 @@ extension LocalNotificationsExtension on MatrixState {
|
|||
}
|
||||
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 title =
|
||||
room.getLocalizedDisplayname(MatrixLocals(L10n.of(widget.context)!));
|
||||
|
|
Loading…
Reference in a new issue