@@ -3,56 +3,108 @@ package org.cru.godtools.article.ui.categories
33import android.os.Bundle
44import android.view.LayoutInflater
55import android.view.ViewGroup
6- import androidx.lifecycle.map
6+ import androidx.compose.foundation.clickable
7+ import androidx.compose.foundation.layout.Arrangement
8+ import androidx.compose.foundation.layout.fillMaxSize
9+ import androidx.compose.foundation.lazy.LazyColumn
10+ import androidx.compose.foundation.lazy.items
11+ import androidx.compose.runtime.Composable
12+ import androidx.compose.runtime.collectAsState
13+ import androidx.compose.runtime.derivedStateOf
14+ import androidx.compose.runtime.getValue
15+ import androidx.compose.runtime.remember
16+ import androidx.compose.ui.Modifier
17+ import androidx.compose.ui.platform.ComposeView
18+ import androidx.compose.ui.platform.ViewCompositionStrategy
19+ import androidx.compose.ui.unit.dp
20+ import androidx.fragment.app.Fragment
21+ import androidx.fragment.app.viewModels
722import dagger.hilt.android.AndroidEntryPoint
823import java.util.Locale
924import javax.inject.Inject
25+ import javax.inject.Named
26+ import okio.FileSystem
1027import org.ccci.gto.android.common.androidx.fragment.app.findListener
11- import org.ccci.gto.android.common.androidx.recyclerview.decorator.MarginItemDecoration
28+ import org.cru.godtools.base.tool.BaseToolRendererModule.Companion.TOOL_RESOURCE_FILE_SYSTEM
1229import org.cru.godtools.base.tool.analytics.model.SCREEN_CATEGORIES
1330import org.cru.godtools.base.tool.analytics.model.ToolAnalyticsScreenEvent
14- import org.cru.godtools.base.tool.fragment.BaseToolFragment
31+ import org.cru.godtools.base.tool.viewmodel.LatestPublishedManifestDataModel
32+ import org.cru.godtools.base.ui.theme.GodToolsTheme
33+ import org.cru.godtools.shared.renderer.article.RenderArticleCategory
34+ import org.cru.godtools.shared.renderer.util.ProvideRendererServices
1535import org.cru.godtools.shared.tool.parser.model.Category
16- import org.cru.godtools.tool.article.R
17- import org.cru.godtools.tool.article.databinding.ArticleCategoriesFragmentBinding
1836import org.greenrobot.eventbus.EventBus
37+ import splitties.fragmentargs.arg
1938
2039@AndroidEntryPoint
21- class CategoriesFragment :
22- BaseToolFragment <ArticleCategoriesFragmentBinding >,
23- CategorySelectedListener {
24- constructor () : super (R .layout.article_categories_fragment)
25- constructor (code: String , locale: Locale ) : super (R .layout.article_categories_fragment, code, locale)
40+ class CategoriesFragment () : Fragment() {
41+ constructor (code: String , locale: Locale ) : this () {
42+ tool = code
43+ this .locale = locale
44+ }
45+
46+ private var tool by arg<String >()
47+ private var locale by arg<Locale >()
2648
2749 @Inject
2850 internal lateinit var eventBus: EventBus
2951
52+ @Inject
53+ @Named(TOOL_RESOURCE_FILE_SYSTEM )
54+ internal lateinit var resourceFileSystem: FileSystem
55+
3056 // region Lifecycle
31- override fun onCreateBinding (inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ) =
32- ArticleCategoriesFragmentBinding .inflate(inflater, container, false ).apply { setupCategoriesView() }
57+ override fun onCreate (savedInstanceState : Bundle ? ) {
58+ super .onCreate(savedInstanceState)
59+ setupDataModel()
60+ }
61+
62+ override fun onCreateView (inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ) =
63+ ComposeView (requireContext()).apply {
64+ setViewCompositionStrategy(ViewCompositionStrategy .DisposeOnViewTreeLifecycleDestroyed )
65+ setContent {
66+ GodToolsTheme {
67+ ProvideRendererServices (resourceFileSystem) {
68+ CategoriesContent ()
69+ }
70+ }
71+ }
72+ }
3373
3474 override fun onResume () {
3575 super .onResume()
3676 eventBus.post(ToolAnalyticsScreenEvent (SCREEN_CATEGORIES , tool, locale))
3777 }
3878
39- override fun onCategorySelected (category : Category ? ) {
79+ private fun onCategorySelected (category : Category ? ) {
4080 findListener<CategorySelectedListener >()?.onCategorySelected(category)
4181 }
4282 // endregion Lifecycle
4383
44- // region Categories View
45- private fun ArticleCategoriesFragmentBinding.setupCategoriesView () {
46- categories.apply {
47- setHasFixedSize(true )
48- addItemDecoration(
49- MarginItemDecoration (bottomMargin = resources.getDimensionPixelSize(R .dimen.categories_list_gap))
50- )
51- adapter = CategoriesAdapter (viewLifecycleOwner).apply {
52- callbacks.set(this @CategoriesFragment)
53- toolDataModel.manifest.map { it?.categories }.observe(viewLifecycleOwner, this )
84+ // region Data Model
85+ private val toolDataModel: LatestPublishedManifestDataModel by viewModels()
86+
87+ private fun setupDataModel () {
88+ toolDataModel.toolCode.value = tool
89+ toolDataModel.locale.value = locale
90+ }
91+ // endregion Data Model
92+
93+ @Composable
94+ private fun CategoriesContent (modifier : Modifier = Modifier ) {
95+ val manifest by toolDataModel.manifestFlow.collectAsState(null )
96+ val categories by remember { derivedStateOf { manifest?.categories.orEmpty() } }
97+
98+ LazyColumn (
99+ verticalArrangement = Arrangement .spacedBy(1 .dp),
100+ modifier = modifier.fillMaxSize(),
101+ ) {
102+ items(categories, key = { it.id ? : it }) { category ->
103+ RenderArticleCategory (
104+ category,
105+ modifier = Modifier .clickable { onCategorySelected(category) }
106+ )
54107 }
55108 }
56109 }
57- // endregion Categories View
58110}
0 commit comments