From f3c8ca074fa121332a10b2bcaf20d46eec177237 Mon Sep 17 00:00:00 2001 From: Julien THEME Date: Sun, 29 Jan 2023 12:41:20 +0100 Subject: [PATCH] :zap: add home page Add home page with different series and movie proposals such as the most popular and the best rated --- .../java/com/example/cinapp/MainActivity.kt | 4 +- .../com/example/cinapp/Request/MediaApi.kt | 54 +++++++++-- .../com/example/cinapp/Request/MediaMapper.kt | 8 +- .../example/cinapp/Request/MediaService.kt | 12 ++- .../cinapp/model/navigation/HomeFragment.kt | 97 +++++++++++++++++++ .../main/res/drawable/ic_baseline_home_24.xml | 5 + .../app/src/main/res/layout/fragment_home.xml | 93 ++++++++++++++++++ Cineapp/app/src/main/res/menu/bottom_nav.xml | 4 + Cineapp/app/src/main/res/values/strings.xml | 9 +- 9 files changed, 270 insertions(+), 16 deletions(-) create mode 100644 Cineapp/app/src/main/java/com/example/cinapp/model/navigation/HomeFragment.kt create mode 100644 Cineapp/app/src/main/res/drawable/ic_baseline_home_24.xml create mode 100644 Cineapp/app/src/main/res/layout/fragment_home.xml diff --git a/Cineapp/app/src/main/java/com/example/cinapp/MainActivity.kt b/Cineapp/app/src/main/java/com/example/cinapp/MainActivity.kt index 43565c7..3f0da97 100644 --- a/Cineapp/app/src/main/java/com/example/cinapp/MainActivity.kt +++ b/Cineapp/app/src/main/java/com/example/cinapp/MainActivity.kt @@ -4,6 +4,7 @@ import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.fragment.app.Fragment import com.example.cinapp.databinding.ActivityMainBinding +import com.example.cinapp.model.navigation.HomeFragment import com.example.cinapp.model.navigation.MovieFragment import com.example.cinapp.model.navigation.SearchFragment import com.example.cinapp.model.navigation.SerieFragment @@ -17,10 +18,11 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - replaceFragment(MovieFragment()) + replaceFragment(HomeFragment()) binding.bottomNavigation.setOnItemSelectedListener { when(it.itemId){ + R.id.home -> replaceFragment(HomeFragment()) R.id.movie -> replaceFragment(MovieFragment()) R.id.serie -> replaceFragment(SerieFragment()) R.id.search -> replaceFragment(SearchFragment()) diff --git a/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaApi.kt b/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaApi.kt index daa8412..8a17bf8 100644 --- a/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaApi.kt +++ b/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaApi.kt @@ -42,7 +42,7 @@ class MediaApi { Log.d("Liste2", listMedia.size.toString()) } - fun getPopularMovies(apiKey: String): List { + fun getPopularMovies(apiKey: String, callback: (List) -> Unit ) { val response: Call = service.getPopularMovies(apiKey) val listMedia: MutableList = mutableListOf() @@ -52,20 +52,40 @@ class MediaApi { val allMedia = response.body()!! val listMediaResponse = allMedia.results listMediaResponse.forEach { mediaResponse -> - listMedia.add(mediaMapper.searchMapToMedia(mediaResponse)) + listMedia.add(mediaMapper.mapToMovie(mediaResponse)) } + callback(listMedia) } override fun onFailure(call: Call, t: Throwable) { Log.d("ErrorRetrofit", t.message.toString()) } }) + } + + fun getPopularSeries(apiKey: String, callback: (List) -> Unit ) { + val response: Call = service.getPopularSeries(apiKey) + val listMedia: MutableList = mutableListOf() + + response.enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + Log.d("Liste1", response.body().toString()) + val allMedia = response.body()!! + val listMediaResponse = allMedia.results + listMediaResponse.forEach { mediaResponse -> + listMedia.add(mediaMapper.mapToSerie(mediaResponse)) + } + callback(listMedia) + } - return listMedia + override fun onFailure(call: Call, t: Throwable) { + Log.d("ErrorRetrofit", t.message.toString()) + } + }) } - fun getForrestGump(): List { - val response: Call = service.getForrestGump() + fun getTopRatedMovie(apiKey: String, callback: (List) -> Unit ) { + val response: Call = service.getTopRatedMovie(apiKey) val listMedia: MutableList = mutableListOf() response.enqueue(object : Callback { @@ -74,15 +94,35 @@ class MediaApi { val allMedia = response.body()!! val listMediaResponse = allMedia.results listMediaResponse.forEach { mediaResponse -> - listMedia.add(mediaMapper.searchMapToMedia(mediaResponse)) + listMedia.add(mediaMapper.mapToMovie(mediaResponse)) } + callback(listMedia) } override fun onFailure(call: Call, t: Throwable) { Log.d("ErrorRetrofit", t.message.toString()) } }) + } + + fun getTopRatedSerie(apiKey: String, callback: (List) -> Unit ) { + val response: Call = service.getTopRatedSerie(apiKey) + val listMedia: MutableList = mutableListOf() + + response.enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + Log.d("Liste1", response.body().toString()) + val allMedia = response.body()!! + val listMediaResponse = allMedia.results + listMediaResponse.forEach { mediaResponse -> + listMedia.add(mediaMapper.mapToSerie(mediaResponse)) + } + callback(listMedia) + } - return listMedia + override fun onFailure(call: Call, t: Throwable) { + Log.d("ErrorRetrofit", t.message.toString()) + } + }) } } \ No newline at end of file diff --git a/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaMapper.kt b/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaMapper.kt index ca23294..2640a17 100644 --- a/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaMapper.kt +++ b/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaMapper.kt @@ -7,13 +7,13 @@ import com.example.cinapp.model.Serie class MediaMapper { fun searchMapToMedia(mediaResponse: MediaResponse): Media { return when (mediaResponse.media_type) { - "movie" -> searchMapToMovie(mediaResponse) - "tv" -> searchMapToSerie(mediaResponse) + "movie" -> mapToMovie(mediaResponse) + "tv" -> mapToSerie(mediaResponse) else -> throw IllegalArgumentException("Invalid media type") } } - private fun searchMapToMovie(mediaResponse: MediaResponse): Movie { + fun mapToMovie(mediaResponse: MediaResponse): Movie { return Movie( id = mediaResponse.id, title = mediaResponse.title, @@ -32,7 +32,7 @@ class MediaMapper { ) } - private fun searchMapToSerie(mediaResponse: MediaResponse): Serie { + fun mapToSerie(mediaResponse: MediaResponse): Serie { return Serie( id = mediaResponse.id, title = mediaResponse.name, diff --git a/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaService.kt b/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaService.kt index 229bf66..72fc2ee 100644 --- a/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaService.kt +++ b/Cineapp/app/src/main/java/com/example/cinapp/Request/MediaService.kt @@ -5,9 +5,6 @@ import retrofit2.http.GET import retrofit2.http.Query interface MediaService { - @GET("search/movie?api_key=e53e59cf1e29b9afff93d9ca1208f0cf&query=Forrest%20Gump&language=fr") - fun getForrestGump(): Call - @GET("search/multi") fun searchMedia( @Query("api_key") apiKey: String, @@ -19,4 +16,13 @@ interface MediaService { @GET("movie/popular") fun getPopularMovies(@Query("api_key") apiKey: String): Call + + @GET("tv/popular") + fun getPopularSeries(@Query("api_key") apiKey: String): Call + + @GET("movie/top_rated") + fun getTopRatedMovie(@Query("api_key") apiKey: String): Call + + @GET("tv/top_rated") + fun getTopRatedSerie(@Query("api_key") apiKey: String): Call } \ No newline at end of file diff --git a/Cineapp/app/src/main/java/com/example/cinapp/model/navigation/HomeFragment.kt b/Cineapp/app/src/main/java/com/example/cinapp/model/navigation/HomeFragment.kt new file mode 100644 index 0000000..18e9162 --- /dev/null +++ b/Cineapp/app/src/main/java/com/example/cinapp/model/navigation/HomeFragment.kt @@ -0,0 +1,97 @@ +package com.example.cinapp.model.navigation + +import android.os.Bundle +import android.util.Log +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.example.cinapp.R +import com.example.cinapp.Request.MediaAdapter +import com.example.cinapp.Request.MediaApi +import com.example.cinapp.model.Media + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [HomeFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class HomeFragment : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + //getPopularMovies + // Inflate the layout for this fragment + val rootView = inflater.inflate(R.layout.fragment_home, container, false) + val apiKey = "e53e59cf1e29b9afff93d9ca1208f0cf" + + MediaApi().getPopularMovies(apiKey) { listMedia -> + val recyclerView = rootView.findViewById(R.id.rc_popular_movies) + addMediaToRecyclerView(listMedia, recyclerView) + } + + MediaApi().getPopularSeries(apiKey) { listMedia -> + val recyclerView = rootView.findViewById(R.id.rc_popular_series) + addMediaToRecyclerView(listMedia, recyclerView) + } + + MediaApi().getTopRatedMovie(apiKey) { listMedia -> + val recyclerView = rootView.findViewById(R.id.rc_top_rated_movies) + addMediaToRecyclerView(listMedia, recyclerView) + } + + MediaApi().getTopRatedSerie(apiKey) { listMedia -> + val recyclerView = rootView.findViewById(R.id.rc_top_rated_series) + addMediaToRecyclerView(listMedia, recyclerView) + } + + return rootView + } + + fun addMediaToRecyclerView(listMedia: List, recyclerView: RecyclerView) { + val layoutManager = StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.HORIZONTAL) + recyclerView.layoutManager = layoutManager + val adapter = MediaAdapter(listMedia) + recyclerView.adapter = adapter + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment HomeFragment. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + HomeFragment().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/Cineapp/app/src/main/res/drawable/ic_baseline_home_24.xml b/Cineapp/app/src/main/res/drawable/ic_baseline_home_24.xml new file mode 100644 index 0000000..5a870f5 --- /dev/null +++ b/Cineapp/app/src/main/res/drawable/ic_baseline_home_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Cineapp/app/src/main/res/layout/fragment_home.xml b/Cineapp/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..42f8dc1 --- /dev/null +++ b/Cineapp/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Cineapp/app/src/main/res/menu/bottom_nav.xml b/Cineapp/app/src/main/res/menu/bottom_nav.xml index 190f5ac..eccab88 100644 --- a/Cineapp/app/src/main/res/menu/bottom_nav.xml +++ b/Cineapp/app/src/main/res/menu/bottom_nav.xml @@ -1,6 +1,10 @@ + /> + diff --git a/Cineapp/app/src/main/res/values/strings.xml b/Cineapp/app/src/main/res/values/strings.xml index 643dea2..8d95aab 100644 --- a/Cineapp/app/src/main/res/values/strings.xml +++ b/Cineapp/app/src/main/res/values/strings.xml @@ -1,5 +1,12 @@ Cin\'app - Hello blank fragment + Current popular movies + Current popular serie + Movies in theaters + Series on the air + Upcoming movies + Series airing today + Top rated movies + Top rated series \ No newline at end of file