Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added color palette to images #128

Merged
merged 11 commits into from
Sep 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ kotlin {
implementation(libs.sqlite.bundled)

implementation(libs.bundles.paging)

implementation(libs.bundles.kmpPalette)
}

commonTest.dependencies {
Expand Down
2 changes: 2 additions & 0 deletions composeApp/src/commonMain/composeResources/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@

<string name="search_movie">Search Movie</string>

<string name="see_more">See More</string>

<string-array name="themes">
<item>Light theme</item>
<item>Dark theme</item>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,7 @@ import androidx.compose.material3.Card
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
Expand All @@ -26,19 +23,38 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil3.compose.AsyncImage
import com.kmpalette.loader.NetworkLoader
import com.kmpalette.rememberDominantColorState
import com.vickbt.composeApp.domain.models.MovieDetails
import com.vickbt.composeApp.utils.loadImage
import com.vickbt.shared.resources.Res
import com.vickbt.shared.resources.see_more
import io.ktor.http.Url
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
import org.jetbrains.compose.resources.stringResource

@Composable
fun MovieCardDescription(
modifier: Modifier = Modifier,
movie: MovieDetails,
networkLoader: NetworkLoader,
maxLine: Int = 3,
overFlowText: String = "See more",
overFlowText: String = stringResource(Res.string.see_more),
onItemClick: (MovieDetails) -> Unit
) {
var dominantColor by remember { mutableStateOf(Color.DarkGray) }
var dominantTextColor by remember { mutableStateOf(Color.LightGray) }
val dominantColorState = rememberDominantColorState(
loader = networkLoader,
defaultColor = Color.DarkGray,
defaultOnColor = Color.LightGray,
coroutineContext = Dispatchers.IO
)

movie.backdropPath?.loadImage()?.let {
LaunchedEffect(it) {
dominantColorState.updateFrom(Url(it))
}
}

Card(modifier = modifier.clickable { onItemClick(movie) }) {
Box {
Expand All @@ -62,7 +78,7 @@ fun MovieCardDescription(
.align(Alignment.BottomCenter)
.background(
Brush.verticalGradient(
listOf(Color.Transparent, dominantColor)
listOf(Color.Transparent, dominantColorState.color)
)
)
)
Expand All @@ -82,18 +98,16 @@ fun MovieCardDescription(
style = MaterialTheme.typography.titleMedium,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
color = dominantTextColor,
color = dominantColorState.onColor,
lineHeight = 30.sp
)

movie.overview?.let {
ExpandableText(
modifier = Modifier.padding(bottom = 4.dp),
text = it,
overFlowText = overFlowText,
minimizedMaxLines = maxLine
)
}
ExpandableText(
modifier = Modifier.padding(bottom = 4.dp),
text = movie.overview,
overFlowText = overFlowText,
minimizedMaxLines = maxLine
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,7 @@ import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
Expand All @@ -33,6 +30,9 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil3.compose.AsyncImage
import com.kmpalette.loader.NetworkLoader
import com.kmpalette.loader.rememberNetworkLoader
import com.kmpalette.rememberDominantColorState
import com.vickbt.composeApp.domain.models.Movie
import com.vickbt.composeApp.ui.components.ratingbar.RatingBar
import com.vickbt.composeApp.ui.components.ratingbar.RatingBarStyle
Expand All @@ -43,16 +43,30 @@ import com.vickbt.composeApp.utils.getReleaseDate
import com.vickbt.composeApp.utils.loadImage
import com.vickbt.shared.resources.Res
import com.vickbt.shared.resources.unknown_movie
import io.ktor.http.Url
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
import org.jetbrains.compose.resources.stringResource

@Composable
fun MovieCardLandscape(
modifier: Modifier = Modifier,
movie: Movie,
networkLoader: NetworkLoader = rememberNetworkLoader(),
onClickItem: (Movie) -> Unit
) {
var dominantTextColor by remember { mutableStateOf(Color.LightGray) }
var dominantSubTextColor by remember { mutableStateOf(dominantTextColor) }
val dominantColorState = rememberDominantColorState(
loader = networkLoader,
defaultColor = Color.DarkGray,
defaultOnColor = Color.LightGray,
coroutineContext = Dispatchers.IO
)

movie.backdropPath?.loadImage()?.let {
LaunchedEffect(it) {
dominantColorState.updateFrom(Url(it))
}
}

Card(
modifier = modifier.clickable { onClickItem(movie) },
Expand Down Expand Up @@ -80,7 +94,7 @@ fun MovieCardLandscape(
Brush.verticalGradient(
listOf(
Color.Transparent,
Color.DarkGray
dominantColorState.color
)
)
)
Expand All @@ -103,7 +117,7 @@ fun MovieCardLandscape(
style = MaterialTheme.typography.titleMedium,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
color = dominantTextColor
color = dominantColorState.onColor
)
//endregion

Expand Down Expand Up @@ -131,7 +145,7 @@ fun MovieCardLandscape(
.padding(horizontal = 4.dp)
.width(1.dp)
.height(13.dp),
color = dominantSubTextColor
color = dominantColorState.onColor
)

Text(
Expand All @@ -142,7 +156,7 @@ fun MovieCardLandscape(
style = MaterialTheme.typography.labelSmall,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
color = dominantSubTextColor
color = dominantColorState.onColor
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,7 @@ import androidx.compose.material3.Card
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
Expand All @@ -33,6 +30,9 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil3.compose.AsyncImage
import com.kmpalette.loader.NetworkLoader
import com.kmpalette.loader.rememberNetworkLoader
import com.kmpalette.rememberDominantColorState
import com.vickbt.composeApp.domain.models.Movie
import com.vickbt.composeApp.ui.components.ratingbar.RatingBar
import com.vickbt.composeApp.ui.components.ratingbar.RatingBarStyle
Expand All @@ -41,16 +41,30 @@ import com.vickbt.composeApp.utils.getRating
import com.vickbt.composeApp.utils.loadImage
import com.vickbt.shared.resources.Res
import com.vickbt.shared.resources.unknown_movie
import io.ktor.http.Url
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
import org.jetbrains.compose.resources.stringResource

@Composable
fun MovieCardPager(
modifier: Modifier = Modifier,
movie: Movie,
networkLoader: NetworkLoader = rememberNetworkLoader(),
onItemClick: (Movie) -> Unit
) {
var dominantColor by remember { mutableStateOf(Color.DarkGray) }
var dominantTextColor by remember { mutableStateOf(Color.LightGray) }
val dominantColorState = rememberDominantColorState(
loader = networkLoader,
defaultColor = Color.DarkGray,
defaultOnColor = Color.LightGray,
coroutineContext = Dispatchers.IO
)

movie.backdropPath?.loadImage()?.let {
LaunchedEffect(it) {
dominantColorState.updateFrom(Url(it))
}
}

Card(modifier = modifier.clickable { onItemClick(movie) }) {
Box {
Expand All @@ -74,7 +88,7 @@ fun MovieCardPager(
.align(Alignment.BottomCenter)
.background(
Brush.verticalGradient(
listOf(Color.Transparent, dominantColor)
listOf(Color.Transparent, dominantColorState.color)
)
)
)
Expand All @@ -95,7 +109,7 @@ fun MovieCardPager(
style = MaterialTheme.typography.titleMedium,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
color = dominantTextColor,
color = dominantColorState.onColor,
lineHeight = 30.sp
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,8 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush
Expand All @@ -39,13 +37,18 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil3.compose.AsyncImage
import com.kmpalette.loader.NetworkLoader
import com.kmpalette.rememberDominantColorState
import com.vickbt.composeApp.domain.models.MovieDetails
import com.vickbt.composeApp.ui.components.collapsingToolbar.CollapsingToolbarScaffoldState
import com.vickbt.composeApp.utils.DetailsUiState
import com.vickbt.composeApp.utils.getMovieDuration
import com.vickbt.composeApp.utils.loadImage
import com.vickbt.shared.resources.Res
import com.vickbt.shared.resources.unknown_movie
import io.ktor.http.Url
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.IO
import org.jetbrains.compose.resources.stringResource

@OptIn(ExperimentalMaterial3Api::class)
Expand All @@ -54,20 +57,29 @@ fun DetailsAppBar(
modifier: Modifier = Modifier,
collapsingScrollState: CollapsingToolbarScaffoldState,
movieDetailsState: DetailsUiState,
networkLoader: NetworkLoader,
onNavigationIconClick: () -> Unit,
onShareIconClick: () -> Unit,
onFavoriteIconClick: (MovieDetails, Boolean?) -> Unit
) {
// Return progress on collapsing toolbar - 1.0f=Expanded, 0.0f=Collapsed
val scrollProgress = collapsingScrollState.toolbarState.progress

val defaultDominantColor = MaterialTheme.colorScheme.surface
val defaultDominantTextColor = MaterialTheme.colorScheme.onSurface
var dominantColor by remember { mutableStateOf(defaultDominantColor) }
var dominantTextColor by remember { mutableStateOf(defaultDominantTextColor) }
val dominantColorState = rememberDominantColorState(
loader = networkLoader,
defaultColor = Color.DarkGray,
defaultOnColor = Color.LightGray,
coroutineContext = Dispatchers.IO
)

val movieDetails by remember { mutableStateOf(movieDetailsState.movieDetails) }
var isFavourite by remember { mutableStateOf(movieDetailsState.isFavorite) }
movieDetailsState.movieDetails?.backdropPath?.loadImage()?.let {
LaunchedEffect(it) {
dominantColorState.updateFrom(Url(it))
}
}

val movieDetails = movieDetailsState.movieDetails
var isFavourite = movieDetailsState.isFavorite

val backgroundColor by animateColorAsState(
targetValue = MaterialTheme.colorScheme.surface.copy(1 - scrollProgress)
Expand Down Expand Up @@ -95,7 +107,11 @@ fun DetailsAppBar(
.fillMaxWidth()
.height(210.dp)
.align(Alignment.BottomCenter)
.background(Brush.verticalGradient(listOf(Color.Transparent, dominantColor)))
.background(
Brush.verticalGradient(
listOf(Color.Transparent, dominantColorState.color)
)
)
)

Column(
Expand All @@ -117,7 +133,7 @@ fun DetailsAppBar(
style = MaterialTheme.typography.titleMedium,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
color = dominantTextColor,
color = dominantColorState.onColor,
fontSize = 32.sp,
textAlign = TextAlign.Start,
lineHeight = 30.sp
Expand All @@ -126,7 +142,7 @@ fun DetailsAppBar(
Text(
modifier = Modifier,
text = movieDetails?.runtime?.getMovieDuration() ?: "",
color = dominantTextColor,
color = dominantColorState.onColor,
style = MaterialTheme.typography.bodyMedium,
fontSize = 14.sp
)
Expand Down
Loading
Loading