From 0a978f07d9827f4eb6d60cc0170932d7b78e185c Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 4 Aug 2023 10:37:05 +0200 Subject: [PATCH] Started contact details --- .../linphone/ui/contacts/ContactFragment.kt | 74 ++++++++ .../linphone/ui/contacts/ContactsFragment.kt | 24 +++ ...sListAdapter.kt => ContactsListAdapter.kt} | 9 +- .../ui/contacts/model/ContactModel.kt | 3 +- app/src/main/res/drawable/edit.xml | 13 ++ .../main/res/drawable/shape_button_round.xml | 5 + app/src/main/res/drawable/video_call.xml | 14 +- app/src/main/res/layout/contact_fragment.xml | 174 ++++++++++++++++++ app/src/main/res/layout/contact_list_cell.xml | 3 +- .../main/res/navigation/chat_nav_graph.xml | 14 ++ 10 files changed, 321 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/org/linphone/ui/contacts/ContactFragment.kt rename app/src/main/java/org/linphone/ui/contacts/adapter/{ConversationsListAdapter.kt => ContactsListAdapter.kt} (86%) create mode 100644 app/src/main/res/drawable/edit.xml create mode 100644 app/src/main/res/drawable/shape_button_round.xml create mode 100644 app/src/main/res/layout/contact_fragment.xml diff --git a/app/src/main/java/org/linphone/ui/contacts/ContactFragment.kt b/app/src/main/java/org/linphone/ui/contacts/ContactFragment.kt new file mode 100644 index 000000000..201a00070 --- /dev/null +++ b/app/src/main/java/org/linphone/ui/contacts/ContactFragment.kt @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2010-2023 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.linphone.ui.contacts + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.navArgs +import androidx.transition.AutoTransition +import org.linphone.R +import org.linphone.databinding.ContactFragmentBinding + +class ContactFragment : Fragment() { + private lateinit var binding: ContactFragmentBinding + + private val args: ContactFragmentArgs by navArgs() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + sharedElementEnterTransition = AutoTransition() + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = ContactFragmentBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.lifecycleOwner = viewLifecycleOwner + + val model = args.contact + binding.model = model + ViewCompat.setTransitionName(binding.avatar, "transition-avatar-${model.id}") + ViewCompat.setTransitionName(binding.name, "transition-name-${model.id}") + + binding.setBackClickListener { + requireActivity().onBackPressedDispatcher.onBackPressed() + } + } + + override fun onResume() { + super.onResume() + + val window = requireActivity().window + window.statusBarColor = ContextCompat.getColor(requireActivity(), R.color.white) + } +} 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 78bf8d5d5..2772129b2 100644 --- a/app/src/main/java/org/linphone/ui/contacts/ContactsFragment.kt +++ b/app/src/main/java/org/linphone/ui/contacts/ContactsFragment.kt @@ -28,7 +28,9 @@ import android.view.animation.Animation import android.view.animation.AnimationUtils import androidx.core.view.doOnPreDraw import androidx.fragment.app.Fragment +import androidx.navigation.findNavController import androidx.navigation.fragment.FragmentNavigatorExtras +import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels import androidx.recyclerview.widget.LinearLayoutManager @@ -104,6 +106,28 @@ class ContactsFragment : Fragment() { } } + adapter.contactClickedEvent.observe(viewLifecycleOwner) { + it.consume { pair -> + val b = pair.first + val model = pair.second + + if (findNavController().currentDestination?.id == R.id.contactsFragment) { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment + val extras = FragmentNavigatorExtras( + b.avatar to "transition-avatar-${model.id}", + b.name to "transition-name-${model.id}" + ) + val action = ContactFragmentDirections.actionGlobalContactFragment(model) + navHostFragment.navController.navigate(action, extras) + + if (!binding.slidingPaneLayout.isOpen) { + binding.slidingPaneLayout.openPane() + } + } + } + } + val layoutManager = LinearLayoutManager(requireContext()) binding.contactsList.layoutManager = layoutManager diff --git a/app/src/main/java/org/linphone/ui/contacts/adapter/ConversationsListAdapter.kt b/app/src/main/java/org/linphone/ui/contacts/adapter/ContactsListAdapter.kt similarity index 86% rename from app/src/main/java/org/linphone/ui/contacts/adapter/ConversationsListAdapter.kt rename to app/src/main/java/org/linphone/ui/contacts/adapter/ContactsListAdapter.kt index df3705eb0..4bf6ffd0a 100644 --- a/app/src/main/java/org/linphone/ui/contacts/adapter/ConversationsListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/contacts/adapter/ContactsListAdapter.kt @@ -2,6 +2,7 @@ package org.linphone.ui.contacts.adapter import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.view.ViewCompat import androidx.databinding.DataBindingUtil import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData @@ -18,8 +19,8 @@ class ContactsListAdapter( ) : ListAdapter(ContactDiffCallback()) { var selectedAdapterPosition = -1 - val contactClickedEvent: MutableLiveData> by lazy { - MutableLiveData>() + val contactClickedEvent: MutableLiveData>> by lazy { + MutableLiveData>>() } val contactLongClickedEvent: MutableLiveData> by lazy { @@ -72,9 +73,11 @@ class ContactsListAdapter( lifecycleOwner = viewLifecycleOwner binding.root.isSelected = bindingAdapterPosition == selectedAdapterPosition + ViewCompat.setTransitionName(binding.avatar, "transition-avatar-${contactModel.id}") + ViewCompat.setTransitionName(binding.name, "transition-name-${contactModel.id}") binding.setOnClickListener { - contactClickedEvent.value = Event(contactModel) + contactClickedEvent.value = Event(Pair(binding, contactModel)) } binding.setOnLongClickListener { diff --git a/app/src/main/java/org/linphone/ui/contacts/model/ContactModel.kt b/app/src/main/java/org/linphone/ui/contacts/model/ContactModel.kt index 60e1e385f..50d8fc4a0 100644 --- a/app/src/main/java/org/linphone/ui/contacts/model/ContactModel.kt +++ b/app/src/main/java/org/linphone/ui/contacts/model/ContactModel.kt @@ -23,12 +23,13 @@ import android.content.ContentUris import android.net.Uri import android.provider.ContactsContract import androidx.lifecycle.MutableLiveData +import java.io.Serializable import org.linphone.core.ConsolidatedPresence import org.linphone.core.Friend import org.linphone.core.FriendListenerStub import org.linphone.utils.LinphoneUtils -class ContactModel(val friend: Friend) { +class ContactModel(val friend: Friend) : Serializable { val id = friend.refKey val initials = LinphoneUtils.getInitials(friend.name.orEmpty()) diff --git a/app/src/main/res/drawable/edit.xml b/app/src/main/res/drawable/edit.xml new file mode 100644 index 000000000..7b739d9a5 --- /dev/null +++ b/app/src/main/res/drawable/edit.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/shape_button_round.xml b/app/src/main/res/drawable/shape_button_round.xml new file mode 100644 index 000000000..23e9ddfb0 --- /dev/null +++ b/app/src/main/res/drawable/shape_button_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/video_call.xml b/app/src/main/res/drawable/video_call.xml index c67c63d2f..58ab45aec 100644 --- a/app/src/main/res/drawable/video_call.xml +++ b/app/src/main/res/drawable/video_call.xml @@ -1,13 +1,13 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> diff --git a/app/src/main/res/layout/contact_fragment.xml b/app/src/main/res/layout/contact_fragment.xml new file mode 100644 index 000000000..c403686fc --- /dev/null +++ b/app/src/main/res/layout/contact_fragment.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/contact_list_cell.xml b/app/src/main/res/layout/contact_list_cell.xml index 04ac5280f..b12c99a7e 100644 --- a/app/src/main/res/layout/contact_list_cell.xml +++ b/app/src/main/res/layout/contact_list_cell.xml @@ -61,9 +61,10 @@ app:avatarViewInitialsTextSize="16sp" app:avatarViewInitialsTextStyle="bold" app:avatarViewShape="circle" + app:avatarViewBorderWidth="0dp" app:avatarViewIndicatorEnabled="true" app:avatarViewIndicatorBorderColor="@color/white" - app:avatarViewIndicatorSizeCriteria="6" + app:avatarViewIndicatorSizeCriteria="7" app:avatarViewIndicatorBorderSizeCriteria="8" app:avatarViewIndicatorPosition="bottomRight" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/navigation/chat_nav_graph.xml b/app/src/main/res/navigation/chat_nav_graph.xml index d888decfa..ca55b255e 100644 --- a/app/src/main/res/navigation/chat_nav_graph.xml +++ b/app/src/main/res/navigation/chat_nav_graph.xml @@ -10,4 +10,18 @@ android:name="org.linphone.ui.EmptyFragment" android:label="EmptyFragment" tools:layout="@layout/empty_fragment" /> + + + + + + + \ No newline at end of file