Remove the room list notification count feature flag.

The room list now always shows the unread notification count for highlighted rooms
and the app icon badge always uses the SDK's own unread notification count, both in
the app and in the NSE. The push payload's unread count is no longer used, so its
UNNotificationContent helper and user info key have been removed along with the
setting, its developer options toggle and the feature-disabled unit test.
This commit is contained in:
Stefan Ceriu
2026-09-23 10:00:18 +03:00
parent 2e7d78ea01
commit 8572150b70
21 changed files with 24 additions and 78 deletions
@@ -31,7 +31,6 @@ nonisolated protocol CommonSettingsProtocol: AnyObject, Sendable {
var enableOnlySignedDeviceIsolationMode: Bool { get }
var threadsEnabled: Bool { get }
var hideQuietNotificationAlerts: Bool { get }
var roomListNotificationCountEnabled: Bool { get }
}
nonisolated enum AppBuildType {
@@ -358,9 +357,6 @@ final nonisolated class AppSettings: @unchecked Sendable {
@UserPreference(defaultValue: RoomListActivityVisibility.current)
var roomListActivityVisibility: RoomListActivityVisibility
@UserPreference(defaultValue: false)
var roomListNotificationCountEnabled: Bool
// MARK: - Search Screen
/// The queries the user searched for and the rooms they opened from the results, most recent first.
@@ -29,10 +29,6 @@ nonisolated extension UNNotificationContent {
@objc var threadRootEventID: String? {
userInfo[NotificationConstants.UserInfoKey.threadRootEventIdentifier] as? String
}
var unreadCount: Int? {
userInfo[NotificationConstants.UserInfoKey.unreadCount] as? Int
}
}
nonisolated extension UNMutableNotificationContent {
@@ -106,8 +106,6 @@ struct HomeScreenViewState: BindableState {
var roomListActivityVisibility: RoomListActivityVisibility = .current
var roomListNotificationCountEnabled = false
var reportRoomEnabled = false
var shouldShowSpaceFilters = false
@@ -120,10 +120,6 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
}
.store(in: &cancellables)
appSettings.roomListNotificationCountEnabledPublisher
.weakAssign(to: \.state.roomListNotificationCountEnabled, on: self)
.store(in: &cancellables)
appSettings.seenInvitesPublisher
.removeDuplicates()
.sink { [weak self] _ in
@@ -16,7 +16,6 @@ struct HomeScreenRoomCell: View {
let room: HomeScreenRoom
var roomListActivityVisibility: RoomListActivityVisibility = .current
var roomListNotificationCountEnabled = false
let isSelected: Bool
let mediaProvider: MediaProviderProtocol!
let action: (HomeScreenViewAction) -> Void
@@ -158,7 +157,7 @@ struct HomeScreenRoomCell: View {
}
if room.badges.isDotShown {
if roomListNotificationCountEnabled, room.isHighlighted, room.badges.notificationCount > 0 {
if room.isHighlighted, room.badges.notificationCount > 0 {
Text(formattedNotificationCount)
.font(.compound.bodySMSemibold)
.foregroundColor(.compound.textOnSolidPrimary)
@@ -255,7 +254,7 @@ struct HomeScreenRoomCell_Previews: PreviewProvider, TestablePreview {
VStack(spacing: 0) {
ForEach(notificationsStateRooms) { room in
HomeScreenRoomCell(room: room, roomListNotificationCountEnabled: true, isSelected: false, mediaProvider: MediaProviderMock(.init())) { _ in }
HomeScreenRoomCell(room: room, isSelected: false, mediaProvider: MediaProviderMock(.init())) { _ in }
}
}
.previewLayout(.sizeThatFits)
@@ -37,7 +37,6 @@ struct HomeScreenRoomList: View {
HomeScreenRoomCell(room: room,
roomListActivityVisibility: context.viewState.roomListActivityVisibility,
roomListNotificationCountEnabled: context.viewState.roomListNotificationCountEnabled,
isSelected: isSelected,
mediaProvider: context.mediaProvider,
action: context.send)
@@ -58,7 +58,6 @@ protocol DeveloperOptionsProtocol: AnyObject {
var focusEventOnNotificationTap: Bool { get set }
var roomListActivityVisibility: RoomListActivityVisibility { get set }
var roomListNotificationCountEnabled: Bool { get set }
var elementCallBaseURLOverride: URL? { get set }
var fuzzyRoomListSearchEnabled: Bool { get set }
@@ -67,11 +67,6 @@ struct DeveloperOptionsScreen: View {
}
}
Toggle(isOn: $context.roomListNotificationCountEnabled) {
Text("Show unread notification count")
Text("Also makes the app icon badge use the SDK's own unread notification count")
}
Toggle(isOn: $context.fuzzyRoomListSearchEnabled) {
Text("Fuzzy searching")
}
@@ -159,7 +159,7 @@ final class NotificationManager: NSObject, NotificationManagerProtocol {
}
func updateAppBadgeCount() async {
guard let userSession, appSettings.roomListNotificationCountEnabled else { return }
guard let userSession else { return }
let badgeCount = Int(userSession.clientProxy.totalUnreadNotifications)
@@ -13,7 +13,6 @@ nonisolated enum NotificationConstants {
static let roomIdentifier = "room_id"
static let eventIdentifier = "event_id"
static let threadRootEventIdentifier = "thread_root_event_id"
static let unreadCount = "unread_count"
static let pusherNotificationClientIdentifier = "pusher_notification_client_identifier"
static let receiverIdentifier = "receiver_id"
}
+5 -21
View File
@@ -45,12 +45,6 @@ nonisolated class NotificationHandler {
func processEvent(_ eventID: String, roomID: String) async {
MXLog.info("\(tag) Processing event: \(eventID) in room: \(roomID)")
if !settings.roomListNotificationCountEnabled {
// Copy over the unread information provided by the push payload to the notification badge.
notificationContent.badge = notificationContent.unreadCount as NSNumber?
MXLog.info("\(tag) New badge value: \(notificationContent.badge?.stringValue ?? "nil")")
}
guard let notificationItemProxy = await userSession.notificationItemProxy(roomID: roomID, eventID: eventID) else {
MXLog.error("\(tag) Failed retrieving notification item")
discardNotification()
@@ -84,12 +78,8 @@ nonisolated class NotificationHandler {
// MARK: - Private
private func deliverNotification() {
if settings.roomListNotificationCountEnabled {
notificationContent.badge = NSNumber(value: incrementBadgeCount())
MXLog.info("\(tag) Delivering notification, new badge value: \(settings.lastKnownBadgeCount)")
} else {
MXLog.info("\(tag) Delivering notification")
}
notificationContent.badge = NSNumber(value: incrementBadgeCount())
MXLog.info("\(tag) Delivering notification, new badge value: \(settings.lastKnownBadgeCount)")
contentHandler(notificationContent)
}
@@ -109,12 +99,8 @@ nonisolated class NotificationHandler {
MXLog.info("\(tag) Discarding notification")
let content = UNMutableNotificationContent()
if settings.roomListNotificationCountEnabled {
// Nothing new is shown to the user, so leave the badge where the app last put it.
content.badge = NSNumber(value: settings.lastKnownBadgeCount)
} else {
content.badge = notificationContent.unreadCount as NSNumber?
}
// Nothing new is shown to the user, so leave the badge where the app last put it.
content.badge = NSNumber(value: settings.lastKnownBadgeCount)
MXLog.info("\(tag) New badge value: \(content.badge?.stringValue ?? "nil")")
contentHandler(content)
@@ -149,9 +135,7 @@ nonisolated class NotificationHandler {
if let targetNotification = deliveredNotifications.first(where: { $0.request.content.eventID == redactedEventID }) {
UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [targetNotification.request.identifier])
if settings.roomListNotificationCountEnabled {
settings.lastKnownBadgeCount = max(0, settings.lastKnownBadgeCount - 1)
}
settings.lastKnownBadgeCount = max(0, settings.lastKnownBadgeCount - 1)
}
return .processedShouldDiscard
@@ -258,9 +258,6 @@ actor NotificationServiceExtensionActor {
let content = UNMutableNotificationContent()
content.body = L10n.notificationReceivedWhileOfflineIos
if !settings.roomListNotificationCountEnabled {
content.badge = originalRequest.content.unreadCount as NSNumber?
}
content.sound = settings.notificationSound
let request = UNNotificationRequest(identifier: Self.receivedWhileOfflineNotificationID, content: content, trigger: nil)
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c02bce898b1b152d033925056fbc6988aa26586e51c72a197f451a8fee6d6165
size 287212
oid sha256:15fb653a9ebbf242796ea7f0642f593a97319565b2229b453f770c17955f4000
size 288822
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d6d245a8f330678b0cce10db60408839e0f6a7bbf3e8d0f1e4c4413311485b79
size 297921
oid sha256:995e5af4bcddb8930735d9e309f128ac0d39bea8fbff7f1113848071cbc6defe
size 299527
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:21900e354eb87dacdb3eb86c8ea6cc89ca3ca5440360d72857027d3a42f75b7d
size 203557
oid sha256:29555629f6c361e8e83c0db0d3ef1dfd63db303ce0078da41f3244969902cc9a
size 204586
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9618c5743c9f49ea3f59238f9a8aef209275461954be2ab7faa8d6caadf4da3f
size 209937
oid sha256:7577f36308b256e7748f2e322a20e9b1152b70a6c3ffb02abf2a7d69af5dc432
size 210956
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:28e5f6a36ceb714001a8dfc51197bad50537e2d1be2a273485964db6d6133fa5
size 242420
oid sha256:b84d846ceee7c653ae220d774cec99ae83fa5ff2ee116ffcb3d8d706a59ef26c
size 244002
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:99d7a5ca6e985e9b3ce8954428db7f4d1d7f312112e26c2837976edb921c33d3
size 248146
oid sha256:ac03aa9dc61d69183dc984c4469d1b53d312c3eba30bb28cb72db072446862cb
size 249780
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7ad39875aa0432eee1f1518b6dcf42b8283ea4cbc8b2b4249d22e455932f27be
size 180646
oid sha256:02f165e945006870b6b483a9ab8539c044813397f036773a3ed87451d41e4843
size 181783
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:eb914d10c111af3dbd32174ea39fef5efd4d419d94af122c531e58f6acffc327
size 184978
oid sha256:529579d75acd5f8cde370ddfcaef7a45102904031d28674fcf7fb2471403b7a9
size 186112
@@ -240,7 +240,6 @@ final class NotificationManagerTests {
@Test
func updatingAppBadgeCountUsesTheClientSideCount() async {
appSettings.roomListNotificationCountEnabled = true
clientProxy.totalUnreadNotifications = 7
await notificationManager.updateAppBadgeCount()
@@ -251,23 +250,12 @@ final class NotificationManagerTests {
@Test
func updatingAppBadgeCountWithoutASessionDoesNothing() async {
appSettings.roomListNotificationCountEnabled = true
notificationManager.setUserSession(nil)
await notificationManager.updateAppBadgeCount()
#expect(!notificationCenter.setBadgeCountCalled)
}
@Test
func updatingAppBadgeCountWithFeatureDisabledDoesNothing() async {
appSettings.roomListNotificationCountEnabled = false
clientProxy.totalUnreadNotifications = 7
await notificationManager.updateAppBadgeCount()
#expect(!notificationCenter.setBadgeCountCalled)
}
}
extension NotificationManagerTests: @MainActor NotificationManagerDelegate {