session-ios/Session/Signal/ConversationView/Cells/TypingIndicatorCell.swift

150 lines
5.4 KiB
Swift

//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
import Foundation
@objc(OWSTypingIndicatorCell)
public class TypingIndicatorCell: ConversationViewCell {
@objc
public static let cellReuseIdentifier = "TypingIndicatorCell"
@available(*, unavailable, message:"use other constructor instead.")
@objc
public required init(coder aDecoder: NSCoder) {
notImplemented()
}
private let kAvatarSize: CGFloat = 36
private let kAvatarHSpacing: CGFloat = 8
// private let avatarView = AvatarImageView()
private let bubbleView = OWSBubbleView()
private let typingIndicatorView = TypingIndicatorView()
private var viewConstraints = [NSLayoutConstraint]()
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
private func commonInit() {
self.layoutMargins = .zero
self.contentView.layoutMargins = .zero
bubbleView.layoutMargins = .zero
bubbleView.addSubview(typingIndicatorView)
contentView.addSubview(bubbleView)
// avatarView.autoSetDimension(.width, toSize: kAvatarSize)
// avatarView.autoSetDimension(.height, toSize: kAvatarSize)
}
@objc
public override func loadForDisplay() {
guard let conversationStyle = self.conversationStyle else {
owsFailDebug("Missing conversationStyle")
return
}
bubbleView.bubbleColor = conversationStyle.bubbleColor(isIncoming: true)
typingIndicatorView.startAnimation()
viewConstraints.append(contentsOf: [
bubbleView.autoPinEdge(toSuperviewEdge: .leading, withInset: conversationStyle.gutterLeading),
bubbleView.autoPinEdge(toSuperviewEdge: .trailing, withInset: conversationStyle.gutterTrailing, relation: .greaterThanOrEqual),
bubbleView.autoPinTopToSuperviewMargin(withInset: 0),
bubbleView.autoPinBottomToSuperviewMargin(withInset: 0),
typingIndicatorView.autoPinEdge(toSuperviewEdge: .leading, withInset: conversationStyle.textInsetHorizontal),
typingIndicatorView.autoPinEdge(toSuperviewEdge: .trailing, withInset: conversationStyle.textInsetHorizontal),
typingIndicatorView.autoPinTopToSuperviewMargin(withInset: conversationStyle.textInsetTop),
typingIndicatorView.autoPinBottomToSuperviewMargin(withInset: conversationStyle.textInsetBottom)
])
// if let avatarView = configureAvatarView() {
// contentView.addSubview(avatarView)
// viewConstraints.append(contentsOf: [
// bubbleView.autoPinLeading(toTrailingEdgeOf: avatarView, offset: kAvatarHSpacing),
// bubbleView.autoAlignAxis(.horizontal, toSameAxisOf: avatarView)
// ])
//
// } else {
// avatarView.removeFromSuperview()
// }
}
private func configureAvatarView() -> UIView? {
guard let viewItem = self.viewItem else {
owsFailDebug("Missing viewItem")
return nil
}
guard let typingIndicators = viewItem.interaction as? TypingIndicatorInteraction else {
owsFailDebug("Missing typingIndicators")
return nil
}
guard shouldShowAvatar() else {
return nil
}
guard let colorName = viewItem.authorConversationColorName else {
owsFailDebug("Missing authorConversationColorName")
return nil
}
// guard let authorAvatarImage =
// OWSContactAvatarBuilder(signalId: typingIndicators.recipientId,
// colorName: ConversationColorName(rawValue: colorName),
// diameter: UInt(kAvatarSize)).build() else {
// owsFailDebug("Could build avatar image")
// return nil
// }
// avatarView.image = authorAvatarImage
// return avatarView
return UIView()
}
private func shouldShowAvatar() -> Bool {
guard let viewItem = self.viewItem else {
owsFailDebug("Missing viewItem")
return false
}
return viewItem.isGroupThread
}
@objc
public override func cellSize() -> CGSize {
guard let conversationStyle = self.conversationStyle else {
owsFailDebug("Missing conversationStyle")
return .zero
}
let insetsSize = CGSize(width: conversationStyle.textInsetHorizontal * 2,
height: conversationStyle.textInsetTop + conversationStyle.textInsetBottom)
let typingIndicatorSize = typingIndicatorView.sizeThatFits(.zero)
let bubbleSize = CGSizeAdd(insetsSize, typingIndicatorSize)
if shouldShowAvatar() {
return CGSizeCeil(CGSize(width: kAvatarSize + kAvatarHSpacing + bubbleSize.width,
height: max(kAvatarSize, bubbleSize.height)))
} else {
return CGSizeCeil(CGSize(width: bubbleSize.width,
height: max(kAvatarSize, bubbleSize.height)))
}
}
@objc
public override func prepareForReuse() {
super.prepareForReuse()
NSLayoutConstraint.deactivate(viewConstraints)
viewConstraints = [NSLayoutConstraint]()
// avatarView.image = nil
// avatarView.removeFromSuperview()
typingIndicatorView.stopAnimation()
}
}