Skip to content
Snippets Groups Projects
Commit 41cff788 authored by Kamal Bramwell's avatar Kamal Bramwell
Browse files

FE-957: Requests stuck verifying

parent 83f5f2a3
No related branches found
No related tags found
3 merge requests!84Version 2.92 build 629,!77v2.9 b627,!74FE-957: Requests stuck verifying
Showing
with 42 additions and 11 deletions
...@@ -14,6 +14,7 @@ enum class RequestStatus(val value: Int) { ...@@ -14,6 +14,7 @@ enum class RequestStatus(val value: Int) {
SENDING(10), SENDING(10),
DELETING(11), DELETING(11),
HIDDEN(12), HIDDEN(12),
RECEIVED(13),
SEARCH(99); SEARCH(99);
companion object { companion object {
......
...@@ -21,6 +21,9 @@ interface RequestsDao { ...@@ -21,6 +21,9 @@ interface RequestsDao {
@Query("SELECT * FROM Requests WHERE requestId IN (SELECT userId FROM Contacts)") @Query("SELECT * FROM Requests WHERE requestId IN (SELECT userId FROM Contacts)")
fun getContactRequests(): Flow<List<RequestData>> fun getContactRequests(): Flow<List<RequestData>>
@Query("SELECT * FROM Requests WHERE requestId IN (SELECT userId FROM Contacts)")
fun getContactRequestsOnce(): List<RequestData>
@Query("SELECT * FROM Requests WHERE requestId IN (SELECT groupId FROM Groups)") @Query("SELECT * FROM Requests WHERE requestId IN (SELECT groupId FROM Groups)")
fun getGroupInvitations(): Flow<List<RequestData>> fun getGroupInvitations(): Flow<List<RequestData>>
......
...@@ -829,6 +829,8 @@ class ClientRepository @Inject constructor( ...@@ -829,6 +829,8 @@ class ClientRepository @Inject constructor(
} }
Timber.v("[USER LOOKUP] Total execution time: ${Utils.getCurrentTimeStamp() - executionTime}") Timber.v("[USER LOOKUP] Total execution time: ${Utils.getCurrentTimeStamp() - executionTime}")
} }
} else {
callback.invoke(null, "Failed to establish secure connection to network")
} }
} }
......
...@@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.Flow ...@@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.Flow
interface LocalRequestsDataSource { interface LocalRequestsDataSource {
val unreadCount: Flow<Int> val unreadCount: Flow<Int>
suspend fun getContactRequestsOnce(): List<RequestData>
suspend fun getContactRequests(): Flow<List<RequestData>> suspend fun getContactRequests(): Flow<List<RequestData>>
suspend fun getGroupInvitations(): Flow<List<RequestData>> suspend fun getGroupInvitations(): Flow<List<RequestData>>
suspend fun getRequest(requestId: ByteArray): RequestData? suspend fun getRequest(requestId: ByteArray): RequestData?
......
...@@ -52,6 +52,9 @@ class RequestsDatabase @Inject constructor( ...@@ -52,6 +52,9 @@ class RequestsDatabase @Inject constructor(
} }
} }
override suspend fun getContactRequestsOnce(): List<RequestData> =
requestsDao.getContactRequestsOnce()
override suspend fun getContactRequests(): Flow<List<RequestData>> = override suspend fun getContactRequests(): Flow<List<RequestData>> =
requestsDao.getContactRequests() requestsDao.getContactRequests()
.stateIn(scope, SharingStarted.Eagerly, listOf()) .stateIn(scope, SharingStarted.Eagerly, listOf())
......
...@@ -10,6 +10,8 @@ import io.xxlabs.messenger.requests.bindings.VerificationResult ...@@ -10,6 +10,8 @@ import io.xxlabs.messenger.requests.bindings.VerificationResult
import io.xxlabs.messenger.requests.data.LocalRequestsDataSource import io.xxlabs.messenger.requests.data.LocalRequestsDataSource
import io.xxlabs.messenger.requests.data.RequestDataSource import io.xxlabs.messenger.requests.data.RequestDataSource
import io.xxlabs.messenger.requests.model.ContactRequest import io.xxlabs.messenger.requests.model.ContactRequest
import io.xxlabs.messenger.support.appContext
import io.xxlabs.messenger.support.extensions.toast
import io.xxlabs.messenger.support.util.value import io.xxlabs.messenger.support.util.value
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.*
...@@ -121,13 +123,19 @@ class ContactRequestsRepository @Inject constructor( ...@@ -121,13 +123,19 @@ class ContactRequestsRepository @Inject constructor(
override fun failUnverifiedRequests() { override fun failUnverifiedRequests() {
scope.launch { scope.launch {
getRequests().cancellable().collect { requests -> localDataSource.getContactRequestsOnce().let { requestDataList ->
requests.filter { requestDataList.mapNotNull { requestData ->
val contactData = daoRepository
.getContactByUserId(requestData.requestId)
.value()
contactData?.let {
ContactRequestData(it, requestData.unread)
}
}.filter {
it.requestStatus == VERIFYING it.requestStatus == VERIFYING
}.forEach { }.forEach {
update(it, VERIFICATION_FAIL) update(it, VERIFICATION_FAIL)
} }
this.coroutineContext.job.cancel()
} }
} }
} }
......
...@@ -311,7 +311,7 @@ class RequestsViewModel @Inject constructor( ...@@ -311,7 +311,7 @@ class RequestsViewModel @Inject constructor(
private fun RequestItem.isIncoming(): Boolean { private fun RequestItem.isIncoming(): Boolean {
return when (request.requestStatus) { return when (request.requestStatus) {
VERIFYING, VERIFIED, VERIFICATION_FAIL -> true RECEIVED, VERIFYING, VERIFIED, VERIFICATION_FAIL -> true
else -> false else -> false
} }
} }
...@@ -345,6 +345,7 @@ class RequestsViewModel @Inject constructor( ...@@ -345,6 +345,7 @@ class RequestsViewModel @Inject constructor(
override fun onItemClicked(request: RequestItem) { override fun onItemClicked(request: RequestItem) {
when (request.request.requestStatus) { when (request.request.requestStatus) {
RECEIVED -> retryVerification(request)
VERIFYING -> showVerifyingInfo() VERIFYING -> showVerifyingInfo()
VERIFIED, HIDDEN -> showDetails(request) VERIFIED, HIDDEN -> showDetails(request)
ACCEPTED -> { ACCEPTED -> {
...@@ -378,6 +379,7 @@ class RequestsViewModel @Inject constructor( ...@@ -378,6 +379,7 @@ class RequestsViewModel @Inject constructor(
else actionQueue.add(request.id) else actionQueue.add(request.id)
when (request.request.requestStatus) { when (request.request.requestStatus) {
RECEIVED -> retryVerification(request).also { actionQueue.remove(request.id) }
VERIFYING -> showVerifyingInfo().also { actionQueue.remove(request.id) } VERIFYING -> showVerifyingInfo().also { actionQueue.remove(request.id) }
SEND_FAIL, SENT -> resendRequest(request) SEND_FAIL, SENT -> resendRequest(request)
VERIFICATION_FAIL -> retryVerification(request) VERIFICATION_FAIL -> retryVerification(request)
......
...@@ -27,7 +27,6 @@ import io.xxlabs.messenger.repository.client.ClientRepository ...@@ -27,7 +27,6 @@ import io.xxlabs.messenger.repository.client.ClientRepository
import io.xxlabs.messenger.requests.data.contact.ContactRequestData import io.xxlabs.messenger.requests.data.contact.ContactRequestData
import io.xxlabs.messenger.requests.data.contact.ContactRequestsRepository import io.xxlabs.messenger.requests.data.contact.ContactRequestsRepository
import io.xxlabs.messenger.requests.data.contact.RequestMigrator import io.xxlabs.messenger.requests.data.contact.RequestMigrator
import io.xxlabs.messenger.requests.data.group.InvitationMigrator
import io.xxlabs.messenger.support.extensions.combineWith import io.xxlabs.messenger.support.extensions.combineWith
import io.xxlabs.messenger.support.extensions.toBase64String import io.xxlabs.messenger.support.extensions.toBase64String
import io.xxlabs.messenger.support.isMockVersion import io.xxlabs.messenger.support.isMockVersion
...@@ -77,6 +76,11 @@ class ContactsViewModel @Inject constructor( ...@@ -77,6 +76,11 @@ class ContactsViewModel @Inject constructor(
init { init {
Timber.v("isAuthCallbackRegistered: ${isAuthCallbackRegistered()}") Timber.v("isAuthCallbackRegistered: ${isAuthCallbackRegistered()}")
migrateOldRequests() migrateOldRequests()
// The app has presumably had a fresh launch.
// Fail requests that haven't verified yet, so they may be retried manually by user.
failVerifyingRequests()
if (BuildConfig.DEBUG) listContacts() if (BuildConfig.DEBUG) listContacts()
} }
...@@ -117,6 +121,10 @@ class ContactsViewModel @Inject constructor( ...@@ -117,6 +121,10 @@ class ContactsViewModel @Inject constructor(
} }
} }
private fun failVerifyingRequests() {
requestsDataSource.failUnverifiedRequests()
}
private fun onRequestReceived(contact: ByteArray) { private fun onRequestReceived(contact: ByteArray) {
val id = getBindingsContactId(contact) val id = getBindingsContactId(contact)
Timber.v("Request received from: ${id.toBase64String()}") Timber.v("Request received from: ${id.toBase64String()}")
...@@ -304,7 +312,7 @@ class ContactsViewModel @Inject constructor( ...@@ -304,7 +312,7 @@ class ContactsViewModel @Inject constructor(
marshaled = marshalledData, marshaled = marshalledData,
email = contactEmail, email = contactEmail,
phone = contactPhone, phone = contactPhone,
status = VERIFYING.value status = RECEIVED.value
) )
subscriptions.add( subscriptions.add(
...@@ -382,6 +390,7 @@ class ContactsViewModel @Inject constructor( ...@@ -382,6 +390,7 @@ class ContactsViewModel @Inject constructor(
fun verifyNewRequest( fun verifyNewRequest(
contact: ContactData contact: ContactData
) { ) {
updateContactStatus(contact.userId, VERIFYING) {
Timber.v("[RECEIVED REQUEST] Verifying Request ${contact.userId.toBase64String()}...") Timber.v("[RECEIVED REQUEST] Verifying Request ${contact.userId.toBase64String()}...")
if (contact.hasFacts()) { //UD Search if (contact.hasFacts()) { //UD Search
verifyContactViaSearch(contact) verifyContactViaSearch(contact)
...@@ -389,6 +398,7 @@ class ContactsViewModel @Inject constructor( ...@@ -389,6 +398,7 @@ class ContactsViewModel @Inject constructor(
verifyContactViaLookup(contact) verifyContactViaLookup(contact)
} }
} }
}
private fun verifyContactViaSearch(contact: ContactData) { private fun verifyContactViaSearch(contact: ContactData) {
Timber.v("[RECEIVED REQUEST] User have facts - UD Search") Timber.v("[RECEIVED REQUEST] User have facts - UD Search")
......
...@@ -289,6 +289,7 @@ class NetworkViewModel @Inject constructor( ...@@ -289,6 +289,7 @@ class NetworkViewModel @Inject constructor(
Timber.v("[NETWORK VIEWMODEL] Network follower is NOT RUNNING") Timber.v("[NETWORK VIEWMODEL] Network follower is NOT RUNNING")
} }
.doOnError { err -> .doOnError { err ->
requestsDataSource.failUnverifiedRequests()
Timber.v("[NETWORK VIEWMODEL] Network follower ERROR - could not stop properly: ${err.localizedMessage}") Timber.v("[NETWORK VIEWMODEL] Network follower ERROR - could not stop properly: ${err.localizedMessage}")
} }
.subscribe() .subscribe()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment