From e42140b26fe496a7cbc662addb60b135b8bc9e03 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Sat, 6 Apr 2024 14:06:43 +0200 Subject: [PATCH] duplicate app-icon badge counter to chat's tab-bar-item both badge counters will show the same number in the same layout. if notifications are disabled, both counters are hidden (the badges beside chats stay) in practise, this feels totally normal and correctly, this behavior is known from many other apps on iOS. this also resets the counter on app start, maybe fixing some rare bugs where the counter is wrong on the app icon --- deltachat-ios/AppDelegate.swift | 1 + .../Settings/SettingsViewController.swift | 2 +- deltachat-ios/Coordinator/AppCoordinator.swift | 3 ++- deltachat-ios/Helper/NotificationManager.swift | 18 ++++++++++++++---- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/deltachat-ios/AppDelegate.swift b/deltachat-ios/AppDelegate.swift index 9c8ff3cf7..d73d50b9d 100644 --- a/deltachat-ios/AppDelegate.swift +++ b/deltachat-ios/AppDelegate.swift @@ -284,6 +284,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD logger.info("➡️ applicationDidBecomeActive") UserDefaults.setMainIoRunning() applicationInForeground = true + NotificationManager.updateBadgeCounters() } func applicationWillResignActive(_: UIApplication) { diff --git a/deltachat-ios/Controller/Settings/SettingsViewController.swift b/deltachat-ios/Controller/Settings/SettingsViewController.swift index c1244c369..afa687f86 100644 --- a/deltachat-ios/Controller/Settings/SettingsViewController.swift +++ b/deltachat-ios/Controller/Settings/SettingsViewController.swift @@ -246,7 +246,7 @@ internal final class SettingsViewController: UITableViewController { NotificationManager.removeAllNotifications() } UserDefaults.standard.synchronize() - NotificationManager.updateApplicationIconBadge(forceZero: !sender.isOn) + NotificationManager.updateBadgeCounters(disable: !sender.isOn) } // MARK: - updates diff --git a/deltachat-ios/Coordinator/AppCoordinator.swift b/deltachat-ios/Coordinator/AppCoordinator.swift index d4db67a57..214d6da60 100644 --- a/deltachat-ios/Coordinator/AppCoordinator.swift +++ b/deltachat-ios/Coordinator/AppCoordinator.swift @@ -230,7 +230,7 @@ class AppCoordinator: NSObject { // the applicationIconBadgeNumber is remembered by the system even on reinstalls (just tested on ios 13.3.1), // to avoid appearing an old number of a previous installation, we reset the counter manually. // but even when this changes in ios, we need the reset as we allow account-deletion also in-app. - NotificationManager.updateApplicationIconBadge(forceZero: true) + NotificationManager.updateBadgeCounters(disable: true) } func presentTabBarController() { @@ -271,6 +271,7 @@ class AppCoordinator: NSObject { createChatsNavigationController(), createSettingsNavigationController()], animated: false) presentTabBarController() + NotificationManager.updateBadgeCounters() } } diff --git a/deltachat-ios/Helper/NotificationManager.swift b/deltachat-ios/Helper/NotificationManager.swift index e9161cf89..7cad69c41 100644 --- a/deltachat-ios/Helper/NotificationManager.swift +++ b/deltachat-ios/Helper/NotificationManager.swift @@ -22,9 +22,19 @@ public class NotificationManager { dcContext = dcAccounts.getSelected() } - public static func updateApplicationIconBadge(forceZero: Bool = false) { + public static func updateBadgeCounters(disable: Bool = false) { DispatchQueue.main.async { - UIApplication.shared.applicationIconBadgeNumber = forceZero ? 0 : DcAccounts.shared.getFreshMessageCount() + let number = disable ? 0 : DcAccounts.shared.getFreshMessageCount() + + // update badge counter on iOS homescreen + UIApplication.shared.applicationIconBadgeNumber = number + + // update badge counter on our tabbar + if let appDelegate = UIApplication.shared.delegate as? AppDelegate, + let appCoordinator = appDelegate.appCoordinator, + let chatsNavigationController = appCoordinator.tabBarController.viewControllers?[appCoordinator.chatsTab] { + chatsNavigationController.tabBarItem.badgeValue = number > 0 ? "\(number)" : nil + } } } @@ -55,7 +65,7 @@ public class NotificationManager { nc.removeDeliveredNotifications(withIdentifiers: toRemove) } - NotificationManager.updateApplicationIconBadge() + NotificationManager.updateBadgeCounters() } } @@ -65,7 +75,7 @@ public class NotificationManager { object: nil, queue: OperationQueue.main ) { _ in if !UserDefaults.standard.bool(forKey: "notifications_disabled") { - NotificationManager.updateApplicationIconBadge() + NotificationManager.updateBadgeCounters() } }