Fix action mode to use our own action mode toolbar instead of the built in androidx one.

This commit is contained in:
lisa-signal
2025-06-03 14:22:35 -04:00
committed by Cody Henthorne
parent 4db60ac63f
commit 74d9195d94
7 changed files with 98 additions and 101 deletions

View File

@@ -1,72 +1,37 @@
package org.thoughtcrime.securesms.calls.log
import android.content.res.Resources
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.view.ActionMode
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.main.MainToolbarViewModel
class CallLogActionMode(
private val callback: Callback
) : ActionMode.Callback {
private val callback: Callback,
private val mainToolbarViewModel: MainToolbarViewModel
) {
private var actionMode: ActionMode? = null
private var count: Int = 0
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
mode?.title = getTitle(1)
return true
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
return false
}
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
return true
}
override fun onDestroyActionMode(mode: ActionMode?) {
callback.onResetSelectionState()
endIfActive()
}
fun isInActionMode(): Boolean {
return actionMode != null
}
fun getCount(): Int {
return if (actionMode != null) count else 0
return if (mainToolbarViewModel.isInActionMode()) count else 0
}
fun setCount(count: Int) {
this.count = count
actionMode?.title = getTitle(count)
mainToolbarViewModel.setActionModeCount(count)
}
fun start() {
actionMode = callback.startActionMode(this)
callback.startActionMode()
}
fun end() {
callback.onActionModeWillEnd()
actionMode?.finish()
count = 0
actionMode = null
}
private fun getTitle(callLogsSelected: Int): String {
return callback.getResources().getQuantityString(R.plurals.ConversationListFragment_s_selected, callLogsSelected, callLogsSelected)
}
private fun endIfActive() {
if (actionMode != null) {
end()
if (mainToolbarViewModel.isInActionMode()) {
callback.onActionModeWillEnd()
count = 0
}
}
interface Callback {
fun startActionMode(callback: ActionMode.Callback): ActionMode?
fun startActionMode()
fun onActionModeWillEnd()
fun getResources(): Resources
fun onResetSelectionState()

View File

@@ -7,8 +7,6 @@ import android.view.View
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode
import androidx.compose.material3.SnackbarDuration
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.fragment.app.Fragment
@@ -77,7 +75,7 @@ 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 lateinit var callLogActionMode: CallLogActionMode
private val conversationUpdateTick: ConversationUpdateTick = ConversationUpdateTick(this::onTimestampTick)
private var callLogAdapter: CallLogAdapter? = null
@@ -91,6 +89,8 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal
viewLifecycleOwner.lifecycle.addObserver(conversationUpdateTick)
viewLifecycleOwner.lifecycle.addObserver(viewModel.callLogPeekHelper)
callLogActionMode = CallLogActionMode(CallLogActionModeCallback(), mainToolbarViewModel)
val callLogAdapter = CallLogAdapter(this)
disposables.bindTo(viewLifecycleOwner)
@@ -134,7 +134,7 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal
.subscribe { (selected, totalCount) ->
if (selected.isNotEmpty(totalCount)) {
callLogActionMode.setCount(selected.count(totalCount))
} else if (callLogActionMode.isInActionMode()) {
} else if (mainToolbarViewModel.isInActionMode()) {
callLogActionMode.end()
}
}
@@ -275,7 +275,7 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal
}
override fun canStartNestedScroll(): Boolean {
return !callLogActionMode.isInActionMode() && !isSearchOpen()
return !mainToolbarViewModel.isInActionMode() && !isSearchOpen()
}
}
@@ -464,17 +464,16 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal
override fun onBottomActionBarVisibilityChanged(visibility: Int) = Unit
}
private inner class CallLogActionModeCallback : CallLogActionMode.Callback {
override fun startActionMode(callback: ActionMode.Callback): ActionMode? {
val actionMode = (requireActivity() as AppCompatActivity).startSupportActionMode(callback)
inner class CallLogActionModeCallback : CallLogActionMode.Callback {
override fun startActionMode() {
requireListener<Callback>().onMultiSelectStarted()
signalBottomActionBarController.setVisibility(true)
return actionMode
}
override fun onActionModeWillEnd() {
requireListener<Callback>().onMultiSelectFinished()
signalBottomActionBarController.setVisibility(false)
viewModel.clearSelected()
}
override fun getResources(): Resources = resources