Fix reader state not being restored

master
vianh 2 years ago committed by Koitharu
parent 4044936481
commit 1a17324d26

@ -73,7 +73,7 @@ private const val PREFETCH_LIMIT = 10
class ReaderViewModel class ReaderViewModel
@Inject @Inject
constructor( constructor(
savedStateHandle: SavedStateHandle, private val savedStateHandle: SavedStateHandle,
private val dataRepository: MangaDataRepository, private val dataRepository: MangaDataRepository,
private val historyRepository: HistoryRepository, private val historyRepository: HistoryRepository,
private val bookmarksRepository: BookmarksRepository, private val bookmarksRepository: BookmarksRepository,
@ -223,6 +223,7 @@ constructor(
fun saveCurrentState(state: ReaderState? = null) { fun saveCurrentState(state: ReaderState? = null) {
if (state != null) { if (state != null) {
currentState.value = state currentState.value = state
savedStateHandle[ReaderActivity.EXTRA_STATE] = state
} }
if (incognitoMode.value) { if (incognitoMode.value) {
return return

@ -13,28 +13,23 @@ import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.reader.ui.ReaderState
import org.koitharu.kotatsu.reader.ui.ReaderViewModel import org.koitharu.kotatsu.reader.ui.ReaderViewModel
private const val KEY_STATE = "state"
abstract class BaseReaderFragment<B : ViewBinding> : BaseFragment<B>(), ZoomControl.ZoomControlListener { abstract class BaseReaderFragment<B : ViewBinding> : BaseFragment<B>(), ZoomControl.ZoomControlListener {
protected val viewModel by activityViewModels<ReaderViewModel>() protected val viewModel by activityViewModels<ReaderViewModel>()
private var stateToSave: ReaderState? = null
protected var readerAdapter: BaseReaderAdapter<*>? = null protected var readerAdapter: BaseReaderAdapter<*>? = null
private set private set
override fun onViewBindingCreated(binding: B, savedInstanceState: Bundle?) { override fun onViewBindingCreated(binding: B, savedInstanceState: Bundle?) {
super.onViewBindingCreated(binding, savedInstanceState) super.onViewBindingCreated(binding, savedInstanceState)
var restoredState = savedInstanceState?.getParcelableCompat<ReaderState>(KEY_STATE)
readerAdapter = onCreateAdapter() readerAdapter = onCreateAdapter()
viewModel.content.observe(viewLifecycleOwner) { viewModel.content.observe(viewLifecycleOwner) {
var pendingState = restoredState ?: it.state if (it.state == null && it.pages.isNotEmpty() && readerAdapter?.hasItems != true) {
if (pendingState == null && it.pages.isNotEmpty() && readerAdapter?.hasItems != true) { onPagesChanged(it.pages, viewModel.getCurrentState())
pendingState = viewModel.getCurrentState() } else {
onPagesChanged(it.pages, it.state)
} }
onPagesChanged(it.pages, pendingState)
restoredState = null
} }
} }
@ -44,19 +39,11 @@ abstract class BaseReaderFragment<B : ViewBinding> : BaseFragment<B>(), ZoomCont
} }
override fun onDestroyView() { override fun onDestroyView() {
stateToSave = getCurrentState() viewModel.saveCurrentState(getCurrentState())
readerAdapter = null readerAdapter = null
super.onDestroyView() super.onDestroyView()
} }
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
getCurrentState()?.let {
stateToSave = it
}
outState.putParcelable(KEY_STATE, stateToSave)
}
protected fun requireAdapter() = checkNotNull(readerAdapter) { protected fun requireAdapter() = checkNotNull(readerAdapter) {
"Adapter was not created or already destroyed" "Adapter was not created or already destroyed"
} }

Loading…
Cancel
Save