Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

REM-929 - Add progress bar on Google tasks screens #293

Merged
merged 1 commit into from
Jan 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ package com.elementary.tasks.googletasks

import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.viewModelScope
import com.github.naz013.appwidgets.AppWidgetUpdater
import com.elementary.tasks.core.arch.BaseProgressViewModel
import com.elementary.tasks.core.data.Commands
import com.elementary.tasks.core.data.adapter.google.UiGoogleTaskListAdapter
import com.elementary.tasks.core.data.ui.google.UiGoogleTaskList
import com.elementary.tasks.core.utils.withUIContext
import com.elementary.tasks.googletasks.usecase.tasklist.SyncAllGoogleTaskLists
import com.github.naz013.appwidgets.AppWidgetUpdater
import com.github.naz013.cloudapi.googletasks.GoogleTasksApi
import com.github.naz013.domain.GoogleTask
import com.github.naz013.domain.GoogleTaskList
Expand Down Expand Up @@ -58,7 +58,10 @@ class GoogleTasksViewModel(
uiGoogleTaskListAdapter.convert(it, map[it.listId])
}

_defTaskList.postValue(googleTaskLists.firstOrNull { it.isDefault() })
val defTaskList = googleTaskLists.firstOrNull { it.isDefault() }
?: googleTaskLists.firstOrNull()

defTaskList?.also { _defTaskList.postValue(it) }
_googleTaskLists.postValue(googleTaskLists)
_allGoogleTasks.postValue(googleTasks)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@ import com.elementary.tasks.navigation.toolbarfragment.BaseToolbarFragment
import com.github.naz013.common.intent.IntentKeys
import com.github.naz013.feature.common.livedata.nonNullObserve
import com.github.naz013.logging.Logger
import com.github.naz013.ui.common.view.gone
import com.github.naz013.ui.common.view.visible
import com.github.naz013.ui.common.view.visibleGone
import com.github.naz013.ui.common.view.visibleInvisible
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf

Expand Down Expand Up @@ -70,6 +69,11 @@ class PreviewGoogleTaskFragment : BaseToolbarFragment<FragmentGoogleTaskPreviewB

else -> false
}
},
menuModifier = { menu ->
val isInProgress = viewModel.isInProgress.value ?: false
menu.findItem(R.id.action_delete)?.isEnabled = !isInProgress
menu.findItem(R.id.action_edit)?.isEnabled = !isInProgress
}
)

Expand Down Expand Up @@ -112,13 +116,9 @@ class PreviewGoogleTaskFragment : BaseToolbarFragment<FragmentGoogleTaskPreviewB
}
}
viewModel.isInProgress.nonNullObserve(this) {
if (it) {
binding.animationView.visible()
binding.animationView.playAnimation()
} else {
binding.animationView.gone()
binding.animationView.cancelAnimation()
}
binding.progressBar.visibleInvisible(it)
binding.buttonComplete.isEnabled = !it
invalidateOptionsMenu()
}
}

Expand Down Expand Up @@ -156,6 +156,10 @@ class PreviewGoogleTaskFragment : BaseToolbarFragment<FragmentGoogleTaskPreviewB
}
}

override fun canGoBack(): Boolean {
return viewModel.isInProgress.value?.not() ?: true
}

companion object {
private const val TAG = "PreviewGoogleTaskFragment"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ import com.github.naz013.feature.common.livedata.nullObserve
import com.github.naz013.logging.Logger
import com.github.naz013.ui.common.fragment.hideKeyboard
import com.github.naz013.ui.common.fragment.toast
import com.github.naz013.ui.common.menu.enableOrDisableItem
import com.github.naz013.ui.common.menu.showOrHideItem
import com.github.naz013.ui.common.view.visibleGone
import com.github.naz013.ui.common.view.visibleInvisible
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf
Expand Down Expand Up @@ -54,9 +57,6 @@ class EditGoogleTaskFragment : BaseToolbarFragment<FragmentGoogleTaskEditBinding
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initFields()

binding.progressMessageView.text = getString(R.string.please_wait)

addMenu(
menuRes = R.menu.fragment_google_task_edit,
onMenuItemListener = { menuItem ->
Expand All @@ -65,20 +65,28 @@ class EditGoogleTaskFragment : BaseToolbarFragment<FragmentGoogleTaskEditBinding
deleteDialog()
true
}

R.id.action_move -> {
doIfPossible { selectList(true) }
true
}

R.id.action_add -> {
doIfPossible { saveTask() }
true
}

else -> false
}
},
menuModifier = { menu ->
menu.getItem(1).isVisible = viewModel.editedTask != null
menu.getItem(2).isVisible = viewModel.editedTask != null
menu.showOrHideItem(R.id.action_delete, viewModel.editedTask != null)
menu.showOrHideItem(R.id.action_move, viewModel.editedTask != null)

val isInProgress = viewModel.isInProgress.value ?: false
menu.enableOrDisableItem(R.id.action_delete, !isInProgress)
menu.enableOrDisableItem(R.id.action_move, !isInProgress)
menu.enableOrDisableItem(R.id.action_add, !isInProgress)
}
)

Expand All @@ -93,9 +101,7 @@ class EditGoogleTaskFragment : BaseToolbarFragment<FragmentGoogleTaskEditBinding
}

private fun initViewModel() {
viewModel.isInProgress.nonNullObserve(viewLifecycleOwner) {
binding.progressView.visibleGone(it)
}
viewModel.isInProgress.nonNullObserve(viewLifecycleOwner) { onProgressChanged(it) }
viewModel.result.nonNullObserve(viewLifecycleOwner) { commands ->
when (commands) {
Commands.SAVED, Commands.DELETED -> moveBack()
Expand All @@ -112,6 +118,15 @@ class EditGoogleTaskFragment : BaseToolbarFragment<FragmentGoogleTaskEditBinding
lifecycle.addObserver(viewModel)
}

private fun onProgressChanged(isInProgress: Boolean) {
binding.progressBar.visibleInvisible(isInProgress)
binding.listText.isEnabled = !isInProgress
binding.dateField.isEnabled = !isInProgress
binding.timeField.isEnabled = !isInProgress
binding.editField.isEnabled = !isInProgress
invalidateOptionsMenu()
}

private fun showTaskList(googleTaskList: GoogleTaskList) {
binding.listText.text = googleTaskList.title
}
Expand Down Expand Up @@ -284,6 +299,10 @@ class EditGoogleTaskFragment : BaseToolbarFragment<FragmentGoogleTaskEditBinding
}
}

override fun canGoBack(): Boolean {
return viewModel.isInProgress.value?.not() ?: true
}

companion object {
private const val TAG = "EditGoogleTaskFragment"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ import com.github.naz013.feature.common.livedata.nonNullObserve
import com.github.naz013.logging.Logger
import com.github.naz013.ui.common.fragment.hideKeyboard
import com.github.naz013.ui.common.fragment.toast
import com.github.naz013.ui.common.menu.enableOrDisableItem
import com.github.naz013.ui.common.menu.showOrHideItem
import com.github.naz013.ui.common.theme.ThemeProvider
import com.github.naz013.ui.common.view.visibleGone
import com.github.naz013.ui.common.view.visibleInvisible
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf
Expand Down Expand Up @@ -50,8 +52,7 @@ class EditGoogleTaskListFragment : BaseToolbarFragment<FragmentGoogleTaskListEdi

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.progressMessageView.text = getString(R.string.please_wait)
updateProgress(false)
onProgressChanged(false)

binding.colorSlider.setColors(ThemeProvider.colorsForSliderThemed(requireContext()))
binding.colorSlider.setSelectorColorResource(
Expand Down Expand Up @@ -83,7 +84,11 @@ class EditGoogleTaskListFragment : BaseToolbarFragment<FragmentGoogleTaskListEdi
}
},
menuModifier = { menu ->
menu.getItem(1).isVisible = viewModel.canDelete()
menu.showOrHideItem(R.id.action_delete, viewModel.canDelete())

val isInProgress = viewModel.isInProgress.value ?: false
menu.enableOrDisableItem(R.id.action_delete, !isInProgress)
menu.enableOrDisableItem(R.id.action_add, !isInProgress)
}
)

Expand All @@ -99,7 +104,7 @@ class EditGoogleTaskListFragment : BaseToolbarFragment<FragmentGoogleTaskListEdi

private fun initViewModel() {
viewModel.googleTaskList.nonNullObserve(this) { showTaskList(it) }
viewModel.isInProgress.nonNullObserve(this) { updateProgress(it) }
viewModel.isInProgress.nonNullObserve(this) { onProgressChanged(it) }
viewModel.result.nonNullObserve(this) { commands ->
if (commands == Commands.DELETED || commands == Commands.SAVED) {
moveBack()
Expand All @@ -125,8 +130,12 @@ class EditGoogleTaskListFragment : BaseToolbarFragment<FragmentGoogleTaskListEdi
invalidateOptionsMenu()
}

private fun updateProgress(b: Boolean) {
binding.progressView.visibleGone(b)
private fun onProgressChanged(isInProgress: Boolean) {
binding.progressBar.visibleInvisible(isInProgress)
binding.colorSlider.isEnabled = !isInProgress
binding.editField.isEnabled = !isInProgress
binding.defaultCheck.isEnabled = !isInProgress
invalidateOptionsMenu()
}

private fun saveTaskList() {
Expand All @@ -135,21 +144,11 @@ class EditGoogleTaskListFragment : BaseToolbarFragment<FragmentGoogleTaskListEdi
binding.nameLayout.showError(R.string.must_be_not_empty)
return
}
var isNew = false
val item = (viewModel.editedTaskList ?: GoogleTaskList().also { isNew = true }).apply {
title = listName
color = binding.colorSlider.selectedItem
updated = System.currentTimeMillis()
}
if (binding.defaultCheck.isChecked) {
item.def = 1
}

if (isNew) {
viewModel.newGoogleTaskList(item)
} else {
viewModel.updateGoogleTaskList(item)
}
viewModel.save(
listName = listName,
color = binding.colorSlider.selectedItem,
isDefault = binding.defaultCheck.isChecked
)
}

private fun deleteDialog() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,25 @@ class EditGoogleTaskListViewModel(
}
}

fun newGoogleTaskList(googleTaskList: GoogleTaskList) {
fun save(listName: String, color: Int, isDefault: Boolean) {
var isNew = false
val item = (editedTaskList ?: GoogleTaskList().also { isNew = true }).apply {
this.title = listName
this.color = color
this.updated = System.currentTimeMillis()
}
if (isDefault) {
item.def = 1
}

if (isNew) {
newGoogleTaskList(item)
} else {
updateGoogleTaskList(item)
}
}

private fun newGoogleTaskList(googleTaskList: GoogleTaskList) {
postInProgress(true)
Logger.i(
TAG,
Expand All @@ -112,19 +130,21 @@ class EditGoogleTaskListViewModel(
googleTaskListRepository.save(it)
}
}
googleTasksApi.saveTasksList(googleTaskList.title, googleTaskList.color)?.let {
googleTaskListRepository.save(it)
analyticsEventSender.send(FeatureUsedEvent(Feature.CREATE_GOOGLE_TASK_LIST))
postInProgress(false)
postCommand(Commands.SAVED)
} ?: run {
googleTasksApi.saveTasksList(googleTaskList.title, googleTaskList.color)
?.apply { this.def = googleTaskList.def }
?.let {
googleTaskListRepository.save(it)
analyticsEventSender.send(FeatureUsedEvent(Feature.CREATE_GOOGLE_TASK_LIST))
postInProgress(false)
postCommand(Commands.SAVED)
} ?: run {
postInProgress(false)
postCommand(Commands.FAILED)
}
}
}

fun updateGoogleTaskList(googleTaskList: GoogleTaskList) {
private fun updateGoogleTaskList(googleTaskList: GoogleTaskList) {
postInProgress(true)
Logger.i(TAG, "Updating Google Task List (${googleTaskList.listId})")
viewModelScope.launch(dispatcherProvider.default()) {
Expand Down
Loading
Loading