diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index 9bb7fa935..a362c0615 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -33,6 +33,8 @@ import android.view.View import android.view.ViewGroup import android.view.Window import android.view.WindowManager +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.UiThread import androidx.core.view.doOnPreDraw import androidx.databinding.DataBindingUtil @@ -41,6 +43,7 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.bottomsheet.BottomSheetBehavior +import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log @@ -54,6 +57,7 @@ import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils import org.linphone.utils.hideKeyboard +import org.linphone.utils.setKeyboardInsetListener import org.linphone.utils.showKeyboard @UiThread @@ -70,6 +74,18 @@ class ConversationFragment : GenericFragment() { private lateinit var adapter: ConversationEventAdapter + private val pickMedia = registerForActivityResult( + ActivityResultContracts.PickMultipleVisualMedia() + ) { list -> + if (!list.isNullOrEmpty()) { + for (file in list) { + Log.i("$TAG Picked file [$file]") + } + } else { + Log.w("$TAG No file picked") + } + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -157,20 +173,15 @@ class ConversationFragment : GenericFragment() { } } - val emojisBottomSheetBehavior = BottomSheetBehavior.from(binding.emojiPicker) + val emojisBottomSheetBehavior = BottomSheetBehavior.from(binding.sendArea.root) emojisBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED emojisBottomSheetBehavior.isDraggable = false // To allow scrolling through the emojis - binding.setOpenEmojiPickerClickListener { - /*val state = emojisBottomSheetBehavior.state - if (state == BottomSheetBehavior.STATE_COLLAPSED) { - emojisBottomSheetBehavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED - if (binding.emojiPicker.visibility == View.GONE) { - binding.emojiPicker.visibility = View.VISIBLE - } - } else { - emojisBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED - }*/ + binding.setOpenFilePickerClickListener { + Log.i("$TAG Opening media picker") + pickMedia.launch( + PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo) + ) } binding.setGoToInfoClickListener { @@ -185,6 +196,12 @@ class ConversationFragment : GenericFragment() { viewModel.applyFilter(filter.trim()) } + viewModel.requestKeyboardHidingEvent.observe(viewLifecycleOwner) { + it.consume { + binding.search.hideKeyboard() + } + } + viewModel.focusSearchBarEvent.observe(viewLifecycleOwner) { it.consume { show -> if (show) { @@ -195,6 +212,12 @@ class ConversationFragment : GenericFragment() { } } } + + binding.root.setKeyboardInsetListener { keyboardVisible -> + if (keyboardVisible) { + viewModel.isEmojiPickerOpen.value = false + } + } } override fun onResume() { diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt index 4e7d90b9b..b9582eb47 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt @@ -66,6 +66,12 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { val searchFilter = MutableLiveData() + val isEmojiPickerOpen = MutableLiveData() + + val requestKeyboardHidingEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + val focusSearchBarEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -211,6 +217,19 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { } } + @UiThread + fun toggleEmojiPickerVisibility() { + isEmojiPickerOpen.value = isEmojiPickerOpen.value == false + if (isEmojiPickerOpen.value == true) { + requestKeyboardHidingEvent.value = Event(true) + } + } + + @UiThread + fun insertEmoji(emoji: String) { + textToSend.value = "${textToSend.value.orEmpty()}$emoji" + } + @UiThread fun sendMessage() { coreContext.postOnCoreThread { core -> diff --git a/app/src/main/res/layout/chat_conversation_fragment.xml b/app/src/main/res/layout/chat_conversation_fragment.xml index 468040cb8..4cfec0cae 100644 --- a/app/src/main/res/layout/chat_conversation_fragment.xml +++ b/app/src/main/res/layout/chat_conversation_fragment.xml @@ -19,7 +19,7 @@ name="goToInfoClickListener" type="View.OnClickListener" /> - - diff --git a/app/src/main/res/layout/chat_conversation_send_area.xml b/app/src/main/res/layout/chat_conversation_send_area.xml index c6e326d34..e9a476b6b 100644 --- a/app/src/main/res/layout/chat_conversation_send_area.xml +++ b/app/src/main/res/layout/chat_conversation_send_area.xml @@ -5,7 +5,7 @@ - + + @@ -98,9 +110,10 @@ 12dp 5dp 30sp + + 290dp \ No newline at end of file