From 7e22d9e900e01dc83715ec0d195309de7d261c93 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 8 May 2018 15:58:32 -0400 Subject: [PATCH] Prevent input toolbar from appearing over camera view, contact view or actionsheet // FREEBIE --- .../src/ViewControllers/ContactsPicker.swift | 18 +++++++++++++++ .../ConversationViewController.m | 22 +++++++++++++++++++ .../MediaGalleryViewController.swift | 5 ++++- 3 files changed, 44 insertions(+), 1 deletion(-) 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 }