diff --git a/app/build.gradle b/app/build.gradle index 73178ec24..ff0b0a580 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,6 +30,7 @@ android { } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() + freeCompilerArgs += "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi" } buildTypes { debug { @@ -71,7 +72,7 @@ dependencies { implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01' implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'androidx.work:work-runtime-ktx:2.4.0-beta01' - implementation 'com.google.android.material:material:1.2.0-alpha06' + implementation 'com.google.android.material:material:1.3.0-alpha01' implementation 'androidx.room:room-runtime:2.2.5' implementation 'androidx.room:room-ktx:2.2.5' diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt index a75ea985a..e0fcfe0da 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt @@ -188,6 +188,7 @@ class MangaDetailsActivity : BaseActivity(), MangaDetailsView, tab.text = when (position) { 0 -> getString(R.string.details) 1 -> getString(R.string.chapters) + 2 -> getString(R.string.related) else -> null } } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsAdapter.kt index 02a881ef6..2644fd61d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsAdapter.kt @@ -6,11 +6,12 @@ import androidx.viewpager2.adapter.FragmentStateAdapter class MangaDetailsAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) { - override fun getItemCount() = 2 + override fun getItemCount() = 3 override fun createFragment(position: Int): Fragment = when(position) { 0 -> MangaDetailsFragment() 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/ui/details/MangaDetailsPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt index 6b276e273..fa7a1291c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt @@ -2,6 +2,7 @@ package org.koitharu.kotatsu.ui.details import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import moxy.InjectViewState @@ -13,6 +14,7 @@ import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.parser.LocalMangaRepository import org.koitharu.kotatsu.domain.MangaDataRepository import org.koitharu.kotatsu.domain.MangaProviderFactory +import org.koitharu.kotatsu.domain.MangaSearchRepository import org.koitharu.kotatsu.domain.favourites.FavouritesRepository import org.koitharu.kotatsu.domain.favourites.OnFavouritesChangeListener import org.koitharu.kotatsu.domain.history.HistoryRepository @@ -30,6 +32,7 @@ class MangaDetailsPresenter private constructor() : BasePresenter + list.filter { x -> x.id != manga.id } + }.filterNot { x -> x.isEmpty() } + .flowOn(Dispatchers.IO) + .catch { e -> + if (e is IOException) { + viewState.onError(e) + } + } + .onEmpty { + viewState.onListChanged(emptyList()) + viewState.onLoadingStateChanged(isLoading = false) + }.onCompletion { + viewState.onListAppended(emptyList()) + }.collect { + if (isFirstCall) { + isFirstCall = false + viewState.onListChanged(it) + viewState.onLoadingStateChanged(isLoading = false) + } else { + viewState.onListAppended(it) + } + } + } + } + override fun onHistoryChanged() { loadHistory(manga ?: return) } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsView.kt index af1112d9a..e23feb3c9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsView.kt @@ -1,5 +1,8 @@ package org.koitharu.kotatsu.ui.details +import moxy.viewstate.strategy.AddToEndSingleTagStrategy +import moxy.viewstate.strategy.AddToEndStrategy +import moxy.viewstate.strategy.StateStrategyType import moxy.viewstate.strategy.alias.AddToEndSingle import moxy.viewstate.strategy.alias.SingleState import org.koitharu.kotatsu.core.model.FavouriteCategory @@ -23,4 +26,13 @@ interface MangaDetailsView : BaseMvpView { @AddToEndSingle fun onNewChaptersChanged(newChapters: Int) + + @StateStrategyType(AddToEndSingleTagStrategy::class, tag = "content") + fun onListChanged(list: List) = Unit + + @StateStrategyType(AddToEndStrategy::class, tag = "content") + fun onListAppended(list: List) = Unit + + @StateStrategyType(AddToEndSingleTagStrategy::class, tag = "content") + fun onListError(e: Throwable) = Unit } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/RelatedMangaFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/RelatedMangaFragment.kt new file mode 100644 index 000000000..9896f955a --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/RelatedMangaFragment.kt @@ -0,0 +1,34 @@ +package org.koitharu.kotatsu.ui.details + +import moxy.ktx.moxyPresenter +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.ui.list.MangaListFragment + +class RelatedMangaFragment : MangaListFragment(), MangaDetailsView { + + private val presenter by moxyPresenter(factory = MangaDetailsPresenter.Companion::getInstance) + + override fun onRequestMoreItems(offset: Int) { + if (offset == 0) { + presenter.loadRelated() + } + } + + override fun onMangaUpdated(manga: Manga) = Unit + + override fun onHistoryChanged(history: MangaHistory?) = Unit + + override fun onFavouriteChanged(categories: List) = Unit + + override fun onMangaRemoved(manga: Manga) = Unit + + override fun onNewChaptersChanged(newChapters: Int) = Unit + + override fun onListChanged(list: List) = super.onListChanged(list) + + override fun onListAppended(list: List) = super.onListAppended(list) + + override fun onListError(e: Throwable) = super.onListError(e) +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchPresenter.kt index 5e39b8cf2..47e713056 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchPresenter.kt @@ -18,7 +18,6 @@ class GlobalSearchPresenter : BasePresenter>() { super.onFirstViewAttach() } - @Suppress("EXPERIMENTAL_API_USAGE") fun startSearch(query: String) { presenterScope.launch { viewState.onLoadingStateChanged(isLoading = true) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d8dec4d26..c6a32d4a7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -134,6 +134,7 @@ В этой категории ничего нет Прочитать позже Обновления - Here you will see manga updates + Здесь будут отображаться обновления манги, которую Вы читаете Результаты поиска + Похожие \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 42f75e1dd..83e6bd10c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -135,6 +135,7 @@ This category is empty Read later Updates - Here you will see manga updates + Here you will see the new chapters of the manga you are reading Search results + Related \ No newline at end of file