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.Prepend
import androidx.paging.PagingSource.LoadParams.Refresh import androidx.paging.PagingSource.LoadParams.Refresh
import androidx.paging.PagingState import androidx.paging.PagingState
import timber.log.Timber
private const val INITIAL_ITEM_COUNT = -1 private const val INITIAL_ITEM_COUNT = -1
@ -32,7 +33,7 @@ class MyPagingSource<T : Any>(
nextPosToLoad nextPosToLoad
} }
val prevKey = if (offset <= 0 || data.isEmpty()) null else offset val prevKey = if (offset <= 0 || data.isEmpty()) null else offset
return LoadResult.Page( LoadResult.Page(
data = data, data = data,
prevKey = prevKey, prevKey = prevKey,
nextKey = nextKey, nextKey = nextKey,
@ -40,6 +41,7 @@ class MyPagingSource<T : Any>(
itemsAfter = maxOf(0, itemCount - nextPosToLoad) itemsAfter = maxOf(0, itemCount - nextPosToLoad)
) )
} catch (e: Exception) { } catch (e: Exception) {
Timber.e(e)
LoadResult.Error(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.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Add 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.Repeat
import androidx.compose.material.icons.outlined.Settings import androidx.compose.material.icons.outlined.Settings
import androidx.compose.runtime.Composable 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.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.paging.LoadState
import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.LazyPagingItems
import androidx.wear.compose.material.Button import androidx.wear.compose.material.Button
import androidx.wear.compose.material.ButtonDefaults import androidx.wear.compose.material.ButtonDefaults
import androidx.wear.compose.material.CircularProgressIndicator
import androidx.wear.compose.material.Icon import androidx.wear.compose.material.Icon
import androidx.wear.compose.material.MaterialTheme import androidx.wear.compose.material.MaterialTheme
import androidx.wear.compose.material.Text import androidx.wear.compose.material.Text
@ -55,6 +63,14 @@ fun TaskListScreen(
ScreenScaffold( ScreenScaffold(
scrollState = columnState, 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( ScalingLazyColumn(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
columnState = columnState, columnState = columnState,
@ -71,6 +87,20 @@ fun TaskListScreen(
// addTask = addTask, // 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(
items = uiItems, items = uiItems,
key = { item -> "${item.type}_${item.id}_${item.completed}" }, key = { item -> "${item.type}_${item.id}_${item.completed}" },

@ -24,6 +24,7 @@ import org.tasks.GrpcProto.UiItem
import org.tasks.WearServiceGrpcKt import org.tasks.WearServiceGrpcKt
import org.tasks.extensions.wearDataLayerRegistry import org.tasks.extensions.wearDataLayerRegistry
import org.tasks.presentation.MyPagingSource import org.tasks.presentation.MyPagingSource
import timber.log.Timber
@OptIn(ExperimentalHorologistApi::class) @OptIn(ExperimentalHorologistApi::class)
class TaskListViewModel( class TaskListViewModel(
@ -33,7 +34,9 @@ class TaskListViewModel(
val uiItems: Flow<PagingData<UiItem>> = Pager( val uiItems: Flow<PagingData<UiItem>> = Pager(
config = PagingConfig(pageSize = 20), config = PagingConfig(pageSize = 20),
pagingSourceFactory = { pagingSourceFactory = {
Timber.d("Creating new paging source")
MyPagingSource { position, limit -> MyPagingSource { position, limit ->
Timber.d("Fetching $limit @ $position")
wearService wearService
.getTasks( .getTasks(
GrpcProto GrpcProto
@ -44,6 +47,9 @@ class TaskListViewModel(
.build() .build()
) )
.let { Pair(it.totalItems, it.itemsList) } .let { Pair(it.totalItems, it.itemsList) }
.also {
Timber.d("Fetched ${it.second.size} items [position=$position limit=$limit totalItems=${it.first}]")
}
} }
.also { pagingSource = it } .also { pagingSource = it }
} }
@ -72,27 +78,39 @@ class TaskListViewModel(
} }
fun toggleGroup(value: Long, setCollapsed: Boolean) = viewModelScope.launch { fun toggleGroup(value: Long, setCollapsed: Boolean) = viewModelScope.launch {
wearService.toggleGroup( try {
ToggleGroupRequest.newBuilder() wearService.toggleGroup(
.setValue(value) ToggleGroupRequest.newBuilder()
.setCollapsed(setCollapsed) .setValue(value)
.build() .setCollapsed(setCollapsed)
) .build()
invalidate() )
invalidate()
} catch (e: Exception) {
Timber.e(e)
}
} }
fun completeTask(id: Long, completed: Boolean) = viewModelScope.launch { fun completeTask(id: Long, completed: Boolean) = viewModelScope.launch {
wearService.completeTask( try {
CompleteTaskRequest.newBuilder().setId(id).setCompleted(completed).build() wearService.completeTask(
) CompleteTaskRequest.newBuilder().setId(id).setCompleted(completed).build()
invalidate() )
invalidate()
} catch (e: Exception) {
Timber.e(e)
}
} }
fun toggleSubtasks(id: Long, collapsed: Boolean) = viewModelScope.launch { fun toggleSubtasks(id: Long, collapsed: Boolean) = viewModelScope.launch {
wearService.toggleSubtasks( try {
ToggleGroupRequest.newBuilder().setValue(id).setCollapsed(collapsed).build() wearService.toggleSubtasks(
) ToggleGroupRequest.newBuilder().setValue(id).setCollapsed(collapsed).build()
invalidate() )
invalidate()
} catch (e: Exception) {
Timber.e(e)
}
} }
private fun invalidate() { private fun invalidate() {

Loading…
Cancel
Save