From f1afd1974c618135cbb43cca49b9531cee34db5b Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 26 Oct 2024 00:47:03 -0500 Subject: [PATCH] Log more errors on WearOS --- .../org/tasks/presentation/MyPagingSource.kt | 4 +- .../presentation/screens/TaskListScreen.kt | 30 ++++++++++++ .../presentation/screens/TaskListViewModel.kt | 48 +++++++++++++------ 3 files changed, 66 insertions(+), 16 deletions(-) diff --git a/wear/src/main/java/org/tasks/presentation/MyPagingSource.kt b/wear/src/main/java/org/tasks/presentation/MyPagingSource.kt index 90945849e..f14eb1a73 100644 --- a/wear/src/main/java/org/tasks/presentation/MyPagingSource.kt +++ b/wear/src/main/java/org/tasks/presentation/MyPagingSource.kt @@ -6,6 +6,7 @@ import androidx.paging.PagingSource.LoadParams.Append import androidx.paging.PagingSource.LoadParams.Prepend import androidx.paging.PagingSource.LoadParams.Refresh import androidx.paging.PagingState +import timber.log.Timber private const val INITIAL_ITEM_COUNT = -1 @@ -32,7 +33,7 @@ class MyPagingSource( nextPosToLoad } val prevKey = if (offset <= 0 || data.isEmpty()) null else offset - return LoadResult.Page( + LoadResult.Page( data = data, prevKey = prevKey, nextKey = nextKey, @@ -40,6 +41,7 @@ class MyPagingSource( itemsAfter = maxOf(0, itemCount - nextPosToLoad) ) } catch (e: Exception) { + Timber.e(e) LoadResult.Error(e) } } diff --git a/wear/src/main/java/org/tasks/presentation/screens/TaskListScreen.kt b/wear/src/main/java/org/tasks/presentation/screens/TaskListScreen.kt index 9b2ede1e8..c29090de8 100644 --- a/wear/src/main/java/org/tasks/presentation/screens/TaskListScreen.kt +++ b/wear/src/main/java/org/tasks/presentation/screens/TaskListScreen.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Add @@ -14,14 +15,21 @@ import androidx.compose.material.icons.outlined.Menu import androidx.compose.material.icons.outlined.Repeat import androidx.compose.material.icons.outlined.Settings import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import androidx.wear.compose.material.Button import androidx.wear.compose.material.ButtonDefaults +import androidx.wear.compose.material.CircularProgressIndicator import androidx.wear.compose.material.Icon import androidx.wear.compose.material.MaterialTheme import androidx.wear.compose.material.Text @@ -55,6 +63,14 @@ fun TaskListScreen( ScreenScaffold( scrollState = columnState, ) { + var initialLoad by remember { mutableStateOf(true) } + var hasError by remember { mutableStateOf(true) } + LaunchedEffect(uiItems.loadState) { + hasError = uiItems.loadState.hasError + if (initialLoad && uiItems.loadState.refresh is LoadState.NotLoading) { + initialLoad = false + } + } ScalingLazyColumn( modifier = Modifier.fillMaxSize(), columnState = columnState, @@ -71,6 +87,20 @@ fun TaskListScreen( // addTask = addTask, // ) } + if (hasError) { + item { + Text( + text = "Error loading tasks", + modifier = Modifier.padding(top = 16.dp) + ) + } + } else if (initialLoad && uiItems.loadState.refresh is LoadState.Loading) { + item { + CircularProgressIndicator( + modifier = Modifier.padding(top = 16.dp) + ) + } + } items( items = uiItems, key = { item -> "${item.type}_${item.id}_${item.completed}" }, diff --git a/wear/src/main/java/org/tasks/presentation/screens/TaskListViewModel.kt b/wear/src/main/java/org/tasks/presentation/screens/TaskListViewModel.kt index 58ae6e5fb..57f176563 100644 --- a/wear/src/main/java/org/tasks/presentation/screens/TaskListViewModel.kt +++ b/wear/src/main/java/org/tasks/presentation/screens/TaskListViewModel.kt @@ -24,6 +24,7 @@ import org.tasks.GrpcProto.UiItem import org.tasks.WearServiceGrpcKt import org.tasks.extensions.wearDataLayerRegistry import org.tasks.presentation.MyPagingSource +import timber.log.Timber @OptIn(ExperimentalHorologistApi::class) class TaskListViewModel( @@ -33,7 +34,9 @@ class TaskListViewModel( val uiItems: Flow> = Pager( config = PagingConfig(pageSize = 20), pagingSourceFactory = { + Timber.d("Creating new paging source") MyPagingSource { position, limit -> + Timber.d("Fetching $limit @ $position") wearService .getTasks( GrpcProto @@ -44,6 +47,9 @@ class TaskListViewModel( .build() ) .let { Pair(it.totalItems, it.itemsList) } + .also { + Timber.d("Fetched ${it.second.size} items [position=$position limit=$limit totalItems=${it.first}]") + } } .also { pagingSource = it } } @@ -72,27 +78,39 @@ class TaskListViewModel( } fun toggleGroup(value: Long, setCollapsed: Boolean) = viewModelScope.launch { - wearService.toggleGroup( - ToggleGroupRequest.newBuilder() - .setValue(value) - .setCollapsed(setCollapsed) - .build() - ) - invalidate() + try { + wearService.toggleGroup( + ToggleGroupRequest.newBuilder() + .setValue(value) + .setCollapsed(setCollapsed) + .build() + ) + invalidate() + } catch (e: Exception) { + Timber.e(e) + } } fun completeTask(id: Long, completed: Boolean) = viewModelScope.launch { - wearService.completeTask( - CompleteTaskRequest.newBuilder().setId(id).setCompleted(completed).build() - ) - invalidate() + try { + wearService.completeTask( + CompleteTaskRequest.newBuilder().setId(id).setCompleted(completed).build() + ) + invalidate() + } catch (e: Exception) { + Timber.e(e) + } } fun toggleSubtasks(id: Long, collapsed: Boolean) = viewModelScope.launch { - wearService.toggleSubtasks( - ToggleGroupRequest.newBuilder().setValue(id).setCollapsed(collapsed).build() - ) - invalidate() + try { + wearService.toggleSubtasks( + ToggleGroupRequest.newBuilder().setValue(id).setCollapsed(collapsed).build() + ) + invalidate() + } catch (e: Exception) { + Timber.e(e) + } } private fun invalidate() {