From 6cb3e1db22941979babc620e4806d2ed7708da4e Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Wed, 6 Apr 2022 17:24:48 +1000 Subject: [PATCH] add interaction for showing missed call tips if the permission is denied --- .../Views & Modals/CallMissedTipsModal.swift | 2 +- .../ConversationVC+Interaction.swift | 6 ++- .../Message Cells/CallMessageCell.swift | 39 ++++++++++++++++--- Session/Meta/AppDelegate.swift | 2 +- .../Messages/Signal/TSInfoMessage.h | 1 + .../Messages/Signal/TSInfoMessage.m | 1 + .../NotificationServiceExtension.swift | 2 +- 7 files changed, 43 insertions(+), 10 deletions(-) diff --git a/Session/Calls/Views & Modals/CallMissedTipsModal.swift b/Session/Calls/Views & Modals/CallMissedTipsModal.swift index 9c4227398..eadb71868 100644 --- a/Session/Calls/Views & Modals/CallMissedTipsModal.swift +++ b/Session/Calls/Views & Modals/CallMissedTipsModal.swift @@ -29,7 +29,7 @@ final class CallMissedTipsModal : Modal { // Title let titleLabel = UILabel() titleLabel.textColor = Colors.text - titleLabel.font = .boldSystemFont(ofSize: Values.largeFontSize) + titleLabel.font = .boldSystemFont(ofSize: Values.mediumFontSize) titleLabel.text = NSLocalizedString("modal_call_missed_tips_title", comment: "") titleLabel.textAlignment = .center // Message diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 1674f397d..496e965a6 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -539,7 +539,11 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc modal.modalTransitionStyle = .crossDissolve present(modal, animated: true, completion: nil) } - if let message = viewItem.interaction as? TSOutgoingMessage, message.messageState == .failed { + if let message = viewItem.interaction as? TSInfoMessage, message.messageType == .call { + let caller = (thread as! TSContactThread).name() + let callMissedTipsModal = CallMissedTipsModal(caller: caller) + present(callMissedTipsModal, animated: true, completion: nil) + } else if let message = viewItem.interaction as? TSOutgoingMessage, message.messageState == .failed { // Show the failed message sheet showFailedMessageSheet(for: message) } else { diff --git a/Session/Conversations/Message Cells/CallMessageCell.swift b/Session/Conversations/Message Cells/CallMessageCell.swift index c598920a0..f199b49b6 100644 --- a/Session/Conversations/Message Cells/CallMessageCell.swift +++ b/Session/Conversations/Message Cells/CallMessageCell.swift @@ -1,12 +1,18 @@ import UIKit +import SessionMessagingKit final class CallMessageCell : MessageCell { - private lazy var iconImageViewWidthConstraint = iconImageView.set(.width, to: CallMessageCell.iconSize) - private lazy var iconImageViewHeightConstraint = iconImageView.set(.height, to: CallMessageCell.iconSize) + private lazy var iconImageViewWidthConstraint = iconImageView.set(.width, to: 0) + private lazy var iconImageViewHeightConstraint = iconImageView.set(.height, to: 0) + + private lazy var infoImageViewWidthConstraint = infoImageView.set(.width, to: 0) + private lazy var infoImageViewHeightConstraint = infoImageView.set(.height, to: 0) // MARK: UI Components private lazy var iconImageView = UIImageView() + private lazy var infoImageView = UIImageView(image: UIImage(named: "ic_info")?.withTint(Colors.text)) + private lazy var timestampLabel: UILabel = { let result = UILabel() result.font = .boldSystemFont(ofSize: Values.verySmallFontSize) @@ -35,6 +41,9 @@ final class CallMessageCell : MessageCell { result.addSubview(iconImageView) iconImageView.autoVCenterInSuperview() iconImageView.pin(.left, to: .left, of: result, withInset: CallMessageCell.inset) + result.addSubview(infoImageView) + infoImageView.autoVCenterInSuperview() + infoImageView.pin(.right, to: .right, of: result, withInset: -CallMessageCell.inset) return result }() @@ -66,6 +75,12 @@ final class CallMessageCell : MessageCell { stackView.pin(.bottom, to: .bottom, of: self, withInset: -CallMessageCell.inset) } + override func setUpGestureRecognizers() { + let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap)) + tapGestureRecognizer.numberOfTapsRequired = 1 + addGestureRecognizer(tapGestureRecognizer) + } + // MARK: Updating override func update() { guard let message = viewItem?.interaction as? TSInfoMessage, message.messageType == .call else { return } @@ -73,14 +88,17 @@ final class CallMessageCell : MessageCell { switch message.callState { case .outgoing: icon = UIImage(named: "CallOutgoing")?.withTint(Colors.text) case .incoming: icon = UIImage(named: "CallIncoming")?.withTint(Colors.text) - case .missed: icon = UIImage(named: "CallMissed")?.withTint(Colors.destructive) + case .missed, .permissionDenied: icon = UIImage(named: "CallMissed")?.withTint(Colors.destructive) default: icon = nil } - if let icon = icon { - iconImageView.image = icon - } + iconImageView.image = icon iconImageViewWidthConstraint.constant = (icon != nil) ? CallMessageCell.iconSize : 0 iconImageViewHeightConstraint.constant = (icon != nil) ? CallMessageCell.iconSize : 0 + + let shouldShowInfoIcon = message.callState == .permissionDenied && !SSKPreferences.areCallsEnabled + infoImageViewWidthConstraint.constant = shouldShowInfoIcon ? CallMessageCell.iconSize : 0 + infoImageViewHeightConstraint.constant = shouldShowInfoIcon ? CallMessageCell.iconSize : 0 + Storage.read { transaction in self.label.text = message.previewText(with: transaction) } @@ -89,4 +107,13 @@ final class CallMessageCell : MessageCell { let description = DateUtil.formatDate(forDisplay: date) timestampLabel.text = description } + + @objc private func handleTap(_ gestureRecognizer: UITapGestureRecognizer) { + guard let viewItem = viewItem, let message = viewItem.interaction as? TSInfoMessage, message.messageType == .call else { return } + let shouldBeTappable = message.callState == .permissionDenied && !SSKPreferences.areCallsEnabled + if shouldBeTappable { + delegate?.handleViewItemTapped(viewItem, gestureRecognizer: gestureRecognizer) + } + } + } diff --git a/Session/Meta/AppDelegate.swift b/Session/Meta/AppDelegate.swift index ed0c4832b..80edaae96 100644 --- a/Session/Meta/AppDelegate.swift +++ b/Session/Meta/AppDelegate.swift @@ -81,7 +81,7 @@ extension AppDelegate { } guard SSKPreferences.areCallsEnabled else { let infoMessage = self.insertCallInfoMessage(for: message, using: transaction) - infoMessage.updateCallInfoMessage(.missed, using: transaction) + infoMessage.updateCallInfoMessage(.permissionDenied, using: transaction) let contactName = Storage.shared.getContact(with: message.sender!, using: transaction)?.displayName(for: Contact.Context.regular) ?? message.sender! DispatchQueue.main.async { self.showMissedCallTipsIfNeeded(caller: contactName) diff --git a/SessionMessagingKit/Messages/Signal/TSInfoMessage.h b/SessionMessagingKit/Messages/Signal/TSInfoMessage.h index c18f36b0f..5e1385848 100644 --- a/SessionMessagingKit/Messages/Signal/TSInfoMessage.h +++ b/SessionMessagingKit/Messages/Signal/TSInfoMessage.h @@ -24,6 +24,7 @@ typedef NS_ENUM(NSInteger, TSInfoMessageCallState) { TSInfoMessageCallStateIncoming, TSInfoMessageCallStateOutgoing, TSInfoMessageCallStateMissed, + TSInfoMessageCallStatePermissionDenied, TSInfoMessageCallStateUnknown }; diff --git a/SessionMessagingKit/Messages/Signal/TSInfoMessage.m b/SessionMessagingKit/Messages/Signal/TSInfoMessage.m index 48e2671f5..a1fe6c753 100644 --- a/SessionMessagingKit/Messages/Signal/TSInfoMessage.m +++ b/SessionMessagingKit/Messages/Signal/TSInfoMessage.m @@ -121,6 +121,7 @@ NSUInteger TSInfoMessageSchemaVersion = 1; case TSInfoMessageCallStateOutgoing: return [NSString stringWithFormat:NSLocalizedString(@"call_outgoing", @""), name]; case TSInfoMessageCallStateMissed: + case TSInfoMessageCallStatePermissionDenied: return [NSString stringWithFormat:NSLocalizedString(@"call_missed", @""), name]; default: break; diff --git a/SessionNotificationServiceExtension/NotificationServiceExtension.swift b/SessionNotificationServiceExtension/NotificationServiceExtension.swift index ebc2babf3..54294f927 100644 --- a/SessionNotificationServiceExtension/NotificationServiceExtension.swift +++ b/SessionNotificationServiceExtension/NotificationServiceExtension.swift @@ -76,7 +76,7 @@ public final class NotificationServiceExtension : UNNotificationServiceExtension if !SSKPreferences.areCallsEnabled { if let sender = callMessage.sender, let thread = TSContactThread.fetch(for: sender, using: transaction), thread.hasOutgoingInteraction(with: transaction) { let infoMessage = TSInfoMessage.from(callMessage, associatedWith: thread) - infoMessage.updateCallInfoMessage(.missed, using: transaction) + infoMessage.updateCallInfoMessage(.permissionDenied, using: transaction) } break }