mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-20 08:39:22 +01:00
Fix action mode to use our own action mode toolbar instead of the built in androidx one.
This commit is contained in:
committed by
Cody Henthorne
parent
4db60ac63f
commit
74d9195d94
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user