Skip to content

Commit db05720

Browse files
frettclaude
andcommitted
Migrate CategoriesFragment from DataBinding/RecyclerView to Compose
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent e91de5a commit db05720

5 files changed

Lines changed: 75 additions & 129 deletions

File tree

ui/article-renderer/build.gradle.kts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ android {
1313

1414
buildFeatures {
1515
dataBinding = true
16-
viewBinding = true
1716
}
1817
}
1918

@@ -25,20 +24,16 @@ dependencies {
2524
implementation(libs.androidx.compose.material3)
2625
implementation(libs.androidx.fragment.ktx)
2726
implementation(libs.androidx.lifecycle.livedata.ktx)
28-
implementation(libs.androidx.constraintlayout)
29-
implementation(libs.androidx.recyclerview)
3027

3128
implementation(libs.gtoSupport.androidx.fragment)
3229
implementation(libs.gtoSupport.androidx.lifecycle)
33-
implementation(libs.gtoSupport.androidx.recyclerview)
3430
implementation(libs.gtoSupport.core)
3531
implementation(libs.gtoSupport.kotlin.coroutines)
36-
implementation(libs.gtoSupport.picasso)
3732
implementation(libs.gtoSupport.sync)
38-
implementation(libs.gtoSupport.util)
3933

4034
implementation(libs.colormath.jetpack.compose)
4135
implementation(libs.dagger)
36+
implementation(libs.godtoolsShared.renderer)
4237
implementation(libs.hilt)
4338
implementation(libs.splitties.fragmentargs)
4439

ui/article-renderer/src/main/kotlin/org/cru/godtools/article/ui/categories/CategoriesAdapter.kt

Lines changed: 0 additions & 50 deletions
This file was deleted.

ui/article-renderer/src/main/kotlin/org/cru/godtools/article/ui/categories/CategoriesFragment.kt

Lines changed: 74 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,56 +3,106 @@ package org.cru.godtools.article.ui.categories
33
import android.os.Bundle
44
import android.view.LayoutInflater
55
import 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
720
import dagger.hilt.android.AndroidEntryPoint
821
import java.util.Locale
922
import javax.inject.Inject
23+
import javax.inject.Named
24+
import okio.FileSystem
1025
import 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
1227
import org.cru.godtools.base.tool.analytics.model.SCREEN_CATEGORIES
1328
import 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
1533
import 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
1834
import 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
}

ui/article-renderer/src/main/res/layout/article_categories_fragment.xml

Lines changed: 0 additions & 7 deletions
This file was deleted.

ui/article-renderer/src/main/res/layout/list_item_category.xml

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
 (0)