From ae61b44a99d1c8adfb8b6c715bebfb1ccf6532c7 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 16 Apr 2018 19:01:00 -0400 Subject: [PATCH] Resolve conflict between keyboard and call view. --- .../ViewControllers/CallViewController.swift | 12 +++++++++ Signal/src/util/OWSScreenLockUI.m | 25 ++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/Signal/src/ViewControllers/CallViewController.swift b/Signal/src/ViewControllers/CallViewController.swift index 552898052..492306df3 100644 --- a/Signal/src/ViewControllers/CallViewController.swift +++ b/Signal/src/ViewControllers/CallViewController.swift @@ -71,6 +71,10 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver, weak var remoteVideoTrack: RTCVideoTrack? var localVideoConstraints: [NSLayoutConstraint] = [] + override public var canBecomeFirstResponder: Bool { + return true + } + var shouldRemoteVideoControlsBeHidden = false { didSet { updateCallUI(callState: call.state) @@ -174,6 +178,14 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver, super.viewWillAppear(animated) UIDevice.current.isProximityMonitoringEnabled = true updateCallUI(callState: call.state) + + self.becomeFirstResponder() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + self.becomeFirstResponder() } override func loadView() { diff --git a/Signal/src/util/OWSScreenLockUI.m b/Signal/src/util/OWSScreenLockUI.m index a1f2ecb21..d32fbf1f7 100644 --- a/Signal/src/util/OWSScreenLockUI.m +++ b/Signal/src/util/OWSScreenLockUI.m @@ -78,6 +78,7 @@ const UIWindowLevel UIWindowLevel_Background = -1.f; @property (nonatomic) UIWindow *rootWindow; @property (nonatomic, nullable) UIResponder *rootWindowResponder; +@property (nonatomic, nullable, weak) UIViewController *rootFrontmostViewController; @end @@ -485,7 +486,11 @@ const UIWindowLevel UIWindowLevel_Background = -1.f; // When we hide the root window, its first responder will resign. if (shouldShowBlockWindow && !self.rootWindow.hidden) { self.rootWindowResponder = [UIResponder currentFirstResponder]; - DDLogInfo(@"%@ trying to capture self.rootWindowResponder: %@", self.logTag, self.rootWindowResponder); + self.rootFrontmostViewController = [UIApplication.sharedApplication frontmostViewControllerIgnoringAlerts]; + DDLogInfo(@"%@ trying to capture self.rootWindowResponder: %@ (%@)", + self.logTag, + self.rootWindowResponder, + [self.rootFrontmostViewController class]); } // * Show/hide the app's root window as necessary. @@ -508,11 +513,25 @@ const UIWindowLevel UIWindowLevel_Background = -1.f; // 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. - DDLogInfo(@"%@ trying to restore self.rootWindowResponder: %@", self.logTag, self.rootWindowResponder); - [self.rootWindowResponder becomeFirstResponder]; + + 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]; + } self.rootWindowResponder = nil; + self.rootFrontmostViewController = nil; } + self.screenBlockingImageView.hidden = !shouldShowBlockWindow; + UIView *rootView = self.screenBlockingViewController.view; [NSLayoutConstraint deactivateConstraints:self.screenBlockingConstraints];