🚧 add bindings on the home page

features/api/requests/2
Jordan ARTZET 2 years ago
parent 797ce00665
commit bf50751c6f

@ -14,35 +14,35 @@ interface MovieApplicationAPI {
// Movie // Movie
@GET("movie/popular") @GET("movie/popular")
suspend fun getPopularMovies(@Query("api_key") apiKey : String = API_KEY, @Query("page") page : Int = 1) : Response<PopularDTO> suspend fun getPopularMovies(@Query("api_key") apiKey : String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response<PopularDTO>
@GET("movie/now_playing") @GET("movie/now_playing")
suspend fun getNowPlayingMovies(@Query("api_key") apiKey : String = API_KEY, @Query("page") page : Int = 1) : Response<PopularDTO> suspend fun getNowPlayingMovies(@Query("api_key") apiKey : String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response<PopularDTO>
@GET("movie/upcoming") @GET("movie/upcoming")
suspend fun getUpcomingMovies(@Query("api_key") apiKey: String = API_KEY, @Query("page") page : Int = 1) : Response<PopularDTO> suspend fun getUpcomingMovies(@Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response<PopularDTO>
@GET("movie/top_rated") @GET("movie/top_rated")
suspend fun getTopRatedMovies(@Query("api_key") apiKey: String = API_KEY, @Query("page") page : Int = 1) : Response<PopularDTO> suspend fun getTopRatedMovies(@Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response<PopularDTO>
// Movie details // Movie details
@GET("movie/{movie_id}") @GET("movie/{movie_id}")
suspend fun getMovieDetails(@Path("movie_id") movieId : Int, @Query("api_key") apiKey: String = API_KEY) : Response<MovieDetailsDTO> suspend fun getMovieDetails(@Path("movie_id") movieId : Int, @Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr") : Response<MovieDetailsDTO>
// TvShow // TvShow
@GET("tv/popular") @GET("tv/popular")
suspend fun getPopularTvShows(@Query("api_key") apiKey : String = API_KEY, @Query("page") page : Int = 1) : Response<PopularDTO> suspend fun getPopularTvShows(@Query("api_key") apiKey : String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response<PopularDTO>
@GET("tv/airing_today") @GET("tv/airing_today")
suspend fun getAiringTodayTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("page") page : Int = 1) : Response<PopularDTO> suspend fun getAiringTodayTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response<PopularDTO>
@GET("tv/on_the_air") @GET("tv/on_the_air")
suspend fun getTvOnTheAirTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("page") page : Int = 1) : Response<PopularDTO> suspend fun getTvOnTheAirTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response<PopularDTO>
@GET("tv/top_rated") @GET("tv/top_rated")
suspend fun getTopRatedTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("page") page : Int = 1) : Response<PopularDTO> suspend fun getTopRatedTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response<PopularDTO>
@GET("trending/{media_type}/{time_window}") @GET("trending/{media_type}/{time_window}")
fun getTrending(@Path("media_type") mediaType : String = "all", @Path("time_window") timeWindow : String = "day", @Query("api_key") apiKey: String = API_KEY ) : Call<PopularDTO> suspend fun getTrending(@Path("media_type") mediaType : String = "all", @Path("time_window") timeWindow : String = "day", @Query("api_key") apiKey: String = API_KEY ) : Response<PopularDTO>
@GET("tv/{tv_id}") @GET("tv/{tv_id}")

@ -20,10 +20,10 @@ open class MediaResultDTO(
// val genreIds : List<Int>, // val genreIds : List<Int>,
val id : Int, val id : Int,
@Json(name = "original_title") @Json(name = "original_title")
val originalTitle : String = "", val originalTitle : String? = null,
@Json(name = "original_language") @Json(name = "original_language")
val originalLanguage : String, val originalLanguage : String,
val title : String = "", val title : String? = null,
@Json(name = "backdrop_path") @Json(name = "backdrop_path")
val backdropPath : String?, val backdropPath : String?,
val popularity : Double, val popularity : Double,

@ -3,7 +3,7 @@ package fr.iut.pm.movieapplication.model.media
data class MediaResult( data class MediaResult(
val posterPath: String? = null, val posterPath: String? = null,
val adult: Boolean, val adult: Boolean?,
val overview: String, val overview: String,
val releaseDate: String, val releaseDate: String,
val originCountry: List<String>? = null, val originCountry: List<String>? = null,

@ -2,35 +2,70 @@ package fr.iut.pm.movieapplication.repository
import android.util.Log import android.util.Log
import fr.iut.pm.movieapplication.api.RetrofitInstance import fr.iut.pm.movieapplication.api.RetrofitInstance
import fr.iut.pm.movieapplication.api.dtos.PopularDTO
import fr.iut.pm.movieapplication.model.media.MediaResult import fr.iut.pm.movieapplication.model.media.MediaResult
import fr.iut.pm.movieapplication.utils.MediaResultMapper import fr.iut.pm.movieapplication.utils.MediaResultMapper
import retrofit2.Call import kotlinx.coroutines.Dispatchers
import retrofit2.Callback import kotlinx.coroutines.withContext
import retrofit2.Response
class MediaRepository { class MediaRepository {
fun getTrends(callback: (List<MediaResult>) -> Unit) { suspend fun getTrends() : List<MediaResult> = withContext(Dispatchers.IO) {
val listMovie : MutableList<MediaResult> = mutableListOf() val listMediaResult : MutableList<MediaResult> = mutableListOf()
RetrofitInstance.api.getTrending().enqueue(object : Callback<PopularDTO> { val response = RetrofitInstance.api.getTrending()
override fun onResponse(call: Call<PopularDTO>, response: Response<PopularDTO>) { if(response.isSuccessful) {
if(response.isSuccessful) {
Log.d("Response",response.body().toString()) val listMediaResultDTO = response.body()?.results
val popularDTO = response.body() Log.d("Response",response.body().toString())
popularDTO?.results?.forEach { listMediaResultDTO?.forEach {
val movie = MediaResultMapper.mapToMediaResult(it)
listMovie.add(movie) val mediaResult = MediaResultMapper.mapToMediaResult(it)
movie.title?.let { it1 -> Log.d("Movie", it1) } listMediaResult.add(mediaResult)
mediaResult.title?.let { it1 -> Log.d("Movie", it1) }
} }
} }
callback(listMovie) else Log.d("ERROR FAILED", response.message())
listMediaResult
}
suspend fun getPopularMovies() : List<MediaResult> = withContext(Dispatchers.IO) {
val listMediaResult : MutableList<MediaResult> = mutableListOf()
val response = RetrofitInstance.api.getPopularMovies()
if(response.isSuccessful) {
val listMediaResultDTO = response.body()?.results
Log.d("Response",response.body().toString())
listMediaResultDTO?.forEach {
val mediaResult = MediaResultMapper.mapToMediaResult(it)
listMediaResult.add(mediaResult)
mediaResult.title?.let { it1 -> Log.d("Movie", it1) }
} }
}
else Log.d("ERROR FAILED", response.message())
listMediaResult
}
suspend fun getPopularTvShows(): List<MediaResult> = withContext(Dispatchers.IO) {
val listMediaResult : MutableList<MediaResult> = mutableListOf()
val response = RetrofitInstance.api.getPopularTvShows()
if(response.isSuccessful) {
val listMediaResultDTO = response.body()?.results
Log.d("Response",response.body().toString())
listMediaResultDTO?.forEach {
val mediaResult = MediaResultMapper.mapToMediaResult(it)
listMediaResult.add(mediaResult)
mediaResult.title?.let { it1 -> Log.d("Movie", it1) }
override fun onFailure(call: Call<PopularDTO>, t: Throwable) {
Log.d("Error failure", t.printStackTrace().toString())
} }
}) }
else Log.d("ERROR FAILED", response.message())
listMediaResult
} }
} }

@ -17,8 +17,6 @@ import fr.iut.pm.movieapplication.ui.fragments.TvShowsFragment
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
val mediaRepository : MediaRepository = MediaRepository()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
@ -46,14 +44,6 @@ class MainActivity : AppCompatActivity() {
else -> false else -> false
} }
} }
if(Build.VERSION.SDK_INT < 33) {
// Hide the status bar.
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
actionBar?.hide()
}
} }
override fun onCreateOptionsMenu(menu: Menu?): Boolean { override fun onCreateOptionsMenu(menu: Menu?): Boolean {
@ -65,7 +55,10 @@ class MainActivity : AppCompatActivity() {
searchView.setOnQueryTextListener( object : SearchView.OnQueryTextListener { searchView.setOnQueryTextListener( object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean { override fun onQueryTextSubmit(query: String?): Boolean {
return false if(!query.isNullOrEmpty()) {
}
return true;
} }
override fun onQueryTextChange(newText: String?): Boolean { override fun onQueryTextChange(newText: String?): Boolean {

@ -2,64 +2,39 @@ package fr.iut.pm.movieapplication.ui.adapter
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import coil.load import coil.load
import fr.iut.pm.movieapplication.R import fr.iut.pm.movieapplication.databinding.ItemHorizontalHomePageBinding
import fr.iut.pm.movieapplication.api.config.GlobalImageConfig
import fr.iut.pm.movieapplication.model.media.MediaResult import fr.iut.pm.movieapplication.model.media.MediaResult
import fr.iut.pm.movieapplication.ui.activity.MainActivity import fr.iut.pm.movieapplication.ui.interfaces.MovieSelection
import fr.iut.pm.movieapplication.utils.Constants.Companion.IMG_URL import fr.iut.pm.movieapplication.utils.Constants
class MediaAdapter( class MediaAdapter(private val listener : MovieSelection): ListAdapter<MediaResult, MediaAdapter.ViewHolder>(DiffUtilMediaCallback) {
private val context: MainActivity,
private val layoutId: Int,
private val list: List<MediaResult>
) : RecyclerView.Adapter<MediaAdapter.ViewHolder>() {
class ViewHolder(view : View) : RecyclerView.ViewHolder(view) { private object DiffUtilMediaCallback : DiffUtil.ItemCallback<MediaResult>() {
val itemImage: ImageView = view.findViewById<ImageView>(R.id.item_image) override fun areItemsTheSame(oldItem: MediaResult, newItem: MediaResult) = oldItem.id == newItem.id
val itemName: TextView = view.findViewById<TextView>(R.id.item_name) override fun areContentsTheSame(oldItem: MediaResult, newItem: MediaResult) = oldItem == newItem
val itemDate: TextView = view.findViewById<TextView>(R.id.item_date)
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { class ViewHolder(private val binding : ItemHorizontalHomePageBinding, listener: MovieSelection)
val view = LayoutInflater : RecyclerView.ViewHolder(binding.root) {
.from(parent.context)
.inflate(layoutId, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val currentItem = list[position] val mediaResult : MediaResult? get() = binding.mediaResult
bindItem(holder, currentItem)
val imgUri = currentItem.posterPath?.let {
(IMG_URL + it).toUri().buildUpon().scheme("https").build()
}
Log.d("SINGLETON", imgUri.toString() )
holder.itemImage.load(imgUri)
holder.itemView.setOnClickListener { fun bind(mediaResult : MediaResult) {
onItemClick(currentItem) binding.mediaResult = mediaResult
val imgUri = mediaResult.posterPath?.let { (Constants.IMG_URL +it).toUri().buildUpon().scheme("https").build() }
binding.itemImage.load(imgUri)
binding.executePendingBindings()
} }
}
// If the item is a Movie
private fun bindItem(holder: ViewHolder, currentItem: MediaResult) {
holder.itemName.text = currentItem.title
holder.itemDate.text = currentItem.releaseDate
} }
private fun onItemClick(item : MediaResult) {
Log.d("item clicked", item.toString())
}
override fun getItemCount(): Int = list.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
ViewHolder(ItemHorizontalHomePageBinding.inflate(LayoutInflater.from(parent.context)), listener)
override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(getItem(position))
} }

@ -10,6 +10,7 @@ import coil.load
import fr.iut.pm.movieapplication.databinding.ItemMovieCategoryBinding import fr.iut.pm.movieapplication.databinding.ItemMovieCategoryBinding
import fr.iut.pm.movieapplication.model.media.movie.Movie import fr.iut.pm.movieapplication.model.media.movie.Movie
import fr.iut.pm.movieapplication.ui.dialog.MovieDialog import fr.iut.pm.movieapplication.ui.dialog.MovieDialog
import fr.iut.pm.movieapplication.ui.interfaces.MovieSelection
import fr.iut.pm.movieapplication.utils.Constants import fr.iut.pm.movieapplication.utils.Constants
class MovieAdapter(private val listener : MovieSelection) : ListAdapter<Movie, MovieAdapter.ViewHolder>(DiffUtilMovieCallback) { class MovieAdapter(private val listener : MovieSelection) : ListAdapter<Movie, MovieAdapter.ViewHolder>(DiffUtilMovieCallback) {
@ -29,7 +30,6 @@ class MovieAdapter(private val listener : MovieSelection) : ListAdapter<Movie, M
listener.onMovieSelected(movie?.id ?: 0) listener.onMovieSelected(movie?.id ?: 0)
} }
} }
fun bind(movie : Movie) { fun bind(movie : Movie) {
binding.movie = movie binding.movie = movie
val imgUri = movie.posterPath?.let { (Constants.IMG_URL +it).toUri().buildUpon().scheme("https").build() } val imgUri = movie.posterPath?.let { (Constants.IMG_URL +it).toUri().buildUpon().scheme("https").build() }
@ -40,11 +40,6 @@ class MovieAdapter(private val listener : MovieSelection) : ListAdapter<Movie, M
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
ViewHolder(ItemMovieCategoryBinding.inflate(LayoutInflater.from(parent.context, )), listener) ViewHolder(ItemMovieCategoryBinding.inflate(LayoutInflater.from(parent.context)), listener)
override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(getItem(position)) override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(getItem(position))
interface MovieSelection {
fun onMovieSelected(movieId : Int)
}
} }

@ -0,0 +1,4 @@
package fr.iut.pm.movieapplication.ui.adapter
class SearchResultAdapter {
}

@ -5,39 +5,70 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView import androidx.fragment.app.viewModels
import fr.iut.pm.movieapplication.R import fr.iut.pm.movieapplication.databinding.FragmentHomeSectionsBinding
import fr.iut.pm.movieapplication.ui.activity.MainActivity import fr.iut.pm.movieapplication.ui.activity.MainActivity
import fr.iut.pm.movieapplication.ui.adapter.MediaAdapter import fr.iut.pm.movieapplication.ui.adapter.MediaAdapter
import fr.iut.pm.movieapplication.ui.adapter.HomeItemDecoration import fr.iut.pm.movieapplication.ui.adapter.HomeItemDecoration
import fr.iut.pm.movieapplication.ui.interfaces.MovieSelection
import fr.iut.pm.movieapplication.ui.viewmodel.HomeSectionsVM import fr.iut.pm.movieapplication.ui.viewmodel.HomeSectionsVM
class HomeSectionsFragment( class HomeSectionsFragment(
private val context : MainActivity private val context : MainActivity
) : Fragment() { ) : Fragment(), MovieSelection {
private lateinit var homeSectionsViewModel : HomeSectionsVM private val homeSectionsVM by viewModels<HomeSectionsVM>()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { private val trendsAdapter = MediaAdapter(this)
val view = inflater.inflate(R.layout.fragment_home_sections, container, false) private val popularMoviesAdapter = MediaAdapter(this)
private val popularTvShowsAdapter = MediaAdapter(this)
//get the trends RecyclerView override fun onCreateView(
context.mediaRepository.getTrends { inflater: LayoutInflater, container: ViewGroup?,
val homeTrendsRecyclerView = view?.findViewById<RecyclerView>(R.id.home_trends_recycler_view) savedInstanceState: Bundle?)
homeTrendsRecyclerView?.adapter = MediaAdapter(context,R.layout.item_horizontal_home_page,it) : View? {
homeTrendsRecyclerView?.addItemDecoration(HomeItemDecoration())
val binding = FragmentHomeSectionsBinding.inflate(inflater)
binding.homeSectionsVM = homeSectionsVM
binding.lifecycleOwner = viewLifecycleOwner
with(binding.homeTrendsRecyclerView) {
adapter = trendsAdapter
addItemDecoration(HomeItemDecoration())
}
with(binding.homePopularMoviesRecyclerView) {
adapter = popularMoviesAdapter
addItemDecoration(HomeItemDecoration())
}
with(binding.homePopularTvShowsRecyclerView) {
adapter = popularTvShowsAdapter
addItemDecoration(HomeItemDecoration())
}
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
homeSectionsVM.getTrendsLiveData().observe(viewLifecycleOwner) {
trendsAdapter.submitList(it)
} }
//get the popularity RecyclerView homeSectionsVM.getPopularMoviesLiveData().observe(viewLifecycleOwner) {
// context.movieRepository.getPopularMovies { popularMoviesAdapter.submitList(it)
// val homePopularityRecyclerView = view?.findViewById<RecyclerView>(R.id.home_popularity_recycler_view) }
// homePopularityRecyclerView?.adapter = CategoryAdapter(context,R.layout.item_horizontal_home_page,it)
// homePopularityRecyclerView?.addItemDecoration(HomeItemDecoration()) homeSectionsVM.getPopularTvShowsLiveData().observe(viewLifecycleOwner) {
// } popularTvShowsAdapter.submitList(it)
//get the free RecyclerView }
val homeFreeRecyclerView = view?.findViewById<RecyclerView>(R.id.home_free_recycler_view) }
homeFreeRecyclerView?.adapter = MediaAdapter(context,R.layout.item_horizontal_home_page,ArrayList())
homeFreeRecyclerView?.addItemDecoration(HomeItemDecoration()) override fun onMovieSelected(movieId: Int) {
return view TODO("Not yet implemented")
} }
} }

@ -12,10 +12,11 @@ import fr.iut.pm.movieapplication.R
import fr.iut.pm.movieapplication.databinding.FragmentMoviesBinding import fr.iut.pm.movieapplication.databinding.FragmentMoviesBinding
import fr.iut.pm.movieapplication.ui.adapter.MovieAdapter import fr.iut.pm.movieapplication.ui.adapter.MovieAdapter
import fr.iut.pm.movieapplication.ui.dialog.MovieDialog import fr.iut.pm.movieapplication.ui.dialog.MovieDialog
import fr.iut.pm.movieapplication.ui.interfaces.MovieSelection
import fr.iut.pm.movieapplication.ui.viewmodel.MoviesVM import fr.iut.pm.movieapplication.ui.viewmodel.MoviesVM
class MoviesFragment( class MoviesFragment(
) : Fragment(), MovieAdapter.MovieSelection { ) : Fragment(), MovieSelection {
private val moviesVM by viewModels<MoviesVM>() private val moviesVM by viewModels<MoviesVM>()
val moviesAdapter = MovieAdapter(this) val moviesAdapter = MovieAdapter(this)

@ -0,0 +1,23 @@
package fr.iut.pm.movieapplication.ui.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import fr.iut.pm.movieapplication.ui.viewmodel.SearchResultVM
import fr.iut.pm.movieapplication.ui.viewmodel.SearchResultVMFactory
class SearchResultFragment : Fragment() {
private val searchResultViewModel by viewModels<SearchResultVM> { SearchResultVMFactory(arguments?.getString("query")!!) }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return super.onCreateView(inflater, container, savedInstanceState)
}
}

@ -0,0 +1,6 @@
package fr.iut.pm.movieapplication.ui.interfaces
interface MovieSelection {
fun onMovieSelected(movieId : Int)
}

@ -1,4 +1,33 @@
package fr.iut.pm.movieapplication.ui.viewmodel package fr.iut.pm.movieapplication.ui.viewmodel
class HomeSectionsVM { import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import fr.iut.pm.movieapplication.model.media.MediaResult
import fr.iut.pm.movieapplication.repository.MediaRepository
import kotlinx.coroutines.launch
class HomeSectionsVM : ViewModel() {
private val repository = MediaRepository()
private var _trendsLiveData : MutableLiveData<List<MediaResult>> = MutableLiveData()
fun getTrendsLiveData() : MutableLiveData<List<MediaResult>> = _trendsLiveData
private var _popularMoviesLiveData : MutableLiveData<List<MediaResult>> = MutableLiveData()
fun getPopularMoviesLiveData() : MutableLiveData<List<MediaResult>> = _popularMoviesLiveData
private var _popularTvShowsLiveData : MutableLiveData<List<MediaResult>> = MutableLiveData()
fun getPopularTvShowsLiveData() : MutableLiveData<List<MediaResult>> = _popularTvShowsLiveData
init {
viewModelScope.launch {
_trendsLiveData.postValue(repository.getTrends())
_popularMoviesLiveData.postValue(repository.getPopularMovies())
_popularTvShowsLiveData.postValue(repository.getPopularTvShows())
}
}
} }

@ -0,0 +1,23 @@
package fr.iut.pm.movieapplication.ui.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
class SearchResultVM(private var query : String) : ViewModel() {
private var _queryLiveData : MutableLiveData<String> = MutableLiveData()
fun getQueryLiveData() : LiveData<String> = _queryLiveData
init {
_queryLiveData.postValue(query)
}
}
class SearchResultVMFactory(private var query : String) : ViewModelProvider.Factory
{
override fun<T:ViewModel>create(modelClass:Class<T>) : T
{
return SearchResultVM(query) as T
}
}

@ -32,14 +32,14 @@ object MediaResultMapper {
fun mapToMovie(mediaResultDTO: MediaResultDTO): Movie { fun mapToMovie(mediaResultDTO: MediaResultDTO): Movie {
return Movie( return Movie(
posterPath = mediaResultDTO.posterPath, posterPath = mediaResultDTO.posterPath,
adult = mediaResultDTO.adult!!, adult = mediaResultDTO.adult,
overview = mediaResultDTO.overview ?: "", overview = mediaResultDTO.overview ?: "",
releaseDate = mediaResultDTO.releaseDate ?: "", releaseDate = mediaResultDTO.releaseDate ?: "",
// genreIds = mediaResultDTO.genreIds, // genreIds = mediaResultDTO.genreIds,
id = mediaResultDTO.id, id = mediaResultDTO.id,
originalTitle = mediaResultDTO.originalTitle!!, originalTitle = mediaResultDTO.originalTitle!!,
originalLanguage = mediaResultDTO.originalLanguage, originalLanguage = mediaResultDTO.originalLanguage,
title = mediaResultDTO.title, title = mediaResultDTO.title!!,
backdropPath = mediaResultDTO.backdropPath, backdropPath = mediaResultDTO.backdropPath,
popularity = mediaResultDTO.popularity, popularity = mediaResultDTO.popularity,
voteCount = mediaResultDTO.voteCount, voteCount = mediaResultDTO.voteCount,
@ -51,7 +51,7 @@ object MediaResultMapper {
fun mapToMediaResult(mediaResultDTO: MediaResultDTO) : MediaResult { fun mapToMediaResult(mediaResultDTO: MediaResultDTO) : MediaResult {
return MediaResult( return MediaResult(
posterPath = mediaResultDTO.posterPath, posterPath = mediaResultDTO.posterPath,
adult = mediaResultDTO.adult!!, adult = mediaResultDTO.adult,
overview = mediaResultDTO.overview ?: "", overview = mediaResultDTO.overview ?: "",
releaseDate = mediaResultDTO.releaseDate ?: mediaResultDTO.firstAirDate!! , releaseDate = mediaResultDTO.releaseDate ?: mediaResultDTO.firstAirDate!! ,
originCountry = mediaResultDTO.originCountry, originCountry = mediaResultDTO.originCountry,

@ -1,69 +1,86 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" <data>
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:contentDescription="@string/section_nested_scroll_view">
<LinearLayout <import type="android.view.View" />
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView <variable
android:id="@+id/home_page_trends_section_title" name="homeSectionsVM"
android:layout_width="match_parent" type="fr.iut.pm.movieapplication.ui.viewmodel.HomeSectionsVM" />
android:layout_height="wrap_content"
android:text="@string/home_page_trends_section_title"
android:layout_marginLeft="@dimen/default_margin"
android:layout_marginStart="@dimen/default_margin"
android:layout_marginTop="@dimen/default_margin"
style="@style/SectionTitleStyle"
/>
<androidx.recyclerview.widget.RecyclerView </data>
android:id="@+id/home_trends_recycler_view"
android:layout_width="match_parent"
android:layout_height="250dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<TextView <androidx.core.widget.NestedScrollView
android:id="@+id/home_page_popularity_section_title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/home_page_popularity_section_title" android:contentDescription="@string/section_nested_scroll_view">
android:layout_marginLeft="@dimen/default_margin"
android:layout_marginStart="@dimen/default_margin"
android:layout_marginTop="@dimen/default_margin"
style="@style/SectionTitleStyle" />
<androidx.recyclerview.widget.RecyclerView <LinearLayout
android:id="@+id/home_popularity_recycler_view" android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="250dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
<TextView
android:id="@+id/home_page_free_section_title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/home_page_free_section_title" >
android:layout_marginLeft="@dimen/default_margin"
android:layout_marginStart="@dimen/default_margin" <TextView
android:layout_marginTop="@dimen/default_margin" android:id="@+id/home_page_trends_section_title"
style="@style/SectionTitleStyle" /> android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/home_page_trends_section_title"
android:layout_marginLeft="@dimen/default_margin"
android:layout_marginStart="@dimen/default_margin"
android:layout_marginTop="@dimen/default_margin"
style="@style/SectionTitleStyle"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_trends_recycler_view"
android:layout_width="match_parent"
android:layout_height="250dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_vertical_fragment" />
<TextView
android:id="@+id/home_page_popularity_section_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/home_page_popular_movies_section_title"
android:layout_marginLeft="@dimen/default_margin"
android:layout_marginStart="@dimen/default_margin"
android:layout_marginTop="@dimen/default_margin"
style="@style/SectionTitleStyle" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_popular_movies_recycler_view"
android:layout_width="match_parent"
android:layout_height="250dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_vertical_fragment" />
<TextView
android:id="@+id/home_page_free_section_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/home_page_popular_tv_shows_section_title"
android:layout_marginLeft="@dimen/default_margin"
android:layout_marginStart="@dimen/default_margin"
android:layout_marginTop="@dimen/default_margin"
style="@style/SectionTitleStyle" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_popular_tv_shows_recycler_view"
android:layout_width="match_parent"
android:layout_height="250dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_free_recycler_view"
android:layout_width="match_parent"
android:layout_height="250dp"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
/>
</LinearLayout>
</androidx.core.widget.NestedScrollView> </layout>

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
<variable
name="searchResultsVM"
type="fr.iut.pm.movieapplication.ui.viewmodel.SearchResultVM" />
</data>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/search_results_item_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/default_margin"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
tools:listitem="@layout/item_vertical_fragment" />
</LinearLayout>
</layout>

@ -1,45 +1,51 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools">
android:layout_width="150dp"
android:layout_height="match_parent" <data>
android:layout_marginTop="10dp"> <variable
name="mediaResult"
<androidx.cardview.widget.CardView type="fr.iut.pm.movieapplication.model.media.MediaResult" />
android:id="@+id/cardView" </data>
android:layout_width="match_parent"
android:layout_height="200dp" <LinearLayout
app:cardCornerRadius="5dp" android:layout_width="150dp"
app:layout_constraintEnd_toEndOf="parent" android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent" android:orientation="vertical" >
app:layout_constraintTop_toTopOf="parent">
<androidx.cardview.widget.CardView
<ImageView android:id="@+id/cardView"
android:id="@+id/item_image" android:layout_width="150dp"
android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/black" app:cardCornerRadius="5dp">
android:scaleType="centerCrop" />
<ImageView
android:id="@+id/item_image"
android:layout_width="match_parent"
android:layout_height="210dp"
android:background="@color/black"
android:scaleType="centerCrop"
android:contentDescription="description" />
</androidx.cardview.widget.CardView>
<TextView </androidx.cardview.widget.CardView>
android:id="@+id/item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cardView" />
<TextView <TextView
android:id="@+id/item_date" android:id="@+id/item_name"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="20dp"
app:layout_constraintEnd_toEndOf="parent" android:layout_gravity="center"
app:layout_constraintStart_toStartOf="parent" android:textAlignment="center"
app:layout_constraintTop_toBottomOf="@+id/item_name" /> android:text="@{mediaResult.title}"/>
<TextView
android:id="@+id/item_date"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_gravity="center"
android:textAlignment="center"
android:text="@{mediaResult.releaseDate}"/>
</androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout>
</layout>

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" > xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data> <data>
@ -10,7 +11,7 @@
</data> </data>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto" <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@ -45,18 +46,10 @@
<TextView <TextView
android:id="@+id/item_name" android:id="@+id/item_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="20dp" android:layout_height="40dp"
android:layout_gravity="center" android:layout_gravity="center"
android:textAlignment="center" android:textAlignment="center"
android:text="@{movie.title}"/> android:text="@{movie.title.length() > 20 ? movie.title.substring(0,20) + `...` : movie.title}"/>
<TextView
android:id="@+id/item_date"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_gravity="center"
android:textAlignment="center"
android:text="@{movie.releaseDate}"/>
</LinearLayout> </LinearLayout>
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>

@ -48,7 +48,7 @@
android:layout_height="20dp" android:layout_height="20dp"
android:layout_gravity="center" android:layout_gravity="center"
android:textAlignment="center" android:textAlignment="center"
android:text="@{tvShow.name}"/> android:text="@{tvShow.name.length() > 20 ? tvShow.name.substring(0,20) + `...` : tvShow.name }"/>
<TextView <TextView
android:id="@+id/item_date" android:id="@+id/item_date"

@ -21,7 +21,7 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<ImageView <ImageView

@ -61,7 +61,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:text="@{movieDetails.overview}" android:text="@{movieDetails.overview.length() > 150 ? movieDetails.overview.substring(0, 150) + `...` : movieDetails.overview}"
android:textAlignment="center" android:textAlignment="center"
app:layout_constraintBottom_toTopOf="@+id/button" app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

@ -10,8 +10,8 @@
<string name="home_page_title">Bienvenue,</string> <string name="home_page_title">Bienvenue,</string>
<string name="home_page_subtitle">Des millions de films, émissions télévisées et artistes…</string> <string name="home_page_subtitle">Des millions de films, émissions télévisées et artistes…</string>
<string name="home_page_trends_section_title">Tendances</string> <string name="home_page_trends_section_title">Tendances</string>
<string name="home_page_popularity_section_title">Populaires</string> <string name="home_page_popular_movies_section_title">Films populaires</string>
<string name="home_page_free_section_title">Gratuits</string> <string name="home_page_popular_tv_shows_section_title">Séries populaires</string>
<string name="section_nested_scroll_view">section_nested_scroll_view</string> <string name="section_nested_scroll_view">section_nested_scroll_view</string>
<!-- Filter name for movie category --> <!-- Filter name for movie category -->

Loading…
Cancel
Save