Merge pull request #382 from mpretty-cyro/fix/notifications-for-current-convo-incorrectly-shown

Fixed an issue where notifications are incorrectly shown for the current conversation
pull/1061/head
Morgan Pretty 7 months ago committed by GitHub
commit 8f222e9b7c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -7,54 +7,49 @@ import SessionUtilitiesKit
public extension UIViewController { public extension UIViewController {
func findFrontMostViewController(ignoringAlerts: Bool) -> UIViewController { func findFrontMostViewController(ignoringAlerts: Bool) -> UIViewController {
var visitedViewControllers: [UIViewController] = [] var visitedViewControllers: [UIViewController] = []
var viewController: UIViewController = self var viewController: UIViewController = self
while true { while true {
visitedViewControllers.append(viewController) visitedViewControllers.append(viewController)
var nextViewController: UIViewController? = viewController.presentedViewController func shouldSkipController(_ controller: UIViewController) -> Bool {
return ignoringAlerts && controller is UIAlertController
if
let topBannerController: TopBannerController = nextViewController as? TopBannerController,
!topBannerController.children.isEmpty
{
nextViewController = (
topBannerController.children[0].presentedViewController ??
topBannerController.children[0]
)
} }
if let nextViewController: UIViewController = nextViewController { func tryAdvance(to next: UIViewController) -> Bool {
if !ignoringAlerts || !(nextViewController is UIAlertController) { guard !shouldSkipController(next) else { return false }
if visitedViewControllers.contains(nextViewController) { guard !visitedViewControllers.contains(next) else { return false } // Loop prevention
// Cycle detected
return viewController viewController = next
} return true
viewController = nextViewController
continue
}
} }
if let navController: UINavigationController = viewController as? UINavigationController { // Check if current viewController is an alert we should ignore
nextViewController = navController.topViewController guard !shouldSkipController(viewController) else { break }
if let nextViewController: UIViewController = nextViewController { // Handle TopBannerController
if !ignoringAlerts || !(nextViewController is UIAlertController) { if let topBanner: TopBannerController = viewController as? TopBannerController, !topBanner.children.isEmpty {
if visitedViewControllers.contains(nextViewController) { let child: UIViewController = topBanner.children[0]
// Cycle detected let next: UIViewController = (child.presentedViewController ?? child)
return viewController
}
viewController = nextViewController
continue
}
}
break guard tryAdvance(to: next) else { break }
continue
}
// Handle presented view controller
if let presented: UIViewController = viewController.presentedViewController {
guard tryAdvance(to: presented) else { break }
continue
}
// Handle navigation controller
if let navController = viewController as? UINavigationController,
let topViewController = navController.topViewController {
guard tryAdvance(to: topViewController) else { break }
continue
} }
// No more view controllers to traverse
break break
} }

Loading…
Cancel
Save