Skip to content

Commit

Permalink
REM-929 - Add progress bar on Google tasks screens
Browse files Browse the repository at this point in the history
  • Loading branch information
naz013 committed Jan 19, 2025
1 parent 0c9d8ec commit 7c03951
Show file tree
Hide file tree
Showing 10 changed files with 481 additions and 446 deletions.
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

0 comments on commit 7c03951

Please sign in to comment.