diff --git a/app/src/main/java/org/koitharu/kotatsu/details/DetailsModule.kt b/app/src/main/java/org/koitharu/kotatsu/details/DetailsModule.kt index 70934ea32..c78b92d50 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/DetailsModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/DetailsModule.kt @@ -7,5 +7,5 @@ import org.koitharu.kotatsu.details.ui.DetailsViewModel val detailsModule get() = module { - viewModel { DetailsViewModel(get(), get(), get(), get(), get(), get(), get()) } + viewModel { DetailsViewModel(get(), get(), get(), get(), get()) } } \ No newline at end of file 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 36effe5d1..fb06a3eaa 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 @@ -26,6 +26,7 @@ import org.koitharu.kotatsu.browser.BrowserActivity import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.download.DownloadService +import org.koitharu.kotatsu.search.ui.global.GlobalSearchActivity import org.koitharu.kotatsu.utils.MangaShortcut import org.koitharu.kotatsu.utils.ShareHelper import org.koitharu.kotatsu.utils.ext.getDisplayMessage @@ -164,6 +165,12 @@ class DetailsActivity : BaseActivity(), TabLayoutMediator.TabConfigurationStrate } true } + R.id.action_related -> { + manga?.let { + startActivity(GlobalSearchActivity.newIntent(this, it.title)) + } + true + } R.id.action_shortcut -> { manga?.let { lifecycleScope.launch { 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 84ef434e9..895feebd9 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 @@ -2,24 +2,20 @@ package org.koitharu.kotatsu.details.ui import androidx.lifecycle.MutableLiveData import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.* import kotlinx.coroutines.withContext import org.koitharu.kotatsu.base.domain.MangaDataRepository +import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.core.exceptions.MangaNotFoundException import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaHistory -import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.favourites.domain.OnFavouritesChangeListener import org.koitharu.kotatsu.history.domain.HistoryRepository import org.koitharu.kotatsu.history.domain.OnHistoryChangeListener -import org.koitharu.kotatsu.list.ui.MangaListViewModel import org.koitharu.kotatsu.local.domain.LocalMangaRepository -import org.koitharu.kotatsu.search.domain.MangaSearchRepository import org.koitharu.kotatsu.tracker.domain.TrackingRepository import org.koitharu.kotatsu.utils.SingleLiveEvent -import org.koitharu.kotatsu.utils.ext.onFirst import org.koitharu.kotatsu.utils.ext.safe import java.io.IOException @@ -28,12 +24,8 @@ class DetailsViewModel( private val favouritesRepository: FavouritesRepository, private val localMangaRepository: LocalMangaRepository, private val trackingRepository: TrackingRepository, - private val searchRepository: MangaSearchRepository, - private val mangaDataRepository: MangaDataRepository, - settings: AppSettings -) : MangaListViewModel(settings), OnHistoryChangeListener, OnFavouritesChangeListener { - - override val content = MutableLiveData>() + private val mangaDataRepository: MangaDataRepository +) : BaseViewModel(), OnHistoryChangeListener, OnFavouritesChangeListener { val mangaData = MutableLiveData() val newChapters = MutableLiveData(0) @@ -96,30 +88,6 @@ class DetailsViewModel( } } - fun loadRelated() { - val manga = mangaData.value ?: return - searchRepository.globalSearch(manga.title) - .map { list -> - list.filter { x -> x.id != manga.id } - }.filterNot { x -> x.isEmpty() } - .flowOn(Dispatchers.IO) - .catch { e -> - if (e is IOException) { - onError.call(e) - } - } - .onEmpty { - content.value = emptyList() - isLoading.value = false - }.onCompletion { - // TODO - }.onFirst { - isLoading.value = false - }.onEach { - content.value = content.value.orEmpty() + it - } - } - override fun onHistoryChanged() { loadHistory(mangaData.value ?: return) } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsAdapter.kt index 4d048d72f..03cf1d76c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/MangaDetailsAdapter.kt @@ -6,12 +6,11 @@ import androidx.viewpager2.adapter.FragmentStateAdapter class MangaDetailsAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) { - override fun getItemCount() = 3 + override fun getItemCount() = 2 override fun createFragment(position: Int): Fragment = when (position) { 0 -> DetailsFragment() 1 -> ChaptersFragment() - 2 -> RelatedMangaFragment() else -> throw IndexOutOfBoundsException("No fragment for position $position") } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/RelatedMangaFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/RelatedMangaFragment.kt deleted file mode 100644 index 2777205c1..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/RelatedMangaFragment.kt +++ /dev/null @@ -1,22 +0,0 @@ -package org.koitharu.kotatsu.details.ui - -import android.os.Bundle -import android.view.View -import org.koin.android.viewmodel.ext.android.sharedViewModel -import org.koitharu.kotatsu.list.ui.MangaListFragment - -class RelatedMangaFragment : MangaListFragment() { - - override val viewModel by sharedViewModel() - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - isSwipeRefreshEnabled = false - } - - override fun onRequestMoreItems(offset: Int) { - if (offset == 0) { - viewModel.loadRelated() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt index 9916acce8..d31ccfa0b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt @@ -32,7 +32,7 @@ class HistoryListViewModel( repository.observeAll(), createListModeFlow() ) { list, mode -> - when(mode) { + when (mode) { ListMode.LIST -> list.map { it.toListModel() } ListMode.DETAILED_LIST -> list.map { it.toListDetailedModel() } ListMode.GRID -> list.map { it.toGridModel() } diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt index d1a64ccfa..74e3b3982 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt @@ -271,7 +271,7 @@ abstract class MangaListFragment : BaseFragment(R.layout.fragment_list), override fun getSpanSize(position: Int): Int { val total = (recyclerView.layoutManager as? GridLayoutManager)?.spanCount ?: return 1 - return when(adapter?.getItemViewType(position)) { + return when (adapter?.getItemViewType(position)) { MangaListAdapter.ITEM_TYPE_PROGRESS -> total else -> 1 } diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt index 33133d2c8..343e691ad 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/MangaListAdapter.kt @@ -18,7 +18,10 @@ class MangaListAdapter( init { delegatesManager.addDelegate(ITEM_TYPE_MANGA_LIST, mangaListItemAD(coil, clickListener)) - .addDelegate(ITEM_TYPE_MANGA_LIST_DETAILED, mangaListDetailedItemAD(coil, clickListener)) + .addDelegate( + ITEM_TYPE_MANGA_LIST_DETAILED, + mangaListDetailedItemAD(coil, clickListener) + ) .addDelegate(ITEM_TYPE_MANGA_GRID, mangaGridItemAD(coil, clickListener)) .addDelegate(ITEM_TYPE_PROGRESS, indeterminateProgressAD()) } diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt index 909e20a14..f4dada4a9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListViewModel.kt @@ -37,7 +37,7 @@ class LocalListViewModel( private val mangaList = MutableStateFlow>(emptyList()) override val content = combine(mangaList, createListModeFlow()) { list, mode -> - when(mode) { + when (mode) { ListMode.LIST -> list.map { it.toListModel() } ListMode.DETAILED_LIST -> list.map { it.toListDetailedModel() } ListMode.GRID -> list.map { it.toGridModel() } diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt index 08ab7978b..8d006d8e3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListViewModel.kt @@ -33,7 +33,7 @@ class RemoteListViewModel( private var loadingJob: Job? = null override val content = combine(mangaList.drop(1), createListModeFlow()) { list, mode -> - when(mode) { + when (mode) { ListMode.LIST -> list.map { it.toListModel() } ListMode.DETAILED_LIST -> list.map { it.toListDetailedModel() } ListMode.GRID -> list.map { it.toGridModel() } diff --git a/app/src/main/res/layout-w600dp/fragment_details.xml b/app/src/main/res/layout-w600dp/fragment_details.xml index 508f13a08..cc251c658 100644 --- a/app/src/main/res/layout-w600dp/fragment_details.xml +++ b/app/src/main/res/layout-w600dp/fragment_details.xml @@ -118,6 +118,7 @@ android:justificationMode="inter_word" android:lineSpacingMultiplier="1.2" android:padding="12dp" + android:textIsSelectable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/imageView_cover" app:layout_constraintTop_toBottomOf="@id/divider_top" diff --git a/app/src/main/res/layout/fragment_details.xml b/app/src/main/res/layout/fragment_details.xml index b449f07ea..90cd6ce1a 100644 --- a/app/src/main/res/layout/fragment_details.xml +++ b/app/src/main/res/layout/fragment_details.xml @@ -129,6 +129,7 @@ android:justificationMode="inter_word" android:lineSpacingMultiplier="1.2" android:padding="12dp" + android:textIsSelectable="true" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/chips_tags" diff --git a/app/src/main/res/menu/opt_details.xml b/app/src/main/res/menu/opt_details.xml index db70718af..fbbf706fc 100644 --- a/app/src/main/res/menu/opt_details.xml +++ b/app/src/main/res/menu/opt_details.xml @@ -20,6 +20,10 @@ android:visible="false" app:showAsAction="never" /> + + + app:iconSpaceReserved="false" + app:useSimpleSummaryProvider="true" />