From 2b606a2dec0952285324dd88ef75aefb40f0b83e Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 21 Dec 2023 11:09:26 -0400 Subject: [PATCH] Add update-tick for call log timestamps. --- .../securesms/calls/log/CallLogAdapter.kt | 30 ++++++++++++------- .../securesms/calls/log/CallLogFragment.kt | 20 +++++++++---- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt index a9d3f90c3b..d5ffc9e24d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt @@ -32,6 +32,11 @@ class CallLogAdapter( callbacks: Callbacks ) : PagingMappingAdapter() { + companion object { + private const val PAYLOAD_SELECTION_STATE = "PAYLOAD_SELECTION_STATE" + private const val PAYLOAD_TIMESTAMP = "PAYLOAD_TIMESTAMP" + } + init { registerFactory( CallModel::class.java, @@ -72,6 +77,10 @@ class CallLogAdapter( ) } + fun onTimestampTick() { + notifyItemRangeChanged(0, itemCount, PAYLOAD_TIMESTAMP) + } + fun submitCallRows( rows: List, selectionState: CallLogSelectionState, @@ -98,9 +107,6 @@ class CallLogAdapter( val selectionState: CallLogSelectionState, val itemCount: Int ) : MappingModel { - companion object { - const val PAYLOAD_SELECTION_STATE = "PAYLOAD_SELECTION_STATE" - } override fun areItemsTheSame(newItem: CallModel): Boolean = call.id == newItem.call.id override fun areContentsTheSame(newItem: CallModel): Boolean { @@ -133,10 +139,6 @@ class CallLogAdapter( val itemCount: Int ) : MappingModel { - companion object { - const val PAYLOAD_SELECTION_STATE = "PAYLOAD_SELECTION_STATE" - } - override fun areItemsTheSame(newItem: CallLinkModel): Boolean { return callLink.record.roomId == newItem.callLink.record.roomId } @@ -149,7 +151,7 @@ class CallLogAdapter( override fun getChangePayload(newItem: CallLinkModel): Any? { return if (callLink == newItem.callLink && (!isSelectionStateTheSame(newItem) || !isItemCountTheSame(newItem))) { - CallModel.PAYLOAD_SELECTION_STATE + PAYLOAD_SELECTION_STATE } else { null } @@ -183,6 +185,10 @@ class CallLogAdapter( private val onStartVideoCallClicked: (Recipient) -> Unit ) : BindingViewHolder(binding) { override fun bind(model: CallLinkModel) { + if (payload.size == 1 && payload.contains(PAYLOAD_TIMESTAMP)) { + return + } + itemView.setOnClickListener { onCallLinkClicked(model.callLink) } @@ -195,7 +201,7 @@ class CallLogAdapter( binding.callSelected.isChecked = model.selectionState.contains(model.callLink.id) binding.callSelected.visible = model.selectionState.isNotEmpty(model.itemCount) - if (payload.contains(CallModel.PAYLOAD_SELECTION_STATE)) { + if (payload.isNotEmpty()) { return } @@ -252,7 +258,11 @@ class CallLogAdapter( binding.callSelected.isChecked = model.selectionState.contains(model.call.id) binding.callSelected.visible = model.selectionState.isNotEmpty(model.itemCount) - if (payload.contains(CallModel.PAYLOAD_SELECTION_STATE)) { + if (payload.contains(PAYLOAD_TIMESTAMP)) { + presentCallInfo(model.call, model.call.date) + } + + if (payload.isNotEmpty()) { return } diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt index 79198caa94..5681dfec1b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt @@ -43,6 +43,7 @@ import org.thoughtcrime.securesms.components.menu.ActionItem import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity import org.thoughtcrime.securesms.components.settings.app.notifications.manual.NotificationProfileSelectionFragment import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsActivity +import org.thoughtcrime.securesms.conversation.ConversationUpdateTick import org.thoughtcrime.securesms.conversation.SignalBottomActionBarController import org.thoughtcrime.securesms.conversationlist.ConversationFilterBehavior import org.thoughtcrime.securesms.conversationlist.chatfilter.ConversationFilterSource @@ -81,6 +82,8 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal private val disposables = LifecycleDisposable() private val callLogContextMenu = CallLogContextMenu(this, this) private val callLogActionMode = CallLogActionMode(CallLogActionModeCallback()) + private val conversationUpdateTick: ConversationUpdateTick = ConversationUpdateTick(this::onTimestampTick) + private var callLogAdapter: CallLogAdapter? = null private lateinit var signalBottomActionBarController: SignalBottomActionBarController @@ -115,20 +118,22 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal requireActivity().addMenuProvider(menuProvider, viewLifecycleOwner) initializeSharedElementTransition() - val adapter = CallLogAdapter(this) + viewLifecycleOwner.lifecycle.addObserver(conversationUpdateTick) + + val callLogAdapter = CallLogAdapter(this) disposables.bindTo(viewLifecycleOwner) - adapter.setPagingController(viewModel.controller) + callLogAdapter.setPagingController(viewModel.controller) val scrollToPositionDelegate = ScrollToPositionDelegate( recyclerView = binding.recycler, - canJumpToPosition = { adapter.isAvailableAround(it) } + canJumpToPosition = { callLogAdapter.isAvailableAround(it) } ) disposables += scrollToPositionDelegate disposables += Flowables.combineLatest(viewModel.data, viewModel.selected) .observeOn(AndroidSchedulers.mainThread()) .subscribe { (data, selected) -> - val filteredCount = adapter.submitCallRows( + val filteredCount = callLogAdapter.submitCallRows( data, selected, scrollToPositionDelegate::notifyListCommitted @@ -147,7 +152,8 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal } } - binding.recycler.adapter = adapter + binding.recycler.adapter = callLogAdapter + this.callLogAdapter = callLogAdapter requireListener().bindScrollHelper(binding.recycler) binding.fab.setOnClickListener { @@ -200,6 +206,10 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal viewModel.markAllCallEventsRead() } + private fun onTimestampTick() { + callLogAdapter?.onTimestampTick() + } + private fun initializeSharedElementTransition() { ViewCompat.setTransitionName(binding.fab, "new_convo_fab") ViewCompat.setTransitionName(binding.fabSharedElementTarget, "camera_fab")