From 48c2ad9b336d6ad7a3e53fa2f4c56129a4b1aba8 Mon Sep 17 00:00:00 2001 From: Ahmad Ansori Palembani Date: Tue, 7 Jan 2025 18:59:08 +0700 Subject: [PATCH] refactor(library/compose): StateCoroutinePresenter --- .../base/presenter/StateCoroutinePresenter.kt | 15 ++++++ .../ui/library/LibraryComposeController.kt | 30 ------------ .../compose/LibraryComposeController.kt | 49 +++++++++++++++++++ .../compose/LibraryComposePresenter.kt | 11 +++++ .../kanade/tachiyomi/ui/main/MainActivity.kt | 2 +- .../presentation/library/LibraryContent.kt | 31 ++++++++++++ .../presentation/library/LibraryScreen.kt | 26 ++-------- .../main/res/layout/library_controller.xml | 6 +++ 8 files changed, 116 insertions(+), 54 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/StateCoroutinePresenter.kt delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComposeController.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/library/compose/LibraryComposeController.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/library/compose/LibraryComposePresenter.kt create mode 100644 app/src/main/java/yokai/presentation/library/LibraryContent.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/StateCoroutinePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/StateCoroutinePresenter.kt new file mode 100644 index 0000000000..e89ed20283 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/StateCoroutinePresenter.kt @@ -0,0 +1,15 @@ +package eu.kanade.tachiyomi.ui.base.presenter + +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +/** + * Presenter that mimic [cafe.adriel.voyager.core.model.StateScreenModel] for easier migration. + * Temporary class while we're migrating to Compose. + */ +abstract class StateCoroutinePresenter(initialState: S) : BaseCoroutinePresenter() { + + protected val mutableState: MutableStateFlow = MutableStateFlow(initialState) + val state: StateFlow = mutableState.asStateFlow() +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComposeController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComposeController.kt deleted file mode 100644 index 5a428f5eeb..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryComposeController.kt +++ /dev/null @@ -1,30 +0,0 @@ -package eu.kanade.tachiyomi.ui.library - -import android.os.Bundle -import androidx.compose.runtime.Composable -import cafe.adriel.voyager.navigator.Navigator -import cafe.adriel.voyager.transitions.CrossfadeTransition -import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.ui.base.controller.BaseComposeController -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get -import yokai.domain.ui.UiPreferences -import yokai.presentation.library.LibraryScreen - -class LibraryComposeController( - bundle: Bundle? = null, - val uiPreferences: UiPreferences = Injekt.get(), - val preferences: PreferencesHelper = Injekt.get(), -) : BaseComposeController(bundle) { - override val shouldHideLegacyAppBar = false - - @Composable - override fun ScreenContent() { - Navigator( - screen = LibraryScreen(), - content = { - CrossfadeTransition(navigator = it) - }, - ) - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/compose/LibraryComposeController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/compose/LibraryComposeController.kt new file mode 100644 index 0000000000..f0d3679975 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/compose/LibraryComposeController.kt @@ -0,0 +1,49 @@ +package eu.kanade.tachiyomi.ui.library.compose + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.core.view.isGone +import androidx.core.view.isVisible +import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.databinding.LibraryControllerBinding +import eu.kanade.tachiyomi.ui.base.controller.BaseCoroutineController +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import yokai.domain.ui.UiPreferences +import yokai.presentation.library.LibraryContent +import yokai.presentation.theme.YokaiTheme + +class LibraryComposeController( + bundle: Bundle? = null, + val uiPreferences: UiPreferences = Injekt.get(), + val preferences: PreferencesHelper = Injekt.get(), +) : BaseCoroutineController(bundle) { + + override val presenter = LibraryComposePresenter() + + override fun createBinding(inflater: LayoutInflater) = LibraryControllerBinding.inflate(inflater) + + override fun onViewCreated(view: View) { + super.onViewCreated(view) + binding.composeView.isVisible = true + binding.swipeRefresh.isGone = true + + binding.composeView.setContent { + YokaiTheme { + ScreenContent() + } + } + } + + @Composable + fun ScreenContent() { + val state by presenter.state.collectAsState() + LibraryContent( + columns = 3, + ) + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/compose/LibraryComposePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/compose/LibraryComposePresenter.kt new file mode 100644 index 0000000000..d90494adec --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/compose/LibraryComposePresenter.kt @@ -0,0 +1,11 @@ +package eu.kanade.tachiyomi.ui.library.compose + +import eu.kanade.tachiyomi.ui.base.presenter.StateCoroutinePresenter + +class LibraryComposePresenter : + StateCoroutinePresenter(State.Loading) { + + sealed interface State { + data object Loading : State + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index bed1662cda..c68776b631 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -85,8 +85,8 @@ import eu.kanade.tachiyomi.ui.base.SmallToolbarInterface import eu.kanade.tachiyomi.ui.base.activity.BaseActivity import eu.kanade.tachiyomi.ui.base.controller.BaseLegacyController import eu.kanade.tachiyomi.ui.base.controller.DialogController -import eu.kanade.tachiyomi.ui.library.LibraryComposeController import eu.kanade.tachiyomi.ui.library.LibraryController +import eu.kanade.tachiyomi.ui.library.compose.LibraryComposeController import eu.kanade.tachiyomi.ui.manga.MangaDetailsController import eu.kanade.tachiyomi.ui.more.AboutController import eu.kanade.tachiyomi.ui.more.OverflowDialog diff --git a/app/src/main/java/yokai/presentation/library/LibraryContent.kt b/app/src/main/java/yokai/presentation/library/LibraryContent.kt new file mode 100644 index 0000000000..91ecde98a1 --- /dev/null +++ b/app/src/main/java/yokai/presentation/library/LibraryContent.kt @@ -0,0 +1,31 @@ +package yokai.presentation.library + +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import yokai.presentation.AppBarType +import yokai.presentation.YokaiScaffold +import yokai.presentation.library.components.LazyLibraryGrid + +@Composable +fun LibraryContent( + columns: Int, +) { + val items = (0..100).toList() + YokaiScaffold( + onNavigationIconClicked = {}, + appBarType = AppBarType.NONE, + ) { contentPadding -> + LazyLibraryGrid( + columns = columns, + contentPadding = contentPadding, + ) { + items( + items = items, + contentType = { "library_grid_item" } + ) { + Text("Hello world! ($it)") + } + } + } +} diff --git a/app/src/main/java/yokai/presentation/library/LibraryScreen.kt b/app/src/main/java/yokai/presentation/library/LibraryScreen.kt index 4e1abf5fad..a5c66760bf 100644 --- a/app/src/main/java/yokai/presentation/library/LibraryScreen.kt +++ b/app/src/main/java/yokai/presentation/library/LibraryScreen.kt @@ -1,33 +1,13 @@ package yokai.presentation.library -import androidx.compose.foundation.lazy.grid.items -import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import yokai.presentation.AppBarType -import yokai.presentation.YokaiScaffold -import yokai.presentation.library.components.LazyLibraryGrid import yokai.util.Screen class LibraryScreen : Screen() { @Composable override fun Content() { - val columns = 3 // FIXME: Retrieve from preferences - val items = (0..100).toList() - YokaiScaffold( - onNavigationIconClicked = {}, - appBarType = AppBarType.NONE, - ) { contentPadding -> - LazyLibraryGrid( - columns = columns, - contentPadding = contentPadding, - ) { - items( - items = items, - contentType = { "library_grid_item" } - ) { - Text("Hello world! ($it)") - } - } - } + LibraryContent( + columns = 3, // FIXME: Retrieve from preferences + ) } } diff --git a/app/src/main/res/layout/library_controller.xml b/app/src/main/res/layout/library_controller.xml index 488491a971..59b7870d12 100644 --- a/app/src/main/res/layout/library_controller.xml +++ b/app/src/main/res/layout/library_controller.xml @@ -15,6 +15,12 @@ android:layout_height="75dp" android:layout_gravity="center" /> + +