diff --git a/jami-android/app/src/main/java/cx/ring/linkdevice/viewmodel/ExportSideViewModel.kt b/jami-android/app/src/main/java/cx/ring/linkdevice/viewmodel/ExportSideViewModel.kt index 9a45ee21afc89028d9fe2e2ab1d5dc7e021af4b2..de1dfa61108f028b424e13af59e97e53d69dbb47 100644 --- a/jami-android/app/src/main/java/cx/ring/linkdevice/viewmodel/ExportSideViewModel.kt +++ b/jami-android/app/src/main/java/cx/ring/linkdevice/viewmodel/ExportSideViewModel.kt @@ -55,6 +55,7 @@ class ExportSideViewModel @Inject constructor( private val _uiState = MutableStateFlow<AddDeviceExportState>(AddDeviceExportState.Init()) val uiState: StateFlow<AddDeviceExportState> = _uiState.asStateFlow() + private val accountId = accountService.currentAccount!!.accountId private var operationId: Long? = null private var compositeDisposable = CompositeDisposable() @@ -66,35 +67,39 @@ class ExportSideViewModel @Inject constructor( || (jamiAuthentication.length != 59) ) { Log.w(TAG, "Invalid input: $jamiAuthentication") - _uiState.value = - AddDeviceExportState.Init() // If state is unchanged, error is not emitted again. + // If state is unchanged, error is not emitted again. + _uiState.value = AddDeviceExportState.Init() _uiState.value = AddDeviceExportState.Init(ExportSideInputError.INVALID_INPUT) return } - operationId = accountService - .addDevice(accountService.currentAccount!!.accountId, jamiAuthentication) + val operationId = accountService.addDevice(accountId, jamiAuthentication) + if (operationId < 0) { + Log.e(TAG, "Failed to add device: $jamiAuthentication $operationId") + _uiState.value = when (operationId) { + -1L -> AddDeviceExportState.Init(ExportSideInputError.INVALID_INPUT) + else -> AddDeviceExportState.Done(AuthError.UNKNOWN) + } + return + } + this.operationId = operationId assert(compositeDisposable.size() == 0) // Should not have any subscription. accountService.authResultObservable - .filter { - it.accountId == accountService.currentAccount?.accountId - && it.operationId == operationId - } + .filter { it.accountId == accountId && it.operationId == operationId } .observeOn(mUiScheduler) - .subscribe { it: AuthResult -> - updateAuthState(it) - }.apply { compositeDisposable.add(this) } + .subscribe(this::updateAuthState) + .apply { compositeDisposable.add(this) } } fun onIdentityConfirmation() { - accountService.confirmAddDevice(accountService.currentAccount!!.accountId, operationId!!) + accountService.confirmAddDevice(accountId, operationId!!) } fun onCancel() { val operationId = operationId ?: return - accountService.cancelAddDevice(accountService.currentAccount!!.accountId, operationId) + accountService.cancelAddDevice(accountId, operationId) } // There is no token to be received in export side. @@ -103,7 +108,6 @@ class ExportSideViewModel @Inject constructor( } override fun onConnectingSignal() { - // Nothing to do here. _uiState.value = AddDeviceExportState.Connecting }