diff --git a/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt index 5c61d5b64..c1bfbcdca 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt @@ -27,10 +27,6 @@ class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() { private val viewModel: CaldavCalendarViewModel by viewModels() - private val createCalendarViewModel: CreateCalendarViewModel by viewModels() - private val deleteCalendarViewModel: DeleteCalendarViewModel by viewModels() - private val updateCalendarViewModel: UpdateCalendarViewModel by viewModels() - override val layout = R.layout.activity_caldav_calendar_settings override fun onCreate(savedInstanceState: Bundle?) { @@ -43,13 +39,10 @@ class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() { viewModel.error.value = null } } - - createCalendarViewModel.observe(this, this::createSuccessful, this::requestFailed) - deleteCalendarViewModel.observe(this, this::onDeleted, this::requestFailed) - updateCalendarViewModel.observe( - this, - { updateCalendar() }, - this::requestFailed) + viewModel.finish.observe(this) { + setResult(RESULT_OK, it) + finish() + } caldavCalendar?.takeIf { it.id > 0 }?.let { principalDao.getPrincipals(it.id).observe(this) { @@ -81,21 +74,32 @@ class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() { private fun removePrincipal(principal: Principal) = lifecycleScope.launch { try { - viewModel.remove(caldavAccount, caldavCalendar!!, principal) + viewModel.removeUser(caldavAccount, caldavCalendar!!, principal) } catch (e: Exception) { requestFailed(e) } } - override suspend fun createCalendar(caldavAccount: CaldavAccount, name: String, color: Int) = - createCalendarViewModel.createCalendar(caldavAccount, name, color) + override suspend fun createCalendar(caldavAccount: CaldavAccount, name: String, color: Int) { + viewModel.createCalendar(caldavAccount, name, color, selectedIcon) + } override suspend fun updateNameAndColor( - account: CaldavAccount, calendar: CaldavCalendar, name: String, color: Int) = - updateCalendarViewModel.updateCalendar(account, calendar, name, color) + account: CaldavAccount, + calendar: CaldavCalendar, + name: String, + color: Int + ) { + viewModel.updateCalendar(account, calendar, name, color, selectedIcon) + } + + override suspend fun deleteCalendar( + caldavAccount: CaldavAccount, + caldavCalendar: CaldavCalendar + ) { + viewModel.deleteCalendar(caldavAccount, caldavCalendar) + } - override suspend fun deleteCalendar(caldavAccount: CaldavAccount, caldavCalendar: CaldavCalendar) = - deleteCalendarViewModel.deleteCalendar(caldavAccount, caldavCalendar) companion object { val CaldavAccount.canRemovePrincipal: Boolean diff --git a/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt b/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt index bfc8d0207..b34dae7cf 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt @@ -1,12 +1,20 @@ package org.tasks.caldav +import android.content.Intent import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import com.todoroo.astrid.activity.MainActivity +import com.todoroo.astrid.activity.TaskListFragment +import com.todoroo.astrid.api.CaldavFilter +import com.todoroo.astrid.helper.UUIDHelper +import com.todoroo.astrid.service.TaskDeleter import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.withContext import org.tasks.data.CaldavAccount import org.tasks.data.CaldavCalendar +import org.tasks.data.CaldavDao import org.tasks.data.Principal import org.tasks.data.PrincipalDao import javax.inject.Inject @@ -14,22 +22,80 @@ import javax.inject.Inject @HiltViewModel class CaldavCalendarViewModel @Inject constructor( private val provider: CaldavClientProvider, - private val principalDao: PrincipalDao + private val caldavDao: CaldavDao, + private val principalDao: PrincipalDao, + private val taskDeleter: TaskDeleter, ) : ViewModel() { val error = MutableLiveData() val inFlight = MutableLiveData(false) + val finish = MutableLiveData() - suspend fun remove(account: CaldavAccount, list: CaldavCalendar, principal: Principal) = + suspend fun createCalendar(caldavAccount: CaldavAccount, name: String, color: Int, icon: Int) = + doRequest { + val url = withContext(Dispatchers.IO) { + provider.forAccount(caldavAccount).makeCollection(name, color) + } + val calendar = CaldavCalendar().apply { + uuid = UUIDHelper.newUUID() + account = caldavAccount.uuid + this.url = url + this.name = name + this.color = color + setIcon(icon) + caldavDao.insert(this) + } + finish.value = Intent().putExtra(MainActivity.OPEN_FILTER, CaldavFilter(calendar)) + } + + suspend fun updateCalendar( + account: CaldavAccount, + calendar: CaldavCalendar, + name: String, + color: Int, + icon: Int + ) = + doRequest { + withContext(Dispatchers.IO) { + provider.forAccount(account, calendar.url!!).updateCollection(name, color) + } + calendar.apply { + this.name = name + this.color = color + setIcon(icon) + caldavDao.update(this) + } + finish.value = Intent(TaskListFragment.ACTION_RELOAD) + .putExtra(MainActivity.OPEN_FILTER, CaldavFilter(calendar)) + } + + suspend fun deleteCalendar(account: CaldavAccount, calendar: CaldavCalendar) = + doRequest { + withContext(Dispatchers.IO) { + provider.forAccount(account, calendar.url!!).deleteCollection() + } + taskDeleter.delete(calendar) + finish.value = Intent(TaskListFragment.ACTION_DELETED) + } + + suspend fun removeUser(account: CaldavAccount, list: CaldavCalendar, principal: Principal) = + doRequest { + withContext(Dispatchers.IO) { + provider.forAccount(account).removePrincipal(account, list, principal) + } + principalDao.delete(principal) + } + + private suspend fun doRequest(action: suspend () -> T): T? = withContext(NonCancellable) { if (inFlight.value == true) { - return@withContext + return@withContext null } inFlight.value = true try { - provider.forAccount(account).removePrincipal(account, list, principal) - principalDao.delete(principal) + return@withContext action() } catch (e: Exception) { error.value = e + return@withContext null } finally { inFlight.value = false } diff --git a/app/src/main/java/org/tasks/caldav/CreateCalendarViewModel.kt b/app/src/main/java/org/tasks/caldav/CreateCalendarViewModel.kt deleted file mode 100644 index 725f3a49f..000000000 --- a/app/src/main/java/org/tasks/caldav/CreateCalendarViewModel.kt +++ /dev/null @@ -1,15 +0,0 @@ -package org.tasks.caldav - -import dagger.hilt.android.lifecycle.HiltViewModel -import org.tasks.data.CaldavAccount -import org.tasks.ui.CompletableViewModel -import javax.inject.Inject - -@HiltViewModel -class CreateCalendarViewModel @Inject constructor( - private val provider: CaldavClientProvider -): CompletableViewModel() { - suspend fun createCalendar(account: CaldavAccount, name: String, color: Int) { - run { provider.forAccount(account).makeCollection(name, color) } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/caldav/DeleteCalendarViewModel.kt b/app/src/main/java/org/tasks/caldav/DeleteCalendarViewModel.kt deleted file mode 100644 index dbb95a55a..000000000 --- a/app/src/main/java/org/tasks/caldav/DeleteCalendarViewModel.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.tasks.caldav - -import dagger.hilt.android.lifecycle.HiltViewModel -import org.tasks.data.CaldavAccount -import org.tasks.data.CaldavCalendar -import org.tasks.ui.ActionViewModel -import javax.inject.Inject - -@HiltViewModel -class DeleteCalendarViewModel @Inject constructor( - private val provider: CaldavClientProvider -) : ActionViewModel() { - suspend fun deleteCalendar(account: CaldavAccount, calendar: CaldavCalendar) { - run { - calendar.url?.let { provider.forAccount(account, it).deleteCollection() } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/caldav/UpdateCalendarViewModel.kt b/app/src/main/java/org/tasks/caldav/UpdateCalendarViewModel.kt deleted file mode 100644 index 1f82ad156..000000000 --- a/app/src/main/java/org/tasks/caldav/UpdateCalendarViewModel.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.tasks.caldav - -import dagger.hilt.android.lifecycle.HiltViewModel -import org.tasks.data.CaldavAccount -import org.tasks.data.CaldavCalendar -import org.tasks.ui.CompletableViewModel -import javax.inject.Inject - -@HiltViewModel -class UpdateCalendarViewModel @Inject constructor( - private val provider: CaldavClientProvider -) : CompletableViewModel() { - suspend fun updateCalendar(account: CaldavAccount, calendar: CaldavCalendar, name: String, color: Int) { - run { - calendar.url?.let { provider.forAccount(account, it).updateCollection(name, color) } - } - } -} \ No newline at end of file