From 08005d2a9f5780d43b4fb8d32f25e86f91e71422 Mon Sep 17 00:00:00 2001 From: doordash-ci Date: Mon, 2 Feb 2026 14:37:13 -0600 Subject: [PATCH] changes --- .../activities/AppDestinations.kt | 6 +- .../activities/LaunchingActivity.kt | 34 ++- .../demo_omdb_api/ui/common/CommonUi.kt | 1 - .../demo_omdb_api/ui/feed/FeedComposables.kt | 201 ++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 239 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/mohitb117/demo_omdb_api/ui/feed/FeedComposables.kt diff --git a/app/src/main/java/com/mohitb117/demo_omdb_api/activities/AppDestinations.kt b/app/src/main/java/com/mohitb117/demo_omdb_api/activities/AppDestinations.kt index 1fae4f8..b29e0f0 100644 --- a/app/src/main/java/com/mohitb117/demo_omdb_api/activities/AppDestinations.kt +++ b/app/src/main/java/com/mohitb117/demo_omdb_api/activities/AppDestinations.kt @@ -2,16 +2,18 @@ package com.mohitb117.demo_omdb_api.activities import androidx.annotation.StringRes import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.DynamicFeed import androidx.compose.material.icons.filled.Favorite import androidx.compose.material.icons.filled.Home import androidx.compose.ui.graphics.vector.ImageVector import com.mohitb117.demo_omdb_api.R enum class AppDestinations( - @StringRes val label: Int, + @param:StringRes val label: Int, val icon: ImageVector, - @StringRes val contentDescription: Int + @param:StringRes val contentDescription: Int ) { HOME(R.string.home, Icons.Default.Home, R.string.home), FAVORITES(R.string.favorites, Icons.Default.Favorite, R.string.favorites), + Feed(R.string.feed, Icons.Default.DynamicFeed, R.string.feed) } \ No newline at end of file diff --git a/app/src/main/java/com/mohitb117/demo_omdb_api/activities/LaunchingActivity.kt b/app/src/main/java/com/mohitb117/demo_omdb_api/activities/LaunchingActivity.kt index ae5a512..a868493 100644 --- a/app/src/main/java/com/mohitb117/demo_omdb_api/activities/LaunchingActivity.kt +++ b/app/src/main/java/com/mohitb117/demo_omdb_api/activities/LaunchingActivity.kt @@ -41,6 +41,7 @@ import com.mohitb117.demo_omdb_api.datamodels.SearchResult import com.mohitb117.demo_omdb_api.datamodels.SearchResultsBody import com.mohitb117.demo_omdb_api.ui.favourites.FavouritesViewModel import com.mohitb117.demo_omdb_api.ui.favourites.FavouritesComposableContent +import com.mohitb117.demo_omdb_api.ui.feed.FeedComposableContent import com.mohitb117.demo_omdb_api.ui.search.Result import com.mohitb117.demo_omdb_api.ui.search.SearchComposableContent import com.mohitb117.demo_omdb_api.ui.search.SearchViewModel @@ -152,7 +153,16 @@ class LaunchingActivity : ComponentActivity() { ) } - else -> { + AppDestinations.Feed -> { + FeedComposableLayout( + modifier = Modifier.padding(innerPadding), + uiState = favouritesUiState, + isMovieFavourited = isMovieFavourited, + onToggleMovieFavorited = onToggleMovieFavorited, + ) + } + + AppDestinations.FAVORITES -> { FavouritesComposableLayout( modifier = Modifier.padding(innerPadding), uiState = favouritesUiState, @@ -205,6 +215,28 @@ class LaunchingActivity : ComponentActivity() { } } + @Composable + fun FeedComposableLayout( + uiState: Set, + modifier: Modifier = Modifier, + isMovieFavourited: (SearchResult) -> Boolean = { false }, + onToggleMovieFavorited: suspend (SearchResult) -> Boolean = { false }, + ) { + Column( + modifier = modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + + FeedComposableContent( + modifier = Modifier, + uiState = uiState, + onToggleMovieFavorited = onToggleMovieFavorited, + isMovieFavourited = isMovieFavourited, + ) + } + } + @Composable fun FavouritesComposableLayout( uiState: Set, diff --git a/app/src/main/java/com/mohitb117/demo_omdb_api/ui/common/CommonUi.kt b/app/src/main/java/com/mohitb117/demo_omdb_api/ui/common/CommonUi.kt index ea79969..b3cd11e 100644 --- a/app/src/main/java/com/mohitb117/demo_omdb_api/ui/common/CommonUi.kt +++ b/app/src/main/java/com/mohitb117/demo_omdb_api/ui/common/CommonUi.kt @@ -60,7 +60,6 @@ fun MovieItemListComposable( ) { items( items = searchItems, - key = { it.imdbID } ) { item -> ListItem( item = item, diff --git a/app/src/main/java/com/mohitb117/demo_omdb_api/ui/feed/FeedComposables.kt b/app/src/main/java/com/mohitb117/demo_omdb_api/ui/feed/FeedComposables.kt new file mode 100644 index 0000000..8674948 --- /dev/null +++ b/app/src/main/java/com/mohitb117/demo_omdb_api/ui/feed/FeedComposables.kt @@ -0,0 +1,201 @@ +@file:OptIn(ExperimentalMaterial3Api::class) + +package com.mohitb117.demo_omdb_api.ui.feed + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.gestures.TargetedFlingBehavior +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.pager.VerticalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import com.mohitb117.demo_omdb_api.R +import com.mohitb117.demo_omdb_api.activities.ui.theme.DEMO_OMDB_APITheme +import com.mohitb117.demo_omdb_api.activities.ui.theme.Purple40 +import com.mohitb117.demo_omdb_api.datamodels.SearchResult +import com.mohitb117.demo_omdb_api.datamodels.SearchResultsBody +import kotlinx.coroutines.launch + +@Composable +fun FeedComposableContent( + modifier: Modifier = Modifier, + uiState: Set, + isMovieFavourited: (SearchResult) -> Boolean = { false }, + onToggleMovieFavorited: suspend (SearchResult) -> Boolean = { false }, +) { + FeedListComposable( + modifier = modifier, + searchResults = SearchResultsBody( + Search = uiState.toList(), + totalResults = "", + Response = "", + ), + isMovieFavourited = isMovieFavourited, + onToggleMovieFavorited = onToggleMovieFavorited, + ) +} + +@ExperimentalMaterial3Api +@Composable +fun FeedListComposable( + modifier: Modifier, + searchResults: SearchResultsBody, + isMovieFavourited: (SearchResult) -> Boolean = { false }, + onToggleMovieFavorited: suspend (SearchResult) -> Boolean = { false }, +) { + val searchItems = searchResults.Search.orEmpty() + + val pagerState = rememberPagerState(pageCount = { searchItems.size }) + + if (searchItems.isEmpty()) { + Text(modifier = Modifier.fillMaxWidth(), text = "No results found") + } else { + VerticalPager( + modifier = Modifier.fillMaxSize(), + state = pagerState, + beyondViewportPageCount = 1, + contentPadding = PaddingValues(bottom = 150.dp) + ) { + val item = searchItems[it] + FeedListItem( + item = item, + isMovieFavourited = isMovieFavourited, + onToggleMovieFavorited = onToggleMovieFavorited, + ) + } + } +} + + +@Composable +fun FeedListItem( + modifier: Modifier = Modifier, + item: SearchResult, + isMovieFavourited: (SearchResult) -> Boolean = { false }, + onToggleMovieFavorited: suspend (SearchResult) -> Boolean = { false }, +) { + val coroutineScope = rememberCoroutineScope() + + val borderWidth = 20.dp + val roundedCornerShape = RoundedCornerShape(borderWidth) + + Box( + modifier = Modifier + .fillMaxSize() + .padding(4.dp) + .background( + color = Purple40, + shape = roundedCornerShape + ), + ) { + var isFavourited by rememberSaveable { mutableStateOf(false) } + + isFavourited = isMovieFavourited(item) + + AsyncImage( + model = item.poster, + placeholder = painterResource(id = R.mipmap.img), + modifier = Modifier + .fillMaxSize() + .border( + border = BorderStroke(borderWidth / 8, Color.Gray), + shape = RoundedCornerShape(borderWidth) + ) + .padding(borderWidth / 8) + .clip(roundedCornerShape) + .padding(top = 64.dp), + contentDescription = "Poster", + contentScale = ContentScale.Crop, + ) + + Text( + modifier = Modifier + .wrapContentSize() + .align(Alignment.TopStart) + .padding(10.dp), + text = item.title, + ) + + Switch( + modifier = Modifier + .wrapContentSize() + .align(Alignment.TopEnd) + .padding(5.dp), + checked = isFavourited, + onCheckedChange = { + coroutineScope.launch { + val result = onToggleMovieFavorited(item) + isFavourited = result + } + } + ) + } +} + +@ExperimentalMaterial3Api +@Preview(showBackground = true) +@Composable +fun MovieItemComposablePreview() { + DEMO_OMDB_APITheme { + FeedComposableContent( + uiState = setOf( + SearchResult( + imdbID = "tt0076759", + title = "Star Wars: Episode IV - A New Hope Blah BlahBlahnBlahn", + type = "movie", + poster = "https://m.media-amazon.com/images/M/MV5BOTA5NjhiOTAtZWM0ZC00MWNhLWE1OTktZDA4MjkwYmY0OTU3XkEyXkFqcGdeQXVyMTQxNzMzNDI@._V1_SX300.jpg" + ), + SearchResult( + imdbID = "tt0080684", + title = "Star Wars: Episode V - The Empire Strikes BackBlah Blahn BlahnBlahnBlahnBlahnBlahn", + type = "movie", + poster = "https://m.media-amazon.com/images/M/MV5BYmU1ZTMwMWUtMWVlUC00MGRiLTgwOTYtOGVjOWFmZGUxMGRmXkEyXkFqcGdeQXVyNjU0OTQ0OTY@._V1_SX300.jpg" + ) + ), + ) + } +} + +@ExperimentalMaterial3Api +@Preview(showBackground = true) +@Composable +fun FeedListComposablePreview() { + DEMO_OMDB_APITheme { + FeedComposableContent( + uiState = setOf( + SearchResult( + imdbID = "tt0076759", + title = "Star Wars: Episode IV - A New Hope", + type = "movie", + poster = "https://m.media-amazon.com/images/M/MV5BOTA5NjhiOTAtZWM0ZC00MWNhLWE1OTktZDA4MjkwYmY0OTU3XkEyXkFqcGdeQXVyMTQxNzMzNDI@._V1_SX300.jpg" + ), + ), + ) + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 743c0d8..b12b720 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,6 +5,7 @@ Favourites Home Favorites + Feed Shopping Profile MainActivity