Allow to undo last chat message swipe removal

This commit is contained in:
Sylvain Berfini 2022-01-11 14:49:10 +01:00
parent 9963381419
commit dabecf1077
6 changed files with 56 additions and 11 deletions

View file

@ -21,5 +21,6 @@ package org.linphone.activities
interface SnackBarActivity {
fun showSnackBar(resourceId: Int)
fun showSnackBar(resourceId: Int, action: Int, listener: () -> Unit)
fun showSnackBar(message: String)
}

View file

@ -49,6 +49,15 @@ class AssistantActivity : GenericActivity(), SnackBarActivity {
Snackbar.make(coordinator, resourceId, Snackbar.LENGTH_LONG).show()
}
override fun showSnackBar(resourceId: Int, action: Int, listener: () -> Unit) {
Snackbar
.make(findViewById(R.id.coordinator), resourceId, Snackbar.LENGTH_LONG)
.setAction(action) {
listener()
}
.show()
}
override fun showSnackBar(message: String) {
Snackbar.make(coordinator, message, Snackbar.LENGTH_LONG).show()
}

View file

@ -181,6 +181,16 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin
Snackbar.make(findViewById(R.id.coordinator), resourceId, Snackbar.LENGTH_LONG).show()
}
override fun showSnackBar(resourceId: Int, action: Int, listener: () -> Unit) {
Snackbar
.make(findViewById(R.id.coordinator), resourceId, Snackbar.LENGTH_LONG)
.setAction(action) {
Log.i("[Snack Bar] Action listener triggered")
listener()
}
.show()
}
override fun showSnackBar(message: String) {
Snackbar.make(findViewById(R.id.coordinator), message, Snackbar.LENGTH_LONG).show()
}

View file

@ -42,9 +42,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import java.io.File
import java.lang.IllegalArgumentException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.coroutines.*
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
@ -256,15 +254,10 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
override fun onRightToLeftSwipe(viewHolder: RecyclerView.ViewHolder) {
val position = viewHolder.bindingAdapterPosition
// adapter.notifyItemRemoved(viewHolder.bindingAdapterPosition)
val eventLog = adapter.currentList[position]
val chatMessage = eventLog.eventLog.chatMessage
if (chatMessage != null) {
Log.i("[Chat Room] Deleting message $chatMessage at position $position")
listViewModel.deleteMessage(chatMessage)
} else {
Log.i("[Chat Room] Deleting event $eventLog at position $position")
listViewModel.deleteEventLogs(arrayListOf(eventLog))
}
addDeleteMessageTaskToQueue(eventLog, position)
}
}
RecyclerViewSwipeUtils(ItemTouchHelper.RIGHT or ItemTouchHelper.LEFT, swipeConfiguration, swipeListener)
@ -842,6 +835,34 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
popupWindow.showAsDropDown(binding.menu, 0, 0, Gravity.BOTTOM)
}
private fun addDeleteMessageTaskToQueue(eventLog: EventLogData, position: Int) {
val task = lifecycleScope.launch {
delay(2800) // Duration of Snackbar.LENGTH_LONG
withContext(Dispatchers.Main) {
if (isActive) {
Log.i("[Chat Room] Message/event deletion task is still active, proceed")
val chatMessage = eventLog.eventLog.chatMessage
if (chatMessage != null) {
Log.i("[Chat Room] Deleting message $chatMessage at position $position")
listViewModel.deleteMessage(chatMessage)
} else {
Log.i("[Chat Room] Deleting event $eventLog at position $position")
listViewModel.deleteEventLogs(arrayListOf(eventLog))
}
}
}
}
(requireActivity() as MainActivity).showSnackBar(
R.string.chat_message_removal_info,
R.string.chat_message_abort_removal
) {
Log.i("[Chat Room] Canceled message/event deletion task: $task for message/event at position $position")
adapter.notifyItemRangeChanged(position, adapter.itemCount - position)
task.cancel()
}
}
private fun scrollToFirstUnreadMessageOrBottom(smooth: Boolean) {
if (_adapter != null && adapter.itemCount > 0) {
// Scroll to first unread message if any

View file

@ -630,4 +630,6 @@
<string name="audio_settings_prefer_bluetooth_devices_title">Acheminer l\'audio vers l\'appareil bluetooth, s\'il existe</string>
<string name="audio_settings_prefer_bluetooth_devices_summary">Il aura la priorité sur le périphérique de sortie par défaut</string>
<string name="call_settings_ringtones_title">Sonnerie</string>
<string name="chat_message_removal_info">Le message va être supprimé</string>
<string name="chat_message_abort_removal">Annuler</string>
</resources>

View file

@ -227,6 +227,8 @@
<item quantity="one">@string/chat_room_unread_message</item>
<item quantity="other">@string/chat_room_unread_messages</item>
</plurals>
<string name="chat_message_removal_info">Message will be deleted</string>
<string name="chat_message_abort_removal">Abort</string>
<!-- Recordings -->
<string name="recordings_empty_list">No recordings</string>