UI changes in conversation view

This commit is contained in:
Benoit Martins 2023-07-11 17:22:56 +02:00
parent 0d602260be
commit 9741c844f2
4 changed files with 127 additions and 45 deletions

View file

@ -476,7 +476,7 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour
func replyMessage(message: ChatMessage){ func replyMessage(message: ChatMessage){
let view: ChatConversationViewSwift = self.VIEW(ChatConversationViewSwift.compositeViewDescription()) let view: ChatConversationViewSwift = self.VIEW(ChatConversationViewSwift.compositeViewDescription())
if (view.messageView.messageText.text == "" && view.stackView.arrangedSubviews[3].isHidden && view.stackView.arrangedSubviews[4].isHidden){ if (view.messageView.messageText.textColor == UIColor.lightGray && view.stackView.arrangedSubviews[3].isHidden && view.stackView.arrangedSubviews[4].isHidden){
view.messageView.messageText.becomeFirstResponder() view.messageView.messageText.becomeFirstResponder()
} }
view.initiateReplyView(forMessage: message.getCobject) view.initiateReplyView(forMessage: message.getCobject)

View file

@ -792,7 +792,9 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll
func sendMessageInMessageField(rootMessage: ChatMessage?) { func sendMessageInMessageField(rootMessage: ChatMessage?) {
if ChatConversationViewModel.sharedModel.sendMessage(message: messageView.messageText.text.trimmingCharacters(in: .whitespacesAndNewlines), withExterlBodyUrl: nil, rootMessage: rootMessage) { if ChatConversationViewModel.sharedModel.sendMessage(message: messageView.messageText.text.trimmingCharacters(in: .whitespacesAndNewlines), withExterlBodyUrl: nil, rootMessage: rootMessage) {
//messageView.messageText.textColor = UIColor.lightGray
messageView.messageText.text = "" messageView.messageText.text = ""
messageView.emojisButton.isHidden = false
messageView.isComposing = false messageView.isComposing = false
} }
} }
@ -812,7 +814,7 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll
if (linphone_chat_room_get_capabilities(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) != 0) && conference { if (linphone_chat_room_get_capabilities(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) != 0) && conference {
linphone_chat_message_add_content(rootMessage, voiceContent) linphone_chat_message_add_content(rootMessage, voiceContent)
}else{ }else{
if messageView.messageText.text != "" { if messageView.messageText.textColor != UIColor.lightGray {
let rootMessageText = !replyBubble.isHidden ? linphone_chat_room_create_reply_message(ChatConversationViewModel.sharedModel.chatRoom?.getCobject, ChatConversationViewModel.sharedModel.replyMessage) : linphone_chat_room_create_empty_message(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) let rootMessageText = !replyBubble.isHidden ? linphone_chat_room_create_reply_message(ChatConversationViewModel.sharedModel.chatRoom?.getCobject, ChatConversationViewModel.sharedModel.replyMessage) : linphone_chat_room_create_empty_message(ChatConversationViewModel.sharedModel.chatRoom?.getCobject)
let result = ChatMessage.getSwiftObject(cObject: rootMessageText!) let result = ChatMessage.getSwiftObject(cObject: rootMessageText!)
sendMessageInMessageField(rootMessage: result) sendMessageInMessageField(rootMessage: result)
@ -832,7 +834,7 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll
for i in 0..<(ChatConversationViewModel.sharedModel.fileContext.count) { for i in 0..<(ChatConversationViewModel.sharedModel.fileContext.count) {
startUploadData(ChatConversationViewModel.sharedModel.fileContext[i], withType: FileType.init(ChatConversationViewModel.sharedModel.mediaURLCollection[i].pathExtension)?.getGroupTypeFromFile(), withName: ChatConversationViewModel.sharedModel.mediaURLCollection[i].lastPathComponent, andMessage: nil, rootMessage: nil) startUploadData(ChatConversationViewModel.sharedModel.fileContext[i], withType: FileType.init(ChatConversationViewModel.sharedModel.mediaURLCollection[i].pathExtension)?.getGroupTypeFromFile(), withName: ChatConversationViewModel.sharedModel.mediaURLCollection[i].lastPathComponent, andMessage: nil, rootMessage: nil)
} }
if messageView.messageText.text != "" { if messageView.messageText.textColor != UIColor.lightGray {
let result = ChatMessage.getSwiftObject(cObject: rootMessage!) let result = ChatMessage.getSwiftObject(cObject: rootMessage!)
sendMessageInMessageField(rootMessage: result) sendMessageInMessageField(rootMessage: result)
} }
@ -862,9 +864,21 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll
func startMultiFilesUpload(_ rootMessage: ChatMessage?) -> Bool { func startMultiFilesUpload(_ rootMessage: ChatMessage?) -> Bool {
let fileTransfer = FileTransferDelegate() let fileTransfer = FileTransferDelegate()
fileTransfer.text = messageView.messageText.text if messageView.messageText.textColor != UIColor.lightGray {
fileTransfer.text = messageView.messageText.text
} else {
fileTransfer.text = ""
}
fileTransfer.uploadFileContent(forSwift: ChatConversationViewModel.sharedModel.fileContext, urlList: ChatConversationViewModel.sharedModel.mediaURLCollection, for: ChatConversationViewModel.sharedModel.chatRoom?.getCobject, rootMessage: rootMessage?.getCobject) fileTransfer.uploadFileContent(forSwift: ChatConversationViewModel.sharedModel.fileContext, urlList: ChatConversationViewModel.sharedModel.mediaURLCollection, for: ChatConversationViewModel.sharedModel.chatRoom?.getCobject, rootMessage: rootMessage?.getCobject)
messageView.messageText.text = "" if fileTransfer.text.isEmpty {
messageView.messageText.textColor = UIColor.lightGray
messageView.messageText.text = "Message"
messageView.emojisButton.isHidden = false
} else {
messageView.messageText.text = ""
messageView.emojisButton.isHidden = false
}
tableControllerSwift.refreshData(isOutgoing: true) tableControllerSwift.refreshData(isOutgoing: true)
return true return true
} }
@ -1360,7 +1374,7 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll
sheet!.addButton( sheet!.addButton(
withTitle: NSLocalizedString("Send to this conversation", comment: "")) { [self] in withTitle: NSLocalizedString("Send to this conversation", comment: "")) { [self] in
do{ do{
if messageView.messageText.text != "" { if messageView.messageText.textColor != UIColor.lightGray {
try sendMessageInMessageField(rootMessage: ChatConversationViewModel.sharedModel.chatRoom?.createEmptyMessage()) try sendMessageInMessageField(rootMessage: ChatConversationViewModel.sharedModel.chatRoom?.createEmptyMessage())
} }
if let sUrl = url { if let sUrl = url {
@ -1431,7 +1445,12 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll
} }
func didGetEmoji(emoji: String) { func didGetEmoji(emoji: String) {
messageView.messageText.text = messageView.messageText.text + emoji if messageView.messageText.textColor != UIColor.lightGray {
messageView.messageText.text = messageView.messageText.text + emoji
} else {
messageView.messageText.textColor = UIColor.black
messageView.messageText.text = emoji
}
} }
func startVoiceRecording() { func startVoiceRecording() {

View file

@ -82,7 +82,9 @@ class MessageView: UIView, UITextViewDelegate {
messageText.matchParentHeight().alignParentLeft().alignParentRight(withMargin: 40).done() messageText.matchParentHeight().alignParentLeft().alignParentRight(withMargin: 40).done()
messageText.font = UIFont.systemFont(ofSize: 18) messageText.font = UIFont.systemFont(ofSize: 18)
messageText.delegate = self messageText.delegate = self
messageText.textColor = UIColor.lightGray
messageText.text = "Message"
messageText.inputAccessoryView = UIView()
messageWithEmojiView.addArrangedSubview(emojisButton) messageWithEmojiView.addArrangedSubview(emojisButton)
emojisButton.alignParentRight().matchParentHeight().done() emojisButton.alignParentRight().matchParentHeight().done()
@ -93,43 +95,59 @@ class MessageView: UIView, UITextViewDelegate {
} }
func textViewDidChangeSelection(_ textView: UITextView) { func textViewDidChangeSelection(_ textView: UITextView) {
let chatRoom = ChatRoom.getSwiftObject(cObject: PhoneMainView.instance().currentRoom) if messageText.textColor != UIColor.lightGray {
if ((messageText.text.isEmpty && !fileContext) || isLoading) { let chatRoom = ChatRoom.getSwiftObject(cObject: PhoneMainView.instance().currentRoom)
sendButton.isEnabled = false if ((messageText.text.isEmpty && !fileContext) || isLoading) {
emojisButton.isHidden = false sendButton.isEnabled = false
NotificationCenter.default.post(name: Notification.Name("LinphoneResetTextViewSize"), object: self) emojisButton.isHidden = false
lastNumLines = 0 NotificationCenter.default.post(name: Notification.Name("LinphoneResetTextViewSize"), object: self)
} else { lastNumLines = 0
if (messageText.text.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.first?.properties.isEmojiPresentation == true){ } else {
var onlyEmojis = true if (messageText.text.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.first?.properties.isEmojiPresentation == true){
messageText.text.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.forEach { emoji in var onlyEmojis = true
if !emoji.properties.isEmojiPresentation && !emoji.properties.isWhitespace{ messageText.text.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.forEach { emoji in
onlyEmojis = false if !emoji.properties.isEmojiPresentation && !emoji.properties.isWhitespace{
onlyEmojis = false
}
}
if onlyEmojis {
emojisButton.isHidden = false
} else {
emojisButton.isHidden = true
} }
}
if onlyEmojis {
emojisButton.isHidden = false
} else { } else {
emojisButton.isHidden = true emojisButton.isHidden = true
} }
} else { if !isComposing {
emojisButton.isHidden = true chatRoom.compose()
} let timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: false) { timer in
if !isComposing { self.isComposing = false
chatRoom.compose() }
let timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: false) { timer in
self.isComposing = false
} }
} isComposing = true
isComposing = true
sendButton.isEnabled = true sendButton.isEnabled = true
let numLines = (messageText.contentSize.height / messageText.font!.lineHeight) let numLines = (messageText.contentSize.height / messageText.font!.lineHeight)
if(Int(numLines) != Int(lastNumLines)){ if(Int(numLines) != Int(lastNumLines)){
NotificationCenter.default.post(name: Notification.Name("LinphoneTextViewSize"), object: self) NotificationCenter.default.post(name: Notification.Name("LinphoneTextViewSize"), object: self)
}
lastNumLines = numLines
} }
lastNumLines = numLines }
}
func textViewDidBeginEditing(_ textView: UITextView) {
if messageText.textColor == UIColor.lightGray {
messageText.text = nil
messageText.textColor = UIColor.black
}
}
func textViewDidEndEditing(_ textView: UITextView) {
if messageText.text.isEmpty {
messageText.textColor = UIColor.lightGray
messageText.text = "Message"
} }
} }
} }

View file

@ -27,6 +27,7 @@ class BackActionsNavigationView: UIViewController {
let top_bar_height = 66.0 let top_bar_height = 66.0
var message_height = 66.0
let side_buttons_margin = 5 let side_buttons_margin = 5
let titleLabel = StyledLabel(VoipTheme.chat_conversation_title) let titleLabel = StyledLabel(VoipTheme.chat_conversation_title)
@ -157,6 +158,8 @@ class BackActionsNavigationView: UIViewController {
super.viewDidLoad() super.viewDidLoad()
view.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get()
stackView.axis = .vertical; stackView.axis = .vertical;
stackView.distribution = .fill; stackView.distribution = .fill;
stackView.alignment = .center; stackView.alignment = .center;
@ -166,7 +169,12 @@ class BackActionsNavigationView: UIViewController {
view.addSubview(stackView) view.addSubview(stackView)
//stackView.alignParentTop().alignParentBottom().matchParentSideBorders().done() //stackView.alignParentTop().alignParentBottom().matchParentSideBorders().done()
stackView.alignParentTop().alignParentBottom().done() let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
if keyWindow != nil {
stackView.alignParentTop().alignParentBottom(withMargin: keyWindow!.safeAreaInsets.top/3).done()
}else{
stackView.alignParentTop().alignParentBottom().done()
}
stackView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true stackView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true
stackView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true stackView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true
@ -240,7 +248,11 @@ class BackActionsNavigationView: UIViewController {
mediaSelector.isHidden = true mediaSelector.isHidden = true
stackView.addArrangedSubview(messageView) stackView.addArrangedSubview(messageView)
messageView.alignParentBottom().height(66).matchParentSideBorders().done() if keyWindow != nil {
message_height = 66 - ((keyWindow!.safeAreaInsets.top/3)/2)
}
messageView.alignParentBottom().height(message_height).matchParentSideBorders().done()
stackView.translatesAutoresizingMaskIntoConstraints = false; stackView.translatesAutoresizingMaskIntoConstraints = false;
view.addSubview(stackView) view.addSubview(stackView)
@ -264,6 +276,8 @@ class BackActionsNavigationView: UIViewController {
view.bringSubviewToFront(topBar) view.bringSubviewToFront(topBar)
self.dismissKeyboard()
UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in
self.topBar.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() self.topBar.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get()
self.titleParticipants.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() self.titleParticipants.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get()
@ -278,6 +292,8 @@ class BackActionsNavigationView: UIViewController {
NotificationCenter.default.addObserver(self, selector: #selector(self.rotated), name: UIDevice.orientationDidChangeNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.rotated), name: UIDevice.orientationDidChangeNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.changeSizeOfTextView), name: Notification.Name("LinphoneTextViewSize"), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.changeSizeOfTextView), name: Notification.Name("LinphoneTextViewSize"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.resetSizeOfTextView), name: Notification.Name("LinphoneResetTextViewSize"), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.resetSizeOfTextView), name: Notification.Name("LinphoneResetTextViewSize"), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
} }
func resetRecordingProgressBar(){ func resetRecordingProgressBar(){
@ -401,15 +417,44 @@ class BackActionsNavigationView: UIViewController {
@objc func changeSizeOfTextView(){ @objc func changeSizeOfTextView(){
let numLines = (messageView.messageText.contentSize.height / messageView.messageText.font!.lineHeight) let numLines = (messageView.messageText.contentSize.height / messageView.messageText.font!.lineHeight)
if numLines >= 3 && numLines <= 6 { if numLines >= 2 && numLines <= 6 {
messageView.setHeight(33*numLines - 33) messageView.setHeight((message_height * numLines)/2)
} else if numLines < 3 { } else if numLines < 2 {
messageView.setHeight(66) messageView.setHeight(message_height)
} }
} }
@objc func resetSizeOfTextView(){ @objc func resetSizeOfTextView(){
messageView.setHeight(66) messageView.setHeight(message_height)
}
func dismissKeyboard() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer( target: self, action: #selector(self.dismissKeyboardTouchOutside))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc private func dismissKeyboardTouchOutside() {
view.endEditing(true)
}
@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
if topBar.frame.origin.y == 0 {
let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
if keyWindow != nil {
topBar.frame.origin.y += keyboardSize.height - keyWindow!.safeAreaInsets.top/3
}else{
topBar.frame.origin.y += keyboardSize.height
}
}
}
}
@objc func keyboardWillHide(notification: NSNotification) {
if topBar.frame.origin.y != 0 {
topBar.frame.origin.y = 0
}
} }
} }