From bf50751c6ffe97e71bb40bb49cd3cac01e59fd1a Mon Sep 17 00:00:00 2001 From: Jordan Artzet Date: Sun, 12 Feb 2023 16:42:20 +0100 Subject: [PATCH] :construction: add bindings on the home page --- .../api/MovieApplicationAPI.kt | 20 +-- .../api/dtos/MediaResultDTO.kt | 4 +- .../model/media/MediaResult.kt | 2 +- .../repository/MediaRepository.kt | 77 ++++++++--- .../ui/activity/MainActivity.kt | 15 +- .../ui/adapter/MediaAdapter.kt | 65 +++------ .../ui/adapter/MovieAdapter.kt | 9 +- .../ui/adapter/SearchResultAdapter.kt | 4 + .../ui/fragments/HomeSectionsFragment.kt | 75 +++++++--- .../ui/fragments/MoviesFragment.kt | 3 +- .../ui/fragments/SearchResultFragment.kt | 23 ++++ .../ui/interfaces/MovieSelection.kt | 6 + .../ui/viewmodel/HomeSectionsVM.kt | 31 ++++- .../ui/viewmodel/SearchResultVM.kt | 23 ++++ .../utils/MediaResultMapper.kt | 6 +- .../res/layout/fragment_home_sections.xml | 129 ++++++++++-------- .../res/layout/fragment_search_results.xml | 35 +++++ .../res/layout/item_horizontal_home_page.xml | 80 ++++++----- .../main/res/layout/item_movie_category.xml | 17 +-- .../main/res/layout/item_tv_show_category.xml | 2 +- .../res/layout/item_vertical_fragment.xml | 2 +- .../app/src/main/res/layout/movie_dialog.xml | 2 +- Sources/app/src/main/res/values/strings.xml | 4 +- 23 files changed, 400 insertions(+), 234 deletions(-) create mode 100644 Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/adapter/SearchResultAdapter.kt create mode 100644 Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/fragments/SearchResultFragment.kt create mode 100644 Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/interfaces/MovieSelection.kt create mode 100644 Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/viewmodel/SearchResultVM.kt create mode 100644 Sources/app/src/main/res/layout/fragment_search_results.xml diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/api/MovieApplicationAPI.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/api/MovieApplicationAPI.kt index 8617fdd..e08f7f5 100644 --- a/Sources/app/src/main/java/fr/iut/pm/movieapplication/api/MovieApplicationAPI.kt +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/api/MovieApplicationAPI.kt @@ -14,35 +14,35 @@ interface MovieApplicationAPI { // Movie @GET("movie/popular") - suspend fun getPopularMovies(@Query("api_key") apiKey : String = API_KEY, @Query("page") page : Int = 1) : Response + suspend fun getPopularMovies(@Query("api_key") apiKey : String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response @GET("movie/now_playing") - suspend fun getNowPlayingMovies(@Query("api_key") apiKey : String = API_KEY, @Query("page") page : Int = 1) : Response + suspend fun getNowPlayingMovies(@Query("api_key") apiKey : String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response @GET("movie/upcoming") - suspend fun getUpcomingMovies(@Query("api_key") apiKey: String = API_KEY, @Query("page") page : Int = 1) : Response + suspend fun getUpcomingMovies(@Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response @GET("movie/top_rated") - suspend fun getTopRatedMovies(@Query("api_key") apiKey: String = API_KEY, @Query("page") page : Int = 1) : Response + suspend fun getTopRatedMovies(@Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response // Movie details @GET("movie/{movie_id}") - suspend fun getMovieDetails(@Path("movie_id") movieId : Int, @Query("api_key") apiKey: String = API_KEY) : Response + suspend fun getMovieDetails(@Path("movie_id") movieId : Int, @Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr") : Response // TvShow @GET("tv/popular") - suspend fun getPopularTvShows(@Query("api_key") apiKey : String = API_KEY, @Query("page") page : Int = 1) : Response + suspend fun getPopularTvShows(@Query("api_key") apiKey : String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response @GET("tv/airing_today") - suspend fun getAiringTodayTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("page") page : Int = 1) : Response + suspend fun getAiringTodayTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response @GET("tv/on_the_air") - suspend fun getTvOnTheAirTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("page") page : Int = 1) : Response + suspend fun getTvOnTheAirTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response @GET("tv/top_rated") - suspend fun getTopRatedTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("page") page : Int = 1) : Response + suspend fun getTopRatedTvShows(@Query("api_key") apiKey: String = API_KEY, @Query("language") language : String = "fr", @Query("page") page : Int = 1) : Response @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 + suspend fun getTrending(@Path("media_type") mediaType : String = "all", @Path("time_window") timeWindow : String = "day", @Query("api_key") apiKey: String = API_KEY ) : Response @GET("tv/{tv_id}") diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/api/dtos/MediaResultDTO.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/api/dtos/MediaResultDTO.kt index d5348c1..2f1029f 100644 --- a/Sources/app/src/main/java/fr/iut/pm/movieapplication/api/dtos/MediaResultDTO.kt +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/api/dtos/MediaResultDTO.kt @@ -20,10 +20,10 @@ open class MediaResultDTO( // val genreIds : List, val id : Int, @Json(name = "original_title") - val originalTitle : String = "", + val originalTitle : String? = null, @Json(name = "original_language") val originalLanguage : String, - val title : String = "", + val title : String? = null, @Json(name = "backdrop_path") val backdropPath : String?, val popularity : Double, diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/model/media/MediaResult.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/model/media/MediaResult.kt index d9c8594..ef3a9a2 100644 --- a/Sources/app/src/main/java/fr/iut/pm/movieapplication/model/media/MediaResult.kt +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/model/media/MediaResult.kt @@ -3,7 +3,7 @@ package fr.iut.pm.movieapplication.model.media data class MediaResult( val posterPath: String? = null, - val adult: Boolean, + val adult: Boolean?, val overview: String, val releaseDate: String, val originCountry: List? = null, diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/repository/MediaRepository.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/repository/MediaRepository.kt index d4f9501..2b9b632 100644 --- a/Sources/app/src/main/java/fr/iut/pm/movieapplication/repository/MediaRepository.kt +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/repository/MediaRepository.kt @@ -2,35 +2,70 @@ package fr.iut.pm.movieapplication.repository 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.media.MediaResult import fr.iut.pm.movieapplication.utils.MediaResultMapper -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext class MediaRepository { - fun getTrends(callback: (List) -> Unit) { - val listMovie : MutableList = mutableListOf() - - RetrofitInstance.api.getTrending().enqueue(object : Callback { - override fun onResponse(call: Call, response: Response) { - if(response.isSuccessful) { - Log.d("Response",response.body().toString()) - val popularDTO = response.body() - popularDTO?.results?.forEach { - val movie = MediaResultMapper.mapToMediaResult(it) - listMovie.add(movie) - movie.title?.let { it1 -> Log.d("Movie", it1) } + suspend fun getTrends() : List = withContext(Dispatchers.IO) { + val listMediaResult : MutableList = mutableListOf() + + val response = RetrofitInstance.api.getTrending() + 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) } + } - } - callback(listMovie) + } + else Log.d("ERROR FAILED", response.message()) + listMediaResult + } + + suspend fun getPopularMovies() : List = withContext(Dispatchers.IO) { + val listMediaResult : MutableList = 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 = withContext(Dispatchers.IO) { + val listMediaResult : MutableList = 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, t: Throwable) { - Log.d("Error failure", t.printStackTrace().toString()) } - }) + } + else Log.d("ERROR FAILED", response.message()) + listMediaResult } } \ No newline at end of file diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/activity/MainActivity.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/activity/MainActivity.kt index fa38ab8..d741285 100644 --- a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/activity/MainActivity.kt +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/activity/MainActivity.kt @@ -17,8 +17,6 @@ import fr.iut.pm.movieapplication.ui.fragments.TvShowsFragment class MainActivity : AppCompatActivity() { - val mediaRepository : MediaRepository = MediaRepository() - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) @@ -46,14 +44,6 @@ class MainActivity : AppCompatActivity() { 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 { @@ -65,7 +55,10 @@ class MainActivity : AppCompatActivity() { searchView.setOnQueryTextListener( object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String?): Boolean { - return false + if(!query.isNullOrEmpty()) { + + } + return true; } override fun onQueryTextChange(newText: String?): Boolean { diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/adapter/MediaAdapter.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/adapter/MediaAdapter.kt index bfa49cd..ec130b5 100644 --- a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/adapter/MediaAdapter.kt +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/adapter/MediaAdapter.kt @@ -2,64 +2,39 @@ package fr.iut.pm.movieapplication.ui.adapter import android.util.Log import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import android.widget.ImageView -import android.widget.TextView import androidx.core.net.toUri +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import coil.load -import fr.iut.pm.movieapplication.R -import fr.iut.pm.movieapplication.api.config.GlobalImageConfig +import fr.iut.pm.movieapplication.databinding.ItemHorizontalHomePageBinding import fr.iut.pm.movieapplication.model.media.MediaResult -import fr.iut.pm.movieapplication.ui.activity.MainActivity -import fr.iut.pm.movieapplication.utils.Constants.Companion.IMG_URL +import fr.iut.pm.movieapplication.ui.interfaces.MovieSelection +import fr.iut.pm.movieapplication.utils.Constants -class MediaAdapter( - private val context: MainActivity, - private val layoutId: Int, - private val list: List - ) : RecyclerView.Adapter() { +class MediaAdapter(private val listener : MovieSelection): ListAdapter(DiffUtilMediaCallback) { - class ViewHolder(view : View) : RecyclerView.ViewHolder(view) { - val itemImage: ImageView = view.findViewById(R.id.item_image) - val itemName: TextView = view.findViewById(R.id.item_name) - val itemDate: TextView = view.findViewById(R.id.item_date) + private object DiffUtilMediaCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: MediaResult, newItem: MediaResult) = oldItem.id == newItem.id + override fun areContentsTheSame(oldItem: MediaResult, newItem: MediaResult) = oldItem == newItem } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = LayoutInflater - .from(parent.context) - .inflate(layoutId, parent, false) - return ViewHolder(view) - } - - override fun onBindViewHolder(holder: ViewHolder, position: Int) { + class ViewHolder(private val binding : ItemHorizontalHomePageBinding, listener: MovieSelection) + : RecyclerView.ViewHolder(binding.root) { - val currentItem = list[position] - 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) + val mediaResult : MediaResult? get() = binding.mediaResult - holder.itemView.setOnClickListener { - onItemClick(currentItem) + fun bind(mediaResult : MediaResult) { + 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)) } \ No newline at end of file diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/adapter/MovieAdapter.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/adapter/MovieAdapter.kt index 2c8da88..20d7e3f 100644 --- a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/adapter/MovieAdapter.kt +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/adapter/MovieAdapter.kt @@ -10,6 +10,7 @@ import coil.load import fr.iut.pm.movieapplication.databinding.ItemMovieCategoryBinding import fr.iut.pm.movieapplication.model.media.movie.Movie import fr.iut.pm.movieapplication.ui.dialog.MovieDialog +import fr.iut.pm.movieapplication.ui.interfaces.MovieSelection import fr.iut.pm.movieapplication.utils.Constants class MovieAdapter(private val listener : MovieSelection) : ListAdapter(DiffUtilMovieCallback) { @@ -29,7 +30,6 @@ class MovieAdapter(private val listener : MovieSelection) : ListAdapter() - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val view = inflater.inflate(R.layout.fragment_home_sections, container, false) + private val trendsAdapter = MediaAdapter(this) + private val popularMoviesAdapter = MediaAdapter(this) + private val popularTvShowsAdapter = MediaAdapter(this) - //get the trends RecyclerView - context.mediaRepository.getTrends { - val homeTrendsRecyclerView = view?.findViewById(R.id.home_trends_recycler_view) - homeTrendsRecyclerView?.adapter = MediaAdapter(context,R.layout.item_horizontal_home_page,it) - homeTrendsRecyclerView?.addItemDecoration(HomeItemDecoration()) + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?) + : View? { + + 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 -// context.movieRepository.getPopularMovies { -// val homePopularityRecyclerView = view?.findViewById(R.id.home_popularity_recycler_view) -// homePopularityRecyclerView?.adapter = CategoryAdapter(context,R.layout.item_horizontal_home_page,it) -// homePopularityRecyclerView?.addItemDecoration(HomeItemDecoration()) -// } - //get the free RecyclerView - val homeFreeRecyclerView = view?.findViewById(R.id.home_free_recycler_view) - homeFreeRecyclerView?.adapter = MediaAdapter(context,R.layout.item_horizontal_home_page,ArrayList()) - homeFreeRecyclerView?.addItemDecoration(HomeItemDecoration()) - return view + homeSectionsVM.getPopularMoviesLiveData().observe(viewLifecycleOwner) { + popularMoviesAdapter.submitList(it) + } + + homeSectionsVM.getPopularTvShowsLiveData().observe(viewLifecycleOwner) { + popularTvShowsAdapter.submitList(it) + } + } + + override fun onMovieSelected(movieId: Int) { + TODO("Not yet implemented") } } \ No newline at end of file diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/fragments/MoviesFragment.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/fragments/MoviesFragment.kt index cf2181f..150badd 100644 --- a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/fragments/MoviesFragment.kt +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/fragments/MoviesFragment.kt @@ -12,10 +12,11 @@ import fr.iut.pm.movieapplication.R import fr.iut.pm.movieapplication.databinding.FragmentMoviesBinding import fr.iut.pm.movieapplication.ui.adapter.MovieAdapter import fr.iut.pm.movieapplication.ui.dialog.MovieDialog +import fr.iut.pm.movieapplication.ui.interfaces.MovieSelection import fr.iut.pm.movieapplication.ui.viewmodel.MoviesVM class MoviesFragment( -) : Fragment(), MovieAdapter.MovieSelection { +) : Fragment(), MovieSelection { private val moviesVM by viewModels() val moviesAdapter = MovieAdapter(this) diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/fragments/SearchResultFragment.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/fragments/SearchResultFragment.kt new file mode 100644 index 0000000..2040680 --- /dev/null +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/fragments/SearchResultFragment.kt @@ -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 { SearchResultVMFactory(arguments?.getString("query")!!) } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return super.onCreateView(inflater, container, savedInstanceState) + } +} \ No newline at end of file diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/interfaces/MovieSelection.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/interfaces/MovieSelection.kt new file mode 100644 index 0000000..a195ecb --- /dev/null +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/interfaces/MovieSelection.kt @@ -0,0 +1,6 @@ +package fr.iut.pm.movieapplication.ui.interfaces + +interface MovieSelection { + + fun onMovieSelected(movieId : Int) +} \ No newline at end of file diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/viewmodel/HomeSectionsVM.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/viewmodel/HomeSectionsVM.kt index 0f0ae6b..c724078 100644 --- a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/viewmodel/HomeSectionsVM.kt +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/viewmodel/HomeSectionsVM.kt @@ -1,4 +1,33 @@ 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> = MutableLiveData() + fun getTrendsLiveData() : MutableLiveData> = _trendsLiveData + + private var _popularMoviesLiveData : MutableLiveData> = MutableLiveData() + fun getPopularMoviesLiveData() : MutableLiveData> = _popularMoviesLiveData + + private var _popularTvShowsLiveData : MutableLiveData> = MutableLiveData() + fun getPopularTvShowsLiveData() : MutableLiveData> = _popularTvShowsLiveData + + + init { + viewModelScope.launch { + _trendsLiveData.postValue(repository.getTrends()) + _popularMoviesLiveData.postValue(repository.getPopularMovies()) + _popularTvShowsLiveData.postValue(repository.getPopularTvShows()) + } + } + + } \ No newline at end of file diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/viewmodel/SearchResultVM.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/viewmodel/SearchResultVM.kt new file mode 100644 index 0000000..ea4d77c --- /dev/null +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/ui/viewmodel/SearchResultVM.kt @@ -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 = MutableLiveData() + fun getQueryLiveData() : LiveData = _queryLiveData + + init { + _queryLiveData.postValue(query) + } +} + +class SearchResultVMFactory(private var query : String) : ViewModelProvider.Factory +{ + override funcreate(modelClass:Class) : T + { + return SearchResultVM(query) as T + } +} \ No newline at end of file diff --git a/Sources/app/src/main/java/fr/iut/pm/movieapplication/utils/MediaResultMapper.kt b/Sources/app/src/main/java/fr/iut/pm/movieapplication/utils/MediaResultMapper.kt index 02b8f6c..242c62b 100644 --- a/Sources/app/src/main/java/fr/iut/pm/movieapplication/utils/MediaResultMapper.kt +++ b/Sources/app/src/main/java/fr/iut/pm/movieapplication/utils/MediaResultMapper.kt @@ -32,14 +32,14 @@ object MediaResultMapper { fun mapToMovie(mediaResultDTO: MediaResultDTO): Movie { return Movie( posterPath = mediaResultDTO.posterPath, - adult = mediaResultDTO.adult!!, + adult = mediaResultDTO.adult, overview = mediaResultDTO.overview ?: "", releaseDate = mediaResultDTO.releaseDate ?: "", // genreIds = mediaResultDTO.genreIds, id = mediaResultDTO.id, originalTitle = mediaResultDTO.originalTitle!!, originalLanguage = mediaResultDTO.originalLanguage, - title = mediaResultDTO.title, + title = mediaResultDTO.title!!, backdropPath = mediaResultDTO.backdropPath, popularity = mediaResultDTO.popularity, voteCount = mediaResultDTO.voteCount, @@ -51,7 +51,7 @@ object MediaResultMapper { fun mapToMediaResult(mediaResultDTO: MediaResultDTO) : MediaResult { return MediaResult( posterPath = mediaResultDTO.posterPath, - adult = mediaResultDTO.adult!!, + adult = mediaResultDTO.adult, overview = mediaResultDTO.overview ?: "", releaseDate = mediaResultDTO.releaseDate ?: mediaResultDTO.firstAirDate!! , originCountry = mediaResultDTO.originCountry, diff --git a/Sources/app/src/main/res/layout/fragment_home_sections.xml b/Sources/app/src/main/res/layout/fragment_home_sections.xml index 12275b5..891fe6d 100644 --- a/Sources/app/src/main/res/layout/fragment_home_sections.xml +++ b/Sources/app/src/main/res/layout/fragment_home_sections.xml @@ -1,69 +1,86 @@ + - + - + - + - + - + android:contentDescription="@string/section_nested_scroll_view"> - - - + > + + + + + + + + + + + + + + + - - - \ No newline at end of file + \ No newline at end of file diff --git a/Sources/app/src/main/res/layout/fragment_search_results.xml b/Sources/app/src/main/res/layout/fragment_search_results.xml new file mode 100644 index 0000000..b612533 --- /dev/null +++ b/Sources/app/src/main/res/layout/fragment_search_results.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Sources/app/src/main/res/layout/item_horizontal_home_page.xml b/Sources/app/src/main/res/layout/item_horizontal_home_page.xml index a98f4f9..86db216 100644 --- a/Sources/app/src/main/res/layout/item_horizontal_home_page.xml +++ b/Sources/app/src/main/res/layout/item_horizontal_home_page.xml @@ -1,45 +1,51 @@ - - - - - + + + + + + + + + app:cardCornerRadius="5dp"> + - - + - + + + - \ No newline at end of file + + \ No newline at end of file diff --git a/Sources/app/src/main/res/layout/item_movie_category.xml b/Sources/app/src/main/res/layout/item_movie_category.xml index 784f1f9..9b7af0a 100644 --- a/Sources/app/src/main/res/layout/item_movie_category.xml +++ b/Sources/app/src/main/res/layout/item_movie_category.xml @@ -1,6 +1,7 @@ + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto"> @@ -10,7 +11,7 @@ - @@ -45,18 +46,10 @@ - - + android:text="@{movie.title.length() > 20 ? movie.title.substring(0,20) + `...` : movie.title}"/> diff --git a/Sources/app/src/main/res/layout/item_tv_show_category.xml b/Sources/app/src/main/res/layout/item_tv_show_category.xml index 188f2fb..8f58121 100644 --- a/Sources/app/src/main/res/layout/item_tv_show_category.xml +++ b/Sources/app/src/main/res/layout/item_tv_show_category.xml @@ -48,7 +48,7 @@ android:layout_height="20dp" android:layout_gravity="center" android:textAlignment="center" - android:text="@{tvShow.name}"/> + android:text="@{tvShow.name.length() > 20 ? tvShow.name.substring(0,20) + `...` : tvShow.name }"/> Bienvenue, Des millions de films, émissions télévisées et artistes… Tendances - Populaires - Gratuits + Films populaires + Séries populaires section_nested_scroll_view