diff --git a/Signal/ConversationView/CellViews/CVLinkPreviewView.swift b/Signal/ConversationView/CellViews/CVLinkPreviewView.swift index 0aa9df3e50..e2d9989626 100644 --- a/Signal/ConversationView/CellViews/CVLinkPreviewView.swift +++ b/Signal/ConversationView/CellViews/CVLinkPreviewView.swift @@ -62,8 +62,8 @@ class CVLinkPreviewView: ManualStackViewWithLayer { for linkPreview: LinkPreviewState, isIncoming: Bool, ) -> CVLinkPreviewViewAdapter { - if linkPreview.isGroupInviteLink { - return CVLinkPreviewViewAdapterGroupLink(linkPreview: linkPreview, isIncoming: isIncoming) + if linkPreview.isGroupInviteLink || linkPreview.isCallLink { + return CVLinkPreviewViewAdapterSignalLink(linkPreview: linkPreview, isIncoming: isIncoming) } if linkPreview.hasLoadedImageOrBlurHash, sentIsHero(linkPreview: linkPreview) { return CVLinkPreviewViewAdapterLarge(linkPreview: linkPreview, isIncoming: isIncoming) @@ -197,9 +197,9 @@ private class CVLinkPreviewViewAdapter { var rootStackConfig: ManualStackView.Config { ManualStackView.Config( axis: .horizontal, - alignment: .center, - spacing: 8, - layoutMargins: UIEdgeInsets(margin: 12), + alignment: .top, + spacing: 12, + layoutMargins: UIEdgeInsets(margin: 10), ) } @@ -383,7 +383,7 @@ private class CVLinkPreviewViewAdapter { // MARK: - // Does not have domain name. Image is round. -private class CVLinkPreviewViewAdapterGroupLink: CVLinkPreviewViewAdapter { +private class CVLinkPreviewViewAdapterSignalLink: CVLinkPreviewViewAdapter { override func rootStackSubviewInfos( maxWidth: CGFloat, @@ -420,7 +420,7 @@ private class CVLinkPreviewViewAdapterGroupLink: CVLinkPreviewViewAdapter { if linkPreview.hasLoadedImageOrBlurHash { let linkPreviewImageView = linkPreviewView.linkPreviewImageView - if let imageView = linkPreviewImageView.configure(linkPreview: linkPreview, rounding: .circular) { + if let imageView = linkPreviewImageView.configure(linkPreview: linkPreview, cornerStyle: .capsule) { imageView.clipsToBounds = true rootStackSubviews.append(imageView) } else { @@ -437,36 +437,6 @@ private class CVLinkPreviewViewAdapterGroupLink: CVLinkPreviewViewAdapter { return rootStackSubviews } - - // Only title and description. - override func textStackSubviewInfos(maxWidth: CGFloat) -> [ManualStackSubviewInfo] { - var subviewInfos = [ManualStackSubviewInfo]() - - if let labelConfig = sentTitleLabelConfig() { - let labelSize = CVText.measureLabel(config: labelConfig, maxWidth: maxWidth) - subviewInfos.append(labelSize.asManualSubviewInfo) - } - if let labelConfig = sentDescriptionLabelConfig() { - let labelSize = CVText.measureLabel(config: labelConfig, maxWidth: maxWidth) - subviewInfos.append(labelSize.asManualSubviewInfo) - } - - return subviewInfos - } - - // Only title and description. - override func textStackSubviews() -> [CVLabel] { - var subviews = [CVLabel]() - - if let titleLabel = sentTitleLabel() { - subviews.append(titleLabel) - } - if let descriptionLabel = sentDescriptionLabel() { - subviews.append(descriptionLabel) - } - - return subviews - } } // MARK: - @@ -526,7 +496,7 @@ private class CVLinkPreviewViewAdapterLarge: CVLinkPreviewViewAdapter { var rootStackSubviews = [UIView]() let linkPreviewImageView = linkPreviewView.linkPreviewImageView - if let imageView = linkPreviewImageView.configure(linkPreview: linkPreview) { + if let imageView = linkPreviewImageView.configure(linkPreview: linkPreview, cornerStyle: .square) { imageView.clipsToBounds = true rootStackSubviews.append(imageView) } else { @@ -601,7 +571,7 @@ private class CVLinkPreviewViewAdapterCompact: CVLinkPreviewViewAdapter { if linkPreview.hasLoadedImageOrBlurHash { let linkPreviewImageView = linkPreviewView.linkPreviewImageView - if let imageView = linkPreviewImageView.configure(linkPreview: linkPreview) { + if let imageView = linkPreviewImageView.configure(linkPreview: linkPreview, cornerStyle: .rounded(radius: 6)) { imageView.clipsToBounds = true rootStackSubviews.append(imageView) } else { @@ -624,12 +594,13 @@ private class CVLinkPreviewViewAdapterCompact: CVLinkPreviewViewAdapter { private class CVLinkPreviewImageView: ManualLayoutViewWithLayer { - enum Rounding: UInt { - case none - case circular + enum CornerStyle { + case square + case rounded(radius: CGFloat) + case capsule } - var rounding: Rounding = .none { + var cornerStyle: CornerStyle = .square { didSet { updateCornerRounding() } @@ -669,17 +640,20 @@ private class CVLinkPreviewImageView: ManualLayoutViewWithLayer { imageView.reset() iconView.reset() - rounding = .none + cornerStyle = .square isHero = false configurationId = 0 } private func updateCornerRounding() { - switch rounding { - case .none: + switch cornerStyle { + case .square: layer.cornerRadius = 0 - case .circular: + case .rounded(let radius): + layer.cornerRadius = radius + + case .capsule: layer.cornerRadius = bounds.size.smallerAxis / 2 } } @@ -689,7 +663,7 @@ private class CVLinkPreviewImageView: ManualLayoutViewWithLayer { shouldEvacuateInBackground: true, ) - func configure(linkPreview: LinkPreviewState, rounding: Rounding = .none) -> UIView? { + func configure(linkPreview: LinkPreviewState, cornerStyle: CornerStyle) -> UIView? { switch linkPreview.imageState { case .loaded: break @@ -708,7 +682,7 @@ private class CVLinkPreviewImageView: ManualLayoutViewWithLayer { addSubviewToFillSuperviewEdges(imageView) addSubviewToCenterOnSuperview(iconView, size: .square(36)) } - self.rounding = rounding + self.cornerStyle = cornerStyle isHero = CVLinkPreviewView.sentIsHero(linkPreview: linkPreview) let configurationId = Self.configurationIdCounter.increment() self.configurationId = configurationId diff --git a/Signal/ConversationView/LinkPreviewCallLink.swift b/Signal/ConversationView/LinkPreviewCallLink.swift index 20ec39464b..aaaa3ac1b0 100644 --- a/Signal/ConversationView/LinkPreviewCallLink.swift +++ b/Signal/ConversationView/LinkPreviewCallLink.swift @@ -109,7 +109,9 @@ public class LinkPreviewCallLink: LinkPreviewState { } } - public let isGroupInviteLink = false + public var isGroupInviteLink: Bool { false } + + public var isCallLink: Bool { true } } public class CommonCallLinksUI { diff --git a/Signal/ConversationView/LinkPreviewGroupLink.swift b/Signal/ConversationView/LinkPreviewGroupLink.swift index 6cba8bbd01..b0035e6cbd 100644 --- a/Signal/ConversationView/LinkPreviewGroupLink.swift +++ b/Signal/ConversationView/LinkPreviewGroupLink.swift @@ -117,7 +117,9 @@ class LinkPreviewGroupLink: LinkPreviewState { var date: Date? { linkPreview.date } - let isGroupInviteLink = true + var isGroupInviteLink: Bool { true } + + var isCallLink: Bool { false } } // MARK: - diff --git a/SignalUI/LinkPreview/LinkPreviewState.swift b/SignalUI/LinkPreview/LinkPreviewState.swift index 287d96636f..0b63a83877 100644 --- a/SignalUI/LinkPreview/LinkPreviewState.swift +++ b/SignalUI/LinkPreview/LinkPreviewState.swift @@ -49,6 +49,7 @@ public protocol LinkPreviewState: AnyObject { var previewDescription: String? { get } var date: Date? { get } var isGroupInviteLink: Bool { get } + var isCallLink: Bool { get } var conversationStyle: ConversationStyle? { get } } @@ -130,6 +131,8 @@ public class LinkPreviewLoading: LinkPreviewState { } } + public var isCallLink: Bool { false } + public var conversationStyle: ConversationStyle? { nil } } @@ -215,7 +218,9 @@ public class LinkPreviewDraft: LinkPreviewState { public var date: Date? { linkPreviewDraft.date } - public let isGroupInviteLink = false + public var isGroupInviteLink: Bool { false } + + public var isCallLink: Bool { false } public var conversationStyle: ConversationStyle? { nil } } @@ -371,5 +376,7 @@ public class LinkPreviewSent: LinkPreviewState { public var date: Date? { linkPreview.date } - public let isGroupInviteLink = false + public var isGroupInviteLink: Bool { false } + + public var isCallLink: Bool { false } }