Fixed: Progress is not being tracked. (v1.0.1)
This commit is contained in:
parent
0a06ccdc67
commit
49567dcade
2 changed files with 62 additions and 46 deletions
|
|
@ -16,6 +16,7 @@ import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
|
import androidx.compose.foundation.lazy.LazyListState
|
||||||
import androidx.compose.foundation.text.selection.DisableSelection
|
import androidx.compose.foundation.text.selection.DisableSelection
|
||||||
import androidx.compose.material3.LinearProgressIndicator
|
import androidx.compose.material3.LinearProgressIndicator
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
|
@ -29,6 +30,7 @@ import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.derivedStateOf
|
import androidx.compose.runtime.derivedStateOf
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.geometry.Offset
|
import androidx.compose.ui.geometry.Offset
|
||||||
|
|
@ -87,6 +89,12 @@ fun ReaderScreenRoot() {
|
||||||
val state = viewModel.state.collectAsState()
|
val state = viewModel.state.collectAsState()
|
||||||
val mainState = mainViewModel.state.collectAsState()
|
val mainState = mainViewModel.state.collectAsState()
|
||||||
|
|
||||||
|
val lazyListState = rememberSaveable(
|
||||||
|
state.value.listState,
|
||||||
|
saver = LazyListState.Saver
|
||||||
|
) {
|
||||||
|
state.value.listState
|
||||||
|
}
|
||||||
val canScroll by remember {
|
val canScroll by remember {
|
||||||
derivedStateOf {
|
derivedStateOf {
|
||||||
state.value.listState.canScrollBackward && state.value.listState.canScrollForward
|
state.value.listState.canScrollBackward && state.value.listState.canScrollForward
|
||||||
|
|
@ -109,16 +117,18 @@ fun ReaderScreenRoot() {
|
||||||
).show()
|
).show()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
viewModel.onUpdateProgress(
|
|
||||||
onLibraryEvent = libraryViewModel::onEvent,
|
|
||||||
onHistoryEvent = historyViewModel::onEvent
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
LaunchedEffect(canScroll) {
|
LaunchedEffect(canScroll) {
|
||||||
if (!canScroll && !state.value.showMenu && !state.value.loading) {
|
if (!canScroll && !state.value.showMenu && !state.value.loading) {
|
||||||
viewModel.onEvent(ReaderEvent.OnShowHideMenu(context = context))
|
viewModel.onEvent(ReaderEvent.OnShowHideMenu(context = context))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LaunchedEffect(lazyListState) {
|
||||||
|
viewModel.onUpdateProgress(
|
||||||
|
onLibraryEvent = libraryViewModel::onEvent,
|
||||||
|
onHistoryEvent = historyViewModel::onEvent
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
DisposableEffect(Unit) {
|
DisposableEffect(Unit) {
|
||||||
onDispose {
|
onDispose {
|
||||||
|
|
@ -130,6 +140,7 @@ fun ReaderScreenRoot() {
|
||||||
state = state,
|
state = state,
|
||||||
mainState = mainState,
|
mainState = mainState,
|
||||||
navigator = navigator,
|
navigator = navigator,
|
||||||
|
lazyListState = lazyListState,
|
||||||
onEvent = viewModel::onEvent,
|
onEvent = viewModel::onEvent,
|
||||||
onMainEvent = mainViewModel::onEvent,
|
onMainEvent = mainViewModel::onEvent,
|
||||||
onLibraryEvent = libraryViewModel::onEvent,
|
onLibraryEvent = libraryViewModel::onEvent,
|
||||||
|
|
@ -143,6 +154,7 @@ private fun ReaderScreen(
|
||||||
state: State<ReaderState>,
|
state: State<ReaderState>,
|
||||||
mainState: State<MainState>,
|
mainState: State<MainState>,
|
||||||
navigator: Navigator,
|
navigator: Navigator,
|
||||||
|
lazyListState: LazyListState,
|
||||||
onEvent: (ReaderEvent) -> Unit,
|
onEvent: (ReaderEvent) -> Unit,
|
||||||
onMainEvent: (MainEvent) -> Unit,
|
onMainEvent: (MainEvent) -> Unit,
|
||||||
onLibraryEvent: (LibraryEvent) -> Unit,
|
onLibraryEvent: (LibraryEvent) -> Unit,
|
||||||
|
|
@ -330,7 +342,7 @@ private fun ReaderScreen(
|
||||||
}
|
}
|
||||||
) { toolbarHidden ->
|
) { toolbarHidden ->
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
state = state.value.listState,
|
state = lazyListState,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.background(backgroundColor)
|
.background(backgroundColor)
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.asStateFlow
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
import kotlinx.coroutines.flow.collectLatest
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
import kotlinx.coroutines.flow.debounce
|
import kotlinx.coroutines.flow.debounce
|
||||||
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.flow.update
|
import kotlinx.coroutines.flow.update
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.yield
|
import kotlinx.coroutines.yield
|
||||||
|
|
@ -1269,15 +1270,17 @@ class ReaderViewModel @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(FlowPreview::class)
|
@OptIn(FlowPreview::class)
|
||||||
suspend fun onUpdateProgress(
|
fun onUpdateProgress(
|
||||||
onLibraryEvent: (LibraryEvent) -> Unit,
|
onLibraryEvent: (LibraryEvent) -> Unit,
|
||||||
onHistoryEvent: (HistoryEvent) -> Unit
|
onHistoryEvent: (HistoryEvent) -> Unit
|
||||||
) {
|
) {
|
||||||
|
viewModelScope.launch {
|
||||||
snapshotFlow {
|
snapshotFlow {
|
||||||
_state.value.listState.firstVisibleItemIndex to _state.value.listState.firstVisibleItemScrollOffset
|
_state.value.listState.firstVisibleItemIndex to _state.value.listState.firstVisibleItemScrollOffset
|
||||||
}
|
}
|
||||||
|
.distinctUntilChanged()
|
||||||
.debounce(300)
|
.debounce(300)
|
||||||
.collectLatest { items ->
|
.collectLatest { (firstVisibleItemIndex, firstVisibleItemScrollOffset) ->
|
||||||
val listState = _state.value.listState
|
val listState = _state.value.listState
|
||||||
if (
|
if (
|
||||||
!_state.value.loading &&
|
!_state.value.loading &&
|
||||||
|
|
@ -1291,11 +1294,11 @@ class ReaderViewModel @Inject constructor(
|
||||||
.index
|
.index
|
||||||
val totalItemsCount = listState.layoutInfo.totalItemsCount - 1
|
val totalItemsCount = listState.layoutInfo.totalItemsCount - 1
|
||||||
|
|
||||||
val progress = if (items.first > 0) {
|
val progress = if (firstVisibleItemIndex > 0) {
|
||||||
if (lastVisibleItemIndex >= totalItemsCount) {
|
if (lastVisibleItemIndex >= totalItemsCount) {
|
||||||
1f
|
1f
|
||||||
} else {
|
} else {
|
||||||
items.first / (_state.value.text.size - 1).toFloat()
|
firstVisibleItemIndex / (_state.value.text.size - 1).toFloat()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
0f
|
0f
|
||||||
|
|
@ -1304,8 +1307,8 @@ class ReaderViewModel @Inject constructor(
|
||||||
onEvent(
|
onEvent(
|
||||||
ReaderEvent.OnChangeProgress(
|
ReaderEvent.OnChangeProgress(
|
||||||
progress = progress,
|
progress = progress,
|
||||||
firstVisibleItemIndex = items.first,
|
firstVisibleItemIndex = firstVisibleItemIndex,
|
||||||
firstVisibleItemOffset = items.second,
|
firstVisibleItemOffset = firstVisibleItemScrollOffset,
|
||||||
refreshList = { book ->
|
refreshList = { book ->
|
||||||
onLibraryEvent(LibraryEvent.OnUpdateBook(book))
|
onLibraryEvent(LibraryEvent.OnUpdateBook(book))
|
||||||
onHistoryEvent(HistoryEvent.OnUpdateBook(book))
|
onHistoryEvent(HistoryEvent.OnUpdateBook(book))
|
||||||
|
|
@ -1315,6 +1318,7 @@ class ReaderViewModel @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun calculateProgress(): Float {
|
private fun calculateProgress(): Float {
|
||||||
val listState = _state.value.listState
|
val listState = _state.value.listState
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue