aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/SearchMangaPage.kt
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/SearchMangaPage.kt')
-rw-r--r--app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/SearchMangaPage.kt145
1 files changed, 145 insertions, 0 deletions
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/SearchMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/SearchMangaPage.kt
new file mode 100644
index 0000000..a571473
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/SearchMangaPage.kt
@@ -0,0 +1,145 @@
+package xyz.adjutor.aniki.presentation.view.manga
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.view.inputmethod.EditorInfo
+import android.view.inputmethod.InputMethodManager
+import android.widget.Button
+import android.widget.TextView.OnEditorActionListener
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.snackbar.Snackbar
+import com.google.android.material.textfield.TextInputEditText
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.data.manga.SearchMangaApi
+import xyz.adjutor.aniki.presentation.model.manga.SearchManga
+import xyz.adjutor.aniki.presentation.model.manga.SearchMangaResponse
+import xyz.adjutor.aniki.presentation.view.MainActivity
+
+
+class SearchMangaPage : Fragment() {
+
+ val gson: Gson = GsonBuilder()
+ .setLenient()
+ .create()
+ private var baseUrl = "https://api.jikan.moe/" //the api's base url
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+
+ return inflater.inflate(R.layout.search_manga_page, container, false)
+ }
+
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ //button to return to the home page
+ view.findViewById<Button>(R.id.button_home).setOnClickListener {
+ findNavController().navigate(R.id.action_SearchMangaPage_to_HomePage)
+ }
+
+ view.findViewById<Button>(R.id.button_query).setOnClickListener {
+ val userInput = view.findViewById<TextInputEditText>(R.id.tiet_query).text.toString()
+ hideKeyboard()
+ makeApiCall(view, baseUrl, userInput)
+ }
+
+ view.findViewById<TextInputEditText>(R.id.tiet_query)
+ .setOnEditorActionListener(OnEditorActionListener { v, actionId, event ->
+ if (actionId == EditorInfo.IME_ACTION_SEARCH) {
+ val userInput =
+ view.findViewById<TextInputEditText>(R.id.tiet_query).text.toString()
+ hideKeyboard()
+ makeApiCall(view, baseUrl, userInput)
+ return@OnEditorActionListener true
+ }
+ false
+ })
+
+ }
+
+ private fun hideKeyboard() {
+ val activity = activity as MainActivity
+
+ val view = activity.currentFocus
+ if (view != null) {
+ val imm = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
+ imm.hideSoftInputFromWindow(view.windowToken, 0)
+ }
+ }
+
+
+ //display the recyclerview
+ fun showList(view: View, mangaList: List<SearchManga>) {
+ val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
+ recyclerView.setHasFixedSize(true)
+ recyclerView.layoutManager = LinearLayoutManager(view.context)
+ recyclerView.adapter = SearchMangaAdapter(mangaList)
+ (recyclerView.adapter as SearchMangaAdapter).notifyDataSetChanged()
+ }
+
+ //call the API and show the list
+ private fun makeApiCall(view: View, BASE_URL: String, query: String) {
+
+ val retrofit = Retrofit.Builder()
+ .baseUrl(BASE_URL)
+ .addConverterFactory(GsonConverterFactory.create(gson))
+ .build()
+
+ val service = retrofit.create(SearchMangaApi::class.java)
+ val call = service.getSearchMangaData(q = query) //fate is an exemple, we'll have to replace it by the user input.
+
+ call.enqueue(object : Callback<SearchMangaResponse> {
+ override fun onResponse(
+ call: Call<SearchMangaResponse>,
+ response: Response<SearchMangaResponse>
+ ) {
+ if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+ val mangaList: List<SearchManga> = response.body()!!
+ .getResults() //getting the "search" field containing our list of SearchMangas
+
+ showList(
+ view,
+ mangaList
+ ) //calling the method in charge of displaying on the recyclerview
+
+ } else {
+ showError() //a snackbar
+ }
+ }
+
+ override fun onFailure(call: Call<SearchMangaResponse>, t: Throwable) {
+ showError()
+ }
+
+ })
+ }
+
+ //display a snack
+ private fun showError() {
+ Snackbar.make(
+ requireView(),
+ "API ERROR : Verify your internet connection or your query.",
+ Snackbar.LENGTH_LONG
+ )
+ .setAction("Action", null).show()
+ }
+
+} \ No newline at end of file