diff --git a/app/src/main/java/io/xxlabs/messenger/data/room/dao/RequestsDao.kt b/app/src/main/java/io/xxlabs/messenger/data/room/dao/RequestsDao.kt index add64887956a79f92de3186295ebcb409cbdae68..20b67752185ee27741d2a216f186fb6137e82797 100644 --- a/app/src/main/java/io/xxlabs/messenger/data/room/dao/RequestsDao.kt +++ b/app/src/main/java/io/xxlabs/messenger/data/room/dao/RequestsDao.kt @@ -21,6 +21,9 @@ interface RequestsDao { @Query("SELECT * FROM Requests WHERE requestId IN (SELECT userId FROM Contacts)") 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)") fun getGroupInvitations(): Flow<List<RequestData>> diff --git a/app/src/main/java/io/xxlabs/messenger/requests/data/LocalRequestsDataSource.kt b/app/src/main/java/io/xxlabs/messenger/requests/data/LocalRequestsDataSource.kt index e30a49ec10a6e5ddb133b9a4b899f107f3f26074..b94bb691eba5b4aad49af1dc9e54d6d87a26b376 100644 --- a/app/src/main/java/io/xxlabs/messenger/requests/data/LocalRequestsDataSource.kt +++ b/app/src/main/java/io/xxlabs/messenger/requests/data/LocalRequestsDataSource.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.Flow interface LocalRequestsDataSource { val unreadCount: Flow<Int> + suspend fun getContactRequestsOnce(): List<RequestData> suspend fun getContactRequests(): Flow<List<RequestData>> suspend fun getGroupInvitations(): Flow<List<RequestData>> suspend fun getRequest(requestId: ByteArray): RequestData? diff --git a/app/src/main/java/io/xxlabs/messenger/requests/data/RequestsDatabase.kt b/app/src/main/java/io/xxlabs/messenger/requests/data/RequestsDatabase.kt index 71643ddee64be1dc029ce403211557573d00ee28..47a36b5f2d9c5434b816f2b500c8223b11b7934c 100644 --- a/app/src/main/java/io/xxlabs/messenger/requests/data/RequestsDatabase.kt +++ b/app/src/main/java/io/xxlabs/messenger/requests/data/RequestsDatabase.kt @@ -52,6 +52,9 @@ class RequestsDatabase @Inject constructor( } } + override suspend fun getContactRequestsOnce(): List<RequestData> = + requestsDao.getContactRequestsOnce() + override suspend fun getContactRequests(): Flow<List<RequestData>> = requestsDao.getContactRequests() .stateIn(scope, SharingStarted.Eagerly, listOf()) diff --git a/app/src/main/java/io/xxlabs/messenger/requests/data/contact/ContactRequestRepository.kt b/app/src/main/java/io/xxlabs/messenger/requests/data/contact/ContactRequestRepository.kt index be2e069f0c9151af70b75020ced1129e2f4495db..caf0d00d4d8efd7c95dba7730585bc47abc860a1 100644 --- a/app/src/main/java/io/xxlabs/messenger/requests/data/contact/ContactRequestRepository.kt +++ b/app/src/main/java/io/xxlabs/messenger/requests/data/contact/ContactRequestRepository.kt @@ -10,6 +10,8 @@ import io.xxlabs.messenger.requests.bindings.VerificationResult import io.xxlabs.messenger.requests.data.LocalRequestsDataSource import io.xxlabs.messenger.requests.data.RequestDataSource 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 kotlinx.coroutines.* import kotlinx.coroutines.flow.* @@ -121,8 +123,15 @@ class ContactRequestsRepository @Inject constructor( override fun failUnverifiedRequests() { scope.launch { - getRequests().take(1).collect { requests -> - requests.filter { + localDataSource.getContactRequestsOnce().let { requestDataList -> + requestDataList.mapNotNull { requestData -> + val contactData = daoRepository + .getContactByUserId(requestData.requestId) + .value() + contactData?.let { + ContactRequestData(it, requestData.unread) + } + }.filter { it.requestStatus == VERIFYING }.forEach { update(it, VERIFICATION_FAIL) diff --git a/app/src/main/java/io/xxlabs/messenger/ui/global/ContactsViewModel.kt b/app/src/main/java/io/xxlabs/messenger/ui/global/ContactsViewModel.kt index 2d4950afed8b7ecf39f6e18eb3c7971e6d110094..08f141021cfe7eb13d03515090ef125bb3eacf81 100644 --- a/app/src/main/java/io/xxlabs/messenger/ui/global/ContactsViewModel.kt +++ b/app/src/main/java/io/xxlabs/messenger/ui/global/ContactsViewModel.kt @@ -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.ContactRequestsRepository 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.toBase64String import io.xxlabs.messenger.support.isMockVersion @@ -77,6 +76,11 @@ class ContactsViewModel @Inject constructor( init { Timber.v("isAuthCallbackRegistered: ${isAuthCallbackRegistered()}") 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() } @@ -97,10 +101,6 @@ class ContactsViewModel @Inject constructor( fun registerAuthCallback() { Timber.v("[MAIN] Registering auth callback...") if (!isAuthCallbackRegistered()) { - // The app has presumably had a fresh launch. - // Fail requests that haven't verified yet, so they may be retried manually by user. - failVerifyingRequests() - Timber.v("[MAIN] nor initialized, initializing network callback...") subscriptions.add( repo.registerAuthCallback(