diff options
-rw-r--r-- | README.md | 4 | ||||
-rw-r--r-- | app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeApi.kt | 5 | ||||
-rw-r--r-- | app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimePage.kt | 36 | ||||
-rw-r--r-- | app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt | 33 | ||||
-rw-r--r-- | app/src/main/res/layout/top_anime_page.xml | 16 |
5 files changed, 60 insertions, 34 deletions
@@ -1,7 +1,6 @@ List of elements used in top manga and top anime with a recycler view SwipeRefresh used to refresh the list of data of the frist page. -Thanks to the scroll listener, touch the bottom of the page to load another page, replacing the first one. -Use the button (prev and next) to navigate with ease through the pages. The "ScrollListener" was added as a practice, it's not the best feature to navigate. +Use the button (prev and next) to navigate with ease through the pages. Details of a chosen element from the recycler view with an intent object Title, synopsys and background clickable. @@ -12,6 +11,7 @@ They display the data in a recycler view similar to the tops. A feature has been added that hides the keyboard when the query is submitted by the user. We can also submit the query by clicking the "search" button that replace the "return" one. Clicking on a searched item also opens a detail page of it. +I'm not adding the "multiple pages" feature to the search section because I assume the user should use a more precise query if what he's looking for doesn't show up in the first page. Multiple calls of the REST API from jikan.moe. Usage of : 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 8e44e77..2e6b1e0 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 @@ -2,10 +2,11 @@ package xyz.adjutor.aniki.anime.topanime import retrofit2.Call import retrofit2.http.GET +import retrofit2.http.Path interface TopAnimeApi { - @GET("v3/top/anime") - fun getTopAnimeData(): Call<TopAnimeResponse> + @GET("v3/top/anime/{page}") + fun getTopAnimeData(@Path("page") page: Int): Call<TopAnimeResponse> }
\ 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 d62e5b2..babb7c1 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 @@ -31,6 +31,7 @@ class TopAnimePage : Fragment() { .setLenient() .create() var baseUrl = "https://api.jikan.moe/" //the api's base url + var page: Int = 1 override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -45,10 +46,11 @@ class TopAnimePage : Fragment() { if (animeList != null) { showList(view, animeList) } else { - makeApiCall(view, baseUrl) + makeApiCall(view, baseUrl, 1) } return view + } private fun getDataFromCache(): List<TopAnime>? { @@ -71,16 +73,34 @@ class TopAnimePage : Fragment() { view.findViewById<Button>(R.id.button_home).setOnClickListener { findNavController().navigate(R.id.action_TopAnimePage_to_HomePage) } + view.findViewById<Button>(R.id.button_prev).setOnClickListener { + if (page > 1) { + page -= 1 + makeApiCall(view, baseUrl, page) + Snackbar.make(requireView(), "Page $page has been loaded.", Snackbar.LENGTH_SHORT) + .setAction("Action", null).show() + } else { + Snackbar.make(requireView(), "You're already on page 1.", Snackbar.LENGTH_SHORT) + .setAction("Action", null).show() + } + } + view.findViewById<Button>(R.id.button_next).setOnClickListener { + page += 1 + makeApiCall(view, baseUrl, page) + Snackbar.make(requireView(), "Page $page has been loaded.", Snackbar.LENGTH_SHORT) + .setAction("Action", null).show() + } fun updateList() { - makeApiCall(view, baseUrl) - Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG) + makeApiCall(view, baseUrl, 1) + Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_SHORT) .setAction("Action", null).show() } val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh) swipeRefresh.setOnRefreshListener { updateList() + page = 1 swipeRefresh.isRefreshing = false } @@ -95,7 +115,7 @@ class TopAnimePage : Fragment() { (recyclerView.adapter as TopAnimeAdapter).notifyDataSetChanged() } - private fun makeApiCall(view: View, BASE_URL: String) { + private fun makeApiCall(view: View, BASE_URL: String, page: Int) { val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) @@ -103,7 +123,7 @@ class TopAnimePage : Fragment() { .build() val service = retrofit.create(TopAnimeApi::class.java) - val call = service.getTopAnimeData() + val call = service.getTopAnimeData(page) call.enqueue(object : Callback<TopAnimeResponse> { override fun onResponse( @@ -142,7 +162,11 @@ class TopAnimePage : Fragment() { } private fun showError() { - Snackbar.make(requireView(), "API ERROR", Snackbar.LENGTH_LONG) + Snackbar.make( + requireView(), + "API ERROR : Verify your internet connection.", + Snackbar.LENGTH_LONG + ) .setAction("Action", null).show() } diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt index ea240b9..9c138a3 100644 --- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt +++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt @@ -24,7 +24,6 @@ import retrofit2.converter.gson.GsonConverterFactory import xyz.adjutor.aniki.R import java.lang.reflect.Type - class TopMangaPage : Fragment() { private lateinit var sharedPreferences: SharedPreferences @@ -50,24 +49,6 @@ class TopMangaPage : Fragment() { makeApiCall(view, baseUrl, 1) } - // add other pages when we touch the bottom - val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view) - recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { - super.onScrollStateChanged(recyclerView, newState) - if (!recyclerView.canScrollVertically(1)) { //direction integers: -1 for up, 1 for down, 0 will always return false. - page += 1 - makeApiCall(view, baseUrl, page) - Snackbar.make( - requireView(), - "Page $page has been loaded.", - Snackbar.LENGTH_LONG - ) - .setAction("Action", null).show() - } - } - }) - return view } @@ -96,23 +77,23 @@ class TopMangaPage : Fragment() { if (page > 1) { page -= 1 makeApiCall(view, baseUrl, page) - Snackbar.make(requireView(), "Page $page has been loaded.", Snackbar.LENGTH_LONG) + Snackbar.make(requireView(), "Page $page has been loaded.", Snackbar.LENGTH_SHORT) .setAction("Action", null).show() } else { - Snackbar.make(requireView(), "You're already page 1.", Snackbar.LENGTH_LONG) + Snackbar.make(requireView(), "You're already on page 1.", Snackbar.LENGTH_SHORT) .setAction("Action", null).show() } } view.findViewById<Button>(R.id.button_next).setOnClickListener { page += 1 makeApiCall(view, baseUrl, page) - Snackbar.make(requireView(), "Page $page has been loaded.", Snackbar.LENGTH_LONG) + Snackbar.make(requireView(), "Page $page has been loaded.", Snackbar.LENGTH_SHORT) .setAction("Action", null).show() } fun updateList() { makeApiCall(view, baseUrl, 1) - Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG) + Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_SHORT) .setAction("Action", null).show() } @@ -182,7 +163,11 @@ class TopMangaPage : Fragment() { } private fun showError() { - Snackbar.make(requireView(), "API ERROR", Snackbar.LENGTH_LONG) + Snackbar.make( + requireView(), + "API ERROR : Verify your internet connection.", + Snackbar.LENGTH_LONG + ) .setAction("Action", null).show() } diff --git a/app/src/main/res/layout/top_anime_page.xml b/app/src/main/res/layout/top_anime_page.xml index c7ec862..6797660 100644 --- a/app/src/main/res/layout/top_anime_page.xml +++ b/app/src/main/res/layout/top_anime_page.xml @@ -25,6 +25,14 @@ </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> <Button + android:id="@+id/button_prev" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/prev" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@id/button_home" /> + + <Button android:id="@+id/button_home" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -33,4 +41,12 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> + <Button + android:id="@+id/button_next" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/next" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@id/button_home" /> + </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file |