Skip to content

Commit dff9533

Browse files
committed
refactor: make actor list reusable
1 parent 14034c6 commit dff9533

File tree

6 files changed

+94
-90
lines changed

6 files changed

+94
-90
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import coil.compose.AsyncImage
3737
import com.google.firebase.dataconnect.movies.GetActorByIdQuery
3838
import com.google.firebase.example.dataconnect.R
3939
import com.google.firebase.example.dataconnect.feature.moviedetail.ErrorMessage
40-
import com.google.firebase.example.dataconnect.ui.components.ActorTile
4140
import com.google.firebase.example.dataconnect.ui.components.MovieTile
4241

4342
@Composable

dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/moviedetail/MovieDetailScreen.kt

Lines changed: 18 additions & 55 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
@@ -47,7 +45,8 @@ import androidx.lifecycle.viewmodel.compose.viewModel
4745
import coil.compose.AsyncImage
4846
import com.google.firebase.dataconnect.movies.GetMovieByIdQuery
4947
import com.google.firebase.example.dataconnect.R
50-
import com.google.firebase.example.dataconnect.ui.components.ActorTile
48+
import com.google.firebase.example.dataconnect.ui.components.Actor
49+
import com.google.firebase.example.dataconnect.ui.components.ActorsList
5150
import com.google.firebase.example.dataconnect.ui.components.ReviewCard
5251

5352
@Composable
@@ -92,13 +91,21 @@ fun MovieDetailScreen(
9291
movieDetailViewModel.toggleWatched(newValue)
9392
}
9493
)
95-
MainActorsList(
96-
movie?.mainActors ?: emptyList(),
97-
onActorClicked
94+
// Main Actors list
95+
ActorsList(
96+
listTitle = stringResource(R.string.title_main_actors),
97+
actors = movie?.mainActors?.mapNotNull {
98+
Actor(it.id.toString(), it.name, it.imageUrl)
99+
}.orEmpty(),
100+
onActorClicked = { onActorClicked(it) }
98101
)
99-
SupportingActorsList(
100-
movie?.supportingActors ?: emptyList(),
101-
onActorClicked
102+
// Supporting Actors list
103+
ActorsList(
104+
listTitle = stringResource(R.string.title_supporting_actors),
105+
actors = movie?.supportingActors?.mapNotNull {
106+
Actor(it.id.toString(), it.name, it.imageUrl)
107+
}.orEmpty(),
108+
onActorClicked = { onActorClicked(it) }
102109
)
103110
UserReviews(
104111
onReviewSubmitted = { rating, text ->
@@ -218,50 +225,6 @@ fun MovieInformation(
218225
}
219226
}
220227

221-
@Composable
222-
fun MainActorsList(
223-
actors: List<GetMovieByIdQuery.Data.Movie.MainActorsItem?>,
224-
onActorClicked: (actorId: String) -> Unit
225-
) {
226-
Text(
227-
text = "Main Actors",
228-
style = MaterialTheme.typography.headlineMedium,
229-
modifier = Modifier.padding(horizontal = 16.dp)
230-
)
231-
Spacer(modifier = Modifier.height(8.dp))
232-
LazyRow(
233-
modifier = Modifier.padding(horizontal = 16.dp)
234-
) {
235-
items(actors) { actor ->
236-
actor?.let {
237-
ActorTile(it.id.toString(), it.name, it.imageUrl, onActorClicked)
238-
}
239-
}
240-
}
241-
}
242-
243-
@Composable
244-
fun SupportingActorsList(
245-
actors: List<GetMovieByIdQuery.Data.Movie.SupportingActorsItem?>,
246-
onActorClicked: (actorId: String) -> Unit,
247-
) {
248-
Text(
249-
text = "Supporting Actors",
250-
style = MaterialTheme.typography.headlineMedium,
251-
modifier = Modifier.padding(horizontal = 16.dp)
252-
)
253-
Spacer(modifier = Modifier.height(8.dp))
254-
LazyRow(
255-
modifier = Modifier.padding(horizontal = 16.dp)
256-
) {
257-
items(actors) { actor ->
258-
actor?.let {
259-
ActorTile(it.id.toString(), it.name, it.imageUrl, onActorClicked)
260-
}
261-
}
262-
}
263-
}
264-
265228
@Composable
266229
fun UserReviews(
267230
onReviewSubmitted: (rating: Float, text: String) -> Unit,
@@ -292,7 +255,7 @@ fun UserReviews(
292255
TextField(
293256
value = reviewText,
294257
onValueChange = { reviewText = it },
295-
label = { Text("Write your review") },
258+
label = { Text(stringResource(R.string.hint_write_review)) },
296259
modifier = Modifier.fillMaxWidth()
297260
)
298261

@@ -304,7 +267,7 @@ fun UserReviews(
304267
reviewText = ""
305268
}
306269
) {
307-
Text("Submit Review")
270+
Text(stringResource(R.string.button_submit_review))
308271
}
309272
}
310273
Column {

dataconnect/app/src/main/java/com/google/firebase/example/dataconnect/feature/moviedetail/Navigation.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ fun NavGraphBuilder.movieDetailScreen(
2323
movieId?.let { id ->
2424
MovieDetailScreen(id, onActorClicked)
2525
}
26-
2726
}
2827
}
2928
}

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

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@ import androidx.compose.runtime.collectAsState
1919
import androidx.compose.runtime.getValue
2020
import androidx.compose.ui.Alignment
2121
import androidx.compose.ui.Modifier
22+
import androidx.compose.ui.res.stringResource
2223
import androidx.compose.ui.unit.dp
2324
import androidx.lifecycle.viewmodel.compose.viewModel
2425
import com.google.firebase.dataconnect.movies.GetUserByIdQuery
25-
import com.google.firebase.example.dataconnect.ui.components.ActorTile
26+
import com.google.firebase.example.dataconnect.R
27+
import com.google.firebase.example.dataconnect.ui.components.Actor
28+
import com.google.firebase.example.dataconnect.ui.components.ActorsList
2629
import com.google.firebase.example.dataconnect.ui.components.MovieTile
2730
import com.google.firebase.example.dataconnect.ui.components.ReviewCard
2831

@@ -108,7 +111,15 @@ fun ProfileScreen(
108111
ProfileSection(title = "Favorite Movies", content = { FavoriteMoviesList(favoriteMovies) })
109112
Spacer(modifier = Modifier.height(16.dp))
110113

111-
ProfileSection(title = "Favorite Actors", content = { FavoriteActorsList(favoriteActors) })
114+
ActorsList(
115+
listTitle = stringResource(R.string.title_favorite_actors),
116+
actors = favoriteActors.mapNotNull {
117+
Actor(it.actor.id.toString(), it.actor.name, it.actor.imageUrl)
118+
},
119+
onActorClicked = {
120+
// TODO
121+
}
122+
)
112123

113124
ProfileSection(title = "Reviews", content = { ReviewsList(name, reviews) })
114125
Spacer(modifier = Modifier.height(16.dp))
@@ -181,21 +192,3 @@ fun FavoriteMoviesList(favoriteItems: List<GetUserByIdQuery.Data.User.FavoriteMo
181192
}
182193
}
183194
}
184-
185-
@Composable
186-
fun FavoriteActorsList(actors: List<GetUserByIdQuery.Data.User.FavoriteActorsItem>) {
187-
LazyRow {
188-
items(actors) { favoriteActor ->
189-
ActorTile(
190-
actorId = favoriteActor.actor.id.toString(),
191-
actorName = favoriteActor.actor.name,
192-
actorImageUrl = favoriteActor.actor.imageUrl,
193-
onActorClicked = {
194-
// TODO
195-
}
196-
)
197-
}
198-
}
199-
}
200-
201-
Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
package com.google.firebase.example.dataconnect.ui.components
22

3-
import androidx.compose.foundation.Image
43
import androidx.compose.foundation.clickable
54
import androidx.compose.foundation.layout.Column
65
import androidx.compose.foundation.layout.Spacer
7-
import androidx.compose.foundation.layout.aspectRatio
8-
import androidx.compose.foundation.layout.fillMaxSize
9-
import androidx.compose.foundation.layout.fillMaxWidth
6+
import androidx.compose.foundation.layout.height
107
import androidx.compose.foundation.layout.padding
118
import androidx.compose.foundation.layout.size
129
import androidx.compose.foundation.layout.sizeIn
13-
import androidx.compose.foundation.layout.width
10+
import androidx.compose.foundation.lazy.LazyRow
11+
import androidx.compose.foundation.lazy.items
1412
import androidx.compose.foundation.shape.CircleShape
1513
import androidx.compose.material3.MaterialTheme
1614
import androidx.compose.material3.Text
@@ -20,18 +18,52 @@ import androidx.compose.ui.Modifier
2018
import androidx.compose.ui.draw.clip
2119
import androidx.compose.ui.layout.ContentScale
2220
import androidx.compose.ui.text.style.TextOverflow
23-
import androidx.compose.ui.tooling.preview.Preview
2421
import androidx.compose.ui.unit.dp
2522
import coil.compose.AsyncImage
26-
import coil.compose.rememberAsyncImagePainter
2723

2824
val ACTOR_CARD_SIZE = 80.dp
2925

26+
/**
27+
* Used to represent an actor in a list UI
28+
*/
29+
data class Actor(
30+
val id: String,
31+
val name: String,
32+
val imageUrl: String
33+
)
34+
35+
/**
36+
* Displays a scrollable horizontal list of actors.
37+
*/
38+
@Composable
39+
fun ActorsList(
40+
modifier: Modifier = Modifier,
41+
listTitle: String,
42+
actors: List<Actor>? = emptyList(),
43+
onActorClicked: (actorId: String) -> Unit
44+
) {
45+
Column(
46+
modifier = modifier.padding(horizontal = 16.dp)
47+
) {
48+
Text(
49+
text = listTitle,
50+
style = MaterialTheme.typography.headlineMedium
51+
)
52+
Spacer(modifier = Modifier.height(8.dp))
53+
LazyRow {
54+
items(actors.orEmpty()) { actor ->
55+
ActorTile(actor, onActorClicked)
56+
}
57+
}
58+
}
59+
}
60+
61+
/**
62+
* Used to display each actor item in the list.
63+
*/
3064
@Composable
3165
fun ActorTile(
32-
actorId: String,
33-
actorName: String,
34-
actorImageUrl: String,
66+
actor: Actor,
3567
onActorClicked: (actorId: String) -> Unit
3668
) {
3769
Column(
@@ -43,19 +75,19 @@ fun ActorTile(
4375
)
4476
.padding(4.dp)
4577
.clickable {
46-
onActorClicked(actorId)
78+
onActorClicked(actor.id)
4779
}
4880
) {
4981
AsyncImage(
50-
model = actorImageUrl,
82+
model = actor.imageUrl,
5183
contentDescription = null,
5284
contentScale = ContentScale.Crop,
5385
modifier = Modifier
5486
.size(ACTOR_CARD_SIZE)
5587
.clip(CircleShape)
5688
)
5789
Text(
58-
text = actorName,
90+
text = actor.name,
5991
style = MaterialTheme.typography.bodyLarge,
6092
maxLines = 1,
6193
overflow = TextOverflow.Ellipsis

dataconnect/app/src/main/res/values/strings.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,23 @@
1919
<!-- Movie Detail Screen -->
2020
<string name="error_movie_not_found">Couldnt find movie in the database</string>
2121
<string name="description_not_available">Description not available</string>
22+
<string name="button_mark_watched">Mark as watched</string>
23+
<string name="button_unmark_watched">Watched</string>
24+
<string name="button_favorite">Add to favorites</string>
25+
<string name="button_remove_favorite">Favorite</string>
26+
<string name="title_main_actors">Main Actors</string>
27+
<string name="title_supporting_actors">Supporting Actors</string>
28+
<string name="title_user_reviews">User Reviews</string>
29+
<string name="hint_write_review">Write your review</string>
30+
<string name="button_submit_review">Submit Review</string>
31+
32+
<!-- Actor Detail Screen -->
2233
<string name="biography_not_available">Biography not available</string>
34+
35+
<!-- Profile Screen -->
36+
<string name="title_watched_movies">Watched Movies</string>
37+
<string name="title_favorite_movies">Favorite Movies</string>
38+
<string name="title_favorite_actors">Favorite Actors</string>
39+
<string name="title_reviews">Reviews</string>
40+
2341
</resources>

0 commit comments

Comments
 (0)