From 5dfd04ad701785a129b9cbb3abbbc2f009ac3226 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 3 Aug 2023 11:15:18 +0200 Subject: [PATCH] Changes --- app/src/main/AndroidManifest.xml | 1 + .../java/org/linphone/ui/TopBarViewModel.kt | 2 + .../linphone/ui/contacts/ContactsFragment.kt | 10 +++- .../viewmodel/ContactsListViewModel.kt | 10 +++- .../ui/conversations/ConversationsFragment.kt | 13 +++++ .../viewmodel/ConversationsListViewModel.kt | 6 ++- .../org/linphone/utils/DataBindingUtils.kt | 26 ++++++++++ .../layout/bottom_nav_bar_conversations.xml | 1 + app/src/main/res/layout/contacts_fragment.xml | 15 +++++- .../res/layout/conversations_fragment.xml | 51 +++---------------- ...ragment_top_bar.xml => top_search_bar.xml} | 5 +- 11 files changed, 88 insertions(+), 52 deletions(-) rename app/src/main/res/layout/{main_fragment_top_bar.xml => top_search_bar.xml} (97%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 671c3c450..2291ac6fd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,7 @@ diff --git a/app/src/main/java/org/linphone/ui/TopBarViewModel.kt b/app/src/main/java/org/linphone/ui/TopBarViewModel.kt index 2acdc18f5..4cb1e17eb 100644 --- a/app/src/main/java/org/linphone/ui/TopBarViewModel.kt +++ b/app/src/main/java/org/linphone/ui/TopBarViewModel.kt @@ -24,6 +24,8 @@ import androidx.lifecycle.ViewModel import org.linphone.utils.Event open class TopBarViewModel : ViewModel() { + val title = MutableLiveData() + val searchBarVisible = MutableLiveData() val searchFilter = MutableLiveData() diff --git a/app/src/main/java/org/linphone/ui/contacts/ContactsFragment.kt b/app/src/main/java/org/linphone/ui/contacts/ContactsFragment.kt index 4b863445b..8710b86ab 100644 --- a/app/src/main/java/org/linphone/ui/contacts/ContactsFragment.kt +++ b/app/src/main/java/org/linphone/ui/contacts/ContactsFragment.kt @@ -35,6 +35,7 @@ import org.linphone.databinding.ContactsFragmentBinding import org.linphone.ui.MainActivity import org.linphone.ui.contacts.viewmodel.ContactsListViewModel import org.linphone.utils.hideKeyboard +import org.linphone.utils.setKeyboardInsetListener import org.linphone.utils.showKeyboard class ContactsFragment : Fragment() { @@ -67,6 +68,11 @@ class ContactsFragment : Fragment() { binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = listViewModel + binding.root.setKeyboardInsetListener { keyboardVisible -> + // val portraitOrientation = resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE + listViewModel.bottomNavBarVisible.value = !keyboardVisible + } + // postponeEnterTransition() binding.setOnNewContactClicked { @@ -92,8 +98,8 @@ class ContactsFragment : Fragment() { } listViewModel.focusSearchBarEvent.observe(viewLifecycleOwner) { - it.consume { take -> - if (take) { + it.consume { show -> + if (show) { // To automatically open keyboard binding.topBar.search.showKeyboard(requireActivity().window) } else { diff --git a/app/src/main/java/org/linphone/ui/contacts/viewmodel/ContactsListViewModel.kt b/app/src/main/java/org/linphone/ui/contacts/viewmodel/ContactsListViewModel.kt index 046446877..cceba449d 100644 --- a/app/src/main/java/org/linphone/ui/contacts/viewmodel/ContactsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/contacts/viewmodel/ContactsListViewModel.kt @@ -19,6 +19,14 @@ */ package org.linphone.ui.contacts.viewmodel +import androidx.lifecycle.MutableLiveData import org.linphone.ui.TopBarViewModel -class ContactsListViewModel : TopBarViewModel() +class ContactsListViewModel : TopBarViewModel() { + val bottomNavBarVisible = MutableLiveData() + + init { + title.value = "Contacts" + bottomNavBarVisible.value = true + } +} diff --git a/app/src/main/java/org/linphone/ui/conversations/ConversationsFragment.kt b/app/src/main/java/org/linphone/ui/conversations/ConversationsFragment.kt index 4fdf657d0..b36cb7093 100644 --- a/app/src/main/java/org/linphone/ui/conversations/ConversationsFragment.kt +++ b/app/src/main/java/org/linphone/ui/conversations/ConversationsFragment.kt @@ -38,6 +38,8 @@ import org.linphone.R import org.linphone.databinding.ConversationsFragmentBinding import org.linphone.ui.conversations.adapter.ConversationsListAdapter import org.linphone.ui.conversations.viewmodel.ConversationsListViewModel +import org.linphone.utils.hideKeyboard +import org.linphone.utils.showKeyboard class ConversationsFragment : Fragment() { private lateinit var binding: ConversationsFragmentBinding @@ -144,6 +146,17 @@ class ConversationsFragment : Fragment() { } } + listViewModel.focusSearchBarEvent.observe(viewLifecycleOwner) { + it.consume { show -> + if (show) { + // To automatically open keyboard + binding.topBar.search.showKeyboard(requireActivity().window) + } else { + binding.topBar.search.hideKeyboard() + } + } + } + binding.setOnNewConversationClicked { if (findNavController().currentDestination?.id == R.id.conversationsFragment) { val action = ConversationsFragmentDirections.actionConversationsFragmentToNewConversationFragment() diff --git a/app/src/main/java/org/linphone/ui/conversations/viewmodel/ConversationsListViewModel.kt b/app/src/main/java/org/linphone/ui/conversations/viewmodel/ConversationsListViewModel.kt index 3df15f3b1..994bce3a6 100644 --- a/app/src/main/java/org/linphone/ui/conversations/viewmodel/ConversationsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/conversations/viewmodel/ConversationsListViewModel.kt @@ -20,7 +20,6 @@ package org.linphone.ui.conversations.viewmodel import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import java.util.ArrayList import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.contacts.ContactsListener @@ -29,11 +28,12 @@ import org.linphone.core.ChatRoom import org.linphone.core.Core import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log +import org.linphone.ui.TopBarViewModel import org.linphone.ui.conversations.data.ChatRoomData import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -class ConversationsListViewModel : ViewModel() { +class ConversationsListViewModel : TopBarViewModel() { val chatRoomsList = MutableLiveData>() val notifyItemChangedEvent = MutableLiveData>() @@ -101,6 +101,8 @@ class ConversationsListViewModel : ViewModel() { coreContext.postOnCoreThread { core -> updateChatRoomsList() } + + title.value = "Conversations" } override fun onCleared() { diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 58c0b2ddc..17ef5e422 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -20,12 +20,15 @@ package org.linphone.utils import android.content.Context +import android.view.View import android.view.Window import android.view.inputmethod.InputMethodManager import android.widget.ImageView import android.widget.TextView +import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat +import androidx.core.view.doOnLayout import androidx.databinding.BindingAdapter import coil.load import coil.transform.CircleCropTransformation @@ -49,6 +52,29 @@ fun TextInputLayout.hideKeyboard() { imm.hideSoftInputFromWindow(this.windowToken, 0) } +fun View.setKeyboardInsetListener(lambda: (visible: Boolean) -> Unit) { + doOnLayout { + var isKeyboardVisible = ViewCompat.getRootWindowInsets(this)?.isVisible( + WindowInsetsCompat.Type.ime() + ) == true + + lambda(isKeyboardVisible) + + // See https://issuetracker.google.com/issues/281942480 + ViewCompat.setOnApplyWindowInsetsListener( + rootView + ) { view, insets -> + val keyboardVisibilityChanged = ViewCompat.getRootWindowInsets(view) + ?.isVisible(WindowInsetsCompat.Type.ime()) == true + if (keyboardVisibilityChanged != isKeyboardVisible) { + isKeyboardVisible = keyboardVisibilityChanged + lambda(isKeyboardVisible) + } + ViewCompat.onApplyWindowInsets(view, insets) + } + } +} + @BindingAdapter("android:src") fun ImageView.setSourceImageResource(resource: Int) { this.setImageResource(resource) diff --git a/app/src/main/res/layout/bottom_nav_bar_conversations.xml b/app/src/main/res/layout/bottom_nav_bar_conversations.xml index 9e002df3e..d48a51506 100644 --- a/app/src/main/res/layout/bottom_nav_bar_conversations.xml +++ b/app/src/main/res/layout/bottom_nav_bar_conversations.xml @@ -12,6 +12,7 @@ diff --git a/app/src/main/res/layout/contacts_fragment.xml b/app/src/main/res/layout/contacts_fragment.xml index 9af1afe91..fa3b71309 100644 --- a/app/src/main/res/layout/contacts_fragment.xml +++ b/app/src/main/res/layout/contacts_fragment.xml @@ -28,7 +28,7 @@ android:id="@+id/top_bar" bind:viewModel="@{viewModel}" bind:onAvatarClickListener="@{onAvatarClickListener}" - layout="@layout/main_fragment_top_bar" /> + layout="@layout/top_search_bar" /> + + - - - + - - @@ -94,7 +59,7 @@ android:textColor="@color/blue_filter" android:drawablePadding="5dp" app:layout_constraintStart_toEndOf="@id/sort_by_label" - app:layout_constraintTop_toBottomOf="@id/search_bar" + app:layout_constraintTop_toBottomOf="@id/top_bar" app:drawableEndCompat="@drawable/spinner" />