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
pull/1/head
Michael Kirk 8 years ago
parent 882098e9cb
commit 41aa7eafe3

@ -552,15 +552,7 @@ typedef enum : NSUInteger {
- (BOOL)canBecomeFirstResponder - (BOOL)canBecomeFirstResponder
{ {
// Normally there'd be no mechanism for us to become first responder while presenting return YES;
// 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;
}
} }
- (nullable UIView *)inputAccessoryView - (nullable UIView *)inputAccessoryView

@ -67,9 +67,6 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void)
@property (nonatomic, nullable) UIViewController *callViewController; @property (nonatomic, nullable) UIViewController *callViewController;
@property (nonatomic, nullable) UIResponder *rootWindowResponder;
@property (nonatomic, nullable, weak) UIViewController *rootFrontmostViewController;
@end @end
#pragma mark - #pragma mark -
@ -348,37 +345,11 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void)
DDLogInfo(@"%@ showing root window.", self.logTag); 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]; [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 - (void)ensureRootWindowHidden
@ -389,17 +360,6 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void)
DDLogInfo(@"%@ hiding root window.", self.logTag); 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; self.rootWindow.hidden = YES;
} }
@ -450,7 +410,6 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void)
} }
[self.callViewWindow makeKeyAndVisible]; [self.callViewWindow makeKeyAndVisible];
[self.callViewWindow.rootViewController becomeFirstResponder];
} }
- (void)ensureCallViewWindowHidden - (void)ensureCallViewWindowHidden
@ -473,7 +432,7 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void)
} }
self.screenBlockingWindow.windowLevel = UIWindowLevel_ScreenBlocking(); self.screenBlockingWindow.windowLevel = UIWindowLevel_ScreenBlocking();
[self.screenBlockingWindow.rootViewController becomeFirstResponder]; [self.screenBlockingWindow makeKeyAndVisible];
} }
- (void)ensureScreenBlockWindowHidden - (void)ensureScreenBlockWindowHidden
@ -488,7 +447,6 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void)
// Instead, manipulate its window level to move it in front of // Instead, manipulate its window level to move it in front of
// or behind the root window. // or behind the root window.
self.screenBlockingWindow.windowLevel = UIWindowLevel_Background; self.screenBlockingWindow.windowLevel = UIWindowLevel_Background;
[self.screenBlockingWindow resignFirstResponder];
} }
#pragma mark - Events #pragma mark - Events

@ -33,9 +33,6 @@ import LocalAuthentication
private let OWSScreenLock_Key_IsScreenLockEnabled = "OWSScreenLock_Key_IsScreenLockEnabled" private let OWSScreenLock_Key_IsScreenLockEnabled = "OWSScreenLock_Key_IsScreenLockEnabled"
private let OWSScreenLock_Key_ScreenLockTimeoutSeconds = "OWSScreenLock_Key_ScreenLockTimeoutSeconds" 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 // MARK - Singleton class
@objc(sharedManager) @objc(sharedManager)

Loading…
Cancel
Save