mirror of
https://github.com/fcitx5-android/fcitx5-android.git
synced 2026-08-03 14:18:54 +08:00
Manage edit/delete button with builtin Lifecycle
This commit is contained in:
parent
3c6e974ebf
commit
7a3ea861c8
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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 */ }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user