Fixed detail part of sliding pane when removing entry from the master list

This commit is contained in:
Sylvain Berfini 2021-07-13 16:32:12 +02:00
parent 12dcb10485
commit 188800e9bd
7 changed files with 119 additions and 23 deletions

View file

@ -309,6 +309,18 @@ internal fun MasterChatRoomsFragment.navigateToChatRoomCreation(
} }
} }
internal fun MasterChatRoomsFragment.clearDisplayedChatRoom() {
if (findNavController().currentDestination?.id == R.id.masterChatRoomsFragment) {
val navHostFragment =
childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment
navHostFragment.navController.navigate(
R.id.action_global_emptyChatFragment,
null,
popupTo(R.id.emptyChatFragment, true)
)
}
}
internal fun DetailChatRoomFragment.navigateToContacts(sipUriToAdd: String) { internal fun DetailChatRoomFragment.navigateToContacts(sipUriToAdd: String) {
val deepLink = "linphone-android://contact/new/$sipUriToAdd" val deepLink = "linphone-android://contact/new/$sipUriToAdd"
findMasterNavController().navigate(Uri.parse(deepLink), getLeftToRightAnimationNavOptions()) findMasterNavController().navigate(Uri.parse(deepLink), getLeftToRightAnimationNavOptions())
@ -465,6 +477,18 @@ internal fun MasterContactsFragment.navigateToContactEditor(sipUriToAdd: String?
} }
} }
internal fun MasterContactsFragment.clearDisplayedContact() {
if (findNavController().currentDestination?.id == R.id.masterContactsFragment) {
val navHostFragment =
childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment
navHostFragment.navController.navigate(
R.id.action_global_emptyContactFragment,
null,
popupTo(R.id.emptyContactFragment, true)
)
}
}
internal fun ContactEditorFragment.navigateToContact(contact: NativeContact) { internal fun ContactEditorFragment.navigateToContact(contact: NativeContact) {
val bundle = Bundle() val bundle = Bundle()
bundle.putString("id", contact.nativeId) bundle.putString("id", contact.nativeId)
@ -515,6 +539,18 @@ internal fun MasterCallLogsFragment.navigateToCallHistory() {
} }
} }
internal fun MasterCallLogsFragment.clearDisplayedCallHistory() {
if (findNavController().currentDestination?.id == R.id.masterCallLogsFragment) {
val navHostFragment =
childFragmentManager.findFragmentById(R.id.history_nav_container) as NavHostFragment
navHostFragment.navController.navigate(
R.id.action_global_emptyFragment,
null,
popupTo(R.id.emptyFragment, true)
)
}
}
internal fun MasterCallLogsFragment.navigateToDialer(args: Bundle?) { internal fun MasterCallLogsFragment.navigateToDialer(args: Bundle?) {
findNavController().navigate( findNavController().navigate(
R.id.action_global_dialerFragment, R.id.action_global_dialerFragment,

View file

@ -32,6 +32,7 @@ import androidx.slidingpanelayout.widget.SlidingPaneLayout
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericActivity import org.linphone.activities.GenericActivity
import org.linphone.activities.clearDisplayedChatRoom
import org.linphone.activities.main.MainActivity import org.linphone.activities.main.MainActivity
import org.linphone.activities.main.chat.adapters.ChatRoomsListAdapter import org.linphone.activities.main.chat.adapters.ChatRoomsListAdapter
import org.linphone.activities.main.chat.viewmodels.ChatRoomsListViewModel import org.linphone.activities.main.chat.viewmodels.ChatRoomsListViewModel
@ -163,7 +164,13 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
} }
viewModel.showDeleteButton({ viewModel.showDeleteButton({
listViewModel.deleteChatRoom(adapter.currentList[viewHolder.adapterPosition].chatRoom) val deletedChatRoom = adapter.currentList[viewHolder.adapterPosition].chatRoom
listViewModel.deleteChatRoom(deletedChatRoom)
if (!binding.slidingPane.isSlideable &&
deletedChatRoom == sharedViewModel.selectedChatRoom.value) {
Log.i("[Chat] Currently displayed chat room has been deleted, removing detail fragment")
clearDisplayedChatRoom()
}
dialog.dismiss() dialog.dismiss()
}, getString(R.string.dialog_delete)) }, getString(R.string.dialog_delete))
@ -296,11 +303,21 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
override fun deleteItems(indexesOfItemToDelete: ArrayList<Int>) { override fun deleteItems(indexesOfItemToDelete: ArrayList<Int>) {
val list = ArrayList<ChatRoom>() val list = ArrayList<ChatRoom>()
var closeSlidingPane = false
for (index in indexesOfItemToDelete) { for (index in indexesOfItemToDelete) {
val chatRoomViewModel = adapter.currentList[index] val chatRoomViewModel = adapter.currentList[index]
list.add(chatRoomViewModel.chatRoom) list.add(chatRoomViewModel.chatRoom)
if (chatRoomViewModel.chatRoom == sharedViewModel.selectedChatRoom.value) {
closeSlidingPane = true
}
} }
listViewModel.deleteChatRooms(list) listViewModel.deleteChatRooms(list)
if (!binding.slidingPane.isSlideable && closeSlidingPane) {
Log.i("[Chat] Currently displayed chat room has been deleted, removing detail fragment")
clearDisplayedChatRoom()
}
} }
private fun scrollToTop() { private fun scrollToTop() {

View file

@ -32,6 +32,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.slidingpanelayout.widget.SlidingPaneLayout import androidx.slidingpanelayout.widget.SlidingPaneLayout
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R import org.linphone.R
import org.linphone.activities.clearDisplayedContact
import org.linphone.activities.main.MainActivity import org.linphone.activities.main.MainActivity
import org.linphone.activities.main.contact.adapters.ContactsListAdapter import org.linphone.activities.main.contact.adapters.ContactsListAdapter
import org.linphone.activities.main.contact.viewmodels.ContactsListViewModel import org.linphone.activities.main.contact.viewmodels.ContactsListViewModel
@ -147,7 +148,13 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
} }
viewModel.showDeleteButton({ viewModel.showDeleteButton({
listViewModel.deleteContact(adapter.currentList[viewHolder.adapterPosition].contactInternal) val deletedContact = adapter.currentList[viewHolder.adapterPosition].contactInternal
listViewModel.deleteContact(deletedContact)
if (!binding.slidingPane.isSlideable &&
deletedContact == sharedViewModel.selectedContact.value) {
Log.i("[Contacts] Currently displayed contact has been deleted, removing detail fragment")
clearDisplayedContact()
}
dialog.dismiss() dialog.dismiss()
}, getString(R.string.dialog_delete)) }, getString(R.string.dialog_delete))
@ -258,11 +265,21 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
override fun deleteItems(indexesOfItemToDelete: ArrayList<Int>) { override fun deleteItems(indexesOfItemToDelete: ArrayList<Int>) {
val list = ArrayList<Contact>() val list = ArrayList<Contact>()
var closeSlidingPane = false
for (index in indexesOfItemToDelete) { for (index in indexesOfItemToDelete) {
val contact = adapter.currentList[index].contactInternal val contact = adapter.currentList[index].contactInternal
list.add(contact) list.add(contact)
if (contact == sharedViewModel.selectedContact.value) {
closeSlidingPane = true
}
} }
listViewModel.deleteContacts(list) listViewModel.deleteContacts(list)
if (!binding.slidingPane.isSlideable && closeSlidingPane) {
Log.i("[Contacts] Currently displayed contact has been deleted, removing detail fragment")
clearDisplayedContact()
}
} }
override fun onRequestPermissionsResult( override fun onRequestPermissionsResult(

View file

@ -31,6 +31,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.slidingpanelayout.widget.SlidingPaneLayout import androidx.slidingpanelayout.widget.SlidingPaneLayout
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R import org.linphone.R
import org.linphone.activities.clearDisplayedCallHistory
import org.linphone.activities.main.fragments.MasterFragment import org.linphone.activities.main.fragments.MasterFragment
import org.linphone.activities.main.history.adapters.CallLogsListAdapter import org.linphone.activities.main.history.adapters.CallLogsListAdapter
import org.linphone.activities.main.history.data.GroupedCallLogData import org.linphone.activities.main.history.data.GroupedCallLogData
@ -148,7 +149,13 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
} }
viewModel.showDeleteButton({ viewModel.showDeleteButton({
listViewModel.deleteCallLogGroup(adapter.currentList[viewHolder.adapterPosition]) val deletedCallGroup = adapter.currentList[viewHolder.adapterPosition]
listViewModel.deleteCallLogGroup(deletedCallGroup)
if (!binding.slidingPane.isSlideable &&
deletedCallGroup.lastCallLog.callId == sharedViewModel.selectedCallLogGroup.value?.lastCallLog?.callId) {
Log.i("[History] Currently displayed history has been deleted, removing detail fragment")
clearDisplayedCallHistory()
}
dialog.dismiss() dialog.dismiss()
}, getString(R.string.dialog_delete)) }, getString(R.string.dialog_delete))
@ -238,11 +245,21 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
override fun deleteItems(indexesOfItemToDelete: ArrayList<Int>) { override fun deleteItems(indexesOfItemToDelete: ArrayList<Int>) {
val list = ArrayList<GroupedCallLogData>() val list = ArrayList<GroupedCallLogData>()
var closeSlidingPane = false
for (index in indexesOfItemToDelete) { for (index in indexesOfItemToDelete) {
val callLogGroup = adapter.currentList[index] val callLogGroup = adapter.currentList[index]
list.add(callLogGroup) list.add(callLogGroup)
if (callLogGroup.lastCallLog.callId == sharedViewModel.selectedCallLogGroup.value?.lastCallLog?.callId) {
closeSlidingPane = true
}
} }
listViewModel.deleteCallLogGroups(list) listViewModel.deleteCallLogGroups(list)
if (!binding.slidingPane.isSlideable && closeSlidingPane) {
Log.i("[History] Currently displayed history has been deleted, removing detail fragment")
clearDisplayedCallHistory()
}
} }
private fun scrollToTop() { private fun scrollToTop() {

View file

@ -9,13 +9,16 @@
android:id="@+id/emptyChatFragment" android:id="@+id/emptyChatFragment"
android:name="org.linphone.activities.main.fragments.EmptyFragment" android:name="org.linphone.activities.main.fragments.EmptyFragment"
tools:layout="@layout/empty_fragment" tools:layout="@layout/empty_fragment"
android:label="EmptyFragment" /> android:label="EmptyFragment" />
<action android:id="@+id/action_global_emptyChatFragment"
app:destination="@id/emptyChatFragment" />
<fragment <fragment
android:id="@+id/detailChatRoomFragment" android:id="@+id/detailChatRoomFragment"
android:name="org.linphone.activities.main.chat.fragments.DetailChatRoomFragment" android:name="org.linphone.activities.main.chat.fragments.DetailChatRoomFragment"
tools:layout="@layout/chat_room_detail_fragment" tools:layout="@layout/chat_room_detail_fragment"
android:label="DetailChatRoomFragment" > android:label="DetailChatRoomFragment">
<action <action
android:id="@+id/action_detailChatRoomFragment_to_imdnFragment" android:id="@+id/action_detailChatRoomFragment_to_imdnFragment"
app:destination="@id/imdnFragment" /> app:destination="@id/imdnFragment" />
@ -30,11 +33,15 @@
app:destination="@id/ephemeralFragment" /> app:destination="@id/ephemeralFragment" />
</fragment> </fragment>
<action
android:id="@+id/action_global_detailChatRoomFragment"
app:destination="@id/detailChatRoomFragment" />
<fragment <fragment
android:id="@+id/chatRoomCreationFragment" android:id="@+id/chatRoomCreationFragment"
android:name="org.linphone.activities.main.chat.fragments.ChatRoomCreationFragment" android:name="org.linphone.activities.main.chat.fragments.ChatRoomCreationFragment"
tools:layout="@layout/chat_room_creation_fragment" tools:layout="@layout/chat_room_creation_fragment"
android:label="ChatRoomCreationFragment" > android:label="ChatRoomCreationFragment">
<argument <argument
android:name="createGroup" android:name="createGroup"
app:argType="boolean" app:argType="boolean"
@ -47,6 +54,10 @@
app:destination="@id/detailChatRoomFragment" /> app:destination="@id/detailChatRoomFragment" />
</fragment> </fragment>
<action
android:id="@+id/action_global_chatRoomCreationFragment"
app:destination="@id/chatRoomCreationFragment" />
<fragment <fragment
android:id="@+id/devicesFragment" android:id="@+id/devicesFragment"
android:name="org.linphone.activities.main.chat.fragments.DevicesFragment" android:name="org.linphone.activities.main.chat.fragments.DevicesFragment"
@ -57,7 +68,7 @@
android:id="@+id/groupInfoFragment" android:id="@+id/groupInfoFragment"
android:name="org.linphone.activities.main.chat.fragments.GroupInfoFragment" android:name="org.linphone.activities.main.chat.fragments.GroupInfoFragment"
tools:layout="@layout/chat_room_group_info_fragment" tools:layout="@layout/chat_room_group_info_fragment"
android:label="GroupInfoFragment" > android:label="GroupInfoFragment">
<action <action
android:id="@+id/action_groupInfoFragment_to_chatRoomCreationFragment" android:id="@+id/action_groupInfoFragment_to_chatRoomCreationFragment"
app:destination="@id/chatRoomCreationFragment" /> app:destination="@id/chatRoomCreationFragment" />
@ -70,20 +81,12 @@
android:id="@+id/imdnFragment" android:id="@+id/imdnFragment"
android:name="org.linphone.activities.main.chat.fragments.ImdnFragment" android:name="org.linphone.activities.main.chat.fragments.ImdnFragment"
tools:layout="@layout/chat_room_imdn_fragment" tools:layout="@layout/chat_room_imdn_fragment"
android:label="ImdnFragment" > android:label="ImdnFragment">
<argument <argument
android:name="MessageId" android:name="MessageId"
app:argType="string" /> app:argType="string" />
</fragment> </fragment>
<action
android:id="@+id/action_global_detailChatRoomFragment"
app:destination="@id/detailChatRoomFragment" />
<action
android:id="@+id/action_global_chatRoomCreationFragment"
app:destination="@id/chatRoomCreationFragment" />
<fragment <fragment
android:id="@+id/ephemeralFragment" android:id="@+id/ephemeralFragment"
android:name="org.linphone.activities.main.chat.fragments.EphemeralFragment" android:name="org.linphone.activities.main.chat.fragments.EphemeralFragment"

View file

@ -9,7 +9,10 @@
android:id="@+id/emptyContactFragment" android:id="@+id/emptyContactFragment"
android:name="org.linphone.activities.main.fragments.EmptyFragment" android:name="org.linphone.activities.main.fragments.EmptyFragment"
tools:layout="@layout/empty_fragment" tools:layout="@layout/empty_fragment"
android:label="EmptyFragment"/> android:label="EmptyFragment" />
<action android:id="@+id/action_global_emptyContactFragment"
app:destination="@id/emptyContactFragment" />
<fragment <fragment
android:id="@+id/detailContactFragment" android:id="@+id/detailContactFragment"
@ -26,11 +29,15 @@
app:destination="@id/chat_nav_graph.xml" /> app:destination="@id/chat_nav_graph.xml" />
</fragment> </fragment>
<action
android:id="@+id/action_global_detailContactFragment"
app:destination="@id/detailContactFragment" />
<fragment <fragment
android:id="@+id/contactEditorFragment" android:id="@+id/contactEditorFragment"
android:name="org.linphone.activities.main.contact.fragments.ContactEditorFragment" android:name="org.linphone.activities.main.contact.fragments.ContactEditorFragment"
tools:layout="@layout/contact_editor_fragment" tools:layout="@layout/contact_editor_fragment"
android:label="ContactEditorFragment" > android:label="ContactEditorFragment">
<argument <argument
android:name="SipUri" android:name="SipUri"
app:argType="string" app:argType="string"
@ -40,10 +47,6 @@
app:destination="@id/detailContactFragment" /> app:destination="@id/detailContactFragment" />
</fragment> </fragment>
<action
android:id="@+id/action_global_detailContactFragment"
app:destination="@id/detailContactFragment" />
<action <action
android:id="@+id/action_global_contactEditorFragment" android:id="@+id/action_global_contactEditorFragment"
app:destination="@id/contactEditorFragment" /> app:destination="@id/contactEditorFragment" />

View file

@ -9,7 +9,10 @@
android:id="@+id/emptyFragment" android:id="@+id/emptyFragment"
android:name="org.linphone.activities.main.fragments.EmptyFragment" android:name="org.linphone.activities.main.fragments.EmptyFragment"
tools:layout="@layout/empty_fragment" tools:layout="@layout/empty_fragment"
android:label="EmptyFragment"/> android:label="EmptyFragment" />
<action android:id="@+id/action_global_emptyFragment"
app:destination="@id/emptyFragment" />
<fragment <fragment
android:id="@+id/detailCallLogFragment" android:id="@+id/detailCallLogFragment"