Skip to content
This repository was archived by the owner on Aug 2, 2024. It is now read-only.

Commit bea8e85

Browse files
authored
Migrate HomeViewPagerFragment contents to Compose (#823)
* Migrate PlantListFragment content to Compose. Change-Id: Ic6789a43249d93eba333cfbaba9eea0f1f042009 * Update tests. Change-Id: I623bcbb75fd8d6e10bc882c961fafbc5636516e3 * Migrate HomeViewPagerFragment to Compose. Change-Id: I52ad72604742bb89255980c27b5a5808e1fb43f0 * Use HorizontalPager in Compose 1.4.0 Change-Id: Ia552340497a889d9bc03a88c99ebf13d98455010 * Update migration journey. Change-Id: I6fb161f6e8efb58dd8f1e435111ea30e2116f239 * Remove Git conflit text. Change-Id: Idae05b580b6bc0b7406e26d15ee3f948a2b8ebb2 * PR Feedback. Change-Id: I664126ec40cf94b0b42d4567227999ad3c8fb50e * PR feedback. Change-Id: I3a32073ff4d6c6214caaa5939803af95f251c501
1 parent 1ee99d5 commit bea8e85

File tree

17 files changed

+358
-463
lines changed

17 files changed

+358
-463
lines changed

app/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ dependencies {
122122
implementation(libs.androidx.paging.compose)
123123
implementation(libs.androidx.paging.runtime.ktx)
124124
implementation(libs.androidx.room.ktx)
125-
implementation(libs.androidx.viewpager2)
126125
implementation(libs.androidx.work.runtime.ktx)
127126
implementation(libs.material)
128127
implementation(libs.gson)

app/src/main/java/com/google/samples/apps/sunflower/GardenFragment.kt

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

app/src/main/java/com/google/samples/apps/sunflower/HomeViewPagerFragment.kt

Lines changed: 60 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,56 +17,84 @@
1717
package com.google.samples.apps.sunflower
1818

1919
import android.os.Bundle
20+
import android.util.Log
2021
import android.view.LayoutInflater
22+
import android.view.Menu
23+
import android.view.MenuInflater
24+
import android.view.MenuItem
2125
import android.view.View
2226
import android.view.ViewGroup
2327
import androidx.appcompat.app.AppCompatActivity
28+
import androidx.compose.ui.platform.ViewCompositionStrategy
29+
import androidx.core.view.MenuHost
30+
import androidx.core.view.MenuProvider
2431
import androidx.fragment.app.Fragment
25-
import com.google.android.material.tabs.TabLayoutMediator
26-
import com.google.samples.apps.sunflower.adapters.MY_GARDEN_PAGE_INDEX
27-
import com.google.samples.apps.sunflower.adapters.PLANT_LIST_PAGE_INDEX
28-
import com.google.samples.apps.sunflower.adapters.SunflowerPagerAdapter
32+
import androidx.fragment.app.viewModels
33+
import androidx.navigation.fragment.findNavController
34+
import com.google.accompanist.themeadapter.material.MdcTheme
35+
import com.google.samples.apps.sunflower.compose.home.HomeScreen
36+
import com.google.samples.apps.sunflower.compose.home.SunflowerPage
37+
import com.google.samples.apps.sunflower.data.Plant
2938
import com.google.samples.apps.sunflower.databinding.FragmentViewPagerBinding
39+
import com.google.samples.apps.sunflower.viewmodels.PlantListViewModel
3040
import dagger.hilt.android.AndroidEntryPoint
3141

3242
@AndroidEntryPoint
3343
class HomeViewPagerFragment : Fragment() {
3444

45+
private val viewModel: PlantListViewModel by viewModels()
46+
47+
private val menuProvider = object : MenuProvider {
48+
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
49+
menuInflater.inflate(R.menu.menu_plant_list, menu)
50+
}
51+
52+
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
53+
return when (menuItem.itemId) {
54+
R.id.filter_zone -> {
55+
viewModel.updateData()
56+
true
57+
}
58+
else -> false
59+
}
60+
}
61+
}
62+
3563
override fun onCreateView(
3664
inflater: LayoutInflater,
3765
container: ViewGroup?,
3866
savedInstanceState: Bundle?
3967
): View {
4068
val binding = FragmentViewPagerBinding.inflate(inflater, container, false)
41-
val tabLayout = binding.tabs
42-
val viewPager = binding.viewPager
43-
44-
viewPager.adapter = SunflowerPagerAdapter(this)
45-
46-
// Set the icon and text for each tab
47-
TabLayoutMediator(tabLayout, viewPager) { tab, position ->
48-
tab.setIcon(getTabIcon(position))
49-
tab.text = getTabTitle(position)
50-
}.attach()
51-
52-
(activity as AppCompatActivity).setSupportActionBar(binding.toolbar)
53-
54-
return binding.root
55-
}
56-
57-
private fun getTabIcon(position: Int): Int {
58-
return when (position) {
59-
MY_GARDEN_PAGE_INDEX -> R.drawable.garden_tab_selector
60-
PLANT_LIST_PAGE_INDEX -> R.drawable.plant_list_tab_selector
61-
else -> throw IndexOutOfBoundsException()
69+
val menuHost: MenuHost = requireActivity()
70+
(requireActivity() as AppCompatActivity).setSupportActionBar(binding.toolbar)
71+
binding.composeView.apply {
72+
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
73+
setContent {
74+
MdcTheme {
75+
HomeScreen(
76+
onPlantClick = {
77+
navigateToPlant(it)
78+
}, onPageChange = { page ->
79+
Log.d("HomeViewPagerFragment", "Page changed to $page")
80+
when (page) {
81+
SunflowerPage.MY_GARDEN -> menuHost.removeMenuProvider(menuProvider)
82+
SunflowerPage.PLANT_LIST -> menuHost.addMenuProvider(
83+
menuProvider,
84+
viewLifecycleOwner
85+
)
86+
}
87+
}
88+
)
89+
}
90+
}
6291
}
92+
return binding.root
6393
}
6494

65-
private fun getTabTitle(position: Int): String? {
66-
return when (position) {
67-
MY_GARDEN_PAGE_INDEX -> getString(R.string.my_garden_title)
68-
PLANT_LIST_PAGE_INDEX -> getString(R.string.plant_list_title)
69-
else -> null
70-
}
95+
private fun navigateToPlant(plant: Plant) {
96+
val direction =
97+
HomeViewPagerFragmentDirections.actionViewPagerFragmentToPlantDetailFragment(plant.plantId)
98+
findNavController().navigate(direction)
7199
}
72-
}
100+
}

app/src/main/java/com/google/samples/apps/sunflower/PlantListFragment.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import androidx.fragment.app.viewModels
3030
import androidx.navigation.fragment.findNavController
3131
import com.google.accompanist.themeadapter.material.MdcTheme
3232
import com.google.samples.apps.sunflower.compose.plantlist.PlantListScreen
33-
import com.google.samples.apps.sunflower.data.Plant
3433
import com.google.samples.apps.sunflower.viewmodels.PlantListViewModel
3534
import dagger.hilt.android.AndroidEntryPoint
3635

@@ -50,9 +49,11 @@ class PlantListFragment : Fragment() {
5049
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
5150
setContent {
5251
MdcTheme {
53-
PlantListScreen {
54-
navigateToPlant(it)
55-
}
52+
PlantListScreen(
53+
onPlantClick = {
54+
navigateToPlant(plantId = it.plantId)
55+
}
56+
)
5657
}
5758
}
5859
}
@@ -72,10 +73,10 @@ class PlantListFragment : Fragment() {
7273
}
7374
}
7475

75-
private fun navigateToPlant(plant: Plant) {
76+
private fun navigateToPlant(plantId: String) {
7677
val direction =
7778
HomeViewPagerFragmentDirections.actionViewPagerFragmentToPlantDetailFragment(
78-
plant.plantId
79+
plantId
7980
)
8081
findNavController().navigate(direction)
8182
}

app/src/main/java/com/google/samples/apps/sunflower/adapters/SunflowerPagerAdapter.kt

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

app/src/main/java/com/google/samples/apps/sunflower/compose/gallery/GalleryScreen.kt

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,7 @@ private fun GalleryScreen(
6969
) {
7070
Scaffold(
7171
topBar = {
72-
TopAppBar(
73-
title = {
74-
Text(stringResource(id = R.string.gallery_title))
75-
},
76-
Modifier.statusBarsPadding(),
77-
navigationIcon = {
78-
IconButton(onClick = { onUpClick() }) {
79-
Icon(
80-
Icons.Filled.ArrowBack,
81-
contentDescription = null
82-
)
83-
}
84-
},
85-
)
72+
GalleryTopBar(onUpClick = onUpClick)
8673
},
8774
) { padding ->
8875
val pagingItems: LazyPagingItems<UnsplashPhoto> = plantPictures.collectAsLazyPagingItems()
@@ -109,6 +96,27 @@ private fun GalleryScreen(
10996
}
11097
}
11198

99+
@Composable
100+
private fun GalleryTopBar(
101+
onUpClick: () -> Unit,
102+
modifier: Modifier = Modifier,
103+
) {
104+
TopAppBar(
105+
title = {
106+
Text(stringResource(id = R.string.gallery_title))
107+
},
108+
modifier = modifier.statusBarsPadding(),
109+
navigationIcon = {
110+
IconButton(onClick = onUpClick) {
111+
Icon(
112+
Icons.Filled.ArrowBack,
113+
contentDescription = null
114+
)
115+
}
116+
},
117+
)
118+
}
119+
112120
@Preview
113121
@Composable
114122
private fun GalleryScreenPreview(

app/src/main/java/com/google/samples/apps/sunflower/compose/garden/GardenScreen.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,15 @@ import java.util.*
6464

6565
@Composable
6666
fun GardenScreen(
67+
modifier: Modifier = Modifier,
6768
viewModel: GardenPlantingListViewModel = viewModel(),
6869
onAddPlantClick: () -> Unit,
6970
onPlantClick: (PlantAndGardenPlantings) -> Unit
7071
) {
7172
val gardenPlants by viewModel.plantAndGardenPlantings.collectAsState(initial = emptyList())
7273
GardenScreen(
7374
gardenPlants = gardenPlants,
75+
modifier = modifier,
7476
onAddPlantClick = onAddPlantClick,
7577
onPlantClick = onPlantClick
7678
)
@@ -79,26 +81,29 @@ fun GardenScreen(
7981
@Composable
8082
fun GardenScreen(
8183
gardenPlants: List<PlantAndGardenPlantings>,
84+
modifier: Modifier = Modifier,
8285
onAddPlantClick: () -> Unit = {},
8386
onPlantClick: (PlantAndGardenPlantings) -> Unit = {}
8487
) {
8588
if (gardenPlants.isEmpty()) {
86-
EmptyGarden(onAddPlantClick)
89+
EmptyGarden(onAddPlantClick, modifier)
8790
} else {
88-
GardenList(gardenPlants, onPlantClick = onPlantClick)
91+
GardenList(gardenPlants = gardenPlants, onPlantClick = onPlantClick, modifier = modifier)
8992
}
9093
}
9194

9295
@Composable
9396
private fun GardenList(
9497
gardenPlants: List<PlantAndGardenPlantings>,
95-
onPlantClick: (PlantAndGardenPlantings) -> Unit
98+
onPlantClick: (PlantAndGardenPlantings) -> Unit,
99+
modifier: Modifier = Modifier,
96100
) {
97101
// Call reportFullyDrawn when the garden list has been rendered
98102
val gridState = rememberLazyGridState()
99103
ReportDrawnWhen { gridState.layoutInfo.totalItemsCount > 0 }
100104
LazyVerticalGrid(
101105
columns = GridCells.Fixed(2),
106+
modifier,
102107
state = gridState,
103108
contentPadding = PaddingValues(
104109
horizontal = dimensionResource(id = R.dimen.card_side_margin),
@@ -203,11 +208,12 @@ private fun GardenListItem(
203208
}
204209

205210
@Composable
206-
private fun EmptyGarden(onAddPlantClick: () -> Unit) {
211+
private fun EmptyGarden(onAddPlantClick: () -> Unit, modifier: Modifier = Modifier) {
207212
// Calls reportFullyDrawn when this composable is composed.
208213
ReportDrawn()
209214

210215
Column(
216+
modifier,
211217
horizontalAlignment = Alignment.CenterHorizontally,
212218
verticalArrangement = Arrangement.Center
213219
) {

0 commit comments

Comments
 (0)