diff --git a/Signal/src/util/OWSWindowManager.m b/Signal/src/util/OWSWindowManager.m index 063f30cf1..8fc9a8faa 100644 --- a/Signal/src/util/OWSWindowManager.m +++ b/Signal/src/util/OWSWindowManager.m @@ -33,10 +33,6 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) return UIWindowLevelStatusBar + 2.f; } -// TODO: Verify that this is the correct height for: -// CallKit, non-CallKit, incoming and outgoing calls. -const int kReturnToCallWindowHeight = 20.f; - @implementation OWSWindowRootViewController - (BOOL)canBecomeFirstResponder @@ -118,6 +114,8 @@ const int kReturnToCallWindowHeight = 20.f; self.returnToCallWindow = [self createReturnToCallWindow:rootWindow]; self.callViewWindow = [self createCallViewWindow:rootWindow]; + [self updateReturnToCallWindowLayout]; + [self ensureWindowState]; } @@ -126,11 +124,15 @@ const int kReturnToCallWindowHeight = 20.f; OWSAssertIsOnMainThread(); OWSAssert(rootWindow); + DDLogVerbose(@"%@ updateReturnToCallWindowLayout", self.logTag); + + CGRect statusBarFrame = UIApplication.sharedApplication.statusBarFrame; + DDLogVerbose(@"%@ statusBarFrame: %@", self.logTag, NSStringFromCGRect(statusBarFrame)); + // "Return to call" should remain at the top of the screen. - // - // TODO: Extend below the status bar. CGRect windowFrame = rootWindow.bounds; - windowFrame.size.height = kReturnToCallWindowHeight; + // Use zero height until updateReturnToCallWindowLayout. + windowFrame.size.height = 0; UIWindow *window = [[UIWindow alloc] initWithFrame:windowFrame]; window.hidden = YES; window.windowLevel = UIWindowLevel_ReturnToCall(); @@ -147,6 +149,7 @@ const int kReturnToCallWindowHeight = 20.f; rootView.userInteractionEnabled = YES; [rootView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(returnToCallWasTapped:)]]; + rootView.layoutMargins = UIEdgeInsetsZero; UILabel *label = [UILabel new]; label.text = NSLocalizedString(@"CALL_WINDOW_RETURN_TO_CALL", @"Label for the 'return to call' banner."); @@ -154,8 +157,11 @@ const int kReturnToCallWindowHeight = 20.f; // System UI doesn't use dynamic type; neither do we. label.font = [UIFont ows_regularFontWithSize:14.f]; [rootView addSubview:label]; - [label autoCenterInSuperview]; - OWSAssert(!self.returnToCallLabel); + + // returnToCallLabel uses manual layout. + // + // TODO: Is there a better way to do this? + label.translatesAutoresizingMaskIntoConstraints = NO; self.returnToCallLabel = label; window.rootViewController = viewController; @@ -163,6 +169,40 @@ const int kReturnToCallWindowHeight = 20.f; return window; } +- (void)updateReturnToCallWindowLayout +{ + OWSAssertIsOnMainThread(); + + CGRect statusBarFrame = UIApplication.sharedApplication.statusBarFrame; + DDLogVerbose(@"%@ statusBarFrame: %@", self.logTag, NSStringFromCGRect(statusBarFrame)); + CGFloat statusBarHeight = statusBarFrame.size.height; + + CGRect windowFrame = self.rootWindow.bounds; + windowFrame.size.height = statusBarHeight + 20.f; + DDLogVerbose(@"%@ windowFrame: %@", self.logTag, NSStringFromCGRect(windowFrame)); + self.returnToCallWindow.frame = windowFrame; + self.returnToCallWindow.rootViewController.view.frame = windowFrame; + + [self.returnToCallLabel sizeToFit]; + CGRect labelFrame = self.returnToCallLabel.frame; + labelFrame.origin.x = floor(windowFrame.size.width - labelFrame.size.width); + self.returnToCallLabel.frame = labelFrame; + + UIView *rootView = self.returnToCallWindow.rootViewController.view; + + [rootView setNeedsLayout]; + [rootView layoutIfNeeded]; + + [self.returnToCallWindow logFrameWithLabel:@"returnToCallWindow"]; + [rootView logFrameWithLabel:@"returnToCallWindow view"]; + for (UIView *subview in rootView.subviews) { + [subview logFrameWithLabel:@"returnToCallWindow subview"]; + + [subview setNeedsLayout]; + [subview layoutIfNeeded]; + } +} + - (UIWindow *)createCallViewWindow:(UIWindow *)rootWindow { OWSAssertIsOnMainThread(); @@ -212,6 +252,8 @@ const int kReturnToCallWindowHeight = 20.f; [self.callNavigationController pushViewController:callViewController animated:NO]; self.isCallViewActive = YES; + [self updateReturnToCallWindowLayout]; + [self ensureWindowState]; } @@ -394,6 +436,8 @@ const int kReturnToCallWindowHeight = 20.f; } self.returnToCallWindow.hidden = NO; + + [self updateReturnToCallWindowLayout]; } - (void)ensureReturnToCallWindowHidden