From 41aa7eafe3df2fd5fe6a201e2ffd1c3728e39a53 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Mon, 7 May 2018 16:46:39 -0400 Subject: [PATCH] makeKeyAndVisible restores first responder, so no need to track it ourselves. This isn't *quite* as nice for the case when we want to restore a textfield that was active before, but it much more simply covers the more important case that we restore input accessory views after backgrounding/foregrounding. // FREEBIE --- .../ConversationViewController.m | 10 +--- Signal/src/util/OWSWindowManager.m | 50 ++----------------- SignalMessaging/utils/OWSScreenLock.swift | 3 -- 3 files changed, 5 insertions(+), 58 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 278a7986a..c75111968 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -552,15 +552,7 @@ typedef enum : NSUInteger { - (BOOL)canBecomeFirstResponder { - // Normally there'd be no mechanism for us to become first responder while presenting - // another view controller, however due to our screen lock window juggling, a side effect of - // calling `makeKeyAndVisible` is that "last known" first responder is sent "becomeFirstResponder", - // regardless of if it is no longer the top most VC. - if (self.presentedViewController) { - return NO; - } else { - return YES; - } + return YES; } - (nullable UIView *)inputAccessoryView diff --git a/Signal/src/util/OWSWindowManager.m b/Signal/src/util/OWSWindowManager.m index 48e5e7586..e9d8d999a 100644 --- a/Signal/src/util/OWSWindowManager.m +++ b/Signal/src/util/OWSWindowManager.m @@ -67,9 +67,6 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) @property (nonatomic, nullable) UIViewController *callViewController; -@property (nonatomic, nullable) UIResponder *rootWindowResponder; -@property (nonatomic, nullable, weak) UIViewController *rootFrontmostViewController; - @end #pragma mark - @@ -348,37 +345,11 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) DDLogInfo(@"%@ showing root window.", self.logTag); } - BOOL shouldTryToRestoreFirstResponder = self.rootWindow.hidden; - + // By calling makeKeyAndVisible we ensure the rootViewController becomes firt responder. + // In the normal case, that means the SignalViewController will call `becomeFirstResponder` on the vc on top of it's + // navigation stack. [self.rootWindow makeKeyAndVisible]; - // When we hide the block window, try to restore the first - // responder of the root window. - // - // It's important we restore first responder status once the user completes - // In some cases, (RegistrationLock Reminder) it just puts the keyboard back where - // the user needs it, saving them a tap. - // But in the case of an inputAccessoryView, like the ConversationViewController, - // failing to restore firstResponder could hide the input toolbar. - if (shouldTryToRestoreFirstResponder) { - UIViewController *rootFrontmostViewController = - [UIApplication.sharedApplication frontmostViewControllerIgnoringAlerts]; - - DDLogInfo(@"%@ trying to restore self.rootWindowResponder: %@ (%@ ? %@ == %d)", - self.logTag, - self.rootWindowResponder, - [self.rootFrontmostViewController class], - rootFrontmostViewController, - self.rootFrontmostViewController == rootFrontmostViewController); - if (self.rootFrontmostViewController == rootFrontmostViewController) { - [self.rootWindowResponder becomeFirstResponder]; - } else { - [rootFrontmostViewController becomeFirstResponder]; - } - } - - self.rootWindowResponder = nil; - self.rootFrontmostViewController = nil; } - (void)ensureRootWindowHidden @@ -389,17 +360,6 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) DDLogInfo(@"%@ hiding root window.", self.logTag); } - // When we hide the root window, try to capture its first responder and - // current vc before it is hidden. - if (!self.rootWindow.hidden) { - self.rootWindowResponder = [UIResponder currentFirstResponder]; - self.rootFrontmostViewController = [UIApplication.sharedApplication frontmostViewControllerIgnoringAlerts]; - DDLogInfo(@"%@ trying to capture self.rootWindowResponder: %@ (%@)", - self.logTag, - self.rootWindowResponder, - [self.rootFrontmostViewController class]); - } - self.rootWindow.hidden = YES; } @@ -450,7 +410,6 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) } [self.callViewWindow makeKeyAndVisible]; - [self.callViewWindow.rootViewController becomeFirstResponder]; } - (void)ensureCallViewWindowHidden @@ -473,7 +432,7 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) } self.screenBlockingWindow.windowLevel = UIWindowLevel_ScreenBlocking(); - [self.screenBlockingWindow.rootViewController becomeFirstResponder]; + [self.screenBlockingWindow makeKeyAndVisible]; } - (void)ensureScreenBlockWindowHidden @@ -488,7 +447,6 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) // Instead, manipulate its window level to move it in front of // or behind the root window. self.screenBlockingWindow.windowLevel = UIWindowLevel_Background; - [self.screenBlockingWindow resignFirstResponder]; } #pragma mark - Events diff --git a/SignalMessaging/utils/OWSScreenLock.swift b/SignalMessaging/utils/OWSScreenLock.swift index 927e1a64f..f95546666 100644 --- a/SignalMessaging/utils/OWSScreenLock.swift +++ b/SignalMessaging/utils/OWSScreenLock.swift @@ -33,9 +33,6 @@ import LocalAuthentication private let OWSScreenLock_Key_IsScreenLockEnabled = "OWSScreenLock_Key_IsScreenLockEnabled" private let OWSScreenLock_Key_ScreenLockTimeoutSeconds = "OWSScreenLock_Key_ScreenLockTimeoutSeconds" - // We temporarily resign any first responder while the Screen Lock is presented. - weak var firstResponderBeforeLockscreen: UIResponder? - // MARK - Singleton class @objc(sharedManager)