diff --git a/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift b/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift index ab94f00ba..11be20173 100644 --- a/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift +++ b/Classes/Swift/Chat/Views/ChatConversationTableViewSwift.swift @@ -476,7 +476,7 @@ class ChatConversationTableViewSwift: UIViewController, UICollectionViewDataSour func replyMessage(message: ChatMessage){ 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.initiateReplyView(forMessage: message.getCobject) diff --git a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift b/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift index 6d885b680..a64d65510 100644 --- a/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift +++ b/Classes/Swift/Chat/Views/ChatConversationViewSwift.swift @@ -792,7 +792,9 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll func sendMessageInMessageField(rootMessage: ChatMessage?) { if ChatConversationViewModel.sharedModel.sendMessage(message: messageView.messageText.text.trimmingCharacters(in: .whitespacesAndNewlines), withExterlBodyUrl: nil, rootMessage: rootMessage) { + //messageView.messageText.textColor = UIColor.lightGray messageView.messageText.text = "" + messageView.emojisButton.isHidden = false messageView.isComposing = false } } @@ -812,7 +814,7 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll if (linphone_chat_room_get_capabilities(ChatConversationViewModel.sharedModel.chatRoom?.getCobject) != 0) && conference { linphone_chat_message_add_content(rootMessage, voiceContent) }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 result = ChatMessage.getSwiftObject(cObject: rootMessageText!) sendMessageInMessageField(rootMessage: result) @@ -832,7 +834,7 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll 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) } - if messageView.messageText.text != "" { + if messageView.messageText.textColor != UIColor.lightGray { let result = ChatMessage.getSwiftObject(cObject: rootMessage!) sendMessageInMessageField(rootMessage: result) } @@ -862,9 +864,21 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll func startMultiFilesUpload(_ rootMessage: ChatMessage?) -> Bool { 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) - 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) return true } @@ -1360,7 +1374,7 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll sheet!.addButton( withTitle: NSLocalizedString("Send to this conversation", comment: "")) { [self] in do{ - if messageView.messageText.text != "" { + if messageView.messageText.textColor != UIColor.lightGray { try sendMessageInMessageField(rootMessage: ChatConversationViewModel.sharedModel.chatRoom?.createEmptyMessage()) } if let sUrl = url { @@ -1431,7 +1445,12 @@ class ChatConversationViewSwift: BackActionsNavigationView, PHPickerViewControll } 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() { diff --git a/Classes/Swift/Chat/Views/MessageView.swift b/Classes/Swift/Chat/Views/MessageView.swift index 097ef7fe8..84fdf4044 100644 --- a/Classes/Swift/Chat/Views/MessageView.swift +++ b/Classes/Swift/Chat/Views/MessageView.swift @@ -82,7 +82,9 @@ class MessageView: UIView, UITextViewDelegate { messageText.matchParentHeight().alignParentLeft().alignParentRight(withMargin: 40).done() messageText.font = UIFont.systemFont(ofSize: 18) messageText.delegate = self - + messageText.textColor = UIColor.lightGray + messageText.text = "Message" + messageText.inputAccessoryView = UIView() messageWithEmojiView.addArrangedSubview(emojisButton) emojisButton.alignParentRight().matchParentHeight().done() @@ -93,43 +95,59 @@ class MessageView: UIView, UITextViewDelegate { } func textViewDidChangeSelection(_ textView: UITextView) { - let chatRoom = ChatRoom.getSwiftObject(cObject: PhoneMainView.instance().currentRoom) - if ((messageText.text.isEmpty && !fileContext) || isLoading) { - sendButton.isEnabled = false - emojisButton.isHidden = false - NotificationCenter.default.post(name: Notification.Name("LinphoneResetTextViewSize"), object: self) - lastNumLines = 0 - } else { - if (messageText.text.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.first?.properties.isEmojiPresentation == true){ - var onlyEmojis = true - messageText.text.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.forEach { emoji in - if !emoji.properties.isEmojiPresentation && !emoji.properties.isWhitespace{ - onlyEmojis = false + if messageText.textColor != UIColor.lightGray { + let chatRoom = ChatRoom.getSwiftObject(cObject: PhoneMainView.instance().currentRoom) + if ((messageText.text.isEmpty && !fileContext) || isLoading) { + sendButton.isEnabled = false + emojisButton.isHidden = false + NotificationCenter.default.post(name: Notification.Name("LinphoneResetTextViewSize"), object: self) + lastNumLines = 0 + } else { + if (messageText.text.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.first?.properties.isEmojiPresentation == true){ + var onlyEmojis = true + messageText.text.trimmingCharacters(in: .whitespacesAndNewlines).unicodeScalars.forEach { emoji in + if !emoji.properties.isEmojiPresentation && !emoji.properties.isWhitespace{ + onlyEmojis = false + } + } + if onlyEmojis { + emojisButton.isHidden = false + } else { + emojisButton.isHidden = true } - } - if onlyEmojis { - emojisButton.isHidden = false } else { emojisButton.isHidden = true } - } else { - emojisButton.isHidden = true - } - if !isComposing { - chatRoom.compose() - let timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: false) { timer in - self.isComposing = false + if !isComposing { + chatRoom.compose() + let timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: false) { timer in + self.isComposing = false + } } - } - isComposing = true + isComposing = true - sendButton.isEnabled = true - - let numLines = (messageText.contentSize.height / messageText.font!.lineHeight) - if(Int(numLines) != Int(lastNumLines)){ - NotificationCenter.default.post(name: Notification.Name("LinphoneTextViewSize"), object: self) + sendButton.isEnabled = true + + let numLines = (messageText.contentSize.height / messageText.font!.lineHeight) + if(Int(numLines) != Int(lastNumLines)){ + 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" } } } diff --git a/Classes/Swift/Util/BackActionsNavigationView.swift b/Classes/Swift/Util/BackActionsNavigationView.swift index 56e2d6f0c..25ccfd2ab 100644 --- a/Classes/Swift/Util/BackActionsNavigationView.swift +++ b/Classes/Swift/Util/BackActionsNavigationView.swift @@ -27,6 +27,7 @@ class BackActionsNavigationView: UIViewController { let top_bar_height = 66.0 + var message_height = 66.0 let side_buttons_margin = 5 let titleLabel = StyledLabel(VoipTheme.chat_conversation_title) @@ -157,6 +158,8 @@ class BackActionsNavigationView: UIViewController { super.viewDidLoad() + view.backgroundColor = VoipTheme.voipToolbarBackgroundColor.get() + stackView.axis = .vertical; stackView.distribution = .fill; stackView.alignment = .center; @@ -166,7 +169,12 @@ class BackActionsNavigationView: UIViewController { view.addSubview(stackView) //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.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true @@ -240,7 +248,11 @@ class BackActionsNavigationView: UIViewController { mediaSelector.isHidden = true 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; view.addSubview(stackView) @@ -264,6 +276,8 @@ class BackActionsNavigationView: UIViewController { view.bringSubviewToFront(topBar) + self.dismissKeyboard() + UIDeviceBridge.displayModeSwitched.readCurrentAndObserve { _ in self.topBar.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.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(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) } func resetRecordingProgressBar(){ @@ -401,15 +417,44 @@ class BackActionsNavigationView: UIViewController { @objc func changeSizeOfTextView(){ let numLines = (messageView.messageText.contentSize.height / messageView.messageText.font!.lineHeight) - if numLines >= 3 && numLines <= 6 { - messageView.setHeight(33*numLines - 33) - } else if numLines < 3 { - messageView.setHeight(66) + if numLines >= 2 && numLines <= 6 { + messageView.setHeight((message_height * numLines)/2) + } else if numLines < 2 { + messageView.setHeight(message_height) } } @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 + } } }