Skip to content

Commit

Permalink
Merge pull request #81 from VictorKabata/android-viewmodel
Browse files Browse the repository at this point in the history
Set up android viewmodel
  • Loading branch information
VictorKabata committed Mar 30, 2023
2 parents aea89a5 + 7433a94 commit 02f21d5
Show file tree
Hide file tree
Showing 39 changed files with 1,735 additions and 613 deletions.
7 changes: 5 additions & 2 deletions app-android/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,12 @@ dependencies {
implementation(libs.firebase.crashlytics)
implementation(libs.firebase.performance)

testImplementation(libs.jUnit)
testImplementation(libs.googleTruth)
testImplementation(libs.jUnitKtx)
testImplementation(libs.kotlinX.coroutines.test)
testImplementation(libs.mockk)
testImplementation(libs.kotlin.test)
testImplementation(libs.archTestCore)
testImplementation(libs.robolectric)

androidTestImplementation(libs.test.rules)
androidTestImplementation(libs.test.runner)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
package com.vickikbt.notflix.di

import com.vickikbt.notflix.ui.activity.MainViewModel
import com.vickikbt.notflix.ui.screens.details.DetailsViewModel
import com.vickikbt.notflix.ui.screens.favorites.FavouritesViewModel
import com.vickikbt.notflix.ui.screens.home.HomeViewModel
import com.vickikbt.notflix.ui.screens.settings.SettingsViewModel
import com.vickikbt.notflix.util.LocaleManager
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.androidx.viewmodel.dsl.viewModelOf
import org.koin.core.module.dsl.singleOf
import org.koin.dsl.module

val presentationModule = module {

single { LocaleManager() }
singleOf(::LocaleManager)

viewModel { MainViewModel(get()) }
viewModelOf(::MainViewModel)
viewModelOf(::HomeViewModel)
viewModelOf(::DetailsViewModel)
viewModelOf(::FavouritesViewModel)
viewModelOf(::SettingsViewModel)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.vickikbt.notflix.ui.components

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
Expand All @@ -9,34 +10,45 @@ import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil.compose.rememberImagePainter
import coil.transform.CircleCropTransformation
import com.google.accompanist.placeholder.placeholder
import com.vickikbt.notflix.R
import com.vickikbt.notflix.ui.theme.TextSecondary
import com.vickikbt.notflix.util.loadImage
import com.vickikbt.shared.domain.models.Actor

@Composable
fun ItemMovieCast(modifier: Modifier = Modifier, actor: Actor) {
val painter = rememberImagePainter(data = actor.profilePath?.loadImage()) {
fun ItemMovieCast(modifier: Modifier = Modifier, actor: Actor, isLoading: Boolean = false) {
val painter = rememberImagePainter(
data = actor.profilePath?.loadImage()
) {
crossfade(true)
transformations(CircleCropTransformation())
}

Column(horizontalAlignment = Alignment.CenterHorizontally) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(1.dp)
) {
Image(
modifier = Modifier.size(80.dp),
modifier = Modifier
.placeholder(visible = isLoading, color = Color.Gray.copy(.8f))
.size(80.dp),
painter = painter,
contentDescription = stringResource(id = R.string.cast)
)

Text(
modifier = Modifier.width(78.dp),
modifier = Modifier
.placeholder(visible = isLoading, color = Color.Gray)
.width(78.dp),
text = actor.name ?: stringResource(R.string.unknown_actor),
style = MaterialTheme.typography.h6,
fontSize = 14.sp,
Expand All @@ -47,7 +59,9 @@ fun ItemMovieCast(modifier: Modifier = Modifier, actor: Actor) {
)

Text(
modifier = Modifier.width(77.dp),
modifier = Modifier
.placeholder(visible = isLoading, color = Color.Gray)
.width(77.dp),
text = actor.character ?: stringResource(R.string.unknown_character),
style = MaterialTheme.typography.h4,
fontSize = 12.sp,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
Expand All @@ -30,9 +31,7 @@ import androidx.compose.ui.unit.sp
import coil.annotation.ExperimentalCoilApi
import coil.compose.ImagePainter
import coil.compose.rememberImagePainter
import com.google.accompanist.placeholder.PlaceholderHighlight
import com.google.accompanist.placeholder.material.placeholder
import com.google.accompanist.placeholder.shimmer
import com.gowtham.ratingbar.RatingBar
import com.gowtham.ratingbar.RatingBarStyle
import com.gowtham.ratingbar.StepSize
Expand All @@ -48,6 +47,7 @@ import com.vickikbt.shared.utils.getRating
fun ItemNowPlayingMovies(
modifier: Modifier = Modifier,
movie: Movie,
isLoading: Boolean = false,
onItemClick: () -> Unit
) {
val defaultDominantColor = MaterialTheme.colors.surface
Expand Down Expand Up @@ -78,13 +78,9 @@ fun ItemNowPlayingMovies(
//region Movie Cover Image
Image(
modifier = Modifier
.placeholder(visible = isLoading, color = Color.Gray.copy(alpha = .8f))
.fillMaxSize()
.align(Alignment.Center)
.placeholder(
visible = false,
color = Color.Gray,
highlight = PlaceholderHighlight.shimmer(highlightColor = Color.White)
),
.align(Alignment.Center),
alignment = Alignment.Center,
contentScale = ContentScale.Crop,
painter = painter,
Expand All @@ -102,7 +98,7 @@ fun ItemNowPlayingMovies(
Brush.verticalGradient(
listOf(
Color.Transparent,
dominantColor
if (isLoading) Color.Transparent else dominantColor
)
)
)
Expand All @@ -117,7 +113,11 @@ fun ItemNowPlayingMovies(
verticalArrangement = Arrangement.spacedBy(2.dp)
) {
Text(
modifier = Modifier,
modifier = Modifier.placeholder(
visible = isLoading,
color = Color.Gray,
shape = RoundedCornerShape(0.dp)
),
text = movie.title ?: "Unknown movie",
fontSize = 32.sp,
maxLines = 2,
Expand All @@ -128,7 +128,11 @@ fun ItemNowPlayingMovies(
)

RatingBar(
modifier = Modifier,
modifier = Modifier.placeholder(
visible = isLoading,
color = Color.Gray,
shape = RoundedCornerShape(0.dp)
),
value = movie.voteAverage?.getRating()?.toFloat() ?: 0f,
numStars = 5,
size = 18.dp,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ import androidx.compose.ui.unit.sp
import coil.annotation.ExperimentalCoilApi
import coil.compose.ImagePainter
import coil.compose.rememberImagePainter
import com.google.accompanist.placeholder.PlaceholderHighlight
import com.google.accompanist.placeholder.material.fade
import com.google.accompanist.placeholder.material.placeholder
import com.gowtham.ratingbar.RatingBar
import com.gowtham.ratingbar.RatingBarStyle
Expand All @@ -58,6 +56,7 @@ import com.vickikbt.shared.utils.getReleaseDate
fun ItemPopularMovies(
modifier: Modifier = Modifier,
movie: Movie,
isLoading: Boolean = false,
onClickItem: (Movie) -> Unit
) {
val defaultDominantTextColor = MaterialTheme.colors.onSurface
Expand All @@ -84,13 +83,7 @@ fun ItemPopularMovies(
}

Card(
modifier = modifier
.clickable { onClickItem(movie) }
.placeholder(
visible = false,
color = Color.Black,
highlight = PlaceholderHighlight.fade()
),
modifier = modifier.clickable { onClickItem(movie) },
elevation = 8.dp,
shape = RoundedCornerShape(4.dp)
) {
Expand All @@ -100,9 +93,9 @@ fun ItemPopularMovies(
modifier = Modifier
.fillMaxSize()
.placeholder(
visible = false,
color = Color.Black,
highlight = PlaceholderHighlight.fade()
visible = isLoading,
color = Color.Gray.copy(alpha = .8f),
shape = RoundedCornerShape(4.dp)
)
.align(Alignment.Center),
alignment = Alignment.Center,
Expand All @@ -121,7 +114,7 @@ fun ItemPopularMovies(
Brush.verticalGradient(
listOf(
Color.Transparent,
dominantColor
if (isLoading) Color.Transparent else dominantColor
)
)
)
Expand All @@ -137,6 +130,10 @@ fun ItemPopularMovies(
) {
//region Movie Title
Text(
modifier = Modifier.placeholder(
visible = isLoading,
color = Color.Gray
),
text = movie.title ?: "Unknown movie",
fontSize = 18.sp,
maxLines = 2,
Expand All @@ -156,7 +153,11 @@ fun ItemPopularMovies(
verticalAlignment = Alignment.CenterVertically
) {
RatingBar(
modifier = Modifier,
modifier = Modifier.placeholder(
visible = isLoading,
color = Color.Gray,
shape = RoundedCornerShape(0.dp)
),
value = movie.voteAverage?.getRating()?.toFloat() ?: 0f,
numStars = 5,
size = 15.dp,
Expand All @@ -179,7 +180,11 @@ fun ItemPopularMovies(
)

Text(
modifier = Modifier,
modifier = Modifier.placeholder(
visible = isLoading,
color = Color.Gray,
shape = RoundedCornerShape(0.dp)
),
text = movie.releaseDate.getReleaseDate()?.capitalizeEachWord()!!,
fontSize = 14.sp,
maxLines = 1,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.vickikbt.notflix.ui.components

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
Expand All @@ -12,13 +13,15 @@ import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import coil.compose.rememberImagePainter
import com.google.accompanist.placeholder.placeholder
import com.gowtham.ratingbar.RatingBar
import com.gowtham.ratingbar.RatingBarStyle
import com.gowtham.ratingbar.StepSize
Expand All @@ -29,26 +32,30 @@ import com.vickikbt.shared.domain.models.Movie
import com.vickikbt.shared.utils.getRating

@Composable
fun ItemSimilarMovies(movie: Movie) {
fun ItemSimilarMovies(movie: Movie, isLoading: Boolean = false) {
val painter = rememberImagePainter(data = movie.backdropPath?.loadImage())

Column {
Column(verticalArrangement = Arrangement.spacedBy(1.dp)) {
Card(
modifier = Modifier
.width(150.dp)
.height(220.dp),
shape = RoundedCornerShape(4.dp)
) {
Image(
modifier = Modifier.fillMaxSize(),
modifier = Modifier
.fillMaxSize()
.placeholder(visible = isLoading, color = Color.Gray.copy(.8f)),
painter = painter,
contentDescription = stringResource(id = com.vickikbt.notflix.R.string.movie_poster),
contentScale = ContentScale.Crop
)
}

Text(
modifier = Modifier.width(148.dp),
modifier = Modifier
.width(148.dp)
.placeholder(visible = isLoading, color = Color.Gray),
text = movie.title ?: stringResource(id = com.vickikbt.notflix.R.string.unknown_movie),
style = MaterialTheme.typography.h5,
fontSize = 14.sp,
Expand All @@ -60,7 +67,9 @@ fun ItemSimilarMovies(movie: Movie) {

// rating bar
RatingBar(
modifier = Modifier.fillMaxWidth(0.8f),
modifier = Modifier
.fillMaxWidth(0.8f)
.placeholder(visible = isLoading, color = Color.Gray),
value = movie.voteAverage?.getRating()?.toFloat() ?: 0f,
numStars = 5,
size = 15.dp,
Expand Down
Loading

0 comments on commit 02f21d5

Please sign in to comment.