From c48cf8334381912da60f015c284ff8a62610020e Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 29 Mar 2022 08:13:18 +0300 Subject: [PATCH] Fix default branch selection --- .../kotatsu/core/os/ShortcutsRepository.kt | 2 +- .../kotatsu/details/ui/ChaptersFragment.kt | 6 +-- .../kotatsu/details/ui/DetailsActivity.kt | 6 +-- .../kotatsu/details/ui/DetailsFragment.kt | 15 +++++--- .../kotatsu/details/ui/DetailsViewModel.kt | 3 ++ .../koitharu/kotatsu/main/ui/MainActivity.kt | 2 +- .../koitharu/kotatsu/reader/ReaderModule.kt | 11 +++++- .../kotatsu/reader/ui/ReaderActivity.kt | 37 +++++++++++++++---- .../koitharu/kotatsu/reader/ui/ReaderState.kt | 6 ++- .../kotatsu/reader/ui/ReaderViewModel.kt | 28 +++++++------- 10 files changed, 76 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsRepository.kt index b2e9deba5..a54304c28 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsRepository.kt @@ -69,7 +69,7 @@ class ShortcutsRepository( .setLongLabel(manga.title) .setIcon(icon) .setIntent( - ReaderActivity.newIntent(context, manga.id, null) + ReaderActivity.newIntent(context, manga.id) .setAction(ReaderActivity.ACTION_MANGA_READ) ) } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt index cd08c6139..16cc0e797 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt @@ -128,9 +128,9 @@ class ChaptersFragment : ) startActivity( ReaderActivity.newIntent( - view.context, - viewModel.manga.value ?: return, - ReaderState(item.chapter.id, 0, 0) + context = view.context, + manga = viewModel.manga.value ?: return, + state = ReaderState(item.chapter.id, 0, 0), ), options.toBundle() ) diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index ee62e7926..ef3188532 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -256,9 +256,9 @@ class DetailsActivity : BaseActivity(), TabLayoutMediato setPositiveButton(R.string.read) { _, _ -> startActivity( ReaderActivity.newIntent( - this@DetailsActivity, - remoteManga, - ReaderState(chapterId, 0, 0) + context = this@DetailsActivity, + manga = remoteManga, + state = ReaderState(chapterId, 0, 0) ) ) } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index 2d182693d..ab4ae21e1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -188,9 +188,9 @@ class DetailsFragment : } else { startActivity( ReaderActivity.newIntent( - context ?: return, - manga, - null + context = context ?: return, + manga = manga, + branch = viewModel.selectedBranchValue, ) ) } @@ -227,11 +227,14 @@ class DetailsFragment : v.showPopupMenu(R.menu.popup_read) { when (it.itemId) { R.id.action_read -> { + val branch = viewModel.selectedBranchValue startActivity( ReaderActivity.newIntent( - context ?: return@showPopupMenu false, - viewModel.manga.value ?: return@showPopupMenu false, - viewModel.chapters.value?.firstOrNull()?.let { c -> + context = context ?: return@showPopupMenu false, + manga = viewModel.manga.value ?: return@showPopupMenu false, + state = viewModel.chapters.value?.firstOrNull { c -> + c.chapter.branch == branch + }?.let { c -> ReaderState(c.chapter.id, 0, 0) } ) diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt index 074eefeb1..62855297a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt @@ -119,6 +119,9 @@ class DetailsViewModel( (if (reversed) list.asReversed() else list).filterSearch(query) }.asLiveData(viewModelScope.coroutineContext + Dispatchers.Default) + val selectedBranchValue: String? + get() = selectedBranch.value + init { loadingJob = doLoad() } diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index b89601312..091e6ae05 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -298,7 +298,7 @@ class MainActivity : binding.fab, 0, 0, binding.fab.measuredWidth, binding.fab.measuredHeight ) } - startActivity(ReaderActivity.newIntent(this, manga, null), options?.toBundle()) + startActivity(ReaderActivity.newIntent(this, manga), options?.toBundle()) } private fun onError(e: Throwable) { diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ReaderModule.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ReaderModule.kt index a7a806fef..bee3fe9f7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ReaderModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ReaderModule.kt @@ -13,6 +13,15 @@ val readerModule single { PagesCache(get()) } viewModel { params -> - ReaderViewModel(params[0], params[1], get(), get(), get(), get(), get()) + ReaderViewModel( + intent = params[0], + initialState = params[1], + preselectedBranch = params[2], + dataRepository = get(), + historyRepository = get(), + shortcutsRepository = get(), + settings = get(), + downloadManagerHelper = get(), + ) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index 3c8a5c982..f7bfce558 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -54,13 +54,22 @@ import org.koitharu.kotatsu.utils.ext.getDisplayMessage import org.koitharu.kotatsu.utils.ext.hasGlobalPoint import org.koitharu.kotatsu.utils.ext.observeWithPrevious -class ReaderActivity : BaseFullscreenActivity(), +class ReaderActivity : + BaseFullscreenActivity(), ChaptersBottomSheet.OnChapterChangeListener, - GridTouchHelper.OnGridTouchListener, OnPageSelectListener, ReaderConfigDialog.Callback, - ActivityResultCallback, ReaderControlDelegate.OnInteractionListener, OnApplyWindowInsetsListener { + GridTouchHelper.OnGridTouchListener, + OnPageSelectListener, + ReaderConfigDialog.Callback, + ActivityResultCallback, + ReaderControlDelegate.OnInteractionListener, + OnApplyWindowInsetsListener { private val viewModel by viewModel { - parametersOf(MangaIntent(intent), intent?.getParcelableExtra(EXTRA_STATE)) + parametersOf( + MangaIntent(intent), + intent?.getParcelableExtra(EXTRA_STATE), + intent?.getStringExtra(EXTRA_BRANCH), + ) } private lateinit var touchHelper: GridTouchHelper @@ -142,7 +151,8 @@ class ReaderActivity : BaseFullscreenActivity(), when (item.itemId) { R.id.action_reader_mode -> { ReaderConfigDialog.show( - supportFragmentManager, when (reader) { + supportFragmentManager, + when (reader) { is PagerReaderFragment -> ReaderMode.STANDARD is WebtoonReaderFragment -> ReaderMode.WEBTOON is ReversedReaderFragment -> ReaderMode.REVERSED @@ -407,18 +417,29 @@ class ReaderActivity : BaseFullscreenActivity(), const val ACTION_MANGA_READ = "${BuildConfig.APPLICATION_ID}.action.READ_MANGA" private const val EXTRA_STATE = "state" + private const val EXTRA_BRANCH = "branch" private const val TOAST_DURATION = 1500L + fun newIntent(context: Context, manga: Manga): Intent { + return Intent(context, ReaderActivity::class.java) + .putExtra(MangaIntent.KEY_MANGA, ParcelableManga(manga)) + } + + fun newIntent(context: Context, manga: Manga, branch: String?): Intent { + return Intent(context, ReaderActivity::class.java) + .putExtra(MangaIntent.KEY_MANGA, ParcelableManga(manga)) + .putExtra(EXTRA_BRANCH, branch) + } + fun newIntent(context: Context, manga: Manga, state: ReaderState?): Intent { return Intent(context, ReaderActivity::class.java) .putExtra(MangaIntent.KEY_MANGA, ParcelableManga(manga)) .putExtra(EXTRA_STATE, state) } - fun newIntent(context: Context, mangaId: Long, state: ReaderState?): Intent { + fun newIntent(context: Context, mangaId: Long): Intent { return Intent(context, ReaderActivity::class.java) .putExtra(MangaIntent.KEY_ID, mangaId) - .putExtra(EXTRA_STATE, state) } } -} +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderState.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderState.kt index 530883a7a..0fe72b499 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderState.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderState.kt @@ -20,8 +20,10 @@ data class ReaderState( scroll = history.scroll ) - fun initial(manga: Manga) = ReaderState( - chapterId = manga.chapters?.firstOrNull()?.id ?: error("Cannot find first chapter"), + fun initial(manga: Manga, branch: String?) = ReaderState( + chapterId = manga.chapters?.firstOrNull { + it.branch == branch + }?.id ?: error("Cannot find first chapter"), page = 0, scroll = 0 ) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt index 7d0326e20..56f7c6df0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt @@ -34,6 +34,7 @@ import org.koitharu.kotatsu.utils.ext.processLifecycleScope class ReaderViewModel( private val intent: MangaIntent, initialState: ReaderState?, + private val preselectedBranch: String?, private val dataRepository: MangaDataRepository, private val historyRepository: HistoryRepository, private val shortcutsRepository: ShortcutsRepository, @@ -188,8 +189,7 @@ class ReaderViewModel( private fun loadImpl() { loadingJob = launchLoadingJob(Dispatchers.Default) { - var manga = dataRepository.resolveIntent(intent) - ?: throw MangaNotFoundException("Cannot find manga") + var manga = dataRepository.resolveIntent(intent) ?: throw MangaNotFoundException("Cannot find manga") mangaData.value = manga val repo = MangaRepository(manga.source) manga = repo.getDetails(manga) @@ -197,21 +197,20 @@ class ReaderViewModel( chapters.put(it.id, it) } // determine mode - val mode = - dataRepository.getReaderMode(manga.id) ?: manga.chapters?.randomOrNull()?.let { - val pages = repo.getPages(it) - val isWebtoon = MangaUtils.determineMangaIsWebtoon(pages) - val newMode = getReaderMode(isWebtoon) - if (isWebtoon != null) { - dataRepository.savePreferences(manga, newMode) - } - newMode - } ?: error("There are no chapters in this manga") + val mode = dataRepository.getReaderMode(manga.id) ?: manga.chapters?.randomOrNull()?.let { + val pages = repo.getPages(it) + val isWebtoon = MangaUtils.determineMangaIsWebtoon(pages) + val newMode = getReaderMode(isWebtoon) + if (isWebtoon != null) { + dataRepository.savePreferences(manga, newMode) + } + newMode + } ?: error("There are no chapters in this manga") // obtain state if (currentState.value == null) { currentState.value = historyRepository.getOne(manga)?.let { ReaderState.from(it) - } ?: ReaderState.initial(manga) + } ?: ReaderState.initial(manga, preselectedBranch) } val branch = chapters[currentState.value?.chapterId ?: 0L].branch @@ -327,6 +326,5 @@ class ReaderViewModel( ) } } - } -} +} \ No newline at end of file