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