Skip to content

Commit

Permalink
movies repo complete
Browse files Browse the repository at this point in the history
  • Loading branch information
pramodbharti committed Oct 18, 2023
1 parent 2228948 commit 40de580
Show file tree
Hide file tree
Showing 13 changed files with 212 additions and 71 deletions.
11 changes: 9 additions & 2 deletions app/src/main/java/com/pramodbharti/filmo/data/di/AppContainer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,26 @@ import com.pramodbharti.filmo.data.network.HeaderInterceptor
import com.pramodbharti.filmo.data.network.MoviesApiService
import com.pramodbharti.filmo.data.repositories.MoviesRepository
import com.pramodbharti.filmo.data.repositories.NetworkMoviesRepository
import com.pramodbharti.filmo.domain.MoviesUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Converter
import retrofit2.Retrofit

interface AppContainer {
val moviesRepository: MoviesRepository
val moviesUseCase: MoviesUseCase
}

class DefaultAppContainer : AppContainer {

private val client = OkHttpClient
.Builder()
.addInterceptor(HeaderInterceptor())
.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
.build()

private val json = Json {
Expand All @@ -39,7 +44,9 @@ class DefaultAppContainer : AppContainer {
retrofit.create(MoviesApiService::class.java)
}
override val moviesRepository: MoviesRepository by lazy {
NetworkMoviesRepository(moviesApiService)
NetworkMoviesRepository(moviesApiService, Dispatchers.IO)
}
override val moviesUseCase: MoviesUseCase by lazy {
MoviesUseCase(moviesRepository)
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,38 @@
package com.pramodbharti.filmo.data.network

import com.pramodbharti.filmo.data.DISCOVER_MOVIES
import com.pramodbharti.filmo.data.network.MoviesApiService.Companion.TRENDING_MOVIES
import com.pramodbharti.filmo.data.network.models.MovieResponse
import com.pramodbharti.filmo.data.network.models.MoviesResponse
import retrofit2.http.GET
import retrofit2.http.Path
import retrofit2.http.Query

interface MoviesApiService {
@GET(DISCOVER_MOVIES)
suspend fun getDiscoverMovies(): MoviesResponse
@GET(TRENDING_MOVIES)
suspend fun getTrendingMovies(@Query("page") page: Int = 1): MoviesResponse

@GET(NOW_PLAYING_MOVIES)
suspend fun getNowPlayingMovies(@Query("page") page: Int = 1): MoviesResponse

@GET(POPULAR_MOVIES)
suspend fun getPopularMovies(@Query("page") page: Int = 1): MoviesResponse

@GET(TOP_RATED_MOVIES)
suspend fun getTopRatedMovies(@Query("page") page: Int = 1): MoviesResponse

@GET(UPCOMING_MOVIES)
suspend fun getUpcomingMovies(@Query("page") page: Int = 1): MoviesResponse

@GET(MOVIE_DETAILS)
suspend fun getMovieDetails(@Path("movie_id") movieId: Int): MovieResponse

companion object {
const val TRENDING_MOVIES = "trending/movie/day"
const val NOW_PLAYING_MOVIES = "movie/now_playing"
const val POPULAR_MOVIES = "movie/popular"
const val TOP_RATED_MOVIES = "movie/top_rated"
const val UPCOMING_MOVIES = "movie/upcoming"
const val MOVIE_DETAILS = "movie/{movie_id}"
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package com.pramodbharti.filmo.data.repositories

import com.pramodbharti.filmo.data.network.models.MovieResponse
import com.pramodbharti.filmo.data.network.models.MoviesResponse

interface MoviesRepository {
suspend fun getDiscoverMovies(): MoviesResponse
suspend fun getTrendingMovies(): MoviesResponse
suspend fun getNowPlayingMovies(): MoviesResponse
suspend fun getPopularMovies(): MoviesResponse
suspend fun getUpcomingMovies(): MoviesResponse
suspend fun getTopRatedMovies(): MoviesResponse
suspend fun getMovieDetails(movieId: Int): MovieResponse
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,47 @@
package com.pramodbharti.filmo.data.repositories

import com.pramodbharti.filmo.data.network.MoviesApiService
import com.pramodbharti.filmo.data.network.models.MovieResponse
import com.pramodbharti.filmo.data.network.models.MoviesResponse
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

class NetworkMoviesRepository(private val moviesApiService: MoviesApiService, private val dispatcher: CoroutineDispatcher) : MoviesRepository {
override suspend fun getTrendingMovies(): MoviesResponse {
return withContext(dispatcher) {
moviesApiService.getTrendingMovies()
}
}

override suspend fun getNowPlayingMovies(): MoviesResponse {
return withContext(dispatcher) {
moviesApiService.getNowPlayingMovies()
}
}

override suspend fun getPopularMovies(): MoviesResponse {
return withContext(dispatcher) {
moviesApiService.getPopularMovies()
}
}

override suspend fun getUpcomingMovies(): MoviesResponse {
return withContext(dispatcher) {
moviesApiService.getUpcomingMovies()
}
}

override suspend fun getTopRatedMovies(): MoviesResponse {
return withContext(dispatcher) {
moviesApiService.getTopRatedMovies()
}
}

override suspend fun getMovieDetails(movieId: Int): MovieResponse {
return withContext(dispatcher) {
moviesApiService.getMovieDetails(movieId)
}
}

class NetworkMoviesRepository(private val moviesApiService: MoviesApiService) : MoviesRepository {
override suspend fun getDiscoverMovies() = moviesApiService.getDiscoverMovies()
}
42 changes: 42 additions & 0 deletions app/src/main/java/com/pramodbharti/filmo/domain/MoviesUseCase.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.pramodbharti.filmo.domain

import com.pramodbharti.filmo.R
import com.pramodbharti.filmo.data.network.models.MovieResponse
import com.pramodbharti.filmo.data.repositories.MoviesRepository
import com.pramodbharti.filmo.ui.models.MediaItem
import com.pramodbharti.filmo.ui.models.Movies
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope

class MoviesUseCase(private val moviesRepository: MoviesRepository) {
suspend fun getMovies(): Movies {
return coroutineScope {
val trendingMovies =
async { moviesRepository.getTrendingMovies().results.take(7).map { it.toMovieItem() } }
val popularMovies =
async { moviesRepository.getPopularMovies().results.map { it.toMovieItem() } }
val nowPlaying =
async { moviesRepository.getNowPlayingMovies().results.map { it.toMovieItem() } }
val topRatedMovies =
async { moviesRepository.getTopRatedMovies().results.map { it.toMovieItem() } }
val upcomingMovies =
async { moviesRepository.getUpcomingMovies().results.map { it.toMovieItem() } }
Movies(
trendingMovies.await(),
nowPlaying.await(),
popularMovies.await(),
topRatedMovies.await(),
upcomingMovies.await()
)
}
}
}

private fun MovieResponse.toMovieItem(): MediaItem =
MediaItem(
id = id,
title = title,
poster = posterPath,
backdrop = backdropPath,
releaseDate = releaseDate
)
24 changes: 12 additions & 12 deletions app/src/main/java/com/pramodbharti/filmo/dummydata/DummyData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,39 +8,39 @@ val dummyMovies: List<MediaItem> = listOf(
MediaItem(
123,
"Testing one",
R.drawable.poster1,
R.drawable.back_drop1,
"",
"",
""
), MediaItem(
133,
"Testing one",
R.drawable.poster2,
R.drawable.back_drop2,
"",
"",
""
), MediaItem(
1230,
"Testing one",
R.drawable.poster1,
R.drawable.back_drop1,
"",
"",
""
),
MediaItem(
123,
"Testing one",
R.drawable.poster1,
R.drawable.back_drop1,
"",
"",
""
), MediaItem(
133,
"Testing one",
R.drawable.poster2,
R.drawable.back_drop2,
"",
"",
""
), MediaItem(
1230,
"Testing one",
R.drawable.poster1,
R.drawable.back_drop1,
"",
"",
""
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import coil.request.ImageRequest
import com.pramodbharti.filmo.R
import com.pramodbharti.filmo.dummydata.dummyMovies
import com.pramodbharti.filmo.ui.Constants
import com.pramodbharti.filmo.ui.models.MediaItem
Expand All @@ -50,8 +51,8 @@ fun CarouselItem(
.build(),
contentDescription = movieItem.title,
contentScale = ContentScale.Crop,
placeholder = painterResource(id = movieItem.backdrop),
error = painterResource(id = movieItem.backdrop),
placeholder = painterResource(id = R.drawable.placeholder),
error = painterResource(id = R.drawable.placeholder),
modifier = Modifier
.height(230.dp)
.fillMaxWidth()
Expand All @@ -72,7 +73,7 @@ fun CarouselItem(
.fillMaxWidth()
) {
Text(
text = "John Wick 4",
text = movieItem.title,
style = TextStyle(
color = Color.White,
fontWeight = FontWeight.Bold
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import coil.request.ImageRequest
import com.pramodbharti.filmo.R
import com.pramodbharti.filmo.ui.Constants
import com.pramodbharti.filmo.ui.models.MediaItem

Expand Down Expand Up @@ -53,8 +54,8 @@ fun MediaPoster(
.build(),
contentDescription = movieItem.title,
contentScale = ContentScale.Crop,
placeholder = painterResource(id = movieItem.poster),
error = painterResource(id = movieItem.poster),
placeholder = painterResource(id = R.drawable.placeholder),
error = painterResource(id = R.drawable.placeholder),
modifier = Modifier.size(150.dp, 230.dp)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@ import androidx.annotation.DrawableRes
data class MediaItem(
val id: Int,
val title: String,
@DrawableRes
val poster: Int,
@DrawableRes
val backdrop: Int,
val poster: String,
val backdrop: String,
val releaseDate: String
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ fun ItemDetails(movieItem: MediaItem, modifier: Modifier = Modifier) {
.data(movieItem.backdrop)
.crossfade(true)
.build(),
placeholder = painterResource(id = movieItem.backdrop),
error = painterResource(id = movieItem.backdrop),
placeholder = painterResource(id =R.drawable.placeholder),
error = painterResource(id = R.drawable.placeholder),
contentScale = ContentScale.Crop,
contentDescription = null,
modifier = Modifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ 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 com.pramodbharti.filmo.R
import com.pramodbharti.filmo.dummydata.dummyMovies
import com.pramodbharti.filmo.ui.models.MediaItem
import com.pramodbharti.filmo.ui.theme.FilmoTheme
Expand All @@ -53,7 +54,7 @@ fun FavItem(item: MediaItem, modifier: Modifier = Modifier, onDeleteClick: (Medi
Card(elevation = CardDefaults.cardElevation(defaultElevation = 8.dp)) {
Row(modifier = Modifier.padding(8.dp)) {
Image(
painter = painterResource(id = item.poster),
painter = painterResource(id = R.drawable.placeholder),
contentDescription = item.title,
contentScale = ContentScale.FillBounds,
modifier = Modifier
Expand Down
Loading

0 comments on commit 40de580

Please sign in to comment.