diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt index 284e47977f..c6f54454b9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallActivity.kt @@ -231,6 +231,13 @@ private fun UserMessagesHost( ) onDismiss(userMessage) } + + is UserMessage.ContactsRefreshFailed -> LaunchedEffect(userMessage) { + snackbarHostState.showSnackbar( + message = context.getString(R.string.ContactSelectionListFragment_error_retrieving_contacts_check_your_network_connection) + ) + onDismiss(userMessage) + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallViewModel.kt index 6e994d5872..f915e3dd68 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/new/NewCallViewModel.kt @@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.RecipientRepository import org.thoughtcrime.securesms.recipients.ui.RecipientSelection +import org.whispersystems.signalservice.api.NetworkResult class NewCallViewModel : ViewModel() { companion object { @@ -115,11 +116,32 @@ class NewCallViewModel : ViewModel() { viewModelScope.launch { internalUiState.update { it.copy(isRefreshingContacts = true) } - withContext(Dispatchers.IO) { - ContactDiscovery.refreshAll(AppDependencies.application, true) + val result = withContext(Dispatchers.IO) { + NetworkResult.fromFetch { + ContactDiscovery.refreshAll(AppDependencies.application, true) + } } - internalUiState.update { it.copy(isRefreshingContacts = false) } + when (result) { + is NetworkResult.Success -> { + internalUiState.update { it.copy(isRefreshingContacts = false) } + } + + is NetworkResult.NetworkError, is NetworkResult.StatusCodeError -> { + Log.w(TAG, "Encountered network error while refreshing contacts.", result.getCause()) + internalUiState.update { + it.copy( + isRefreshingContacts = false, + userMessage = UserMessage.ContactsRefreshFailed + ) + } + } + + is NetworkResult.ApplicationError -> { + Log.e(TAG, "Encountered unexpected error while refreshing contacts.", result.throwable) + throw result.throwable + } + } } } @@ -139,6 +161,7 @@ data class NewCallUiState( sealed interface UserMessage { data object UserAlreadyInAnotherCall : UserMessage data class RecipientLookupFailed(val failure: RecipientRepository.LookupResult.Failure) : UserMessage + data object ContactsRefreshFailed : UserMessage } sealed interface CallType { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationActivity.kt index 26c67aeb3c..d102e40d84 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationActivity.kt @@ -364,6 +364,13 @@ private fun UserMessagesHost( onDismiss(userMessage) } + is UserMessage.Info.ContactsRefreshFailed -> LaunchedEffect(userMessage) { + snackbarHostState.showSnackbar( + message = context.getString(R.string.ContactSelectionListFragment_error_retrieving_contacts_check_your_network_connection) + ) + onDismiss(userMessage) + } + is UserMessage.Prompt.ConfirmRemoveRecipient -> Dialogs.SimpleAlertDialog( title = stringResource(R.string.NewConversationActivity__remove_s, userMessage.recipient.getShortDisplayName(context)), body = stringResource(R.string.NewConversationActivity__you_wont_see_this_person), diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationViewModel.kt index ff155522c3..e040368ec1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/NewConversationViewModel.kt @@ -27,6 +27,7 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.RecipientRepository import org.thoughtcrime.securesms.recipients.ui.RecipientSelection +import org.whispersystems.signalservice.api.NetworkResult class NewConversationViewModel : ViewModel() { companion object { @@ -143,11 +144,32 @@ class NewConversationViewModel : ViewModel() { viewModelScope.launch { internalUiState.update { it.copy(isRefreshingContacts = true) } - withContext(Dispatchers.IO) { - ContactDiscovery.refreshAll(AppDependencies.application, true) + val result = withContext(Dispatchers.IO) { + NetworkResult.fromFetch { + ContactDiscovery.refreshAll(AppDependencies.application, true) + } } - internalUiState.update { it.copy(isRefreshingContacts = false) } + when (result) { + is NetworkResult.Success -> { + internalUiState.update { it.copy(isRefreshingContacts = false) } + } + + is NetworkResult.NetworkError, is NetworkResult.StatusCodeError -> { + Log.w(TAG, "Encountered network error while refreshing contacts.", result.getCause()) + internalUiState.update { + it.copy( + isRefreshingContacts = false, + userMessage = Info.ContactsRefreshFailed + ) + } + } + + is NetworkResult.ApplicationError -> { + Log.e(TAG, "Encountered unexpected error while refreshing contacts.", result.throwable) + throw result.throwable + } + } } } @@ -171,6 +193,7 @@ data class NewConversationUiState( data class RecipientBlocked(val recipient: Recipient) : Info data class RecipientLookupFailed(val failure: RecipientRepository.LookupResult.Failure) : Info data object UserAlreadyInAnotherCall : Info + data object ContactsRefreshFailed : Info } sealed interface Prompt : UserMessage {