diff --git a/Signal/src/ViewControllers/ContactsPicker.swift b/Signal/src/ViewControllers/ContactsPicker.swift index 255c9c9bb..1cdfb030b 100644 --- a/Signal/src/ViewControllers/ContactsPicker.swift +++ b/Signal/src/ViewControllers/ContactsPicker.swift @@ -44,6 +44,24 @@ public class ContactsPicker: OWSViewController, UITableViewDelegate, UITableView return Environment.current().contactsManager } + // HACK: Though we don't have an input accessory view, the VC we are presented above (ConversationVC) does. + // If the app is backgrounded and then foregrounded, when OWSWindowManager calls mainWindow.makeKeyAndVisible + // the ConversationVC's inputAccessoryView will appear *above* us unless we'd previously become first responder. + override public var canBecomeFirstResponder: Bool { + Logger.debug("\(self.logTag) in \(#function)") + return true + } + + override public func becomeFirstResponder() -> Bool { + Logger.debug("\(self.logTag) in \(#function)") + return super.becomeFirstResponder() + } + + override public func resignFirstResponder() -> Bool { + Logger.debug("\(self.logTag) in \(#function)") + return super.resignFirstResponder() + } + private let collation = UILocalizedIndexedCollation.current() private let contactStore = CNContactStore() diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index c75111968..124b404e3 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -596,6 +596,28 @@ typedef enum : NSUInteger { [self markVisibleMessagesAsRead]; [self.cellMediaCache removeAllObjects]; [self cancelReadTimer]; + [self dismissPresentedViewControllerIfNecessary]; +} + +- (void)dismissPresentedViewControllerIfNecessary +{ + UIViewController *_Nullable presentedViewController = self.presentedViewController; + if (!presentedViewController) { + DDLogDebug(@"%@ presentedViewController was nil", self.logTag); + return; + } + + if ([presentedViewController isKindOfClass:[UIAlertController class]]) { + DDLogDebug(@"%@ dismissing presentedViewController: %@", self.logTag, presentedViewController); + [self dismissViewControllerAnimated:NO completion:nil]; + return; + } + + if ([presentedViewController isKindOfClass:[UIImagePickerController class]]) { + DDLogDebug(@"%@ dismissing presentedViewController: %@", self.logTag, presentedViewController); + [self dismissViewControllerAnimated:NO completion:nil]; + return; + } } - (void)viewWillAppear:(BOOL)animated diff --git a/Signal/src/ViewControllers/MediaGalleryViewController.swift b/Signal/src/ViewControllers/MediaGalleryViewController.swift index 2be5f25c0..9d8e47122 100644 --- a/Signal/src/ViewControllers/MediaGalleryViewController.swift +++ b/Signal/src/ViewControllers/MediaGalleryViewController.swift @@ -220,7 +220,10 @@ class MediaGalleryViewController: UINavigationController, MediaGalleryDataSource fatalError("init(coder:) has not been implemented") } - override var canBecomeFirstResponder: Bool { + // HACK: Though we don't have an input accessory view, the VC we are presented above (ConversationVC) does. + // If the app is backgrounded and then foregrounded, when OWSWindowManager calls mainWindow.makeKeyAndVisible + // the ConversationVC's inputAccessoryView will appear *above* us unless we'd previously become first responder. + override public var canBecomeFirstResponder: Bool { Logger.debug("\(self.logTag) in \(#function)") return true }