From 848c8bf1ba4f0f3ecf2eeae0b9be2d6a664db2b4 Mon Sep 17 00:00:00 2001 From: Clyhtsuriva Date: Tue, 2 Mar 2021 10:46:48 +0100 Subject: Creating the APIs and the responses. --- .../main/java/xyz/adjutor/aniki/anime/AnimeApi.kt | 2 +- .../java/xyz/adjutor/aniki/anime/AnimeResponse.kt | 12 ++++++++ .../xyz/adjutor/aniki/anime/RestAnimeResponse.kt | 12 -------- .../xyz/adjutor/aniki/anime/search/SearchAnime.kt | 31 ++++++++++++++++++++ .../adjutor/aniki/anime/search/SearchAnimeApi.kt | 12 ++++++++ .../aniki/anime/search/SearchAnimeResponse.kt | 13 +++++++++ .../aniki/anime/topanime/DetailTopAnimeActivity.kt | 34 +++++++++++----------- .../aniki/anime/topanime/RestTopAnimeResponse.kt | 13 --------- .../adjutor/aniki/anime/topanime/TopAnimeApi.kt | 2 +- .../adjutor/aniki/anime/topanime/TopAnimePage.kt | 34 ++++++++++++---------- .../aniki/anime/topanime/TopAnimeResponse.kt | 13 +++++++++ 11 files changed, 118 insertions(+), 60 deletions(-) create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/AnimeResponse.kt delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/RestAnimeResponse.kt create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnime.kt create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeApi.kt create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeResponse.kt delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/topanime/RestTopAnimeResponse.kt create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeResponse.kt (limited to 'app/src/main/java/xyz/adjutor/aniki/anime') diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/AnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/anime/AnimeApi.kt index 028097a..52ca2ba 100644 --- a/app/src/main/java/xyz/adjutor/aniki/anime/AnimeApi.kt +++ b/app/src/main/java/xyz/adjutor/aniki/anime/AnimeApi.kt @@ -7,6 +7,6 @@ import retrofit2.http.Path interface AnimeApi { @GET("v3/anime/{id}") - fun getAnimeData(@Path("id") id: String): Call + fun getAnimeData(@Path("id") id: String): Call } \ No newline at end of file diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/AnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/anime/AnimeResponse.kt new file mode 100644 index 0000000..8d801d6 --- /dev/null +++ b/app/src/main/java/xyz/adjutor/aniki/anime/AnimeResponse.kt @@ -0,0 +1,12 @@ +package xyz.adjutor.aniki.anime + +import com.google.gson.annotations.SerializedName + +class AnimeResponse { //only kept the infos I didn't have and that were interesting to me. + + @SerializedName("mal_id") + var mal_id: Int? = null + + @SerializedName("synopsis") + var synopsis: String? = null +} diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/RestAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/anime/RestAnimeResponse.kt deleted file mode 100644 index b449b31..0000000 --- a/app/src/main/java/xyz/adjutor/aniki/anime/RestAnimeResponse.kt +++ /dev/null @@ -1,12 +0,0 @@ -package xyz.adjutor.aniki.anime - -import com.google.gson.annotations.SerializedName - -class RestAnimeResponse { //only kept the infos I didn't have and that were interesting to me. - - @SerializedName("mal_id") - var mal_id: Int? = null - - @SerializedName("synopsis") - var synopsis: String? = null -} diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnime.kt b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnime.kt new file mode 100644 index 0000000..7771646 --- /dev/null +++ b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnime.kt @@ -0,0 +1,31 @@ +package xyz.adjutor.aniki.anime.search + +import com.google.gson.annotations.SerializedName + +class SearchAnime { + + @SerializedName("mal_id") + var mal_id: Int? = null + + @SerializedName("url") + var url: String? = null + + @SerializedName("image_url") + var image_url: String? = null + + @SerializedName("title") + var title: String? = null + + @SerializedName("episodes") + var episodes: Int? = null + + @SerializedName("score") + var score: Float? = null + + @SerializedName("start_date") //we'll maybe remove this later + var start_date: String? = null + + @SerializedName("end_date") //we'll maybe remove this later + var end_date: String? = null + +} diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeApi.kt new file mode 100644 index 0000000..5512636 --- /dev/null +++ b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeApi.kt @@ -0,0 +1,12 @@ +package xyz.adjutor.aniki.anime.search + +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Query + +interface SearchAnimeApi { + + @GET("v3/search/anime") + fun getSearchAnimeData(@Query("q") q: String): Call + +} \ No newline at end of file diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeResponse.kt new file mode 100644 index 0000000..92100ba --- /dev/null +++ b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeResponse.kt @@ -0,0 +1,13 @@ +package xyz.adjutor.aniki.anime.search + +import com.google.gson.annotations.SerializedName + +class SearchAnimeResponse { //only kept the infos I didn't have and that were interesting to me. + + @SerializedName("results") + private lateinit var results: List + + fun getResults(): List { + return results + } +} diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/DetailTopAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/DetailTopAnimeActivity.kt index acbbd4d..661937f 100644 --- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/DetailTopAnimeActivity.kt +++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/DetailTopAnimeActivity.kt @@ -18,13 +18,13 @@ import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import xyz.adjutor.aniki.R import xyz.adjutor.aniki.anime.AnimeApi -import xyz.adjutor.aniki.anime.RestAnimeResponse +import xyz.adjutor.aniki.anime.AnimeResponse import java.lang.reflect.Type class DetailTopAnimeActivity : AppCompatActivity() { private var baseUrl = "https://api.jikan.moe/" - var sharedPreferences: SharedPreferences? = null + private lateinit var sharedPreferences: SharedPreferences private val gson = GsonBuilder() .setLenient() .create() @@ -95,7 +95,7 @@ class DetailTopAnimeActivity : AppCompatActivity() { tvUrl.text = animeUrl - val anime: RestAnimeResponse? = getDataFromCache(animeId.toString()) + val anime: AnimeResponse? = getDataFromCache(animeId.toString()) if (anime != null) { showDetail(anime) } else { @@ -105,13 +105,13 @@ class DetailTopAnimeActivity : AppCompatActivity() { } - private fun getDataFromCache(animeId: String): RestAnimeResponse? { - val jsonAnime: String? = sharedPreferences?.getString(animeId, null) + private fun getDataFromCache(animeId: String): AnimeResponse? { + val jsonAnime: String? = sharedPreferences.getString(animeId, null) return if (jsonAnime == null) { null } else { - val type: Type = object : TypeToken() {}.type + val type: Type = object : TypeToken() {}.type gson.fromJson(jsonAnime, type) } } @@ -126,14 +126,14 @@ class DetailTopAnimeActivity : AppCompatActivity() { val service = retrofit.create(AnimeApi::class.java) val call = service.getAnimeData(animeId) //based on the id - call.enqueue(object : Callback { + call.enqueue(object : Callback { override fun onResponse( - call: Call, - response: Response + call: Call, + response: Response ) { if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty - val anime = response.body() //getting the RestAnimeResponse fields + val anime = response.body() //getting the AnimeResponse fields saveList(anime) showDetail(anime!!) @@ -142,15 +142,15 @@ class DetailTopAnimeActivity : AppCompatActivity() { } } - override fun onFailure(call: Call, t: Throwable) { + override fun onFailure(call: Call, t: Throwable) { showError("API ERROR : onFailure") } }) } - private fun showDetail(anime: RestAnimeResponse) { - //elements from RestAnimeResponse + private fun showDetail(anime: AnimeResponse) { + //elements from AnimeResponse val tvSynopsis: TextView = findViewById(R.id.tv_synopsis) tvSynopsis.text = anime.synopsis.toString() @@ -165,12 +165,12 @@ class DetailTopAnimeActivity : AppCompatActivity() { return "Unknown" } - fun saveList(anime: RestAnimeResponse?) { + fun saveList(anime: AnimeResponse?) { val jsonString: String = gson.toJson(anime) sharedPreferences - ?.edit() - ?.putString(anime?.mal_id.toString(), jsonString) - ?.apply() + .edit() + .putString(anime?.mal_id.toString(), jsonString) + .apply() } } \ No newline at end of file diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/RestTopAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/RestTopAnimeResponse.kt deleted file mode 100644 index edc11cf..0000000 --- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/RestTopAnimeResponse.kt +++ /dev/null @@ -1,13 +0,0 @@ -package xyz.adjutor.aniki.anime.topanime - -import com.google.gson.annotations.SerializedName - -class RestTopAnimeResponse { - - @SerializedName("top") - var top: List? = null - - fun getResults(): List { - return top!! - } -} \ No newline at end of file diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeApi.kt index a5b3b59..8e44e77 100644 --- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeApi.kt +++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeApi.kt @@ -6,6 +6,6 @@ import retrofit2.http.GET interface TopAnimeApi { @GET("v3/top/anime") - fun getTopAnimeData(): Call + fun getTopAnimeData(): Call } \ No newline at end of file diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimePage.kt index ccae2fa..d62e5b2 100644 --- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimePage.kt +++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimePage.kt @@ -13,6 +13,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.google.android.material.snackbar.Snackbar +import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.reflect.TypeToken import retrofit2.Call @@ -25,11 +26,11 @@ import java.lang.reflect.Type class TopAnimePage : Fragment() { - var sharedPreferences: SharedPreferences? = null - val gson = GsonBuilder() + private lateinit var sharedPreferences: SharedPreferences + val gson: Gson = GsonBuilder() .setLenient() .create() - var base_url = "https://api.jikan.moe/" //the api's base url + var baseUrl = "https://api.jikan.moe/" //the api's base url override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -44,7 +45,7 @@ class TopAnimePage : Fragment() { if (animeList != null) { showList(view, animeList) } else { - makeApiCall(view, base_url) + makeApiCall(view, baseUrl) } return view @@ -52,14 +53,14 @@ class TopAnimePage : Fragment() { private fun getDataFromCache(): List? { //the value of the animeList json, if nothing is found, return null - val jsonAnime: String? = sharedPreferences?.getString("jsonAnimeList", null) + val jsonAnime: String? = sharedPreferences.getString("jsonAnimeList", null) //if it's null, well, return null - if (jsonAnime == null) { - return null + return if (jsonAnime == null) { + null } else { //else deserialize the list and return it val listType: Type = object : TypeToken>() {}.type - return gson.fromJson(jsonAnime, listType) + gson.fromJson(jsonAnime, listType) } } @@ -72,7 +73,7 @@ class TopAnimePage : Fragment() { } fun updateList() { - makeApiCall(view, base_url) + makeApiCall(view, baseUrl) Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } @@ -91,6 +92,7 @@ class TopAnimePage : Fragment() { recyclerView.setHasFixedSize(true) recyclerView.layoutManager = LinearLayoutManager(view.context) recyclerView.adapter = TopAnimeAdapter(animeList) + (recyclerView.adapter as TopAnimeAdapter).notifyDataSetChanged() } private fun makeApiCall(view: View, BASE_URL: String) { @@ -103,10 +105,10 @@ class TopAnimePage : Fragment() { val service = retrofit.create(TopAnimeApi::class.java) val call = service.getTopAnimeData() - call.enqueue(object : Callback { + call.enqueue(object : Callback { override fun onResponse( - call: Call, - response: Response + call: Call, + response: Response ) { if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty @@ -123,7 +125,7 @@ class TopAnimePage : Fragment() { } } - override fun onFailure(call: Call, t: Throwable) { + override fun onFailure(call: Call, t: Throwable) { showError() } @@ -134,9 +136,9 @@ class TopAnimePage : Fragment() { val jsonString: String = gson.toJson(animeList) sharedPreferences - ?.edit() - ?.putString("jsonAnimeList", jsonString) - ?.apply() + .edit() + .putString("jsonAnimeList", jsonString) + .apply() } private fun showError() { diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeResponse.kt new file mode 100644 index 0000000..2fe69d6 --- /dev/null +++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeResponse.kt @@ -0,0 +1,13 @@ +package xyz.adjutor.aniki.anime.topanime + +import com.google.gson.annotations.SerializedName + +class TopAnimeResponse { + + @SerializedName("top") + var top: List? = null + + fun getResults(): List { + return top!! + } +} \ No newline at end of file -- cgit v1.2.3 From d5dd918f2c8c0f29c70379fce6e40b79141c798a Mon Sep 17 00:00:00 2001 From: Clyhtsuriva Date: Tue, 2 Mar 2021 14:36:38 +0100 Subject: Added searching for animes. Auto keyboard hiding method when submitting. --- app/src/main/java/xyz/adjutor/aniki/HomePage.kt | 3 + .../aniki/anime/search/SearchAnimeAdapter.kt | 80 ++++++++++++++ .../adjutor/aniki/anime/search/SearchAnimePage.kt | 119 +++++++++++++++++++++ .../adjutor/aniki/manga/search/SearchMangaPage.kt | 20 +++- app/src/main/res/layout/home_page.xml | 10 ++ app/src/main/res/layout/search_anime_page.xml | 53 +++++++++ app/src/main/res/navigation/nav_graph.xml | 13 +++ app/src/main/res/values/strings.xml | 2 + 8 files changed, 297 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt create mode 100644 app/src/main/res/layout/search_anime_page.xml (limited to 'app/src/main/java/xyz/adjutor/aniki/anime') diff --git a/app/src/main/java/xyz/adjutor/aniki/HomePage.kt b/app/src/main/java/xyz/adjutor/aniki/HomePage.kt index 0b90b49..46dac33 100644 --- a/app/src/main/java/xyz/adjutor/aniki/HomePage.kt +++ b/app/src/main/java/xyz/adjutor/aniki/HomePage.kt @@ -30,5 +30,8 @@ class HomePage : Fragment() { view.findViewById