Manage edit/delete button with builtin Lifecycle

This commit is contained in:
iovxw 2026-07-22 17:23:35 +08:00
parent 3c6e974ebf
commit 7a3ea861c8
No known key found for this signature in database
GPG Key ID: C84626C2D3D79995
12 changed files with 134 additions and 155 deletions

View File

@ -15,6 +15,7 @@ import androidx.annotation.CallSuper
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import org.fcitx.fcitx5.android.ui.main.MainViewModel
import org.fcitx.fcitx5.android.ui.main.MainViewModel.ButtonMode
import java.util.Collections
abstract class DynamicListAdapter<T>(
@ -161,18 +162,14 @@ abstract class DynamicListAdapter<T>(
}
}
onBackPressedDispatcher.addCallback(onBackPressedCallback!!)
it.enableToolbarDeleteButton {
deleteSelected()
exitMultiSelect()
}
it.hideToolbarEditButton()
it.toolbarButton.value = ButtonMode.DELETE
multiselect = true
notifyDataSetChanged()
}
}
private fun deleteSelected() {
internal fun deleteSelected() {
if (!multiselect || selected.isEmpty())
return
val indexed = selected.mapNotNull { entry ->
@ -192,12 +189,10 @@ abstract class DynamicListAdapter<T>(
if (!multiselect)
return
onBackPressedCallback?.remove()
it.disableToolbarDeleteButton()
multiselect = false
selected.clear()
notifyDataSetChanged()
if (entries.isNotEmpty())
it.showToolbarEditButton()
it.toolbarButton.value = if (entries.isNotEmpty()) ButtonMode.EDIT else ButtonMode.NONE
}
}
@ -208,7 +203,7 @@ abstract class DynamicListAdapter<T>(
_entries.add(idx, item)
notifyItemInserted(idx)
listener?.onItemAdded(idx, item)
mainViewModel?.showToolbarEditButton()
mainViewModel?.toolbarButton?.value = ButtonMode.EDIT
}
@CallSuper
@ -217,7 +212,7 @@ abstract class DynamicListAdapter<T>(
notifyItemRemoved(idx)
listener?.onItemRemoved(idx, item)
if (entries.isEmpty())
mainViewModel?.hideToolbarEditButton()
mainViewModel?.toolbarButton?.value = ButtonMode.NONE
return item
}

View File

@ -11,12 +11,16 @@ import android.view.MenuItem
import androidx.core.view.MenuHost
import androidx.core.view.MenuProvider
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import org.fcitx.fcitx5.android.R
import org.fcitx.fcitx5.android.ui.main.MainViewModel.ButtonMode
import org.fcitx.fcitx5.android.utils.item
import splitties.resources.styledColor
class EditDeleteMenuProvider<T>(
private val viewModel: MainViewModel,
private val buttonMode: LiveData<ButtonMode>,
private val editButtonAction: (() -> Unit)?,
private val deleteButtonAction: (() -> Unit)?,
menuHost: T,
lifecycleOwner: LifecycleOwner,
) : MenuProvider where T : MenuHost, T : Context {
@ -24,25 +28,26 @@ class EditDeleteMenuProvider<T>(
private val tint = menuHost.styledColor(android.R.attr.colorControlNormal)
init {
// Automatically rebuild the menu whenever the edit/delete button state changes
viewModel.toolbarEditButtonVisible.observe(lifecycleOwner) { menuHost.invalidateMenu() }
viewModel.toolbarEditButtonOnClickListener.observe(lifecycleOwner) { menuHost.invalidateMenu() }
viewModel.toolbarDeleteButtonOnClickListener.observe(lifecycleOwner) { menuHost.invalidateMenu() }
buttonMode.observe(lifecycleOwner) { menuHost.invalidateMenu() }
}
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
val editListener = viewModel.toolbarEditButtonOnClickListener.value
val editVisible = viewModel.toolbarEditButtonVisible.value == true
if (editListener != null && editVisible) {
menu.item(R.string.edit, R.drawable.ic_baseline_edit_24, tint, true) {
editListener()
when (buttonMode.value) {
ButtonMode.EDIT -> {
if (editButtonAction != null) {
menu.item(R.string.edit, R.drawable.ic_baseline_edit_24, tint, true) {
editButtonAction()
}
}
}
}
val deleteListener = viewModel.toolbarDeleteButtonOnClickListener.value
if (deleteListener != null) {
menu.item(R.string.delete, R.drawable.ic_baseline_delete_24, tint, true) {
deleteListener()
ButtonMode.DELETE -> {
if (deleteButtonAction != null) {
menu.item(R.string.delete, R.drawable.ic_baseline_delete_24, tint, true) {
deleteButtonAction()
}
}
}
ButtonMode.NONE, null -> { /* no buttons */ }
}
}

View File

@ -34,7 +34,7 @@ class MainFragment : PaddingPreferenceFragment() {
// AboutMenuProvider is tied to viewLifecycleOwner, so the about menu items
// are automatically shown when this Fragment is visible and removed when it's not
requireActivity().addMenuProvider(
AboutMenuProvider(), viewLifecycleOwner, Lifecycle.State.RESUMED
AboutMenuProvider(), viewLifecycleOwner, Lifecycle.State.STARTED
)
}

View File

@ -13,15 +13,13 @@ import org.fcitx.fcitx5.android.utils.appContext
class MainViewModel : ViewModel() {
enum class ButtonMode { NONE, EDIT, DELETE }
val toolbarTitle = MutableLiveData(appContext.getString(R.string.app_name))
val toolbarShadow = MutableLiveData(true)
val toolbarEditButtonVisible = MutableLiveData(false)
val toolbarEditButtonOnClickListener = MutableLiveData<(() -> Unit)?>()
val toolbarDeleteButtonOnClickListener = MutableLiveData<(() -> Unit)?>()
val toolbarButton = MutableLiveData(ButtonMode.NONE)
val fcitx: FcitxConnection = FcitxDaemon.connect(javaClass.name)
@ -37,32 +35,6 @@ class MainViewModel : ViewModel() {
toolbarShadow.value = false
}
fun enableToolbarEditButton(visible: Boolean = true, onClick: () -> Unit) {
toolbarEditButtonOnClickListener.value = onClick
toolbarEditButtonVisible.value = visible
}
fun disableToolbarEditButton() {
toolbarEditButtonOnClickListener.value = null
hideToolbarEditButton()
}
fun hideToolbarEditButton() {
toolbarEditButtonVisible.value = false
}
fun showToolbarEditButton() {
toolbarEditButtonVisible.value = true
}
fun enableToolbarDeleteButton(onClick: () -> Unit) {
toolbarDeleteButtonOnClickListener.value = onClick
}
fun disableToolbarDeleteButton() {
toolbarDeleteButtonOnClickListener.value = null
}
override fun onCleared() {
FcitxDaemon.disconnect(javaClass.name)
}

View File

@ -11,16 +11,17 @@ import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import org.fcitx.fcitx5.android.core.Key
import org.fcitx.fcitx5.android.core.RawConfig
import org.fcitx.fcitx5.android.ui.common.BaseDynamicListUi
import org.fcitx.fcitx5.android.ui.common.DynamicListUi
import org.fcitx.fcitx5.android.ui.main.EditDeleteMenuProvider
import org.fcitx.fcitx5.android.ui.main.MainViewModel
import org.fcitx.fcitx5.android.ui.main.MainViewModel.ButtonMode
import org.fcitx.fcitx5.android.utils.config.ConfigDescriptor
import org.fcitx.fcitx5.android.utils.config.ConfigType
import org.fcitx.fcitx5.android.utils.lazyRoute
import splitties.resources.styledColor
class ListFragment : Fragment() {
@ -139,24 +140,27 @@ class ListFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.toolbarButton.value =
if (ui.entries.isNotEmpty()) ButtonMode.EDIT else ButtonMode.NONE
requireActivity().addMenuProvider(
EditDeleteMenuProvider(viewModel, requireActivity(), viewLifecycleOwner),
viewLifecycleOwner
EditDeleteMenuProvider(
buttonMode = viewModel.toolbarButton,
editButtonAction = { ui.enterMultiSelect(requireActivity().onBackPressedDispatcher) },
deleteButtonAction = { ui.deleteSelected(); ui.exitMultiSelect() },
menuHost = requireActivity(),
lifecycleOwner = viewLifecycleOwner,
),
viewLifecycleOwner,
Lifecycle.State.STARTED
)
}
override fun onStart() {
super.onStart()
viewModel.setToolbarTitle(descriptor.description ?: descriptor.name)
if (uiInitialized) {
viewModel.enableToolbarEditButton(ui.entries.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
}
}
override fun onStop() {
viewModel.disableToolbarEditButton()
if (uiInitialized) {
ui.exitMultiSelect()
}

View File

@ -14,6 +14,7 @@ import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -26,11 +27,11 @@ import org.fcitx.fcitx5.android.ui.common.BaseDynamicListUi
import org.fcitx.fcitx5.android.ui.common.OnItemChangedListener
import org.fcitx.fcitx5.android.ui.main.EditDeleteMenuProvider
import org.fcitx.fcitx5.android.ui.main.MainViewModel
import org.fcitx.fcitx5.android.ui.main.MainViewModel.ButtonMode
import org.fcitx.fcitx5.android.utils.NaiveDustman
import org.fcitx.fcitx5.android.utils.materialTextInput
import org.fcitx.fcitx5.android.utils.onPositiveButtonClick
import org.fcitx.fcitx5.android.utils.str
import splitties.resources.styledColor
import splitties.views.dsl.core.add
import splitties.views.dsl.core.lParams
import splitties.views.dsl.core.matchParent
@ -169,17 +170,23 @@ class PinyinCustomPhraseFragment : Fragment(), OnItemChangedListener<PinyinCusto
ui.addTouchCallback()
resetDustman()
ui.setViewModel(viewModel)
viewModel.enableToolbarEditButton(initialEntries.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
return ui.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.toolbarButton.value =
if (ui.entries.isNotEmpty()) ButtonMode.EDIT else ButtonMode.NONE
requireActivity().addMenuProvider(
EditDeleteMenuProvider(viewModel, requireActivity(), viewLifecycleOwner),
viewLifecycleOwner
EditDeleteMenuProvider(
buttonMode = viewModel.toolbarButton,
editButtonAction = { ui.enterMultiSelect(requireActivity().onBackPressedDispatcher) },
deleteButtonAction = { ui.deleteSelected(); ui.exitMultiSelect() },
menuHost = requireActivity(),
lifecycleOwner = viewLifecycleOwner,
),
viewLifecycleOwner,
Lifecycle.State.STARTED
)
}
@ -225,15 +232,11 @@ class PinyinCustomPhraseFragment : Fragment(), OnItemChangedListener<PinyinCusto
}
viewModel.setToolbarTitle(title)
}
viewModel.enableToolbarEditButton(ui.entries.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
}
override fun onStop() {
saveConfig()
ui.exitMultiSelect()
viewModel.disableToolbarEditButton()
super.onStop()
}

View File

@ -17,6 +17,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.NotificationCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -31,12 +32,12 @@ import org.fcitx.fcitx5.android.ui.common.BaseDynamicListUi
import org.fcitx.fcitx5.android.ui.common.OnItemChangedListener
import org.fcitx.fcitx5.android.ui.main.EditDeleteMenuProvider
import org.fcitx.fcitx5.android.ui.main.MainViewModel
import org.fcitx.fcitx5.android.ui.main.MainViewModel.ButtonMode
import org.fcitx.fcitx5.android.utils.NaiveDustman
import org.fcitx.fcitx5.android.utils.importErrorDialog
import org.fcitx.fcitx5.android.utils.lazyRoute
import org.fcitx.fcitx5.android.utils.notificationManager
import org.fcitx.fcitx5.android.utils.queryFileName
import splitties.resources.styledColor
import java.util.concurrent.atomic.AtomicBoolean
class PinyinDictionaryFragment : Fragment(), OnItemChangedListener<PinyinDictionary> {
@ -109,9 +110,18 @@ class PinyinDictionaryFragment : Fragment(), OnItemChangedListener<PinyinDiction
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
args.uri?.let { importFromUri(Uri.parse(it)) }
super.onViewCreated(view, savedInstanceState)
viewModel.toolbarButton.value =
if (ui.entries.isNotEmpty()) ButtonMode.EDIT else ButtonMode.NONE
requireActivity().addMenuProvider(
EditDeleteMenuProvider(viewModel, requireActivity(), viewLifecycleOwner),
viewLifecycleOwner
EditDeleteMenuProvider(
buttonMode = viewModel.toolbarButton,
editButtonAction = { ui.enterMultiSelect(requireActivity().onBackPressedDispatcher) },
deleteButtonAction = { ui.deleteSelected(); ui.exitMultiSelect() },
menuHost = requireActivity(),
lifecycleOwner = viewLifecycleOwner,
),
viewLifecycleOwner,
Lifecycle.State.STARTED
)
}
@ -222,18 +232,8 @@ class PinyinDictionaryFragment : Fragment(), OnItemChangedListener<PinyinDiction
dustman.addOrUpdate(new.name, new.isEnabled)
}
override fun onStart() {
super.onStart()
if (uiInitialized) {
viewModel.enableToolbarEditButton(ui.entries.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
}
}
override fun onStop() {
reloadDict()
viewModel.disableToolbarEditButton()
if (uiInitialized) {
ui.exitMultiSelect()
}

View File

@ -6,6 +6,7 @@ package org.fcitx.fcitx5.android.ui.main.settings
import android.app.AlertDialog
import android.view.View
import androidx.lifecycle.Lifecycle
import org.fcitx.fcitx5.android.R
import org.fcitx.fcitx5.android.core.RawConfig
import org.fcitx.fcitx5.android.core.getPunctuationConfig
@ -15,12 +16,12 @@ import org.fcitx.fcitx5.android.data.punctuation.PunctuationMapEntry
import org.fcitx.fcitx5.android.ui.common.BaseDynamicListUi
import org.fcitx.fcitx5.android.ui.common.OnItemChangedListener
import org.fcitx.fcitx5.android.ui.main.EditDeleteMenuProvider
import org.fcitx.fcitx5.android.ui.main.MainViewModel.ButtonMode
import org.fcitx.fcitx5.android.utils.NaiveDustman
import org.fcitx.fcitx5.android.utils.lazyRoute
import org.fcitx.fcitx5.android.utils.materialTextInput
import org.fcitx.fcitx5.android.utils.onPositiveButtonClick
import org.fcitx.fcitx5.android.utils.str
import splitties.resources.styledColor
import splitties.views.dsl.core.add
import splitties.views.dsl.core.lParams
import splitties.views.dsl.core.matchParent
@ -140,13 +141,19 @@ class PunctuationEditorFragment : ProgressFragment(), OnItemChangedListener<Punc
}
}
resetDustman()
viewModel.toolbarButton.value =
if (ui.entries.isNotEmpty()) ButtonMode.EDIT else ButtonMode.NONE
requireActivity().addMenuProvider(
EditDeleteMenuProvider(viewModel, requireActivity(), viewLifecycleOwner),
viewLifecycleOwner
EditDeleteMenuProvider(
buttonMode = viewModel.toolbarButton,
editButtonAction = { ui.enterMultiSelect(requireActivity().onBackPressedDispatcher) },
deleteButtonAction = { ui.deleteSelected(); ui.exitMultiSelect() },
menuHost = requireActivity(),
lifecycleOwner = viewLifecycleOwner,
),
viewLifecycleOwner,
Lifecycle.State.STARTED
)
viewModel.enableToolbarEditButton(initialEntries.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
return ui.root
}
@ -173,16 +180,10 @@ class PunctuationEditorFragment : ProgressFragment(), OnItemChangedListener<Punc
override fun onStart() {
super.onStart()
viewModel.setToolbarTitle(args.title)
if (isInitialized) {
viewModel.enableToolbarEditButton(ui.entries.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
}
}
override fun onStop() {
saveConfig()
viewModel.disableToolbarEditButton()
if (isInitialized) {
ui.exitMultiSelect()
}

View File

@ -8,6 +8,7 @@ import android.app.AlertDialog
import android.os.Bundle
import android.view.View
import android.view.inputmethod.EditorInfo
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -19,12 +20,12 @@ import org.fcitx.fcitx5.android.data.quickphrase.QuickPhraseEntry
import org.fcitx.fcitx5.android.ui.common.BaseDynamicListUi
import org.fcitx.fcitx5.android.ui.common.OnItemChangedListener
import org.fcitx.fcitx5.android.ui.main.EditDeleteMenuProvider
import org.fcitx.fcitx5.android.ui.main.MainViewModel.ButtonMode
import org.fcitx.fcitx5.android.utils.NaiveDustman
import org.fcitx.fcitx5.android.utils.lazyRoute
import org.fcitx.fcitx5.android.utils.materialTextInput
import org.fcitx.fcitx5.android.utils.onPositiveButtonClick
import org.fcitx.fcitx5.android.utils.str
import splitties.resources.styledColor
import splitties.views.dsl.core.add
import splitties.views.dsl.core.lParams
import splitties.views.dsl.core.matchParent
@ -120,13 +121,19 @@ class QuickPhraseEditFragment : ProgressFragment(), OnItemChangedListener<QuickP
ui.addTouchCallback()
resetDustman()
ui.setViewModel(viewModel)
viewModel.toolbarButton.value =
if (ui.entries.isNotEmpty()) ButtonMode.EDIT else ButtonMode.NONE
requireActivity().addMenuProvider(
EditDeleteMenuProvider(viewModel, requireActivity(), viewLifecycleOwner),
viewLifecycleOwner
EditDeleteMenuProvider(
buttonMode = viewModel.toolbarButton,
editButtonAction = { ui.enterMultiSelect(requireActivity().onBackPressedDispatcher) },
deleteButtonAction = { ui.deleteSelected(); ui.exitMultiSelect() },
menuHost = requireActivity(),
lifecycleOwner = viewLifecycleOwner,
),
viewLifecycleOwner,
Lifecycle.State.STARTED
)
viewModel.enableToolbarEditButton(initialEntries.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
return ui.root
}
@ -171,11 +178,6 @@ class QuickPhraseEditFragment : ProgressFragment(), OnItemChangedListener<QuickP
override fun onStart() {
super.onStart()
viewModel.setToolbarTitle(quickPhrase.name)
if (isInitialized) {
viewModel.enableToolbarEditButton(ui.entries.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
}
}
override fun onStop() {
@ -183,7 +185,6 @@ class QuickPhraseEditFragment : ProgressFragment(), OnItemChangedListener<QuickP
if (isInitialized) {
ui.exitMultiSelect()
}
viewModel.disableToolbarEditButton()
super.onStop()
}

View File

@ -19,6 +19,7 @@ import androidx.appcompat.widget.PopupMenu
import androidx.core.app.NotificationCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -33,6 +34,7 @@ import org.fcitx.fcitx5.android.ui.common.BaseDynamicListUi
import org.fcitx.fcitx5.android.ui.common.OnItemChangedListener
import org.fcitx.fcitx5.android.ui.main.EditDeleteMenuProvider
import org.fcitx.fcitx5.android.ui.main.MainViewModel
import org.fcitx.fcitx5.android.ui.main.MainViewModel.ButtonMode
import org.fcitx.fcitx5.android.utils.NaiveDustman
import org.fcitx.fcitx5.android.utils.importErrorDialog
import org.fcitx.fcitx5.android.utils.item
@ -300,9 +302,18 @@ class QuickPhraseListFragment : Fragment(), OnItemChangedListener<QuickPhrase> {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.toolbarButton.value =
if (ui.entries.isNotEmpty()) ButtonMode.EDIT else ButtonMode.NONE
requireActivity().addMenuProvider(
EditDeleteMenuProvider(viewModel, requireActivity(), viewLifecycleOwner),
viewLifecycleOwner
EditDeleteMenuProvider(
buttonMode = viewModel.toolbarButton,
editButtonAction = { ui.enterMultiSelect(requireActivity().onBackPressedDispatcher) },
deleteButtonAction = { ui.deleteSelected(); ui.exitMultiSelect() },
menuHost = requireActivity(),
lifecycleOwner = viewLifecycleOwner,
),
viewLifecycleOwner,
Lifecycle.State.STARTED
)
}
@ -323,18 +334,8 @@ class QuickPhraseListFragment : Fragment(), OnItemChangedListener<QuickPhrase> {
dustman.addOrUpdate(new.name, new.isEnabled)
}
override fun onStart() {
super.onStart()
if (uiInitialized) {
viewModel.enableToolbarEditButton(ui.entries.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
}
}
override fun onStop() {
reloadQuickPhrase()
viewModel.disableToolbarEditButton()
if (uiInitialized) {
ui.exitMultiSelect()
}

View File

@ -18,6 +18,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.NotificationCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -31,6 +32,7 @@ import org.fcitx.fcitx5.android.ui.common.BaseDynamicListUi
import org.fcitx.fcitx5.android.ui.common.OnItemChangedListener
import org.fcitx.fcitx5.android.ui.main.EditDeleteMenuProvider
import org.fcitx.fcitx5.android.ui.main.MainViewModel
import org.fcitx.fcitx5.android.ui.main.MainViewModel.ButtonMode
import org.fcitx.fcitx5.android.utils.NaiveDustman
import org.fcitx.fcitx5.android.utils.importErrorDialog
import org.fcitx.fcitx5.android.utils.notificationManager
@ -38,7 +40,6 @@ import org.fcitx.fcitx5.android.utils.onPositiveButtonClick
import org.fcitx.fcitx5.android.utils.positiveButton
import org.fcitx.fcitx5.android.utils.queryFileName
import splitties.resources.drawable
import splitties.resources.styledColor
import splitties.resources.styledDrawable
import splitties.views.imageDrawable
@ -131,9 +132,18 @@ class TableInputMethodFragment : Fragment(), OnItemChangedListener<TableBasedInp
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.toolbarButton.value =
if (ui.entries.isNotEmpty()) ButtonMode.EDIT else ButtonMode.NONE
requireActivity().addMenuProvider(
EditDeleteMenuProvider(viewModel, requireActivity(), viewLifecycleOwner),
viewLifecycleOwner
EditDeleteMenuProvider(
buttonMode = viewModel.toolbarButton,
editButtonAction = { ui.enterMultiSelect(requireActivity().onBackPressedDispatcher) },
deleteButtonAction = { ui.deleteSelected(); ui.exitMultiSelect() },
menuHost = requireActivity(),
lifecycleOwner = viewLifecycleOwner,
),
viewLifecycleOwner,
Lifecycle.State.STARTED
)
}
@ -405,18 +415,8 @@ class TableInputMethodFragment : Fragment(), OnItemChangedListener<TableBasedInp
batchRemove(indexed)
}
override fun onStart() {
super.onStart()
if (uiInitialized) {
viewModel.enableToolbarEditButton(ui.entries.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
}
}
override fun onStop() {
reloadConfig()
viewModel.disableToolbarEditButton()
if (uiInitialized) {
ui.exitMultiSelect()
}

View File

@ -6,6 +6,7 @@ package org.fcitx.fcitx5.android.ui.main.settings.im
import android.os.Build
import android.view.View
import androidx.lifecycle.Lifecycle
import org.fcitx.fcitx5.android.core.InputMethodEntry
import org.fcitx.fcitx5.android.core.SubtypeManager
import org.fcitx.fcitx5.android.daemon.launchOnReady
@ -13,10 +14,10 @@ import org.fcitx.fcitx5.android.ui.common.BaseDynamicListUi
import org.fcitx.fcitx5.android.ui.common.DynamicListUi
import org.fcitx.fcitx5.android.ui.common.OnItemChangedListener
import org.fcitx.fcitx5.android.ui.main.EditDeleteMenuProvider
import org.fcitx.fcitx5.android.ui.main.MainViewModel.ButtonMode
import org.fcitx.fcitx5.android.ui.main.settings.ProgressFragment
import org.fcitx.fcitx5.android.ui.main.settings.SettingsRoute
import org.fcitx.fcitx5.android.utils.navigateWithAnim
import splitties.resources.styledColor
class InputMethodListFragment : ProgressFragment(), OnItemChangedListener<InputMethodEntry> {
@ -53,30 +54,26 @@ class InputMethodListFragment : ProgressFragment(), OnItemChangedListener<InputM
)
ui.addOnItemChangedListener(this@InputMethodListFragment)
ui.setViewModel(viewModel)
viewModel.toolbarButton.value =
if (ui.entries.isNotEmpty()) ButtonMode.EDIT else ButtonMode.NONE
requireActivity().addMenuProvider(
EditDeleteMenuProvider(viewModel, requireActivity(), viewLifecycleOwner),
viewLifecycleOwner
EditDeleteMenuProvider(
buttonMode = viewModel.toolbarButton,
editButtonAction = { ui.enterMultiSelect(requireActivity().onBackPressedDispatcher) },
deleteButtonAction = { ui.deleteSelected(); ui.exitMultiSelect() },
menuHost = requireActivity(),
lifecycleOwner = viewLifecycleOwner,
),
viewLifecycleOwner,
Lifecycle.State.STARTED
)
viewModel.enableToolbarEditButton(initialEnabled.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
return ui.root
}
override fun onStart() {
super.onStart()
if (::ui.isInitialized) {
viewModel.enableToolbarEditButton(ui.entries.isNotEmpty()) {
ui.enterMultiSelect(requireActivity().onBackPressedDispatcher)
}
}
}
override fun onStop() {
if (::ui.isInitialized) {
ui.exitMultiSelect()
}
viewModel.disableToolbarEditButton()
super.onStop()
}