Skip to content

Commit 155d7a5

Browse files
committed
refactor: make movies list reusable
1 parent dff9533 commit 155d7a5

File tree

6 files changed

+123
-200
lines changed

6 files changed

+123
-200
lines changed

dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/actordetail/ActorDetailScreen.kt

Lines changed: 12 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
1010
import androidx.compose.foundation.layout.height
1111
import androidx.compose.foundation.layout.padding
1212
import androidx.compose.foundation.layout.width
13-
import androidx.compose.foundation.lazy.LazyRow
14-
import androidx.compose.foundation.lazy.items
1513
import androidx.compose.foundation.rememberScrollState
1614
import androidx.compose.foundation.verticalScroll
1715
import androidx.compose.material.icons.Icons
@@ -37,7 +35,8 @@ import coil.compose.AsyncImage
3735
import com.google.firebase.dataconnect.movies.GetActorByIdQuery
3836
import com.google.firebase.example.dataconnect.R
3937
import com.google.firebase.example.dataconnect.feature.moviedetail.ErrorMessage
40-
import com.google.firebase.example.dataconnect.ui.components.MovieTile
38+
import com.google.firebase.example.dataconnect.ui.components.Movie
39+
import com.google.firebase.example.dataconnect.ui.components.MoviesList
4140

4241
@Composable
4342
fun ActorDetailScreen(
@@ -138,71 +137,24 @@ fun ActorInformation(
138137
}
139138
}
140139
Spacer(modifier = Modifier.height(8.dp))
141-
MainRoles(
142-
movies = actor.mainActors,
140+
MoviesList(
141+
listTitle = stringResource(R.string.title_main_roles),
142+
movies = actor.mainActors.mapNotNull {
143+
Movie(it.id.toString(), it.imageUrl, it.title)
144+
},
143145
onMovieClicked = { movieId ->
144146
// TODO(thatfiredev): Support navigating to movie
145147
}
146148
)
147-
SupportingRoles(
148-
movies = actor.supportingActors,
149+
MoviesList(
150+
listTitle = stringResource(R.string.title_supporting_actors),
151+
movies = actor.supportingActors.mapNotNull {
152+
Movie(it.id.toString(), it.imageUrl, it.title)
153+
},
149154
onMovieClicked = { movieId ->
150155
// TODO(thatfiredev): Support navigating to movie
151156
}
152157
)
153158
}
154159
}
155160
}
156-
157-
@Composable
158-
fun MainRoles(
159-
movies: List<GetActorByIdQuery.Data.Actor.MainActorsItem?>,
160-
onMovieClicked: (movieId: String) -> Unit
161-
) {
162-
Text(
163-
text = "Main Roles",
164-
style = MaterialTheme.typography.headlineSmall
165-
)
166-
Spacer(modifier = Modifier.height(4.dp))
167-
LazyRow {
168-
items(movies) { movie ->
169-
movie?.let {
170-
MovieTile(
171-
movieId = it.id.toString(),
172-
movieTitle = it.title,
173-
movieImageUrl = it.imageUrl,
174-
tileWidth = 120.dp,
175-
onMovieClicked = onMovieClicked,
176-
)
177-
}
178-
}
179-
}
180-
}
181-
182-
@Composable
183-
fun SupportingRoles(
184-
movies: List<GetActorByIdQuery.Data.Actor.SupportingActorsItem?>,
185-
onMovieClicked: (movieId: String) -> Unit
186-
) {
187-
Text(
188-
text = "Supporting Roles",
189-
style = MaterialTheme.typography.headlineSmall,
190-
modifier = Modifier.padding(horizontal = 8.dp)
191-
)
192-
Spacer(modifier = Modifier.height(4.dp))
193-
LazyRow(
194-
modifier = Modifier.padding(horizontal = 8.dp)
195-
) {
196-
items(movies) { movie ->
197-
movie?.let {
198-
MovieTile(
199-
movieId = it.id.toString(),
200-
movieTitle = it.title,
201-
movieImageUrl = it.imageUrl,
202-
tileWidth = 120.dp,
203-
onMovieClicked = onMovieClicked,
204-
)
205-
}
206-
}
207-
}
208-
}

dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/genredetail/GenreDetailScreen.kt

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
package com.google.firebase.example.dataconnect.feature.genredetail
22

3-
import androidx.compose.foundation.gestures.ScrollableState
4-
import androidx.compose.foundation.gestures.scrollable
53
import androidx.compose.foundation.layout.Box
64
import androidx.compose.foundation.layout.Column
75
import androidx.compose.foundation.layout.fillMaxSize
86
import androidx.compose.foundation.layout.padding
9-
import androidx.compose.foundation.lazy.LazyRow
10-
import androidx.compose.foundation.lazy.items
117
import androidx.compose.foundation.rememberScrollState
128
import androidx.compose.foundation.verticalScroll
139
import androidx.compose.material3.CircularProgressIndicator
@@ -22,7 +18,8 @@ import androidx.compose.ui.res.stringResource
2218
import androidx.compose.ui.unit.dp
2319
import androidx.lifecycle.viewmodel.compose.viewModel
2420
import com.google.firebase.example.dataconnect.R
25-
import com.google.firebase.example.dataconnect.ui.components.MovieTile
21+
import com.google.firebase.example.dataconnect.ui.components.Movie
22+
import com.google.firebase.example.dataconnect.ui.components.MoviesList
2623

2724
@Composable
2825
fun GenreDetailScreen(
@@ -63,43 +60,24 @@ fun GenreDetailScreen(
6360
text = stringResource(R.string.title_genre_detail, uiState.genreName),
6461
style = MaterialTheme.typography.headlineLarge
6562
)
66-
Text(
67-
text = stringResource(R.string.title_most_popular),
68-
style = MaterialTheme.typography.headlineMedium,
69-
modifier = Modifier.padding(vertical = 16.dp)
70-
)
71-
LazyRow {
72-
items(uiState.mostPopular) { movie ->
73-
MovieTile(
74-
movieId = movie.id.toString(),
75-
movieTitle = movie.title,
76-
movieImageUrl = movie.imageUrl,
77-
movieRating = movie.rating,
78-
onMovieClicked = {
79-
// TODO
80-
}
81-
)
63+
MoviesList(
64+
listTitle = stringResource(R.string.title_most_popular),
65+
movies = uiState.mostPopular.mapNotNull {
66+
Movie(it.id.toString(), it.imageUrl, it.title, it.rating?.toFloat())
67+
},
68+
onMovieClicked = {
69+
// TODO
8270
}
83-
}
84-
85-
Text(
86-
text = stringResource(R.string.title_most_recent),
87-
style = MaterialTheme.typography.headlineMedium,
88-
modifier = Modifier.padding(vertical = 16.dp)
8971
)
90-
LazyRow {
91-
items(uiState.mostRecent) { movie ->
92-
MovieTile(
93-
movieId = movie.id.toString(),
94-
movieTitle = movie.title,
95-
movieImageUrl = movie.imageUrl,
96-
movieRating = movie.rating,
97-
onMovieClicked = {
98-
// TODO(thatfiredev)
99-
}
100-
)
72+
MoviesList(
73+
listTitle = stringResource(R.string.title_most_recent),
74+
movies = uiState.mostRecent.mapNotNull {
75+
Movie(it.id.toString(), it.imageUrl, it.title, it.rating?.toFloat())
76+
},
77+
onMovieClicked = {
78+
// TODO
10179
}
102-
}
80+
)
10381
}
10482
}
10583
}

dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/movies/MoviesScreen.kt

Lines changed: 18 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,26 @@
11
package com.google.firebase.example.dataconnect.feature.movies
22

3-
import androidx.compose.foundation.clickable
43
import androidx.compose.foundation.layout.Box
54
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.Spacer
66
import androidx.compose.foundation.layout.fillMaxSize
7-
import androidx.compose.foundation.layout.fillMaxWidth
7+
import androidx.compose.foundation.layout.height
88
import androidx.compose.foundation.layout.padding
9-
import androidx.compose.foundation.lazy.LazyRow
10-
import androidx.compose.foundation.lazy.items
119
import androidx.compose.foundation.rememberScrollState
1210
import androidx.compose.foundation.verticalScroll
13-
import androidx.compose.material3.Card
1411
import androidx.compose.material3.CircularProgressIndicator
15-
import androidx.compose.material3.MaterialTheme
1612
import androidx.compose.material3.Text
1713
import androidx.compose.runtime.Composable
1814
import androidx.compose.runtime.collectAsState
1915
import androidx.compose.runtime.getValue
2016
import androidx.compose.ui.Alignment
2117
import androidx.compose.ui.Modifier
22-
import androidx.compose.ui.layout.ContentScale
2318
import androidx.compose.ui.res.stringResource
2419
import androidx.compose.ui.unit.dp
2520
import androidx.lifecycle.viewmodel.compose.viewModel
26-
import coil.compose.AsyncImage
2721
import com.google.firebase.example.dataconnect.R
28-
import com.google.firebase.example.dataconnect.ui.components.MovieTile
22+
import com.google.firebase.example.dataconnect.ui.components.Movie
23+
import com.google.firebase.example.dataconnect.ui.components.MoviesList
2924

3025
@Composable
3126
fun MoviesScreen(
@@ -56,46 +51,24 @@ fun MoviesScreen(
5651
is MoviesUIState.Success -> {
5752
val scrollState = rememberScrollState()
5853
Column(
59-
modifier = Modifier.padding(16.dp)
54+
modifier = Modifier
6055
.verticalScroll(scrollState)
6156
) {
62-
Text(
63-
text = stringResource(R.string.title_top_10_movies),
64-
style = MaterialTheme.typography.headlineMedium,
65-
modifier = Modifier.padding(bottom = 16.dp)
57+
MoviesList(
58+
listTitle = stringResource(R.string.title_top_10_movies),
59+
movies = uiState.top10movies.mapNotNull {
60+
Movie(it.id.toString(), it.imageUrl, it.title, it.rating?.toFloat())
61+
},
62+
onMovieClicked = onMovieClicked
6663
)
67-
LazyRow {
68-
items(uiState.top10movies) { movie ->
69-
MovieTile(
70-
movieId = movie.id.toString(),
71-
movieTitle = movie.title,
72-
movieImageUrl = movie.imageUrl,
73-
movieRating = movie.rating,
74-
onMovieClicked = {
75-
onMovieClicked(movie.id.toString())
76-
}
77-
)
78-
}
79-
}
80-
81-
Text(
82-
text = stringResource(R.string.title_latest_movies),
83-
style = MaterialTheme.typography.headlineMedium,
84-
modifier = Modifier.padding(vertical = 16.dp)
64+
Spacer(modifier = Modifier.height(16.dp))
65+
MoviesList(
66+
listTitle = stringResource(R.string.title_latest_movies),
67+
movies = uiState.latestMovies.mapNotNull {
68+
Movie(it.id.toString(), it.imageUrl, it.title, it.rating?.toFloat())
69+
},
70+
onMovieClicked = onMovieClicked
8571
)
86-
LazyRow {
87-
items(uiState.latestMovies) { movie ->
88-
MovieTile(
89-
movieId = movie.id.toString(),
90-
movieTitle = movie.title,
91-
movieImageUrl = movie.imageUrl,
92-
movieRating = movie.rating,
93-
onMovieClicked = {
94-
onMovieClicked(movie.id.toString())
95-
}
96-
)
97-
}
98-
}
9972
}
10073
}
10174
}

dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/profile/ProfileScreen.kt

Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import androidx.compose.foundation.layout.Spacer
66
import androidx.compose.foundation.layout.fillMaxSize
77
import androidx.compose.foundation.layout.height
88
import androidx.compose.foundation.layout.padding
9-
import androidx.compose.foundation.lazy.LazyRow
10-
import androidx.compose.foundation.lazy.items
119
import androidx.compose.foundation.rememberScrollState
1210
import androidx.compose.foundation.verticalScroll
1311
import androidx.compose.material3.CircularProgressIndicator
@@ -26,7 +24,8 @@ import com.google.firebase.dataconnect.movies.GetUserByIdQuery
2624
import com.google.firebase.example.dataconnect.R
2725
import com.google.firebase.example.dataconnect.ui.components.Actor
2826
import com.google.firebase.example.dataconnect.ui.components.ActorsList
29-
import com.google.firebase.example.dataconnect.ui.components.MovieTile
27+
import com.google.firebase.example.dataconnect.ui.components.Movie
28+
import com.google.firebase.example.dataconnect.ui.components.MoviesList
3029
import com.google.firebase.example.dataconnect.ui.components.ReviewCard
3130

3231
@Composable
@@ -105,10 +104,26 @@ fun ProfileScreen(
105104
}
106105
Spacer(modifier = Modifier.height(16.dp))
107106

108-
ProfileSection(title = "Watched Movies", content = { WatchedMoviesList(watchedMovies) })
107+
MoviesList(
108+
listTitle = stringResource(R.string.title_watched_movies),
109+
movies = watchedMovies.mapNotNull {
110+
Movie(it.movie.id.toString(), it.movie.imageUrl, it.movie.title, it.movie.rating?.toFloat())
111+
},
112+
onMovieClicked = {
113+
// TODO
114+
}
115+
)
109116
Spacer(modifier = Modifier.height(16.dp))
110117

111-
ProfileSection(title = "Favorite Movies", content = { FavoriteMoviesList(favoriteMovies) })
118+
MoviesList(
119+
listTitle = stringResource(R.string.title_favorite_movies),
120+
movies = favoriteMovies.mapNotNull {
121+
Movie(it.movie.id.toString(), it.movie.imageUrl, it.movie.title, it.movie.rating?.toFloat())
122+
},
123+
onMovieClicked = {
124+
// TODO
125+
}
126+
)
112127
Spacer(modifier = Modifier.height(16.dp))
113128

114129
ActorsList(
@@ -120,6 +135,7 @@ fun ProfileScreen(
120135
// TODO
121136
}
122137
)
138+
Spacer(modifier = Modifier.height(16.dp))
123139

124140
ProfileSection(title = "Reviews", content = { ReviewsList(name, reviews) })
125141
Spacer(modifier = Modifier.height(16.dp))
@@ -156,39 +172,3 @@ fun ReviewsList(
156172
}
157173
}
158174
}
159-
160-
@Composable
161-
fun WatchedMoviesList(watchedItems: List<GetUserByIdQuery.Data.User.WatchedItem>) {
162-
LazyRow {
163-
items(watchedItems) { watchedItem ->
164-
MovieTile(
165-
movieId = watchedItem.movie.id.toString(),
166-
movieImageUrl = watchedItem.movie.imageUrl,
167-
movieTitle = watchedItem.movie.title,
168-
movieRating = watchedItem.movie.rating,
169-
tileWidth = 120.dp,
170-
onMovieClicked = {
171-
// TODO
172-
}
173-
)
174-
}
175-
}
176-
}
177-
178-
@Composable
179-
fun FavoriteMoviesList(favoriteItems: List<GetUserByIdQuery.Data.User.FavoriteMoviesItem>) {
180-
LazyRow {
181-
items(favoriteItems) { favoriteItem ->
182-
MovieTile(
183-
movieId = favoriteItem.movie.id.toString(),
184-
movieImageUrl = favoriteItem.movie.imageUrl,
185-
movieTitle = favoriteItem.movie.title,
186-
movieRating = favoriteItem.movie.rating,
187-
tileWidth = 120.dp,
188-
onMovieClicked = {
189-
// TODO
190-
}
191-
)
192-
}
193-
}
194-
}

0 commit comments

Comments
 (0)