Skip to content

Commit 51c72de

Browse files
committed
notif: Ignore notifications for logged out accounts
Fixes: #1264
1 parent 44df81f commit 51c72de

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

lib/model/actions.dart

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:async';
22

3+
import '../notifications/display.dart';
34
import '../notifications/receive.dart';
45
import 'store.dart';
56

@@ -11,6 +12,8 @@ Future<void> logOutAccount(GlobalStore globalStore, int accountId) async {
1112
// Unawaited, to not block removing the account on this request.
1213
unawaited(unregisterToken(globalStore, accountId));
1314

15+
await NotificationDisplayManager.removeNotificationsForAccount(account.realmUrl, account.userId);
16+
1417
await globalStore.removeAccount(accountId);
1518
}
1619

lib/notifications/display.dart

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'dart:async';
22
import 'dart:io';
33

4-
import 'package:http/http.dart' as http;
54
import 'package:collection/collection.dart';
65
import 'package:flutter/foundation.dart';
76
import 'package:flutter/widgets.dart' hide Notification;
7+
import 'package:http/http.dart' as http;
88

99
import '../api/model/model.dart';
1010
import '../api/notifications.dart';
@@ -234,6 +234,13 @@ class NotificationDisplayManager {
234234
final groupKey = _groupKey(data);
235235
final conversationKey = _conversationKey(data, groupKey);
236236

237+
final globalStore = await ZulipBinding.instance.getGlobalStore();
238+
final account = globalStore.accounts.firstWhereOrNull((account) =>
239+
account.realmUrl == data.realmUrl && account.userId == data.userId);
240+
if (account == null) {
241+
return;
242+
}
243+
237244
final oldMessagingStyle = await _androidHost
238245
.getActiveNotificationMessagingStyleByTag(conversationKey);
239246

@@ -518,6 +525,16 @@ class NotificationDisplayManager {
518525
}
519526
return null;
520527
}
528+
529+
static Future<void> removeNotificationsForAccount(Uri realmUri, int userId) async {
530+
final groupKey = "$realmUri|$userId";
531+
final activeNotifications = await _androidHost.getActiveNotifications(desiredExtras: [kExtraLastZulipMessageId]);
532+
for (final statusBarNotification in activeNotifications) {
533+
if (statusBarNotification.notification.group == groupKey) {
534+
await _androidHost.cancel(tag: statusBarNotification.tag, id: statusBarNotification.id);
535+
}
536+
}
537+
}
521538
}
522539

523540
/// The information contained in 'zulip://notification/…' internal

test/notifications/display_test.dart

+15-1
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ import 'package:zulip/widgets/message_list.dart';
2626
import 'package:zulip/widgets/page.dart';
2727
import 'package:zulip/widgets/theme.dart';
2828

29+
import '../example_data.dart' as eg;
2930
import '../fake_async.dart';
3031
import '../model/binding.dart';
31-
import '../example_data.dart' as eg;
3232
import '../model/narrow_checks.dart';
3333
import '../stdlib_checks.dart';
3434
import '../test_images.dart';
@@ -955,6 +955,20 @@ void main() {
955955
receiveFcmMessage(async, removeFcmMessage([message2], account: account2));
956956
check(testBinding.androidNotificationHost.activeNotifications).isEmpty();
957957
})));
958+
959+
test('removeNotificationsForAccount removes notifications', () => runWithHttpClient(() => awaitFakeAsync((async) async {
960+
await init();
961+
final message = eg.dmMessage(from: eg.otherUser, to: [eg.selfUser]);
962+
963+
await checkNotifications(async, messageFcmMessage(message),
964+
expectedIsGroupConversation: false,
965+
expectedTitle: eg.otherUser.fullName,
966+
expectedTagComponent: 'dm:${message.allRecipientIds.join(",")}');
967+
968+
check(testBinding.androidNotificationHost.activeNotifications).isNotEmpty();
969+
await NotificationDisplayManager.removeNotificationsForAccount(eg.selfAccount.realmUrl, eg.selfAccount.userId);
970+
check(testBinding.androidNotificationHost.activeNotifications).isEmpty();
971+
})));
958972
});
959973

960974
group('NotificationDisplayManager open', () {

0 commit comments

Comments
 (0)