diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index a3711d52b..9923c666f 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -2541,6 +2541,8 @@ 340FC89A204DAC8D007AEB0F /* OWSConversationSettingsViewController.m */, 340FC899204DAC8D007AEB0F /* OWSConversationSettingsViewDelegate.h */, B84A89BB25DE328A0040017D /* ProfilePictureVC.swift */, + 3427C64120F500DE00EEC730 /* OWSMessageTimerView.h */, + 3427C64220F500DF00EEC730 /* OWSMessageTimerView.m */, ); path = Settings; sourceTree = ""; @@ -3009,8 +3011,6 @@ 348570A620F67574004FF32B /* OWSMessageHeaderView.m */, 34DBF000206BD5A400025978 /* OWSMessageTextView.h */, 34DBEFFF206BD5A400025978 /* OWSMessageTextView.m */, - 3427C64120F500DE00EEC730 /* OWSMessageTimerView.h */, - 3427C64220F500DF00EEC730 /* OWSMessageTimerView.m */, 34277A5D20751BDC006049F2 /* OWSQuotedMessageView.h */, 34277A5C20751BDC006049F2 /* OWSQuotedMessageView.m */, 34D1F0A51F867BFC0066283D /* OWSSystemMessageCell.h */, diff --git a/Session/Conversations V2/ConversationVC.swift b/Session/Conversations V2/ConversationVC.swift index 4bfd798ec..f6f2f364d 100644 --- a/Session/Conversations V2/ConversationVC.swift +++ b/Session/Conversations V2/ConversationVC.swift @@ -1,12 +1,12 @@ // TODO -// • Disappearing messages timer // • Brendan no likey buttons above text field // • Slight paging glitch // • Image detail VC transition glitch // • Photo rounding // • Scroll button behind mentions view // • Remaining search glitchiness +// • Rethink disappearing messages timer positioning final class ConversationVC : BaseVC, ConversationViewModelDelegate, OWSConversationSettingsViewDelegate, ConversationSearchControllerDelegate, UITableViewDataSource, UITableViewDelegate { let thread: TSThread diff --git a/Session/Conversations V2/Message Cells/VisibleMessageCell.swift b/Session/Conversations V2/Message Cells/VisibleMessageCell.swift index f79f631d8..0f541ef6a 100644 --- a/Session/Conversations V2/Message Cells/VisibleMessageCell.swift +++ b/Session/Conversations V2/Message Cells/VisibleMessageCell.swift @@ -18,6 +18,8 @@ final class VisibleMessageCell : MessageCell, LinkPreviewViewV2Delegate { private lazy var messageStatusImageViewTopConstraint = messageStatusImageView.pin(.top, to: .bottom, of: bubbleView, withInset: 0) private lazy var messageStatusImageViewWidthConstraint = messageStatusImageView.set(.width, to: VisibleMessageCell.messageStatusImageViewSize) private lazy var messageStatusImageViewHeightConstraint = messageStatusImageView.set(.height, to: VisibleMessageCell.messageStatusImageViewSize) + private lazy var timerViewOutgoingMessageConstraint = timerView.pin(.right, to: .left, of: bubbleView, withInset: -Values.mediumSpacing) + private lazy var timerViewIncomingMessageConstraint = timerView.pin(.left, to: .right, of: bubbleView, withInset: Values.mediumSpacing) private lazy var panGestureRecognizer: UIPanGestureRecognizer = { let result = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) @@ -109,6 +111,8 @@ final class VisibleMessageCell : MessageCell, LinkPreviewViewV2Delegate { return result }() + private lazy var timerView = OWSMessageTimerView() + // MARK: Settings private static let messageStatusImageViewSize: CGFloat = 16 private static let authorLabelBottomSpacing: CGFloat = 4 @@ -164,6 +168,10 @@ final class VisibleMessageCell : MessageCell, LinkPreviewViewV2Delegate { bubbleViewLeftConstraint1.isActive = true bubbleViewTopConstraint.isActive = true bubbleViewRightConstraint1.isActive = true + // Timer view + addSubview(timerView) + timerView.center(.vertical, in: bubbleView) + timerViewOutgoingMessageConstraint.isActive = true // Content view bubbleView.addSubview(snContentView) snContentView.pin(to: bubbleView) @@ -255,6 +263,15 @@ final class VisibleMessageCell : MessageCell, LinkPreviewViewV2Delegate { [ messageStatusImageViewWidthConstraint, messageStatusImageViewHeightConstraint ].forEach { $0.constant = (messageStatusImageView.isHidden) ? 0 : VisibleMessageCell.messageStatusImageViewSize } + // Timer + if viewItem.isExpiringMessage { + let expirationTimestamp = message.expiresAt + let expiresInSeconds = message.expiresInSeconds + timerView.configure(withExpirationTimestamp: expirationTimestamp, initialDurationSeconds: expiresInSeconds, tintColor: Colors.text) + } + timerView.isHidden = !viewItem.isExpiringMessage + timerViewOutgoingMessageConstraint.isActive = (direction == .outgoing) + timerViewIncomingMessageConstraint.isActive = (direction == .incoming) } private func populateHeader(for viewItem: ConversationViewItem) { @@ -365,6 +382,7 @@ final class VisibleMessageCell : MessageCell, LinkPreviewViewV2Delegate { let viewsToMove = [ bubbleView, profilePictureView, replyButton ] viewsToMove.forEach { $0.transform = .identity } replyButton.alpha = 0 + timerView.prepareForReuse() } // MARK: Interaction diff --git a/Session/Conversations/Views & Cells/OWSMessageTimerView.h b/Session/Conversations V2/Settings/OWSMessageTimerView.h similarity index 100% rename from Session/Conversations/Views & Cells/OWSMessageTimerView.h rename to Session/Conversations V2/Settings/OWSMessageTimerView.h diff --git a/Session/Conversations/Views & Cells/OWSMessageTimerView.m b/Session/Conversations V2/Settings/OWSMessageTimerView.m similarity index 100% rename from Session/Conversations/Views & Cells/OWSMessageTimerView.m rename to Session/Conversations V2/Settings/OWSMessageTimerView.m diff --git a/Session/Meta/Signal-Bridging-Header.h b/Session/Meta/Signal-Bridging-Header.h index 3f81f443b..6bdb6eaa8 100644 --- a/Session/Meta/Signal-Bridging-Header.h +++ b/Session/Meta/Signal-Bridging-Header.h @@ -30,6 +30,7 @@ #import "OWSDatabaseMigration.h" #import "OWSMessageBubbleView.h" #import "OWSMessageCell.h" +#import "OWSMessageTimerView.h" #import "OWSNavigationController.h" #import "OWSProgressView.h" #import "OWSQuotedMessageView.h"