From 5c31039fd49cb14532b654f5e17443bc50b1f4c7 Mon Sep 17 00:00:00 2001 From: Julien THEME Date: Sat, 4 Feb 2023 00:11:53 +0100 Subject: [PATCH] :zap: add logic of searchView --- Cineapp/.idea/deploymentTargetDropDown.xml | 17 ------ Cineapp/app/apikey.properties | 1 + Cineapp/app/build.gradle | 5 ++ .../java/com/example/cinapp/MainActivity.kt | 1 + .../com/example/cinapp/Request/MediaApi.kt | 20 +++---- .../example/cinapp/Request/MediaService.kt | 15 +++--- .../example/cinapp/fragments/HomeFragment.kt | 9 ++-- .../example/cinapp/fragments/MovieFragment.kt | 30 ----------- .../cinapp/fragments/SearchFragment.kt | 17 +++--- .../cinapp/viewModel/SearchViewModel.kt | 53 +++++++++++++------ .../src/main/res/layout/fragment_search.xml | 18 +++++-- .../app/src/main/res/layout/item_search.xml | 14 +++++ 12 files changed, 102 insertions(+), 98 deletions(-) delete mode 100644 Cineapp/.idea/deploymentTargetDropDown.xml create mode 100644 Cineapp/app/apikey.properties create mode 100644 Cineapp/app/src/main/res/layout/item_search.xml diff --git a/Cineapp/.idea/deploymentTargetDropDown.xml b/Cineapp/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 7d0ccfb..0000000 --- a/Cineapp/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Cineapp/app/apikey.properties b/Cineapp/app/apikey.properties new file mode 100644 index 0000000..2ccfef9 --- /dev/null +++ b/Cineapp/app/apikey.properties @@ -0,0 +1 @@ +TMDB_API_KEY="e53e59cf1e29b9afff93d9ca1208f0cf" \ No newline at end of file diff --git a/Cineapp/app/build.gradle b/Cineapp/app/build.gradle index 4f80337..41e8984 100644 --- a/Cineapp/app/build.gradle +++ b/Cineapp/app/build.gradle @@ -3,11 +3,16 @@ plugins { id 'org.jetbrains.kotlin.android' } +def apikeyPropertiesFile = rootProject.file("app/apikey.properties") +def apikeyProperties = new Properties() +apikeyProperties.load(new FileInputStream(apikeyPropertiesFile)) + android { namespace 'com.example.cinapp' compileSdk 32 defaultConfig { + buildConfigField("String", "TMDB_API_KEY", apikeyProperties['TMDB_API_KEY']) applicationId "com.example.cinapp" minSdk 21 targetSdk 32 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 7a627c0..e40db50 100644 --- a/Cineapp/app/src/main/java/com/example/cinapp/MainActivity.kt +++ b/Cineapp/app/src/main/java/com/example/cinapp/MainActivity.kt @@ -2,6 +2,7 @@ package com.example.cinapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.util.Log import androidx.fragment.app.Fragment import com.example.cinapp.databinding.ActivityMainBinding import com.example.cinapp.fragments.HomeFragment 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 8a17bf8..14590c1 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 @@ -17,8 +17,8 @@ class MediaApi { private val service = retrofit.create(MediaService::class.java) val mediaMapper = MediaMapper() - fun search(apiKey: String, language: String, query: String, page: Int, includeAdult: Boolean, callback: (List) -> Unit) { - val response: Call = service.searchMedia(apiKey, language, query, page, includeAdult) + fun search(query: String, page: Int, callback: (List) -> Unit) { + val response: Call = service.searchMedia(query, page) val listMedia: MutableList = mutableListOf() Log.d("TAG", "search: " + response.request().url()) @@ -42,8 +42,8 @@ class MediaApi { Log.d("Liste2", listMedia.size.toString()) } - fun getPopularMovies(apiKey: String, callback: (List) -> Unit ) { - val response: Call = service.getPopularMovies(apiKey) + fun getPopularMovies(callback: (List) -> Unit ) { + val response: Call = service.getPopularMovies() val listMedia: MutableList = mutableListOf() response.enqueue(object : Callback { @@ -63,8 +63,8 @@ class MediaApi { }) } - fun getPopularSeries(apiKey: String, callback: (List) -> Unit ) { - val response: Call = service.getPopularSeries(apiKey) + fun getPopularSeries(callback: (List) -> Unit ) { + val response: Call = service.getPopularSeries() val listMedia: MutableList = mutableListOf() response.enqueue(object : Callback { @@ -84,8 +84,8 @@ class MediaApi { }) } - fun getTopRatedMovie(apiKey: String, callback: (List) -> Unit ) { - val response: Call = service.getTopRatedMovie(apiKey) + fun getTopRatedMovie(callback: (List) -> Unit ) { + val response: Call = service.getTopRatedMovie() val listMedia: MutableList = mutableListOf() response.enqueue(object : Callback { @@ -105,8 +105,8 @@ class MediaApi { }) } - fun getTopRatedSerie(apiKey: String, callback: (List) -> Unit ) { - val response: Call = service.getTopRatedSerie(apiKey) + fun getTopRatedSerie(callback: (List) -> Unit ) { + val response: Call = service.getTopRatedSerie() val listMedia: MutableList = mutableListOf() response.enqueue(object : Callback { 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 72fc2ee..bc52ed1 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 @@ -1,5 +1,6 @@ package com.example.cinapp.Request +import com.example.cinapp.BuildConfig import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Query @@ -7,22 +8,22 @@ import retrofit2.http.Query interface MediaService { @GET("search/multi") fun searchMedia( - @Query("api_key") apiKey: String, - @Query("language") language: String, @Query("query") query: String, @Query("page") page: Int, - @Query("include_adult") includeAdult: Boolean + @Query("api_key") apiKey: String = BuildConfig.TMDB_API_KEY, + @Query("language") language: String = "fr", + @Query("include_adult") includeAdult: Boolean = true ): Call @GET("movie/popular") - fun getPopularMovies(@Query("api_key") apiKey: String): Call + fun getPopularMovies(@Query("api_key") apiKey: String = BuildConfig.TMDB_API_KEY): Call @GET("tv/popular") - fun getPopularSeries(@Query("api_key") apiKey: String): Call + fun getPopularSeries(@Query("api_key") apiKey: String = BuildConfig.TMDB_API_KEY): Call @GET("movie/top_rated") - fun getTopRatedMovie(@Query("api_key") apiKey: String): Call + fun getTopRatedMovie(@Query("api_key") apiKey: String = BuildConfig.TMDB_API_KEY): Call @GET("tv/top_rated") - fun getTopRatedSerie(@Query("api_key") apiKey: String): Call + fun getTopRatedSerie(@Query("api_key") apiKey: String = BuildConfig.TMDB_API_KEY): Call } \ No newline at end of file diff --git a/Cineapp/app/src/main/java/com/example/cinapp/fragments/HomeFragment.kt b/Cineapp/app/src/main/java/com/example/cinapp/fragments/HomeFragment.kt index e060560..92a8c2f 100644 --- a/Cineapp/app/src/main/java/com/example/cinapp/fragments/HomeFragment.kt +++ b/Cineapp/app/src/main/java/com/example/cinapp/fragments/HomeFragment.kt @@ -42,24 +42,23 @@ class HomeFragment : Fragment() { //getPopularMovies // Inflate the layout for this fragment val rootView = inflater.inflate(R.layout.fragment_home, container, false) - val apiKey = "e53e59cf1e29b9afff93d9ca1208f0cf" - MediaApi().getPopularMovies(apiKey) { listMedia -> + MediaApi().getPopularMovies() { listMedia -> val recyclerView = rootView.findViewById(R.id.rc_popular_movies) addMediaToRecyclerView(listMedia, recyclerView) } - MediaApi().getPopularSeries(apiKey) { listMedia -> + MediaApi().getPopularSeries() { listMedia -> val recyclerView = rootView.findViewById(R.id.rc_popular_series) addMediaToRecyclerView(listMedia, recyclerView) } - MediaApi().getTopRatedMovie(apiKey) { listMedia -> + MediaApi().getTopRatedMovie() { listMedia -> val recyclerView = rootView.findViewById(R.id.rc_top_rated_movies) addMediaToRecyclerView(listMedia, recyclerView) } - MediaApi().getTopRatedSerie(apiKey) { listMedia -> + MediaApi().getTopRatedSerie() { listMedia -> val recyclerView = rootView.findViewById(R.id.rc_top_rated_series) addMediaToRecyclerView(listMedia, recyclerView) } diff --git a/Cineapp/app/src/main/java/com/example/cinapp/fragments/MovieFragment.kt b/Cineapp/app/src/main/java/com/example/cinapp/fragments/MovieFragment.kt index fd1813c..3946bef 100644 --- a/Cineapp/app/src/main/java/com/example/cinapp/fragments/MovieFragment.kt +++ b/Cineapp/app/src/main/java/com/example/cinapp/fragments/MovieFragment.kt @@ -41,38 +41,8 @@ class MovieFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - // Récupération de la vue racine val rootView = inflater.inflate(R.layout.fragment_movie, container, false) - - // Récupération de la vue souhaitée - val myView = rootView.findViewById(R.id.name) - - //var listMedias : Unit = MediaApi().search("e53e59cf1e29b9afff93d9ca1208f0cf", "en-US", "One Piece", 1, false) { listMedia -> listMedia } - //var listMedia : List = MediaApi().getPopularMovies("e53e59cf1e29b9afff93d9ca1208f0cf") - //var listMedia : List = MediaApi().getForrestGump() - - val apiKey = "e53e59cf1e29b9afff93d9ca1208f0cf" - val language = "en-US" - val query = "One Piece" - val page = 1 - val includeAdult = false - MediaApi().search(apiKey, language, query, page, includeAdult) { listMedia -> - //Do something with listMedia - Log.d("TAG", "onCreateView: " + listMedia) - Log.d("Image", "onCreateView: " + listMedia[0].posterPath.toString()) - myView.text = listMedia[0].title.toString() + " " + listMedia[0].id.toString() + " " + listMedia[0].posterPath.toString() - //ajouter le recyclerView à la vue - - val recyclerView = rootView.findViewById(R.id.recycler_view_movies) - //recyclerView.layoutManager = LinearLayoutManager(context) - val layoutManager = StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.HORIZONTAL) - recyclerView.layoutManager = layoutManager - val adapter = MediaAdapter(listMedia) - recyclerView.adapter = adapter - - } - return rootView } diff --git a/Cineapp/app/src/main/java/com/example/cinapp/fragments/SearchFragment.kt b/Cineapp/app/src/main/java/com/example/cinapp/fragments/SearchFragment.kt index 8eecb60..63f224a 100644 --- a/Cineapp/app/src/main/java/com/example/cinapp/fragments/SearchFragment.kt +++ b/Cineapp/app/src/main/java/com/example/cinapp/fragments/SearchFragment.kt @@ -8,6 +8,7 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.SearchView import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.ViewModelProviders import com.example.cinapp.R import com.example.cinapp.viewModel.SearchViewModel @@ -25,11 +26,11 @@ class SearchFragment : Fragment() { // TODO: Rename and change types of parameters private var param1: String? = null private var param2: String? = null - private lateinit var searchView: SearchView - private lateinit var searchVM: SearchViewModel + private lateinit var searchViewModel: SearchViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + Log.d("InfoSearch", "onCreateView: ") arguments?.let { param1 = it.getString(ARG_PARAM1) param2 = it.getString(ARG_PARAM2) @@ -42,16 +43,16 @@ class SearchFragment : Fragment() { savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment - val view = inflater.inflate(R.layout.fragment_search, container, false) - searchView = view.findViewById(R.id.searchView) - Log.d("SearchViewModel", "setSearchView: $searchView") - return view + Log.d("InfoSearch", "onCreateView: ") + val rootView = inflater.inflate(R.layout.fragment_search, container, false) + val viewModelProvider = ViewModelProvider(this) + searchViewModel = viewModelProvider.get(SearchViewModel::class.java) + searchViewModel.setSearchView(rootView) + return rootView } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - searchVM = ViewModelProvider(this)[SearchViewModel::class.java] - searchVM.setSearchView(searchView) } companion object { diff --git a/Cineapp/app/src/main/java/com/example/cinapp/viewModel/SearchViewModel.kt b/Cineapp/app/src/main/java/com/example/cinapp/viewModel/SearchViewModel.kt index 9adead8..2f52c90 100644 --- a/Cineapp/app/src/main/java/com/example/cinapp/viewModel/SearchViewModel.kt +++ b/Cineapp/app/src/main/java/com/example/cinapp/viewModel/SearchViewModel.kt @@ -2,32 +2,51 @@ package com.example.cinapp.viewModel import android.annotation.SuppressLint import android.util.Log +import android.view.View import androidx.appcompat.widget.SearchView import androidx.lifecycle.ViewModel +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.example.cinapp.BuildConfig +import com.example.cinapp.MainActivity +import com.example.cinapp.R +import com.example.cinapp.Request.MediaAdapter +import com.example.cinapp.Request.MediaApi @SuppressLint("StaticFieldLeak") class SearchViewModel : ViewModel() { var searchView: SearchView? = null + val context : MainActivity = MainActivity() @JvmName("setSearchView1") - fun setSearchView(searchView: SearchView) { - this.searchView = searchView + fun setSearchView(rootView: View) { + searchView = rootView.findViewById(R.id.searchView) Log.d("SearchViewModel", "setSearchView: $searchView") - } + searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?): Boolean { + // Traitement lors de la soumission de la requête + + MediaApi().search(query.toString(), 1) + { listMedia -> + val recyclerView = rootView.findViewById(R.id.searchRecyclerView) + recyclerView.layoutManager = GridLayoutManager(context, 2) + recyclerView.adapter = MediaAdapter(listMedia) + + } - var sv = searchView?.setOnQueryTextListener(object : SearchView.OnQueryTextListener { - override fun onQueryTextSubmit(query: String?): Boolean { - // Traitement lors de la soumission de la requête - Log.d("SearchViewModel", "onQueryTextSubmit: $query") - return false - } - - override fun onQueryTextChange(newText: String?): Boolean { - // Traitement lorsque le texte de la requête change - Log.d("SearchViewModel", "onQueryTextSubmit: $newText") - return false - } - }) -} \ No newline at end of file + + Log.d("SearchViewModel -----", "onQueryTextSubmit: $query") + return false + } + + override fun onQueryTextChange(newText: String?): Boolean { + // Traitement lorsque le texte de la requête change + Log.d("SearchViewModel *******", "onQueryTextChange: $newText") + return false + } + }) + } +} diff --git a/Cineapp/app/src/main/res/layout/fragment_search.xml b/Cineapp/app/src/main/res/layout/fragment_search.xml index 5ad6e00..4b20a1d 100644 --- a/Cineapp/app/src/main/res/layout/fragment_search.xml +++ b/Cineapp/app/src/main/res/layout/fragment_search.xml @@ -1,14 +1,14 @@ - + - + + diff --git a/Cineapp/app/src/main/res/layout/item_search.xml b/Cineapp/app/src/main/res/layout/item_search.xml new file mode 100644 index 0000000..616415b --- /dev/null +++ b/Cineapp/app/src/main/res/layout/item_search.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file