Convert AccountService to suspend functions

Signed-off-by: Dominic Fischer <dominicfischer7@gmail.com>
This commit is contained in:
Dominic Fischer 2020-11-06 16:49:51 +00:00
parent 0753ba3495
commit 35768ff7e8
7 changed files with 51 additions and 49 deletions
matrix-sdk-android/src
androidTest/java/org/matrix/android/sdk
main/java/org/matrix/android/sdk
api/session/account
internal/session/account
vector/src/main/java/im/vector/app/features/settings

View file

@ -16,6 +16,8 @@
package org.matrix.android.sdk.account package org.matrix.android.sdk.account
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeout
import org.matrix.android.sdk.InstrumentedTest import org.matrix.android.sdk.InstrumentedTest
import org.matrix.android.sdk.api.failure.isInvalidPassword import org.matrix.android.sdk.api.failure.isInvalidPassword
import org.matrix.android.sdk.common.CommonTestHelper import org.matrix.android.sdk.common.CommonTestHelper
@ -43,8 +45,8 @@ class ChangePasswordTest : InstrumentedTest {
val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = false)) val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = false))
// Change password // Change password
commonTestHelper.doSync<Unit> { commonTestHelper.runBlockingTest {
session.changePassword(TestConstants.PASSWORD, NEW_PASSWORD, it) session.changePassword(TestConstants.PASSWORD, NEW_PASSWORD)
} }
// Try to login with the previous password, it will fail // Try to login with the previous password, it will fail

View file

@ -43,8 +43,8 @@ class DeactivateAccountTest : InstrumentedTest {
val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = false)) val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = false))
// Deactivate the account // Deactivate the account
commonTestHelper.doSync<Unit> { commonTestHelper.runBlockingTest {
session.deactivateAccount(TestConstants.PASSWORD, false, it) session.deactivateAccount(TestConstants.PASSWORD, false)
} }
// Try to login on the previous account, it will fail (M_USER_DEACTIVATED) // Try to login on the previous account, it will fail (M_USER_DEACTIVATED)

View file

@ -40,6 +40,7 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeout
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
@ -343,6 +344,15 @@ class CommonTestHelper(context: Context) {
await(latch, timeout) await(latch, timeout)
} }
// Transform a method with a MatrixCallback to a synchronous method
fun <T> runBlockingTest(timeout: Long = TestConstants.timeOutMillis, block: suspend () -> T): T {
return runBlocking {
withTimeout(timeout) {
block()
}
}
}
// Transform a method with a MatrixCallback to a synchronous method // Transform a method with a MatrixCallback to a synchronous method
inline fun <reified T> doSync(timeout: Long? = TestConstants.timeOutMillis, block: (MatrixCallback<T>) -> Unit): T { inline fun <reified T> doSync(timeout: Long? = TestConstants.timeOutMillis, block: (MatrixCallback<T>) -> Unit): T {
val lock = CountDownLatch(1) val lock = CountDownLatch(1)

View file

@ -16,8 +16,6 @@
package org.matrix.android.sdk.api.session.account package org.matrix.android.sdk.api.session.account
import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.util.Cancelable
/** /**
* This interface defines methods to manage the account. It's implemented at the session level. * This interface defines methods to manage the account. It's implemented at the session level.
@ -28,7 +26,7 @@ interface AccountService {
* @param password Current password. * @param password Current password.
* @param newPassword New password * @param newPassword New password
*/ */
fun changePassword(password: String, newPassword: String, callback: MatrixCallback<Unit>): Cancelable suspend fun changePassword(password: String, newPassword: String)
/** /**
* Deactivate the account. * Deactivate the account.
@ -46,5 +44,5 @@ interface AccountService {
* @param eraseAllData set to true to forget all messages that have been sent. Warning: this will cause future users to see * @param eraseAllData set to true to forget all messages that have been sent. Warning: this will cause future users to see
* an incomplete view of conversations * an incomplete view of conversations
*/ */
fun deactivateAccount(password: String, eraseAllData: Boolean, callback: MatrixCallback<Unit>): Cancelable suspend fun deactivateAccount(password: String, eraseAllData: Boolean)
} }

View file

@ -16,30 +16,17 @@
package org.matrix.android.sdk.internal.session.account package org.matrix.android.sdk.internal.session.account
import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.session.account.AccountService import org.matrix.android.sdk.api.session.account.AccountService
import org.matrix.android.sdk.api.util.Cancelable
import org.matrix.android.sdk.internal.task.TaskExecutor
import org.matrix.android.sdk.internal.task.configureWith
import javax.inject.Inject import javax.inject.Inject
internal class DefaultAccountService @Inject constructor(private val changePasswordTask: ChangePasswordTask, internal class DefaultAccountService @Inject constructor(private val changePasswordTask: ChangePasswordTask,
private val deactivateAccountTask: DeactivateAccountTask, private val deactivateAccountTask: DeactivateAccountTask) : AccountService {
private val taskExecutor: TaskExecutor) : AccountService {
override fun changePassword(password: String, newPassword: String, callback: MatrixCallback<Unit>): Cancelable { override suspend fun changePassword(password: String, newPassword: String) {
return changePasswordTask changePasswordTask.execute(ChangePasswordTask.Params(password, newPassword))
.configureWith(ChangePasswordTask.Params(password, newPassword)) {
this.callback = callback
}
.executeBy(taskExecutor)
} }
override fun deactivateAccount(password: String, eraseAllData: Boolean, callback: MatrixCallback<Unit>): Cancelable { override suspend fun deactivateAccount(password: String, eraseAllData: Boolean) {
return deactivateAccountTask deactivateAccountTask.execute(DeactivateAccountTask.Params(password, eraseAllData))
.configureWith(DeactivateAccountTask.Params(password, eraseAllData)) {
this.callback = callback
}
.executeBy(taskExecutor)
} }
} }

View file

@ -27,6 +27,7 @@ import android.widget.ImageView
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import androidx.preference.EditTextPreference import androidx.preference.EditTextPreference
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceCategory import androidx.preference.PreferenceCategory
@ -451,28 +452,25 @@ class VectorSettingsGeneralFragment @Inject constructor(
val newPwd = newPasswordText.text.toString() val newPwd = newPasswordText.text.toString()
showPasswordLoadingView(true) showPasswordLoadingView(true)
session.changePassword(oldPwd, newPwd, object : MatrixCallback<Unit> { lifecycleScope.launch {
override fun onSuccess(data: Unit) { val result = runCatching {
if (!isAdded) { session.changePassword(oldPwd, newPwd)
return }
} if (!isAdded) {
showPasswordLoadingView(false) return@launch
}
showPasswordLoadingView(false)
result.fold({
dialog.dismiss() dialog.dismiss()
activity.toast(R.string.settings_password_updated) activity.toast(R.string.settings_password_updated)
} }, { failure ->
override fun onFailure(failure: Throwable) {
if (!isAdded) {
return
}
showPasswordLoadingView(false)
if (failure.isInvalidPassword()) { if (failure.isInvalidPassword()) {
oldPasswordTil.error = getString(R.string.settings_fail_to_update_password_invalid_current_password) oldPasswordTil.error = getString(R.string.settings_fail_to_update_password_invalid_current_password)
} else { } else {
oldPasswordTil.error = getString(R.string.settings_fail_to_update_password) oldPasswordTil.error = getString(R.string.settings_fail_to_update_password)
} }
} })
}) }
} }
} }
dialog.show() dialog.show()

View file

@ -15,6 +15,7 @@
*/ */
package im.vector.app.features.settings.account.deactivation package im.vector.app.features.settings.account.deactivation
import androidx.lifecycle.viewModelScope
import com.airbnb.mvrx.FragmentViewModelContext import com.airbnb.mvrx.FragmentViewModelContext
import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.MvRxState
import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.MvRxViewModelFactory
@ -24,9 +25,12 @@ import com.squareup.inject.assisted.AssistedInject
import im.vector.app.core.extensions.exhaustive import im.vector.app.core.extensions.exhaustive
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.core.platform.VectorViewModelAction import im.vector.app.core.platform.VectorViewModelAction
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.failure.isInvalidPassword import org.matrix.android.sdk.api.failure.isInvalidPassword
import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.Session
import java.lang.Exception
data class DeactivateAccountViewState( data class DeactivateAccountViewState(
val passwordShown: Boolean = false val passwordShown: Boolean = false
@ -67,19 +71,22 @@ class DeactivateAccountViewModel @AssistedInject constructor(@Assisted private v
_viewEvents.post(DeactivateAccountViewEvents.Loading()) _viewEvents.post(DeactivateAccountViewEvents.Loading())
session.deactivateAccount(action.password, action.eraseAllData, object : MatrixCallback<Unit> { viewModelScope.launch {
override fun onSuccess(data: Unit) { val event = try {
_viewEvents.post(DeactivateAccountViewEvents.Done) session.deactivateAccount(action.password, action.eraseAllData)
} DeactivateAccountViewEvents.Done
} catch (failure: Exception) {
if (failure is CancellationException) throw failure
override fun onFailure(failure: Throwable) {
if (failure.isInvalidPassword()) { if (failure.isInvalidPassword()) {
_viewEvents.post(DeactivateAccountViewEvents.InvalidPassword) DeactivateAccountViewEvents.InvalidPassword
} else { } else {
_viewEvents.post(DeactivateAccountViewEvents.OtherFailure(failure)) DeactivateAccountViewEvents.OtherFailure(failure)
} }
} }
})
_viewEvents.post(event)
}
} }
companion object : MvRxViewModelFactory<DeactivateAccountViewModel, DeactivateAccountViewState> { companion object : MvRxViewModelFactory<DeactivateAccountViewModel, DeactivateAccountViewState> {