77
88package com.nextcloud.talk.chat
99
10+ import android.content.Context
1011import android.content.res.Resources
1112import android.graphics.drawable.Drawable
1213import android.os.Build
@@ -29,6 +30,7 @@ import android.view.animation.AlphaAnimation
2930import android.view.animation.Animation
3031import android.view.animation.Animation.AnimationListener
3132import android.view.animation.LinearInterpolator
33+ import android.view.inputmethod.InputMethodManager
3234import android.widget.ImageButton
3335import android.widget.ImageView
3436import 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
0 commit comments