Skip to content

Commit 46789f9

Browse files
committed
remove chatkit from message input
1 parent 8846e56 commit 46789f9

4 files changed

Lines changed: 89 additions & 42 deletions

File tree

‎app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt‎

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package com.nextcloud.talk.chat
99

10+
import android.content.Context
1011
import android.content.res.Resources
1112
import android.graphics.drawable.Drawable
1213
import android.os.Build
@@ -29,6 +30,7 @@ import android.view.animation.AlphaAnimation
2930
import android.view.animation.Animation
3031
import android.view.animation.Animation.AnimationListener
3132
import android.view.animation.LinearInterpolator
33+
import android.view.inputmethod.InputMethodManager
3234
import android.widget.ImageButton
3335
import android.widget.ImageView
3436
import android.widget.LinearLayout
@@ -129,6 +131,8 @@ class MessageInputFragment : Fragment() {
129131
private var typingTimer: CountDownTimer? = null
130132
private lateinit var chatActivity: ChatActivity
131133
private var emojiPopup: EmojiPopup? = null
134+
private var isEmojiPopupOpen = false
135+
private var restoreKeyboardOnEmojiDismiss = false
132136
private var mentionAutocomplete: Autocomplete<*>? = null
133137
private var xcounter = 0f
134138
private var ycounter = 0f
@@ -160,6 +164,10 @@ class MessageInputFragment : Fragment() {
160164
}
161165

162166
override fun onDestroyView() {
167+
restoreKeyboardOnEmojiDismiss = false
168+
emojiPopup?.dismiss()
169+
emojiPopup = null
170+
isEmojiPopupOpen = false
163171
super.onDestroyView()
164172
if (mentionAutocomplete != null && mentionAutocomplete!!.isPopupShowing) {
165173
mentionAutocomplete?.dismissPopup()
@@ -238,7 +246,7 @@ class MessageInputFragment : Fragment() {
238246
viewLifecycleOwner.lifecycleScope.launch {
239247
repeatOnLifecycle(Lifecycle.State.CREATED) {
240248
messageInputViewModel.getEditChatMessage.collect { message ->
241-
message?.let { setEditUI(it as ChatMessage) } ?: clearEditUI()
249+
message?.let { setEditUI(it) } ?: clearEditUI()
242250
}
243251
}
244252
}
@@ -518,7 +526,7 @@ class MessageInputFragment : Fragment() {
518526
replaceMentionChipSpans(editable)
519527
val inputEditText = editable.toString()
520528

521-
val message = messageInputViewModel.getEditChatMessage.value as ChatMessage
529+
val message = messageInputViewModel.getEditChatMessage.value ?: return@setOnClickListener
522530
if (message.message!!.trim() != inputEditText.trim()) {
523531
if (message.messageParameters != null) {
524532
val editedMessage = messageUtils.processEditMessageParameters(
@@ -827,6 +835,8 @@ class MessageInputFragment : Fragment() {
827835

828836
private fun showRecordAudioUi(show: Boolean) {
829837
if (show) {
838+
restoreKeyboardOnEmojiDismiss = false
839+
emojiPopup?.dismiss()
830840
val animation: Animation = AlphaAnimation(FULLY_OPAQUE, FULLY_TRANSPARENT)
831841
animation.duration = ANIMATION_DURATION
832842
animation.interpolator = LinearInterpolator()
@@ -858,31 +868,59 @@ class MessageInputFragment : Fragment() {
858868
}
859869
}
860870

861-
private fun initSmileyKeyboardToggler() {
862-
val smileyButton = binding.fragmentMessageInputView.findViewById<ImageButton>(R.id.smileyButton)
871+
private fun updateSmileyButtonIcon() {
872+
val icon = if (isEmojiPopupOpen) {
873+
R.drawable.ic_baseline_keyboard_24
874+
} else {
875+
R.drawable.ic_insert_emoticon_black_24dp
876+
}
877+
val drawable = ContextCompat.getDrawable(requireContext(), icon)
878+
binding.fragmentMessageInputView.smileyButton.setImageDrawable(drawable)
879+
}
863880

864-
emojiPopup = binding.fragmentMessageInputView.inputEditText?.let {
865-
EmojiPopup(
881+
private fun showKeyboard() {
882+
val editText = binding.fragmentMessageInputView.inputEditText
883+
editText.requestFocus()
884+
val inputMethodManager =
885+
requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
886+
inputMethodManager?.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT)
887+
}
888+
889+
private fun initSmileyKeyboardToggler() {
890+
val inputEditText = binding.fragmentMessageInputView.inputEditText
891+
if (emojiPopup == null) {
892+
emojiPopup = EmojiPopup(
866893
rootView = binding.root,
867-
editText = it,
894+
editText = inputEditText,
868895
onEmojiPopupShownListener = {
869-
smileyButton?.setImageDrawable(
870-
ContextCompat.getDrawable(requireContext(), R.drawable.ic_baseline_keyboard_24)
871-
)
896+
isEmojiPopupOpen = true
897+
updateSmileyButtonIcon()
872898
},
873899
onEmojiPopupDismissListener = {
874-
smileyButton?.setImageDrawable(
875-
ContextCompat.getDrawable(requireContext(), R.drawable.ic_insert_emoticon_black_24dp)
876-
)
900+
isEmojiPopupOpen = false
901+
updateSmileyButtonIcon()
902+
if (restoreKeyboardOnEmojiDismiss) {
903+
restoreKeyboardOnEmojiDismiss = false
904+
showKeyboard()
905+
}
877906
},
878907
onEmojiClickListener = {
879-
binding.fragmentMessageInputView.inputEditText?.editableText?.append(" ")
908+
inputEditText.editableText?.append(" ")
880909
}
881910
)
882911
}
883912

884-
smileyButton?.setOnClickListener {
885-
emojiPopup?.toggle()
913+
updateSmileyButtonIcon()
914+
915+
binding.fragmentMessageInputView.smileyButton.setOnClickListener {
916+
if (isEmojiPopupOpen) {
917+
restoreKeyboardOnEmojiDismiss = true
918+
emojiPopup?.dismiss()
919+
} else {
920+
restoreKeyboardOnEmojiDismiss = false
921+
inputEditText.requestFocus()
922+
emojiPopup?.toggle()
923+
}
886924
}
887925
}
888926

‎app/src/main/java/com/nextcloud/talk/chat/viewmodels/MessageInputViewModel.kt‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import com.nextcloud.talk.chat.data.model.ChatMessage
2525
import com.nextcloud.talk.chat.data.network.ChatNetworkDataSource
2626
import com.nextcloud.talk.models.json.chat.ChatOverallSingleMessage
2727
import com.nextcloud.talk.utils.message.SendMessageUtils
28-
import com.stfalcon.chatkit.commons.models.IMessage
2928
import io.reactivex.disposables.Disposable
3029
import kotlinx.coroutines.flow.Flow
3130
import kotlinx.coroutines.flow.MutableStateFlow
@@ -103,8 +102,8 @@ class MessageInputViewModel :
103102
val mediaPlayerSeekbarObserver: Flow<Int>
104103
get() = mediaPlayerManager.mediaPlayerSeekBarPosition
105104

106-
private val _getEditChatMessage: MutableStateFlow<IMessage?> = MutableStateFlow(null)
107-
val getEditChatMessage: StateFlow<IMessage?>
105+
private val _getEditChatMessage: MutableStateFlow<ChatMessage?> = MutableStateFlow(null)
106+
val getEditChatMessage: StateFlow<ChatMessage?>
108107
get() = _getEditChatMessage
109108

110109
private val _getReplyChatMessage: MutableLiveData<ChatMessage?> = MutableLiveData()
@@ -243,7 +242,7 @@ class MessageInputViewModel :
243242
_getReplyChatMessage.postValue(message)
244243
}
245244

246-
fun edit(message: IMessage?) {
245+
fun edit(message: ChatMessage?) {
247246
_getEditChatMessage.value = message
248247
}
249248

‎app/src/main/java/com/nextcloud/talk/ui/MessageInput.kt‎

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,19 @@ package com.nextcloud.talk.ui
88

99
import android.content.Context
1010
import android.util.AttributeSet
11+
import android.view.LayoutInflater
12+
import android.view.View
1113
import android.widget.Chronometer
14+
import android.widget.FrameLayout
1215
import android.widget.ImageButton
1316
import android.widget.ImageView
1417
import android.widget.SeekBar
1518
import android.widget.TextView
1619
import androidx.emoji2.widget.EmojiEditText
1720
import com.google.android.material.button.MaterialButton
1821
import com.nextcloud.talk.R
19-
import com.stfalcon.chatkit.messages.MessageInput
2022

21-
class MessageInput : MessageInput {
23+
class MessageInput : FrameLayout {
2224
lateinit var audioRecordDuration: Chronometer
2325
lateinit var recordAudioButton: ImageButton
2426
lateinit var submitThreadButton: ImageButton
@@ -34,19 +36,32 @@ class MessageInput : MessageInput {
3436
lateinit var seekBar: SeekBar
3537
lateinit var scheduledMessagesButton: ImageButton
3638

37-
constructor(context: Context?) : super(context) {
39+
lateinit var inputEditText: EmojiEditText
40+
lateinit var attachmentButton: ImageButton
41+
lateinit var messageSendButton: ImageButton
42+
val messageInput: EmojiEditText
43+
get() = inputEditText
44+
val button: ImageButton
45+
get() = messageSendButton
46+
47+
constructor(context: Context) : super(context) {
3848
init()
3949
}
4050

41-
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
51+
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
4252
init()
4353
}
4454

45-
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
55+
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
4656
init()
4757
}
4858

4959
private fun init() {
60+
LayoutInflater.from(context).inflate(R.layout.view_message_input, this, true)
61+
62+
inputEditText = findViewById(R.id.messageInput)
63+
attachmentButton = findViewById(R.id.attachmentButton)
64+
messageSendButton = findViewById(R.id.messageSendButton)
5065
audioRecordDuration = findViewById(R.id.audioRecordDuration)
5166
recordAudioButton = findViewById(R.id.recordAudioButton)
5267
submitThreadButton = findViewById(R.id.submitThreadButton)
@@ -63,21 +78,13 @@ class MessageInput : MessageInput {
6378
scheduledMessagesButton = findViewById(R.id.scheduledMessagesButton)
6479
}
6580

66-
var messageInput: EmojiEditText
67-
get() = super.messageInput
68-
set(messageInput) {
69-
super.messageInput = messageInput
70-
}
71-
72-
var attachmentButton: ImageButton
73-
get() = super.attachmentButton
74-
set(attachmentButton) {
75-
super.attachmentButton = attachmentButton
81+
fun setAttachmentsListener(listener: (() -> Unit)?) {
82+
attachmentButton.setOnClickListener {
83+
listener?.invoke()
7684
}
85+
}
7786

78-
var messageSendButton: ImageButton
79-
get() = super.messageSendButton
80-
set(messageSendButton) {
81-
super.messageSendButton = messageSendButton
82-
}
87+
fun setAttachmentsListener(listener: View.OnClickListener?) {
88+
attachmentButton.setOnClickListener(listener)
89+
}
8390
}

‎app/src/main/res/layout/view_message_input.xml‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,15 @@
6363
android:layout_centerHorizontal="true"
6464
android:layout_marginEnd="48dp"
6565
android:layout_toEndOf="@id/smileyButton"
66+
android:background="@null"
6667
android:imeOptions="actionDone"
6768
android:inputType="textAutoCorrect|textMultiLine|textCapSentences"
6869
android:layoutDirection="locale"
6970
android:lineSpacingMultiplier="1.2"
7071
android:minHeight="@dimen/min_size_clickable_area"
7172
android:paddingHorizontal="@dimen/zero"
7273
android:textAlignment="viewStart"
73-
tools:hint="@string/nc_hint_enter_a_message" />
74+
android:hint="@string/nc_hint_enter_a_message" />
7475

7576
<TextView
7677
android:id="@+id/slideToCancelDescription"
@@ -211,9 +212,11 @@
211212
android:layout_alignParentEnd="true"
212213
android:layout_gravity="bottom"
213214
android:adjustViewBounds="true"
215+
android:background="@color/transparent"
214216
android:contentDescription="@string/nc_description_send_message_button"
215217
android:padding="12dp"
216-
android:scaleType="centerInside" />
218+
android:scaleType="centerInside"
219+
android:src="@drawable/ic_send" />
217220

218221
<ImageButton
219222
android:id="@+id/scheduledMessagesButton"

0 commit comments

Comments
 (0)