From 254cf3d9cf0d65f6cf704acc78a433e1cfd6b2a7 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 31 Jul 2023 17:17:21 +0200 Subject: [PATCH] Open/close keyboard when search bar is made visible/gone --- .../linphone/ui/contacts/ContactsFragment.kt | 13 ++++++++++++ .../viewmodel/ContactsListViewModel.kt | 7 +++++++ .../org/linphone/utils/DataBindingUtils.kt | 18 +++++++++++++++++ app/src/main/res/layout/contacts_fragment.xml | 20 +++++++++---------- 4 files changed, 48 insertions(+), 10 deletions(-) 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 09ad5cd5e..a5131b319 100644 --- a/app/src/main/java/org/linphone/ui/contacts/ContactsFragment.kt +++ b/app/src/main/java/org/linphone/ui/contacts/ContactsFragment.kt @@ -33,6 +33,8 @@ import androidx.transition.AutoTransition import org.linphone.R import org.linphone.databinding.ContactsFragmentBinding import org.linphone.ui.contacts.viewmodel.ContactsListViewModel +import org.linphone.utils.hideKeyboard +import org.linphone.utils.showKeyboard class ContactsFragment : Fragment() { private lateinit var binding: ContactsFragmentBinding @@ -84,6 +86,17 @@ class ContactsFragment : Fragment() { } } + listViewModel.focusSearchBarEvent.observe(viewLifecycleOwner) { + it.consume { take -> + if (take) { + // To automatically open keyboard + binding.search.showKeyboard(requireActivity().window) + } else { + binding.search.hideKeyboard() + } + } + } + /*(view.parent as? ViewGroup)?.doOnPreDraw { startPostponedEnterTransition() }*/ 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 3504f70cb..a9601ea4d 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 @@ -21,22 +21,29 @@ package org.linphone.ui.contacts.viewmodel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import org.linphone.utils.Event class ContactsListViewModel : ViewModel() { val searchBarVisible = MutableLiveData() val searchFilter = MutableLiveData() + val focusSearchBarEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + init { searchBarVisible.value = false } fun openSearchBar() { searchBarVisible.value = true + focusSearchBarEvent.value = Event(true) } fun closeSearchBar() { searchBarVisible.value = false + focusSearchBarEvent.value = Event(false) } fun clearFilter() { diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 831a3e698..95f507fa2 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -19,8 +19,14 @@ */ package org.linphone.utils +import android.content.Context +import android.view.Window +import android.view.inputmethod.InputMethodManager import android.widget.ImageView import android.widget.TextView +import androidx.appcompat.widget.AppCompatEditText +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat import androidx.databinding.BindingAdapter import coil.load import coil.transform.CircleCropTransformation @@ -31,6 +37,18 @@ import org.linphone.contacts.ContactData * This file contains all the data binding necessary for the app */ +fun AppCompatEditText.showKeyboard(window: Window) { + this.requestFocus() + /*val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)*/ + WindowCompat.getInsetsController(window, this).show(WindowInsetsCompat.Type.ime()) +} + +fun AppCompatEditText.hideKeyboard() { + val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(this.windowToken, 0) +} + @BindingAdapter("android:src") fun ImageView.setSourceImageResource(resource: Int) { this.setImageResource(resource) diff --git a/app/src/main/res/layout/contacts_fragment.xml b/app/src/main/res/layout/contacts_fragment.xml index af45ba261..4fc4407a1 100644 --- a/app/src/main/res/layout/contacts_fragment.xml +++ b/app/src/main/res/layout/contacts_fragment.xml @@ -25,13 +25,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:constraint_referenced_ids="avatar, title, search_toggle" - android:visibility="@{viewModel.searchBarVisible ? View.INVISIBLE : View.VISIBLE}" /> + android:visibility="@{viewModel.searchBarVisible ? View.GONE : View.VISIBLE, default=gone}" /> + android:visibility="@{viewModel.searchBarVisible ? View.VISIBLE : View.GONE}" /> - @@ -130,7 +130,7 @@ android:id="@+id/background" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginTop="20dp" + android:layout_marginTop="17dp" android:src="@drawable/shape_white_background" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"