add error handling

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2025-07-11 13:24:21 +02:00
parent ed488d6424
commit 65d7203820
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
4 changed files with 30 additions and 13 deletions

View File

@ -1270,7 +1270,7 @@ class ChatActivity :
} }
is ChatViewModel.ThreadCreationUiState.Error -> { is ChatViewModel.ThreadCreationUiState.Error -> {
Log.e(TAG, "Error when creating thread") Log.e(TAG, "Error when creating thread", uiState.exception)
Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
@ -1290,7 +1290,7 @@ class ChatActivity :
} }
is ChatViewModel.ThreadRetrieveUiState.Error -> { is ChatViewModel.ThreadRetrieveUiState.Error -> {
Log.e(TAG, "Error when retrieving thread") Log.e(TAG, "Error when retrieving thread", uiState.exception)
Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }

View File

@ -435,15 +435,23 @@ class ChatViewModel @Inject constructor(
fun createThread(credentials: String, url: String) { fun createThread(credentials: String, url: String) {
viewModelScope.launch { viewModelScope.launch {
val thread = chatNetworkDataSource.createThread(credentials, url) try {
_threadCreationState.value = ThreadCreationUiState.Success(thread.ocs?.data) val thread = chatNetworkDataSource.createThread(credentials, url)
_threadCreationState.value = ThreadCreationUiState.Success(thread.ocs?.data)
} catch (exception: Exception) {
_threadCreationState.value = ThreadCreationUiState.Error(exception)
}
} }
} }
fun getThread(credentials: String, url: String) { fun getThread(credentials: String, url: String) {
viewModelScope.launch { viewModelScope.launch {
val thread = threadsRepository.getThread(credentials, url) try {
_threadRetrieveState.value = ThreadRetrieveUiState.Success(thread.ocs?.data) val thread = threadsRepository.getThread(credentials, url)
_threadRetrieveState.value = ThreadRetrieveUiState.Success(thread.ocs?.data)
} catch (exception: Exception) {
_threadRetrieveState.value = ThreadRetrieveUiState.Error(exception)
}
} }
} }
@ -900,12 +908,12 @@ class ChatViewModel @Inject constructor(
sealed class ThreadCreationUiState { sealed class ThreadCreationUiState {
data object None : ThreadCreationUiState() data object None : ThreadCreationUiState()
data class Success(val thread: ThreadInfo?) : ThreadCreationUiState() data class Success(val thread: ThreadInfo?) : ThreadCreationUiState()
data class Error(val message: String) : ThreadCreationUiState() data class Error(val exception: Exception) : ThreadCreationUiState()
} }
sealed class ThreadRetrieveUiState { sealed class ThreadRetrieveUiState {
data object None : ThreadRetrieveUiState() data object None : ThreadRetrieveUiState()
data class Success(val thread: ThreadInfo?) : ThreadRetrieveUiState() data class Success(val thread: ThreadInfo?) : ThreadRetrieveUiState()
data class Error(val message: String) : ThreadRetrieveUiState() data class Error(val exception: Exception) : ThreadRetrieveUiState()
} }
} }

View File

@ -10,6 +10,7 @@ package com.nextcloud.talk.threadsoverview
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.text.format.DateUtils import android.text.format.DateUtils
import android.util.Log
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
@ -24,10 +25,13 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@ -41,6 +45,7 @@ import com.nextcloud.talk.activities.BaseActivity
import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.chat.ChatActivity
import com.nextcloud.talk.chat.ChatActivity.Companion.TAG
import com.nextcloud.talk.components.ColoredStatusBar import com.nextcloud.talk.components.ColoredStatusBar
import com.nextcloud.talk.components.StandardAppBar import com.nextcloud.talk.components.StandardAppBar
import com.nextcloud.talk.contacts.loadImage import com.nextcloud.talk.contacts.loadImage
@ -52,7 +57,6 @@ import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_THREAD_ID import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_THREAD_ID
import javax.inject.Inject import javax.inject.Inject
import kotlin.toString
@AutoInjector(NextcloudTalkApplication::class) @AutoInjector(NextcloudTalkApplication::class)
class ThreadsOverviewActivity : BaseActivity() { class ThreadsOverviewActivity : BaseActivity() {
@ -162,7 +166,8 @@ fun ThreadsOverviewScreen(
) )
} }
is ThreadsOverviewViewModel.ThreadsListUiState.Error -> { is ThreadsOverviewViewModel.ThreadsListUiState.Error -> {
ErrorView(message = state.message) Log.e(TAG, "Error when retrieving threads", uiState.exception)
ErrorView(message = stringResource(R.string.nc_common_error_sorry))
} }
} }
} }

View File

@ -43,14 +43,18 @@ class ThreadsOverviewViewModel @Inject constructor(
fun getThreads(credentials: String, url: String) { fun getThreads(credentials: String, url: String) {
viewModelScope.launch { viewModelScope.launch {
val threads = threadsRepository.getThreads(credentials, url) try {
_threadsListState.value = ThreadsListUiState.Success(threads.ocs?.data) val threads = threadsRepository.getThreads(credentials, url)
_threadsListState.value = ThreadsListUiState.Success(threads.ocs?.data)
} catch (exception: Exception) {
_threadsListState.value = ThreadsListUiState.Error(exception)
}
} }
} }
sealed class ThreadsListUiState { sealed class ThreadsListUiState {
data object None : ThreadsListUiState() data object None : ThreadsListUiState()
data class Success(val threadsList: List<ThreadInfo>?) : ThreadsListUiState() data class Success(val threadsList: List<ThreadInfo>?) : ThreadsListUiState()
data class Error(val message: String) : ThreadsListUiState() data class Error(val exception: Exception) : ThreadsListUiState()
} }
} }