mirror of
https://gitlab.linphone.org/BC/public/linphone-android.git
synced 2026-01-17 19:38:08 +00:00
Changes
This commit is contained in:
parent
bd51fe383b
commit
5dfd04ad70
11 changed files with 88 additions and 52 deletions
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
<activity
|
||||
android:name=".ui.MainActivity"
|
||||
android:windowSoftInputMode="adjustResize"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name">
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@ import androidx.lifecycle.ViewModel
|
|||
import org.linphone.utils.Event
|
||||
|
||||
open class TopBarViewModel : ViewModel() {
|
||||
val title = MutableLiveData<String>()
|
||||
|
||||
val searchBarVisible = MutableLiveData<Boolean>()
|
||||
|
||||
val searchFilter = MutableLiveData<String>()
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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<Boolean>()
|
||||
|
||||
init {
|
||||
title.value = "Contacts"
|
||||
bottomNavBarVisible.value = true
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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<ArrayList<ChatRoomData>>()
|
||||
|
||||
val notifyItemChangedEvent = MutableLiveData<Event<Int>>()
|
||||
|
|
@ -101,6 +101,8 @@ class ConversationsListViewModel : ViewModel() {
|
|||
coreContext.postOnCoreThread { core ->
|
||||
updateChatRoomsList()
|
||||
}
|
||||
|
||||
title.value = "Conversations"
|
||||
}
|
||||
|
||||
override fun onCleared() {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:transitionName="bottom_nav_bar"
|
||||
android:id="@+id/bottom_nav_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/background"
|
||||
|
|
@ -66,8 +66,21 @@
|
|||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/no_contacts_image" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/contactsList"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginStart="10dp"
|
||||
android:layout_marginEnd="10dp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/background"
|
||||
app:layout_constraintBottom_toTopOf="@id/bottom_nav_bar" />
|
||||
|
||||
<include
|
||||
bind:onConversationsClicked="@{onConversationsClicked}"
|
||||
android:visibility="@{viewModel.bottomNavBarVisible ? View.VISIBLE : View.GONE}"
|
||||
android:id="@+id/bottom_nav_bar"
|
||||
layout="@layout/bottom_nav_bar_contacts"
|
||||
android:layout_width="0dp"
|
||||
|
|
|
|||
|
|
@ -21,56 +21,21 @@
|
|||
android:layout_height="match_parent"
|
||||
android:background="@color/primary_color">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Conversations"
|
||||
android:textSize="20sp"
|
||||
android:textColor="#FFFFFF"
|
||||
android:textStyle="bold"
|
||||
android:layout_margin="20dp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"/>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/menu"
|
||||
android:layout_marginStart="22dp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/title"
|
||||
app:layout_constraintBottom_toBottomOf="@id/title"/>
|
||||
<include
|
||||
android:id="@+id/top_bar"
|
||||
bind:viewModel="@{viewModel}"
|
||||
layout="@layout/top_search_bar" />
|
||||
|
||||
<ImageView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginTop="17dp"
|
||||
android:src="@drawable/shape_white_background"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/title"
|
||||
app:layout_constraintTop_toBottomOf="@id/top_bar"
|
||||
app:layout_constraintBottom_toBottomOf="parent" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/search_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="30dp"
|
||||
android:layout_marginStart="30dp"
|
||||
android:layout_marginEnd="30dp"
|
||||
android:padding="10dp"
|
||||
android:drawableStart="@drawable/search"
|
||||
android:drawablePadding="10dp"
|
||||
android:background="@drawable/shape_search_round_background"
|
||||
android:hint="Rechercher un contact, une conversation..."
|
||||
android:textSize="14sp"
|
||||
android:inputType="textPersonName|textNoSuggestions"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/title" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/sort_by_label"
|
||||
android:layout_width="wrap_content"
|
||||
|
|
@ -79,7 +44,7 @@
|
|||
android:text="Trier par"
|
||||
android:textSize="12sp"
|
||||
android:textColor="@color/gray_5"
|
||||
app:layout_constraintStart_toStartOf="@id/search_bar"
|
||||
app:layout_constraintStart_toStartOf="@id/top_bar"
|
||||
app:layout_constraintTop_toTopOf="@id/sort_by"
|
||||
app:layout_constraintBottom_toBottomOf="@id/sort_by"/>
|
||||
|
||||
|
|
@ -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" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@
|
|||
android:layout_marginTop="20dp"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:gravity="center_vertical"
|
||||
android:text="Contacts"
|
||||
android:text="@{viewModel.title, default=`Title`}"
|
||||
android:textColor="#FFFFFF"
|
||||
android:textSize="20sp"
|
||||
android:textStyle="bold"
|
||||
|
|
@ -98,8 +98,7 @@
|
|||
android:layout_marginTop="20dp"
|
||||
android:gravity="center_vertical"
|
||||
android:textColorHint="@color/gray_6"
|
||||
android:hint="Search contacts"
|
||||
app:hintEnabled="@{viewModel.searchFilter.length() == 0}"
|
||||
app:hintEnabled="false"
|
||||
app:hintAnimationEnabled="false"
|
||||
app:hintTextColor="@color/gray_6"
|
||||
app:boxStrokeWidth="0dp"
|
||||
Loading…
Add table
Reference in a new issue