parent
3cfc7d73b4
commit
904a5078ef
@ -1,18 +1,18 @@
|
||||
package fr.iut.pm.movieapplication.api
|
||||
|
||||
import fr.iut.pm.movieapplication.network.dtos.PopularDTO
|
||||
import fr.iut.pm.movieapplication.utils.Constants
|
||||
import fr.iut.pm.movieapplication.utils.Constants.Companion.API_KEY
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import fr.iut.pm.movieapplication.api.dtos.MovieResultDTO
|
||||
import fr.iut.pm.movieapplication.api.dtos.PopularDTO
|
||||
import retrofit2.Call
|
||||
import retrofit2.Response
|
||||
import retrofit2.http.GET
|
||||
import retrofit2.http.Header
|
||||
import retrofit2.http.Path
|
||||
import retrofit2.http.Query
|
||||
|
||||
interface MovieApplicationAPI {
|
||||
|
||||
@GET("movie/popular")
|
||||
suspend fun getPopularMovies(@Query("api_key") apiKey : String) : Call<PopularDTO>
|
||||
fun getPopularMovies(@Query("api_key") apiKey : String) : Call<PopularDTO>
|
||||
|
||||
@GET("movie/{movie_id")
|
||||
fun getMovieDetails(@Path("movie_id") movieId : Int, @Query("api_key") apiKey: String) : Call<MovieResultDTO>
|
||||
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package fr.iut.pm.movieapplication.api.dtos
|
||||
|
||||
import androidx.room.ColumnInfo
|
||||
import androidx.room.Embedded
|
||||
import androidx.room.PrimaryKey
|
||||
import androidx.room.Relation
|
||||
import com.squareup.moshi.Json
|
||||
import fr.iut.pm.movieapplication.model.Genre
|
||||
import fr.iut.pm.movieapplication.model.ProductionCompany
|
||||
import fr.iut.pm.movieapplication.model.ProductionCountry
|
||||
import fr.iut.pm.movieapplication.network.dtos.GenreDTO
|
||||
|
||||
class MovieDTO (
|
||||
val adult: Boolean,
|
||||
val budget: Int,
|
||||
val genres: Array<GenreDTO>?,
|
||||
val homepage: String?,
|
||||
val id: Int,
|
||||
@Json(name = "original_language")
|
||||
val originalLanguage: String,
|
||||
@Json(name = "original_title")
|
||||
val originalTitle: String,
|
||||
val overview: String?,
|
||||
val popularity: Double,
|
||||
@Json(name = "poster_path")
|
||||
val posterPath: String?,
|
||||
@Json(name = "production_countries")
|
||||
val productionCountries: Array<ProductionCountry>,
|
||||
@Json(name = "release_date")
|
||||
val releaseDate: String,
|
||||
val revenue: Int,
|
||||
val runtime: Int?,
|
||||
//var spokenLanguages : Array<SpokenLanguage>,
|
||||
val status: String,
|
||||
@Json(name = "tag_line")
|
||||
val tagLine: String?,
|
||||
val title: String,
|
||||
@Json(name = "vote_average")
|
||||
val voteAverage: Double,
|
||||
@Json(name = "vote_count")
|
||||
val voteCount: Int,
|
||||
val backdropPath: String?
|
||||
){
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package fr.iut.pm.movieapplication.api.dtos
|
||||
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
|
||||
class MovieResultDTO(
|
||||
@Json(name = "poster_path")
|
||||
val posterPath : String?,
|
||||
@Json(name = "adult")
|
||||
val adult : Boolean,
|
||||
@Json(name = "overview")
|
||||
val overview : String,
|
||||
@Json(name = "release_date")
|
||||
val releaseDate : String?,
|
||||
@Json(name = "genre_ids")
|
||||
val genreIds : List<Int>?,
|
||||
@Json(name = "id")
|
||||
val id : Int,
|
||||
@Json(name = "original_title")
|
||||
val originalTitle : String?,
|
||||
@Json(name = "original_language")
|
||||
val originalLanguage : String?,
|
||||
@Json(name = "title")
|
||||
val title : String?,
|
||||
@Json(name = "backdrop_path")
|
||||
val backdropPath : String?,
|
||||
@Json(name = "popularity")
|
||||
val popularity : Double?,
|
||||
@Json(name = "vote_count")
|
||||
val voteCount : Int?,
|
||||
val video : Boolean?,
|
||||
@Json(name = "vote_average")
|
||||
val voteAverage : Double?
|
||||
|
||||
|
||||
|
||||
) {
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package fr.iut.pm.movieapplication.api.dtos
|
||||
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
|
||||
|
||||
|
||||
class PopularDTO(
|
||||
@Json(name = "page")
|
||||
val page : Int,
|
||||
@Json(name = "results")
|
||||
val results : List<MovieResultDTO>,
|
||||
@Json(name = "total_results")
|
||||
val totalResults : Int,
|
||||
@Json(name = "total_pages")
|
||||
val totalPages : Int
|
||||
|
||||
) {}
|
@ -1,25 +0,0 @@
|
||||
package fr.iut.pm.movieapplication.network.dtos
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
|
||||
data class MovieDTO(
|
||||
@Json(name = "poster_path")
|
||||
val posterPath : String?,
|
||||
val adult : Boolean,
|
||||
val overview : String?,
|
||||
@Json(name = "release_date")
|
||||
val releaseDate : String,
|
||||
@Json(name = "genre_ids")
|
||||
val genreIds : List<Int>,
|
||||
val id : Int,
|
||||
@Json(name = "original_title")
|
||||
val originalTitle : String,
|
||||
@Json(name = "original_language")
|
||||
val originalLanguage : String,
|
||||
val title : String
|
||||
|
||||
|
||||
) {
|
||||
|
||||
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
package fr.iut.pm.movieapplication.network.dtos
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
|
||||
data class PopularDTO(
|
||||
val page : Int,
|
||||
val results : List<MovieDTO>,
|
||||
@Json(name = "total_pages")
|
||||
val totalPages : Int,
|
||||
@Json(name = "total_results")
|
||||
val totalResults : Int
|
||||
) {}
|
@ -1,15 +1,44 @@
|
||||
package fr.iut.pm.movieapplication.repository
|
||||
|
||||
import fr.iut.pm.movieapplication.data.dao.MovieDAO
|
||||
import android.util.Log
|
||||
import fr.iut.pm.movieapplication.api.RetrofitInstance
|
||||
import fr.iut.pm.movieapplication.api.dtos.PopularDTO
|
||||
import fr.iut.pm.movieapplication.model.Movie
|
||||
import fr.iut.pm.movieapplication.network.dtos.MovieDTO
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.combine
|
||||
import kotlinx.coroutines.flow.transform
|
||||
import fr.iut.pm.movieapplication.utils.Constants
|
||||
import fr.iut.pm.movieapplication.utils.Constants.Companion.API_KEY
|
||||
import fr.iut.pm.movieapplication.utils.Mapper
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
import retrofit2.Response
|
||||
|
||||
class MovieRepository() {
|
||||
|
||||
suspend fun getPopularMovies() : List<MovieDTO>{
|
||||
return PopularRepository().getPopular()!!.results
|
||||
fun getPopularMovies(callback: (List<Movie>) -> Unit ) {
|
||||
|
||||
val listMovie : MutableList<Movie> = mutableListOf()
|
||||
|
||||
RetrofitInstance.api.getPopularMovies(API_KEY).enqueue(object :
|
||||
Callback<PopularDTO> {
|
||||
override fun onResponse(call: Call<PopularDTO>, response: Response<PopularDTO>) {
|
||||
if (response.isSuccessful) {
|
||||
Log.d("List :", response.body().toString())
|
||||
val popularDTO = response.body()
|
||||
val listMoviesDTO = popularDTO?.results
|
||||
listMoviesDTO?.forEach {
|
||||
|
||||
val movie = Mapper.MapToMovie(it)
|
||||
listMovie.add(movie)
|
||||
Log.d("Movie ", movie.title!!)
|
||||
}
|
||||
|
||||
}
|
||||
callback(listMovie)
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<PopularDTO>, t: Throwable) {
|
||||
Log.d("Error failure", t.message.toString())
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
}
|
@ -1,46 +1,37 @@
|
||||
package fr.iut.pm.movieapplication.ui.viewmodel
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import fr.iut.pm.movieapplication.network.dtos.MovieDTO
|
||||
import androidx.lifecycle.*
|
||||
import fr.iut.pm.movieapplication.api.dtos.MovieResultDTO
|
||||
import fr.iut.pm.movieapplication.model.Movie
|
||||
import fr.iut.pm.movieapplication.repository.MovieRepository
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
class MoviesVM(private val repository: MovieRepository) : ViewModel() {
|
||||
|
||||
private val _popularMovies = MutableLiveData<List<MovieDTO>>()
|
||||
val popularMovies : MutableLiveData<List<MovieDTO>> = _popularMovies
|
||||
private val _popularMovies = MutableLiveData<List<Movie>>()
|
||||
val popularMovies : LiveData<List<Movie>> = _popularMovies
|
||||
|
||||
init {
|
||||
getPopularMovies()
|
||||
//loadData()
|
||||
}
|
||||
|
||||
|
||||
private fun getPopularMovies() {
|
||||
suspend fun loadData() {
|
||||
viewModelScope.launch {
|
||||
try {
|
||||
_popularMovies.value = repository.getPopularMovies()}
|
||||
catch (e : Exception) {
|
||||
e.stackTrace
|
||||
repository.getPopularMovies { movies ->
|
||||
_popularMovies.value = movies
|
||||
}
|
||||
}.join()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
class MoviesVMFactory(
|
||||
private val repository: MovieRepository
|
||||
) : ViewModelProvider.Factory {
|
||||
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
||||
if (modelClass.isAssignableFrom(MoviesVM::class.java)) {
|
||||
return MoviesVM(repository) as T
|
||||
}
|
||||
throw java.lang.IllegalArgumentException("Unknown ViewModel class")
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package fr.iut.pm.movieapplication.ui.viewmodel
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
|
||||
inline fun <VM : ViewModel> viewModelFactory(crossinline f: () -> VM) =
|
||||
object : ViewModelProvider.Factory {
|
||||
override fun <T : ViewModel> create(modelClass: Class<T>): T = f() as T
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
package fr.iut.pm.movieapplication.utils
|
||||
|
||||
import fr.iut.pm.movieapplication.api.dtos.MovieResultDTO
|
||||
import fr.iut.pm.movieapplication.model.Movie
|
||||
|
||||
object Mapper {
|
||||
|
||||
fun MapToMovie( movieDTO : MovieResultDTO) : Movie {
|
||||
return Movie(
|
||||
adult = movieDTO.adult,
|
||||
posterPath = movieDTO.posterPath,
|
||||
overview = movieDTO.overview,
|
||||
releaseDate = movieDTO.releaseDate,
|
||||
movieId = movieDTO.id,
|
||||
originalTitle = movieDTO.originalTitle,
|
||||
originalLanguage = movieDTO.originalLanguage,
|
||||
title = movieDTO.title,
|
||||
backdropPath = movieDTO.backdropPath,
|
||||
popularity = movieDTO.popularity,
|
||||
voteCount = movieDTO.voteCount,
|
||||
voteAverage = movieDTO.voteAverage,
|
||||
budget = null,
|
||||
genres = null,
|
||||
homePage = null,
|
||||
productionCompanies = null,
|
||||
productionCountries = null,
|
||||
revenue = null,
|
||||
runtime = null,
|
||||
status = null,
|
||||
tagLine = null
|
||||
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in new issue