@@ -3,56 +3,106 @@ 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.getValue
14+ import androidx.compose.ui.Modifier
15+ import androidx.compose.ui.platform.ComposeView
16+ import androidx.compose.ui.platform.ViewCompositionStrategy
17+ import androidx.compose.ui.unit.dp
18+ import androidx.fragment.app.Fragment
19+ import androidx.fragment.app.viewModels
720import dagger.hilt.android.AndroidEntryPoint
821import java.util.Locale
922import javax.inject.Inject
23+ import javax.inject.Named
24+ import okio.FileSystem
1025import org.ccci.gto.android.common.androidx.fragment.app.findListener
11- import org.ccci.gto.android.common.androidx.recyclerview.decorator.MarginItemDecoration
26+ import org.cru.godtools.base.tool.BaseToolRendererModule.Companion.TOOL_RESOURCE_FILE_SYSTEM
1227import org.cru.godtools.base.tool.analytics.model.SCREEN_CATEGORIES
1328import org.cru.godtools.base.tool.analytics.model.ToolAnalyticsScreenEvent
14- import org.cru.godtools.base.tool.fragment.BaseToolFragment
29+ import org.cru.godtools.base.tool.viewmodel.LatestPublishedManifestDataModel
30+ import org.cru.godtools.base.ui.theme.GodToolsTheme
31+ import org.cru.godtools.shared.renderer.article.RenderArticleCategory
32+ import org.cru.godtools.shared.renderer.util.ProvideRendererServices
1533import 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
1834import org.greenrobot.eventbus.EventBus
35+ import splitties.fragmentargs.arg
1936
2037@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)
38+ class CategoriesFragment () : Fragment() {
39+ constructor (code: String , locale: Locale ) : this () {
40+ tool = code
41+ this .locale = locale
42+ }
43+
44+ private var tool by arg<String >()
45+ private var locale by arg<Locale >()
2646
2747 @Inject
2848 internal lateinit var eventBus: EventBus
2949
50+ @Inject
51+ @Named(TOOL_RESOURCE_FILE_SYSTEM )
52+ internal lateinit var resourceFileSystem: FileSystem
53+
3054 // region Lifecycle
31- override fun onCreateBinding (inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ) =
32- ArticleCategoriesFragmentBinding .inflate(inflater, container, false ).apply { setupCategoriesView() }
55+ override fun onCreate (savedInstanceState : Bundle ? ) {
56+ super .onCreate(savedInstanceState)
57+ setupDataModel()
58+ }
59+
60+ override fun onCreateView (inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ) =
61+ ComposeView (requireContext()).apply {
62+ setViewCompositionStrategy(ViewCompositionStrategy .DisposeOnViewTreeLifecycleDestroyed )
63+ setContent {
64+ GodToolsTheme {
65+ ProvideRendererServices (resourceFileSystem) {
66+ CategoriesContent ()
67+ }
68+ }
69+ }
70+ }
3371
3472 override fun onResume () {
3573 super .onResume()
3674 eventBus.post(ToolAnalyticsScreenEvent (SCREEN_CATEGORIES , tool, locale))
3775 }
3876
39- override fun onCategorySelected (category : Category ? ) {
77+ private fun onCategorySelected (category : Category ? ) {
4078 findListener<CategorySelectedListener >()?.onCategorySelected(category)
4179 }
4280 // endregion Lifecycle
4381
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 )
82+ // region Data Model
83+ private val toolDataModel: LatestPublishedManifestDataModel by viewModels()
84+
85+ private fun setupDataModel () {
86+ toolDataModel.toolCode.value = tool
87+ toolDataModel.locale.value = locale
88+ }
89+ // endregion Data Model
90+
91+ @Composable
92+ private fun CategoriesContent (modifier : Modifier = Modifier ) {
93+ val manifest by toolDataModel.manifestFlow.collectAsState(null )
94+ val categories = manifest?.categories.orEmpty()
95+
96+ LazyColumn (
97+ verticalArrangement = Arrangement .spacedBy(1 .dp),
98+ modifier = modifier.fillMaxSize(),
99+ ) {
100+ items(categories, key = { it.id.orEmpty() }) { category ->
101+ RenderArticleCategory (
102+ category,
103+ modifier = Modifier .clickable { onCategorySelected(category) }
104+ )
54105 }
55106 }
56107 }
57- // endregion Categories View
58108}
0 commit comments