diff --git a/app/src/main/java/org/tasks/caldav/AddCaldavAccountViewModel.kt b/app/src/main/java/org/tasks/caldav/AddCaldavAccountViewModel.kt deleted file mode 100644 index ce29efa0e..000000000 --- a/app/src/main/java/org/tasks/caldav/AddCaldavAccountViewModel.kt +++ /dev/null @@ -1,19 +0,0 @@ -package org.tasks.caldav - -import dagger.hilt.android.lifecycle.HiltViewModel -import org.tasks.ui.CompletableViewModel -import javax.inject.Inject - -@HiltViewModel -class AddCaldavAccountViewModel @Inject constructor( - private val provider: CaldavClientProvider -) : CompletableViewModel() { - suspend fun addAccount(url: String, username: String, password: String) { - run { - provider - .forUrl(url, username, password) - .setForeground() - .homeSet(username, password) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/caldav/CaldavAccountSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/CaldavAccountSettingsActivity.kt index 14c080a5c..96fbd12c3 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavAccountSettingsActivity.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavAccountSettingsActivity.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.widget.Toolbar +import androidx.core.view.isVisible import com.todoroo.astrid.helper.UUIDHelper import dagger.hilt.android.AndroidEntryPoint import org.tasks.R @@ -13,13 +14,22 @@ import timber.log.Timber @AndroidEntryPoint class CaldavAccountSettingsActivity : BaseCaldavAccountSettingsActivity(), Toolbar.OnMenuItemClickListener { - private val addCaldavAccountViewModel: AddCaldavAccountViewModel by viewModels() - private val updateCaldavAccountViewModel: UpdateCaldavAccountViewModel by viewModels() + private val viewModel: CaldavAccountViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - addCaldavAccountViewModel.observe(this, this::addAccount, this::requestFailed) - updateCaldavAccountViewModel.observe(this, this::updateAccount, this::requestFailed) + + viewModel.inFlight.observe(this) { binding.progressBar.progressBar.isVisible = it } + viewModel.error.observe(this) { throwable -> + throwable?.let { + requestFailed(it) + viewModel.error.value = null + } + } + viewModel.finish.observe(this) { + setResult(RESULT_OK, it) + finish() + } } override val description: Int @@ -28,7 +38,7 @@ class CaldavAccountSettingsActivity : BaseCaldavAccountSettingsActivity(), Toolb private suspend fun addAccount(principal: String) { hideProgressIndicator() Timber.d("Found principal: %s", principal) - val newAccount = CaldavAccount().apply { + CaldavAccount().apply { name = newName url = principal username = newUsername @@ -59,14 +69,15 @@ class CaldavAccountSettingsActivity : BaseCaldavAccountSettingsActivity(), Toolb finish() } - override suspend fun addAccount(url: String, username: String, password: String) = - addCaldavAccountViewModel.addAccount(url, username, password) + override suspend fun addAccount(url: String, username: String, password: String) { + viewModel.addAccount(url, username, password)?.let { addAccount(it) } + } - override suspend fun updateAccount(url: String, username: String, password: String) = - updateCaldavAccountViewModel.updateCaldavAccount(url, username, password) + override suspend fun updateAccount(url: String, username: String, password: String) { + viewModel.updateCaldavAccount(url, username, password)?.let { updateAccount(it) } + } - override suspend fun updateAccount() = - updateAccount(caldavAccount!!.url) + override suspend fun updateAccount() = updateAccount(caldavAccount!!.url) override val newPassword: String? get() { diff --git a/app/src/main/java/org/tasks/caldav/CaldavAccountViewModel.kt b/app/src/main/java/org/tasks/caldav/CaldavAccountViewModel.kt new file mode 100644 index 000000000..b4f08bda9 --- /dev/null +++ b/app/src/main/java/org/tasks/caldav/CaldavAccountViewModel.kt @@ -0,0 +1,28 @@ +package org.tasks.caldav + +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import javax.inject.Inject + +@HiltViewModel +class CaldavAccountViewModel @Inject constructor( + private val provider: CaldavClientProvider +) : CaldavViewModel() { + suspend fun addAccount(url: String, username: String, password: String): String? = + doRequest { + withContext(Dispatchers.IO) { + provider + .forUrl(url, username, password) + .setForeground() + .homeSet(username, password) + } + } + + suspend fun updateCaldavAccount(url: String, username: String, password: String): String? = + doRequest { + withContext(Dispatchers.IO) { + provider.forUrl(url, username, password).homeSet(username, password) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt b/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt index 63499f381..a548a385a 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt +++ b/app/src/main/java/org/tasks/caldav/CaldavCalendarViewModel.kt @@ -1,8 +1,6 @@ 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 @@ -10,7 +8,6 @@ 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 @@ -20,7 +17,6 @@ import org.tasks.data.CaldavDao import org.tasks.data.PrincipalDao import org.tasks.data.PrincipalWithAccess import org.tasks.sync.SyncAdapters -import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -30,10 +26,7 @@ class CaldavCalendarViewModel @Inject constructor( private val principalDao: PrincipalDao, private val taskDeleter: TaskDeleter, private val syncAdapters: SyncAdapters, -) : ViewModel() { - val error = MutableLiveData() - val inFlight = MutableLiveData(false) - val finish = MutableLiveData() +) : CaldavViewModel() { var ignoreFinish = false suspend fun createCalendar( @@ -115,21 +108,4 @@ class CaldavCalendarViewModel @Inject constructor( } principalDao.delete(principal.access) } - - private suspend fun doRequest(action: suspend () -> T): T? = - withContext(NonCancellable) { - if (inFlight.value == true) { - return@withContext null - } - inFlight.value = true - try { - return@withContext action() - } catch (e: Exception) { - Timber.e(e) - error.value = e - return@withContext null - } finally { - inFlight.value = false - } - } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/caldav/CaldavViewModel.kt b/app/src/main/java/org/tasks/caldav/CaldavViewModel.kt new file mode 100644 index 000000000..7597c3a6f --- /dev/null +++ b/app/src/main/java/org/tasks/caldav/CaldavViewModel.kt @@ -0,0 +1,31 @@ +package org.tasks.caldav + +import android.content.Intent +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.withContext +import timber.log.Timber + +abstract class CaldavViewModel : ViewModel() { + val error = MutableLiveData() + val inFlight = MutableLiveData(false) + val finish = MutableLiveData() + + protected suspend fun doRequest(action: suspend () -> T): T? = + withContext(NonCancellable) { + if (inFlight.value == true) { + return@withContext null + } + inFlight.value = true + try { + return@withContext action() + } catch (e: Exception) { + Timber.e(e) + error.value = e + return@withContext null + } finally { + inFlight.value = false + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/caldav/UpdateCaldavAccountViewModel.kt b/app/src/main/java/org/tasks/caldav/UpdateCaldavAccountViewModel.kt deleted file mode 100644 index 2fa11473a..000000000 --- a/app/src/main/java/org/tasks/caldav/UpdateCaldavAccountViewModel.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.tasks.caldav - -import dagger.hilt.android.lifecycle.HiltViewModel -import org.tasks.ui.CompletableViewModel -import javax.inject.Inject - -@HiltViewModel -class UpdateCaldavAccountViewModel @Inject constructor( - private val provider: CaldavClientProvider -) : CompletableViewModel() { - suspend fun updateCaldavAccount(url: String, username: String, password: String) { - run { provider.forUrl(url, username, password).homeSet(username, password) } - } -} \ No newline at end of file