Log more errors on WearOS

pull/3080/head
Alex Baker 1 year ago
parent 393ad4977b
commit f1afd1974c

@ -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<T : Any>(
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<T : Any>(
itemsAfter = maxOf(0, itemCount - nextPosToLoad)
)
} catch (e: Exception) {
Timber.e(e)
LoadResult.Error(e)
}
}

@ -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}" },

@ -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<PagingData<UiItem>> = 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() {

Loading…
Cancel
Save