diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 1156d0376..25d0806d4 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -213,6 +213,7 @@ typedef enum : NSUInteger { @property (nonatomic) BOOL isShowingSearchUI; @property (nonatomic, nullable) MenuActionsViewController *menuActionsViewController; @property (nonatomic) CGFloat extraContentInsetPadding; +@property (nonatomic) CGFloat contentInsetBottom; @end @@ -1262,7 +1263,7 @@ typedef enum : NSUInteger { // until `viewDidDisappear`. - (void)viewWillDisappear:(BOOL)animated { - OWSLogDebug(@"viewWillDisappear"); + OWSLogDebug(@""); [super viewWillDisappear:animated]; @@ -1273,6 +1274,8 @@ typedef enum : NSUInteger { - (void)viewDidDisappear:(BOOL)animated { + OWSLogDebug(@""); + [super viewDidDisappear:animated]; self.userHasScrolled = NO; self.isViewVisible = NO; @@ -3847,18 +3850,26 @@ typedef enum : NSUInteger { UIEdgeInsets oldInsets = self.collectionView.contentInset; UIEdgeInsets newInsets = oldInsets; - // Use a content inset that so that the conversation content - // is not hidden behind the keyboard + input accessory. + // Measures how far the keyboard "intrudes" into the collection view's content region. + // Indicates how large the bottom content inset should be in order to avoid the keyboard + // from hiding the conversation content. // - // Make sure to leave space for the bottom layout guide (the notch). + // NOTE: we can ignore the "bottomLayoutGuide" (i.e. the notch); this will be accounted + // for by the "adjustedContentInset". + CGFloat keyboardContentOverlap + = MAX(0, self.view.height - self.bottomLayoutGuide.length - keyboardEndFrameConverted.origin.y); + + // For the sake of continuity, we want to maintain the same contentInsetBottom when the + // the keyboard/input accessory are hidden, e.g. during dismissal animations, when + // presenting popups like the attachment picker, etc. // - // Always reserve room for the input accessory, which we display even - // if the keyboard is not active. - newInsets.top = 0; - newInsets.bottom = MAX(0, self.view.height - self.bottomLayoutGuide.length - keyboardEndFrameConverted.origin.y); + // Therefore, we only zero out the contentInsetBottom if the inputAccessoryView is nil. + if (self.inputAccessoryView == nil || keyboardContentOverlap > 0) { + self.contentInsetBottom = keyboardContentOverlap; + } - newInsets.top += self.extraContentInsetPadding; - newInsets.bottom += self.extraContentInsetPadding; + newInsets.top = 0 + self.extraContentInsetPadding; + newInsets.bottom = self.contentInsetBottom + self.extraContentInsetPadding; BOOL wasScrolledToBottom = [self isScrolledToBottom]; diff --git a/SignalMessaging/profiles/ProfileFetcherJob.swift b/SignalMessaging/profiles/ProfileFetcherJob.swift index 176729b02..e1608b670 100644 --- a/SignalMessaging/profiles/ProfileFetcherJob.swift +++ b/SignalMessaging/profiles/ProfileFetcherJob.swift @@ -115,7 +115,8 @@ public class ProfileFetcherJob: NSObject { }.catch(on: DispatchQueue.global()) { error in switch error { case ProfileFetcherJobError.throttled(let lastTimeInterval): - Logger.info("skipping updateProfile: \(recipientId), lastTimeInterval: \(lastTimeInterval)") + // skipping + break case let error as SignalServiceProfile.ValidationError: Logger.warn("skipping updateProfile retry. Invalid profile for: \(recipientId) error: \(error)") default: