From ac950ab43854d06ac8ceee3c2402bdee5e13870e Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Mon, 22 Feb 2021 20:55:37 +0100
Subject: SwipeRefresh implemented and added to mangas.

---
 app/build.gradle                                             |  7 +++++--
 app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaPage.kt | 12 ++++++++++++
 app/src/main/res/layout/top_manga_page.xml                   |  8 +++++++-
 3 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index d1d101c..6a990f2 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -56,11 +56,14 @@ dependencies {
     testImplementation 'junit:junit:4.13.2'
 
     // Required for instrumented tests
-    androidTestImplementation 'com.android.support:support-annotations:28.0.0'
-    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'androidx.annotation:annotation:1.1.0'
+    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
 
     //Glide to display images properly
     implementation 'com.github.bumptech.glide:glide:4.12.0'
     annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
 
+    //swipe feature
+    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaPage.kt
index f99cd9a..c8075b2 100644
--- a/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaPage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaPage.kt
@@ -11,6 +11,7 @@ import androidx.fragment.app.Fragment
 import androidx.navigation.fragment.findNavController
 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.GsonBuilder
 import com.google.gson.reflect.TypeToken
@@ -70,6 +71,17 @@ class TopMangaPage : Fragment() {
             findNavController().navigate(R.id.action_TopMangaPage_to_HomePage)
         }
 
+        fun updateList() {
+            makeApiCall(view,base_url)
+            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG)
+                .setAction("Action", null).show()
+        }
+        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
+        swipeRefresh.setOnRefreshListener{
+            updateList()
+            swipeRefresh.isRefreshing = false
+        }
+
     }
 
     //display the recyclerview
diff --git a/app/src/main/res/layout/top_manga_page.xml b/app/src/main/res/layout/top_manga_page.xml
index 95c9161..37150f7 100644
--- a/app/src/main/res/layout/top_manga_page.xml
+++ b/app/src/main/res/layout/top_manga_page.xml
@@ -8,6 +8,10 @@
     tools:context=".topmanga.TopMangaPage"
     android:background="@color/very_dark_purple">
 
+    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+        android:id="@+id/swiperefresh"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/recycler_view"
         android:layout_width="0dp"
@@ -16,7 +20,9 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
-        tools:listitem="@layout/item_layout" />
+        tools:listitem="@layout/item_layout"
+        android:scrollbars="vertical"/>
+    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 
     <Button
         android:id="@+id/button_home"
-- 
cgit v1.2.3


From d54ff3be42662f304879d5bd851641554ad1013c Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Mon, 22 Feb 2021 20:56:09 +0100
Subject: SwipeRefresh added to top anime.

---
 app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimePage.kt | 12 ++++++++++++
 app/src/main/res/layout/top_anime_page.xml                   |  8 +++++++-
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimePage.kt
index f2d5e4c..91a33ef 100644
--- a/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimePage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimePage.kt
@@ -11,6 +11,7 @@ import androidx.fragment.app.Fragment
 import androidx.navigation.fragment.findNavController
 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.GsonBuilder
 import com.google.gson.reflect.TypeToken
@@ -70,6 +71,17 @@ class TopAnimePage : Fragment() {
             findNavController().navigate(R.id.action_TopAnimePage_to_HomePage)
         }
 
+        fun updateList() {
+            makeApiCall(view,base_url)
+            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG)
+                .setAction("Action", null).show()
+        }
+        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
+        swipeRefresh.setOnRefreshListener{
+            updateList()
+            swipeRefresh.isRefreshing = false
+        }
+
     }
 
     //display the recyclerview
diff --git a/app/src/main/res/layout/top_anime_page.xml b/app/src/main/res/layout/top_anime_page.xml
index 4b6a58f..4bcc377 100644
--- a/app/src/main/res/layout/top_anime_page.xml
+++ b/app/src/main/res/layout/top_anime_page.xml
@@ -8,6 +8,10 @@
     tools:context=".topanime.TopAnimePage"
     android:background="@color/very_dark_purple">
 
+    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+        android:id="@+id/swiperefresh"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/recycler_view"
         android:layout_width="0dp"
@@ -16,7 +20,9 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
-        tools:listitem="@layout/item_layout" />
+        tools:listitem="@layout/item_layout"
+        android:scrollbars="vertical" />
+    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 
     <Button
         android:id="@+id/button_home"
-- 
cgit v1.2.3


From de9fb104c6a7c1e07caeda4570975c1bc651c491 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Mon, 22 Feb 2021 21:21:04 +0100
Subject: Removed the settings option in the actionbar

---
 app/src/main/java/xyz/adjutor/aniki/MainActivity.kt | 18 ------------------
 app/src/main/res/menu/menu_main.xml                 | 10 ----------
 2 files changed, 28 deletions(-)
 delete mode 100644 app/src/main/res/menu/menu_main.xml

diff --git a/app/src/main/java/xyz/adjutor/aniki/MainActivity.kt b/app/src/main/java/xyz/adjutor/aniki/MainActivity.kt
index a195f97..ddc054f 100644
--- a/app/src/main/java/xyz/adjutor/aniki/MainActivity.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/MainActivity.kt
@@ -1,8 +1,6 @@
 package xyz.adjutor.aniki
 
 import android.os.Bundle
-import android.view.Menu
-import android.view.MenuItem
 import androidx.appcompat.app.AppCompatActivity
 
 class MainActivity : AppCompatActivity() {
@@ -12,20 +10,4 @@ class MainActivity : AppCompatActivity() {
         setContentView(R.layout.activity_main)
         setSupportActionBar(findViewById(R.id.toolbar))
     }
-
-    override fun onCreateOptionsMenu(menu: Menu): Boolean {
-        // Inflate the menu; this adds items to the action bar if it is present.
-        menuInflater.inflate(R.menu.menu_main, menu)
-        return true
-    }
-
-    override fun onOptionsItemSelected(item: MenuItem): Boolean {
-        // Handle action bar item clicks here. The action bar will
-        // automatically handle clicks on the Home/Up button, so long
-        // as you specify a parent activity in AndroidManifest.xml.
-        return when (item.itemId) {
-            R.id.action_settings -> true
-            else -> super.onOptionsItemSelected(item)
-        }
-    }
 }
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
deleted file mode 100644
index 4d1a64f..0000000
--- a/app/src/main/res/menu/menu_main.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    tools:context="xyz.adjutor.aniki.MainActivity">
-    <item
-        android:id="@+id/action_settings"
-        android:orderInCategory="100"
-        android:title="@string/action_settings"
-        app:showAsAction="never" />
-</menu>
\ No newline at end of file
-- 
cgit v1.2.3


From c39f8d7212b8973893ef1197655a3ecafef9804f Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 23 Feb 2021 12:58:06 +0100
Subject: changed the bg color of the icon.

---
 app/src/main/ic_launcher-playstore.png              | Bin 46963 -> 47412 bytes
 .../main/res/drawable/ic_launcher_background.xml    |   2 +-
 app/src/main/res/mipmap-hdpi/ic_launcher.png        | Bin 2252 -> 2255 bytes
 .../main/res/mipmap-hdpi/ic_launcher_foreground.png | Bin 4526 -> 4526 bytes
 app/src/main/res/mipmap-hdpi/ic_launcher_round.png  | Bin 4198 -> 4229 bytes
 app/src/main/res/mipmap-mdpi/ic_launcher.png        | Bin 1355 -> 1353 bytes
 .../main/res/mipmap-mdpi/ic_launcher_foreground.png | Bin 2501 -> 2505 bytes
 app/src/main/res/mipmap-mdpi/ic_launcher_round.png  | Bin 2435 -> 2464 bytes
 app/src/main/res/mipmap-xhdpi/ic_launcher.png       | Bin 3530 -> 3536 bytes
 .../res/mipmap-xhdpi/ic_launcher_foreground.png     | Bin 6850 -> 6903 bytes
 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png | Bin 6329 -> 6341 bytes
 app/src/main/res/mipmap-xxhdpi/ic_launcher.png      | Bin 6289 -> 6276 bytes
 .../res/mipmap-xxhdpi/ic_launcher_foreground.png    | Bin 12195 -> 12219 bytes
 .../main/res/mipmap-xxhdpi/ic_launcher_round.png    | Bin 10864 -> 10868 bytes
 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png     | Bin 9367 -> 9379 bytes
 .../res/mipmap-xxxhdpi/ic_launcher_foreground.png   | Bin 18030 -> 18081 bytes
 .../main/res/mipmap-xxxhdpi/ic_launcher_round.png   | Bin 16049 -> 16099 bytes
 app/src/main/res/values/colors.xml                  |   2 --
 18 files changed, 1 insertion(+), 3 deletions(-)

diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png
index 1d40b22..7ec9dd9 100644
Binary files a/app/src/main/ic_launcher-playstore.png and b/app/src/main/ic_launcher-playstore.png differ
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
index 16c436c..ff2a106 100644
--- a/app/src/main/res/drawable/ic_launcher_background.xml
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -5,7 +5,7 @@
     android:viewportWidth="108"
     android:viewportHeight="108">
     <path
-        android:fillColor="#333333"
+        android:fillColor="#09022A"
         android:pathData="M0,0h108v108h-108z" />
 
 </vector>
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index 0fce361..f455466 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
index 5429d13..8c80415 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
index 7f6c2ad..dffa9de 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 735ecf0..85122da 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
index b994dd7..1a34a8f 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
index baa9a61..c49deab 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 3ead759..af69e12 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
index 26fa079..f56b5b8 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
index efdcdac..b25aedf 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 14126a1..fa73bbd 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
index 698f5ff..5757f58 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
index ba6ab2e..0acc8b4 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index 5524755..af4bdc6 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
index a4ef2dc..af2b644 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
index e4a88ec..64170bb 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 95a118e..ae0a497 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -3,8 +3,6 @@
     <color name="purple_200">#FFBB86FC</color>
     <color name="purple_500">#FF6200EE</color>
     <color name="purple_700">#FF3700B3</color>
-    <color name="teal_200">#FF03DAC5</color>
-    <color name="teal_700">#FF018786</color>
     <color name="black">#FF000000</color>
     <color name="white">#FFFFFFFF</color>
 
-- 
cgit v1.2.3


From 9e1f3503c1a80d7e108f60f9065ae08abb7c2b3f Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 23 Feb 2021 14:53:15 +0100
Subject: Started README and moved the packages.

---
 README.md                                          |  27 +++
 app/src/main/AndroidManifest.xml                   |   4 +-
 .../aniki/anime/topanime/DetailTopAnimeActivity.kt | 172 +++++++++++++++++++
 .../aniki/anime/topanime/RestTopAnimeResponse.kt   |  13 ++
 .../xyz/adjutor/aniki/anime/topanime/TopAnime.kt   |  27 +++
 .../aniki/anime/topanime/TopAnimeAdapter.kt        |  79 +++++++++
 .../adjutor/aniki/anime/topanime/TopAnimeApi.kt    |  11 ++
 .../adjutor/aniki/anime/topanime/TopAnimePage.kt   | 139 +++++++++++++++
 .../aniki/manga/topmanga/DetailTopMangaActivity.kt | 186 +++++++++++++++++++++
 .../aniki/manga/topmanga/RestTopMangaResponse.kt   |  13 ++
 .../xyz/adjutor/aniki/manga/topmanga/TopManga.kt   |  27 +++
 .../aniki/manga/topmanga/TopMangaAdapter.kt        |  79 +++++++++
 .../adjutor/aniki/manga/topmanga/TopMangaApi.kt    |  11 ++
 .../adjutor/aniki/manga/topmanga/TopMangaPage.kt   | 139 +++++++++++++++
 .../aniki/topanime/DetailTopAnimeActivity.kt       | 172 -------------------
 .../adjutor/aniki/topanime/RestTopAnimeResponse.kt |  13 --
 .../java/xyz/adjutor/aniki/topanime/TopAnime.kt    |  27 ---
 .../xyz/adjutor/aniki/topanime/TopAnimeAdapter.kt  |  79 ---------
 .../java/xyz/adjutor/aniki/topanime/TopAnimeApi.kt |  11 --
 .../xyz/adjutor/aniki/topanime/TopAnimePage.kt     | 139 ---------------
 .../aniki/topmanga/DetailTopMangaActivity.kt       | 186 ---------------------
 .../adjutor/aniki/topmanga/RestTopMangaResponse.kt |  13 --
 .../java/xyz/adjutor/aniki/topmanga/TopManga.kt    |  27 ---
 .../xyz/adjutor/aniki/topmanga/TopMangaAdapter.kt  |  79 ---------
 .../java/xyz/adjutor/aniki/topmanga/TopMangaApi.kt |  11 --
 .../xyz/adjutor/aniki/topmanga/TopMangaPage.kt     | 139 ---------------
 .../main/res/layout/activity_detail_top_anime.xml  |   3 +-
 .../main/res/layout/activity_detail_top_manga.xml  |   3 +-
 app/src/main/res/layout/top_anime_page.xml         |   2 +-
 app/src/main/res/layout/top_manga_page.xml         |   2 +-
 app/src/main/res/navigation/nav_graph.xml          |   4 +-
 31 files changed, 933 insertions(+), 904 deletions(-)
 create mode 100644 README.md
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/topanime/DetailTopAnimeActivity.kt
 create 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/TopAnime.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimePage.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/RestTopMangaResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topanime/DetailTopAnimeActivity.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topanime/RestTopAnimeResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topanime/TopAnime.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimeAdapter.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimeApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimePage.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topmanga/DetailTopMangaActivity.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topmanga/RestTopMangaResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topmanga/TopManga.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaAdapter.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaPage.kt

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..9777d6c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,27 @@
+List of elements used in top manga and top anime with a recycler view
+SwipeRefresh used to refresh the list data.
+
+Details of a chosen element from the recycler view with an intent object
+Title, synopsys and background clickable.
+URL link openable.
+
+Multiple calls of the REST API from jikan.moe.
+Usage of :
+/v3/top/manga
+/v3/top/anime
+/v3/manga
+/v3/anime
+
+Data storage with sharedpreferences used for the recycler view of top manga and top anime as well as the details
+Saves the detail page of an item when opened, not when the list is shown
+Usage of ScrollView in the detail page. Thus, items with long synopsis and background aren't cut down.
+
+Used my "personal" theme colors for the app.
+It consists of colors of the pink/purple "family" :
+very dark purple : #09022A
+very light magenta : #FF70FF
+strong pink : #D52C70
+slightly desaturated magenta : #c583b6
+
+
+Development done with a Gitflow workflow.
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 09802b7..c24711c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,11 +14,11 @@
         android:theme="@style/Theme.Aniki"
         tools:ignore="AllowBackup">
         <activity
-            android:name=".topmanga.DetailTopMangaActivity"
+            android:name="xyz.adjutor.aniki.manga.topmanga.DetailTopMangaActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
         <activity
-            android:name=".topanime.DetailTopAnimeActivity"
+            android:name="xyz.adjutor.aniki.anime.topanime.DetailTopAnimeActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
         <activity
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
new file mode 100644
index 0000000..0db1ca1
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/DetailTopAnimeActivity.kt
@@ -0,0 +1,172 @@
+package xyz.adjutor.aniki.anime.topanime
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+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.anime.AnimeApi
+import xyz.adjutor.aniki.anime.RestAnimeResponse
+import java.lang.reflect.Type
+
+class DetailTopAnimeActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    var sharedPreferences: SharedPreferences? = null
+    private val gson = GsonBuilder()
+            .setLenient()
+            .create()
+
+    private val intentAnimeId = "theanimeid"
+    private val intentAnimeTitle = "theanimetitle"
+    private val intentAnimeRank = "theanimerank"
+    private val intentAnimeScore = "theanimescore"
+    private val intentAnimeImageUrl = "theanimeimageurl"
+
+    private val intentAnimeEpisodes = "theanimeepisodes"
+    private val intentAnimeStartDate = "theanimestartdate"
+    private val intentAnimeEndDate = "theanimeenddate"
+    private val intentAnimeUrl = "theanimeurl"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_top_anime)
+
+        sharedPreferences = this.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
+
+        val animeId = intent.getStringExtra(intentAnimeId)
+        val animeTitle = intent.getStringExtra(intentAnimeTitle)
+        val animeRank = intent.getStringExtra(intentAnimeRank)
+        val animeScore = intent.getStringExtra(intentAnimeScore)
+        val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
+
+        val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes)
+        val animeStartDate = intent.getStringExtra(intentAnimeStartDate)
+        val animeEndDate = intent.getStringExtra(intentAnimeEndDate)
+        val animeUrl = intent.getStringExtra(intentAnimeUrl)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+
+        val tvEpisodes: TextView = findViewById(R.id.tv_episodes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+
+        tvId.text = animeId
+        tvTitle.text = animeTitle
+        tvRank.text = animeRank
+        tvScore.text = animeScore
+        Glide
+            .with(this)
+            .load(animeImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+
+        //using null as a string because it has been converted to a string before
+        tvEpisodes.text = if (animeEpisodes != "null"){
+            animeEpisodes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = animeStartDate
+
+        tvEndDate.text = if (animeEndDate != "null"){
+            animeEndDate
+        } else {
+            fieldIsNull()
+        }
+
+        tvUrl.text = animeUrl
+
+        val anime: RestAnimeResponse? = getDataFromCache(animeId.toString())
+        if(anime != null ){
+            showDetail(anime)
+        } else {
+            //taking the API's fields I want and displaying them
+            makeApiCall(baseUrl, animeId.toString())
+        }
+
+    }
+
+    private fun getDataFromCache(animeId: String): RestAnimeResponse? {
+        val jsonAnime: String?= sharedPreferences?.getString(animeId, null)
+
+        return if(jsonAnime == null) {
+            null
+        } else {
+            val type: Type = object : TypeToken<RestAnimeResponse>() {}.type
+            gson.fromJson(jsonAnime, type)
+        }
+    }
+
+    private fun makeApiCall(BASE_URL: String, animeId: String) {
+
+        val retrofit = Retrofit.Builder()
+                .baseUrl(BASE_URL)
+                .addConverterFactory(GsonConverterFactory.create(gson))
+                .build()
+
+        val service = retrofit.create(AnimeApi::class.java)
+        val call = service.getAnimeData(animeId) //based on the id
+
+        call.enqueue(object : Callback<RestAnimeResponse> {
+            override fun onResponse(call: Call<RestAnimeResponse>, response: Response<RestAnimeResponse>) {
+                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
+                    saveList(anime)
+                    showDetail(anime!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<RestAnimeResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(anime: RestAnimeResponse) {
+        //elements from RestAnimeResponse
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+
+        tvSynopsis.text = anime.synopsis.toString()
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+    private fun fieldIsNull(): String{
+        return "Unknown"
+    }
+
+    fun saveList(anime: RestAnimeResponse?) {
+        val jsonString: String = gson.toJson(anime)
+
+        sharedPreferences
+                ?.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
new file mode 100644
index 0000000..edc11cf
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/RestTopAnimeResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.anime.topanime
+
+import com.google.gson.annotations.SerializedName
+
+class RestTopAnimeResponse {
+
+    @SerializedName("top")
+    var top: List<TopAnime>? = null
+
+    fun getResults(): List<TopAnime> {
+        return top!!
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnime.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnime.kt
new file mode 100644
index 0000000..f8093f6
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnime.kt
@@ -0,0 +1,27 @@
+package xyz.adjutor.aniki.anime.topanime
+
+import com.google.gson.annotations.SerializedName
+
+//Content of the top field from the api of top anime
+class TopAnime{
+
+    @SerializedName("mal_id")
+    var mal_id: Int? = null
+    @SerializedName("rank")
+    var rank: Int? = null
+    @SerializedName("title")
+    var title: String? = null
+    @SerializedName("url")
+    var url: String? = null
+    @SerializedName("episodes")
+    var episodes: Int? = null
+    @SerializedName("start_date")
+    var start_date: String? = null
+    @SerializedName("end_date")
+    var end_date: String? = null
+    @SerializedName("score")
+    var score: Float? = null
+    @SerializedName("image_url")
+    var image_url: String? = null
+
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt
new file mode 100644
index 0000000..bda6ec5
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt
@@ -0,0 +1,79 @@
+package xyz.adjutor.aniki.anime.topanime
+
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+
+class TopAnimeAdapter(private val animeList: List<TopAnime>) :
+        RecyclerView.Adapter<TopAnimeAdapter.AnimeViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val animeTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val animeScore: TextView = itemView.findViewById(R.id.tv_score)
+        val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
+        val view = LayoutInflater.from(parent.context)
+                .inflate(R.layout.item_layout, parent, false)
+
+        return AnimeViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return animeList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
+        val currentAnime: TopAnime = animeList[position]
+        holder.animeTitle.text = currentAnime.title
+        holder.animeRank.text = currentAnime.rank.toString()
+        holder.animeScore.text = currentAnime.score.toString()
+        val image: String = currentAnime.image_url.toString()
+        Glide
+                .with(holder.itemView.context)
+                .load(image)
+                .apply(RequestOptions().override(400))
+                .into(holder.animeImage)
+
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentAnimeId = "theanimeid"
+            val currentAnimeTitle = "theanimetitle"
+            val currentAnimeRank = "theanimerank"
+            val currentAnimeScore = "theanimescore"
+            val currentAnimeImageUrl = "theanimeimageurl"
+            val currentAnimeEpisodes = "theanimeepisodes"
+            val currentAnimeStartDate = "theanimestartdate"
+            val currentAnimeEndDate = "theanimeenddate"
+            val currentAnimeUrl = "theanimeurl"
+
+            val intent: Intent = Intent(holder.itemView.context, DetailTopAnimeActivity::class.java).apply {
+                putExtra(currentAnimeId, currentAnime.mal_id.toString())
+                putExtra(currentAnimeTitle, currentAnime.title)
+                putExtra(currentAnimeRank, currentAnime.rank.toString())
+                putExtra(currentAnimeScore, currentAnime.score.toString())
+                putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
+                putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
+                putExtra(currentAnimeStartDate, currentAnime.start_date)
+                putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
+                putExtra(currentAnimeUrl, currentAnime.url.toString())
+            }
+            holder.itemView.context.startActivity(intent)
+        }
+    }
+}
\ 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
new file mode 100644
index 0000000..a5b3b59
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeApi.kt
@@ -0,0 +1,11 @@
+package xyz.adjutor.aniki.anime.topanime
+
+import retrofit2.Call
+import retrofit2.http.GET
+
+interface TopAnimeApi {
+
+    @GET("v3/top/anime")
+    fun getTopAnimeData(): Call<RestTopAnimeResponse>
+
+}
\ 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
new file mode 100644
index 0000000..efa45dd
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimePage.kt
@@ -0,0 +1,139 @@
+package xyz.adjutor.aniki.anime.topanime
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+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.GsonBuilder
+import com.google.gson.reflect.TypeToken
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.R
+import java.lang.reflect.Type
+
+class TopAnimePage : Fragment() {
+
+    var sharedPreferences: SharedPreferences? = null
+    val gson = GsonBuilder()
+            .setLenient()
+            .create()
+    var base_url = "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
+        val view = inflater.inflate(R.layout.top_anime_page, container, false)
+
+        sharedPreferences = view.context.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
+
+        val animeList: List<TopAnime>? = getDataFromCache()
+        if(animeList != null ){
+            showList(view, animeList)
+        } else {
+            makeApiCall(view, base_url)
+        }
+
+        return view
+    }
+
+    private fun getDataFromCache(): List<TopAnime>? {
+        //the value of the animeList json, if nothing is found, return null
+        val jsonAnime: String? = sharedPreferences?.getString("jsonAnimeList", null)
+
+        //if it's null, well, return null
+        if(jsonAnime == null) {
+            return null
+        } else { //else deserialize the list and return it
+            val listType: Type = object : TypeToken<List<TopAnime>>() {}.type
+            return gson.fromJson(jsonAnime, listType)
+        }
+    }
+
+    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_TopAnimePage_to_HomePage)
+        }
+
+        fun updateList() {
+            makeApiCall(view,base_url)
+            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG)
+                .setAction("Action", null).show()
+        }
+        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
+        swipeRefresh.setOnRefreshListener{
+            updateList()
+            swipeRefresh.isRefreshing = false
+        }
+
+    }
+
+    //display the recyclerview
+    fun showList(view: View, animeList: List<TopAnime> ){
+        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
+        recyclerView.setHasFixedSize(true)
+        recyclerView.layoutManager = LinearLayoutManager(view.context)
+        recyclerView.adapter = TopAnimeAdapter(animeList)
+    }
+
+    private fun makeApiCall(view: View, BASE_URL: String) {
+
+        val retrofit = Retrofit.Builder()
+                .baseUrl(BASE_URL)
+                .addConverterFactory(GsonConverterFactory.create(gson))
+                .build()
+
+        val service = retrofit.create(TopAnimeApi::class.java)
+        val call = service.getTopAnimeData()
+
+        call.enqueue(object : Callback<RestTopAnimeResponse> {
+            override fun onResponse(call: Call<RestTopAnimeResponse>, response: Response<RestTopAnimeResponse>) {
+                if(response.isSuccessful && response.body() != null){ //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val animeList: List<TopAnime> = response.body()!!.getResults() //getting the "top" field containing our list of TopAnimes
+                    saveList(animeList)
+                    showList(view, animeList) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<RestTopAnimeResponse>, t: Throwable) {
+                showError()
+            }
+
+        })
+    }
+
+    private fun saveList(animeList: List<TopAnime>) {
+        val jsonString: String = gson.toJson(animeList)
+
+        sharedPreferences
+                ?.edit()
+                ?.putString("jsonAnimeList", jsonString)
+                ?.apply()
+    }
+
+    private fun showError() {
+        Snackbar.make(requireView(), "API ERROR", Snackbar.LENGTH_LONG)
+                .setAction("Action", null).show()
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
new file mode 100644
index 0000000..0d0d4b5
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
@@ -0,0 +1,186 @@
+package xyz.adjutor.aniki.manga.topmanga
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+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.manga.MangaApi
+import xyz.adjutor.aniki.manga.RestMangaResponse
+import java.lang.reflect.Type
+
+class DetailTopMangaActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    var sharedPreferences: SharedPreferences? = null
+    private val gson = GsonBuilder()
+            .setLenient()
+            .create()
+
+    private val intentMangaId = "themangaid"
+    private val intentMangaTitle = "themangatitle"
+    private val intentMangaRank = "themangarank"
+    private val intentMangaScore = "themangascore"
+    private val intentMangaImageUrl = "themangaimageurl"
+
+    private val intentMangaVolumes = "themangavolumes"
+    private val intentMangaStartDate = "themangastartdate"
+    private val intentMangaEndDate = "themangaenddate"
+    private val intentMangaUrl = "themangaurl"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_top_manga)
+
+        sharedPreferences = this.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
+
+        val mangaId = intent.getStringExtra(intentMangaId)
+        val mangaTitle = intent.getStringExtra(intentMangaTitle)
+        val mangaRank = intent.getStringExtra(intentMangaRank)
+        val mangaScore = intent.getStringExtra(intentMangaScore)
+        val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
+
+        val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
+        val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
+        val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
+        val mangaUrl = intent.getStringExtra(intentMangaUrl)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+
+        val tvVolumes: TextView = findViewById(R.id.tv_volumes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+
+        tvId.text = mangaId
+        tvTitle.text = mangaTitle
+        tvRank.text = mangaRank
+        tvScore.text = mangaScore
+        Glide
+            .with(this)
+            .load(mangaImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+
+        //using null as a string because it has been converted to a string before
+        tvVolumes.text = if (mangaVolumes != "null"){
+            mangaVolumes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = mangaStartDate
+
+        tvEndDate.text = if (mangaEndDate != "null"){
+            mangaEndDate
+        } else {
+            fieldIsNull()
+        }
+
+        tvUrl.text = mangaUrl
+
+        val manga: RestMangaResponse? = getDataFromCache(mangaId.toString())
+        if(manga != null ){
+            showDetail(manga)
+        } else {
+            //taking the API's fields I want and displaying them
+            makeApiCall(baseUrl, mangaId.toString())
+        }
+
+    }
+
+    private fun getDataFromCache(mangaId: String): RestMangaResponse? {
+        val jsonManga: String?= sharedPreferences?.getString(mangaId, null)
+
+        return if(jsonManga == null) {
+            null
+        } else {
+            val type: Type = object : TypeToken<RestMangaResponse>() {}.type
+            gson.fromJson(jsonManga, type)
+        }
+    }
+
+    private fun makeApiCall(BASE_URL: String, mangaId: String) {
+
+        val retrofit = Retrofit.Builder()
+                .baseUrl(BASE_URL)
+                .addConverterFactory(GsonConverterFactory.create(gson))
+                .build()
+
+        val service = retrofit.create(MangaApi::class.java)
+        val call = service.getMangaData(mangaId) //based on the id
+
+        call.enqueue(object : Callback<RestMangaResponse> {
+            override fun onResponse(call: Call<RestMangaResponse>, response: Response<RestMangaResponse>) {
+                if(response.isSuccessful && response.body() != null){ //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val manga = response.body() //getting the RestMangaResponse fields
+                    saveList(manga)
+                    showDetail(manga!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<RestMangaResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(manga: RestMangaResponse) {
+        //elements from RestMangaResponse
+        val tvChapters: TextView = findViewById(R.id.tv_chapters)
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+        val tvBackground: TextView = findViewById(R.id.tv_background)
+
+        tvChapters.text = if (manga.chapters != null){
+            manga.chapters.toString()
+        } else {
+            fieldIsNull()
+        }
+
+        tvSynopsis.text = manga.synopsis.toString()
+
+        tvBackground.text = if (manga.background != null){
+            manga.background.toString()
+        } else {
+            fieldIsNull()
+        }
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+    private fun fieldIsNull(): String{
+        return "Unknown"
+    }
+
+    fun saveList(manga: RestMangaResponse?) {
+        val jsonString: String = gson.toJson(manga)
+
+        sharedPreferences
+                ?.edit()
+                ?.putString(manga?.mal_id.toString(), jsonString)
+                ?.apply()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/RestTopMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/RestTopMangaResponse.kt
new file mode 100644
index 0000000..87c5cfb
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/RestTopMangaResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.manga.topmanga
+
+import com.google.gson.annotations.SerializedName
+
+class RestTopMangaResponse {
+
+    @SerializedName("top")
+    var top: List<TopManga>? = null
+
+    fun getResults(): List<TopManga> {
+        return top!!
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt
new file mode 100644
index 0000000..8d952b3
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt
@@ -0,0 +1,27 @@
+package xyz.adjutor.aniki.manga.topmanga
+
+import com.google.gson.annotations.SerializedName
+
+//Content of the top field from the api of top manga
+class TopManga{
+
+    @SerializedName("mal_id")
+    var mal_id: Int? = null
+    @SerializedName("rank")
+    var rank: Int? = null
+    @SerializedName("title")
+    var title: String? = null
+    @SerializedName("url")
+    var url: String? = null
+    @SerializedName("volumes")
+    var volumes: Int? = null
+    @SerializedName("start_date")
+    var start_date: String? = null
+    @SerializedName("end_date")
+    var end_date: String? = null
+    @SerializedName("score")
+    var score: Float? = null
+    @SerializedName("image_url")
+    var image_url: String? = null
+
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
new file mode 100644
index 0000000..a259750
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
@@ -0,0 +1,79 @@
+package xyz.adjutor.aniki.manga.topmanga
+
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+
+class TopMangaAdapter(private val mangaList: List<TopManga>) :
+        RecyclerView.Adapter<TopMangaAdapter.MangaViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val mangaTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
+        val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
+        val view = LayoutInflater.from(parent.context)
+                .inflate(R.layout.item_layout, parent, false)
+
+        return MangaViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return mangaList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
+        val currentManga: TopManga = mangaList[position]
+        holder.mangaTitle.text = currentManga.title
+        holder.mangaRank.text = currentManga.rank.toString()
+        holder.mangaScore.text = currentManga.score.toString()
+        val image: String = currentManga.image_url.toString()
+        Glide
+                .with(holder.itemView.context)
+                .load(image)
+                .apply(RequestOptions().override(400))
+                .into(holder.mangaImage)
+
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentMangaId = "themangaid"
+            val currentMangaTitle = "themangatitle"
+            val currentMangaRank = "themangarank"
+            val currentMangaScore = "themangascore"
+            val currentMangaImageUrl = "themangaimageurl"
+            val currentMangaVolumes = "themangavolumes"
+            val currentMangaStartDate = "themangastartdate"
+            val currentMangaEndDate = "themangaenddate"
+            val currentMangaUrl = "themangaurl"
+
+            val intent: Intent = Intent(holder.itemView.context, DetailTopMangaActivity::class.java).apply {
+                putExtra(currentMangaId, currentManga.mal_id.toString())
+                putExtra(currentMangaTitle, currentManga.title)
+                putExtra(currentMangaRank, currentManga.rank.toString())
+                putExtra(currentMangaScore, currentManga.score.toString())
+                putExtra(currentMangaImageUrl, currentManga.image_url.toString())
+                putExtra(currentMangaVolumes, currentManga.volumes.toString())
+                putExtra(currentMangaStartDate, currentManga.start_date)
+                putExtra(currentMangaEndDate, currentManga.end_date.toString())
+                putExtra(currentMangaUrl, currentManga.url.toString())
+            }
+            holder.itemView.context.startActivity(intent)
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
new file mode 100644
index 0000000..278c3e1
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
@@ -0,0 +1,11 @@
+package xyz.adjutor.aniki.manga.topmanga
+
+import retrofit2.Call
+import retrofit2.http.GET
+
+interface TopMangaApi {
+
+    @GET("v3/top/manga")
+    fun getTopMangaData(): Call<RestTopMangaResponse>
+
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..d28161a
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt
@@ -0,0 +1,139 @@
+package xyz.adjutor.aniki.manga.topmanga
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+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.GsonBuilder
+import com.google.gson.reflect.TypeToken
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.R
+import java.lang.reflect.Type
+
+class TopMangaPage : Fragment() {
+
+    var sharedPreferences: SharedPreferences? = null
+    val gson = GsonBuilder()
+            .setLenient()
+            .create()
+    var base_url = "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
+        val view = inflater.inflate(R.layout.top_manga_page, container, false)
+
+        sharedPreferences = view.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
+
+        val mangaList: List<TopManga>? = getDataFromCache()
+        if(mangaList != null ){
+            showList(view, mangaList)
+        } else {
+            makeApiCall(view, base_url)
+        }
+
+        return view
+    }
+
+    private fun getDataFromCache(): List<TopManga>? {
+        //the value of the mangaList json, if nothing is found, return null
+        val jsonManga: String? = sharedPreferences?.getString("jsonMangaList", null)
+
+        //if it's null, well, return null
+        if(jsonManga == null) {
+            return null
+        } else { //else deserialize the list and return it
+            val listType: Type = object : TypeToken<List<TopManga>>() {}.type
+            return gson.fromJson(jsonManga, listType)
+        }
+    }
+
+    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_TopMangaPage_to_HomePage)
+        }
+
+        fun updateList() {
+            makeApiCall(view,base_url)
+            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG)
+                .setAction("Action", null).show()
+        }
+        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
+        swipeRefresh.setOnRefreshListener{
+            updateList()
+            swipeRefresh.isRefreshing = false
+        }
+
+    }
+
+    //display the recyclerview
+    fun showList(view: View, mangaList: List<TopManga> ){
+        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
+        recyclerView.setHasFixedSize(true)
+        recyclerView.layoutManager = LinearLayoutManager(view.context)
+        recyclerView.adapter = TopMangaAdapter(mangaList)
+    }
+
+    private fun makeApiCall(view: View, BASE_URL: String) {
+
+        val retrofit = Retrofit.Builder()
+                .baseUrl(BASE_URL)
+                .addConverterFactory(GsonConverterFactory.create(gson))
+                .build()
+
+        val service = retrofit.create(TopMangaApi::class.java)
+        val call = service.getTopMangaData()
+
+        call.enqueue(object : Callback<RestTopMangaResponse> {
+            override fun onResponse(call: Call<RestTopMangaResponse>, response: Response<RestTopMangaResponse>) {
+                if(response.isSuccessful && response.body() != null){ //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val mangaList: List<TopManga> = response.body()!!.getResults() //getting the "top" field containing our list of TopMangas
+                    saveList(mangaList)
+                    showList(view, mangaList) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<RestTopMangaResponse>, t: Throwable) {
+                showError()
+            }
+
+        })
+    }
+
+    private fun saveList(mangaList: List<TopManga>) {
+        val jsonString: String = gson.toJson(mangaList)
+
+        sharedPreferences
+                ?.edit()
+                ?.putString("jsonMangaList", jsonString)
+                ?.apply()
+    }
+
+    private fun showError() {
+        Snackbar.make(requireView(), "API ERROR", Snackbar.LENGTH_LONG)
+                .setAction("Action", null).show()
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/topanime/DetailTopAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/topanime/DetailTopAnimeActivity.kt
deleted file mode 100644
index 3f1d008..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topanime/DetailTopAnimeActivity.kt
+++ /dev/null
@@ -1,172 +0,0 @@
-package xyz.adjutor.aniki.topanime
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.widget.ImageView
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import com.google.gson.GsonBuilder
-import com.google.gson.reflect.TypeToken
-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.anime.AnimeApi
-import xyz.adjutor.aniki.anime.RestAnimeResponse
-import java.lang.reflect.Type
-
-class DetailTopAnimeActivity : AppCompatActivity() {
-
-    private var baseUrl = "https://api.jikan.moe/"
-    var sharedPreferences: SharedPreferences? = null
-    private val gson = GsonBuilder()
-            .setLenient()
-            .create()
-
-    private val intentAnimeId = "theanimeid"
-    private val intentAnimeTitle = "theanimetitle"
-    private val intentAnimeRank = "theanimerank"
-    private val intentAnimeScore = "theanimescore"
-    private val intentAnimeImageUrl = "theanimeimageurl"
-
-    private val intentAnimeEpisodes = "theanimeepisodes"
-    private val intentAnimeStartDate = "theanimestartdate"
-    private val intentAnimeEndDate = "theanimeenddate"
-    private val intentAnimeUrl = "theanimeurl"
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_detail_top_anime)
-
-        sharedPreferences = this.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
-
-        val animeId = intent.getStringExtra(intentAnimeId)
-        val animeTitle = intent.getStringExtra(intentAnimeTitle)
-        val animeRank = intent.getStringExtra(intentAnimeRank)
-        val animeScore = intent.getStringExtra(intentAnimeScore)
-        val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
-
-        val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes)
-        val animeStartDate = intent.getStringExtra(intentAnimeStartDate)
-        val animeEndDate = intent.getStringExtra(intentAnimeEndDate)
-        val animeUrl = intent.getStringExtra(intentAnimeUrl)
-
-        val tvId: TextView = findViewById(R.id.tv_detail_id)
-        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
-        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-        val tvScore: TextView = findViewById(R.id.tv_detail_score)
-        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
-
-        val tvEpisodes: TextView = findViewById(R.id.tv_episodes)
-        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
-        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
-        val tvUrl: TextView = findViewById(R.id.tv_url)
-
-        tvId.text = animeId
-        tvTitle.text = animeTitle
-        tvRank.text = animeRank
-        tvScore.text = animeScore
-        Glide
-            .with(this)
-            .load(animeImageUrl)
-            .apply(RequestOptions().override(400))
-            .into(ivImage)
-
-        //using null as a string because it has been converted to a string before
-        tvEpisodes.text = if (animeEpisodes != "null"){
-            animeEpisodes
-        } else {
-            fieldIsNull()
-        }
-
-        tvStartDate.text = animeStartDate
-
-        tvEndDate.text = if (animeEndDate != "null"){
-            animeEndDate
-        } else {
-            fieldIsNull()
-        }
-
-        tvUrl.text = animeUrl
-
-        val anime: RestAnimeResponse? = getDataFromCache(animeId.toString())
-        if(anime != null ){
-            showDetail(anime)
-        } else {
-            //taking the API's fields I want and displaying them
-            makeApiCall(baseUrl, animeId.toString())
-        }
-
-    }
-
-    private fun getDataFromCache(animeId: String): RestAnimeResponse? {
-        val jsonAnime: String?= sharedPreferences?.getString(animeId, null)
-
-        return if(jsonAnime == null) {
-            null
-        } else {
-            val type: Type = object : TypeToken<RestAnimeResponse>() {}.type
-            gson.fromJson(jsonAnime, type)
-        }
-    }
-
-    private fun makeApiCall(BASE_URL: String, animeId: String) {
-
-        val retrofit = Retrofit.Builder()
-                .baseUrl(BASE_URL)
-                .addConverterFactory(GsonConverterFactory.create(gson))
-                .build()
-
-        val service = retrofit.create(AnimeApi::class.java)
-        val call = service.getAnimeData(animeId) //based on the id
-
-        call.enqueue(object : Callback<RestAnimeResponse> {
-            override fun onResponse(call: Call<RestAnimeResponse>, response: Response<RestAnimeResponse>) {
-                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
-                    saveList(anime)
-                    showDetail(anime!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<RestAnimeResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(anime: RestAnimeResponse) {
-        //elements from RestAnimeResponse
-        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
-
-        tvSynopsis.text = anime.synopsis.toString()
-
-    }
-
-    fun showError(text: String) {
-        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
-    }
-    private fun fieldIsNull(): String{
-        return "Unknown"
-    }
-
-    fun saveList(anime: RestAnimeResponse?) {
-        val jsonString: String = gson.toJson(anime)
-
-        sharedPreferences
-                ?.edit()
-                ?.putString(anime?.mal_id.toString(), jsonString)
-                ?.apply()
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/topanime/RestTopAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/topanime/RestTopAnimeResponse.kt
deleted file mode 100644
index 0bd1354..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topanime/RestTopAnimeResponse.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.topanime
-
-import com.google.gson.annotations.SerializedName
-
-class RestTopAnimeResponse {
-
-    @SerializedName("top")
-    var top: List<TopAnime>? = null
-
-    fun getResults(): List<TopAnime> {
-        return top!!
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnime.kt b/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnime.kt
deleted file mode 100644
index 1764878..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnime.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package xyz.adjutor.aniki.topanime
-
-import com.google.gson.annotations.SerializedName
-
-//Content of the top field from the api of top anime
-class TopAnime{
-
-    @SerializedName("mal_id")
-    var mal_id: Int? = null
-    @SerializedName("rank")
-    var rank: Int? = null
-    @SerializedName("title")
-    var title: String? = null
-    @SerializedName("url")
-    var url: String? = null
-    @SerializedName("episodes")
-    var episodes: Int? = null
-    @SerializedName("start_date")
-    var start_date: String? = null
-    @SerializedName("end_date")
-    var end_date: String? = null
-    @SerializedName("score")
-    var score: Float? = null
-    @SerializedName("image_url")
-    var image_url: String? = null
-
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimeAdapter.kt
deleted file mode 100644
index e5a2bb5..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimeAdapter.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-package xyz.adjutor.aniki.topanime
-
-import android.content.Intent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.cardview.widget.CardView
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import xyz.adjutor.aniki.R
-
-class TopAnimeAdapter(private val animeList: List<TopAnime>) :
-        RecyclerView.Adapter<TopAnimeAdapter.AnimeViewHolder>() {
-
-    // Describes an item view and its place within the RecyclerView
-    class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val animeTitle: TextView = itemView.findViewById(R.id.tv_title)
-        val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
-        val animeScore: TextView = itemView.findViewById(R.id.tv_score)
-        val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
-        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
-    }
-
-    // Returns a new ViewHolder
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
-        val view = LayoutInflater.from(parent.context)
-                .inflate(R.layout.item_layout, parent, false)
-
-        return AnimeViewHolder(view)
-    }
-
-    // Returns size of data list
-    override fun getItemCount(): Int {
-        return animeList.size
-    }
-
-    // Displays data at a certain position
-    override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
-        val currentAnime: TopAnime = animeList[position]
-        holder.animeTitle.text = currentAnime.title
-        holder.animeRank.text = currentAnime.rank.toString()
-        holder.animeScore.text = currentAnime.score.toString()
-        val image: String = currentAnime.image_url.toString()
-        Glide
-                .with(holder.itemView.context)
-                .load(image)
-                .apply(RequestOptions().override(400))
-                .into(holder.animeImage)
-
-        //when you click on a selected cardview, some datas are sent to the other activity
-        holder.cardview.setOnClickListener {
-            val currentAnimeId = "theanimeid"
-            val currentAnimeTitle = "theanimetitle"
-            val currentAnimeRank = "theanimerank"
-            val currentAnimeScore = "theanimescore"
-            val currentAnimeImageUrl = "theanimeimageurl"
-            val currentAnimeEpisodes = "theanimeepisodes"
-            val currentAnimeStartDate = "theanimestartdate"
-            val currentAnimeEndDate = "theanimeenddate"
-            val currentAnimeUrl = "theanimeurl"
-
-            val intent: Intent = Intent(holder.itemView.context, DetailTopAnimeActivity::class.java).apply {
-                putExtra(currentAnimeId, currentAnime.mal_id.toString())
-                putExtra(currentAnimeTitle, currentAnime.title)
-                putExtra(currentAnimeRank, currentAnime.rank.toString())
-                putExtra(currentAnimeScore, currentAnime.score.toString())
-                putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
-                putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
-                putExtra(currentAnimeStartDate, currentAnime.start_date)
-                putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
-                putExtra(currentAnimeUrl, currentAnime.url.toString())
-            }
-            holder.itemView.context.startActivity(intent)
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimeApi.kt
deleted file mode 100644
index bea4c63..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimeApi.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package xyz.adjutor.aniki.topanime
-
-import retrofit2.Call
-import retrofit2.http.GET
-
-interface TopAnimeApi {
-
-    @GET("v3/top/anime")
-    fun getTopAnimeData(): Call<RestTopAnimeResponse>
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimePage.kt
deleted file mode 100644
index 91a33ef..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topanime/TopAnimePage.kt
+++ /dev/null
@@ -1,139 +0,0 @@
-package xyz.adjutor.aniki.topanime
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.findNavController
-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.GsonBuilder
-import com.google.gson.reflect.TypeToken
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
-import retrofit2.Retrofit
-import retrofit2.converter.gson.GsonConverterFactory
-import xyz.adjutor.aniki.R
-import java.lang.reflect.Type
-
-class TopAnimePage : Fragment() {
-
-    var sharedPreferences: SharedPreferences? = null
-    val gson = GsonBuilder()
-            .setLenient()
-            .create()
-    var base_url = "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
-        val view = inflater.inflate(R.layout.top_anime_page, container, false)
-
-        sharedPreferences = view.context.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
-
-        val animeList: List<TopAnime>? = getDataFromCache()
-        if(animeList != null ){
-            showList(view, animeList)
-        } else {
-            makeApiCall(view, base_url)
-        }
-
-        return view
-    }
-
-    private fun getDataFromCache(): List<TopAnime>? {
-        //the value of the animeList json, if nothing is found, return null
-        val jsonAnime: String? = sharedPreferences?.getString("jsonAnimeList", null)
-
-        //if it's null, well, return null
-        if(jsonAnime == null) {
-            return null
-        } else { //else deserialize the list and return it
-            val listType: Type = object : TypeToken<List<TopAnime>>() {}.type
-            return gson.fromJson(jsonAnime, listType)
-        }
-    }
-
-    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_TopAnimePage_to_HomePage)
-        }
-
-        fun updateList() {
-            makeApiCall(view,base_url)
-            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG)
-                .setAction("Action", null).show()
-        }
-        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
-        swipeRefresh.setOnRefreshListener{
-            updateList()
-            swipeRefresh.isRefreshing = false
-        }
-
-    }
-
-    //display the recyclerview
-    fun showList(view: View, animeList: List<TopAnime> ){
-        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
-        recyclerView.setHasFixedSize(true)
-        recyclerView.layoutManager = LinearLayoutManager(view.context)
-        recyclerView.adapter = TopAnimeAdapter(animeList)
-    }
-
-    private fun makeApiCall(view: View, BASE_URL: String) {
-
-        val retrofit = Retrofit.Builder()
-                .baseUrl(BASE_URL)
-                .addConverterFactory(GsonConverterFactory.create(gson))
-                .build()
-
-        val service = retrofit.create(TopAnimeApi::class.java)
-        val call = service.getTopAnimeData()
-
-        call.enqueue(object : Callback<RestTopAnimeResponse> {
-            override fun onResponse(call: Call<RestTopAnimeResponse>, response: Response<RestTopAnimeResponse>) {
-                if(response.isSuccessful && response.body() != null){ //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val animeList: List<TopAnime> = response.body()!!.getResults() //getting the "top" field containing our list of TopAnimes
-                    saveList(animeList)
-                    showList(view, animeList) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<RestTopAnimeResponse>, t: Throwable) {
-                showError()
-            }
-
-        })
-    }
-
-    private fun saveList(animeList: List<TopAnime>) {
-        val jsonString: String = gson.toJson(animeList)
-
-        sharedPreferences
-                ?.edit()
-                ?.putString("jsonAnimeList", jsonString)
-                ?.apply()
-    }
-
-    private fun showError() {
-        Snackbar.make(requireView(), "API ERROR", Snackbar.LENGTH_LONG)
-                .setAction("Action", null).show()
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/topmanga/DetailTopMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/topmanga/DetailTopMangaActivity.kt
deleted file mode 100644
index 2b1fac4..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topmanga/DetailTopMangaActivity.kt
+++ /dev/null
@@ -1,186 +0,0 @@
-package xyz.adjutor.aniki.topmanga
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.widget.ImageView
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import com.google.gson.GsonBuilder
-import com.google.gson.reflect.TypeToken
-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.manga.MangaApi
-import xyz.adjutor.aniki.manga.RestMangaResponse
-import java.lang.reflect.Type
-
-class DetailTopMangaActivity : AppCompatActivity() {
-
-    private var baseUrl = "https://api.jikan.moe/"
-    var sharedPreferences: SharedPreferences? = null
-    private val gson = GsonBuilder()
-            .setLenient()
-            .create()
-
-    private val intentMangaId = "themangaid"
-    private val intentMangaTitle = "themangatitle"
-    private val intentMangaRank = "themangarank"
-    private val intentMangaScore = "themangascore"
-    private val intentMangaImageUrl = "themangaimageurl"
-
-    private val intentMangaVolumes = "themangavolumes"
-    private val intentMangaStartDate = "themangastartdate"
-    private val intentMangaEndDate = "themangaenddate"
-    private val intentMangaUrl = "themangaurl"
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_detail_top_manga)
-
-        sharedPreferences = this.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
-
-        val mangaId = intent.getStringExtra(intentMangaId)
-        val mangaTitle = intent.getStringExtra(intentMangaTitle)
-        val mangaRank = intent.getStringExtra(intentMangaRank)
-        val mangaScore = intent.getStringExtra(intentMangaScore)
-        val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
-
-        val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
-        val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
-        val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
-        val mangaUrl = intent.getStringExtra(intentMangaUrl)
-
-        val tvId: TextView = findViewById(R.id.tv_detail_id)
-        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
-        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-        val tvScore: TextView = findViewById(R.id.tv_detail_score)
-        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
-
-        val tvVolumes: TextView = findViewById(R.id.tv_volumes)
-        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
-        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
-        val tvUrl: TextView = findViewById(R.id.tv_url)
-
-        tvId.text = mangaId
-        tvTitle.text = mangaTitle
-        tvRank.text = mangaRank
-        tvScore.text = mangaScore
-        Glide
-            .with(this)
-            .load(mangaImageUrl)
-            .apply(RequestOptions().override(400))
-            .into(ivImage)
-
-        //using null as a string because it has been converted to a string before
-        tvVolumes.text = if (mangaVolumes != "null"){
-            mangaVolumes
-        } else {
-            fieldIsNull()
-        }
-
-        tvStartDate.text = mangaStartDate
-
-        tvEndDate.text = if (mangaEndDate != "null"){
-            mangaEndDate
-        } else {
-            fieldIsNull()
-        }
-
-        tvUrl.text = mangaUrl
-
-        val manga: RestMangaResponse? = getDataFromCache(mangaId.toString())
-        if(manga != null ){
-            showDetail(manga)
-        } else {
-            //taking the API's fields I want and displaying them
-            makeApiCall(baseUrl, mangaId.toString())
-        }
-
-    }
-
-    private fun getDataFromCache(mangaId: String): RestMangaResponse? {
-        val jsonManga: String?= sharedPreferences?.getString(mangaId, null)
-
-        return if(jsonManga == null) {
-            null
-        } else {
-            val type: Type = object : TypeToken<RestMangaResponse>() {}.type
-            gson.fromJson(jsonManga, type)
-        }
-    }
-
-    private fun makeApiCall(BASE_URL: String, mangaId: String) {
-
-        val retrofit = Retrofit.Builder()
-                .baseUrl(BASE_URL)
-                .addConverterFactory(GsonConverterFactory.create(gson))
-                .build()
-
-        val service = retrofit.create(MangaApi::class.java)
-        val call = service.getMangaData(mangaId) //based on the id
-
-        call.enqueue(object : Callback<RestMangaResponse> {
-            override fun onResponse(call: Call<RestMangaResponse>, response: Response<RestMangaResponse>) {
-                if(response.isSuccessful && response.body() != null){ //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val manga = response.body() //getting the RestMangaResponse fields
-                    saveList(manga)
-                    showDetail(manga!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<RestMangaResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(manga: RestMangaResponse) {
-        //elements from RestMangaResponse
-        val tvChapters: TextView = findViewById(R.id.tv_chapters)
-        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
-        val tvBackground: TextView = findViewById(R.id.tv_background)
-
-        tvChapters.text = if (manga.chapters != null){
-            manga.chapters.toString()
-        } else {
-            fieldIsNull()
-        }
-
-        tvSynopsis.text = manga.synopsis.toString()
-
-        tvBackground.text = if (manga.background != null){
-            manga.background.toString()
-        } else {
-            fieldIsNull()
-        }
-
-    }
-
-    fun showError(text: String) {
-        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
-    }
-    private fun fieldIsNull(): String{
-        return "Unknown"
-    }
-
-    fun saveList(manga: RestMangaResponse?) {
-        val jsonString: String = gson.toJson(manga)
-
-        sharedPreferences
-                ?.edit()
-                ?.putString(manga?.mal_id.toString(), jsonString)
-                ?.apply()
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/topmanga/RestTopMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/topmanga/RestTopMangaResponse.kt
deleted file mode 100644
index dc7827a..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topmanga/RestTopMangaResponse.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.topmanga
-
-import com.google.gson.annotations.SerializedName
-
-class RestTopMangaResponse {
-
-    @SerializedName("top")
-    var top: List<TopManga>? = null
-
-    fun getResults(): List<TopManga> {
-        return top!!
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/topmanga/TopManga.kt b/app/src/main/java/xyz/adjutor/aniki/topmanga/TopManga.kt
deleted file mode 100644
index 05f4692..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topmanga/TopManga.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package xyz.adjutor.aniki.topmanga
-
-import com.google.gson.annotations.SerializedName
-
-//Content of the top field from the api of top manga
-class TopManga{
-
-    @SerializedName("mal_id")
-    var mal_id: Int? = null
-    @SerializedName("rank")
-    var rank: Int? = null
-    @SerializedName("title")
-    var title: String? = null
-    @SerializedName("url")
-    var url: String? = null
-    @SerializedName("volumes")
-    var volumes: Int? = null
-    @SerializedName("start_date")
-    var start_date: String? = null
-    @SerializedName("end_date")
-    var end_date: String? = null
-    @SerializedName("score")
-    var score: Float? = null
-    @SerializedName("image_url")
-    var image_url: String? = null
-
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaAdapter.kt
deleted file mode 100644
index 0396b3d..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaAdapter.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-package xyz.adjutor.aniki.topmanga
-
-import android.content.Intent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.cardview.widget.CardView
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import xyz.adjutor.aniki.R
-
-class TopMangaAdapter(private val mangaList: List<TopManga>) :
-        RecyclerView.Adapter<TopMangaAdapter.MangaViewHolder>() {
-
-    // Describes an item view and its place within the RecyclerView
-    class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val mangaTitle: TextView = itemView.findViewById(R.id.tv_title)
-        val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
-        val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
-        val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
-        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
-    }
-
-    // Returns a new ViewHolder
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
-        val view = LayoutInflater.from(parent.context)
-                .inflate(R.layout.item_layout, parent, false)
-
-        return MangaViewHolder(view)
-    }
-
-    // Returns size of data list
-    override fun getItemCount(): Int {
-        return mangaList.size
-    }
-
-    // Displays data at a certain position
-    override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
-        val currentManga: TopManga = mangaList[position]
-        holder.mangaTitle.text = currentManga.title
-        holder.mangaRank.text = currentManga.rank.toString()
-        holder.mangaScore.text = currentManga.score.toString()
-        val image: String = currentManga.image_url.toString()
-        Glide
-                .with(holder.itemView.context)
-                .load(image)
-                .apply(RequestOptions().override(400))
-                .into(holder.mangaImage)
-
-        //when you click on a selected cardview, some datas are sent to the other activity
-        holder.cardview.setOnClickListener {
-            val currentMangaId = "themangaid"
-            val currentMangaTitle = "themangatitle"
-            val currentMangaRank = "themangarank"
-            val currentMangaScore = "themangascore"
-            val currentMangaImageUrl = "themangaimageurl"
-            val currentMangaVolumes = "themangavolumes"
-            val currentMangaStartDate = "themangastartdate"
-            val currentMangaEndDate = "themangaenddate"
-            val currentMangaUrl = "themangaurl"
-
-            val intent: Intent = Intent(holder.itemView.context, DetailTopMangaActivity::class.java).apply {
-                putExtra(currentMangaId, currentManga.mal_id.toString())
-                putExtra(currentMangaTitle, currentManga.title)
-                putExtra(currentMangaRank, currentManga.rank.toString())
-                putExtra(currentMangaScore, currentManga.score.toString())
-                putExtra(currentMangaImageUrl, currentManga.image_url.toString())
-                putExtra(currentMangaVolumes, currentManga.volumes.toString())
-                putExtra(currentMangaStartDate, currentManga.start_date)
-                putExtra(currentMangaEndDate, currentManga.end_date.toString())
-                putExtra(currentMangaUrl, currentManga.url.toString())
-            }
-            holder.itemView.context.startActivity(intent)
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaApi.kt
deleted file mode 100644
index e8231b0..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaApi.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package xyz.adjutor.aniki.topmanga
-
-import retrofit2.Call
-import retrofit2.http.GET
-
-interface TopMangaApi {
-
-    @GET("v3/top/manga")
-    fun getTopMangaData(): Call<RestTopMangaResponse>
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaPage.kt
deleted file mode 100644
index c8075b2..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/topmanga/TopMangaPage.kt
+++ /dev/null
@@ -1,139 +0,0 @@
-package xyz.adjutor.aniki.topmanga
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.findNavController
-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.GsonBuilder
-import com.google.gson.reflect.TypeToken
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
-import retrofit2.Retrofit
-import retrofit2.converter.gson.GsonConverterFactory
-import xyz.adjutor.aniki.R
-import java.lang.reflect.Type
-
-class TopMangaPage : Fragment() {
-
-    var sharedPreferences: SharedPreferences? = null
-    val gson = GsonBuilder()
-            .setLenient()
-            .create()
-    var base_url = "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
-        val view = inflater.inflate(R.layout.top_manga_page, container, false)
-
-        sharedPreferences = view.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
-
-        val mangaList: List<TopManga>? = getDataFromCache()
-        if(mangaList != null ){
-            showList(view, mangaList)
-        } else {
-            makeApiCall(view, base_url)
-        }
-
-        return view
-    }
-
-    private fun getDataFromCache(): List<TopManga>? {
-        //the value of the mangaList json, if nothing is found, return null
-        val jsonManga: String? = sharedPreferences?.getString("jsonMangaList", null)
-
-        //if it's null, well, return null
-        if(jsonManga == null) {
-            return null
-        } else { //else deserialize the list and return it
-            val listType: Type = object : TypeToken<List<TopManga>>() {}.type
-            return gson.fromJson(jsonManga, listType)
-        }
-    }
-
-    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_TopMangaPage_to_HomePage)
-        }
-
-        fun updateList() {
-            makeApiCall(view,base_url)
-            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG)
-                .setAction("Action", null).show()
-        }
-        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
-        swipeRefresh.setOnRefreshListener{
-            updateList()
-            swipeRefresh.isRefreshing = false
-        }
-
-    }
-
-    //display the recyclerview
-    fun showList(view: View, mangaList: List<TopManga> ){
-        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
-        recyclerView.setHasFixedSize(true)
-        recyclerView.layoutManager = LinearLayoutManager(view.context)
-        recyclerView.adapter = TopMangaAdapter(mangaList)
-    }
-
-    private fun makeApiCall(view: View, BASE_URL: String) {
-
-        val retrofit = Retrofit.Builder()
-                .baseUrl(BASE_URL)
-                .addConverterFactory(GsonConverterFactory.create(gson))
-                .build()
-
-        val service = retrofit.create(TopMangaApi::class.java)
-        val call = service.getTopMangaData()
-
-        call.enqueue(object : Callback<RestTopMangaResponse> {
-            override fun onResponse(call: Call<RestTopMangaResponse>, response: Response<RestTopMangaResponse>) {
-                if(response.isSuccessful && response.body() != null){ //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val mangaList: List<TopManga> = response.body()!!.getResults() //getting the "top" field containing our list of TopMangas
-                    saveList(mangaList)
-                    showList(view, mangaList) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<RestTopMangaResponse>, t: Throwable) {
-                showError()
-            }
-
-        })
-    }
-
-    private fun saveList(mangaList: List<TopManga>) {
-        val jsonString: String = gson.toJson(mangaList)
-
-        sharedPreferences
-                ?.edit()
-                ?.putString("jsonMangaList", jsonString)
-                ?.apply()
-    }
-
-    private fun showError() {
-        Snackbar.make(requireView(), "API ERROR", Snackbar.LENGTH_LONG)
-                .setAction("Action", null).show()
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_detail_top_anime.xml b/app/src/main/res/layout/activity_detail_top_anime.xml
index a982bdd..15de318 100644
--- a/app/src/main/res/layout/activity_detail_top_anime.xml
+++ b/app/src/main/res/layout/activity_detail_top_anime.xml
@@ -7,7 +7,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    tools:context=".topanime.DetailTopAnimeActivity">
+    tools:context=".anime.topanime.DetailTopAnimeActivity">
     <androidx.cardview.widget.CardView
         android:id="@+id/cv_header"
         android:layout_width="match_parent"
@@ -243,6 +243,7 @@
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@id/tv_text_url"
                 android:autoLink="all"
+                android:textColorLink="@color/very_light_magenta"
                 />
 
         </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/layout/activity_detail_top_manga.xml b/app/src/main/res/layout/activity_detail_top_manga.xml
index 6d069c9..0a8f07b 100644
--- a/app/src/main/res/layout/activity_detail_top_manga.xml
+++ b/app/src/main/res/layout/activity_detail_top_manga.xml
@@ -7,7 +7,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    tools:context=".topmanga.DetailTopMangaActivity">
+    tools:context=".manga.topmanga.DetailTopMangaActivity">
     <androidx.cardview.widget.CardView
         android:id="@+id/cv_header"
         android:layout_width="match_parent"
@@ -297,6 +297,7 @@
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@id/tv_text_url"
                 android:autoLink="all"
+                android:textColorLink="@color/very_light_magenta"
                 />
 
         </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/layout/top_anime_page.xml b/app/src/main/res/layout/top_anime_page.xml
index 4bcc377..4f86dc7 100644
--- a/app/src/main/res/layout/top_anime_page.xml
+++ b/app/src/main/res/layout/top_anime_page.xml
@@ -5,7 +5,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".topanime.TopAnimePage"
+    tools:context=".anime.topanime.TopAnimePage"
     android:background="@color/very_dark_purple">
 
     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
diff --git a/app/src/main/res/layout/top_manga_page.xml b/app/src/main/res/layout/top_manga_page.xml
index 37150f7..ce793af 100644
--- a/app/src/main/res/layout/top_manga_page.xml
+++ b/app/src/main/res/layout/top_manga_page.xml
@@ -5,7 +5,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".topmanga.TopMangaPage"
+    tools:context=".manga.topmanga.TopMangaPage"
     android:background="@color/very_dark_purple">
 
     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml
index 132de49..4ceeab2 100644
--- a/app/src/main/res/navigation/nav_graph.xml
+++ b/app/src/main/res/navigation/nav_graph.xml
@@ -22,7 +22,7 @@
 
     <fragment
         android:id="@+id/TopMangaPage"
-        android:name="xyz.adjutor.aniki.topmanga.TopMangaPage"
+        android:name="xyz.adjutor.aniki.manga.topmanga.TopMangaPage"
         android:label="@string/top_manga_page_label"
         tools:layout="@layout/top_manga_page">
 
@@ -32,7 +32,7 @@
     </fragment>
     <fragment
         android:id="@+id/TopAnimePage"
-        android:name="xyz.adjutor.aniki.topanime.TopAnimePage"
+        android:name="xyz.adjutor.aniki.anime.topanime.TopAnimePage"
         android:label="@string/top_anime_page_label"
         tools:layout="@layout/top_anime_page">
 
-- 
cgit v1.2.3


From f9f079eea806454d49d6088089511d72e1c28f86 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 2 Mar 2021 09:13:54 +0100
Subject: Cleaning up the code.

---
 README.md                                          |   2 +-
 app/src/main/java/xyz/adjutor/aniki/HomePage.kt    |   6 +-
 .../xyz/adjutor/aniki/anime/RestAnimeResponse.kt   |   3 +-
 .../aniki/anime/topanime/DetailTopAnimeActivity.kt |  36 +-
 .../xyz/adjutor/aniki/anime/topanime/TopAnime.kt   |  10 +-
 .../aniki/anime/topanime/TopAnimeAdapter.kt        |  35 +-
 .../adjutor/aniki/anime/topanime/TopAnimePage.kt   |  50 +-
 .../xyz/adjutor/aniki/manga/RestMangaResponse.kt   |   5 +-
 .../aniki/manga/topmanga/DetailTopMangaActivity.kt |  40 +-
 .../xyz/adjutor/aniki/manga/topmanga/TopManga.kt   |  10 +-
 .../aniki/manga/topmanga/TopMangaAdapter.kt        |  35 +-
 .../adjutor/aniki/manga/topmanga/TopMangaPage.kt   |  61 ++-
 .../main/res/layout/activity_detail_top_anime.xml  | 479 ++++++++---------
 .../main/res/layout/activity_detail_top_manga.xml  | 582 +++++++++++----------
 app/src/main/res/layout/activity_main.xml          |   3 +-
 app/src/main/res/layout/home_page.xml              |  16 +-
 app/src/main/res/layout/top_anime_page.xml         |  31 +-
 app/src/main/res/layout/top_manga_page.xml         |  31 +-
 18 files changed, 745 insertions(+), 690 deletions(-)

diff --git a/README.md b/README.md
index 9777d6c..d2c01dd 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 List of elements used in top manga and top anime with a recycler view
-SwipeRefresh used to refresh the list data.
+SwipeRefresh used to refresh the list of data.
 
 Details of a chosen element from the recycler view with an intent object
 Title, synopsys and background clickable.
diff --git a/app/src/main/java/xyz/adjutor/aniki/HomePage.kt b/app/src/main/java/xyz/adjutor/aniki/HomePage.kt
index 734e917..b7c1d0e 100644
--- a/app/src/main/java/xyz/adjutor/aniki/HomePage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/HomePage.kt
@@ -11,8 +11,8 @@ import androidx.navigation.fragment.findNavController
 class HomePage : Fragment() {
 
     override fun onCreateView(
-            inflater: LayoutInflater, container: ViewGroup?,
-            savedInstanceState: Bundle?
+        inflater: LayoutInflater, container: ViewGroup?,
+        savedInstanceState: Bundle?
     ): View? {
         // Inflate the layout for this fragment
         return inflater.inflate(R.layout.home_page, container, false)
@@ -20,7 +20,7 @@ class HomePage : Fragment() {
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-        
+
         view.findViewById<Button>(R.id.button_top_manga).setOnClickListener {
             findNavController().navigate(R.id.action_HomePage_to_TopMangaPage)
         }
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/RestAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/anime/RestAnimeResponse.kt
index aa15dfd..b449b31 100644
--- a/app/src/main/java/xyz/adjutor/aniki/anime/RestAnimeResponse.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/RestAnimeResponse.kt
@@ -2,10 +2,11 @@ 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.
+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/topanime/DetailTopAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/DetailTopAnimeActivity.kt
index 0db1ca1..acbbd4d 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
@@ -26,8 +26,8 @@ class DetailTopAnimeActivity : AppCompatActivity() {
     private var baseUrl = "https://api.jikan.moe/"
     var sharedPreferences: SharedPreferences? = null
     private val gson = GsonBuilder()
-            .setLenient()
-            .create()
+        .setLenient()
+        .create()
 
     private val intentAnimeId = "theanimeid"
     private val intentAnimeTitle = "theanimetitle"
@@ -79,7 +79,7 @@ class DetailTopAnimeActivity : AppCompatActivity() {
             .into(ivImage)
 
         //using null as a string because it has been converted to a string before
-        tvEpisodes.text = if (animeEpisodes != "null"){
+        tvEpisodes.text = if (animeEpisodes != "null") {
             animeEpisodes
         } else {
             fieldIsNull()
@@ -87,7 +87,7 @@ class DetailTopAnimeActivity : AppCompatActivity() {
 
         tvStartDate.text = animeStartDate
 
-        tvEndDate.text = if (animeEndDate != "null"){
+        tvEndDate.text = if (animeEndDate != "null") {
             animeEndDate
         } else {
             fieldIsNull()
@@ -96,7 +96,7 @@ class DetailTopAnimeActivity : AppCompatActivity() {
         tvUrl.text = animeUrl
 
         val anime: RestAnimeResponse? = getDataFromCache(animeId.toString())
-        if(anime != null ){
+        if (anime != null) {
             showDetail(anime)
         } else {
             //taking the API's fields I want and displaying them
@@ -106,9 +106,9 @@ class DetailTopAnimeActivity : AppCompatActivity() {
     }
 
     private fun getDataFromCache(animeId: String): RestAnimeResponse? {
-        val jsonAnime: String?= sharedPreferences?.getString(animeId, null)
+        val jsonAnime: String? = sharedPreferences?.getString(animeId, null)
 
-        return if(jsonAnime == null) {
+        return if (jsonAnime == null) {
             null
         } else {
             val type: Type = object : TypeToken<RestAnimeResponse>() {}.type
@@ -119,16 +119,19 @@ class DetailTopAnimeActivity : AppCompatActivity() {
     private fun makeApiCall(BASE_URL: String, animeId: String) {
 
         val retrofit = Retrofit.Builder()
-                .baseUrl(BASE_URL)
-                .addConverterFactory(GsonConverterFactory.create(gson))
-                .build()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
 
         val service = retrofit.create(AnimeApi::class.java)
         val call = service.getAnimeData(animeId) //based on the id
 
         call.enqueue(object : Callback<RestAnimeResponse> {
-            override fun onResponse(call: Call<RestAnimeResponse>, response: Response<RestAnimeResponse>) {
-                if(response.isSuccessful && response.body() != null){ //if the code returned is >= 200 and < 300 AND the the body ain't empty
+            override fun onResponse(
+                call: Call<RestAnimeResponse>,
+                response: Response<RestAnimeResponse>
+            ) {
+                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
                     saveList(anime)
@@ -157,7 +160,8 @@ class DetailTopAnimeActivity : AppCompatActivity() {
     fun showError(text: String) {
         Toast.makeText(this, text, Toast.LENGTH_LONG).show()
     }
-    private fun fieldIsNull(): String{
+
+    private fun fieldIsNull(): String {
         return "Unknown"
     }
 
@@ -165,8 +169,8 @@ class DetailTopAnimeActivity : AppCompatActivity() {
         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/TopAnime.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnime.kt
index f8093f6..5202227 100644
--- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnime.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnime.kt
@@ -3,24 +3,32 @@ package xyz.adjutor.aniki.anime.topanime
 import com.google.gson.annotations.SerializedName
 
 //Content of the top field from the api of top anime
-class TopAnime{
+class TopAnime {
 
     @SerializedName("mal_id")
     var mal_id: Int? = null
+
     @SerializedName("rank")
     var rank: Int? = null
+
     @SerializedName("title")
     var title: String? = null
+
     @SerializedName("url")
     var url: String? = null
+
     @SerializedName("episodes")
     var episodes: Int? = null
+
     @SerializedName("start_date")
     var start_date: String? = null
+
     @SerializedName("end_date")
     var end_date: String? = null
+
     @SerializedName("score")
     var score: Float? = null
+
     @SerializedName("image_url")
     var image_url: String? = null
 
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt
index bda6ec5..fa1b5ed 100644
--- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt
@@ -13,7 +13,7 @@ import com.bumptech.glide.request.RequestOptions
 import xyz.adjutor.aniki.R
 
 class TopAnimeAdapter(private val animeList: List<TopAnime>) :
-        RecyclerView.Adapter<TopAnimeAdapter.AnimeViewHolder>() {
+    RecyclerView.Adapter<TopAnimeAdapter.AnimeViewHolder>() {
 
     // Describes an item view and its place within the RecyclerView
     class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
@@ -27,7 +27,7 @@ class TopAnimeAdapter(private val animeList: List<TopAnime>) :
     // Returns a new ViewHolder
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
         val view = LayoutInflater.from(parent.context)
-                .inflate(R.layout.item_layout, parent, false)
+            .inflate(R.layout.item_layout, parent, false)
 
         return AnimeViewHolder(view)
     }
@@ -45,10 +45,10 @@ class TopAnimeAdapter(private val animeList: List<TopAnime>) :
         holder.animeScore.text = currentAnime.score.toString()
         val image: String = currentAnime.image_url.toString()
         Glide
-                .with(holder.itemView.context)
-                .load(image)
-                .apply(RequestOptions().override(400))
-                .into(holder.animeImage)
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.animeImage)
 
         //when you click on a selected cardview, some datas are sent to the other activity
         holder.cardview.setOnClickListener {
@@ -62,17 +62,18 @@ class TopAnimeAdapter(private val animeList: List<TopAnime>) :
             val currentAnimeEndDate = "theanimeenddate"
             val currentAnimeUrl = "theanimeurl"
 
-            val intent: Intent = Intent(holder.itemView.context, DetailTopAnimeActivity::class.java).apply {
-                putExtra(currentAnimeId, currentAnime.mal_id.toString())
-                putExtra(currentAnimeTitle, currentAnime.title)
-                putExtra(currentAnimeRank, currentAnime.rank.toString())
-                putExtra(currentAnimeScore, currentAnime.score.toString())
-                putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
-                putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
-                putExtra(currentAnimeStartDate, currentAnime.start_date)
-                putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
-                putExtra(currentAnimeUrl, currentAnime.url.toString())
-            }
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailTopAnimeActivity::class.java).apply {
+                    putExtra(currentAnimeId, currentAnime.mal_id.toString())
+                    putExtra(currentAnimeTitle, currentAnime.title)
+                    putExtra(currentAnimeRank, currentAnime.rank.toString())
+                    putExtra(currentAnimeScore, currentAnime.score.toString())
+                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
+                    putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
+                    putExtra(currentAnimeStartDate, currentAnime.start_date)
+                    putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
+                    putExtra(currentAnimeUrl, currentAnime.url.toString())
+                }
             holder.itemView.context.startActivity(intent)
         }
     }
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 efa45dd..ccae2fa 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
@@ -27,13 +27,13 @@ class TopAnimePage : Fragment() {
 
     var sharedPreferences: SharedPreferences? = null
     val gson = GsonBuilder()
-            .setLenient()
-            .create()
+        .setLenient()
+        .create()
     var base_url = "https://api.jikan.moe/" //the api's base url
 
     override fun onCreateView(
-            inflater: LayoutInflater, container: ViewGroup?,
-            savedInstanceState: Bundle?
+        inflater: LayoutInflater, container: ViewGroup?,
+        savedInstanceState: Bundle?
     ): View? {
         // Inflate the layout for this fragment
         val view = inflater.inflate(R.layout.top_anime_page, container, false)
@@ -41,7 +41,7 @@ class TopAnimePage : Fragment() {
         sharedPreferences = view.context.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
 
         val animeList: List<TopAnime>? = getDataFromCache()
-        if(animeList != null ){
+        if (animeList != null) {
             showList(view, animeList)
         } else {
             makeApiCall(view, base_url)
@@ -55,7 +55,7 @@ class TopAnimePage : Fragment() {
         val jsonAnime: String? = sharedPreferences?.getString("jsonAnimeList", null)
 
         //if it's null, well, return null
-        if(jsonAnime == null) {
+        if (jsonAnime == null) {
             return null
         } else { //else deserialize the list and return it
             val listType: Type = object : TypeToken<List<TopAnime>>() {}.type
@@ -72,12 +72,13 @@ class TopAnimePage : Fragment() {
         }
 
         fun updateList() {
-            makeApiCall(view,base_url)
+            makeApiCall(view, base_url)
             Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG)
                 .setAction("Action", null).show()
         }
+
         val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
-        swipeRefresh.setOnRefreshListener{
+        swipeRefresh.setOnRefreshListener {
             updateList()
             swipeRefresh.isRefreshing = false
         }
@@ -85,7 +86,7 @@ class TopAnimePage : Fragment() {
     }
 
     //display the recyclerview
-    fun showList(view: View, animeList: List<TopAnime> ){
+    fun showList(view: View, animeList: List<TopAnime>) {
         val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
         recyclerView.setHasFixedSize(true)
         recyclerView.layoutManager = LinearLayoutManager(view.context)
@@ -95,20 +96,27 @@ class TopAnimePage : Fragment() {
     private fun makeApiCall(view: View, BASE_URL: String) {
 
         val retrofit = Retrofit.Builder()
-                .baseUrl(BASE_URL)
-                .addConverterFactory(GsonConverterFactory.create(gson))
-                .build()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
 
         val service = retrofit.create(TopAnimeApi::class.java)
         val call = service.getTopAnimeData()
 
         call.enqueue(object : Callback<RestTopAnimeResponse> {
-            override fun onResponse(call: Call<RestTopAnimeResponse>, response: Response<RestTopAnimeResponse>) {
-                if(response.isSuccessful && response.body() != null){ //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val animeList: List<TopAnime> = response.body()!!.getResults() //getting the "top" field containing our list of TopAnimes
+            override fun onResponse(
+                call: Call<RestTopAnimeResponse>,
+                response: Response<RestTopAnimeResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val animeList: List<TopAnime> = response.body()!!
+                        .getResults() //getting the "top" field containing our list of TopAnimes
                     saveList(animeList)
-                    showList(view, animeList) //calling the method in charge of displaying on the recyclerview
+                    showList(
+                        view,
+                        animeList
+                    ) //calling the method in charge of displaying on the recyclerview
 
                 } else {
                     showError() //a snackbar
@@ -126,14 +134,14 @@ class TopAnimePage : Fragment() {
         val jsonString: String = gson.toJson(animeList)
 
         sharedPreferences
-                ?.edit()
-                ?.putString("jsonAnimeList", jsonString)
-                ?.apply()
+            ?.edit()
+            ?.putString("jsonAnimeList", jsonString)
+            ?.apply()
     }
 
     private fun showError() {
         Snackbar.make(requireView(), "API ERROR", Snackbar.LENGTH_LONG)
-                .setAction("Action", null).show()
+            .setAction("Action", null).show()
     }
 
 }
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/RestMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/manga/RestMangaResponse.kt
index 00b0dce..10df7a5 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/RestMangaResponse.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/RestMangaResponse.kt
@@ -2,14 +2,17 @@ package xyz.adjutor.aniki.manga
 
 import com.google.gson.annotations.SerializedName
 
-class RestMangaResponse{ //only kept the infos I didn't have and that were interesting to me.
+class RestMangaResponse { //only kept the infos I didn't have and that were interesting to me.
 
     @SerializedName("mal_id")
     var mal_id: Int? = null
+
     @SerializedName("chapters")
     var chapters: Int? = null
+
     @SerializedName("synopsis")
     var synopsis: String? = null
+
     @SerializedName("background")
     var background: String? = null //a bit of background story about the manga
 
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
index 0d0d4b5..c7b6317 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
@@ -26,8 +26,8 @@ class DetailTopMangaActivity : AppCompatActivity() {
     private var baseUrl = "https://api.jikan.moe/"
     var sharedPreferences: SharedPreferences? = null
     private val gson = GsonBuilder()
-            .setLenient()
-            .create()
+        .setLenient()
+        .create()
 
     private val intentMangaId = "themangaid"
     private val intentMangaTitle = "themangatitle"
@@ -79,7 +79,7 @@ class DetailTopMangaActivity : AppCompatActivity() {
             .into(ivImage)
 
         //using null as a string because it has been converted to a string before
-        tvVolumes.text = if (mangaVolumes != "null"){
+        tvVolumes.text = if (mangaVolumes != "null") {
             mangaVolumes
         } else {
             fieldIsNull()
@@ -87,7 +87,7 @@ class DetailTopMangaActivity : AppCompatActivity() {
 
         tvStartDate.text = mangaStartDate
 
-        tvEndDate.text = if (mangaEndDate != "null"){
+        tvEndDate.text = if (mangaEndDate != "null") {
             mangaEndDate
         } else {
             fieldIsNull()
@@ -96,7 +96,7 @@ class DetailTopMangaActivity : AppCompatActivity() {
         tvUrl.text = mangaUrl
 
         val manga: RestMangaResponse? = getDataFromCache(mangaId.toString())
-        if(manga != null ){
+        if (manga != null) {
             showDetail(manga)
         } else {
             //taking the API's fields I want and displaying them
@@ -106,9 +106,9 @@ class DetailTopMangaActivity : AppCompatActivity() {
     }
 
     private fun getDataFromCache(mangaId: String): RestMangaResponse? {
-        val jsonManga: String?= sharedPreferences?.getString(mangaId, null)
+        val jsonManga: String? = sharedPreferences?.getString(mangaId, null)
 
-        return if(jsonManga == null) {
+        return if (jsonManga == null) {
             null
         } else {
             val type: Type = object : TypeToken<RestMangaResponse>() {}.type
@@ -119,16 +119,19 @@ class DetailTopMangaActivity : AppCompatActivity() {
     private fun makeApiCall(BASE_URL: String, mangaId: String) {
 
         val retrofit = Retrofit.Builder()
-                .baseUrl(BASE_URL)
-                .addConverterFactory(GsonConverterFactory.create(gson))
-                .build()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
 
         val service = retrofit.create(MangaApi::class.java)
         val call = service.getMangaData(mangaId) //based on the id
 
         call.enqueue(object : Callback<RestMangaResponse> {
-            override fun onResponse(call: Call<RestMangaResponse>, response: Response<RestMangaResponse>) {
-                if(response.isSuccessful && response.body() != null){ //if the code returned is >= 200 and < 300 AND the the body ain't empty
+            override fun onResponse(
+                call: Call<RestMangaResponse>,
+                response: Response<RestMangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
 
                     val manga = response.body() //getting the RestMangaResponse fields
                     saveList(manga)
@@ -152,7 +155,7 @@ class DetailTopMangaActivity : AppCompatActivity() {
         val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
         val tvBackground: TextView = findViewById(R.id.tv_background)
 
-        tvChapters.text = if (manga.chapters != null){
+        tvChapters.text = if (manga.chapters != null) {
             manga.chapters.toString()
         } else {
             fieldIsNull()
@@ -160,7 +163,7 @@ class DetailTopMangaActivity : AppCompatActivity() {
 
         tvSynopsis.text = manga.synopsis.toString()
 
-        tvBackground.text = if (manga.background != null){
+        tvBackground.text = if (manga.background != null) {
             manga.background.toString()
         } else {
             fieldIsNull()
@@ -171,7 +174,8 @@ class DetailTopMangaActivity : AppCompatActivity() {
     fun showError(text: String) {
         Toast.makeText(this, text, Toast.LENGTH_LONG).show()
     }
-    private fun fieldIsNull(): String{
+
+    private fun fieldIsNull(): String {
         return "Unknown"
     }
 
@@ -179,8 +183,8 @@ class DetailTopMangaActivity : AppCompatActivity() {
         val jsonString: String = gson.toJson(manga)
 
         sharedPreferences
-                ?.edit()
-                ?.putString(manga?.mal_id.toString(), jsonString)
-                ?.apply()
+            ?.edit()
+            ?.putString(manga?.mal_id.toString(), jsonString)
+            ?.apply()
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt
index 8d952b3..2ceceea 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt
@@ -3,24 +3,32 @@ package xyz.adjutor.aniki.manga.topmanga
 import com.google.gson.annotations.SerializedName
 
 //Content of the top field from the api of top manga
-class TopManga{
+class TopManga {
 
     @SerializedName("mal_id")
     var mal_id: Int? = null
+
     @SerializedName("rank")
     var rank: Int? = null
+
     @SerializedName("title")
     var title: String? = null
+
     @SerializedName("url")
     var url: String? = null
+
     @SerializedName("volumes")
     var volumes: Int? = null
+
     @SerializedName("start_date")
     var start_date: String? = null
+
     @SerializedName("end_date")
     var end_date: String? = null
+
     @SerializedName("score")
     var score: Float? = null
+
     @SerializedName("image_url")
     var image_url: String? = null
 
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
index a259750..626f34e 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
@@ -13,7 +13,7 @@ import com.bumptech.glide.request.RequestOptions
 import xyz.adjutor.aniki.R
 
 class TopMangaAdapter(private val mangaList: List<TopManga>) :
-        RecyclerView.Adapter<TopMangaAdapter.MangaViewHolder>() {
+    RecyclerView.Adapter<TopMangaAdapter.MangaViewHolder>() {
 
     // Describes an item view and its place within the RecyclerView
     class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
@@ -27,7 +27,7 @@ class TopMangaAdapter(private val mangaList: List<TopManga>) :
     // Returns a new ViewHolder
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
         val view = LayoutInflater.from(parent.context)
-                .inflate(R.layout.item_layout, parent, false)
+            .inflate(R.layout.item_layout, parent, false)
 
         return MangaViewHolder(view)
     }
@@ -45,10 +45,10 @@ class TopMangaAdapter(private val mangaList: List<TopManga>) :
         holder.mangaScore.text = currentManga.score.toString()
         val image: String = currentManga.image_url.toString()
         Glide
-                .with(holder.itemView.context)
-                .load(image)
-                .apply(RequestOptions().override(400))
-                .into(holder.mangaImage)
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.mangaImage)
 
         //when you click on a selected cardview, some datas are sent to the other activity
         holder.cardview.setOnClickListener {
@@ -62,17 +62,18 @@ class TopMangaAdapter(private val mangaList: List<TopManga>) :
             val currentMangaEndDate = "themangaenddate"
             val currentMangaUrl = "themangaurl"
 
-            val intent: Intent = Intent(holder.itemView.context, DetailTopMangaActivity::class.java).apply {
-                putExtra(currentMangaId, currentManga.mal_id.toString())
-                putExtra(currentMangaTitle, currentManga.title)
-                putExtra(currentMangaRank, currentManga.rank.toString())
-                putExtra(currentMangaScore, currentManga.score.toString())
-                putExtra(currentMangaImageUrl, currentManga.image_url.toString())
-                putExtra(currentMangaVolumes, currentManga.volumes.toString())
-                putExtra(currentMangaStartDate, currentManga.start_date)
-                putExtra(currentMangaEndDate, currentManga.end_date.toString())
-                putExtra(currentMangaUrl, currentManga.url.toString())
-            }
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailTopMangaActivity::class.java).apply {
+                    putExtra(currentMangaId, currentManga.mal_id.toString())
+                    putExtra(currentMangaTitle, currentManga.title)
+                    putExtra(currentMangaRank, currentManga.rank.toString())
+                    putExtra(currentMangaScore, currentManga.score.toString())
+                    putExtra(currentMangaImageUrl, currentManga.image_url.toString())
+                    putExtra(currentMangaVolumes, currentManga.volumes.toString())
+                    putExtra(currentMangaStartDate, currentManga.start_date)
+                    putExtra(currentMangaEndDate, currentManga.end_date.toString())
+                    putExtra(currentMangaUrl, currentManga.url.toString())
+                }
             holder.itemView.context.startActivity(intent)
         }
     }
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 d28161a..ce9b1c6 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
@@ -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
@@ -26,14 +27,14 @@ import java.lang.reflect.Type
 class TopMangaPage : Fragment() {
 
     var sharedPreferences: SharedPreferences? = null
-    val gson = GsonBuilder()
-            .setLenient()
-            .create()
-    var base_url = "https://api.jikan.moe/" //the api's base url
+    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?
+        inflater: LayoutInflater, container: ViewGroup?,
+        savedInstanceState: Bundle?
     ): View? {
         // Inflate the layout for this fragment
         val view = inflater.inflate(R.layout.top_manga_page, container, false)
@@ -41,10 +42,10 @@ class TopMangaPage : Fragment() {
         sharedPreferences = view.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
 
         val mangaList: List<TopManga>? = getDataFromCache()
-        if(mangaList != null ){
+        if (mangaList != null) {
             showList(view, mangaList)
         } else {
-            makeApiCall(view, base_url)
+            makeApiCall(view, baseUrl)
         }
 
         return view
@@ -55,11 +56,11 @@ class TopMangaPage : Fragment() {
         val jsonManga: String? = sharedPreferences?.getString("jsonMangaList", null)
 
         //if it's null, well, return null
-        if(jsonManga == null) {
-            return null
+        return if (jsonManga == null) {
+            null
         } else { //else deserialize the list and return it
             val listType: Type = object : TypeToken<List<TopManga>>() {}.type
-            return gson.fromJson(jsonManga, listType)
+            gson.fromJson(jsonManga, listType)
         }
     }
 
@@ -72,12 +73,13 @@ class TopMangaPage : Fragment() {
         }
 
         fun updateList() {
-            makeApiCall(view,base_url)
+            makeApiCall(view, baseUrl)
             Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG)
                 .setAction("Action", null).show()
         }
+
         val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
-        swipeRefresh.setOnRefreshListener{
+        swipeRefresh.setOnRefreshListener {
             updateList()
             swipeRefresh.isRefreshing = false
         }
@@ -85,7 +87,7 @@ class TopMangaPage : Fragment() {
     }
 
     //display the recyclerview
-    fun showList(view: View, mangaList: List<TopManga> ){
+    fun showList(view: View, mangaList: List<TopManga>) {
         val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
         recyclerView.setHasFixedSize(true)
         recyclerView.layoutManager = LinearLayoutManager(view.context)
@@ -95,20 +97,27 @@ class TopMangaPage : Fragment() {
     private fun makeApiCall(view: View, BASE_URL: String) {
 
         val retrofit = Retrofit.Builder()
-                .baseUrl(BASE_URL)
-                .addConverterFactory(GsonConverterFactory.create(gson))
-                .build()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
 
         val service = retrofit.create(TopMangaApi::class.java)
         val call = service.getTopMangaData()
 
         call.enqueue(object : Callback<RestTopMangaResponse> {
-            override fun onResponse(call: Call<RestTopMangaResponse>, response: Response<RestTopMangaResponse>) {
-                if(response.isSuccessful && response.body() != null){ //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val mangaList: List<TopManga> = response.body()!!.getResults() //getting the "top" field containing our list of TopMangas
+            override fun onResponse(
+                call: Call<RestTopMangaResponse>,
+                response: Response<RestTopMangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val mangaList: List<TopManga> = response.body()!!
+                        .getResults() //getting the "top" field containing our list of TopMangas
                     saveList(mangaList)
-                    showList(view, mangaList) //calling the method in charge of displaying on the recyclerview
+                    showList(
+                        view,
+                        mangaList
+                    ) //calling the method in charge of displaying on the recyclerview
 
                 } else {
                     showError() //a snackbar
@@ -126,14 +135,14 @@ class TopMangaPage : Fragment() {
         val jsonString: String = gson.toJson(mangaList)
 
         sharedPreferences
-                ?.edit()
-                ?.putString("jsonMangaList", jsonString)
-                ?.apply()
+            ?.edit()
+            ?.putString("jsonMangaList", jsonString)
+            ?.apply()
     }
 
     private fun showError() {
         Snackbar.make(requireView(), "API ERROR", Snackbar.LENGTH_LONG)
-                .setAction("Action", null).show()
+            .setAction("Action", null).show()
     }
 
 }
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_detail_top_anime.xml b/app/src/main/res/layout/activity_detail_top_anime.xml
index 15de318..cd7bb59 100644
--- a/app/src/main/res/layout/activity_detail_top_anime.xml
+++ b/app/src/main/res/layout/activity_detail_top_anime.xml
@@ -3,251 +3,258 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/very_dark_purple">
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    tools:context=".anime.topanime.DetailTopAnimeActivity">
-    <androidx.cardview.widget.CardView
-        android:id="@+id/cv_header"
+
+    <androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto"
+        xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_margin="4sp"
-        app:cardBackgroundColor="@color/black"
-        app:layout_constraintTop_toTopOf="parent">
-        <androidx.constraintlayout.widget.ConstraintLayout
+        tools:context=".anime.topanime.DetailTopAnimeActivity">
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_header"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:padding="10dp">
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toTopOf="parent">
 
-            <TextView
-                android:layout_width="wrap_content"
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:text="@string/text_mal_id"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintEnd_toStartOf="@id/tv_detail_id" />
-    <TextView
-        android:id="@+id/tv_detail_id"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/id"
-        android:textColor="@color/slightly_desaturated_magenta"
-        android:textIsSelectable="true"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/iv_detail_image"
-        app:layout_constraintTop_toTopOf="parent" />
-
-    <ImageView
-        android:id="@+id/iv_detail_image"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:contentDescription="@string/image"
-        android:src="@mipmap/ic_launcher"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-
-    <TextView
-        android:id="@+id/tv_detail_title"
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        android:layout_marginHorizontal="10sp"
-        android:fontFamily="@font/bangers"
-        android:text="@string/title"
-        android:textAlignment="center"
-        android:textColor="@color/strong_pink"
-        android:textIsSelectable="true"
-        android:textSize="30sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/iv_detail_image"
-        app:layout_constraintTop_toTopOf="parent" />
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_rank"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintBottom_toBottomOf="@id/tv_detail_rank"
-                app:layout_constraintEnd_toStartOf="@id/tv_detail_rank"
-                app:layout_constraintTop_toTopOf="@id/tv_detail_rank" />
-    <TextView
-        android:id="@+id/tv_detail_rank"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/rank"
-        android:textColor="@color/slightly_desaturated_magenta"
-        android:textSize="20sp"
-        app:layout_constraintBottom_toTopOf="@id/tv_detail_title"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_score"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintBottom_toBottomOf="@id/tv_detail_score"
-                app:layout_constraintEnd_toStartOf="@id/tv_detail_score"
-                app:layout_constraintTop_toTopOf="@id/tv_detail_score" />
-    <TextView
-        android:id="@+id/tv_detail_score"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/score"
-        android:textColor="@color/slightly_desaturated_magenta"
-        android:textSize="20sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tv_detail_title" />
-
-        </androidx.constraintlayout.widget.ConstraintLayout>
-</androidx.cardview.widget.CardView>
-
-    <androidx.cardview.widget.CardView
-        android:id="@+id/cv_more_infos"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_margin="4sp"
-        app:cardBackgroundColor="@color/black"
-        app:layout_constraintTop_toBottomOf="@id/cv_header">
+                android:padding="10dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:text="@string/text_mal_id"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_id" />
+
+                <TextView
+                    android:id="@+id/tv_detail_id"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/id"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textIsSelectable="true"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/iv_detail_image"
+                    app:layout_constraintTop_toTopOf="parent" />
 
-        <androidx.constraintlayout.widget.ConstraintLayout
+                <ImageView
+                    android:id="@+id/iv_detail_image"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:contentDescription="@string/image"
+                    android:src="@mipmap/ic_launcher"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_detail_title"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_marginHorizontal="10sp"
+                    android:fontFamily="@font/bangers"
+                    android:text="@string/title"
+                    android:textAlignment="center"
+                    android:textColor="@color/strong_pink"
+                    android:textIsSelectable="true"
+                    android:textSize="30sp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/iv_detail_image"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_rank"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_detail_rank"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_rank"
+                    app:layout_constraintTop_toTopOf="@id/tv_detail_rank" />
+
+                <TextView
+                    android:id="@+id/tv_detail_rank"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/rank"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textSize="20sp"
+                    app:layout_constraintBottom_toTopOf="@id/tv_detail_title"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_score"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_detail_score"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_score"
+                    app:layout_constraintTop_toTopOf="@id/tv_detail_score" />
+
+                <TextView
+                    android:id="@+id/tv_detail_score"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/score"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textSize="20sp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_detail_title" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_more_infos"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:padding="10dp">
-
-            <TextView
-                android:id="@+id/tv_text_episodes"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_episodes"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintBottom_toBottomOf="@id/tv_episodes"
-                app:layout_constraintEnd_toStartOf="@id/tv_episodes"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="@id/tv_episodes" />
-
-            <TextView
-                android:id="@+id/tv_episodes"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/episodes"
-                android:textColor="@color/slightly_desaturated_magenta"
-                app:layout_constraintStart_toEndOf="@id/tv_text_episodes"
-                app:layout_constraintTop_toTopOf="parent"
-                app:layout_constraintBottom_toBottomOf="parent"/>
-
-            <TextView
-                android:id="@+id/tv_text_start_date"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_start_date"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintBottom_toBottomOf="@id/tv_start_date"
-                app:layout_constraintEnd_toStartOf="@id/tv_start_date"
-                app:layout_constraintTop_toTopOf="@id/tv_start_date" />
-
-            <TextView
-                android:id="@+id/tv_start_date"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/start_date"
-                android:textColor="@color/slightly_desaturated_magenta"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintTop_toTopOf="parent" />
-
-            <TextView
-                android:id="@+id/tv_text_end_date"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_end_date"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintBottom_toBottomOf="@id/tv_end_date"
-                app:layout_constraintEnd_toStartOf="@id/tv_end_date"
-                app:layout_constraintTop_toTopOf="@id/tv_end_date" />
-
-            <TextView
-                android:id="@+id/tv_end_date"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/end_date"
-                android:textColor="@color/slightly_desaturated_magenta"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintTop_toBottomOf="@id/tv_start_date" />
-
-        </androidx.constraintlayout.widget.ConstraintLayout>
-    </androidx.cardview.widget.CardView>
-
-    <androidx.cardview.widget.CardView
-        android:id="@+id/cv_synopsis"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_margin="4sp"
-        app:cardBackgroundColor="@color/black"
-        app:layout_constraintTop_toBottomOf="@id/cv_more_infos">
-        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_header">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+                <TextView
+                    android:id="@+id/tv_text_episodes"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_episodes"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_episodes"
+                    app:layout_constraintEnd_toStartOf="@id/tv_episodes"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="@id/tv_episodes" />
+
+                <TextView
+                    android:id="@+id/tv_episodes"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/episodes"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/tv_text_episodes"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_text_start_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_start_date"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_start_date"
+                    app:layout_constraintEnd_toStartOf="@id/tv_start_date"
+                    app:layout_constraintTop_toTopOf="@id/tv_start_date" />
+
+                <TextView
+                    android:id="@+id/tv_start_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/start_date"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_text_end_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_end_date"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_end_date"
+                    app:layout_constraintEnd_toStartOf="@id/tv_end_date"
+                    app:layout_constraintTop_toTopOf="@id/tv_end_date" />
+
+                <TextView
+                    android:id="@+id/tv_end_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/end_date"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_start_date" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_synopsis"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:padding="10dp">
-
-            <TextView
-                android:id="@+id/tv_text_synopsis"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_synopsis"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent" />
-    <TextView
-        android:id="@+id/tv_synopsis"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/synopsis"
-        android:textColor="@color/slightly_desaturated_magenta"
-        android:textIsSelectable="true"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tv_text_synopsis"
-        />
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_more_infos">
 
-        </androidx.constraintlayout.widget.ConstraintLayout>
-    </androidx.cardview.widget.CardView>
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
 
-    <androidx.cardview.widget.CardView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_margin="4sp"
-        app:cardBackgroundColor="@color/black"
-        app:layout_constraintTop_toBottomOf="@id/cv_synopsis">
-        <androidx.constraintlayout.widget.ConstraintLayout
+                <TextView
+                    android:id="@+id/tv_text_synopsis"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_synopsis"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_synopsis"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/synopsis"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textIsSelectable="true"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_text_synopsis" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:padding="10dp">
-
-
-            <TextView
-                android:id="@+id/tv_text_url"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_url"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent" />
-
-            <TextView
-                android:id="@+id/tv_url"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/url"
-                android:textColor="@color/slightly_desaturated_magenta"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@id/tv_text_url"
-                android:autoLink="all"
-                android:textColorLink="@color/very_light_magenta"
-                />
-
-        </androidx.constraintlayout.widget.ConstraintLayout>
-    </androidx.cardview.widget.CardView>
-
-</androidx.constraintlayout.widget.ConstraintLayout>
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_synopsis">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+
+                <TextView
+                    android:id="@+id/tv_text_url"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_url"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_url"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:autoLink="all"
+                    android:text="@string/url"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textColorLink="@color/very_light_magenta"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_text_url" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
 </ScrollView>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_detail_top_manga.xml b/app/src/main/res/layout/activity_detail_top_manga.xml
index 0a8f07b..3f703b6 100644
--- a/app/src/main/res/layout/activity_detail_top_manga.xml
+++ b/app/src/main/res/layout/activity_detail_top_manga.xml
@@ -3,305 +3,313 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/very_dark_purple">
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    tools:context=".manga.topmanga.DetailTopMangaActivity">
-    <androidx.cardview.widget.CardView
-        android:id="@+id/cv_header"
+
+    <androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto"
+        xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_margin="4sp"
-        app:cardBackgroundColor="@color/black"
-        app:layout_constraintTop_toTopOf="parent">
-        <androidx.constraintlayout.widget.ConstraintLayout
+        tools:context=".manga.topmanga.DetailTopMangaActivity">
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_header"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:padding="10dp">
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toTopOf="parent">
 
-            <TextView
-                android:layout_width="wrap_content"
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:text="@string/text_mal_id"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintEnd_toStartOf="@id/tv_detail_id" />
-    <TextView
-        android:id="@+id/tv_detail_id"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/id"
-        android:textColor="@color/slightly_desaturated_magenta"
-        android:textIsSelectable="true"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/iv_detail_image"
-        app:layout_constraintTop_toTopOf="parent" />
-
-    <ImageView
-        android:id="@+id/iv_detail_image"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:contentDescription="@string/image"
-        android:src="@mipmap/ic_launcher"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-
-    <TextView
-        android:id="@+id/tv_detail_title"
-        android:layout_width="0dp"
-        android:layout_height="match_parent"
-        android:layout_marginHorizontal="10sp"
-        android:fontFamily="@font/bangers"
-        android:text="@string/title"
-        android:textAlignment="center"
-        android:textColor="@color/strong_pink"
-        android:textIsSelectable="true"
-        android:textSize="30sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/iv_detail_image"
-        app:layout_constraintTop_toTopOf="parent" />
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_rank"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintBottom_toBottomOf="@id/tv_detail_rank"
-                app:layout_constraintEnd_toStartOf="@id/tv_detail_rank"
-                app:layout_constraintTop_toTopOf="@id/tv_detail_rank" />
-    <TextView
-        android:id="@+id/tv_detail_rank"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/rank"
-        android:textColor="@color/slightly_desaturated_magenta"
-        android:textSize="20sp"
-        app:layout_constraintBottom_toTopOf="@id/tv_detail_title"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_score"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintBottom_toBottomOf="@id/tv_detail_score"
-                app:layout_constraintEnd_toStartOf="@id/tv_detail_score"
-                app:layout_constraintTop_toTopOf="@id/tv_detail_score" />
-    <TextView
-        android:id="@+id/tv_detail_score"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/score"
-        android:textColor="@color/slightly_desaturated_magenta"
-        android:textSize="20sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tv_detail_title" />
-
-        </androidx.constraintlayout.widget.ConstraintLayout>
-</androidx.cardview.widget.CardView>
-
-    <androidx.cardview.widget.CardView
-        android:id="@+id/cv_more_infos"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_margin="4sp"
-        app:cardBackgroundColor="@color/black"
-        app:layout_constraintTop_toBottomOf="@id/cv_header">
+                android:padding="10dp">
 
-        <androidx.constraintlayout.widget.ConstraintLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:padding="10dp">
-
-            <TextView
-                android:id="@+id/tv_text_volumes"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_volumes"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintBottom_toBottomOf="@id/tv_volumes"
-                app:layout_constraintEnd_toStartOf="@id/tv_volumes"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="@id/tv_volumes" />
-
-            <TextView
-                android:id="@+id/tv_volumes"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/volumes"
-                android:textColor="@color/slightly_desaturated_magenta"
-                app:layout_constraintStart_toEndOf="@id/tv_text_volumes"
-                app:layout_constraintTop_toTopOf="parent" />
-
-            <TextView
-                android:id="@+id/tv_text_chapters"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_chapters"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintBottom_toBottomOf="@id/tv_chapters"
-                app:layout_constraintEnd_toStartOf="@id/tv_chapters"
-                app:layout_constraintTop_toTopOf="@id/tv_chapters" />
-
-            <TextView
-                android:id="@+id/tv_chapters"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/chapters"
-                android:textColor="@color/slightly_desaturated_magenta"
-                app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintStart_toEndOf="@id/tv_text_chapters"
-                app:layout_constraintTop_toBottomOf="@id/tv_volumes" />
-
-            <TextView
-                android:id="@+id/tv_text_start_date"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_start_date"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintBottom_toBottomOf="@id/tv_start_date"
-                app:layout_constraintEnd_toStartOf="@id/tv_start_date"
-                app:layout_constraintTop_toTopOf="@id/tv_start_date" />
-
-            <TextView
-                android:id="@+id/tv_start_date"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/start_date"
-                android:textColor="@color/slightly_desaturated_magenta"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintTop_toTopOf="parent" />
-
-            <TextView
-                android:id="@+id/tv_text_end_date"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_end_date"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintBottom_toBottomOf="@id/tv_end_date"
-                app:layout_constraintEnd_toStartOf="@id/tv_end_date"
-                app:layout_constraintTop_toTopOf="@id/tv_end_date" />
-
-            <TextView
-                android:id="@+id/tv_end_date"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/end_date"
-                android:textColor="@color/slightly_desaturated_magenta"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintTop_toBottomOf="@id/tv_start_date" />
-
-        </androidx.constraintlayout.widget.ConstraintLayout>
-    </androidx.cardview.widget.CardView>
-
-    <androidx.cardview.widget.CardView
-        android:id="@+id/cv_synopsis"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_margin="4sp"
-        app:cardBackgroundColor="@color/black"
-        app:layout_constraintTop_toBottomOf="@id/cv_more_infos">
-        <androidx.constraintlayout.widget.ConstraintLayout
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:text="@string/text_mal_id"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_id" />
+
+                <TextView
+                    android:id="@+id/tv_detail_id"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/id"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textIsSelectable="true"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/iv_detail_image"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <ImageView
+                    android:id="@+id/iv_detail_image"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:contentDescription="@string/image"
+                    android:src="@mipmap/ic_launcher"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_detail_title"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_marginHorizontal="10sp"
+                    android:fontFamily="@font/bangers"
+                    android:text="@string/title"
+                    android:textAlignment="center"
+                    android:textColor="@color/strong_pink"
+                    android:textIsSelectable="true"
+                    android:textSize="30sp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/iv_detail_image"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_rank"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_detail_rank"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_rank"
+                    app:layout_constraintTop_toTopOf="@id/tv_detail_rank" />
+
+                <TextView
+                    android:id="@+id/tv_detail_rank"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/rank"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textSize="20sp"
+                    app:layout_constraintBottom_toTopOf="@id/tv_detail_title"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_score"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_detail_score"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_score"
+                    app:layout_constraintTop_toTopOf="@id/tv_detail_score" />
+
+                <TextView
+                    android:id="@+id/tv_detail_score"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/score"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textSize="20sp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_detail_title" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_more_infos"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:padding="10dp">
-
-            <TextView
-                android:id="@+id/tv_text_synopsis"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_synopsis"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent" />
-    <TextView
-        android:id="@+id/tv_synopsis"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/synopsis"
-        android:textColor="@color/slightly_desaturated_magenta"
-        android:textIsSelectable="true"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tv_text_synopsis"
-        />
-
-        </androidx.constraintlayout.widget.ConstraintLayout>
-    </androidx.cardview.widget.CardView>
-
-    <androidx.cardview.widget.CardView
-        android:id="@+id/cv_background"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_margin="4sp"
-        app:cardBackgroundColor="@color/black"
-        app:layout_constraintTop_toBottomOf="@id/cv_synopsis">
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:padding="10dp">
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_header">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+                <TextView
+                    android:id="@+id/tv_text_volumes"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_volumes"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_volumes"
+                    app:layout_constraintEnd_toStartOf="@id/tv_volumes"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="@id/tv_volumes" />
+
+                <TextView
+                    android:id="@+id/tv_volumes"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/volumes"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintStart_toEndOf="@id/tv_text_volumes"
+                    app:layout_constraintTop_toTopOf="parent" />
 
+                <TextView
+                    android:id="@+id/tv_text_chapters"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_chapters"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_chapters"
+                    app:layout_constraintEnd_toStartOf="@id/tv_chapters"
+                    app:layout_constraintTop_toTopOf="@id/tv_chapters" />
 
-        <TextView
-            android:id="@+id/tv_text_background"
-            android:layout_width="wrap_content"
+                <TextView
+                    android:id="@+id/tv_chapters"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/chapters"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/tv_text_chapters"
+                    app:layout_constraintTop_toBottomOf="@id/tv_volumes" />
+
+                <TextView
+                    android:id="@+id/tv_text_start_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_start_date"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_start_date"
+                    app:layout_constraintEnd_toStartOf="@id/tv_start_date"
+                    app:layout_constraintTop_toTopOf="@id/tv_start_date" />
+
+                <TextView
+                    android:id="@+id/tv_start_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/start_date"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_text_end_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_end_date"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_end_date"
+                    app:layout_constraintEnd_toStartOf="@id/tv_end_date"
+                    app:layout_constraintTop_toTopOf="@id/tv_end_date" />
+
+                <TextView
+                    android:id="@+id/tv_end_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/end_date"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_start_date" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_synopsis"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="@string/text_background"
-            android:textColor="@color/strong_pink"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <TextView
-            android:id="@+id/tv_background"
-            android:layout_width="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_more_infos">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+                <TextView
+                    android:id="@+id/tv_text_synopsis"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_synopsis"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_synopsis"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/synopsis"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textIsSelectable="true"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_text_synopsis" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_background"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:text="@string/background"
-            android:textColor="@color/slightly_desaturated_magenta"
-            android:textIsSelectable="true"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toBottomOf="@id/tv_text_background" />
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_synopsis">
 
-    </androidx.constraintlayout.widget.ConstraintLayout>
-    </androidx.cardview.widget.CardView>
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
 
-    <androidx.cardview.widget.CardView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_margin="4sp"
-        app:cardBackgroundColor="@color/black"
-        app:layout_constraintTop_toBottomOf="@id/cv_background">
-        <androidx.constraintlayout.widget.ConstraintLayout
+
+                <TextView
+                    android:id="@+id/tv_text_background"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_background"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_background"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/background"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textIsSelectable="true"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_text_background" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:padding="10dp">
-
-
-            <TextView
-                android:id="@+id/tv_text_url"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/text_url"
-                android:textColor="@color/strong_pink"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent" />
-
-            <TextView
-                android:id="@+id/tv_url"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/url"
-                android:textColor="@color/slightly_desaturated_magenta"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@id/tv_text_url"
-                android:autoLink="all"
-                android:textColorLink="@color/very_light_magenta"
-                />
-
-        </androidx.constraintlayout.widget.ConstraintLayout>
-    </androidx.cardview.widget.CardView>
-
-</androidx.constraintlayout.widget.ConstraintLayout>
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_background">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+
+                <TextView
+                    android:id="@+id/tv_text_url"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_url"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_url"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:autoLink="all"
+                    android:text="@string/url"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textColorLink="@color/very_light_magenta"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_text_url" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
 </ScrollView>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index dd69e51..a975f22 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.coordinatorlayout.widget.CoordinatorLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/home_page.xml b/app/src/main/res/layout/home_page.xml
index 564d7da..6456dfc 100644
--- a/app/src/main/res/layout/home_page.xml
+++ b/app/src/main/res/layout/home_page.xml
@@ -4,9 +4,8 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".HomePage"
     android:background="@color/very_dark_purple"
-    >
+    tools:context=".HomePage">
 
     <TextView
         android:id="@+id/tv_title"
@@ -19,29 +18,26 @@
         android:textColor="@color/strong_pink"
         android:textSize="40sp"
         app:layout_constraintBottom_toBottomOf="@id/button_top_manga"
-        app:layout_constraintTop_toTopOf="parent"
-        />
+        app:layout_constraintTop_toTopOf="parent" />
 
     <Button
         android:id="@+id/button_top_manga"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="@string/top_manga"
-        app:layout_constraintTop_toBottomOf="@id/tv_title"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toStartOf="@id/button_top_anime"
-        />
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tv_title" />
 
     <Button
         android:id="@+id/button_top_anime"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="@string/top_anime"
-        app:layout_constraintTop_toBottomOf="@id/tv_title"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toEndOf="@id/button_top_manga"
         app:layout_constraintEnd_toEndOf="parent"
-        />
+        app:layout_constraintStart_toEndOf="@id/button_top_manga"
+        app:layout_constraintTop_toBottomOf="@id/tv_title" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/top_anime_page.xml b/app/src/main/res/layout/top_anime_page.xml
index 4f86dc7..c7ec862 100644
--- a/app/src/main/res/layout/top_anime_page.xml
+++ b/app/src/main/res/layout/top_anime_page.xml
@@ -1,27 +1,27 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".anime.topanime.TopAnimePage"
-    android:background="@color/very_dark_purple">
+    android:background="@color/very_dark_purple"
+    tools:context=".anime.topanime.TopAnimePage">
 
     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
         android:id="@+id/swiperefresh"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
-    <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/recycler_view"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        app:layout_constraintBottom_toTopOf="@+id/button_home"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        tools:listitem="@layout/item_layout"
-        android:scrollbars="vertical" />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recycler_view"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:scrollbars="vertical"
+            app:layout_constraintBottom_toTopOf="@+id/button_home"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            tools:listitem="@layout/item_layout" />
     </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 
     <Button
@@ -31,7 +31,6 @@
         android:text="@string/home"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        />
+        app:layout_constraintStart_toStartOf="parent" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/top_manga_page.xml b/app/src/main/res/layout/top_manga_page.xml
index ce793af..f3d0db3 100644
--- a/app/src/main/res/layout/top_manga_page.xml
+++ b/app/src/main/res/layout/top_manga_page.xml
@@ -1,27 +1,27 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".manga.topmanga.TopMangaPage"
-    android:background="@color/very_dark_purple">
+    android:background="@color/very_dark_purple"
+    tools:context=".manga.topmanga.TopMangaPage">
 
     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
         android:id="@+id/swiperefresh"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
-    <androidx.recyclerview.widget.RecyclerView
-        android:id="@+id/recycler_view"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        app:layout_constraintBottom_toTopOf="@+id/button_home"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        tools:listitem="@layout/item_layout"
-        android:scrollbars="vertical"/>
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recycler_view"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:scrollbars="vertical"
+            app:layout_constraintBottom_toTopOf="@+id/button_home"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            tools:listitem="@layout/item_layout" />
     </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 
     <Button
@@ -31,7 +31,6 @@
         android:text="@string/home"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        />
+        app:layout_constraintStart_toStartOf="parent" />
 
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
-- 
cgit v1.2.3


From 848c8bf1ba4f0f3ecf2eeae0b9be2d6a664db2b4 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 2 Mar 2021 10:46:48 +0100
Subject: Creating the APIs and the responses.

---
 app/build.gradle                                   |  1 +
 .../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 +++++++++
 .../main/java/xyz/adjutor/aniki/manga/MangaApi.kt  |  2 +-
 .../java/xyz/adjutor/aniki/manga/MangaResponse.kt  | 19 ++++++++++++
 .../xyz/adjutor/aniki/manga/RestMangaResponse.kt   | 19 ------------
 .../xyz/adjutor/aniki/manga/search/SearchManga.kt  | 34 ++++++++++++++++++++++
 .../adjutor/aniki/manga/search/SearchMangaApi.kt   | 12 ++++++++
 .../aniki/manga/search/SearchMangaResponse.kt      | 13 +++++++++
 .../aniki/manga/topmanga/DetailTopMangaActivity.kt | 34 +++++++++++-----------
 .../aniki/manga/topmanga/RestTopMangaResponse.kt   | 13 ---------
 .../aniki/manga/topmanga/TopMangaAdapter.kt        |  1 +
 .../adjutor/aniki/manga/topmanga/TopMangaApi.kt    |  2 +-
 .../adjutor/aniki/manga/topmanga/TopMangaPage.kt   | 19 ++++++------
 .../aniki/manga/topmanga/TopMangaResponse.kt       | 13 +++++++++
 24 files changed, 240 insertions(+), 120 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
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/RestMangaResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/RestTopMangaResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaResponse.kt

diff --git a/app/build.gradle b/app/build.gradle
index 6a990f2..0251555 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -34,6 +34,7 @@ android {
 
 dependencies {
 
+    //noinspection GradleDependency
     implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
     implementation 'androidx.core:core-ktx:1.3.2'
     implementation 'androidx.appcompat:appcompat:1.2.0'
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<RestAnimeResponse>
+    fun getAnimeData(@Path("id") id: String): Call<AnimeResponse>
 
 }
\ 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<SearchAnimeResponse>
+
+}
\ 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<SearchAnime>
+
+    fun getResults(): List<SearchAnime> {
+        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<RestAnimeResponse>() {}.type
+            val type: Type = object : TypeToken<AnimeResponse>() {}.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<RestAnimeResponse> {
+        call.enqueue(object : Callback<AnimeResponse> {
             override fun onResponse(
-                call: Call<RestAnimeResponse>,
-                response: Response<RestAnimeResponse>
+                call: Call<AnimeResponse>,
+                response: Response<AnimeResponse>
             ) {
                 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<RestAnimeResponse>, t: Throwable) {
+            override fun onFailure(call: Call<AnimeResponse>, 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<TopAnime>? = null
-
-    fun getResults(): List<TopAnime> {
-        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<RestTopAnimeResponse>
+    fun getTopAnimeData(): 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 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<TopAnime>? {
         //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<List<TopAnime>>() {}.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<RestTopAnimeResponse> {
+        call.enqueue(object : Callback<TopAnimeResponse> {
             override fun onResponse(
-                call: Call<RestTopAnimeResponse>,
-                response: Response<RestTopAnimeResponse>
+                call: Call<TopAnimeResponse>,
+                response: Response<TopAnimeResponse>
             ) {
                 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<RestTopAnimeResponse>, t: Throwable) {
+            override fun onFailure(call: Call<TopAnimeResponse>, 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<TopAnime>? = null
+
+    fun getResults(): List<TopAnime> {
+        return top!!
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/MangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/manga/MangaApi.kt
index 419d510..f1b51a4 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/MangaApi.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/MangaApi.kt
@@ -7,6 +7,6 @@ import retrofit2.http.Path
 interface MangaApi {
 
     @GET("v3/manga/{id}")
-    fun getMangaData(@Path("id") id: String): Call<RestMangaResponse>
+    fun getMangaData(@Path("id") id: String): Call<MangaResponse>
 
 }
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt
new file mode 100644
index 0000000..9b75aec
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt
@@ -0,0 +1,19 @@
+package xyz.adjutor.aniki.manga
+
+import com.google.gson.annotations.SerializedName
+
+class MangaResponse { //only kept the infos I didn't have and that were interesting to me.
+
+    @SerializedName("mal_id")
+    var mal_id: Int? = null
+
+    @SerializedName("chapters")
+    var chapters: Int? = null
+
+    @SerializedName("synopsis")
+    var synopsis: String? = null
+
+    @SerializedName("background")
+    var background: String? = null //a bit of background story about the manga
+
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/RestMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/manga/RestMangaResponse.kt
deleted file mode 100644
index 10df7a5..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/RestMangaResponse.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-package xyz.adjutor.aniki.manga
-
-import com.google.gson.annotations.SerializedName
-
-class RestMangaResponse { //only kept the infos I didn't have and that were interesting to me.
-
-    @SerializedName("mal_id")
-    var mal_id: Int? = null
-
-    @SerializedName("chapters")
-    var chapters: Int? = null
-
-    @SerializedName("synopsis")
-    var synopsis: String? = null
-
-    @SerializedName("background")
-    var background: String? = null //a bit of background story about the manga
-
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt
new file mode 100644
index 0000000..53899e2
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt
@@ -0,0 +1,34 @@
+package xyz.adjutor.aniki.manga.search
+
+import com.google.gson.annotations.SerializedName
+
+class SearchManga {
+
+    @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("chapters")
+    var chapters: Int? = null
+
+    @SerializedName("volumes")
+    var volumes: 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/manga/search/SearchMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaApi.kt
new file mode 100644
index 0000000..6f3e63d
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaApi.kt
@@ -0,0 +1,12 @@
+package xyz.adjutor.aniki.manga.search
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Query
+
+interface SearchMangaApi {
+
+    @GET("v3/search/manga")
+    fun getSearchMangaData(@Query("q") q: String): Call<SearchMangaResponse>
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaResponse.kt
new file mode 100644
index 0000000..7721258
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.manga.search
+
+import com.google.gson.annotations.SerializedName
+
+class SearchMangaResponse { //only kept the infos I didn't have and that were interesting to me.
+
+    @SerializedName("results")
+    private lateinit var results: List<SearchManga>
+
+    fun getResults(): List<SearchManga> {
+        return results
+    }
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
index c7b6317..fc10e89 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
@@ -18,13 +18,13 @@ import retrofit2.Retrofit
 import retrofit2.converter.gson.GsonConverterFactory
 import xyz.adjutor.aniki.R
 import xyz.adjutor.aniki.manga.MangaApi
-import xyz.adjutor.aniki.manga.RestMangaResponse
+import xyz.adjutor.aniki.manga.MangaResponse
 import java.lang.reflect.Type
 
 class DetailTopMangaActivity : 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 DetailTopMangaActivity : AppCompatActivity() {
 
         tvUrl.text = mangaUrl
 
-        val manga: RestMangaResponse? = getDataFromCache(mangaId.toString())
+        val manga: MangaResponse? = getDataFromCache(mangaId.toString())
         if (manga != null) {
             showDetail(manga)
         } else {
@@ -105,13 +105,13 @@ class DetailTopMangaActivity : AppCompatActivity() {
 
     }
 
-    private fun getDataFromCache(mangaId: String): RestMangaResponse? {
-        val jsonManga: String? = sharedPreferences?.getString(mangaId, null)
+    private fun getDataFromCache(mangaId: String): MangaResponse? {
+        val jsonManga: String? = sharedPreferences.getString(mangaId, null)
 
         return if (jsonManga == null) {
             null
         } else {
-            val type: Type = object : TypeToken<RestMangaResponse>() {}.type
+            val type: Type = object : TypeToken<MangaResponse>() {}.type
             gson.fromJson(jsonManga, type)
         }
     }
@@ -126,14 +126,14 @@ class DetailTopMangaActivity : AppCompatActivity() {
         val service = retrofit.create(MangaApi::class.java)
         val call = service.getMangaData(mangaId) //based on the id
 
-        call.enqueue(object : Callback<RestMangaResponse> {
+        call.enqueue(object : Callback<MangaResponse> {
             override fun onResponse(
-                call: Call<RestMangaResponse>,
-                response: Response<RestMangaResponse>
+                call: Call<MangaResponse>,
+                response: Response<MangaResponse>
             ) {
                 if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
 
-                    val manga = response.body() //getting the RestMangaResponse fields
+                    val manga = response.body() //getting the MangaResponse fields
                     saveList(manga)
                     showDetail(manga!!)
 
@@ -142,15 +142,15 @@ class DetailTopMangaActivity : AppCompatActivity() {
                 }
             }
 
-            override fun onFailure(call: Call<RestMangaResponse>, t: Throwable) {
+            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
                 showError("API ERROR : onFailure")
             }
 
         })
     }
 
-    private fun showDetail(manga: RestMangaResponse) {
-        //elements from RestMangaResponse
+    private fun showDetail(manga: MangaResponse) {
+        //elements from MangaResponse
         val tvChapters: TextView = findViewById(R.id.tv_chapters)
         val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
         val tvBackground: TextView = findViewById(R.id.tv_background)
@@ -179,12 +179,12 @@ class DetailTopMangaActivity : AppCompatActivity() {
         return "Unknown"
     }
 
-    fun saveList(manga: RestMangaResponse?) {
+    fun saveList(manga: MangaResponse?) {
         val jsonString: String = gson.toJson(manga)
 
         sharedPreferences
-            ?.edit()
-            ?.putString(manga?.mal_id.toString(), jsonString)
-            ?.apply()
+            .edit()
+            .putString(manga?.mal_id.toString(), jsonString)
+            .apply()
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/RestTopMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/RestTopMangaResponse.kt
deleted file mode 100644
index 87c5cfb..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/RestTopMangaResponse.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.manga.topmanga
-
-import com.google.gson.annotations.SerializedName
-
-class RestTopMangaResponse {
-
-    @SerializedName("top")
-    var top: List<TopManga>? = null
-
-    fun getResults(): List<TopManga> {
-        return top!!
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
index 626f34e..d0c56f7 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
@@ -62,6 +62,7 @@ class TopMangaAdapter(private val mangaList: List<TopManga>) :
             val currentMangaEndDate = "themangaenddate"
             val currentMangaUrl = "themangaurl"
 
+            //intent is used to pass data to another activity
             val intent: Intent =
                 Intent(holder.itemView.context, DetailTopMangaActivity::class.java).apply {
                     putExtra(currentMangaId, currentManga.mal_id.toString())
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
index 278c3e1..629fe02 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
@@ -6,6 +6,6 @@ import retrofit2.http.GET
 interface TopMangaApi {
 
     @GET("v3/top/manga")
-    fun getTopMangaData(): Call<RestTopMangaResponse>
+    fun getTopMangaData(): Call<TopMangaResponse>
 
 }
\ No newline at end of file
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 ce9b1c6..b35bcdd 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
@@ -26,7 +26,7 @@ import java.lang.reflect.Type
 
 class TopMangaPage : Fragment() {
 
-    var sharedPreferences: SharedPreferences? = null
+    private lateinit var sharedPreferences: SharedPreferences
     val gson: Gson = GsonBuilder()
         .setLenient()
         .create()
@@ -53,7 +53,7 @@ class TopMangaPage : Fragment() {
 
     private fun getDataFromCache(): List<TopManga>? {
         //the value of the mangaList json, if nothing is found, return null
-        val jsonManga: String? = sharedPreferences?.getString("jsonMangaList", null)
+        val jsonManga: String? = sharedPreferences.getString("jsonMangaList", null)
 
         //if it's null, well, return null
         return if (jsonManga == null) {
@@ -92,6 +92,7 @@ class TopMangaPage : Fragment() {
         recyclerView.setHasFixedSize(true)
         recyclerView.layoutManager = LinearLayoutManager(view.context)
         recyclerView.adapter = TopMangaAdapter(mangaList)
+        (recyclerView.adapter as TopMangaAdapter).notifyDataSetChanged()
     }
 
     private fun makeApiCall(view: View, BASE_URL: String) {
@@ -104,10 +105,10 @@ class TopMangaPage : Fragment() {
         val service = retrofit.create(TopMangaApi::class.java)
         val call = service.getTopMangaData()
 
-        call.enqueue(object : Callback<RestTopMangaResponse> {
+        call.enqueue(object : Callback<TopMangaResponse> {
             override fun onResponse(
-                call: Call<RestTopMangaResponse>,
-                response: Response<RestTopMangaResponse>
+                call: Call<TopMangaResponse>,
+                response: Response<TopMangaResponse>
             ) {
                 if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
 
@@ -124,7 +125,7 @@ class TopMangaPage : Fragment() {
                 }
             }
 
-            override fun onFailure(call: Call<RestTopMangaResponse>, t: Throwable) {
+            override fun onFailure(call: Call<TopMangaResponse>, t: Throwable) {
                 showError()
             }
 
@@ -135,9 +136,9 @@ class TopMangaPage : Fragment() {
         val jsonString: String = gson.toJson(mangaList)
 
         sharedPreferences
-            ?.edit()
-            ?.putString("jsonMangaList", jsonString)
-            ?.apply()
+            .edit()
+            .putString("jsonMangaList", jsonString)
+            .apply()
     }
 
     private fun showError() {
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaResponse.kt
new file mode 100644
index 0000000..8577050
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.manga.topmanga
+
+import com.google.gson.annotations.SerializedName
+
+class TopMangaResponse {
+
+    @SerializedName("top")
+    private lateinit var top: List<TopManga>
+
+    fun getResults(): List<TopManga> {
+        return top
+    }
+}
\ No newline at end of file
-- 
cgit v1.2.3


From 6d5df6250d4c060840b64d7441525f85146fb87b Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 2 Mar 2021 11:15:56 +0100
Subject: Building the basic files to display the searched mangas.

---
 app/src/main/java/xyz/adjutor/aniki/HomePage.kt    |   3 +
 .../aniki/manga/search/SearchMangaAdapter.kt       |  80 ++++++++++++++
 .../adjutor/aniki/manga/search/SearchMangaPage.kt  | 122 +++++++++++++++++++++
 app/src/main/res/layout/home_page.xml              |  11 ++
 app/src/main/res/layout/search_manga_page.xml      |  36 ++++++
 app/src/main/res/navigation/nav_graph.xml          |  13 +++
 app/src/main/res/values/strings.xml                |   2 +
 7 files changed, 267 insertions(+)
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
 create mode 100644 app/src/main/res/layout/search_manga_page.xml

diff --git a/app/src/main/java/xyz/adjutor/aniki/HomePage.kt b/app/src/main/java/xyz/adjutor/aniki/HomePage.kt
index b7c1d0e..0b90b49 100644
--- a/app/src/main/java/xyz/adjutor/aniki/HomePage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/HomePage.kt
@@ -27,5 +27,8 @@ class HomePage : Fragment() {
         view.findViewById<Button>(R.id.button_top_anime).setOnClickListener {
             findNavController().navigate(R.id.action_HomePage_to_TopAnimePage)
         }
+        view.findViewById<Button>(R.id.button_search_manga).setOnClickListener {
+            findNavController().navigate(R.id.action_HomePage_to_SearchMangaPage)
+        }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
new file mode 100644
index 0000000..13b2446
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
@@ -0,0 +1,80 @@
+package xyz.adjutor.aniki.manga.search
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+
+class SearchMangaAdapter(private val mangaList: List<SearchManga>) :
+    RecyclerView.Adapter<SearchMangaAdapter.MangaViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val mangaTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
+        val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
+        //val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_layout, parent, false)
+
+        return MangaViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return mangaList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
+        val currentManga: SearchManga = mangaList[position]
+        holder.mangaTitle.text = currentManga.title
+        holder.mangaRank.text = "" //the rank isnt supplied by this API
+        holder.mangaScore.text = currentManga.score.toString()
+        val image: String = currentManga.image_url.toString()
+        Glide
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.mangaImage)
+
+        /*
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentMangaId = "themangaid"
+            val currentMangaTitle = "themangatitle"
+            val currentMangaScore = "themangascore"
+            val currentMangaImageUrl = "themangaimageurl"
+            val currentMangaVolumes = "themangavolumes"
+            val currentMangaStartDate = "themangastartdate"
+            val currentMangaEndDate = "themangaenddate"
+            val currentMangaUrl = "themangaurl"
+
+            //intent is used to pass data to another activity
+
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailSearchMangaActivity::class.java).apply {
+                    putExtra(currentMangaId, currentManga.mal_id.toString())
+                    putExtra(currentMangaTitle, currentManga.title)
+                    putExtra(currentMangaScore, currentManga.score.toString())
+                    putExtra(currentMangaImageUrl, currentManga.image_url.toString())
+                    putExtra(currentMangaVolumes, currentManga.volumes.toString())
+                    putExtra(currentMangaStartDate, currentManga.start_date)
+                    putExtra(currentMangaEndDate, currentManga.end_date.toString())
+                    putExtra(currentMangaUrl, currentManga.url.toString())
+                }
+            holder.itemView.context.startActivity(intent)
+        }
+        */
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
new file mode 100644
index 0000000..6310dfc
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
@@ -0,0 +1,122 @@
+package xyz.adjutor.aniki.manga.search
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+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 retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.R
+
+class SearchMangaPage : Fragment() {
+
+    private lateinit var sharedPreferences: SharedPreferences
+    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
+        val view = inflater.inflate(R.layout.search_manga_page, container, false)
+
+        sharedPreferences = view.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
+
+
+        makeApiCall(view, baseUrl)
+
+        return view
+    }
+
+
+    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)
+        }
+
+        fun updateList() {
+            makeApiCall(view, baseUrl)
+            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG)
+                .setAction("Action", null).show()
+        }
+
+        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
+        swipeRefresh.setOnRefreshListener {
+            updateList()
+            swipeRefresh.isRefreshing = false
+        }
+
+    }
+
+    //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()
+    }
+
+    private fun makeApiCall(view: View, BASE_URL: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(SearchMangaApi::class.java)
+        val call = service.getSearchMangaData("fate") //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()
+            }
+
+        })
+    }
+
+    private fun showError() {
+        Snackbar.make(requireView(), "API ERROR", Snackbar.LENGTH_LONG)
+            .setAction("Action", null).show()
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/home_page.xml b/app/src/main/res/layout/home_page.xml
index 6456dfc..9a3ffdf 100644
--- a/app/src/main/res/layout/home_page.xml
+++ b/app/src/main/res/layout/home_page.xml
@@ -40,4 +40,15 @@
         app:layout_constraintStart_toEndOf="@id/button_top_manga"
         app:layout_constraintTop_toBottomOf="@id/tv_title" />
 
+    <Button
+        android:id="@+id/button_search_manga"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/search_manga"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/button_top_manga"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"/>
+
+
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/search_manga_page.xml b/app/src/main/res/layout/search_manga_page.xml
new file mode 100644
index 0000000..a6de772
--- /dev/null
+++ b/app/src/main/res/layout/search_manga_page.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/very_dark_purple"
+    tools:context=".manga.search.SearchMangaPage">
+
+    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+        android:id="@+id/swiperefresh"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recycler_view"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:scrollbars="vertical"
+            app:layout_constraintBottom_toTopOf="@+id/button_home"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            tools:listitem="@layout/item_layout" />
+    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+    <Button
+        android:id="@+id/button_home"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/home"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml
index 4ceeab2..2ee1921 100644
--- a/app/src/main/res/navigation/nav_graph.xml
+++ b/app/src/main/res/navigation/nav_graph.xml
@@ -17,6 +17,9 @@
         <action
             android:id="@+id/action_HomePage_to_TopAnimePage"
             app:destination="@id/TopAnimePage" />
+        <action
+            android:id="@+id/action_HomePage_to_SearchMangaPage"
+            app:destination="@id/SearchMangaPage" />
 
     </fragment>
 
@@ -40,5 +43,15 @@
             android:id="@+id/action_TopAnimePage_to_HomePage"
             app:destination="@id/HomePage" />
     </fragment>
+    <fragment
+        android:id="@+id/SearchMangaPage"
+        android:name="xyz.adjutor.aniki.manga.search.SearchMangaPage"
+        android:label="@string/search_manga_page_label"
+        tools:layout="@layout/search_manga_page">
+
+        <action
+            android:id="@+id/action_SearchMangaPage_to_HomePage"
+            app:destination="@id/HomePage" />
+    </fragment>
 
 </navigation>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index bb9520a..87630b3 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -35,5 +35,7 @@
     <string name="url">https://myanimelist.net/media/id/name</string>
     <string name="text_episodes">"Episodes "</string>
     <string name="episodes">0000</string>
+    <string name="search_manga_page_label">Search Manga Page</string>
+    <string name="search_manga">Search Manga</string>
 
 </resources>
\ No newline at end of file
-- 
cgit v1.2.3


From 81a89af9aa3c35a991eced93eeaa5066804e3ee5 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 2 Mar 2021 12:05:27 +0100
Subject: Search working for mangas.

---
 .../adjutor/aniki/manga/search/SearchMangaPage.kt  | 28 +++++----------------
 app/src/main/res/layout/search_manga_page.xml      | 29 +++++++++++++++++-----
 app/src/main/res/values/strings.xml                |  1 +
 3 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
index 6310dfc..40f9633 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
@@ -1,7 +1,5 @@
 package xyz.adjutor.aniki.manga.search
 
-import android.content.Context
-import android.content.SharedPreferences
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
@@ -11,8 +9,8 @@ import androidx.fragment.app.Fragment
 import androidx.navigation.fragment.findNavController
 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.android.material.textfield.TextInputEditText
 import com.google.gson.Gson
 import com.google.gson.GsonBuilder
 import retrofit2.Call
@@ -24,7 +22,6 @@ import xyz.adjutor.aniki.R
 
 class SearchMangaPage : Fragment() {
 
-    private lateinit var sharedPreferences: SharedPreferences
     val gson: Gson = GsonBuilder()
         .setLenient()
         .create()
@@ -37,11 +34,6 @@ class SearchMangaPage : Fragment() {
         // Inflate the layout for this fragment
         val view = inflater.inflate(R.layout.search_manga_page, container, false)
 
-        sharedPreferences = view.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
-
-
-        makeApiCall(view, baseUrl)
-
         return view
     }
 
@@ -54,18 +46,10 @@ class SearchMangaPage : Fragment() {
             findNavController().navigate(R.id.action_SearchMangaPage_to_HomePage)
         }
 
-        fun updateList() {
-            makeApiCall(view, baseUrl)
-            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG)
-                .setAction("Action", null).show()
+        view.findViewById<Button>(R.id.button_query).setOnClickListener{
+            val userInput = view.findViewById<TextInputEditText>(R.id.tiet_query).text.toString()
+            makeApiCall(view, baseUrl, userInput)
         }
-
-        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
-        swipeRefresh.setOnRefreshListener {
-            updateList()
-            swipeRefresh.isRefreshing = false
-        }
-
     }
 
     //display the recyclerview
@@ -77,7 +61,7 @@ class SearchMangaPage : Fragment() {
         (recyclerView.adapter as SearchMangaAdapter).notifyDataSetChanged()
     }
 
-    private fun makeApiCall(view: View, BASE_URL: String) {
+    private fun makeApiCall(view: View, BASE_URL: String, query: String) {
 
         val retrofit = Retrofit.Builder()
             .baseUrl(BASE_URL)
@@ -85,7 +69,7 @@ class SearchMangaPage : Fragment() {
             .build()
 
         val service = retrofit.create(SearchMangaApi::class.java)
-        val call = service.getSearchMangaData("fate") //fate is an exemple, we'll have to replace it by the user input.
+        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(
diff --git a/app/src/main/res/layout/search_manga_page.xml b/app/src/main/res/layout/search_manga_page.xml
index a6de772..1470311 100644
--- a/app/src/main/res/layout/search_manga_page.xml
+++ b/app/src/main/res/layout/search_manga_page.xml
@@ -7,10 +7,27 @@
     android:background="@color/very_dark_purple"
     tools:context=".manga.search.SearchMangaPage">
 
-    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
-        android:id="@+id/swiperefresh"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
+
+    <com.google.android.material.textfield.TextInputEditText
+        android:id="@+id/tiet_query"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toTopOf="@id/recycler_view"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/button_query"/>
+
+    <Button
+        android:id="@+id/button_query"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toTopOf="@id/recycler_view"
+        app:layout_constraintStart_toEndOf="@id/tiet_query"
+        android:text="@string/search"
+        />
 
         <androidx.recyclerview.widget.RecyclerView
             android:id="@+id/recycler_view"
@@ -20,9 +37,8 @@
             app:layout_constraintBottom_toTopOf="@+id/button_home"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/tiet_query"
             tools:listitem="@layout/item_layout" />
-    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 
     <Button
         android:id="@+id/button_home"
@@ -33,4 +49,5 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent" />
 
+
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 87630b3..d7f7838 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -37,5 +37,6 @@
     <string name="episodes">0000</string>
     <string name="search_manga_page_label">Search Manga Page</string>
     <string name="search_manga">Search Manga</string>
+    <string name="search">Search in the database</string>
 
 </resources>
\ No newline at end of file
-- 
cgit v1.2.3


From d5dd918f2c8c0f29c70379fce6e40b79141c798a Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
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

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<Button>(R.id.button_search_manga).setOnClickListener {
             findNavController().navigate(R.id.action_HomePage_to_SearchMangaPage)
         }
+        view.findViewById<Button>(R.id.button_search_anime).setOnClickListener {
+            findNavController().navigate(R.id.action_HomePage_to_SearchAnimePage)
+        }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt
new file mode 100644
index 0000000..a3a4a97
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt
@@ -0,0 +1,80 @@
+package xyz.adjutor.aniki.anime.search
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+
+class SearchAnimeAdapter(private val animeList: List<SearchAnime>) :
+    RecyclerView.Adapter<SearchAnimeAdapter.AnimeViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val animeTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val animeScore: TextView = itemView.findViewById(R.id.tv_score)
+        val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
+        //val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_layout, parent, false)
+
+        return AnimeViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return animeList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
+        val currentAnime: SearchAnime = animeList[position]
+        holder.animeTitle.text = currentAnime.title
+        holder.animeRank.text = "" //the rank isnt supplied by this API
+        holder.animeScore.text = currentAnime.score.toString()
+        val image: String = currentAnime.image_url.toString()
+        Glide
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.animeImage)
+
+        /*
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentAnimeId = "theanimeid"
+            val currentAnimeTitle = "theanimetitle"
+            val currentAnimeScore = "theanimescore"
+            val currentAnimeImageUrl = "theanimeimageurl"
+            val currentAnimeVolumes = "theanimevolumes"
+            val currentAnimeStartDate = "theanimestartdate"
+            val currentAnimeEndDate = "theanimeenddate"
+            val currentAnimeUrl = "theanimeurl"
+
+            //intent is used to pass data to another activity
+
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailSearchAnimeActivity::class.java).apply {
+                    putExtra(currentAnimeId, currentAnime.mal_id.toString())
+                    putExtra(currentAnimeTitle, currentAnime.title)
+                    putExtra(currentAnimeScore, currentAnime.score.toString())
+                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
+                    putExtra(currentAnimeVolumes, currentAnime.volumes.toString())
+                    putExtra(currentAnimeStartDate, currentAnime.start_date)
+                    putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
+                    putExtra(currentAnimeUrl, currentAnime.url.toString())
+                }
+            holder.itemView.context.startActivity(intent)
+        }
+        */
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt
new file mode 100644
index 0000000..c1596c3
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt
@@ -0,0 +1,119 @@
+package xyz.adjutor.aniki.anime.search
+
+import android.content.Context
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.view.inputmethod.InputMethodManager
+import android.widget.Button
+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.MainActivity
+import xyz.adjutor.aniki.R
+
+class SearchAnimePage : 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_anime_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_SearchAnimePage_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)
+        }
+    }
+
+    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, animeList: List<SearchAnime>) {
+        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
+        recyclerView.setHasFixedSize(true)
+        recyclerView.layoutManager = LinearLayoutManager(view.context)
+        recyclerView.adapter = SearchAnimeAdapter(animeList)
+        (recyclerView.adapter as SearchAnimeAdapter).notifyDataSetChanged()
+    }
+
+    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(SearchAnimeApi::class.java)
+        val call = service.getSearchAnimeData(q = query) //fate is an exemple, we'll have to replace it by the user input.
+
+        call.enqueue(object : Callback<SearchAnimeResponse> {
+            override fun onResponse(
+                call: Call<SearchAnimeResponse>,
+                response: Response<SearchAnimeResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val animeList: List<SearchAnime> = response.body()!!
+                        .getResults() //getting the "search" field containing our list of SearchAnimes
+
+                    showList(
+                        view,
+                        animeList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<SearchAnimeResponse>, t: Throwable) {
+                showError()
+            }
+
+        })
+    }
+
+    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
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
index 40f9633..f79db36 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
@@ -1,9 +1,11 @@
 package xyz.adjutor.aniki.manga.search
 
+import android.content.Context
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.view.inputmethod.InputMethodManager
 import android.widget.Button
 import androidx.fragment.app.Fragment
 import androidx.navigation.fragment.findNavController
@@ -18,6 +20,7 @@ import retrofit2.Callback
 import retrofit2.Response
 import retrofit2.Retrofit
 import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.MainActivity
 import xyz.adjutor.aniki.R
 
 class SearchMangaPage : Fragment() {
@@ -32,9 +35,8 @@ class SearchMangaPage : Fragment() {
         savedInstanceState: Bundle?
     ): View? {
         // Inflate the layout for this fragment
-        val view = inflater.inflate(R.layout.search_manga_page, container, false)
 
-        return view
+        return inflater.inflate(R.layout.search_manga_page, container, false)
     }
 
 
@@ -48,10 +50,22 @@ class SearchMangaPage : Fragment() {
 
         view.findViewById<Button>(R.id.button_query).setOnClickListener{
             val userInput = view.findViewById<TextInputEditText>(R.id.tiet_query).text.toString()
+            hideKeyboard()
             makeApiCall(view, baseUrl, userInput)
         }
     }
 
+    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)
@@ -99,7 +113,7 @@ class SearchMangaPage : Fragment() {
     }
 
     private fun showError() {
-        Snackbar.make(requireView(), "API ERROR", Snackbar.LENGTH_LONG)
+        Snackbar.make(requireView(), "API ERROR : Verify your internet connection or your query.", Snackbar.LENGTH_LONG)
             .setAction("Action", null).show()
     }
 
diff --git a/app/src/main/res/layout/home_page.xml b/app/src/main/res/layout/home_page.xml
index 9a3ffdf..be80747 100644
--- a/app/src/main/res/layout/home_page.xml
+++ b/app/src/main/res/layout/home_page.xml
@@ -48,6 +48,16 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintTop_toBottomOf="@id/button_top_manga"
         app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/button_search_anime"/>
+
+    <Button
+        android:id="@+id/button_search_anime"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/search_anime"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/button_top_anime"
+        app:layout_constraintStart_toEndOf="@id/button_search_manga"
         app:layout_constraintEnd_toEndOf="parent"/>
 
 
diff --git a/app/src/main/res/layout/search_anime_page.xml b/app/src/main/res/layout/search_anime_page.xml
new file mode 100644
index 0000000..1f95b10
--- /dev/null
+++ b/app/src/main/res/layout/search_anime_page.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/very_dark_purple"
+    tools:context=".anime.search.SearchAnimePage">
+
+
+    <com.google.android.material.textfield.TextInputEditText
+        android:id="@+id/tiet_query"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toTopOf="@id/recycler_view"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/button_query"/>
+
+    <Button
+        android:id="@+id/button_query"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toTopOf="@id/recycler_view"
+        app:layout_constraintStart_toEndOf="@id/tiet_query"
+        android:text="@string/search"
+        />
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recycler_view"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:scrollbars="vertical"
+            app:layout_constraintBottom_toTopOf="@+id/button_home"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/tiet_query"
+            tools:listitem="@layout/item_layout" />
+
+    <Button
+        android:id="@+id/button_home"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/home"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml
index 2ee1921..89cbc89 100644
--- a/app/src/main/res/navigation/nav_graph.xml
+++ b/app/src/main/res/navigation/nav_graph.xml
@@ -20,6 +20,9 @@
         <action
             android:id="@+id/action_HomePage_to_SearchMangaPage"
             app:destination="@id/SearchMangaPage" />
+        <action
+            android:id="@+id/action_HomePage_to_SearchAnimePage"
+            app:destination="@id/SearchAnimePage" />
 
     </fragment>
 
@@ -53,5 +56,15 @@
             android:id="@+id/action_SearchMangaPage_to_HomePage"
             app:destination="@id/HomePage" />
     </fragment>
+    <fragment
+        android:id="@+id/SearchAnimePage"
+        android:name="xyz.adjutor.aniki.anime.search.SearchAnimePage"
+        android:label="@string/search_anime_page_label"
+        tools:layout="@layout/search_anime_page">
+
+        <action
+            android:id="@+id/action_SearchAnimePage_to_HomePage"
+            app:destination="@id/HomePage" />
+    </fragment>
 
 </navigation>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d7f7838..2acf406 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -38,5 +38,7 @@
     <string name="search_manga_page_label">Search Manga Page</string>
     <string name="search_manga">Search Manga</string>
     <string name="search">Search in the database</string>
+    <string name="search_anime">Search Anime</string>
+    <string name="search_anime_page_label">Search Anime Page</string>
 
 </resources>
\ No newline at end of file
-- 
cgit v1.2.3


From 2d51793b3ff0ff60c6c26e31811538e6b81ab154 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 2 Mar 2021 16:35:55 +0100
Subject: Update README.md

---
 README.md | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/README.md b/README.md
index d2c01dd..3072d2d 100644
--- a/README.md
+++ b/README.md
@@ -5,12 +5,18 @@ Details of a chosen element from the recycler view with an intent object
 Title, synopsys and background clickable.
 URL link openable.
 
+Search pages for animes and mangas.
+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.
+
 Multiple calls of the REST API from jikan.moe.
 Usage of :
 /v3/top/manga
 /v3/top/anime
 /v3/manga
 /v3/anime
+/v3/search/manga
+/v3/search/anime
 
 Data storage with sharedpreferences used for the recycler view of top manga and top anime as well as the details
 Saves the detail page of an item when opened, not when the list is shown
-- 
cgit v1.2.3


From dafb34569442334163eb7a249d155ec21379d9ea Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Fri, 12 Mar 2021 14:47:31 +0100
Subject: Adding colors to TextInputEditText from search pages.

---
 app/src/main/res/layout/search_anime_page.xml | 8 +++++---
 app/src/main/res/layout/search_manga_page.xml | 8 +++++---
 app/src/main/res/values/colors.xml            | 1 +
 app/src/main/res/values/strings.xml           | 1 +
 4 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/app/src/main/res/layout/search_anime_page.xml b/app/src/main/res/layout/search_anime_page.xml
index 1f95b10..631ebde 100644
--- a/app/src/main/res/layout/search_anime_page.xml
+++ b/app/src/main/res/layout/search_anime_page.xml
@@ -7,16 +7,18 @@
     android:background="@color/very_dark_purple"
     tools:context=".anime.search.SearchAnimePage">
 
-
     <com.google.android.material.textfield.TextInputEditText
         android:id="@+id/tiet_query"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
+        android:hint="@string/hint_query"
+        android:textColor="@color/very_light_magenta"
+        android:textColorHint="@color/grayish_magenta"
         android:textStyle="bold"
         app:layout_constraintBottom_toTopOf="@id/recycler_view"
-        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/button_query"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toStartOf="@id/button_query"/>
+        app:layout_constraintTop_toTopOf="parent" />
 
     <Button
         android:id="@+id/button_query"
diff --git a/app/src/main/res/layout/search_manga_page.xml b/app/src/main/res/layout/search_manga_page.xml
index 1470311..02a62ff 100644
--- a/app/src/main/res/layout/search_manga_page.xml
+++ b/app/src/main/res/layout/search_manga_page.xml
@@ -7,16 +7,18 @@
     android:background="@color/very_dark_purple"
     tools:context=".manga.search.SearchMangaPage">
 
-
     <com.google.android.material.textfield.TextInputEditText
         android:id="@+id/tiet_query"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
+        android:hint="@string/hint_query"
+        android:textColor="@color/very_light_magenta"
+        android:textColorHint="@color/grayish_magenta"
         android:textStyle="bold"
         app:layout_constraintBottom_toTopOf="@id/recycler_view"
-        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/button_query"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toStartOf="@id/button_query"/>
+        app:layout_constraintTop_toTopOf="parent" />
 
     <Button
         android:id="@+id/button_query"
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index ae0a497..1dc4ee9 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -10,4 +10,5 @@
     <color name="very_light_magenta">#FF70FF</color>
     <color name="strong_pink">#D52C70</color>
     <color name="slightly_desaturated_magenta">#c583b6</color>
+    <color name="grayish_magenta">#c9a6c9</color>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2acf406..c8c8ab9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -40,5 +40,6 @@
     <string name="search">Search in the database</string>
     <string name="search_anime">Search Anime</string>
     <string name="search_anime_page_label">Search Anime Page</string>
+    <string name="hint_query">Your query …</string>
 
 </resources>
\ No newline at end of file
-- 
cgit v1.2.3


From 7c9c60ae0e19946a59695186566d3ea1a67c4c47 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Fri, 12 Mar 2021 16:42:08 +0100
Subject: Detail for searched mangas is working.

---
 app/src/main/AndroidManifest.xml                   |   4 +
 .../java/xyz/adjutor/aniki/manga/MangaResponse.kt  |   3 +
 .../manga/search/DetailSearchMangaActivity.kt      | 169 +++++++++++
 .../aniki/manga/search/SearchMangaAdapter.kt       |  24 +-
 .../aniki/manga/topmanga/DetailTopMangaActivity.kt |  11 +-
 .../res/layout/activity_detail_search_manga.xml    | 313 +++++++++++++++++++++
 app/src/main/res/values/strings.xml                |   1 +
 7 files changed, 511 insertions(+), 14 deletions(-)
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/DetailSearchMangaActivity.kt
 create mode 100644 app/src/main/res/layout/activity_detail_search_manga.xml

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c24711c..4c79bd2 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -21,6 +21,10 @@
             android:name="xyz.adjutor.aniki.anime.topanime.DetailTopAnimeActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
+        <activity
+            android:name="xyz.adjutor.aniki.manga.search.DetailSearchMangaActivity"
+            android:label="Details"
+            android:theme="@style/Theme.Aniki" />
         <activity
             android:name=".MainActivity"
             android:label="@string/app_name"
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt
index 9b75aec..263b93c 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt
@@ -13,6 +13,9 @@ class MangaResponse { //only kept the infos I didn't have and that were interest
     @SerializedName("synopsis")
     var synopsis: String? = null
 
+    @SerializedName("rank")
+    var rank: Int? = null //added for the search feature (detail)
+
     @SerializedName("background")
     var background: String? = null //a bit of background story about the manga
 
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/DetailSearchMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/DetailSearchMangaActivity.kt
new file mode 100644
index 0000000..4ae01f8
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/DetailSearchMangaActivity.kt
@@ -0,0 +1,169 @@
+package xyz.adjutor.aniki.manga.search
+
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+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.manga.MangaApi
+import xyz.adjutor.aniki.manga.MangaResponse
+
+class DetailSearchMangaActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    private val gson = GsonBuilder()
+        .setLenient()
+        .create()
+
+    //used in the list
+    private val intentMangaImageUrl = "themangaimageurl"
+    private val intentMangaTitle = "themangatitle"
+    private val intentMangaScore = "themangascore"
+
+    //only used for the detail
+    private val intentMangaId = "themangaid"
+    private val intentMangaUrl = "themangaurl"
+    private val intentMangaChapters = "themangachapters"
+    private val intentMangaVolumes = "themangavolumes"
+    private val intentMangaStartDate = "themangastartdate"
+    private val intentMangaEndDate = "themangaenddate"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_search_manga)
+
+        val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
+        val mangaTitle = intent.getStringExtra(intentMangaTitle)
+        val mangaScore = intent.getStringExtra(intentMangaScore)
+
+        val mangaId = intent.getStringExtra(intentMangaId)
+        val mangaUrl = intent.getStringExtra(intentMangaUrl)
+        val mangaChapters = intent.getStringExtra(intentMangaChapters)
+        val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
+        val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
+        val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
+
+
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+        val tvChapters: TextView = findViewById(R.id.tv_chapters)
+        val tvVolumes: TextView = findViewById(R.id.tv_volumes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+
+        Glide
+            .with(this)
+            .load(mangaImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+        tvTitle.text = mangaTitle
+        tvScore.text = mangaScore
+
+
+        tvId.text = mangaId
+        tvUrl.text = mangaUrl
+
+        //using null as a string because it has been converted to a string before
+        tvChapters.text = if (mangaChapters != "null") {
+            mangaChapters
+        } else {
+            fieldIsNull()
+        }
+
+        tvVolumes.text = if (mangaVolumes != "null") {
+            mangaVolumes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = splitDate(mangaStartDate!!)
+
+        tvEndDate.text = if (mangaEndDate != "null") {
+            splitDate(mangaEndDate!!)
+        } else {
+            fieldIsNull()
+        }
+
+        makeApiCall(baseUrl, mangaId.toString())
+
+    }
+
+    private fun splitDate(mangaDate: String): CharSequence {
+        val delimiter = "T"
+        return mangaDate
+            .split(delimiter) //split between the date and the time
+            .toTypedArray()[0] //convert it to an array and take the first string
+
+    }
+
+    private fun makeApiCall(BASE_URL: String, mangaId: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(MangaApi::class.java)
+        val call = service.getMangaData(mangaId) //based on the id
+
+        call.enqueue(object : Callback<MangaResponse> {
+            override fun onResponse(
+                call: Call<MangaResponse>,
+                response: Response<MangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val manga = response.body() //getting the MangaResponse fields
+                    showDetail(manga!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(manga: MangaResponse) {
+        //elements from MangaResponse
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+        val tvBackground: TextView = findViewById(R.id.tv_background)
+
+        tvSynopsis.text = manga.synopsis.toString()
+
+        tvRank.text = manga.rank.toString()
+
+        tvBackground.text = if (manga.background != null) {
+            manga.background.toString()
+        } else {
+            fieldIsNull()
+        }
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+
+    private fun fieldIsNull(): String {
+        return "Unknown"
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
index 13b2446..79f8cb3 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
@@ -1,10 +1,12 @@
 package xyz.adjutor.aniki.manga.search
 
+import android.content.Intent
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.ImageView
 import android.widget.TextView
+import androidx.cardview.widget.CardView
 import androidx.recyclerview.widget.RecyclerView
 import com.bumptech.glide.Glide
 import com.bumptech.glide.request.RequestOptions
@@ -19,7 +21,7 @@ class SearchMangaAdapter(private val mangaList: List<SearchManga>) :
         val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
         val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
         val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
-        //val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
     }
 
     // Returns a new ViewHolder
@@ -39,7 +41,7 @@ class SearchMangaAdapter(private val mangaList: List<SearchManga>) :
     override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
         val currentManga: SearchManga = mangaList[position]
         holder.mangaTitle.text = currentManga.title
-        holder.mangaRank.text = "" //the rank isnt supplied by this API
+        holder.mangaRank.text = "" //the rank isn't supplied by this API
         holder.mangaScore.text = currentManga.score.toString()
         val image: String = currentManga.image_url.toString()
         Glide
@@ -48,33 +50,35 @@ class SearchMangaAdapter(private val mangaList: List<SearchManga>) :
             .apply(RequestOptions().override(400))
             .into(holder.mangaImage)
 
-        /*
+
         //when you click on a selected cardview, some datas are sent to the other activity
         holder.cardview.setOnClickListener {
             val currentMangaId = "themangaid"
-            val currentMangaTitle = "themangatitle"
-            val currentMangaScore = "themangascore"
+            val currentMangaUrl = "themangaurl"
             val currentMangaImageUrl = "themangaimageurl"
+            val currentMangaTitle = "themangatitle"
+            val currentMangaChapters = "themangachapters"
             val currentMangaVolumes = "themangavolumes"
+            val currentMangaScore = "themangascore"
             val currentMangaStartDate = "themangastartdate"
             val currentMangaEndDate = "themangaenddate"
-            val currentMangaUrl = "themangaurl"
 
             //intent is used to pass data to another activity
 
             val intent: Intent =
                 Intent(holder.itemView.context, DetailSearchMangaActivity::class.java).apply {
                     putExtra(currentMangaId, currentManga.mal_id.toString())
-                    putExtra(currentMangaTitle, currentManga.title)
-                    putExtra(currentMangaScore, currentManga.score.toString())
+                    putExtra(currentMangaUrl, currentManga.url.toString())
                     putExtra(currentMangaImageUrl, currentManga.image_url.toString())
+                    putExtra(currentMangaTitle, currentManga.title)
+                    putExtra(currentMangaChapters, currentManga.chapters.toString())
                     putExtra(currentMangaVolumes, currentManga.volumes.toString())
+                    putExtra(currentMangaScore, currentManga.score.toString())
                     putExtra(currentMangaStartDate, currentManga.start_date)
                     putExtra(currentMangaEndDate, currentManga.end_date.toString())
-                    putExtra(currentMangaUrl, currentManga.url.toString())
                 }
             holder.itemView.context.startActivity(intent)
         }
-        */
+
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
index fc10e89..6d89437 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
@@ -29,12 +29,14 @@ class DetailTopMangaActivity : AppCompatActivity() {
         .setLenient()
         .create()
 
-    private val intentMangaId = "themangaid"
+    //used in the list
     private val intentMangaTitle = "themangatitle"
     private val intentMangaRank = "themangarank"
     private val intentMangaScore = "themangascore"
     private val intentMangaImageUrl = "themangaimageurl"
 
+    //only used for the detail
+    private val intentMangaId = "themangaid"
     private val intentMangaVolumes = "themangavolumes"
     private val intentMangaStartDate = "themangastartdate"
     private val intentMangaEndDate = "themangaenddate"
@@ -46,29 +48,28 @@ class DetailTopMangaActivity : AppCompatActivity() {
 
         sharedPreferences = this.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
 
-        val mangaId = intent.getStringExtra(intentMangaId)
         val mangaTitle = intent.getStringExtra(intentMangaTitle)
         val mangaRank = intent.getStringExtra(intentMangaRank)
         val mangaScore = intent.getStringExtra(intentMangaScore)
         val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
 
+        val mangaId = intent.getStringExtra(intentMangaId)
         val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
         val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
         val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
         val mangaUrl = intent.getStringExtra(intentMangaUrl)
 
-        val tvId: TextView = findViewById(R.id.tv_detail_id)
         val tvTitle: TextView = findViewById(R.id.tv_detail_title)
         val tvRank: TextView = findViewById(R.id.tv_detail_rank)
         val tvScore: TextView = findViewById(R.id.tv_detail_score)
         val ivImage: ImageView = findViewById(R.id.iv_detail_image)
 
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
         val tvVolumes: TextView = findViewById(R.id.tv_volumes)
         val tvStartDate: TextView = findViewById(R.id.tv_start_date)
         val tvEndDate: TextView = findViewById(R.id.tv_end_date)
         val tvUrl: TextView = findViewById(R.id.tv_url)
 
-        tvId.text = mangaId
         tvTitle.text = mangaTitle
         tvRank.text = mangaRank
         tvScore.text = mangaScore
@@ -78,6 +79,8 @@ class DetailTopMangaActivity : AppCompatActivity() {
             .apply(RequestOptions().override(400))
             .into(ivImage)
 
+        tvId.text = mangaId
+
         //using null as a string because it has been converted to a string before
         tvVolumes.text = if (mangaVolumes != "null") {
             mangaVolumes
diff --git a/app/src/main/res/layout/activity_detail_search_manga.xml b/app/src/main/res/layout/activity_detail_search_manga.xml
new file mode 100644
index 0000000..75cad74
--- /dev/null
+++ b/app/src/main/res/layout/activity_detail_search_manga.xml
@@ -0,0 +1,313 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/very_dark_purple">
+
+    <androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto"
+        xmlns:tools="http://schemas.android.com/tools"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        tools:context=".manga.searchmanga.DetailSearchMangaActivity">
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_header"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:text="@string/text_mal_id"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_id" />
+
+                <TextView
+                    android:id="@+id/tv_detail_id"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/id"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textIsSelectable="true"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/iv_detail_image"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <ImageView
+                    android:id="@+id/iv_detail_image"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:contentDescription="@string/image"
+                    android:src="@mipmap/ic_launcher"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_detail_title"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_marginHorizontal="10sp"
+                    android:fontFamily="@font/bangers"
+                    android:text="@string/title"
+                    android:textAlignment="center"
+                    android:textColor="@color/strong_pink"
+                    android:textIsSelectable="true"
+                    android:textSize="30sp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/iv_detail_image"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_rank"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_detail_rank"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_rank"
+                    app:layout_constraintTop_toTopOf="@id/tv_detail_rank" />
+
+                <TextView
+                    android:id="@+id/tv_detail_rank"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/rank"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textSize="20sp"
+                    app:layout_constraintBottom_toTopOf="@id/tv_detail_title"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_score"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_detail_score"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_score"
+                    app:layout_constraintTop_toTopOf="@id/tv_detail_score" />
+
+                <TextView
+                    android:id="@+id/tv_detail_score"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/score"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textSize="20sp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_detail_title" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_more_infos"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_header">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+                <TextView
+                    android:id="@+id/tv_text_volumes"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_volumes"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_volumes"
+                    app:layout_constraintEnd_toStartOf="@id/tv_volumes"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="@id/tv_volumes" />
+
+                <TextView
+                    android:id="@+id/tv_volumes"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/volumes"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintStart_toEndOf="@id/tv_text_volumes"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_text_chapters"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_chapters"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_chapters"
+                    app:layout_constraintEnd_toStartOf="@id/tv_chapters"
+                    app:layout_constraintTop_toTopOf="@id/tv_chapters" />
+
+                <TextView
+                    android:id="@+id/tv_chapters"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/chapters"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/tv_text_chapters"
+                    app:layout_constraintTop_toBottomOf="@id/tv_volumes" />
+
+                <TextView
+                    android:id="@+id/tv_text_start_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_start_date"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_start_date"
+                    app:layout_constraintEnd_toStartOf="@id/tv_start_date"
+                    app:layout_constraintTop_toTopOf="@id/tv_start_date" />
+
+                <TextView
+                    android:id="@+id/tv_start_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/start_date"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_text_end_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_end_date"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_end_date"
+                    app:layout_constraintEnd_toStartOf="@id/tv_end_date"
+                    app:layout_constraintTop_toTopOf="@id/tv_end_date" />
+
+                <TextView
+                    android:id="@+id/tv_end_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/end_date"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_start_date" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_synopsis"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_more_infos">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+                <TextView
+                    android:id="@+id/tv_text_synopsis"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_synopsis"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_synopsis"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textIsSelectable="true"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_text_synopsis" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_background"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_synopsis">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+
+                <TextView
+                    android:id="@+id/tv_text_background"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_background"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_background"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textIsSelectable="true"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_text_background" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_background">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+
+                <TextView
+                    android:id="@+id/tv_text_url"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_url"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_url"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:autoLink="all"
+                    android:text="@string/url"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textColorLink="@color/very_light_magenta"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_text_url" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c8c8ab9..0c56edc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -35,6 +35,7 @@
     <string name="url">https://myanimelist.net/media/id/name</string>
     <string name="text_episodes">"Episodes "</string>
     <string name="episodes">0000</string>
+
     <string name="search_manga_page_label">Search Manga Page</string>
     <string name="search_manga">Search Manga</string>
     <string name="search">Search in the database</string>
-- 
cgit v1.2.3


From a9a6ab39a9bb7c5b8a3c1f20e2e56fd902bf0cd7 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Sun, 14 Mar 2021 13:01:06 +0100
Subject: Added detail for searched animes.

---
 app/src/main/AndroidManifest.xml                   |   4 +
 .../java/xyz/adjutor/aniki/anime/AnimeResponse.kt  |   4 +
 .../anime/search/DetailSearchAnimeActivity.kt      | 156 +++++++++++++
 .../xyz/adjutor/aniki/anime/search/SearchAnime.kt  |   2 +-
 .../aniki/anime/search/SearchAnimeAdapter.kt       |  21 +-
 .../xyz/adjutor/aniki/manga/search/SearchManga.kt  |   2 +-
 .../aniki/manga/search/SearchMangaAdapter.kt       |   1 -
 .../res/layout/activity_detail_search_anime.xml    | 259 +++++++++++++++++++++
 8 files changed, 436 insertions(+), 13 deletions(-)
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/search/DetailSearchAnimeActivity.kt
 create mode 100644 app/src/main/res/layout/activity_detail_search_anime.xml

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4c79bd2..4de763c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -25,6 +25,10 @@
             android:name="xyz.adjutor.aniki.manga.search.DetailSearchMangaActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
+        <activity
+            android:name="xyz.adjutor.aniki.anime.search.DetailSearchAnimeActivity"
+            android:label="Details"
+            android:theme="@style/Theme.Aniki" />
         <activity
             android:name=".MainActivity"
             android:label="@string/app_name"
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/AnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/anime/AnimeResponse.kt
index 8d801d6..9e279e1 100644
--- a/app/src/main/java/xyz/adjutor/aniki/anime/AnimeResponse.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/AnimeResponse.kt
@@ -7,6 +7,10 @@ class AnimeResponse { //only kept the infos I didn't have and that were interest
     @SerializedName("mal_id")
     var mal_id: Int? = null
 
+    @SerializedName("rank")
+    var rank: Int? = null //added for the search feature (detail)
+
     @SerializedName("synopsis")
     var synopsis: String? = null
+
 }
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/search/DetailSearchAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/anime/search/DetailSearchAnimeActivity.kt
new file mode 100644
index 0000000..2f4a6c2
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/search/DetailSearchAnimeActivity.kt
@@ -0,0 +1,156 @@
+package xyz.adjutor.aniki.anime.search
+
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+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.anime.AnimeApi
+import xyz.adjutor.aniki.anime.AnimeResponse
+
+class DetailSearchAnimeActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    private val gson = GsonBuilder()
+        .setLenient()
+        .create()
+
+    //used in the list
+    private val intentAnimeImageUrl = "theanimeimageurl"
+    private val intentAnimeTitle = "theanimetitle"
+    private val intentAnimeScore = "theanimescore"
+
+    //only used for the detail
+    private val intentAnimeId = "theanimeid"
+    private val intentAnimeUrl = "theanimeurl"
+    private val intentAnimeEpisodes = "theanimeepisodes"
+    private val intentAnimeStartDate = "theanimestartdate"
+    private val intentAnimeEndDate = "theanimeenddate"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_search_anime)
+
+        val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
+        val animeTitle = intent.getStringExtra(intentAnimeTitle)
+        val animeScore = intent.getStringExtra(intentAnimeScore)
+
+        val animeId = intent.getStringExtra(intentAnimeId)
+        val animeUrl = intent.getStringExtra(intentAnimeUrl)
+        val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes)
+        val animeStartDate = intent.getStringExtra(intentAnimeStartDate)
+        val animeEndDate = intent.getStringExtra(intentAnimeEndDate)
+
+
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+        val tvEpisodes: TextView = findViewById(R.id.tv_episodes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+
+        Glide
+            .with(this)
+            .load(animeImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+        tvTitle.text = animeTitle
+        tvScore.text = animeScore
+
+
+        tvId.text = animeId
+        tvUrl.text = animeUrl
+
+        //using null as a string because it has been converted to a string before
+        tvEpisodes.text = if (animeEpisodes != "null") {
+            animeEpisodes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = splitDate(animeStartDate!!)
+
+        tvEndDate.text = if (animeEndDate != "null") {
+            splitDate(animeEndDate!!)
+        } else {
+            fieldIsNull()
+        }
+
+        makeApiCall(baseUrl, animeId.toString())
+
+    }
+
+    private fun splitDate(animeDate: String): CharSequence {
+        val delimiter = "T"
+        return animeDate
+            .split(delimiter) //split between the date and the time
+            .toTypedArray()[0] //convert it to an array and take the first string
+
+    }
+
+    private fun makeApiCall(
+        BASE_URL: String,
+        animeId: String
+    ) { //we take the rest of the data that we need from the internet
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(AnimeApi::class.java)
+        val call = service.getAnimeData(animeId) //based on the id
+
+        call.enqueue(object : Callback<AnimeResponse> {
+            override fun onResponse(
+                call: Call<AnimeResponse>,
+                response: Response<AnimeResponse>
+            ) {
+                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 AnimeResponse fields
+                    showDetail(anime!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(anime: AnimeResponse) {
+        //elements from AnimeResponse
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+
+        tvSynopsis.text = anime.synopsis.toString()
+
+        tvRank.text = anime.rank.toString()
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+
+    private fun fieldIsNull(): String {
+        return "Unknown"
+    }
+}
\ No newline at end of file
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
index 7771646..ad7b7eb 100644
--- a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnime.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnime.kt
@@ -28,4 +28,4 @@ class SearchAnime {
     @SerializedName("end_date") //we'll maybe remove this later
     var end_date: String? = null
 
-}
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt
index a3a4a97..78718dd 100644
--- a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt
@@ -1,10 +1,12 @@
 package xyz.adjutor.aniki.anime.search
 
+import android.content.Intent
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.ImageView
 import android.widget.TextView
+import androidx.cardview.widget.CardView
 import androidx.recyclerview.widget.RecyclerView
 import com.bumptech.glide.Glide
 import com.bumptech.glide.request.RequestOptions
@@ -19,7 +21,7 @@ class SearchAnimeAdapter(private val animeList: List<SearchAnime>) :
         val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
         val animeScore: TextView = itemView.findViewById(R.id.tv_score)
         val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
-        //val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
     }
 
     // Returns a new ViewHolder
@@ -39,7 +41,7 @@ class SearchAnimeAdapter(private val animeList: List<SearchAnime>) :
     override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
         val currentAnime: SearchAnime = animeList[position]
         holder.animeTitle.text = currentAnime.title
-        holder.animeRank.text = "" //the rank isnt supplied by this API
+        holder.animeRank.text = "" //the rank isn't supplied by this API
         holder.animeScore.text = currentAnime.score.toString()
         val image: String = currentAnime.image_url.toString()
         Glide
@@ -48,33 +50,32 @@ class SearchAnimeAdapter(private val animeList: List<SearchAnime>) :
             .apply(RequestOptions().override(400))
             .into(holder.animeImage)
 
-        /*
         //when you click on a selected cardview, some datas are sent to the other activity
         holder.cardview.setOnClickListener {
             val currentAnimeId = "theanimeid"
+            val currentAnimeUrl = "theanimeurl"
+            val currentAnimeImageUrl = "theanimeimageurl"
             val currentAnimeTitle = "theanimetitle"
+            val currentAnimeEpisodes = "theanimeepisodes"
             val currentAnimeScore = "theanimescore"
-            val currentAnimeImageUrl = "theanimeimageurl"
-            val currentAnimeVolumes = "theanimevolumes"
             val currentAnimeStartDate = "theanimestartdate"
             val currentAnimeEndDate = "theanimeenddate"
-            val currentAnimeUrl = "theanimeurl"
 
             //intent is used to pass data to another activity
 
             val intent: Intent =
                 Intent(holder.itemView.context, DetailSearchAnimeActivity::class.java).apply {
                     putExtra(currentAnimeId, currentAnime.mal_id.toString())
+                    putExtra(currentAnimeUrl, currentAnime.url.toString())
+                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
                     putExtra(currentAnimeTitle, currentAnime.title)
+                    putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
                     putExtra(currentAnimeScore, currentAnime.score.toString())
-                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
-                    putExtra(currentAnimeVolumes, currentAnime.volumes.toString())
                     putExtra(currentAnimeStartDate, currentAnime.start_date)
                     putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
-                    putExtra(currentAnimeUrl, currentAnime.url.toString())
                 }
             holder.itemView.context.startActivity(intent)
         }
-        */
+
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt
index 53899e2..518a0a6 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt
@@ -31,4 +31,4 @@ class SearchManga {
     @SerializedName("end_date") //we'll maybe remove this later
     var end_date: String? = null
 
-}
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
index 79f8cb3..fb95c9c 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
@@ -50,7 +50,6 @@ class SearchMangaAdapter(private val mangaList: List<SearchManga>) :
             .apply(RequestOptions().override(400))
             .into(holder.mangaImage)
 
-
         //when you click on a selected cardview, some datas are sent to the other activity
         holder.cardview.setOnClickListener {
             val currentMangaId = "themangaid"
diff --git a/app/src/main/res/layout/activity_detail_search_anime.xml b/app/src/main/res/layout/activity_detail_search_anime.xml
new file mode 100644
index 0000000..90f2459
--- /dev/null
+++ b/app/src/main/res/layout/activity_detail_search_anime.xml
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/very_dark_purple">
+
+    <androidx.constraintlayout.widget.ConstraintLayout xmlns:app="http://schemas.android.com/apk/res-auto"
+        xmlns:tools="http://schemas.android.com/tools"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        tools:context=".anime.searchanime.DetailSearchAnimeActivity">
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_header"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:text="@string/text_mal_id"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_id" />
+
+                <TextView
+                    android:id="@+id/tv_detail_id"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/id"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textIsSelectable="true"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/iv_detail_image"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <ImageView
+                    android:id="@+id/iv_detail_image"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:contentDescription="@string/image"
+                    android:src="@mipmap/ic_launcher"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_detail_title"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_marginHorizontal="10sp"
+                    android:fontFamily="@font/bangers"
+                    android:text="@string/title"
+                    android:textAlignment="center"
+                    android:textColor="@color/strong_pink"
+                    android:textIsSelectable="true"
+                    android:textSize="30sp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/iv_detail_image"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_rank"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_detail_rank"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_rank"
+                    app:layout_constraintTop_toTopOf="@id/tv_detail_rank" />
+
+                <TextView
+                    android:id="@+id/tv_detail_rank"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/rank"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textSize="20sp"
+                    app:layout_constraintBottom_toTopOf="@id/tv_detail_title"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_score"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_detail_score"
+                    app:layout_constraintEnd_toStartOf="@id/tv_detail_score"
+                    app:layout_constraintTop_toTopOf="@id/tv_detail_score" />
+
+                <TextView
+                    android:id="@+id/tv_detail_score"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/score"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textSize="20sp"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_detail_title" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_more_infos"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_header">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+                <TextView
+                    android:id="@+id/tv_text_episodes"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_episodes"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_episodes"
+                    app:layout_constraintEnd_toStartOf="@id/tv_episodes"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="@id/tv_episodes" />
+
+                <TextView
+                    android:id="@+id/tv_episodes"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/episodes"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/tv_text_episodes"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_text_start_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_start_date"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_start_date"
+                    app:layout_constraintEnd_toStartOf="@id/tv_start_date"
+                    app:layout_constraintTop_toTopOf="@id/tv_start_date" />
+
+                <TextView
+                    android:id="@+id/tv_start_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/start_date"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_text_end_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_end_date"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintBottom_toBottomOf="@id/tv_end_date"
+                    app:layout_constraintEnd_toStartOf="@id/tv_end_date"
+                    app:layout_constraintTop_toTopOf="@id/tv_end_date" />
+
+                <TextView
+                    android:id="@+id/tv_end_date"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/end_date"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_start_date" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:id="@+id/cv_synopsis"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_more_infos">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+                <TextView
+                    android:id="@+id/tv_text_synopsis"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_synopsis"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_synopsis"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textIsSelectable="true"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_text_synopsis" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+        <androidx.cardview.widget.CardView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="4sp"
+            app:cardBackgroundColor="@color/black"
+            app:layout_constraintTop_toBottomOf="@id/cv_synopsis">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="10dp">
+
+
+                <TextView
+                    android:id="@+id/tv_text_url"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/text_url"
+                    android:textColor="@color/strong_pink"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent" />
+
+                <TextView
+                    android:id="@+id/tv_url"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:autoLink="all"
+                    android:text="@string/url"
+                    android:textColor="@color/slightly_desaturated_magenta"
+                    android:textColorLink="@color/very_light_magenta"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toBottomOf="@id/tv_text_url" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+        </androidx.cardview.widget.CardView>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</ScrollView>
\ No newline at end of file
-- 
cgit v1.2.3


From 1d70485121c604300ae371468f2f3c6fbdca395c Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Sun, 14 Mar 2021 13:09:20 +0100
Subject: Update README.md and colors.xml

---
 README.md                          | 4 ++--
 app/src/main/res/values/colors.xml | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index 3072d2d..49b81f2 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ It consists of colors of the pink/purple "family" :
 very dark purple : #09022A
 very light magenta : #FF70FF
 strong pink : #D52C70
-slightly desaturated magenta : #c583b6
-
+slightly desaturated magenta : #C583B6
+grayish magenta : #C9A6C9
 
 Development done with a Gitflow workflow.
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 1dc4ee9..caca611 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -9,6 +9,6 @@
     <color name="very_dark_purple">#09022A</color>
     <color name="very_light_magenta">#FF70FF</color>
     <color name="strong_pink">#D52C70</color>
-    <color name="slightly_desaturated_magenta">#c583b6</color>
-    <color name="grayish_magenta">#c9a6c9</color>
+    <color name="slightly_desaturated_magenta">#C583B6</color>
+    <color name="grayish_magenta">#C9A6C9</color>
 </resources>
\ No newline at end of file
-- 
cgit v1.2.3


From 249cdf3a91eab6be7e4f23ae146b1fb91caf6ed4 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Sun, 14 Mar 2021 13:46:21 +0100
Subject: Removed lorem placeholder.

---
 app/src/main/res/layout/activity_detail_top_anime.xml | 1 -
 app/src/main/res/layout/activity_detail_top_manga.xml | 2 --
 2 files changed, 3 deletions(-)

diff --git a/app/src/main/res/layout/activity_detail_top_anime.xml b/app/src/main/res/layout/activity_detail_top_anime.xml
index cd7bb59..c9f5316 100644
--- a/app/src/main/res/layout/activity_detail_top_anime.xml
+++ b/app/src/main/res/layout/activity_detail_top_anime.xml
@@ -211,7 +211,6 @@
                     android:id="@+id/tv_synopsis"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="@string/synopsis"
                     android:textColor="@color/slightly_desaturated_magenta"
                     android:textIsSelectable="true"
                     app:layout_constraintStart_toStartOf="parent"
diff --git a/app/src/main/res/layout/activity_detail_top_manga.xml b/app/src/main/res/layout/activity_detail_top_manga.xml
index 3f703b6..2e29c0e 100644
--- a/app/src/main/res/layout/activity_detail_top_manga.xml
+++ b/app/src/main/res/layout/activity_detail_top_manga.xml
@@ -230,7 +230,6 @@
                     android:id="@+id/tv_synopsis"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="@string/synopsis"
                     android:textColor="@color/slightly_desaturated_magenta"
                     android:textIsSelectable="true"
                     app:layout_constraintStart_toStartOf="parent"
@@ -266,7 +265,6 @@
                     android:id="@+id/tv_background"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="@string/background"
                     android:textColor="@color/slightly_desaturated_magenta"
                     android:textIsSelectable="true"
                     app:layout_constraintStart_toStartOf="parent"
-- 
cgit v1.2.3


From 9159505004b7d55964653747decd313bcdd6a801 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 23 Mar 2021 09:09:40 +0100
Subject: Manga : Added a search button replacing return on the keyboard.

---
 README.md                                          | 25 ++++++++++----------
 .../adjutor/aniki/manga/search/SearchMangaPage.kt  | 27 ++++++++++++++++++++--
 app/src/main/res/layout/search_manga_page.xml      |  2 ++
 3 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/README.md b/README.md
index 49b81f2..fc717f0 100644
--- a/README.md
+++ b/README.md
@@ -8,26 +8,27 @@ URL link openable.
 Search pages for animes and mangas.
 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.
 
 Multiple calls of the REST API from jikan.moe.
 Usage of :
-/v3/top/manga
-/v3/top/anime
-/v3/manga
-/v3/anime
-/v3/search/manga
-/v3/search/anime
++ /v3/top/manga
++ /v3/top/anime
++ /v3/manga
++ /v3/anime
++ /v3/search/manga
++ /v3/search/anime
 
 Data storage with sharedpreferences used for the recycler view of top manga and top anime as well as the details
 Saves the detail page of an item when opened, not when the list is shown
 Usage of ScrollView in the detail page. Thus, items with long synopsis and background aren't cut down.
 
 Used my "personal" theme colors for the app.
-It consists of colors of the pink/purple "family" :
-very dark purple : #09022A
-very light magenta : #FF70FF
-strong pink : #D52C70
-slightly desaturated magenta : #C583B6
-grayish magenta : #C9A6C9
+It consists of some colors of the pink/purple "family" :
++ very dark purple : #09022A
++ very light magenta : #FF70FF
++ strong pink : #D52C70
++ slightly desaturated magenta : #C583B6
++ grayish magenta : #C9A6C9
 
 Development done with a Gitflow workflow.
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
index f79db36..7866151 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
@@ -5,8 +5,11 @@ 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.EditText
+import android.widget.TextView.OnEditorActionListener
 import androidx.fragment.app.Fragment
 import androidx.navigation.fragment.findNavController
 import androidx.recyclerview.widget.LinearLayoutManager
@@ -23,6 +26,7 @@ import retrofit2.converter.gson.GsonConverterFactory
 import xyz.adjutor.aniki.MainActivity
 import xyz.adjutor.aniki.R
 
+
 class SearchMangaPage : Fragment() {
 
     val gson: Gson = GsonBuilder()
@@ -48,11 +52,24 @@ class SearchMangaPage : Fragment() {
             findNavController().navigate(R.id.action_SearchMangaPage_to_HomePage)
         }
 
-        view.findViewById<Button>(R.id.button_query).setOnClickListener{
+        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<EditText>(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() {
@@ -75,6 +92,7 @@ class SearchMangaPage : Fragment() {
         (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()
@@ -112,8 +130,13 @@ class SearchMangaPage : Fragment() {
         })
     }
 
+    //display a snack
     private fun showError() {
-        Snackbar.make(requireView(), "API ERROR : Verify your internet connection or your query.", Snackbar.LENGTH_LONG)
+        Snackbar.make(
+            requireView(),
+            "API ERROR : Verify your internet connection or your query.",
+            Snackbar.LENGTH_LONG
+        )
             .setAction("Action", null).show()
     }
 
diff --git a/app/src/main/res/layout/search_manga_page.xml b/app/src/main/res/layout/search_manga_page.xml
index 02a62ff..cacab1d 100644
--- a/app/src/main/res/layout/search_manga_page.xml
+++ b/app/src/main/res/layout/search_manga_page.xml
@@ -18,6 +18,8 @@
         app:layout_constraintBottom_toTopOf="@id/recycler_view"
         app:layout_constraintEnd_toStartOf="@id/button_query"
         app:layout_constraintStart_toStartOf="parent"
+        android:imeOptions="actionSearch"
+        android:inputType="text"
         app:layout_constraintTop_toTopOf="parent" />
 
     <Button
-- 
cgit v1.2.3


From 05f18472ff345cf185eb55812c92455aab3f592c Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 23 Mar 2021 09:21:12 +0100
Subject: Anime : Added a search button replacing return on the keyboard. Minor
 changes on other fils.

---
 .../xyz/adjutor/aniki/anime/search/SearchAnimePage.kt   | 17 ++++++++++++++++-
 .../xyz/adjutor/aniki/manga/search/SearchMangaPage.kt   |  3 +--
 app/src/main/res/layout/search_anime_page.xml           |  2 ++
 3 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt
index c1596c3..b624069 100644
--- a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt
@@ -5,8 +5,10 @@ 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
 import androidx.fragment.app.Fragment
 import androidx.navigation.fragment.findNavController
 import androidx.recyclerview.widget.LinearLayoutManager
@@ -48,11 +50,24 @@ class SearchAnimePage : Fragment() {
             findNavController().navigate(R.id.action_SearchAnimePage_to_HomePage)
         }
 
-        view.findViewById<Button>(R.id.button_query).setOnClickListener{
+        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(TextView.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() {
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
index 7866151..d236887 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
@@ -8,7 +8,6 @@ import android.view.ViewGroup
 import android.view.inputmethod.EditorInfo
 import android.view.inputmethod.InputMethodManager
 import android.widget.Button
-import android.widget.EditText
 import android.widget.TextView.OnEditorActionListener
 import androidx.fragment.app.Fragment
 import androidx.navigation.fragment.findNavController
@@ -58,7 +57,7 @@ class SearchMangaPage : Fragment() {
             makeApiCall(view, baseUrl, userInput)
         }
 
-        view.findViewById<EditText>(R.id.tiet_query)
+        view.findViewById<TextInputEditText>(R.id.tiet_query)
             .setOnEditorActionListener(OnEditorActionListener { v, actionId, event ->
                 if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                     val userInput =
diff --git a/app/src/main/res/layout/search_anime_page.xml b/app/src/main/res/layout/search_anime_page.xml
index 631ebde..f91c1d9 100644
--- a/app/src/main/res/layout/search_anime_page.xml
+++ b/app/src/main/res/layout/search_anime_page.xml
@@ -18,6 +18,8 @@
         app:layout_constraintBottom_toTopOf="@id/recycler_view"
         app:layout_constraintEnd_toStartOf="@id/button_query"
         app:layout_constraintStart_toStartOf="parent"
+        android:imeOptions="actionSearch"
+        android:inputType="text"
         app:layout_constraintTop_toTopOf="parent" />
 
     <Button
-- 
cgit v1.2.3


From 8b80019ef99517c3ff9647b0dd81d86bb09b207a Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 23 Mar 2021 09:25:17 +0100
Subject: Update README.md

---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index fc717f0..ad56981 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,7 @@ Search pages for animes and mangas.
 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.
 
 Multiple calls of the REST API from jikan.moe.
 Usage of :
-- 
cgit v1.2.3


From d283df0f70241bb6b54bee66e8fb9564b0051376 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 23 Mar 2021 10:38:03 +0100
Subject: Feature added to mangas Display other pages by touching the bottom or
 by clicking buttons

---
 README.md                                          |  4 +-
 .../adjutor/aniki/manga/topmanga/TopMangaApi.kt    |  5 ++-
 .../adjutor/aniki/manga/topmanga/TopMangaPage.kt   | 48 ++++++++++++++++++++--
 app/src/main/res/layout/top_manga_page.xml         | 16 ++++++++
 app/src/main/res/values/strings.xml                |  2 +
 5 files changed, 68 insertions(+), 7 deletions(-)

diff --git a/README.md b/README.md
index ad56981..24ea18c 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 List of elements used in top manga and top anime with a recycler view
-SwipeRefresh used to refresh the list of data.
+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.
 
 Details of a chosen element from the recycler view with an intent object
 Title, synopsys and background clickable.
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
index 629fe02..2688fab 100644
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
@@ -2,10 +2,11 @@ package xyz.adjutor.aniki.manga.topmanga
 
 import retrofit2.Call
 import retrofit2.http.GET
+import retrofit2.http.Path
 
 interface TopMangaApi {
 
-    @GET("v3/top/manga")
-    fun getTopMangaData(): Call<TopMangaResponse>
+    @GET("v3/top/manga/{page}")
+    fun getTopMangaData(@Path("page") page: Int): Call<TopMangaResponse>
 
 }
\ No newline at end of file
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 b35bcdd..ea240b9 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,6 +24,7 @@ import retrofit2.converter.gson.GsonConverterFactory
 import xyz.adjutor.aniki.R
 import java.lang.reflect.Type
 
+
 class TopMangaPage : Fragment() {
 
     private lateinit var sharedPreferences: SharedPreferences
@@ -31,6 +32,7 @@ class TopMangaPage : Fragment() {
         .setLenient()
         .create()
     private var baseUrl = "https://api.jikan.moe/" //the api's base url
+    var page: Int = 1
 
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
@@ -45,10 +47,29 @@ class TopMangaPage : Fragment() {
         if (mangaList != null) {
             showList(view, mangaList)
         } else {
-            makeApiCall(view, baseUrl)
+            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
+
     }
 
     private fun getDataFromCache(): List<TopManga>? {
@@ -71,16 +92,35 @@ class TopMangaPage : Fragment() {
         view.findViewById<Button>(R.id.button_home).setOnClickListener {
             findNavController().navigate(R.id.action_TopMangaPage_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_LONG)
+                    .setAction("Action", null).show()
+            } else {
+                Snackbar.make(requireView(), "You're already page 1.", Snackbar.LENGTH_LONG)
+                    .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)
+                .setAction("Action", null).show()
+        }
 
         fun updateList() {
-            makeApiCall(view, baseUrl)
+            makeApiCall(view, baseUrl, 1)
             Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_LONG)
                 .setAction("Action", null).show()
         }
 
+        //refresh when swiping down at the top of the page
         val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
         swipeRefresh.setOnRefreshListener {
             updateList()
+            page = 1
             swipeRefresh.isRefreshing = false
         }
 
@@ -95,7 +135,7 @@ class TopMangaPage : Fragment() {
         (recyclerView.adapter as TopMangaAdapter).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 +143,7 @@ class TopMangaPage : Fragment() {
             .build()
 
         val service = retrofit.create(TopMangaApi::class.java)
-        val call = service.getTopMangaData()
+        val call = service.getTopMangaData(page)
 
         call.enqueue(object : Callback<TopMangaResponse> {
             override fun onResponse(
diff --git a/app/src/main/res/layout/top_manga_page.xml b/app/src/main/res/layout/top_manga_page.xml
index f3d0db3..2f4a9f1 100644
--- a/app/src/main/res/layout/top_manga_page.xml
+++ b/app/src/main/res/layout/top_manga_page.xml
@@ -24,6 +24,14 @@
             tools:listitem="@layout/item_layout" />
     </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"
@@ -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
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0c56edc..861a440 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -42,5 +42,7 @@
     <string name="search_anime">Search Anime</string>
     <string name="search_anime_page_label">Search Anime Page</string>
     <string name="hint_query">Your query …</string>
+    <string name="prev">PREV</string>
+    <string name="next">NEXT</string>
 
 </resources>
\ No newline at end of file
-- 
cgit v1.2.3


From bd885788c79cfa37bb2ff02faf4ae2516b87b5dd Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 23 Mar 2021 10:54:41 +0100
Subject: Feature added to animes. Removed the ScrollListener, I prefer to only
 use buttons for the feature.

---
 README.md                                          |  4 +--
 .../adjutor/aniki/anime/topanime/TopAnimeApi.kt    |  5 +--
 .../adjutor/aniki/anime/topanime/TopAnimePage.kt   | 36 ++++++++++++++++++----
 .../adjutor/aniki/manga/topmanga/TopMangaPage.kt   | 33 ++++++--------------
 app/src/main/res/layout/top_anime_page.xml         | 16 ++++++++++
 5 files changed, 60 insertions(+), 34 deletions(-)

diff --git a/README.md b/README.md
index 24ea18c..a1f6dcf 100644
--- a/README.md
+++ b/README.md
@@ -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
@@ -24,6 +24,14 @@
             tools:listitem="@layout/item_layout" />
     </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"
@@ -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
-- 
cgit v1.2.3


From ac929460d07e0d0ef8c6b4ea569a2b2c6daa3b13 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 23 Mar 2021 11:47:53 +0100
Subject: Refactoring into MVC

---
 app/build.gradle                                   |   4 +-
 app/src/main/AndroidManifest.xml                   |  10 +-
 app/src/main/java/xyz/adjutor/aniki/HomePage.kt    |  37 ----
 .../main/java/xyz/adjutor/aniki/MainActivity.kt    |  13 --
 .../main/java/xyz/adjutor/aniki/anime/AnimeApi.kt  |  12 --
 .../java/xyz/adjutor/aniki/anime/AnimeResponse.kt  |  16 --
 .../anime/search/DetailSearchAnimeActivity.kt      | 156 -----------------
 .../xyz/adjutor/aniki/anime/search/SearchAnime.kt  |  31 ----
 .../aniki/anime/search/SearchAnimeAdapter.kt       |  81 ---------
 .../adjutor/aniki/anime/search/SearchAnimeApi.kt   |  12 --
 .../adjutor/aniki/anime/search/SearchAnimePage.kt  | 134 --------------
 .../aniki/anime/search/SearchAnimeResponse.kt      |  13 --
 .../aniki/anime/topanime/DetailTopAnimeActivity.kt | 176 -------------------
 .../xyz/adjutor/aniki/anime/topanime/TopAnime.kt   |  35 ----
 .../aniki/anime/topanime/TopAnimeAdapter.kt        |  80 ---------
 .../adjutor/aniki/anime/topanime/TopAnimeApi.kt    |  12 --
 .../adjutor/aniki/anime/topanime/TopAnimePage.kt   | 173 ------------------
 .../aniki/anime/topanime/TopAnimeResponse.kt       |  13 --
 .../main/java/xyz/adjutor/aniki/data/AnimeApi.kt   |  13 ++
 .../main/java/xyz/adjutor/aniki/data/MangaApi.kt   |  13 ++
 .../java/xyz/adjutor/aniki/data/SearchAnimeApi.kt  |  13 ++
 .../java/xyz/adjutor/aniki/data/SearchMangaApi.kt  |  13 ++
 .../java/xyz/adjutor/aniki/data/TopAnimeApi.kt     |  13 ++
 .../java/xyz/adjutor/aniki/data/TopMangaApi.kt     |  13 ++
 .../main/java/xyz/adjutor/aniki/manga/MangaApi.kt  |  12 --
 .../java/xyz/adjutor/aniki/manga/MangaResponse.kt  |  22 ---
 .../manga/search/DetailSearchMangaActivity.kt      | 169 ------------------
 .../xyz/adjutor/aniki/manga/search/SearchManga.kt  |  34 ----
 .../aniki/manga/search/SearchMangaAdapter.kt       |  83 ---------
 .../adjutor/aniki/manga/search/SearchMangaApi.kt   |  12 --
 .../adjutor/aniki/manga/search/SearchMangaPage.kt  | 142 ---------------
 .../aniki/manga/search/SearchMangaResponse.kt      |  13 --
 .../aniki/manga/topmanga/DetailTopMangaActivity.kt | 193 ---------------------
 .../xyz/adjutor/aniki/manga/topmanga/TopManga.kt   |  35 ----
 .../aniki/manga/topmanga/TopMangaAdapter.kt        |  81 ---------
 .../adjutor/aniki/manga/topmanga/TopMangaApi.kt    |  12 --
 .../adjutor/aniki/manga/topmanga/TopMangaPage.kt   | 174 -------------------
 .../aniki/manga/topmanga/TopMangaResponse.kt       |  13 --
 .../aniki/presentation/model/AnimeResponse.kt      |  16 ++
 .../aniki/presentation/model/MangaResponse.kt      |  22 +++
 .../aniki/presentation/model/SearchAnime.kt        |  31 ++++
 .../presentation/model/SearchAnimeResponse.kt      |  13 ++
 .../aniki/presentation/model/SearchManga.kt        |  34 ++++
 .../presentation/model/SearchMangaResponse.kt      |  13 ++
 .../adjutor/aniki/presentation/model/TopAnime.kt   |  35 ++++
 .../aniki/presentation/model/TopAnimeResponse.kt   |  13 ++
 .../adjutor/aniki/presentation/model/TopManga.kt   |  35 ++++
 .../aniki/presentation/model/TopMangaResponse.kt   |  13 ++
 .../presentation/view/DetailSearchAnimeActivity.kt | 156 +++++++++++++++++
 .../presentation/view/DetailSearchMangaActivity.kt | 169 ++++++++++++++++++
 .../presentation/view/DetailTopAnimeActivity.kt    | 176 +++++++++++++++++++
 .../presentation/view/DetailTopMangaActivity.kt    | 193 +++++++++++++++++++++
 .../adjutor/aniki/presentation/view/HomePage.kt    |  38 ++++
 .../aniki/presentation/view/MainActivity.kt        |  14 ++
 .../aniki/presentation/view/SearchAnimeAdapter.kt  |  82 +++++++++
 .../aniki/presentation/view/SearchAnimePage.kt     | 136 +++++++++++++++
 .../aniki/presentation/view/SearchMangaAdapter.kt  |  84 +++++++++
 .../aniki/presentation/view/SearchMangaPage.kt     | 144 +++++++++++++++
 .../aniki/presentation/view/TopAnimeAdapter.kt     |  81 +++++++++
 .../aniki/presentation/view/TopAnimePage.kt        | 176 +++++++++++++++++++
 .../aniki/presentation/view/TopMangaAdapter.kt     |  82 +++++++++
 .../aniki/presentation/view/TopMangaPage.kt        | 177 +++++++++++++++++++
 .../main/res/layout/activity_detail_top_anime.xml  |   2 +-
 .../main/res/layout/activity_detail_top_manga.xml  |   2 +-
 app/src/main/res/layout/activity_main.xml          |   2 +-
 app/src/main/res/layout/home_page.xml              |   2 +-
 app/src/main/res/layout/search_anime_page.xml      |   2 +-
 app/src/main/res/layout/search_manga_page.xml      |   2 +-
 app/src/main/res/layout/top_anime_page.xml         |   2 +-
 app/src/main/res/layout/top_manga_page.xml         |   2 +-
 app/src/main/res/navigation/nav_graph.xml          |  10 +-
 build.gradle                                       |   2 +-
 72 files changed, 2032 insertions(+), 2010 deletions(-)
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/HomePage.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/MainActivity.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/AnimeApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/AnimeResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/search/DetailSearchAnimeActivity.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnime.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt
 delete 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/DetailTopAnimeActivity.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnime.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimePage.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/AnimeApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/MangaApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/SearchAnimeApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/SearchMangaApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/TopAnimeApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/TopMangaApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/MangaApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/DetailSearchMangaActivity.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/AnimeResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/MangaResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnime.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnimeResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchManga.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchMangaResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnime.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnimeResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/TopManga.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/TopMangaResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchAnimeActivity.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchMangaActivity.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopAnimeActivity.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopMangaActivity.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/MainActivity.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimeAdapter.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimePage.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaAdapter.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaPage.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimeAdapter.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimePage.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaAdapter.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaPage.kt

diff --git a/app/build.gradle b/app/build.gradle
index 0251555..d28b3c6 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -40,8 +40,8 @@ dependencies {
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
-    implementation 'androidx.navigation:navigation-fragment-ktx:2.3.3'
-    implementation 'androidx.navigation:navigation-ui-ktx:2.3.3'
+    implementation 'androidx.navigation:navigation-fragment-ktx:2.3.4'
+    implementation 'androidx.navigation:navigation-ui-ktx:2.3.4'
     testImplementation 'junit:junit:4.13.2'
     androidTestImplementation 'androidx.test.ext:junit:1.1.2'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4de763c..93413a4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,23 +14,23 @@
         android:theme="@style/Theme.Aniki"
         tools:ignore="AllowBackup">
         <activity
-            android:name="xyz.adjutor.aniki.manga.topmanga.DetailTopMangaActivity"
+            android:name="xyz.adjutor.aniki.presentation.view.DetailTopMangaActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
         <activity
-            android:name="xyz.adjutor.aniki.anime.topanime.DetailTopAnimeActivity"
+            android:name="xyz.adjutor.aniki.presentation.view.DetailTopAnimeActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
         <activity
-            android:name="xyz.adjutor.aniki.manga.search.DetailSearchMangaActivity"
+            android:name="xyz.adjutor.aniki.presentation.view.DetailSearchMangaActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
         <activity
-            android:name="xyz.adjutor.aniki.anime.search.DetailSearchAnimeActivity"
+            android:name="xyz.adjutor.aniki.presentation.view.DetailSearchAnimeActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
         <activity
-            android:name=".MainActivity"
+            android:name=".presentation.view.MainActivity"
             android:label="@string/app_name"
             android:theme="@style/Theme.Aniki.NoActionBar">
             <intent-filter>
diff --git a/app/src/main/java/xyz/adjutor/aniki/HomePage.kt b/app/src/main/java/xyz/adjutor/aniki/HomePage.kt
deleted file mode 100644
index 46dac33..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/HomePage.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-package xyz.adjutor.aniki
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.findNavController
-
-class HomePage : Fragment() {
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View? {
-        // Inflate the layout for this fragment
-        return inflater.inflate(R.layout.home_page, container, false)
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-
-        view.findViewById<Button>(R.id.button_top_manga).setOnClickListener {
-            findNavController().navigate(R.id.action_HomePage_to_TopMangaPage)
-        }
-        view.findViewById<Button>(R.id.button_top_anime).setOnClickListener {
-            findNavController().navigate(R.id.action_HomePage_to_TopAnimePage)
-        }
-        view.findViewById<Button>(R.id.button_search_manga).setOnClickListener {
-            findNavController().navigate(R.id.action_HomePage_to_SearchMangaPage)
-        }
-        view.findViewById<Button>(R.id.button_search_anime).setOnClickListener {
-            findNavController().navigate(R.id.action_HomePage_to_SearchAnimePage)
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/MainActivity.kt b/app/src/main/java/xyz/adjutor/aniki/MainActivity.kt
deleted file mode 100644
index ddc054f..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/MainActivity.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki
-
-import android.os.Bundle
-import androidx.appcompat.app.AppCompatActivity
-
-class MainActivity : AppCompatActivity() {
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_main)
-        setSupportActionBar(findViewById(R.id.toolbar))
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/AnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/anime/AnimeApi.kt
deleted file mode 100644
index 52ca2ba..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/AnimeApi.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package xyz.adjutor.aniki.anime
-
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Path
-
-interface AnimeApi {
-
-    @GET("v3/anime/{id}")
-    fun getAnimeData(@Path("id") id: String): Call<AnimeResponse>
-
-}
\ 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
deleted file mode 100644
index 9e279e1..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/AnimeResponse.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-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("rank")
-    var rank: Int? = null //added for the search feature (detail)
-
-    @SerializedName("synopsis")
-    var synopsis: String? = null
-
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/search/DetailSearchAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/anime/search/DetailSearchAnimeActivity.kt
deleted file mode 100644
index 2f4a6c2..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/search/DetailSearchAnimeActivity.kt
+++ /dev/null
@@ -1,156 +0,0 @@
-package xyz.adjutor.aniki.anime.search
-
-import android.os.Bundle
-import android.widget.ImageView
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-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.anime.AnimeApi
-import xyz.adjutor.aniki.anime.AnimeResponse
-
-class DetailSearchAnimeActivity : AppCompatActivity() {
-
-    private var baseUrl = "https://api.jikan.moe/"
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    //used in the list
-    private val intentAnimeImageUrl = "theanimeimageurl"
-    private val intentAnimeTitle = "theanimetitle"
-    private val intentAnimeScore = "theanimescore"
-
-    //only used for the detail
-    private val intentAnimeId = "theanimeid"
-    private val intentAnimeUrl = "theanimeurl"
-    private val intentAnimeEpisodes = "theanimeepisodes"
-    private val intentAnimeStartDate = "theanimestartdate"
-    private val intentAnimeEndDate = "theanimeenddate"
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_detail_search_anime)
-
-        val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
-        val animeTitle = intent.getStringExtra(intentAnimeTitle)
-        val animeScore = intent.getStringExtra(intentAnimeScore)
-
-        val animeId = intent.getStringExtra(intentAnimeId)
-        val animeUrl = intent.getStringExtra(intentAnimeUrl)
-        val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes)
-        val animeStartDate = intent.getStringExtra(intentAnimeStartDate)
-        val animeEndDate = intent.getStringExtra(intentAnimeEndDate)
-
-
-        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
-        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
-        val tvScore: TextView = findViewById(R.id.tv_detail_score)
-
-        val tvId: TextView = findViewById(R.id.tv_detail_id)
-        val tvUrl: TextView = findViewById(R.id.tv_url)
-        val tvEpisodes: TextView = findViewById(R.id.tv_episodes)
-        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
-        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
-
-        Glide
-            .with(this)
-            .load(animeImageUrl)
-            .apply(RequestOptions().override(400))
-            .into(ivImage)
-        tvTitle.text = animeTitle
-        tvScore.text = animeScore
-
-
-        tvId.text = animeId
-        tvUrl.text = animeUrl
-
-        //using null as a string because it has been converted to a string before
-        tvEpisodes.text = if (animeEpisodes != "null") {
-            animeEpisodes
-        } else {
-            fieldIsNull()
-        }
-
-        tvStartDate.text = splitDate(animeStartDate!!)
-
-        tvEndDate.text = if (animeEndDate != "null") {
-            splitDate(animeEndDate!!)
-        } else {
-            fieldIsNull()
-        }
-
-        makeApiCall(baseUrl, animeId.toString())
-
-    }
-
-    private fun splitDate(animeDate: String): CharSequence {
-        val delimiter = "T"
-        return animeDate
-            .split(delimiter) //split between the date and the time
-            .toTypedArray()[0] //convert it to an array and take the first string
-
-    }
-
-    private fun makeApiCall(
-        BASE_URL: String,
-        animeId: String
-    ) { //we take the rest of the data that we need from the internet
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(AnimeApi::class.java)
-        val call = service.getAnimeData(animeId) //based on the id
-
-        call.enqueue(object : Callback<AnimeResponse> {
-            override fun onResponse(
-                call: Call<AnimeResponse>,
-                response: Response<AnimeResponse>
-            ) {
-                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 AnimeResponse fields
-                    showDetail(anime!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(anime: AnimeResponse) {
-        //elements from AnimeResponse
-        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
-        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-
-        tvSynopsis.text = anime.synopsis.toString()
-
-        tvRank.text = anime.rank.toString()
-
-    }
-
-    fun showError(text: String) {
-        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
-    }
-
-    private fun fieldIsNull(): String {
-        return "Unknown"
-    }
-}
\ No newline at end of file
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
deleted file mode 100644
index ad7b7eb..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnime.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-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
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt
deleted file mode 100644
index 78718dd..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeAdapter.kt
+++ /dev/null
@@ -1,81 +0,0 @@
-package xyz.adjutor.aniki.anime.search
-
-import android.content.Intent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.cardview.widget.CardView
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import xyz.adjutor.aniki.R
-
-class SearchAnimeAdapter(private val animeList: List<SearchAnime>) :
-    RecyclerView.Adapter<SearchAnimeAdapter.AnimeViewHolder>() {
-
-    // Describes an item view and its place within the RecyclerView
-    class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val animeTitle: TextView = itemView.findViewById(R.id.tv_title)
-        val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
-        val animeScore: TextView = itemView.findViewById(R.id.tv_score)
-        val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
-        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
-    }
-
-    // Returns a new ViewHolder
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
-        val view = LayoutInflater.from(parent.context)
-            .inflate(R.layout.item_layout, parent, false)
-
-        return AnimeViewHolder(view)
-    }
-
-    // Returns size of data list
-    override fun getItemCount(): Int {
-        return animeList.size
-    }
-
-    // Displays data at a certain position
-    override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
-        val currentAnime: SearchAnime = animeList[position]
-        holder.animeTitle.text = currentAnime.title
-        holder.animeRank.text = "" //the rank isn't supplied by this API
-        holder.animeScore.text = currentAnime.score.toString()
-        val image: String = currentAnime.image_url.toString()
-        Glide
-            .with(holder.itemView.context)
-            .load(image)
-            .apply(RequestOptions().override(400))
-            .into(holder.animeImage)
-
-        //when you click on a selected cardview, some datas are sent to the other activity
-        holder.cardview.setOnClickListener {
-            val currentAnimeId = "theanimeid"
-            val currentAnimeUrl = "theanimeurl"
-            val currentAnimeImageUrl = "theanimeimageurl"
-            val currentAnimeTitle = "theanimetitle"
-            val currentAnimeEpisodes = "theanimeepisodes"
-            val currentAnimeScore = "theanimescore"
-            val currentAnimeStartDate = "theanimestartdate"
-            val currentAnimeEndDate = "theanimeenddate"
-
-            //intent is used to pass data to another activity
-
-            val intent: Intent =
-                Intent(holder.itemView.context, DetailSearchAnimeActivity::class.java).apply {
-                    putExtra(currentAnimeId, currentAnime.mal_id.toString())
-                    putExtra(currentAnimeUrl, currentAnime.url.toString())
-                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
-                    putExtra(currentAnimeTitle, currentAnime.title)
-                    putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
-                    putExtra(currentAnimeScore, currentAnime.score.toString())
-                    putExtra(currentAnimeStartDate, currentAnime.start_date)
-                    putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
-                }
-            holder.itemView.context.startActivity(intent)
-        }
-
-    }
-}
\ No newline at end of file
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
deleted file mode 100644
index 5512636..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeApi.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-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<SearchAnimeResponse>
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt
deleted file mode 100644
index b624069..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimePage.kt
+++ /dev/null
@@ -1,134 +0,0 @@
-package xyz.adjutor.aniki.anime.search
-
-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
-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.MainActivity
-import xyz.adjutor.aniki.R
-
-class SearchAnimePage : 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_anime_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_SearchAnimePage_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(TextView.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, animeList: List<SearchAnime>) {
-        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
-        recyclerView.setHasFixedSize(true)
-        recyclerView.layoutManager = LinearLayoutManager(view.context)
-        recyclerView.adapter = SearchAnimeAdapter(animeList)
-        (recyclerView.adapter as SearchAnimeAdapter).notifyDataSetChanged()
-    }
-
-    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(SearchAnimeApi::class.java)
-        val call = service.getSearchAnimeData(q = query) //fate is an exemple, we'll have to replace it by the user input.
-
-        call.enqueue(object : Callback<SearchAnimeResponse> {
-            override fun onResponse(
-                call: Call<SearchAnimeResponse>,
-                response: Response<SearchAnimeResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val animeList: List<SearchAnime> = response.body()!!
-                        .getResults() //getting the "search" field containing our list of SearchAnimes
-
-                    showList(
-                        view,
-                        animeList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<SearchAnimeResponse>, t: Throwable) {
-                showError()
-            }
-
-        })
-    }
-
-    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
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
deleted file mode 100644
index 92100ba..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/search/SearchAnimeResponse.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-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<SearchAnime>
-
-    fun getResults(): List<SearchAnime> {
-        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
deleted file mode 100644
index 661937f..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/DetailTopAnimeActivity.kt
+++ /dev/null
@@ -1,176 +0,0 @@
-package xyz.adjutor.aniki.anime.topanime
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.widget.ImageView
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import com.google.gson.GsonBuilder
-import com.google.gson.reflect.TypeToken
-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.anime.AnimeApi
-import xyz.adjutor.aniki.anime.AnimeResponse
-import java.lang.reflect.Type
-
-class DetailTopAnimeActivity : AppCompatActivity() {
-
-    private var baseUrl = "https://api.jikan.moe/"
-    private lateinit var sharedPreferences: SharedPreferences
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    private val intentAnimeId = "theanimeid"
-    private val intentAnimeTitle = "theanimetitle"
-    private val intentAnimeRank = "theanimerank"
-    private val intentAnimeScore = "theanimescore"
-    private val intentAnimeImageUrl = "theanimeimageurl"
-
-    private val intentAnimeEpisodes = "theanimeepisodes"
-    private val intentAnimeStartDate = "theanimestartdate"
-    private val intentAnimeEndDate = "theanimeenddate"
-    private val intentAnimeUrl = "theanimeurl"
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_detail_top_anime)
-
-        sharedPreferences = this.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
-
-        val animeId = intent.getStringExtra(intentAnimeId)
-        val animeTitle = intent.getStringExtra(intentAnimeTitle)
-        val animeRank = intent.getStringExtra(intentAnimeRank)
-        val animeScore = intent.getStringExtra(intentAnimeScore)
-        val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
-
-        val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes)
-        val animeStartDate = intent.getStringExtra(intentAnimeStartDate)
-        val animeEndDate = intent.getStringExtra(intentAnimeEndDate)
-        val animeUrl = intent.getStringExtra(intentAnimeUrl)
-
-        val tvId: TextView = findViewById(R.id.tv_detail_id)
-        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
-        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-        val tvScore: TextView = findViewById(R.id.tv_detail_score)
-        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
-
-        val tvEpisodes: TextView = findViewById(R.id.tv_episodes)
-        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
-        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
-        val tvUrl: TextView = findViewById(R.id.tv_url)
-
-        tvId.text = animeId
-        tvTitle.text = animeTitle
-        tvRank.text = animeRank
-        tvScore.text = animeScore
-        Glide
-            .with(this)
-            .load(animeImageUrl)
-            .apply(RequestOptions().override(400))
-            .into(ivImage)
-
-        //using null as a string because it has been converted to a string before
-        tvEpisodes.text = if (animeEpisodes != "null") {
-            animeEpisodes
-        } else {
-            fieldIsNull()
-        }
-
-        tvStartDate.text = animeStartDate
-
-        tvEndDate.text = if (animeEndDate != "null") {
-            animeEndDate
-        } else {
-            fieldIsNull()
-        }
-
-        tvUrl.text = animeUrl
-
-        val anime: AnimeResponse? = getDataFromCache(animeId.toString())
-        if (anime != null) {
-            showDetail(anime)
-        } else {
-            //taking the API's fields I want and displaying them
-            makeApiCall(baseUrl, animeId.toString())
-        }
-
-    }
-
-    private fun getDataFromCache(animeId: String): AnimeResponse? {
-        val jsonAnime: String? = sharedPreferences.getString(animeId, null)
-
-        return if (jsonAnime == null) {
-            null
-        } else {
-            val type: Type = object : TypeToken<AnimeResponse>() {}.type
-            gson.fromJson(jsonAnime, type)
-        }
-    }
-
-    private fun makeApiCall(BASE_URL: String, animeId: String) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(AnimeApi::class.java)
-        val call = service.getAnimeData(animeId) //based on the id
-
-        call.enqueue(object : Callback<AnimeResponse> {
-            override fun onResponse(
-                call: Call<AnimeResponse>,
-                response: Response<AnimeResponse>
-            ) {
-                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 AnimeResponse fields
-                    saveList(anime)
-                    showDetail(anime!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(anime: AnimeResponse) {
-        //elements from AnimeResponse
-        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
-
-        tvSynopsis.text = anime.synopsis.toString()
-
-    }
-
-    fun showError(text: String) {
-        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
-    }
-
-    private fun fieldIsNull(): String {
-        return "Unknown"
-    }
-
-    fun saveList(anime: AnimeResponse?) {
-        val jsonString: String = gson.toJson(anime)
-
-        sharedPreferences
-            .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/TopAnime.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnime.kt
deleted file mode 100644
index 5202227..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnime.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-package xyz.adjutor.aniki.anime.topanime
-
-import com.google.gson.annotations.SerializedName
-
-//Content of the top field from the api of top anime
-class TopAnime {
-
-    @SerializedName("mal_id")
-    var mal_id: Int? = null
-
-    @SerializedName("rank")
-    var rank: Int? = null
-
-    @SerializedName("title")
-    var title: String? = null
-
-    @SerializedName("url")
-    var url: String? = null
-
-    @SerializedName("episodes")
-    var episodes: Int? = null
-
-    @SerializedName("start_date")
-    var start_date: String? = null
-
-    @SerializedName("end_date")
-    var end_date: String? = null
-
-    @SerializedName("score")
-    var score: Float? = null
-
-    @SerializedName("image_url")
-    var image_url: String? = null
-
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt
deleted file mode 100644
index fa1b5ed..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeAdapter.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-package xyz.adjutor.aniki.anime.topanime
-
-import android.content.Intent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.cardview.widget.CardView
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import xyz.adjutor.aniki.R
-
-class TopAnimeAdapter(private val animeList: List<TopAnime>) :
-    RecyclerView.Adapter<TopAnimeAdapter.AnimeViewHolder>() {
-
-    // Describes an item view and its place within the RecyclerView
-    class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val animeTitle: TextView = itemView.findViewById(R.id.tv_title)
-        val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
-        val animeScore: TextView = itemView.findViewById(R.id.tv_score)
-        val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
-        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
-    }
-
-    // Returns a new ViewHolder
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
-        val view = LayoutInflater.from(parent.context)
-            .inflate(R.layout.item_layout, parent, false)
-
-        return AnimeViewHolder(view)
-    }
-
-    // Returns size of data list
-    override fun getItemCount(): Int {
-        return animeList.size
-    }
-
-    // Displays data at a certain position
-    override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
-        val currentAnime: TopAnime = animeList[position]
-        holder.animeTitle.text = currentAnime.title
-        holder.animeRank.text = currentAnime.rank.toString()
-        holder.animeScore.text = currentAnime.score.toString()
-        val image: String = currentAnime.image_url.toString()
-        Glide
-            .with(holder.itemView.context)
-            .load(image)
-            .apply(RequestOptions().override(400))
-            .into(holder.animeImage)
-
-        //when you click on a selected cardview, some datas are sent to the other activity
-        holder.cardview.setOnClickListener {
-            val currentAnimeId = "theanimeid"
-            val currentAnimeTitle = "theanimetitle"
-            val currentAnimeRank = "theanimerank"
-            val currentAnimeScore = "theanimescore"
-            val currentAnimeImageUrl = "theanimeimageurl"
-            val currentAnimeEpisodes = "theanimeepisodes"
-            val currentAnimeStartDate = "theanimestartdate"
-            val currentAnimeEndDate = "theanimeenddate"
-            val currentAnimeUrl = "theanimeurl"
-
-            val intent: Intent =
-                Intent(holder.itemView.context, DetailTopAnimeActivity::class.java).apply {
-                    putExtra(currentAnimeId, currentAnime.mal_id.toString())
-                    putExtra(currentAnimeTitle, currentAnime.title)
-                    putExtra(currentAnimeRank, currentAnime.rank.toString())
-                    putExtra(currentAnimeScore, currentAnime.score.toString())
-                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
-                    putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
-                    putExtra(currentAnimeStartDate, currentAnime.start_date)
-                    putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
-                    putExtra(currentAnimeUrl, currentAnime.url.toString())
-                }
-            holder.itemView.context.startActivity(intent)
-        }
-    }
-}
\ 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
deleted file mode 100644
index 2e6b1e0..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeApi.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package xyz.adjutor.aniki.anime.topanime
-
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Path
-
-interface TopAnimeApi {
-
-    @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
deleted file mode 100644
index babb7c1..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimePage.kt
+++ /dev/null
@@ -1,173 +0,0 @@
-package xyz.adjutor.aniki.anime.topanime
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.findNavController
-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
-import retrofit2.Callback
-import retrofit2.Response
-import retrofit2.Retrofit
-import retrofit2.converter.gson.GsonConverterFactory
-import xyz.adjutor.aniki.R
-import java.lang.reflect.Type
-
-class TopAnimePage : Fragment() {
-
-    private lateinit var sharedPreferences: SharedPreferences
-    val gson: Gson = GsonBuilder()
-        .setLenient()
-        .create()
-    var baseUrl = "https://api.jikan.moe/" //the api's base url
-    var page: Int = 1
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View? {
-        // Inflate the layout for this fragment
-        val view = inflater.inflate(R.layout.top_anime_page, container, false)
-
-        sharedPreferences = view.context.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
-
-        val animeList: List<TopAnime>? = getDataFromCache()
-        if (animeList != null) {
-            showList(view, animeList)
-        } else {
-            makeApiCall(view, baseUrl, 1)
-        }
-
-        return view
-
-    }
-
-    private fun getDataFromCache(): List<TopAnime>? {
-        //the value of the animeList json, if nothing is found, return null
-        val jsonAnime: String? = sharedPreferences.getString("jsonAnimeList", null)
-
-        //if it's null, well, return null
-        return if (jsonAnime == null) {
-            null
-        } else { //else deserialize the list and return it
-            val listType: Type = object : TypeToken<List<TopAnime>>() {}.type
-            gson.fromJson(jsonAnime, listType)
-        }
-    }
-
-    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_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, 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
-        }
-
-    }
-
-    //display the recyclerview
-    fun showList(view: View, animeList: List<TopAnime>) {
-        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
-        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, page: Int) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(TopAnimeApi::class.java)
-        val call = service.getTopAnimeData(page)
-
-        call.enqueue(object : Callback<TopAnimeResponse> {
-            override fun onResponse(
-                call: Call<TopAnimeResponse>,
-                response: Response<TopAnimeResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val animeList: List<TopAnime> = response.body()!!
-                        .getResults() //getting the "top" field containing our list of TopAnimes
-                    saveList(animeList)
-                    showList(
-                        view,
-                        animeList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<TopAnimeResponse>, t: Throwable) {
-                showError()
-            }
-
-        })
-    }
-
-    private fun saveList(animeList: List<TopAnime>) {
-        val jsonString: String = gson.toJson(animeList)
-
-        sharedPreferences
-            .edit()
-            .putString("jsonAnimeList", jsonString)
-            .apply()
-    }
-
-    private fun showError() {
-        Snackbar.make(
-            requireView(),
-            "API ERROR : Verify your internet connection.",
-            Snackbar.LENGTH_LONG
-        )
-            .setAction("Action", null).show()
-    }
-
-}
\ No newline at end of file
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
deleted file mode 100644
index 2fe69d6..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/anime/topanime/TopAnimeResponse.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.anime.topanime
-
-import com.google.gson.annotations.SerializedName
-
-class TopAnimeResponse {
-
-    @SerializedName("top")
-    var top: List<TopAnime>? = null
-
-    fun getResults(): List<TopAnime> {
-        return top!!
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/AnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/AnimeApi.kt
new file mode 100644
index 0000000..d67d0ef
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/AnimeApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Path
+import xyz.adjutor.aniki.presentation.model.AnimeResponse
+
+interface AnimeApi {
+
+    @GET("v3/anime/{id}")
+    fun getAnimeData(@Path("id") id: String): Call<AnimeResponse>
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/MangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/MangaApi.kt
new file mode 100644
index 0000000..699efa4
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/MangaApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Path
+import xyz.adjutor.aniki.presentation.model.MangaResponse
+
+interface MangaApi {
+
+    @GET("v3/manga/{id}")
+    fun getMangaData(@Path("id") id: String): Call<MangaResponse>
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/SearchAnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/SearchAnimeApi.kt
new file mode 100644
index 0000000..1b0811b
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/SearchAnimeApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Query
+import xyz.adjutor.aniki.presentation.model.SearchAnimeResponse
+
+interface SearchAnimeApi {
+
+    @GET("v3/search/anime")
+    fun getSearchAnimeData(@Query("q") q: String): Call<SearchAnimeResponse>
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/SearchMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/SearchMangaApi.kt
new file mode 100644
index 0000000..3b26c1a
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/SearchMangaApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Query
+import xyz.adjutor.aniki.presentation.model.SearchMangaResponse
+
+interface SearchMangaApi {
+
+    @GET("v3/search/manga")
+    fun getSearchMangaData(@Query("q") q: String): Call<SearchMangaResponse>
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/TopAnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/TopAnimeApi.kt
new file mode 100644
index 0000000..39bd78b
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/TopAnimeApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Path
+import xyz.adjutor.aniki.presentation.model.TopAnimeResponse
+
+interface TopAnimeApi {
+
+    @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/data/TopMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/TopMangaApi.kt
new file mode 100644
index 0000000..8edab88
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/TopMangaApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Path
+import xyz.adjutor.aniki.presentation.model.TopMangaResponse
+
+interface TopMangaApi {
+
+    @GET("v3/top/manga/{page}")
+    fun getTopMangaData(@Path("page") page: Int): Call<TopMangaResponse>
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/MangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/manga/MangaApi.kt
deleted file mode 100644
index f1b51a4..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/MangaApi.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package xyz.adjutor.aniki.manga
-
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Path
-
-interface MangaApi {
-
-    @GET("v3/manga/{id}")
-    fun getMangaData(@Path("id") id: String): Call<MangaResponse>
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt
deleted file mode 100644
index 263b93c..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/MangaResponse.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package xyz.adjutor.aniki.manga
-
-import com.google.gson.annotations.SerializedName
-
-class MangaResponse { //only kept the infos I didn't have and that were interesting to me.
-
-    @SerializedName("mal_id")
-    var mal_id: Int? = null
-
-    @SerializedName("chapters")
-    var chapters: Int? = null
-
-    @SerializedName("synopsis")
-    var synopsis: String? = null
-
-    @SerializedName("rank")
-    var rank: Int? = null //added for the search feature (detail)
-
-    @SerializedName("background")
-    var background: String? = null //a bit of background story about the manga
-
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/DetailSearchMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/DetailSearchMangaActivity.kt
deleted file mode 100644
index 4ae01f8..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/DetailSearchMangaActivity.kt
+++ /dev/null
@@ -1,169 +0,0 @@
-package xyz.adjutor.aniki.manga.search
-
-import android.os.Bundle
-import android.widget.ImageView
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-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.manga.MangaApi
-import xyz.adjutor.aniki.manga.MangaResponse
-
-class DetailSearchMangaActivity : AppCompatActivity() {
-
-    private var baseUrl = "https://api.jikan.moe/"
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    //used in the list
-    private val intentMangaImageUrl = "themangaimageurl"
-    private val intentMangaTitle = "themangatitle"
-    private val intentMangaScore = "themangascore"
-
-    //only used for the detail
-    private val intentMangaId = "themangaid"
-    private val intentMangaUrl = "themangaurl"
-    private val intentMangaChapters = "themangachapters"
-    private val intentMangaVolumes = "themangavolumes"
-    private val intentMangaStartDate = "themangastartdate"
-    private val intentMangaEndDate = "themangaenddate"
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_detail_search_manga)
-
-        val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
-        val mangaTitle = intent.getStringExtra(intentMangaTitle)
-        val mangaScore = intent.getStringExtra(intentMangaScore)
-
-        val mangaId = intent.getStringExtra(intentMangaId)
-        val mangaUrl = intent.getStringExtra(intentMangaUrl)
-        val mangaChapters = intent.getStringExtra(intentMangaChapters)
-        val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
-        val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
-        val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
-
-
-        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
-        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
-        val tvScore: TextView = findViewById(R.id.tv_detail_score)
-
-        val tvId: TextView = findViewById(R.id.tv_detail_id)
-        val tvUrl: TextView = findViewById(R.id.tv_url)
-        val tvChapters: TextView = findViewById(R.id.tv_chapters)
-        val tvVolumes: TextView = findViewById(R.id.tv_volumes)
-        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
-        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
-
-        Glide
-            .with(this)
-            .load(mangaImageUrl)
-            .apply(RequestOptions().override(400))
-            .into(ivImage)
-        tvTitle.text = mangaTitle
-        tvScore.text = mangaScore
-
-
-        tvId.text = mangaId
-        tvUrl.text = mangaUrl
-
-        //using null as a string because it has been converted to a string before
-        tvChapters.text = if (mangaChapters != "null") {
-            mangaChapters
-        } else {
-            fieldIsNull()
-        }
-
-        tvVolumes.text = if (mangaVolumes != "null") {
-            mangaVolumes
-        } else {
-            fieldIsNull()
-        }
-
-        tvStartDate.text = splitDate(mangaStartDate!!)
-
-        tvEndDate.text = if (mangaEndDate != "null") {
-            splitDate(mangaEndDate!!)
-        } else {
-            fieldIsNull()
-        }
-
-        makeApiCall(baseUrl, mangaId.toString())
-
-    }
-
-    private fun splitDate(mangaDate: String): CharSequence {
-        val delimiter = "T"
-        return mangaDate
-            .split(delimiter) //split between the date and the time
-            .toTypedArray()[0] //convert it to an array and take the first string
-
-    }
-
-    private fun makeApiCall(BASE_URL: String, mangaId: String) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(MangaApi::class.java)
-        val call = service.getMangaData(mangaId) //based on the id
-
-        call.enqueue(object : Callback<MangaResponse> {
-            override fun onResponse(
-                call: Call<MangaResponse>,
-                response: Response<MangaResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val manga = response.body() //getting the MangaResponse fields
-                    showDetail(manga!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(manga: MangaResponse) {
-        //elements from MangaResponse
-        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
-        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-        val tvBackground: TextView = findViewById(R.id.tv_background)
-
-        tvSynopsis.text = manga.synopsis.toString()
-
-        tvRank.text = manga.rank.toString()
-
-        tvBackground.text = if (manga.background != null) {
-            manga.background.toString()
-        } else {
-            fieldIsNull()
-        }
-
-    }
-
-    fun showError(text: String) {
-        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
-    }
-
-    private fun fieldIsNull(): String {
-        return "Unknown"
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt
deleted file mode 100644
index 518a0a6..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchManga.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package xyz.adjutor.aniki.manga.search
-
-import com.google.gson.annotations.SerializedName
-
-class SearchManga {
-
-    @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("chapters")
-    var chapters: Int? = null
-
-    @SerializedName("volumes")
-    var volumes: 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
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
deleted file mode 100644
index fb95c9c..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaAdapter.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-package xyz.adjutor.aniki.manga.search
-
-import android.content.Intent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.cardview.widget.CardView
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import xyz.adjutor.aniki.R
-
-class SearchMangaAdapter(private val mangaList: List<SearchManga>) :
-    RecyclerView.Adapter<SearchMangaAdapter.MangaViewHolder>() {
-
-    // Describes an item view and its place within the RecyclerView
-    class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val mangaTitle: TextView = itemView.findViewById(R.id.tv_title)
-        val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
-        val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
-        val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
-        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
-    }
-
-    // Returns a new ViewHolder
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
-        val view = LayoutInflater.from(parent.context)
-            .inflate(R.layout.item_layout, parent, false)
-
-        return MangaViewHolder(view)
-    }
-
-    // Returns size of data list
-    override fun getItemCount(): Int {
-        return mangaList.size
-    }
-
-    // Displays data at a certain position
-    override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
-        val currentManga: SearchManga = mangaList[position]
-        holder.mangaTitle.text = currentManga.title
-        holder.mangaRank.text = "" //the rank isn't supplied by this API
-        holder.mangaScore.text = currentManga.score.toString()
-        val image: String = currentManga.image_url.toString()
-        Glide
-            .with(holder.itemView.context)
-            .load(image)
-            .apply(RequestOptions().override(400))
-            .into(holder.mangaImage)
-
-        //when you click on a selected cardview, some datas are sent to the other activity
-        holder.cardview.setOnClickListener {
-            val currentMangaId = "themangaid"
-            val currentMangaUrl = "themangaurl"
-            val currentMangaImageUrl = "themangaimageurl"
-            val currentMangaTitle = "themangatitle"
-            val currentMangaChapters = "themangachapters"
-            val currentMangaVolumes = "themangavolumes"
-            val currentMangaScore = "themangascore"
-            val currentMangaStartDate = "themangastartdate"
-            val currentMangaEndDate = "themangaenddate"
-
-            //intent is used to pass data to another activity
-
-            val intent: Intent =
-                Intent(holder.itemView.context, DetailSearchMangaActivity::class.java).apply {
-                    putExtra(currentMangaId, currentManga.mal_id.toString())
-                    putExtra(currentMangaUrl, currentManga.url.toString())
-                    putExtra(currentMangaImageUrl, currentManga.image_url.toString())
-                    putExtra(currentMangaTitle, currentManga.title)
-                    putExtra(currentMangaChapters, currentManga.chapters.toString())
-                    putExtra(currentMangaVolumes, currentManga.volumes.toString())
-                    putExtra(currentMangaScore, currentManga.score.toString())
-                    putExtra(currentMangaStartDate, currentManga.start_date)
-                    putExtra(currentMangaEndDate, currentManga.end_date.toString())
-                }
-            holder.itemView.context.startActivity(intent)
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaApi.kt
deleted file mode 100644
index 6f3e63d..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaApi.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package xyz.adjutor.aniki.manga.search
-
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Query
-
-interface SearchMangaApi {
-
-    @GET("v3/search/manga")
-    fun getSearchMangaData(@Query("q") q: String): Call<SearchMangaResponse>
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
deleted file mode 100644
index d236887..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaPage.kt
+++ /dev/null
@@ -1,142 +0,0 @@
-package xyz.adjutor.aniki.manga.search
-
-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.MainActivity
-import xyz.adjutor.aniki.R
-
-
-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
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaResponse.kt
deleted file mode 100644
index 7721258..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/search/SearchMangaResponse.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.manga.search
-
-import com.google.gson.annotations.SerializedName
-
-class SearchMangaResponse { //only kept the infos I didn't have and that were interesting to me.
-
-    @SerializedName("results")
-    private lateinit var results: List<SearchManga>
-
-    fun getResults(): List<SearchManga> {
-        return results
-    }
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
deleted file mode 100644
index 6d89437..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/DetailTopMangaActivity.kt
+++ /dev/null
@@ -1,193 +0,0 @@
-package xyz.adjutor.aniki.manga.topmanga
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.widget.ImageView
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import com.google.gson.GsonBuilder
-import com.google.gson.reflect.TypeToken
-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.manga.MangaApi
-import xyz.adjutor.aniki.manga.MangaResponse
-import java.lang.reflect.Type
-
-class DetailTopMangaActivity : AppCompatActivity() {
-
-    private var baseUrl = "https://api.jikan.moe/"
-    private lateinit var sharedPreferences: SharedPreferences
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    //used in the list
-    private val intentMangaTitle = "themangatitle"
-    private val intentMangaRank = "themangarank"
-    private val intentMangaScore = "themangascore"
-    private val intentMangaImageUrl = "themangaimageurl"
-
-    //only used for the detail
-    private val intentMangaId = "themangaid"
-    private val intentMangaVolumes = "themangavolumes"
-    private val intentMangaStartDate = "themangastartdate"
-    private val intentMangaEndDate = "themangaenddate"
-    private val intentMangaUrl = "themangaurl"
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_detail_top_manga)
-
-        sharedPreferences = this.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
-
-        val mangaTitle = intent.getStringExtra(intentMangaTitle)
-        val mangaRank = intent.getStringExtra(intentMangaRank)
-        val mangaScore = intent.getStringExtra(intentMangaScore)
-        val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
-
-        val mangaId = intent.getStringExtra(intentMangaId)
-        val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
-        val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
-        val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
-        val mangaUrl = intent.getStringExtra(intentMangaUrl)
-
-        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
-        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-        val tvScore: TextView = findViewById(R.id.tv_detail_score)
-        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
-
-        val tvId: TextView = findViewById(R.id.tv_detail_id)
-        val tvVolumes: TextView = findViewById(R.id.tv_volumes)
-        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
-        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
-        val tvUrl: TextView = findViewById(R.id.tv_url)
-
-        tvTitle.text = mangaTitle
-        tvRank.text = mangaRank
-        tvScore.text = mangaScore
-        Glide
-            .with(this)
-            .load(mangaImageUrl)
-            .apply(RequestOptions().override(400))
-            .into(ivImage)
-
-        tvId.text = mangaId
-
-        //using null as a string because it has been converted to a string before
-        tvVolumes.text = if (mangaVolumes != "null") {
-            mangaVolumes
-        } else {
-            fieldIsNull()
-        }
-
-        tvStartDate.text = mangaStartDate
-
-        tvEndDate.text = if (mangaEndDate != "null") {
-            mangaEndDate
-        } else {
-            fieldIsNull()
-        }
-
-        tvUrl.text = mangaUrl
-
-        val manga: MangaResponse? = getDataFromCache(mangaId.toString())
-        if (manga != null) {
-            showDetail(manga)
-        } else {
-            //taking the API's fields I want and displaying them
-            makeApiCall(baseUrl, mangaId.toString())
-        }
-
-    }
-
-    private fun getDataFromCache(mangaId: String): MangaResponse? {
-        val jsonManga: String? = sharedPreferences.getString(mangaId, null)
-
-        return if (jsonManga == null) {
-            null
-        } else {
-            val type: Type = object : TypeToken<MangaResponse>() {}.type
-            gson.fromJson(jsonManga, type)
-        }
-    }
-
-    private fun makeApiCall(BASE_URL: String, mangaId: String) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(MangaApi::class.java)
-        val call = service.getMangaData(mangaId) //based on the id
-
-        call.enqueue(object : Callback<MangaResponse> {
-            override fun onResponse(
-                call: Call<MangaResponse>,
-                response: Response<MangaResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val manga = response.body() //getting the MangaResponse fields
-                    saveList(manga)
-                    showDetail(manga!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(manga: MangaResponse) {
-        //elements from MangaResponse
-        val tvChapters: TextView = findViewById(R.id.tv_chapters)
-        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
-        val tvBackground: TextView = findViewById(R.id.tv_background)
-
-        tvChapters.text = if (manga.chapters != null) {
-            manga.chapters.toString()
-        } else {
-            fieldIsNull()
-        }
-
-        tvSynopsis.text = manga.synopsis.toString()
-
-        tvBackground.text = if (manga.background != null) {
-            manga.background.toString()
-        } else {
-            fieldIsNull()
-        }
-
-    }
-
-    fun showError(text: String) {
-        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
-    }
-
-    private fun fieldIsNull(): String {
-        return "Unknown"
-    }
-
-    fun saveList(manga: MangaResponse?) {
-        val jsonString: String = gson.toJson(manga)
-
-        sharedPreferences
-            .edit()
-            .putString(manga?.mal_id.toString(), jsonString)
-            .apply()
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt
deleted file mode 100644
index 2ceceea..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopManga.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-package xyz.adjutor.aniki.manga.topmanga
-
-import com.google.gson.annotations.SerializedName
-
-//Content of the top field from the api of top manga
-class TopManga {
-
-    @SerializedName("mal_id")
-    var mal_id: Int? = null
-
-    @SerializedName("rank")
-    var rank: Int? = null
-
-    @SerializedName("title")
-    var title: String? = null
-
-    @SerializedName("url")
-    var url: String? = null
-
-    @SerializedName("volumes")
-    var volumes: Int? = null
-
-    @SerializedName("start_date")
-    var start_date: String? = null
-
-    @SerializedName("end_date")
-    var end_date: String? = null
-
-    @SerializedName("score")
-    var score: Float? = null
-
-    @SerializedName("image_url")
-    var image_url: String? = null
-
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
deleted file mode 100644
index d0c56f7..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaAdapter.kt
+++ /dev/null
@@ -1,81 +0,0 @@
-package xyz.adjutor.aniki.manga.topmanga
-
-import android.content.Intent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.cardview.widget.CardView
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import xyz.adjutor.aniki.R
-
-class TopMangaAdapter(private val mangaList: List<TopManga>) :
-    RecyclerView.Adapter<TopMangaAdapter.MangaViewHolder>() {
-
-    // Describes an item view and its place within the RecyclerView
-    class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val mangaTitle: TextView = itemView.findViewById(R.id.tv_title)
-        val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
-        val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
-        val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
-        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
-    }
-
-    // Returns a new ViewHolder
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
-        val view = LayoutInflater.from(parent.context)
-            .inflate(R.layout.item_layout, parent, false)
-
-        return MangaViewHolder(view)
-    }
-
-    // Returns size of data list
-    override fun getItemCount(): Int {
-        return mangaList.size
-    }
-
-    // Displays data at a certain position
-    override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
-        val currentManga: TopManga = mangaList[position]
-        holder.mangaTitle.text = currentManga.title
-        holder.mangaRank.text = currentManga.rank.toString()
-        holder.mangaScore.text = currentManga.score.toString()
-        val image: String = currentManga.image_url.toString()
-        Glide
-            .with(holder.itemView.context)
-            .load(image)
-            .apply(RequestOptions().override(400))
-            .into(holder.mangaImage)
-
-        //when you click on a selected cardview, some datas are sent to the other activity
-        holder.cardview.setOnClickListener {
-            val currentMangaId = "themangaid"
-            val currentMangaTitle = "themangatitle"
-            val currentMangaRank = "themangarank"
-            val currentMangaScore = "themangascore"
-            val currentMangaImageUrl = "themangaimageurl"
-            val currentMangaVolumes = "themangavolumes"
-            val currentMangaStartDate = "themangastartdate"
-            val currentMangaEndDate = "themangaenddate"
-            val currentMangaUrl = "themangaurl"
-
-            //intent is used to pass data to another activity
-            val intent: Intent =
-                Intent(holder.itemView.context, DetailTopMangaActivity::class.java).apply {
-                    putExtra(currentMangaId, currentManga.mal_id.toString())
-                    putExtra(currentMangaTitle, currentManga.title)
-                    putExtra(currentMangaRank, currentManga.rank.toString())
-                    putExtra(currentMangaScore, currentManga.score.toString())
-                    putExtra(currentMangaImageUrl, currentManga.image_url.toString())
-                    putExtra(currentMangaVolumes, currentManga.volumes.toString())
-                    putExtra(currentMangaStartDate, currentManga.start_date)
-                    putExtra(currentMangaEndDate, currentManga.end_date.toString())
-                    putExtra(currentMangaUrl, currentManga.url.toString())
-                }
-            holder.itemView.context.startActivity(intent)
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
deleted file mode 100644
index 2688fab..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaApi.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package xyz.adjutor.aniki.manga.topmanga
-
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Path
-
-interface TopMangaApi {
-
-    @GET("v3/top/manga/{page}")
-    fun getTopMangaData(@Path("page") page: Int): Call<TopMangaResponse>
-
-}
\ No newline at end of file
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
deleted file mode 100644
index 9c138a3..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaPage.kt
+++ /dev/null
@@ -1,174 +0,0 @@
-package xyz.adjutor.aniki.manga.topmanga
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.findNavController
-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
-import retrofit2.Callback
-import retrofit2.Response
-import retrofit2.Retrofit
-import retrofit2.converter.gson.GsonConverterFactory
-import xyz.adjutor.aniki.R
-import java.lang.reflect.Type
-
-class TopMangaPage : Fragment() {
-
-    private lateinit var sharedPreferences: SharedPreferences
-    val gson: Gson = GsonBuilder()
-        .setLenient()
-        .create()
-    private var baseUrl = "https://api.jikan.moe/" //the api's base url
-    var page: Int = 1
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View? {
-        // Inflate the layout for this fragment
-        val view = inflater.inflate(R.layout.top_manga_page, container, false)
-
-        sharedPreferences = view.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
-
-        val mangaList: List<TopManga>? = getDataFromCache()
-        if (mangaList != null) {
-            showList(view, mangaList)
-        } else {
-            makeApiCall(view, baseUrl, 1)
-        }
-
-        return view
-
-    }
-
-    private fun getDataFromCache(): List<TopManga>? {
-        //the value of the mangaList json, if nothing is found, return null
-        val jsonManga: String? = sharedPreferences.getString("jsonMangaList", null)
-
-        //if it's null, well, return null
-        return if (jsonManga == null) {
-            null
-        } else { //else deserialize the list and return it
-            val listType: Type = object : TypeToken<List<TopManga>>() {}.type
-            gson.fromJson(jsonManga, listType)
-        }
-    }
-
-    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_TopMangaPage_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, 1)
-            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_SHORT)
-                .setAction("Action", null).show()
-        }
-
-        //refresh when swiping down at the top of the page
-        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
-        swipeRefresh.setOnRefreshListener {
-            updateList()
-            page = 1
-            swipeRefresh.isRefreshing = false
-        }
-
-    }
-
-    //display the recyclerview
-    fun showList(view: View, mangaList: List<TopManga>) {
-        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
-        recyclerView.setHasFixedSize(true)
-        recyclerView.layoutManager = LinearLayoutManager(view.context)
-        recyclerView.adapter = TopMangaAdapter(mangaList)
-        (recyclerView.adapter as TopMangaAdapter).notifyDataSetChanged()
-    }
-
-    private fun makeApiCall(view: View, BASE_URL: String, page: Int) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(TopMangaApi::class.java)
-        val call = service.getTopMangaData(page)
-
-        call.enqueue(object : Callback<TopMangaResponse> {
-            override fun onResponse(
-                call: Call<TopMangaResponse>,
-                response: Response<TopMangaResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val mangaList: List<TopManga> = response.body()!!
-                        .getResults() //getting the "top" field containing our list of TopMangas
-                    saveList(mangaList)
-                    showList(
-                        view,
-                        mangaList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<TopMangaResponse>, t: Throwable) {
-                showError()
-            }
-
-        })
-    }
-
-    private fun saveList(mangaList: List<TopManga>) {
-        val jsonString: String = gson.toJson(mangaList)
-
-        sharedPreferences
-            .edit()
-            .putString("jsonMangaList", jsonString)
-            .apply()
-    }
-
-    private fun showError() {
-        Snackbar.make(
-            requireView(),
-            "API ERROR : Verify your internet connection.",
-            Snackbar.LENGTH_LONG
-        )
-            .setAction("Action", null).show()
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaResponse.kt
deleted file mode 100644
index 8577050..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/manga/topmanga/TopMangaResponse.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.manga.topmanga
-
-import com.google.gson.annotations.SerializedName
-
-class TopMangaResponse {
-
-    @SerializedName("top")
-    private lateinit var top: List<TopManga>
-
-    fun getResults(): List<TopManga> {
-        return top
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/AnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/AnimeResponse.kt
new file mode 100644
index 0000000..d682e3c
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/AnimeResponse.kt
@@ -0,0 +1,16 @@
+package xyz.adjutor.aniki.presentation.model
+
+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("rank")
+    var rank: Int? = null //added for the search feature (detail)
+
+    @SerializedName("synopsis")
+    var synopsis: String? = null
+
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/MangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/MangaResponse.kt
new file mode 100644
index 0000000..4bd7f2f
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/MangaResponse.kt
@@ -0,0 +1,22 @@
+package xyz.adjutor.aniki.presentation.model
+
+import com.google.gson.annotations.SerializedName
+
+class MangaResponse { //only kept the infos I didn't have and that were interesting to me.
+
+    @SerializedName("mal_id")
+    var mal_id: Int? = null
+
+    @SerializedName("chapters")
+    var chapters: Int? = null
+
+    @SerializedName("synopsis")
+    var synopsis: String? = null
+
+    @SerializedName("rank")
+    var rank: Int? = null //added for the search feature (detail)
+
+    @SerializedName("background")
+    var background: String? = null //a bit of background story about the manga
+
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnime.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnime.kt
new file mode 100644
index 0000000..df5189d
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnime.kt
@@ -0,0 +1,31 @@
+package xyz.adjutor.aniki.presentation.model
+
+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
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnimeResponse.kt
new file mode 100644
index 0000000..1e20e2f
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnimeResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.presentation.model
+
+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<SearchAnime>
+
+    fun getResults(): List<SearchAnime> {
+        return results
+    }
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchManga.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchManga.kt
new file mode 100644
index 0000000..c24d93c
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchManga.kt
@@ -0,0 +1,34 @@
+package xyz.adjutor.aniki.presentation.model
+
+import com.google.gson.annotations.SerializedName
+
+class SearchManga {
+
+    @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("chapters")
+    var chapters: Int? = null
+
+    @SerializedName("volumes")
+    var volumes: 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
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchMangaResponse.kt
new file mode 100644
index 0000000..4fe7047
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchMangaResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.presentation.model
+
+import com.google.gson.annotations.SerializedName
+
+class SearchMangaResponse { //only kept the infos I didn't have and that were interesting to me.
+
+    @SerializedName("results")
+    private lateinit var results: List<SearchManga>
+
+    fun getResults(): List<SearchManga> {
+        return results
+    }
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnime.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnime.kt
new file mode 100644
index 0000000..3cf4390
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnime.kt
@@ -0,0 +1,35 @@
+package xyz.adjutor.aniki.presentation.model
+
+import com.google.gson.annotations.SerializedName
+
+//Content of the top field from the api of top anime
+class TopAnime {
+
+    @SerializedName("mal_id")
+    var mal_id: Int? = null
+
+    @SerializedName("rank")
+    var rank: Int? = null
+
+    @SerializedName("title")
+    var title: String? = null
+
+    @SerializedName("url")
+    var url: String? = null
+
+    @SerializedName("episodes")
+    var episodes: Int? = null
+
+    @SerializedName("start_date")
+    var start_date: String? = null
+
+    @SerializedName("end_date")
+    var end_date: String? = null
+
+    @SerializedName("score")
+    var score: Float? = null
+
+    @SerializedName("image_url")
+    var image_url: String? = null
+
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnimeResponse.kt
new file mode 100644
index 0000000..95d39d6
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnimeResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.presentation.model
+
+import com.google.gson.annotations.SerializedName
+
+class TopAnimeResponse {
+
+    @SerializedName("top")
+    var top: List<TopAnime>? = null
+
+    fun getResults(): List<TopAnime> {
+        return top!!
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopManga.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopManga.kt
new file mode 100644
index 0000000..2e0886a
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopManga.kt
@@ -0,0 +1,35 @@
+package xyz.adjutor.aniki.presentation.model
+
+import com.google.gson.annotations.SerializedName
+
+//Content of the top field from the api of top manga
+class TopManga {
+
+    @SerializedName("mal_id")
+    var mal_id: Int? = null
+
+    @SerializedName("rank")
+    var rank: Int? = null
+
+    @SerializedName("title")
+    var title: String? = null
+
+    @SerializedName("url")
+    var url: String? = null
+
+    @SerializedName("volumes")
+    var volumes: Int? = null
+
+    @SerializedName("start_date")
+    var start_date: String? = null
+
+    @SerializedName("end_date")
+    var end_date: String? = null
+
+    @SerializedName("score")
+    var score: Float? = null
+
+    @SerializedName("image_url")
+    var image_url: String? = null
+
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopMangaResponse.kt
new file mode 100644
index 0000000..1b0dd8f
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopMangaResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.presentation.model
+
+import com.google.gson.annotations.SerializedName
+
+class TopMangaResponse {
+
+    @SerializedName("top")
+    private lateinit var top: List<TopManga>
+
+    fun getResults(): List<TopManga> {
+        return top
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchAnimeActivity.kt
new file mode 100644
index 0000000..68a30de
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchAnimeActivity.kt
@@ -0,0 +1,156 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+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.AnimeApi
+import xyz.adjutor.aniki.presentation.model.AnimeResponse
+
+class DetailSearchAnimeActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    private val gson = GsonBuilder()
+        .setLenient()
+        .create()
+
+    //used in the list
+    private val intentAnimeImageUrl = "theanimeimageurl"
+    private val intentAnimeTitle = "theanimetitle"
+    private val intentAnimeScore = "theanimescore"
+
+    //only used for the detail
+    private val intentAnimeId = "theanimeid"
+    private val intentAnimeUrl = "theanimeurl"
+    private val intentAnimeEpisodes = "theanimeepisodes"
+    private val intentAnimeStartDate = "theanimestartdate"
+    private val intentAnimeEndDate = "theanimeenddate"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_search_anime)
+
+        val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
+        val animeTitle = intent.getStringExtra(intentAnimeTitle)
+        val animeScore = intent.getStringExtra(intentAnimeScore)
+
+        val animeId = intent.getStringExtra(intentAnimeId)
+        val animeUrl = intent.getStringExtra(intentAnimeUrl)
+        val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes)
+        val animeStartDate = intent.getStringExtra(intentAnimeStartDate)
+        val animeEndDate = intent.getStringExtra(intentAnimeEndDate)
+
+
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+        val tvEpisodes: TextView = findViewById(R.id.tv_episodes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+
+        Glide
+            .with(this)
+            .load(animeImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+        tvTitle.text = animeTitle
+        tvScore.text = animeScore
+
+
+        tvId.text = animeId
+        tvUrl.text = animeUrl
+
+        //using null as a string because it has been converted to a string before
+        tvEpisodes.text = if (animeEpisodes != "null") {
+            animeEpisodes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = splitDate(animeStartDate!!)
+
+        tvEndDate.text = if (animeEndDate != "null") {
+            splitDate(animeEndDate!!)
+        } else {
+            fieldIsNull()
+        }
+
+        makeApiCall(baseUrl, animeId.toString())
+
+    }
+
+    private fun splitDate(animeDate: String): CharSequence {
+        val delimiter = "T"
+        return animeDate
+            .split(delimiter) //split between the date and the time
+            .toTypedArray()[0] //convert it to an array and take the first string
+
+    }
+
+    private fun makeApiCall(
+        BASE_URL: String,
+        animeId: String
+    ) { //we take the rest of the data that we need from the internet
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(AnimeApi::class.java)
+        val call = service.getAnimeData(animeId) //based on the id
+
+        call.enqueue(object : Callback<AnimeResponse> {
+            override fun onResponse(
+                call: Call<AnimeResponse>,
+                response: Response<AnimeResponse>
+            ) {
+                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 AnimeResponse fields
+                    showDetail(anime!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(anime: AnimeResponse) {
+        //elements from AnimeResponse
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+
+        tvSynopsis.text = anime.synopsis.toString()
+
+        tvRank.text = anime.rank.toString()
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+
+    private fun fieldIsNull(): String {
+        return "Unknown"
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchMangaActivity.kt
new file mode 100644
index 0000000..d96cc70
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchMangaActivity.kt
@@ -0,0 +1,169 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+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.MangaApi
+import xyz.adjutor.aniki.presentation.model.MangaResponse
+
+class DetailSearchMangaActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    private val gson = GsonBuilder()
+        .setLenient()
+        .create()
+
+    //used in the list
+    private val intentMangaImageUrl = "themangaimageurl"
+    private val intentMangaTitle = "themangatitle"
+    private val intentMangaScore = "themangascore"
+
+    //only used for the detail
+    private val intentMangaId = "themangaid"
+    private val intentMangaUrl = "themangaurl"
+    private val intentMangaChapters = "themangachapters"
+    private val intentMangaVolumes = "themangavolumes"
+    private val intentMangaStartDate = "themangastartdate"
+    private val intentMangaEndDate = "themangaenddate"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_search_manga)
+
+        val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
+        val mangaTitle = intent.getStringExtra(intentMangaTitle)
+        val mangaScore = intent.getStringExtra(intentMangaScore)
+
+        val mangaId = intent.getStringExtra(intentMangaId)
+        val mangaUrl = intent.getStringExtra(intentMangaUrl)
+        val mangaChapters = intent.getStringExtra(intentMangaChapters)
+        val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
+        val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
+        val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
+
+
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+        val tvChapters: TextView = findViewById(R.id.tv_chapters)
+        val tvVolumes: TextView = findViewById(R.id.tv_volumes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+
+        Glide
+            .with(this)
+            .load(mangaImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+        tvTitle.text = mangaTitle
+        tvScore.text = mangaScore
+
+
+        tvId.text = mangaId
+        tvUrl.text = mangaUrl
+
+        //using null as a string because it has been converted to a string before
+        tvChapters.text = if (mangaChapters != "null") {
+            mangaChapters
+        } else {
+            fieldIsNull()
+        }
+
+        tvVolumes.text = if (mangaVolumes != "null") {
+            mangaVolumes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = splitDate(mangaStartDate!!)
+
+        tvEndDate.text = if (mangaEndDate != "null") {
+            splitDate(mangaEndDate!!)
+        } else {
+            fieldIsNull()
+        }
+
+        makeApiCall(baseUrl, mangaId.toString())
+
+    }
+
+    private fun splitDate(mangaDate: String): CharSequence {
+        val delimiter = "T"
+        return mangaDate
+            .split(delimiter) //split between the date and the time
+            .toTypedArray()[0] //convert it to an array and take the first string
+
+    }
+
+    private fun makeApiCall(BASE_URL: String, mangaId: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(MangaApi::class.java)
+        val call = service.getMangaData(mangaId) //based on the id
+
+        call.enqueue(object : Callback<MangaResponse> {
+            override fun onResponse(
+                call: Call<MangaResponse>,
+                response: Response<MangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val manga = response.body() //getting the MangaResponse fields
+                    showDetail(manga!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(manga: MangaResponse) {
+        //elements from MangaResponse
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+        val tvBackground: TextView = findViewById(R.id.tv_background)
+
+        tvSynopsis.text = manga.synopsis.toString()
+
+        tvRank.text = manga.rank.toString()
+
+        tvBackground.text = if (manga.background != null) {
+            manga.background.toString()
+        } else {
+            fieldIsNull()
+        }
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+
+    private fun fieldIsNull(): String {
+        return "Unknown"
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopAnimeActivity.kt
new file mode 100644
index 0000000..3ec6ab6
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopAnimeActivity.kt
@@ -0,0 +1,176 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+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.AnimeApi
+import xyz.adjutor.aniki.presentation.model.AnimeResponse
+import java.lang.reflect.Type
+
+class DetailTopAnimeActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    private lateinit var sharedPreferences: SharedPreferences
+    private val gson = GsonBuilder()
+        .setLenient()
+        .create()
+
+    private val intentAnimeId = "theanimeid"
+    private val intentAnimeTitle = "theanimetitle"
+    private val intentAnimeRank = "theanimerank"
+    private val intentAnimeScore = "theanimescore"
+    private val intentAnimeImageUrl = "theanimeimageurl"
+
+    private val intentAnimeEpisodes = "theanimeepisodes"
+    private val intentAnimeStartDate = "theanimestartdate"
+    private val intentAnimeEndDate = "theanimeenddate"
+    private val intentAnimeUrl = "theanimeurl"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_top_anime)
+
+        sharedPreferences = this.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
+
+        val animeId = intent.getStringExtra(intentAnimeId)
+        val animeTitle = intent.getStringExtra(intentAnimeTitle)
+        val animeRank = intent.getStringExtra(intentAnimeRank)
+        val animeScore = intent.getStringExtra(intentAnimeScore)
+        val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
+
+        val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes)
+        val animeStartDate = intent.getStringExtra(intentAnimeStartDate)
+        val animeEndDate = intent.getStringExtra(intentAnimeEndDate)
+        val animeUrl = intent.getStringExtra(intentAnimeUrl)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+
+        val tvEpisodes: TextView = findViewById(R.id.tv_episodes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+
+        tvId.text = animeId
+        tvTitle.text = animeTitle
+        tvRank.text = animeRank
+        tvScore.text = animeScore
+        Glide
+            .with(this)
+            .load(animeImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+
+        //using null as a string because it has been converted to a string before
+        tvEpisodes.text = if (animeEpisodes != "null") {
+            animeEpisodes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = animeStartDate
+
+        tvEndDate.text = if (animeEndDate != "null") {
+            animeEndDate
+        } else {
+            fieldIsNull()
+        }
+
+        tvUrl.text = animeUrl
+
+        val anime: AnimeResponse? = getDataFromCache(animeId.toString())
+        if (anime != null) {
+            showDetail(anime)
+        } else {
+            //taking the API's fields I want and displaying them
+            makeApiCall(baseUrl, animeId.toString())
+        }
+
+    }
+
+    private fun getDataFromCache(animeId: String): AnimeResponse? {
+        val jsonAnime: String? = sharedPreferences.getString(animeId, null)
+
+        return if (jsonAnime == null) {
+            null
+        } else {
+            val type: Type = object : TypeToken<AnimeResponse>() {}.type
+            gson.fromJson(jsonAnime, type)
+        }
+    }
+
+    private fun makeApiCall(BASE_URL: String, animeId: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(AnimeApi::class.java)
+        val call = service.getAnimeData(animeId) //based on the id
+
+        call.enqueue(object : Callback<AnimeResponse> {
+            override fun onResponse(
+                call: Call<AnimeResponse>,
+                response: Response<AnimeResponse>
+            ) {
+                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 AnimeResponse fields
+                    saveList(anime)
+                    showDetail(anime!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(anime: AnimeResponse) {
+        //elements from AnimeResponse
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+
+        tvSynopsis.text = anime.synopsis.toString()
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+
+    private fun fieldIsNull(): String {
+        return "Unknown"
+    }
+
+    fun saveList(anime: AnimeResponse?) {
+        val jsonString: String = gson.toJson(anime)
+
+        sharedPreferences
+            .edit()
+            .putString(anime?.mal_id.toString(), jsonString)
+            .apply()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopMangaActivity.kt
new file mode 100644
index 0000000..0142018
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopMangaActivity.kt
@@ -0,0 +1,193 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+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.MangaApi
+import xyz.adjutor.aniki.presentation.model.MangaResponse
+import java.lang.reflect.Type
+
+class DetailTopMangaActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    private lateinit var sharedPreferences: SharedPreferences
+    private val gson = GsonBuilder()
+        .setLenient()
+        .create()
+
+    //used in the list
+    private val intentMangaTitle = "themangatitle"
+    private val intentMangaRank = "themangarank"
+    private val intentMangaScore = "themangascore"
+    private val intentMangaImageUrl = "themangaimageurl"
+
+    //only used for the detail
+    private val intentMangaId = "themangaid"
+    private val intentMangaVolumes = "themangavolumes"
+    private val intentMangaStartDate = "themangastartdate"
+    private val intentMangaEndDate = "themangaenddate"
+    private val intentMangaUrl = "themangaurl"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_top_manga)
+
+        sharedPreferences = this.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
+
+        val mangaTitle = intent.getStringExtra(intentMangaTitle)
+        val mangaRank = intent.getStringExtra(intentMangaRank)
+        val mangaScore = intent.getStringExtra(intentMangaScore)
+        val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
+
+        val mangaId = intent.getStringExtra(intentMangaId)
+        val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
+        val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
+        val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
+        val mangaUrl = intent.getStringExtra(intentMangaUrl)
+
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvVolumes: TextView = findViewById(R.id.tv_volumes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+
+        tvTitle.text = mangaTitle
+        tvRank.text = mangaRank
+        tvScore.text = mangaScore
+        Glide
+            .with(this)
+            .load(mangaImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+
+        tvId.text = mangaId
+
+        //using null as a string because it has been converted to a string before
+        tvVolumes.text = if (mangaVolumes != "null") {
+            mangaVolumes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = mangaStartDate
+
+        tvEndDate.text = if (mangaEndDate != "null") {
+            mangaEndDate
+        } else {
+            fieldIsNull()
+        }
+
+        tvUrl.text = mangaUrl
+
+        val manga: MangaResponse? = getDataFromCache(mangaId.toString())
+        if (manga != null) {
+            showDetail(manga)
+        } else {
+            //taking the API's fields I want and displaying them
+            makeApiCall(baseUrl, mangaId.toString())
+        }
+
+    }
+
+    private fun getDataFromCache(mangaId: String): MangaResponse? {
+        val jsonManga: String? = sharedPreferences.getString(mangaId, null)
+
+        return if (jsonManga == null) {
+            null
+        } else {
+            val type: Type = object : TypeToken<MangaResponse>() {}.type
+            gson.fromJson(jsonManga, type)
+        }
+    }
+
+    private fun makeApiCall(BASE_URL: String, mangaId: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(MangaApi::class.java)
+        val call = service.getMangaData(mangaId) //based on the id
+
+        call.enqueue(object : Callback<MangaResponse> {
+            override fun onResponse(
+                call: Call<MangaResponse>,
+                response: Response<MangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val manga = response.body() //getting the MangaResponse fields
+                    saveList(manga)
+                    showDetail(manga!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(manga: MangaResponse) {
+        //elements from MangaResponse
+        val tvChapters: TextView = findViewById(R.id.tv_chapters)
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+        val tvBackground: TextView = findViewById(R.id.tv_background)
+
+        tvChapters.text = if (manga.chapters != null) {
+            manga.chapters.toString()
+        } else {
+            fieldIsNull()
+        }
+
+        tvSynopsis.text = manga.synopsis.toString()
+
+        tvBackground.text = if (manga.background != null) {
+            manga.background.toString()
+        } else {
+            fieldIsNull()
+        }
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+
+    private fun fieldIsNull(): String {
+        return "Unknown"
+    }
+
+    fun saveList(manga: MangaResponse?) {
+        val jsonString: String = gson.toJson(manga)
+
+        sharedPreferences
+            .edit()
+            .putString(manga?.mal_id.toString(), jsonString)
+            .apply()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt
new file mode 100644
index 0000000..f2abca1
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt
@@ -0,0 +1,38 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+import xyz.adjutor.aniki.R
+
+class HomePage : Fragment() {
+
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        // Inflate the layout for this fragment
+        return inflater.inflate(R.layout.home_page, container, false)
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        view.findViewById<Button>(R.id.button_top_manga).setOnClickListener {
+            findNavController().navigate(R.id.action_HomePage_to_TopMangaPage)
+        }
+        view.findViewById<Button>(R.id.button_top_anime).setOnClickListener {
+            findNavController().navigate(R.id.action_HomePage_to_TopAnimePage)
+        }
+        view.findViewById<Button>(R.id.button_search_manga).setOnClickListener {
+            findNavController().navigate(R.id.action_HomePage_to_SearchMangaPage)
+        }
+        view.findViewById<Button>(R.id.button_search_anime).setOnClickListener {
+            findNavController().navigate(R.id.action_HomePage_to_SearchAnimePage)
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/MainActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/MainActivity.kt
new file mode 100644
index 0000000..bff89e4
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/MainActivity.kt
@@ -0,0 +1,14 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import xyz.adjutor.aniki.R
+
+class MainActivity : AppCompatActivity() {
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_main)
+        setSupportActionBar(findViewById(R.id.toolbar))
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimeAdapter.kt
new file mode 100644
index 0000000..e938473
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimeAdapter.kt
@@ -0,0 +1,82 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.presentation.model.SearchAnime
+
+class SearchAnimeAdapter(private val animeList: List<SearchAnime>) :
+    RecyclerView.Adapter<SearchAnimeAdapter.AnimeViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val animeTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val animeScore: TextView = itemView.findViewById(R.id.tv_score)
+        val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_layout, parent, false)
+
+        return AnimeViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return animeList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
+        val currentAnime: SearchAnime = animeList[position]
+        holder.animeTitle.text = currentAnime.title
+        holder.animeRank.text = "" //the rank isn't supplied by this API
+        holder.animeScore.text = currentAnime.score.toString()
+        val image: String = currentAnime.image_url.toString()
+        Glide
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.animeImage)
+
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentAnimeId = "theanimeid"
+            val currentAnimeUrl = "theanimeurl"
+            val currentAnimeImageUrl = "theanimeimageurl"
+            val currentAnimeTitle = "theanimetitle"
+            val currentAnimeEpisodes = "theanimeepisodes"
+            val currentAnimeScore = "theanimescore"
+            val currentAnimeStartDate = "theanimestartdate"
+            val currentAnimeEndDate = "theanimeenddate"
+
+            //intent is used to pass data to another activity
+
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailSearchAnimeActivity::class.java).apply {
+                    putExtra(currentAnimeId, currentAnime.mal_id.toString())
+                    putExtra(currentAnimeUrl, currentAnime.url.toString())
+                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
+                    putExtra(currentAnimeTitle, currentAnime.title)
+                    putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
+                    putExtra(currentAnimeScore, currentAnime.score.toString())
+                    putExtra(currentAnimeStartDate, currentAnime.start_date)
+                    putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
+                }
+            holder.itemView.context.startActivity(intent)
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimePage.kt
new file mode 100644
index 0000000..d2cf795
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimePage.kt
@@ -0,0 +1,136 @@
+package xyz.adjutor.aniki.presentation.view
+
+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
+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.SearchAnimeApi
+import xyz.adjutor.aniki.presentation.model.SearchAnime
+import xyz.adjutor.aniki.presentation.model.SearchAnimeResponse
+
+class SearchAnimePage : 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_anime_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_SearchAnimePage_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(TextView.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, animeList: List<SearchAnime>) {
+        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
+        recyclerView.setHasFixedSize(true)
+        recyclerView.layoutManager = LinearLayoutManager(view.context)
+        recyclerView.adapter = SearchAnimeAdapter(animeList)
+        (recyclerView.adapter as SearchAnimeAdapter).notifyDataSetChanged()
+    }
+
+    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(SearchAnimeApi::class.java)
+        val call = service.getSearchAnimeData(q = query) //fate is an exemple, we'll have to replace it by the user input.
+
+        call.enqueue(object : Callback<SearchAnimeResponse> {
+            override fun onResponse(
+                call: Call<SearchAnimeResponse>,
+                response: Response<SearchAnimeResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val animeList: List<SearchAnime> = response.body()!!
+                        .getResults() //getting the "search" field containing our list of SearchAnimes
+
+                    showList(
+                        view,
+                        animeList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<SearchAnimeResponse>, t: Throwable) {
+                showError()
+            }
+
+        })
+    }
+
+    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
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaAdapter.kt
new file mode 100644
index 0000000..061eafc
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaAdapter.kt
@@ -0,0 +1,84 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.presentation.model.SearchManga
+
+class SearchMangaAdapter(private val mangaList: List<SearchManga>) :
+    RecyclerView.Adapter<SearchMangaAdapter.MangaViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val mangaTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
+        val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_layout, parent, false)
+
+        return MangaViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return mangaList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
+        val currentManga: SearchManga = mangaList[position]
+        holder.mangaTitle.text = currentManga.title
+        holder.mangaRank.text = "" //the rank isn't supplied by this API
+        holder.mangaScore.text = currentManga.score.toString()
+        val image: String = currentManga.image_url.toString()
+        Glide
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.mangaImage)
+
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentMangaId = "themangaid"
+            val currentMangaUrl = "themangaurl"
+            val currentMangaImageUrl = "themangaimageurl"
+            val currentMangaTitle = "themangatitle"
+            val currentMangaChapters = "themangachapters"
+            val currentMangaVolumes = "themangavolumes"
+            val currentMangaScore = "themangascore"
+            val currentMangaStartDate = "themangastartdate"
+            val currentMangaEndDate = "themangaenddate"
+
+            //intent is used to pass data to another activity
+
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailSearchMangaActivity::class.java).apply {
+                    putExtra(currentMangaId, currentManga.mal_id.toString())
+                    putExtra(currentMangaUrl, currentManga.url.toString())
+                    putExtra(currentMangaImageUrl, currentManga.image_url.toString())
+                    putExtra(currentMangaTitle, currentManga.title)
+                    putExtra(currentMangaChapters, currentManga.chapters.toString())
+                    putExtra(currentMangaVolumes, currentManga.volumes.toString())
+                    putExtra(currentMangaScore, currentManga.score.toString())
+                    putExtra(currentMangaStartDate, currentManga.start_date)
+                    putExtra(currentMangaEndDate, currentManga.end_date.toString())
+                }
+            holder.itemView.context.startActivity(intent)
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaPage.kt
new file mode 100644
index 0000000..7d7fa74
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaPage.kt
@@ -0,0 +1,144 @@
+package xyz.adjutor.aniki.presentation.view
+
+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.SearchMangaApi
+import xyz.adjutor.aniki.presentation.model.SearchManga
+import xyz.adjutor.aniki.presentation.model.SearchMangaResponse
+
+
+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
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimeAdapter.kt
new file mode 100644
index 0000000..b1b336a
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimeAdapter.kt
@@ -0,0 +1,81 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.presentation.model.TopAnime
+
+class TopAnimeAdapter(private val animeList: List<TopAnime>) :
+    RecyclerView.Adapter<TopAnimeAdapter.AnimeViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val animeTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val animeScore: TextView = itemView.findViewById(R.id.tv_score)
+        val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_layout, parent, false)
+
+        return AnimeViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return animeList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
+        val currentAnime: TopAnime = animeList[position]
+        holder.animeTitle.text = currentAnime.title
+        holder.animeRank.text = currentAnime.rank.toString()
+        holder.animeScore.text = currentAnime.score.toString()
+        val image: String = currentAnime.image_url.toString()
+        Glide
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.animeImage)
+
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentAnimeId = "theanimeid"
+            val currentAnimeTitle = "theanimetitle"
+            val currentAnimeRank = "theanimerank"
+            val currentAnimeScore = "theanimescore"
+            val currentAnimeImageUrl = "theanimeimageurl"
+            val currentAnimeEpisodes = "theanimeepisodes"
+            val currentAnimeStartDate = "theanimestartdate"
+            val currentAnimeEndDate = "theanimeenddate"
+            val currentAnimeUrl = "theanimeurl"
+
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailTopAnimeActivity::class.java).apply {
+                    putExtra(currentAnimeId, currentAnime.mal_id.toString())
+                    putExtra(currentAnimeTitle, currentAnime.title)
+                    putExtra(currentAnimeRank, currentAnime.rank.toString())
+                    putExtra(currentAnimeScore, currentAnime.score.toString())
+                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
+                    putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
+                    putExtra(currentAnimeStartDate, currentAnime.start_date)
+                    putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
+                    putExtra(currentAnimeUrl, currentAnime.url.toString())
+                }
+            holder.itemView.context.startActivity(intent)
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimePage.kt
new file mode 100644
index 0000000..8a7ef08
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimePage.kt
@@ -0,0 +1,176 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+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
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.data.TopAnimeApi
+import xyz.adjutor.aniki.presentation.model.TopAnime
+import xyz.adjutor.aniki.presentation.model.TopAnimeResponse
+import java.lang.reflect.Type
+
+class TopAnimePage : Fragment() {
+
+    private lateinit var sharedPreferences: SharedPreferences
+    val gson: Gson = GsonBuilder()
+        .setLenient()
+        .create()
+    var baseUrl = "https://api.jikan.moe/" //the api's base url
+    var page: Int = 1
+
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        // Inflate the layout for this fragment
+        val view = inflater.inflate(R.layout.top_anime_page, container, false)
+
+        sharedPreferences = view.context.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
+
+        val animeList: List<TopAnime>? = getDataFromCache()
+        if (animeList != null) {
+            showList(view, animeList)
+        } else {
+            makeApiCall(view, baseUrl, 1)
+        }
+
+        return view
+
+    }
+
+    private fun getDataFromCache(): List<TopAnime>? {
+        //the value of the animeList json, if nothing is found, return null
+        val jsonAnime: String? = sharedPreferences.getString("jsonAnimeList", null)
+
+        //if it's null, well, return null
+        return if (jsonAnime == null) {
+            null
+        } else { //else deserialize the list and return it
+            val listType: Type = object : TypeToken<List<TopAnime>>() {}.type
+            gson.fromJson(jsonAnime, listType)
+        }
+    }
+
+    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_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, 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
+        }
+
+    }
+
+    //display the recyclerview
+    fun showList(view: View, animeList: List<TopAnime>) {
+        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
+        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, page: Int) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(TopAnimeApi::class.java)
+        val call = service.getTopAnimeData(page)
+
+        call.enqueue(object : Callback<TopAnimeResponse> {
+            override fun onResponse(
+                call: Call<TopAnimeResponse>,
+                response: Response<TopAnimeResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val animeList: List<TopAnime> = response.body()!!
+                        .getResults() //getting the "top" field containing our list of TopAnimes
+                    saveList(animeList)
+                    showList(
+                        view,
+                        animeList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<TopAnimeResponse>, t: Throwable) {
+                showError()
+            }
+
+        })
+    }
+
+    private fun saveList(animeList: List<TopAnime>) {
+        val jsonString: String = gson.toJson(animeList)
+
+        sharedPreferences
+            .edit()
+            .putString("jsonAnimeList", jsonString)
+            .apply()
+    }
+
+    private fun showError() {
+        Snackbar.make(
+            requireView(),
+            "API ERROR : Verify your internet connection.",
+            Snackbar.LENGTH_LONG
+        )
+            .setAction("Action", null).show()
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaAdapter.kt
new file mode 100644
index 0000000..fac3730
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaAdapter.kt
@@ -0,0 +1,82 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.presentation.model.TopManga
+
+class TopMangaAdapter(private val mangaList: List<TopManga>) :
+    RecyclerView.Adapter<TopMangaAdapter.MangaViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val mangaTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
+        val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_layout, parent, false)
+
+        return MangaViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return mangaList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
+        val currentManga: TopManga = mangaList[position]
+        holder.mangaTitle.text = currentManga.title
+        holder.mangaRank.text = currentManga.rank.toString()
+        holder.mangaScore.text = currentManga.score.toString()
+        val image: String = currentManga.image_url.toString()
+        Glide
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.mangaImage)
+
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentMangaId = "themangaid"
+            val currentMangaTitle = "themangatitle"
+            val currentMangaRank = "themangarank"
+            val currentMangaScore = "themangascore"
+            val currentMangaImageUrl = "themangaimageurl"
+            val currentMangaVolumes = "themangavolumes"
+            val currentMangaStartDate = "themangastartdate"
+            val currentMangaEndDate = "themangaenddate"
+            val currentMangaUrl = "themangaurl"
+
+            //intent is used to pass data to another activity
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailTopMangaActivity::class.java).apply {
+                    putExtra(currentMangaId, currentManga.mal_id.toString())
+                    putExtra(currentMangaTitle, currentManga.title)
+                    putExtra(currentMangaRank, currentManga.rank.toString())
+                    putExtra(currentMangaScore, currentManga.score.toString())
+                    putExtra(currentMangaImageUrl, currentManga.image_url.toString())
+                    putExtra(currentMangaVolumes, currentManga.volumes.toString())
+                    putExtra(currentMangaStartDate, currentManga.start_date)
+                    putExtra(currentMangaEndDate, currentManga.end_date.toString())
+                    putExtra(currentMangaUrl, currentManga.url.toString())
+                }
+            holder.itemView.context.startActivity(intent)
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaPage.kt
new file mode 100644
index 0000000..2bf84e8
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaPage.kt
@@ -0,0 +1,177 @@
+package xyz.adjutor.aniki.presentation.view
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+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
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.data.TopMangaApi
+import xyz.adjutor.aniki.presentation.model.TopManga
+import xyz.adjutor.aniki.presentation.model.TopMangaResponse
+import java.lang.reflect.Type
+
+class TopMangaPage : Fragment() {
+
+    private lateinit var sharedPreferences: SharedPreferences
+    val gson: Gson = GsonBuilder()
+        .setLenient()
+        .create()
+    private var baseUrl = "https://api.jikan.moe/" //the api's base url
+    var page: Int = 1
+
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        // Inflate the layout for this fragment
+        val view = inflater.inflate(R.layout.top_manga_page, container, false)
+
+        sharedPreferences = view.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
+
+        val mangaList: List<TopManga>? = getDataFromCache()
+        if (mangaList != null) {
+            showList(view, mangaList)
+        } else {
+            makeApiCall(view, baseUrl, 1)
+        }
+
+        return view
+
+    }
+
+    private fun getDataFromCache(): List<TopManga>? {
+        //the value of the mangaList json, if nothing is found, return null
+        val jsonManga: String? = sharedPreferences.getString("jsonMangaList", null)
+
+        //if it's null, well, return null
+        return if (jsonManga == null) {
+            null
+        } else { //else deserialize the list and return it
+            val listType: Type = object : TypeToken<List<TopManga>>() {}.type
+            gson.fromJson(jsonManga, listType)
+        }
+    }
+
+    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_TopMangaPage_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, 1)
+            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_SHORT)
+                .setAction("Action", null).show()
+        }
+
+        //refresh when swiping down at the top of the page
+        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
+        swipeRefresh.setOnRefreshListener {
+            updateList()
+            page = 1
+            swipeRefresh.isRefreshing = false
+        }
+
+    }
+
+    //display the recyclerview
+    fun showList(view: View, mangaList: List<TopManga>) {
+        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
+        recyclerView.setHasFixedSize(true)
+        recyclerView.layoutManager = LinearLayoutManager(view.context)
+        recyclerView.adapter = TopMangaAdapter(mangaList)
+        (recyclerView.adapter as TopMangaAdapter).notifyDataSetChanged()
+    }
+
+    private fun makeApiCall(view: View, BASE_URL: String, page: Int) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(TopMangaApi::class.java)
+        val call = service.getTopMangaData(page)
+
+        call.enqueue(object : Callback<TopMangaResponse> {
+            override fun onResponse(
+                call: Call<TopMangaResponse>,
+                response: Response<TopMangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val mangaList: List<TopManga> = response.body()!!
+                        .getResults() //getting the "top" field containing our list of TopMangas
+                    saveList(mangaList)
+                    showList(
+                        view,
+                        mangaList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<TopMangaResponse>, t: Throwable) {
+                showError()
+            }
+
+        })
+    }
+
+    private fun saveList(mangaList: List<TopManga>) {
+        val jsonString: String = gson.toJson(mangaList)
+
+        sharedPreferences
+            .edit()
+            .putString("jsonMangaList", jsonString)
+            .apply()
+    }
+
+    private fun showError() {
+        Snackbar.make(
+            requireView(),
+            "API ERROR : Verify your internet connection.",
+            Snackbar.LENGTH_LONG
+        )
+            .setAction("Action", null).show()
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_detail_top_anime.xml b/app/src/main/res/layout/activity_detail_top_anime.xml
index c9f5316..d4c9380 100644
--- a/app/src/main/res/layout/activity_detail_top_anime.xml
+++ b/app/src/main/res/layout/activity_detail_top_anime.xml
@@ -8,7 +8,7 @@
         xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        tools:context=".anime.topanime.DetailTopAnimeActivity">
+        tools:context=".presentation.view.DetailTopAnimeActivity">
 
         <androidx.cardview.widget.CardView
             android:id="@+id/cv_header"
diff --git a/app/src/main/res/layout/activity_detail_top_manga.xml b/app/src/main/res/layout/activity_detail_top_manga.xml
index 2e29c0e..e659baf 100644
--- a/app/src/main/res/layout/activity_detail_top_manga.xml
+++ b/app/src/main/res/layout/activity_detail_top_manga.xml
@@ -8,7 +8,7 @@
         xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        tools:context=".manga.topmanga.DetailTopMangaActivity">
+        tools:context=".presentation.view.DetailTopMangaActivity">
 
         <androidx.cardview.widget.CardView
             android:id="@+id/cv_header"
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index a975f22..ff9ab1f 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -4,7 +4,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".MainActivity">
+    tools:context=".presentation.view.MainActivity">
 
     <com.google.android.material.appbar.AppBarLayout
         android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/home_page.xml b/app/src/main/res/layout/home_page.xml
index be80747..1c547d6 100644
--- a/app/src/main/res/layout/home_page.xml
+++ b/app/src/main/res/layout/home_page.xml
@@ -5,7 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/very_dark_purple"
-    tools:context=".HomePage">
+    tools:context=".presentation.view.HomePage">
 
     <TextView
         android:id="@+id/tv_title"
diff --git a/app/src/main/res/layout/search_anime_page.xml b/app/src/main/res/layout/search_anime_page.xml
index f91c1d9..a3a1671 100644
--- a/app/src/main/res/layout/search_anime_page.xml
+++ b/app/src/main/res/layout/search_anime_page.xml
@@ -5,7 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/very_dark_purple"
-    tools:context=".anime.search.SearchAnimePage">
+    tools:context=".presentation.view.SearchAnimePage">
 
     <com.google.android.material.textfield.TextInputEditText
         android:id="@+id/tiet_query"
diff --git a/app/src/main/res/layout/search_manga_page.xml b/app/src/main/res/layout/search_manga_page.xml
index cacab1d..a83b4ef 100644
--- a/app/src/main/res/layout/search_manga_page.xml
+++ b/app/src/main/res/layout/search_manga_page.xml
@@ -5,7 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/very_dark_purple"
-    tools:context=".manga.search.SearchMangaPage">
+    tools:context=".presentation.view.SearchMangaPage">
 
     <com.google.android.material.textfield.TextInputEditText
         android:id="@+id/tiet_query"
diff --git a/app/src/main/res/layout/top_anime_page.xml b/app/src/main/res/layout/top_anime_page.xml
index 6797660..7b33f34 100644
--- a/app/src/main/res/layout/top_anime_page.xml
+++ b/app/src/main/res/layout/top_anime_page.xml
@@ -5,7 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/very_dark_purple"
-    tools:context=".anime.topanime.TopAnimePage">
+    tools:context=".presentation.view.TopAnimePage">
 
     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
         android:id="@+id/swiperefresh"
diff --git a/app/src/main/res/layout/top_manga_page.xml b/app/src/main/res/layout/top_manga_page.xml
index 2f4a9f1..e3bbd47 100644
--- a/app/src/main/res/layout/top_manga_page.xml
+++ b/app/src/main/res/layout/top_manga_page.xml
@@ -5,7 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/very_dark_purple"
-    tools:context=".manga.topmanga.TopMangaPage">
+    tools:context=".presentation.view.TopMangaPage">
 
     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
         android:id="@+id/swiperefresh"
diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml
index 89cbc89..95c7996 100644
--- a/app/src/main/res/navigation/nav_graph.xml
+++ b/app/src/main/res/navigation/nav_graph.xml
@@ -7,7 +7,7 @@
 
     <fragment
         android:id="@+id/HomePage"
-        android:name="xyz.adjutor.aniki.HomePage"
+        android:name="xyz.adjutor.aniki.presentation.view.HomePage"
         android:label="@string/home_page_label"
         tools:layout="@layout/home_page">
 
@@ -28,7 +28,7 @@
 
     <fragment
         android:id="@+id/TopMangaPage"
-        android:name="xyz.adjutor.aniki.manga.topmanga.TopMangaPage"
+        android:name="xyz.adjutor.aniki.presentation.view.TopMangaPage"
         android:label="@string/top_manga_page_label"
         tools:layout="@layout/top_manga_page">
 
@@ -38,7 +38,7 @@
     </fragment>
     <fragment
         android:id="@+id/TopAnimePage"
-        android:name="xyz.adjutor.aniki.anime.topanime.TopAnimePage"
+        android:name="xyz.adjutor.aniki.presentation.view.TopAnimePage"
         android:label="@string/top_anime_page_label"
         tools:layout="@layout/top_anime_page">
 
@@ -48,7 +48,7 @@
     </fragment>
     <fragment
         android:id="@+id/SearchMangaPage"
-        android:name="xyz.adjutor.aniki.manga.search.SearchMangaPage"
+        android:name="xyz.adjutor.aniki.presentation.view.SearchMangaPage"
         android:label="@string/search_manga_page_label"
         tools:layout="@layout/search_manga_page">
 
@@ -58,7 +58,7 @@
     </fragment>
     <fragment
         android:id="@+id/SearchAnimePage"
-        android:name="xyz.adjutor.aniki.anime.search.SearchAnimePage"
+        android:name="xyz.adjutor.aniki.presentation.view.SearchAnimePage"
         android:label="@string/search_anime_page_label"
         tools:layout="@layout/search_anime_page">
 
diff --git a/build.gradle b/build.gradle
index ef7bd27..a33d7ea 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,7 +6,7 @@ buildscript {
         jcenter()
     }
     dependencies {
-        classpath "com.android.tools.build:gradle:4.1.2"
+        classpath 'com.android.tools.build:gradle:4.1.3'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 
         // NOTE: Do not place your application dependencies here; they belong
-- 
cgit v1.2.3


From c7720c2c8dce929e72bc2cea23ff7390a1da3296 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 23 Mar 2021 11:55:59 +0100
Subject: Starting the main controller.

---
 .../presentation/controller/MainController.kt      | 27 ++++++++++++++++++++++
 1 file changed, 27 insertions(+)
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt
new file mode 100644
index 0000000..312ecbe
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt
@@ -0,0 +1,27 @@
+package xyz.adjutor.aniki.presentation.controller
+
+import xyz.adjutor.aniki.presentation.model.TopManga
+
+class MainController {
+
+    fun MainController() {
+
+    }
+
+    fun onStart() {
+
+    }
+
+    fun onItemClick(topmanga: TopManga) {
+
+    }
+
+    fun onButtonTopMangaClick() {
+
+    }
+
+    fun onButtonTopAnimeClick() {
+
+    }
+
+}
\ No newline at end of file
-- 
cgit v1.2.3


From 5a8c22508e08b00a31c8ebb4df13d9e108d29e1f Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 13 Apr 2021 13:22:04 +0200
Subject: Restructuring and README update.

---
 README.md                                          |  25 ++-
 app/src/main/AndroidManifest.xml                   |   8 +-
 .../main/java/xyz/adjutor/aniki/data/AnimeApi.kt   |  13 --
 .../main/java/xyz/adjutor/aniki/data/MangaApi.kt   |  13 --
 .../java/xyz/adjutor/aniki/data/SearchAnimeApi.kt  |  13 --
 .../java/xyz/adjutor/aniki/data/SearchMangaApi.kt  |  13 --
 .../java/xyz/adjutor/aniki/data/TopAnimeApi.kt     |  13 --
 .../java/xyz/adjutor/aniki/data/TopMangaApi.kt     |  13 --
 .../java/xyz/adjutor/aniki/data/anime/AnimeApi.kt  |  13 ++
 .../xyz/adjutor/aniki/data/anime/SearchAnimeApi.kt |  13 ++
 .../xyz/adjutor/aniki/data/anime/TopAnimeApi.kt    |  13 ++
 .../java/xyz/adjutor/aniki/data/manga/MangaApi.kt  |  13 ++
 .../xyz/adjutor/aniki/data/manga/SearchMangaApi.kt |  13 ++
 .../xyz/adjutor/aniki/data/manga/TopMangaApi.kt    |  13 ++
 .../presentation/controller/MainController.kt      |  12 +-
 .../presentation/controller/TopMangaController.kt  |  29 ++++
 .../aniki/presentation/model/AnimeResponse.kt      |  16 --
 .../aniki/presentation/model/MangaResponse.kt      |  22 ---
 .../aniki/presentation/model/SearchAnime.kt        |  31 ----
 .../presentation/model/SearchAnimeResponse.kt      |  13 --
 .../aniki/presentation/model/SearchManga.kt        |  34 ----
 .../presentation/model/SearchMangaResponse.kt      |  13 --
 .../adjutor/aniki/presentation/model/TopAnime.kt   |  35 ----
 .../aniki/presentation/model/TopAnimeResponse.kt   |  13 --
 .../adjutor/aniki/presentation/model/TopManga.kt   |  35 ----
 .../aniki/presentation/model/TopMangaResponse.kt   |  13 --
 .../presentation/model/anime/AnimeResponse.kt      |  16 ++
 .../aniki/presentation/model/anime/SearchAnime.kt  |  31 ++++
 .../model/anime/SearchAnimeResponse.kt             |  13 ++
 .../aniki/presentation/model/anime/TopAnime.kt     |  35 ++++
 .../presentation/model/anime/TopAnimeResponse.kt   |  13 ++
 .../presentation/model/manga/MangaResponse.kt      |  22 +++
 .../aniki/presentation/model/manga/SearchManga.kt  |  34 ++++
 .../model/manga/SearchMangaResponse.kt             |  13 ++
 .../aniki/presentation/model/manga/TopManga.kt     |  36 ++++
 .../presentation/model/manga/TopMangaResponse.kt   |  13 ++
 .../presentation/view/DetailSearchAnimeActivity.kt | 156 -----------------
 .../presentation/view/DetailSearchMangaActivity.kt | 169 ------------------
 .../presentation/view/DetailTopAnimeActivity.kt    | 176 -------------------
 .../presentation/view/DetailTopMangaActivity.kt    | 193 ---------------------
 .../adjutor/aniki/presentation/view/HomePage.kt    |   3 +
 .../aniki/presentation/view/MainActivity.kt        |   1 +
 .../aniki/presentation/view/SearchAnimeAdapter.kt  |  82 ---------
 .../aniki/presentation/view/SearchAnimePage.kt     | 136 ---------------
 .../aniki/presentation/view/SearchMangaAdapter.kt  |  84 ---------
 .../aniki/presentation/view/SearchMangaPage.kt     | 144 ---------------
 .../aniki/presentation/view/TopAnimeAdapter.kt     |  81 ---------
 .../aniki/presentation/view/TopAnimePage.kt        | 176 -------------------
 .../aniki/presentation/view/TopMangaAdapter.kt     |  82 ---------
 .../aniki/presentation/view/TopMangaPage.kt        | 177 -------------------
 .../view/anime/DetailSearchAnimeActivity.kt        | 156 +++++++++++++++++
 .../view/anime/DetailTopAnimeActivity.kt           | 176 +++++++++++++++++++
 .../presentation/view/anime/SearchAnimeAdapter.kt  |  82 +++++++++
 .../presentation/view/anime/SearchAnimePage.kt     | 137 +++++++++++++++
 .../presentation/view/anime/TopAnimeAdapter.kt     |  81 +++++++++
 .../aniki/presentation/view/anime/TopAnimePage.kt  | 176 +++++++++++++++++++
 .../view/manga/DetailSearchMangaActivity.kt        | 169 ++++++++++++++++++
 .../view/manga/DetailTopMangaActivity.kt           | 193 +++++++++++++++++++++
 .../presentation/view/manga/SearchMangaAdapter.kt  |  84 +++++++++
 .../presentation/view/manga/SearchMangaPage.kt     | 145 ++++++++++++++++
 .../presentation/view/manga/TopMangaAdapter.kt     |  82 +++++++++
 .../aniki/presentation/view/manga/TopMangaPage.kt  | 178 +++++++++++++++++++
 .../main/res/layout/activity_detail_top_anime.xml  |   2 +-
 .../main/res/layout/activity_detail_top_manga.xml  |   2 +-
 app/src/main/res/layout/search_anime_page.xml      |   2 +-
 app/src/main/res/layout/search_manga_page.xml      |   2 +-
 app/src/main/res/layout/top_anime_page.xml         |   2 +-
 app/src/main/res/layout/top_manga_page.xml         |   2 +-
 app/src/main/res/navigation/nav_graph.xml          |   8 +-
 69 files changed, 2040 insertions(+), 1980 deletions(-)
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/data/AnimeApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/data/MangaApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/data/SearchAnimeApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/data/SearchMangaApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/data/TopAnimeApi.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/data/TopMangaApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/anime/AnimeApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/anime/SearchAnimeApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/anime/TopAnimeApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/manga/MangaApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/manga/SearchMangaApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/data/manga/TopMangaApi.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/AnimeResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/MangaResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnime.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnimeResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchManga.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchMangaResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnime.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnimeResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/TopManga.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/TopMangaResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/AnimeResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/SearchAnime.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/SearchAnimeResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/TopAnime.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/TopAnimeResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/MangaResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/SearchManga.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/SearchMangaResponse.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/TopManga.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/TopMangaResponse.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchAnimeActivity.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchMangaActivity.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopAnimeActivity.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopMangaActivity.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimeAdapter.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimePage.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaAdapter.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaPage.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimeAdapter.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimePage.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaAdapter.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaPage.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailSearchAnimeActivity.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailTopAnimeActivity.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimeAdapter.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimeAdapter.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailSearchMangaActivity.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/SearchMangaAdapter.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/SearchMangaPage.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaAdapter.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt

diff --git a/README.md b/README.md
index a1f6dcf..da5ecc0 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,9 @@
+# Android myanimelist client project. (WIP)
+
+## Features
+
 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.
+SwipeRefresh used to refresh the list of data of the first page.
 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
@@ -13,6 +17,7 @@ We can also submit the query by clicking the "search" button that replace the "r
 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.
 
+## API
 Multiple calls of the REST API from jikan.moe.
 Usage of :
 + /v3/top/manga
@@ -22,10 +27,12 @@ Usage of :
 + /v3/search/manga
 + /v3/search/anime
 
+## Data Storage
 Data storage with sharedpreferences used for the recycler view of top manga and top anime as well as the details
 Saves the detail page of an item when opened, not when the list is shown
 Usage of ScrollView in the detail page. Thus, items with long synopsis and background aren't cut down.
 
+## Design
 Used my "personal" theme colors for the app.
 It consists of some colors of the pink/purple "family" :
 + very dark purple : #09022A
@@ -34,4 +41,18 @@ It consists of some colors of the pink/purple "family" :
 + slightly desaturated magenta : #C583B6
 + grayish magenta : #C9A6C9
 
-Development done with a Gitflow workflow.
+Also added the "bangers" font for the titles.
+
+## Gitflow
+Development done with a Gitflow workflow. I used master, release, develop and feature branches.
+
+## Architecture
+I used the MVC architecture.
+
+## TO-DO
++ Finishing MVC
++ Adding Singleton
++ Clicking on an image opens it full size
++ Firebase
++ Bottom navigation
++ ...
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 93413a4..356c924 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,19 +14,19 @@
         android:theme="@style/Theme.Aniki"
         tools:ignore="AllowBackup">
         <activity
-            android:name="xyz.adjutor.aniki.presentation.view.DetailTopMangaActivity"
+            android:name="xyz.adjutor.aniki.presentation.view.manga.DetailTopMangaActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
         <activity
-            android:name="xyz.adjutor.aniki.presentation.view.DetailTopAnimeActivity"
+            android:name="xyz.adjutor.aniki.presentation.view.anime.DetailTopAnimeActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
         <activity
-            android:name="xyz.adjutor.aniki.presentation.view.DetailSearchMangaActivity"
+            android:name="xyz.adjutor.aniki.presentation.view.manga.DetailSearchMangaActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
         <activity
-            android:name="xyz.adjutor.aniki.presentation.view.DetailSearchAnimeActivity"
+            android:name="xyz.adjutor.aniki.presentation.view.anime.DetailSearchAnimeActivity"
             android:label="Details"
             android:theme="@style/Theme.Aniki" />
         <activity
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/AnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/AnimeApi.kt
deleted file mode 100644
index d67d0ef..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/data/AnimeApi.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.data
-
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Path
-import xyz.adjutor.aniki.presentation.model.AnimeResponse
-
-interface AnimeApi {
-
-    @GET("v3/anime/{id}")
-    fun getAnimeData(@Path("id") id: String): Call<AnimeResponse>
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/MangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/MangaApi.kt
deleted file mode 100644
index 699efa4..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/data/MangaApi.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.data
-
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Path
-import xyz.adjutor.aniki.presentation.model.MangaResponse
-
-interface MangaApi {
-
-    @GET("v3/manga/{id}")
-    fun getMangaData(@Path("id") id: String): Call<MangaResponse>
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/SearchAnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/SearchAnimeApi.kt
deleted file mode 100644
index 1b0811b..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/data/SearchAnimeApi.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.data
-
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Query
-import xyz.adjutor.aniki.presentation.model.SearchAnimeResponse
-
-interface SearchAnimeApi {
-
-    @GET("v3/search/anime")
-    fun getSearchAnimeData(@Query("q") q: String): Call<SearchAnimeResponse>
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/SearchMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/SearchMangaApi.kt
deleted file mode 100644
index 3b26c1a..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/data/SearchMangaApi.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.data
-
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Query
-import xyz.adjutor.aniki.presentation.model.SearchMangaResponse
-
-interface SearchMangaApi {
-
-    @GET("v3/search/manga")
-    fun getSearchMangaData(@Query("q") q: String): Call<SearchMangaResponse>
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/TopAnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/TopAnimeApi.kt
deleted file mode 100644
index 39bd78b..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/data/TopAnimeApi.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.data
-
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Path
-import xyz.adjutor.aniki.presentation.model.TopAnimeResponse
-
-interface TopAnimeApi {
-
-    @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/data/TopMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/TopMangaApi.kt
deleted file mode 100644
index 8edab88..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/data/TopMangaApi.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.data
-
-import retrofit2.Call
-import retrofit2.http.GET
-import retrofit2.http.Path
-import xyz.adjutor.aniki.presentation.model.TopMangaResponse
-
-interface TopMangaApi {
-
-    @GET("v3/top/manga/{page}")
-    fun getTopMangaData(@Path("page") page: Int): Call<TopMangaResponse>
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/anime/AnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/anime/AnimeApi.kt
new file mode 100644
index 0000000..24e5cd7
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/anime/AnimeApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data.anime
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Path
+import xyz.adjutor.aniki.presentation.model.anime.AnimeResponse
+
+interface AnimeApi {
+
+    @GET("v3/anime/{id}")
+    fun getAnimeData(@Path("id") id: String): Call<AnimeResponse>
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/anime/SearchAnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/anime/SearchAnimeApi.kt
new file mode 100644
index 0000000..9bd6b2d
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/anime/SearchAnimeApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data.anime
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Query
+import xyz.adjutor.aniki.presentation.model.anime.SearchAnimeResponse
+
+interface SearchAnimeApi {
+
+    @GET("v3/search/anime")
+    fun getSearchAnimeData(@Query("q") q: String): Call<SearchAnimeResponse>
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/anime/TopAnimeApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/anime/TopAnimeApi.kt
new file mode 100644
index 0000000..76fd25f
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/anime/TopAnimeApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data.anime
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Path
+import xyz.adjutor.aniki.presentation.model.anime.TopAnimeResponse
+
+interface TopAnimeApi {
+
+    @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/data/manga/MangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/manga/MangaApi.kt
new file mode 100644
index 0000000..a0f8df1
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/manga/MangaApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data.manga
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Path
+import xyz.adjutor.aniki.presentation.model.manga.MangaResponse
+
+interface MangaApi {
+
+    @GET("v3/manga/{id}")
+    fun getMangaData(@Path("id") id: String): Call<MangaResponse>
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/manga/SearchMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/manga/SearchMangaApi.kt
new file mode 100644
index 0000000..6cc2d77
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/manga/SearchMangaApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data.manga
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Query
+import xyz.adjutor.aniki.presentation.model.manga.SearchMangaResponse
+
+interface SearchMangaApi {
+
+    @GET("v3/search/manga")
+    fun getSearchMangaData(@Query("q") q: String): Call<SearchMangaResponse>
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/data/manga/TopMangaApi.kt b/app/src/main/java/xyz/adjutor/aniki/data/manga/TopMangaApi.kt
new file mode 100644
index 0000000..222dce3
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/data/manga/TopMangaApi.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.data.manga
+
+import retrofit2.Call
+import retrofit2.http.GET
+import retrofit2.http.Path
+import xyz.adjutor.aniki.presentation.model.manga.TopMangaResponse
+
+interface TopMangaApi {
+
+    @GET("v3/top/manga/{page}")
+    fun getTopMangaData(@Path("page") page: Int): Call<TopMangaResponse>
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt
index 312ecbe..133f84b 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt
@@ -1,7 +1,5 @@
 package xyz.adjutor.aniki.presentation.controller
 
-import xyz.adjutor.aniki.presentation.model.TopManga
-
 class MainController {
 
     fun MainController() {
@@ -12,15 +10,19 @@ class MainController {
 
     }
 
-    fun onItemClick(topmanga: TopManga) {
+    fun onButtonTopMangaClick() {
 
     }
 
-    fun onButtonTopMangaClick() {
+    fun onButtonTopAnimeClick() {
 
     }
 
-    fun onButtonTopAnimeClick() {
+    fun onButtonSearchMangaClick() {
+
+    }
+
+    fun onButtonSearchAnimeClick() {
 
     }
 
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
new file mode 100644
index 0000000..cfee062
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
@@ -0,0 +1,29 @@
+package xyz.adjutor.aniki.presentation.controller
+
+class TopMangaController {
+
+    fun TopMangaController() {
+
+    }
+
+    fun onStart() {
+
+    }
+
+    fun onButtonTopMangaClick() {
+
+    }
+
+    fun onButtonTopAnimeClick() {
+
+    }
+
+    fun onButtonSearchMangaClick() {
+
+    }
+
+    fun onButtonSearchAnimeClick() {
+
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/AnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/AnimeResponse.kt
deleted file mode 100644
index d682e3c..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/model/AnimeResponse.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package xyz.adjutor.aniki.presentation.model
-
-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("rank")
-    var rank: Int? = null //added for the search feature (detail)
-
-    @SerializedName("synopsis")
-    var synopsis: String? = null
-
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/MangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/MangaResponse.kt
deleted file mode 100644
index 4bd7f2f..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/model/MangaResponse.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package xyz.adjutor.aniki.presentation.model
-
-import com.google.gson.annotations.SerializedName
-
-class MangaResponse { //only kept the infos I didn't have and that were interesting to me.
-
-    @SerializedName("mal_id")
-    var mal_id: Int? = null
-
-    @SerializedName("chapters")
-    var chapters: Int? = null
-
-    @SerializedName("synopsis")
-    var synopsis: String? = null
-
-    @SerializedName("rank")
-    var rank: Int? = null //added for the search feature (detail)
-
-    @SerializedName("background")
-    var background: String? = null //a bit of background story about the manga
-
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnime.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnime.kt
deleted file mode 100644
index df5189d..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnime.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-package xyz.adjutor.aniki.presentation.model
-
-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
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnimeResponse.kt
deleted file mode 100644
index 1e20e2f..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchAnimeResponse.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.presentation.model
-
-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<SearchAnime>
-
-    fun getResults(): List<SearchAnime> {
-        return results
-    }
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchManga.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchManga.kt
deleted file mode 100644
index c24d93c..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchManga.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package xyz.adjutor.aniki.presentation.model
-
-import com.google.gson.annotations.SerializedName
-
-class SearchManga {
-
-    @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("chapters")
-    var chapters: Int? = null
-
-    @SerializedName("volumes")
-    var volumes: 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
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchMangaResponse.kt
deleted file mode 100644
index 4fe7047..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/model/SearchMangaResponse.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.presentation.model
-
-import com.google.gson.annotations.SerializedName
-
-class SearchMangaResponse { //only kept the infos I didn't have and that were interesting to me.
-
-    @SerializedName("results")
-    private lateinit var results: List<SearchManga>
-
-    fun getResults(): List<SearchManga> {
-        return results
-    }
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnime.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnime.kt
deleted file mode 100644
index 3cf4390..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnime.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-package xyz.adjutor.aniki.presentation.model
-
-import com.google.gson.annotations.SerializedName
-
-//Content of the top field from the api of top anime
-class TopAnime {
-
-    @SerializedName("mal_id")
-    var mal_id: Int? = null
-
-    @SerializedName("rank")
-    var rank: Int? = null
-
-    @SerializedName("title")
-    var title: String? = null
-
-    @SerializedName("url")
-    var url: String? = null
-
-    @SerializedName("episodes")
-    var episodes: Int? = null
-
-    @SerializedName("start_date")
-    var start_date: String? = null
-
-    @SerializedName("end_date")
-    var end_date: String? = null
-
-    @SerializedName("score")
-    var score: Float? = null
-
-    @SerializedName("image_url")
-    var image_url: String? = null
-
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnimeResponse.kt
deleted file mode 100644
index 95d39d6..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopAnimeResponse.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.presentation.model
-
-import com.google.gson.annotations.SerializedName
-
-class TopAnimeResponse {
-
-    @SerializedName("top")
-    var top: List<TopAnime>? = null
-
-    fun getResults(): List<TopAnime> {
-        return top!!
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopManga.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopManga.kt
deleted file mode 100644
index 2e0886a..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopManga.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-package xyz.adjutor.aniki.presentation.model
-
-import com.google.gson.annotations.SerializedName
-
-//Content of the top field from the api of top manga
-class TopManga {
-
-    @SerializedName("mal_id")
-    var mal_id: Int? = null
-
-    @SerializedName("rank")
-    var rank: Int? = null
-
-    @SerializedName("title")
-    var title: String? = null
-
-    @SerializedName("url")
-    var url: String? = null
-
-    @SerializedName("volumes")
-    var volumes: Int? = null
-
-    @SerializedName("start_date")
-    var start_date: String? = null
-
-    @SerializedName("end_date")
-    var end_date: String? = null
-
-    @SerializedName("score")
-    var score: Float? = null
-
-    @SerializedName("image_url")
-    var image_url: String? = null
-
-}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopMangaResponse.kt
deleted file mode 100644
index 1b0dd8f..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/model/TopMangaResponse.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package xyz.adjutor.aniki.presentation.model
-
-import com.google.gson.annotations.SerializedName
-
-class TopMangaResponse {
-
-    @SerializedName("top")
-    private lateinit var top: List<TopManga>
-
-    fun getResults(): List<TopManga> {
-        return top
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/AnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/AnimeResponse.kt
new file mode 100644
index 0000000..e4336ce
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/AnimeResponse.kt
@@ -0,0 +1,16 @@
+package xyz.adjutor.aniki.presentation.model.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("rank")
+    var rank: Int? = null //added for the search feature (detail)
+
+    @SerializedName("synopsis")
+    var synopsis: String? = null
+
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/SearchAnime.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/SearchAnime.kt
new file mode 100644
index 0000000..7e4340c
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/SearchAnime.kt
@@ -0,0 +1,31 @@
+package xyz.adjutor.aniki.presentation.model.anime
+
+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
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/SearchAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/SearchAnimeResponse.kt
new file mode 100644
index 0000000..d04aa67
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/SearchAnimeResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.presentation.model.anime
+
+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<SearchAnime>
+
+    fun getResults(): List<SearchAnime> {
+        return results
+    }
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/TopAnime.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/TopAnime.kt
new file mode 100644
index 0000000..aefc1c5
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/TopAnime.kt
@@ -0,0 +1,35 @@
+package xyz.adjutor.aniki.presentation.model.anime
+
+import com.google.gson.annotations.SerializedName
+
+//Content of the top field from the api of top anime
+class TopAnime {
+
+    @SerializedName("mal_id")
+    var mal_id: Int? = null
+
+    @SerializedName("rank")
+    var rank: Int? = null
+
+    @SerializedName("title")
+    var title: String? = null
+
+    @SerializedName("url")
+    var url: String? = null
+
+    @SerializedName("episodes")
+    var episodes: Int? = null
+
+    @SerializedName("start_date")
+    var start_date: String? = null
+
+    @SerializedName("end_date")
+    var end_date: String? = null
+
+    @SerializedName("score")
+    var score: Float? = null
+
+    @SerializedName("image_url")
+    var image_url: String? = null
+
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/TopAnimeResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/TopAnimeResponse.kt
new file mode 100644
index 0000000..48e2f8f
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/anime/TopAnimeResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.presentation.model.anime
+
+import com.google.gson.annotations.SerializedName
+
+class TopAnimeResponse {
+
+    @SerializedName("top")
+    var top: List<TopAnime>? = null
+
+    fun getResults(): List<TopAnime> {
+        return top!!
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/MangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/MangaResponse.kt
new file mode 100644
index 0000000..06aeed0
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/MangaResponse.kt
@@ -0,0 +1,22 @@
+package xyz.adjutor.aniki.presentation.model.manga
+
+import com.google.gson.annotations.SerializedName
+
+class MangaResponse { //only kept the infos I didn't have and that were interesting to me.
+
+    @SerializedName("mal_id")
+    var mal_id: Int? = null
+
+    @SerializedName("chapters")
+    var chapters: Int? = null
+
+    @SerializedName("synopsis")
+    var synopsis: String? = null
+
+    @SerializedName("rank")
+    var rank: Int? = null //added for the search feature (detail)
+
+    @SerializedName("background")
+    var background: String? = null //a bit of background story about the manga
+
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/SearchManga.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/SearchManga.kt
new file mode 100644
index 0000000..d69227b
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/SearchManga.kt
@@ -0,0 +1,34 @@
+package xyz.adjutor.aniki.presentation.model.manga
+
+import com.google.gson.annotations.SerializedName
+
+class SearchManga {
+
+    @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("chapters")
+    var chapters: Int? = null
+
+    @SerializedName("volumes")
+    var volumes: 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
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/SearchMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/SearchMangaResponse.kt
new file mode 100644
index 0000000..942c071
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/SearchMangaResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.presentation.model.manga
+
+import com.google.gson.annotations.SerializedName
+
+class SearchMangaResponse { //only kept the infos I didn't have and that were interesting to me.
+
+    @SerializedName("results")
+    private lateinit var results: List<SearchManga>
+
+    fun getResults(): List<SearchManga> {
+        return results
+    }
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/TopManga.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/TopManga.kt
new file mode 100644
index 0000000..4fe3951
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/TopManga.kt
@@ -0,0 +1,36 @@
+package xyz.adjutor.aniki.presentation.model.manga
+
+import com.google.gson.annotations.SerializedName
+
+//model
+//Content of the top field from the api of top manga
+class TopManga {
+
+    @SerializedName("mal_id")
+    var mal_id: Int? = null
+
+    @SerializedName("rank")
+    var rank: Int? = null
+
+    @SerializedName("title")
+    var title: String? = null
+
+    @SerializedName("url")
+    var url: String? = null
+
+    @SerializedName("volumes")
+    var volumes: Int? = null
+
+    @SerializedName("start_date")
+    var start_date: String? = null
+
+    @SerializedName("end_date")
+    var end_date: String? = null
+
+    @SerializedName("score")
+    var score: Float? = null
+
+    @SerializedName("image_url")
+    var image_url: String? = null
+
+}
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/TopMangaResponse.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/TopMangaResponse.kt
new file mode 100644
index 0000000..a0f6b8c
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/model/manga/TopMangaResponse.kt
@@ -0,0 +1,13 @@
+package xyz.adjutor.aniki.presentation.model.manga
+
+import com.google.gson.annotations.SerializedName
+
+class TopMangaResponse {
+
+    @SerializedName("top")
+    private lateinit var top: List<TopManga>
+
+    fun getResults(): List<TopManga> {
+        return top
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchAnimeActivity.kt
deleted file mode 100644
index 68a30de..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchAnimeActivity.kt
+++ /dev/null
@@ -1,156 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-import android.os.Bundle
-import android.widget.ImageView
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-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.AnimeApi
-import xyz.adjutor.aniki.presentation.model.AnimeResponse
-
-class DetailSearchAnimeActivity : AppCompatActivity() {
-
-    private var baseUrl = "https://api.jikan.moe/"
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    //used in the list
-    private val intentAnimeImageUrl = "theanimeimageurl"
-    private val intentAnimeTitle = "theanimetitle"
-    private val intentAnimeScore = "theanimescore"
-
-    //only used for the detail
-    private val intentAnimeId = "theanimeid"
-    private val intentAnimeUrl = "theanimeurl"
-    private val intentAnimeEpisodes = "theanimeepisodes"
-    private val intentAnimeStartDate = "theanimestartdate"
-    private val intentAnimeEndDate = "theanimeenddate"
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_detail_search_anime)
-
-        val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
-        val animeTitle = intent.getStringExtra(intentAnimeTitle)
-        val animeScore = intent.getStringExtra(intentAnimeScore)
-
-        val animeId = intent.getStringExtra(intentAnimeId)
-        val animeUrl = intent.getStringExtra(intentAnimeUrl)
-        val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes)
-        val animeStartDate = intent.getStringExtra(intentAnimeStartDate)
-        val animeEndDate = intent.getStringExtra(intentAnimeEndDate)
-
-
-        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
-        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
-        val tvScore: TextView = findViewById(R.id.tv_detail_score)
-
-        val tvId: TextView = findViewById(R.id.tv_detail_id)
-        val tvUrl: TextView = findViewById(R.id.tv_url)
-        val tvEpisodes: TextView = findViewById(R.id.tv_episodes)
-        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
-        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
-
-        Glide
-            .with(this)
-            .load(animeImageUrl)
-            .apply(RequestOptions().override(400))
-            .into(ivImage)
-        tvTitle.text = animeTitle
-        tvScore.text = animeScore
-
-
-        tvId.text = animeId
-        tvUrl.text = animeUrl
-
-        //using null as a string because it has been converted to a string before
-        tvEpisodes.text = if (animeEpisodes != "null") {
-            animeEpisodes
-        } else {
-            fieldIsNull()
-        }
-
-        tvStartDate.text = splitDate(animeStartDate!!)
-
-        tvEndDate.text = if (animeEndDate != "null") {
-            splitDate(animeEndDate!!)
-        } else {
-            fieldIsNull()
-        }
-
-        makeApiCall(baseUrl, animeId.toString())
-
-    }
-
-    private fun splitDate(animeDate: String): CharSequence {
-        val delimiter = "T"
-        return animeDate
-            .split(delimiter) //split between the date and the time
-            .toTypedArray()[0] //convert it to an array and take the first string
-
-    }
-
-    private fun makeApiCall(
-        BASE_URL: String,
-        animeId: String
-    ) { //we take the rest of the data that we need from the internet
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(AnimeApi::class.java)
-        val call = service.getAnimeData(animeId) //based on the id
-
-        call.enqueue(object : Callback<AnimeResponse> {
-            override fun onResponse(
-                call: Call<AnimeResponse>,
-                response: Response<AnimeResponse>
-            ) {
-                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 AnimeResponse fields
-                    showDetail(anime!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(anime: AnimeResponse) {
-        //elements from AnimeResponse
-        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
-        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-
-        tvSynopsis.text = anime.synopsis.toString()
-
-        tvRank.text = anime.rank.toString()
-
-    }
-
-    fun showError(text: String) {
-        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
-    }
-
-    private fun fieldIsNull(): String {
-        return "Unknown"
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchMangaActivity.kt
deleted file mode 100644
index d96cc70..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailSearchMangaActivity.kt
+++ /dev/null
@@ -1,169 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-import android.os.Bundle
-import android.widget.ImageView
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-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.MangaApi
-import xyz.adjutor.aniki.presentation.model.MangaResponse
-
-class DetailSearchMangaActivity : AppCompatActivity() {
-
-    private var baseUrl = "https://api.jikan.moe/"
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    //used in the list
-    private val intentMangaImageUrl = "themangaimageurl"
-    private val intentMangaTitle = "themangatitle"
-    private val intentMangaScore = "themangascore"
-
-    //only used for the detail
-    private val intentMangaId = "themangaid"
-    private val intentMangaUrl = "themangaurl"
-    private val intentMangaChapters = "themangachapters"
-    private val intentMangaVolumes = "themangavolumes"
-    private val intentMangaStartDate = "themangastartdate"
-    private val intentMangaEndDate = "themangaenddate"
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_detail_search_manga)
-
-        val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
-        val mangaTitle = intent.getStringExtra(intentMangaTitle)
-        val mangaScore = intent.getStringExtra(intentMangaScore)
-
-        val mangaId = intent.getStringExtra(intentMangaId)
-        val mangaUrl = intent.getStringExtra(intentMangaUrl)
-        val mangaChapters = intent.getStringExtra(intentMangaChapters)
-        val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
-        val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
-        val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
-
-
-        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
-        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
-        val tvScore: TextView = findViewById(R.id.tv_detail_score)
-
-        val tvId: TextView = findViewById(R.id.tv_detail_id)
-        val tvUrl: TextView = findViewById(R.id.tv_url)
-        val tvChapters: TextView = findViewById(R.id.tv_chapters)
-        val tvVolumes: TextView = findViewById(R.id.tv_volumes)
-        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
-        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
-
-        Glide
-            .with(this)
-            .load(mangaImageUrl)
-            .apply(RequestOptions().override(400))
-            .into(ivImage)
-        tvTitle.text = mangaTitle
-        tvScore.text = mangaScore
-
-
-        tvId.text = mangaId
-        tvUrl.text = mangaUrl
-
-        //using null as a string because it has been converted to a string before
-        tvChapters.text = if (mangaChapters != "null") {
-            mangaChapters
-        } else {
-            fieldIsNull()
-        }
-
-        tvVolumes.text = if (mangaVolumes != "null") {
-            mangaVolumes
-        } else {
-            fieldIsNull()
-        }
-
-        tvStartDate.text = splitDate(mangaStartDate!!)
-
-        tvEndDate.text = if (mangaEndDate != "null") {
-            splitDate(mangaEndDate!!)
-        } else {
-            fieldIsNull()
-        }
-
-        makeApiCall(baseUrl, mangaId.toString())
-
-    }
-
-    private fun splitDate(mangaDate: String): CharSequence {
-        val delimiter = "T"
-        return mangaDate
-            .split(delimiter) //split between the date and the time
-            .toTypedArray()[0] //convert it to an array and take the first string
-
-    }
-
-    private fun makeApiCall(BASE_URL: String, mangaId: String) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(MangaApi::class.java)
-        val call = service.getMangaData(mangaId) //based on the id
-
-        call.enqueue(object : Callback<MangaResponse> {
-            override fun onResponse(
-                call: Call<MangaResponse>,
-                response: Response<MangaResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val manga = response.body() //getting the MangaResponse fields
-                    showDetail(manga!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(manga: MangaResponse) {
-        //elements from MangaResponse
-        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
-        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-        val tvBackground: TextView = findViewById(R.id.tv_background)
-
-        tvSynopsis.text = manga.synopsis.toString()
-
-        tvRank.text = manga.rank.toString()
-
-        tvBackground.text = if (manga.background != null) {
-            manga.background.toString()
-        } else {
-            fieldIsNull()
-        }
-
-    }
-
-    fun showError(text: String) {
-        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
-    }
-
-    private fun fieldIsNull(): String {
-        return "Unknown"
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopAnimeActivity.kt
deleted file mode 100644
index 3ec6ab6..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopAnimeActivity.kt
+++ /dev/null
@@ -1,176 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.widget.ImageView
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import com.google.gson.GsonBuilder
-import com.google.gson.reflect.TypeToken
-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.AnimeApi
-import xyz.adjutor.aniki.presentation.model.AnimeResponse
-import java.lang.reflect.Type
-
-class DetailTopAnimeActivity : AppCompatActivity() {
-
-    private var baseUrl = "https://api.jikan.moe/"
-    private lateinit var sharedPreferences: SharedPreferences
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    private val intentAnimeId = "theanimeid"
-    private val intentAnimeTitle = "theanimetitle"
-    private val intentAnimeRank = "theanimerank"
-    private val intentAnimeScore = "theanimescore"
-    private val intentAnimeImageUrl = "theanimeimageurl"
-
-    private val intentAnimeEpisodes = "theanimeepisodes"
-    private val intentAnimeStartDate = "theanimestartdate"
-    private val intentAnimeEndDate = "theanimeenddate"
-    private val intentAnimeUrl = "theanimeurl"
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_detail_top_anime)
-
-        sharedPreferences = this.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
-
-        val animeId = intent.getStringExtra(intentAnimeId)
-        val animeTitle = intent.getStringExtra(intentAnimeTitle)
-        val animeRank = intent.getStringExtra(intentAnimeRank)
-        val animeScore = intent.getStringExtra(intentAnimeScore)
-        val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
-
-        val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes)
-        val animeStartDate = intent.getStringExtra(intentAnimeStartDate)
-        val animeEndDate = intent.getStringExtra(intentAnimeEndDate)
-        val animeUrl = intent.getStringExtra(intentAnimeUrl)
-
-        val tvId: TextView = findViewById(R.id.tv_detail_id)
-        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
-        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-        val tvScore: TextView = findViewById(R.id.tv_detail_score)
-        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
-
-        val tvEpisodes: TextView = findViewById(R.id.tv_episodes)
-        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
-        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
-        val tvUrl: TextView = findViewById(R.id.tv_url)
-
-        tvId.text = animeId
-        tvTitle.text = animeTitle
-        tvRank.text = animeRank
-        tvScore.text = animeScore
-        Glide
-            .with(this)
-            .load(animeImageUrl)
-            .apply(RequestOptions().override(400))
-            .into(ivImage)
-
-        //using null as a string because it has been converted to a string before
-        tvEpisodes.text = if (animeEpisodes != "null") {
-            animeEpisodes
-        } else {
-            fieldIsNull()
-        }
-
-        tvStartDate.text = animeStartDate
-
-        tvEndDate.text = if (animeEndDate != "null") {
-            animeEndDate
-        } else {
-            fieldIsNull()
-        }
-
-        tvUrl.text = animeUrl
-
-        val anime: AnimeResponse? = getDataFromCache(animeId.toString())
-        if (anime != null) {
-            showDetail(anime)
-        } else {
-            //taking the API's fields I want and displaying them
-            makeApiCall(baseUrl, animeId.toString())
-        }
-
-    }
-
-    private fun getDataFromCache(animeId: String): AnimeResponse? {
-        val jsonAnime: String? = sharedPreferences.getString(animeId, null)
-
-        return if (jsonAnime == null) {
-            null
-        } else {
-            val type: Type = object : TypeToken<AnimeResponse>() {}.type
-            gson.fromJson(jsonAnime, type)
-        }
-    }
-
-    private fun makeApiCall(BASE_URL: String, animeId: String) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(AnimeApi::class.java)
-        val call = service.getAnimeData(animeId) //based on the id
-
-        call.enqueue(object : Callback<AnimeResponse> {
-            override fun onResponse(
-                call: Call<AnimeResponse>,
-                response: Response<AnimeResponse>
-            ) {
-                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 AnimeResponse fields
-                    saveList(anime)
-                    showDetail(anime!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(anime: AnimeResponse) {
-        //elements from AnimeResponse
-        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
-
-        tvSynopsis.text = anime.synopsis.toString()
-
-    }
-
-    fun showError(text: String) {
-        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
-    }
-
-    private fun fieldIsNull(): String {
-        return "Unknown"
-    }
-
-    fun saveList(anime: AnimeResponse?) {
-        val jsonString: String = gson.toJson(anime)
-
-        sharedPreferences
-            .edit()
-            .putString(anime?.mal_id.toString(), jsonString)
-            .apply()
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopMangaActivity.kt
deleted file mode 100644
index 0142018..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/DetailTopMangaActivity.kt
+++ /dev/null
@@ -1,193 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.widget.ImageView
-import android.widget.TextView
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import com.google.gson.GsonBuilder
-import com.google.gson.reflect.TypeToken
-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.MangaApi
-import xyz.adjutor.aniki.presentation.model.MangaResponse
-import java.lang.reflect.Type
-
-class DetailTopMangaActivity : AppCompatActivity() {
-
-    private var baseUrl = "https://api.jikan.moe/"
-    private lateinit var sharedPreferences: SharedPreferences
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    //used in the list
-    private val intentMangaTitle = "themangatitle"
-    private val intentMangaRank = "themangarank"
-    private val intentMangaScore = "themangascore"
-    private val intentMangaImageUrl = "themangaimageurl"
-
-    //only used for the detail
-    private val intentMangaId = "themangaid"
-    private val intentMangaVolumes = "themangavolumes"
-    private val intentMangaStartDate = "themangastartdate"
-    private val intentMangaEndDate = "themangaenddate"
-    private val intentMangaUrl = "themangaurl"
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_detail_top_manga)
-
-        sharedPreferences = this.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
-
-        val mangaTitle = intent.getStringExtra(intentMangaTitle)
-        val mangaRank = intent.getStringExtra(intentMangaRank)
-        val mangaScore = intent.getStringExtra(intentMangaScore)
-        val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
-
-        val mangaId = intent.getStringExtra(intentMangaId)
-        val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
-        val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
-        val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
-        val mangaUrl = intent.getStringExtra(intentMangaUrl)
-
-        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
-        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-        val tvScore: TextView = findViewById(R.id.tv_detail_score)
-        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
-
-        val tvId: TextView = findViewById(R.id.tv_detail_id)
-        val tvVolumes: TextView = findViewById(R.id.tv_volumes)
-        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
-        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
-        val tvUrl: TextView = findViewById(R.id.tv_url)
-
-        tvTitle.text = mangaTitle
-        tvRank.text = mangaRank
-        tvScore.text = mangaScore
-        Glide
-            .with(this)
-            .load(mangaImageUrl)
-            .apply(RequestOptions().override(400))
-            .into(ivImage)
-
-        tvId.text = mangaId
-
-        //using null as a string because it has been converted to a string before
-        tvVolumes.text = if (mangaVolumes != "null") {
-            mangaVolumes
-        } else {
-            fieldIsNull()
-        }
-
-        tvStartDate.text = mangaStartDate
-
-        tvEndDate.text = if (mangaEndDate != "null") {
-            mangaEndDate
-        } else {
-            fieldIsNull()
-        }
-
-        tvUrl.text = mangaUrl
-
-        val manga: MangaResponse? = getDataFromCache(mangaId.toString())
-        if (manga != null) {
-            showDetail(manga)
-        } else {
-            //taking the API's fields I want and displaying them
-            makeApiCall(baseUrl, mangaId.toString())
-        }
-
-    }
-
-    private fun getDataFromCache(mangaId: String): MangaResponse? {
-        val jsonManga: String? = sharedPreferences.getString(mangaId, null)
-
-        return if (jsonManga == null) {
-            null
-        } else {
-            val type: Type = object : TypeToken<MangaResponse>() {}.type
-            gson.fromJson(jsonManga, type)
-        }
-    }
-
-    private fun makeApiCall(BASE_URL: String, mangaId: String) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(MangaApi::class.java)
-        val call = service.getMangaData(mangaId) //based on the id
-
-        call.enqueue(object : Callback<MangaResponse> {
-            override fun onResponse(
-                call: Call<MangaResponse>,
-                response: Response<MangaResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val manga = response.body() //getting the MangaResponse fields
-                    saveList(manga)
-                    showDetail(manga!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(manga: MangaResponse) {
-        //elements from MangaResponse
-        val tvChapters: TextView = findViewById(R.id.tv_chapters)
-        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
-        val tvBackground: TextView = findViewById(R.id.tv_background)
-
-        tvChapters.text = if (manga.chapters != null) {
-            manga.chapters.toString()
-        } else {
-            fieldIsNull()
-        }
-
-        tvSynopsis.text = manga.synopsis.toString()
-
-        tvBackground.text = if (manga.background != null) {
-            manga.background.toString()
-        } else {
-            fieldIsNull()
-        }
-
-    }
-
-    fun showError(text: String) {
-        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
-    }
-
-    private fun fieldIsNull(): String {
-        return "Unknown"
-    }
-
-    fun saveList(manga: MangaResponse?) {
-        val jsonString: String = gson.toJson(manga)
-
-        sharedPreferences
-            .edit()
-            .putString(manga?.mal_id.toString(), jsonString)
-            .apply()
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt
index f2abca1..d740dba 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt
@@ -8,9 +8,12 @@ import android.widget.Button
 import androidx.fragment.app.Fragment
 import androidx.navigation.fragment.findNavController
 import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.presentation.controller.MainController
 
 class HomePage : Fragment() {
 
+    lateinit var controller: MainController
+
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
         savedInstanceState: Bundle?
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/MainActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/MainActivity.kt
index bff89e4..e58737a 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/MainActivity.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/MainActivity.kt
@@ -6,6 +6,7 @@ import xyz.adjutor.aniki.R
 
 class MainActivity : AppCompatActivity() {
 
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimeAdapter.kt
deleted file mode 100644
index e938473..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimeAdapter.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-import android.content.Intent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.cardview.widget.CardView
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.presentation.model.SearchAnime
-
-class SearchAnimeAdapter(private val animeList: List<SearchAnime>) :
-    RecyclerView.Adapter<SearchAnimeAdapter.AnimeViewHolder>() {
-
-    // Describes an item view and its place within the RecyclerView
-    class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val animeTitle: TextView = itemView.findViewById(R.id.tv_title)
-        val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
-        val animeScore: TextView = itemView.findViewById(R.id.tv_score)
-        val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
-        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
-    }
-
-    // Returns a new ViewHolder
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
-        val view = LayoutInflater.from(parent.context)
-            .inflate(R.layout.item_layout, parent, false)
-
-        return AnimeViewHolder(view)
-    }
-
-    // Returns size of data list
-    override fun getItemCount(): Int {
-        return animeList.size
-    }
-
-    // Displays data at a certain position
-    override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
-        val currentAnime: SearchAnime = animeList[position]
-        holder.animeTitle.text = currentAnime.title
-        holder.animeRank.text = "" //the rank isn't supplied by this API
-        holder.animeScore.text = currentAnime.score.toString()
-        val image: String = currentAnime.image_url.toString()
-        Glide
-            .with(holder.itemView.context)
-            .load(image)
-            .apply(RequestOptions().override(400))
-            .into(holder.animeImage)
-
-        //when you click on a selected cardview, some datas are sent to the other activity
-        holder.cardview.setOnClickListener {
-            val currentAnimeId = "theanimeid"
-            val currentAnimeUrl = "theanimeurl"
-            val currentAnimeImageUrl = "theanimeimageurl"
-            val currentAnimeTitle = "theanimetitle"
-            val currentAnimeEpisodes = "theanimeepisodes"
-            val currentAnimeScore = "theanimescore"
-            val currentAnimeStartDate = "theanimestartdate"
-            val currentAnimeEndDate = "theanimeenddate"
-
-            //intent is used to pass data to another activity
-
-            val intent: Intent =
-                Intent(holder.itemView.context, DetailSearchAnimeActivity::class.java).apply {
-                    putExtra(currentAnimeId, currentAnime.mal_id.toString())
-                    putExtra(currentAnimeUrl, currentAnime.url.toString())
-                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
-                    putExtra(currentAnimeTitle, currentAnime.title)
-                    putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
-                    putExtra(currentAnimeScore, currentAnime.score.toString())
-                    putExtra(currentAnimeStartDate, currentAnime.start_date)
-                    putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
-                }
-            holder.itemView.context.startActivity(intent)
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimePage.kt
deleted file mode 100644
index d2cf795..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchAnimePage.kt
+++ /dev/null
@@ -1,136 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-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
-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.SearchAnimeApi
-import xyz.adjutor.aniki.presentation.model.SearchAnime
-import xyz.adjutor.aniki.presentation.model.SearchAnimeResponse
-
-class SearchAnimePage : 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_anime_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_SearchAnimePage_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(TextView.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, animeList: List<SearchAnime>) {
-        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
-        recyclerView.setHasFixedSize(true)
-        recyclerView.layoutManager = LinearLayoutManager(view.context)
-        recyclerView.adapter = SearchAnimeAdapter(animeList)
-        (recyclerView.adapter as SearchAnimeAdapter).notifyDataSetChanged()
-    }
-
-    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(SearchAnimeApi::class.java)
-        val call = service.getSearchAnimeData(q = query) //fate is an exemple, we'll have to replace it by the user input.
-
-        call.enqueue(object : Callback<SearchAnimeResponse> {
-            override fun onResponse(
-                call: Call<SearchAnimeResponse>,
-                response: Response<SearchAnimeResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val animeList: List<SearchAnime> = response.body()!!
-                        .getResults() //getting the "search" field containing our list of SearchAnimes
-
-                    showList(
-                        view,
-                        animeList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<SearchAnimeResponse>, t: Throwable) {
-                showError()
-            }
-
-        })
-    }
-
-    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
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaAdapter.kt
deleted file mode 100644
index 061eafc..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaAdapter.kt
+++ /dev/null
@@ -1,84 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-import android.content.Intent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.cardview.widget.CardView
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.presentation.model.SearchManga
-
-class SearchMangaAdapter(private val mangaList: List<SearchManga>) :
-    RecyclerView.Adapter<SearchMangaAdapter.MangaViewHolder>() {
-
-    // Describes an item view and its place within the RecyclerView
-    class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val mangaTitle: TextView = itemView.findViewById(R.id.tv_title)
-        val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
-        val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
-        val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
-        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
-    }
-
-    // Returns a new ViewHolder
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
-        val view = LayoutInflater.from(parent.context)
-            .inflate(R.layout.item_layout, parent, false)
-
-        return MangaViewHolder(view)
-    }
-
-    // Returns size of data list
-    override fun getItemCount(): Int {
-        return mangaList.size
-    }
-
-    // Displays data at a certain position
-    override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
-        val currentManga: SearchManga = mangaList[position]
-        holder.mangaTitle.text = currentManga.title
-        holder.mangaRank.text = "" //the rank isn't supplied by this API
-        holder.mangaScore.text = currentManga.score.toString()
-        val image: String = currentManga.image_url.toString()
-        Glide
-            .with(holder.itemView.context)
-            .load(image)
-            .apply(RequestOptions().override(400))
-            .into(holder.mangaImage)
-
-        //when you click on a selected cardview, some datas are sent to the other activity
-        holder.cardview.setOnClickListener {
-            val currentMangaId = "themangaid"
-            val currentMangaUrl = "themangaurl"
-            val currentMangaImageUrl = "themangaimageurl"
-            val currentMangaTitle = "themangatitle"
-            val currentMangaChapters = "themangachapters"
-            val currentMangaVolumes = "themangavolumes"
-            val currentMangaScore = "themangascore"
-            val currentMangaStartDate = "themangastartdate"
-            val currentMangaEndDate = "themangaenddate"
-
-            //intent is used to pass data to another activity
-
-            val intent: Intent =
-                Intent(holder.itemView.context, DetailSearchMangaActivity::class.java).apply {
-                    putExtra(currentMangaId, currentManga.mal_id.toString())
-                    putExtra(currentMangaUrl, currentManga.url.toString())
-                    putExtra(currentMangaImageUrl, currentManga.image_url.toString())
-                    putExtra(currentMangaTitle, currentManga.title)
-                    putExtra(currentMangaChapters, currentManga.chapters.toString())
-                    putExtra(currentMangaVolumes, currentManga.volumes.toString())
-                    putExtra(currentMangaScore, currentManga.score.toString())
-                    putExtra(currentMangaStartDate, currentManga.start_date)
-                    putExtra(currentMangaEndDate, currentManga.end_date.toString())
-                }
-            holder.itemView.context.startActivity(intent)
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaPage.kt
deleted file mode 100644
index 7d7fa74..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/SearchMangaPage.kt
+++ /dev/null
@@ -1,144 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-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.SearchMangaApi
-import xyz.adjutor.aniki.presentation.model.SearchManga
-import xyz.adjutor.aniki.presentation.model.SearchMangaResponse
-
-
-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
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimeAdapter.kt
deleted file mode 100644
index b1b336a..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimeAdapter.kt
+++ /dev/null
@@ -1,81 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-import android.content.Intent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.cardview.widget.CardView
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.presentation.model.TopAnime
-
-class TopAnimeAdapter(private val animeList: List<TopAnime>) :
-    RecyclerView.Adapter<TopAnimeAdapter.AnimeViewHolder>() {
-
-    // Describes an item view and its place within the RecyclerView
-    class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val animeTitle: TextView = itemView.findViewById(R.id.tv_title)
-        val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
-        val animeScore: TextView = itemView.findViewById(R.id.tv_score)
-        val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
-        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
-    }
-
-    // Returns a new ViewHolder
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
-        val view = LayoutInflater.from(parent.context)
-            .inflate(R.layout.item_layout, parent, false)
-
-        return AnimeViewHolder(view)
-    }
-
-    // Returns size of data list
-    override fun getItemCount(): Int {
-        return animeList.size
-    }
-
-    // Displays data at a certain position
-    override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
-        val currentAnime: TopAnime = animeList[position]
-        holder.animeTitle.text = currentAnime.title
-        holder.animeRank.text = currentAnime.rank.toString()
-        holder.animeScore.text = currentAnime.score.toString()
-        val image: String = currentAnime.image_url.toString()
-        Glide
-            .with(holder.itemView.context)
-            .load(image)
-            .apply(RequestOptions().override(400))
-            .into(holder.animeImage)
-
-        //when you click on a selected cardview, some datas are sent to the other activity
-        holder.cardview.setOnClickListener {
-            val currentAnimeId = "theanimeid"
-            val currentAnimeTitle = "theanimetitle"
-            val currentAnimeRank = "theanimerank"
-            val currentAnimeScore = "theanimescore"
-            val currentAnimeImageUrl = "theanimeimageurl"
-            val currentAnimeEpisodes = "theanimeepisodes"
-            val currentAnimeStartDate = "theanimestartdate"
-            val currentAnimeEndDate = "theanimeenddate"
-            val currentAnimeUrl = "theanimeurl"
-
-            val intent: Intent =
-                Intent(holder.itemView.context, DetailTopAnimeActivity::class.java).apply {
-                    putExtra(currentAnimeId, currentAnime.mal_id.toString())
-                    putExtra(currentAnimeTitle, currentAnime.title)
-                    putExtra(currentAnimeRank, currentAnime.rank.toString())
-                    putExtra(currentAnimeScore, currentAnime.score.toString())
-                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
-                    putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
-                    putExtra(currentAnimeStartDate, currentAnime.start_date)
-                    putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
-                    putExtra(currentAnimeUrl, currentAnime.url.toString())
-                }
-            holder.itemView.context.startActivity(intent)
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimePage.kt
deleted file mode 100644
index 8a7ef08..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopAnimePage.kt
+++ /dev/null
@@ -1,176 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.findNavController
-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
-import retrofit2.Callback
-import retrofit2.Response
-import retrofit2.Retrofit
-import retrofit2.converter.gson.GsonConverterFactory
-import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.data.TopAnimeApi
-import xyz.adjutor.aniki.presentation.model.TopAnime
-import xyz.adjutor.aniki.presentation.model.TopAnimeResponse
-import java.lang.reflect.Type
-
-class TopAnimePage : Fragment() {
-
-    private lateinit var sharedPreferences: SharedPreferences
-    val gson: Gson = GsonBuilder()
-        .setLenient()
-        .create()
-    var baseUrl = "https://api.jikan.moe/" //the api's base url
-    var page: Int = 1
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View? {
-        // Inflate the layout for this fragment
-        val view = inflater.inflate(R.layout.top_anime_page, container, false)
-
-        sharedPreferences = view.context.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
-
-        val animeList: List<TopAnime>? = getDataFromCache()
-        if (animeList != null) {
-            showList(view, animeList)
-        } else {
-            makeApiCall(view, baseUrl, 1)
-        }
-
-        return view
-
-    }
-
-    private fun getDataFromCache(): List<TopAnime>? {
-        //the value of the animeList json, if nothing is found, return null
-        val jsonAnime: String? = sharedPreferences.getString("jsonAnimeList", null)
-
-        //if it's null, well, return null
-        return if (jsonAnime == null) {
-            null
-        } else { //else deserialize the list and return it
-            val listType: Type = object : TypeToken<List<TopAnime>>() {}.type
-            gson.fromJson(jsonAnime, listType)
-        }
-    }
-
-    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_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, 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
-        }
-
-    }
-
-    //display the recyclerview
-    fun showList(view: View, animeList: List<TopAnime>) {
-        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
-        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, page: Int) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(TopAnimeApi::class.java)
-        val call = service.getTopAnimeData(page)
-
-        call.enqueue(object : Callback<TopAnimeResponse> {
-            override fun onResponse(
-                call: Call<TopAnimeResponse>,
-                response: Response<TopAnimeResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val animeList: List<TopAnime> = response.body()!!
-                        .getResults() //getting the "top" field containing our list of TopAnimes
-                    saveList(animeList)
-                    showList(
-                        view,
-                        animeList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<TopAnimeResponse>, t: Throwable) {
-                showError()
-            }
-
-        })
-    }
-
-    private fun saveList(animeList: List<TopAnime>) {
-        val jsonString: String = gson.toJson(animeList)
-
-        sharedPreferences
-            .edit()
-            .putString("jsonAnimeList", jsonString)
-            .apply()
-    }
-
-    private fun showError() {
-        Snackbar.make(
-            requireView(),
-            "API ERROR : Verify your internet connection.",
-            Snackbar.LENGTH_LONG
-        )
-            .setAction("Action", null).show()
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaAdapter.kt
deleted file mode 100644
index fac3730..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaAdapter.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-import android.content.Intent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
-import androidx.cardview.widget.CardView
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.presentation.model.TopManga
-
-class TopMangaAdapter(private val mangaList: List<TopManga>) :
-    RecyclerView.Adapter<TopMangaAdapter.MangaViewHolder>() {
-
-    // Describes an item view and its place within the RecyclerView
-    class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        val mangaTitle: TextView = itemView.findViewById(R.id.tv_title)
-        val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
-        val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
-        val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
-        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
-    }
-
-    // Returns a new ViewHolder
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
-        val view = LayoutInflater.from(parent.context)
-            .inflate(R.layout.item_layout, parent, false)
-
-        return MangaViewHolder(view)
-    }
-
-    // Returns size of data list
-    override fun getItemCount(): Int {
-        return mangaList.size
-    }
-
-    // Displays data at a certain position
-    override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
-        val currentManga: TopManga = mangaList[position]
-        holder.mangaTitle.text = currentManga.title
-        holder.mangaRank.text = currentManga.rank.toString()
-        holder.mangaScore.text = currentManga.score.toString()
-        val image: String = currentManga.image_url.toString()
-        Glide
-            .with(holder.itemView.context)
-            .load(image)
-            .apply(RequestOptions().override(400))
-            .into(holder.mangaImage)
-
-        //when you click on a selected cardview, some datas are sent to the other activity
-        holder.cardview.setOnClickListener {
-            val currentMangaId = "themangaid"
-            val currentMangaTitle = "themangatitle"
-            val currentMangaRank = "themangarank"
-            val currentMangaScore = "themangascore"
-            val currentMangaImageUrl = "themangaimageurl"
-            val currentMangaVolumes = "themangavolumes"
-            val currentMangaStartDate = "themangastartdate"
-            val currentMangaEndDate = "themangaenddate"
-            val currentMangaUrl = "themangaurl"
-
-            //intent is used to pass data to another activity
-            val intent: Intent =
-                Intent(holder.itemView.context, DetailTopMangaActivity::class.java).apply {
-                    putExtra(currentMangaId, currentManga.mal_id.toString())
-                    putExtra(currentMangaTitle, currentManga.title)
-                    putExtra(currentMangaRank, currentManga.rank.toString())
-                    putExtra(currentMangaScore, currentManga.score.toString())
-                    putExtra(currentMangaImageUrl, currentManga.image_url.toString())
-                    putExtra(currentMangaVolumes, currentManga.volumes.toString())
-                    putExtra(currentMangaStartDate, currentManga.start_date)
-                    putExtra(currentMangaEndDate, currentManga.end_date.toString())
-                    putExtra(currentMangaUrl, currentManga.url.toString())
-                }
-            holder.itemView.context.startActivity(intent)
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaPage.kt
deleted file mode 100644
index 2bf84e8..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/TopMangaPage.kt
+++ /dev/null
@@ -1,177 +0,0 @@
-package xyz.adjutor.aniki.presentation.view
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.findNavController
-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
-import retrofit2.Callback
-import retrofit2.Response
-import retrofit2.Retrofit
-import retrofit2.converter.gson.GsonConverterFactory
-import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.data.TopMangaApi
-import xyz.adjutor.aniki.presentation.model.TopManga
-import xyz.adjutor.aniki.presentation.model.TopMangaResponse
-import java.lang.reflect.Type
-
-class TopMangaPage : Fragment() {
-
-    private lateinit var sharedPreferences: SharedPreferences
-    val gson: Gson = GsonBuilder()
-        .setLenient()
-        .create()
-    private var baseUrl = "https://api.jikan.moe/" //the api's base url
-    var page: Int = 1
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View? {
-        // Inflate the layout for this fragment
-        val view = inflater.inflate(R.layout.top_manga_page, container, false)
-
-        sharedPreferences = view.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
-
-        val mangaList: List<TopManga>? = getDataFromCache()
-        if (mangaList != null) {
-            showList(view, mangaList)
-        } else {
-            makeApiCall(view, baseUrl, 1)
-        }
-
-        return view
-
-    }
-
-    private fun getDataFromCache(): List<TopManga>? {
-        //the value of the mangaList json, if nothing is found, return null
-        val jsonManga: String? = sharedPreferences.getString("jsonMangaList", null)
-
-        //if it's null, well, return null
-        return if (jsonManga == null) {
-            null
-        } else { //else deserialize the list and return it
-            val listType: Type = object : TypeToken<List<TopManga>>() {}.type
-            gson.fromJson(jsonManga, listType)
-        }
-    }
-
-    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_TopMangaPage_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, 1)
-            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_SHORT)
-                .setAction("Action", null).show()
-        }
-
-        //refresh when swiping down at the top of the page
-        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
-        swipeRefresh.setOnRefreshListener {
-            updateList()
-            page = 1
-            swipeRefresh.isRefreshing = false
-        }
-
-    }
-
-    //display the recyclerview
-    fun showList(view: View, mangaList: List<TopManga>) {
-        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
-        recyclerView.setHasFixedSize(true)
-        recyclerView.layoutManager = LinearLayoutManager(view.context)
-        recyclerView.adapter = TopMangaAdapter(mangaList)
-        (recyclerView.adapter as TopMangaAdapter).notifyDataSetChanged()
-    }
-
-    private fun makeApiCall(view: View, BASE_URL: String, page: Int) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(TopMangaApi::class.java)
-        val call = service.getTopMangaData(page)
-
-        call.enqueue(object : Callback<TopMangaResponse> {
-            override fun onResponse(
-                call: Call<TopMangaResponse>,
-                response: Response<TopMangaResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val mangaList: List<TopManga> = response.body()!!
-                        .getResults() //getting the "top" field containing our list of TopMangas
-                    saveList(mangaList)
-                    showList(
-                        view,
-                        mangaList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<TopMangaResponse>, t: Throwable) {
-                showError()
-            }
-
-        })
-    }
-
-    private fun saveList(mangaList: List<TopManga>) {
-        val jsonString: String = gson.toJson(mangaList)
-
-        sharedPreferences
-            .edit()
-            .putString("jsonMangaList", jsonString)
-            .apply()
-    }
-
-    private fun showError() {
-        Snackbar.make(
-            requireView(),
-            "API ERROR : Verify your internet connection.",
-            Snackbar.LENGTH_LONG
-        )
-            .setAction("Action", null).show()
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailSearchAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailSearchAnimeActivity.kt
new file mode 100644
index 0000000..f9d1325
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailSearchAnimeActivity.kt
@@ -0,0 +1,156 @@
+package xyz.adjutor.aniki.presentation.view.anime
+
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+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.anime.AnimeApi
+import xyz.adjutor.aniki.presentation.model.anime.AnimeResponse
+
+class DetailSearchAnimeActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    private val gson = GsonBuilder()
+        .setLenient()
+        .create()
+
+    //used in the list
+    private val intentAnimeImageUrl = "theanimeimageurl"
+    private val intentAnimeTitle = "theanimetitle"
+    private val intentAnimeScore = "theanimescore"
+
+    //only used for the detail
+    private val intentAnimeId = "theanimeid"
+    private val intentAnimeUrl = "theanimeurl"
+    private val intentAnimeEpisodes = "theanimeepisodes"
+    private val intentAnimeStartDate = "theanimestartdate"
+    private val intentAnimeEndDate = "theanimeenddate"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_search_anime)
+
+        val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
+        val animeTitle = intent.getStringExtra(intentAnimeTitle)
+        val animeScore = intent.getStringExtra(intentAnimeScore)
+
+        val animeId = intent.getStringExtra(intentAnimeId)
+        val animeUrl = intent.getStringExtra(intentAnimeUrl)
+        val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes)
+        val animeStartDate = intent.getStringExtra(intentAnimeStartDate)
+        val animeEndDate = intent.getStringExtra(intentAnimeEndDate)
+
+
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+        val tvEpisodes: TextView = findViewById(R.id.tv_episodes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+
+        Glide
+            .with(this)
+            .load(animeImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+        tvTitle.text = animeTitle
+        tvScore.text = animeScore
+
+
+        tvId.text = animeId
+        tvUrl.text = animeUrl
+
+        //using null as a string because it has been converted to a string before
+        tvEpisodes.text = if (animeEpisodes != "null") {
+            animeEpisodes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = splitDate(animeStartDate!!)
+
+        tvEndDate.text = if (animeEndDate != "null") {
+            splitDate(animeEndDate!!)
+        } else {
+            fieldIsNull()
+        }
+
+        makeApiCall(baseUrl, animeId.toString())
+
+    }
+
+    private fun splitDate(animeDate: String): CharSequence {
+        val delimiter = "T"
+        return animeDate
+            .split(delimiter) //split between the date and the time
+            .toTypedArray()[0] //convert it to an array and take the first string
+
+    }
+
+    private fun makeApiCall(
+        BASE_URL: String,
+        animeId: String
+    ) { //we take the rest of the data that we need from the internet
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(AnimeApi::class.java)
+        val call = service.getAnimeData(animeId) //based on the id
+
+        call.enqueue(object : Callback<AnimeResponse> {
+            override fun onResponse(
+                call: Call<AnimeResponse>,
+                response: Response<AnimeResponse>
+            ) {
+                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 AnimeResponse fields
+                    showDetail(anime!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(anime: AnimeResponse) {
+        //elements from AnimeResponse
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+
+        tvSynopsis.text = anime.synopsis.toString()
+
+        tvRank.text = anime.rank.toString()
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+
+    private fun fieldIsNull(): String {
+        return "Unknown"
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailTopAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailTopAnimeActivity.kt
new file mode 100644
index 0000000..54c34d5
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailTopAnimeActivity.kt
@@ -0,0 +1,176 @@
+package xyz.adjutor.aniki.presentation.view.anime
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+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.anime.AnimeApi
+import xyz.adjutor.aniki.presentation.model.anime.AnimeResponse
+import java.lang.reflect.Type
+
+class DetailTopAnimeActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    private lateinit var sharedPreferences: SharedPreferences
+    private val gson = GsonBuilder()
+        .setLenient()
+        .create()
+
+    private val intentAnimeId = "theanimeid"
+    private val intentAnimeTitle = "theanimetitle"
+    private val intentAnimeRank = "theanimerank"
+    private val intentAnimeScore = "theanimescore"
+    private val intentAnimeImageUrl = "theanimeimageurl"
+
+    private val intentAnimeEpisodes = "theanimeepisodes"
+    private val intentAnimeStartDate = "theanimestartdate"
+    private val intentAnimeEndDate = "theanimeenddate"
+    private val intentAnimeUrl = "theanimeurl"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_top_anime)
+
+        sharedPreferences = this.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
+
+        val animeId = intent.getStringExtra(intentAnimeId)
+        val animeTitle = intent.getStringExtra(intentAnimeTitle)
+        val animeRank = intent.getStringExtra(intentAnimeRank)
+        val animeScore = intent.getStringExtra(intentAnimeScore)
+        val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
+
+        val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes)
+        val animeStartDate = intent.getStringExtra(intentAnimeStartDate)
+        val animeEndDate = intent.getStringExtra(intentAnimeEndDate)
+        val animeUrl = intent.getStringExtra(intentAnimeUrl)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+
+        val tvEpisodes: TextView = findViewById(R.id.tv_episodes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+
+        tvId.text = animeId
+        tvTitle.text = animeTitle
+        tvRank.text = animeRank
+        tvScore.text = animeScore
+        Glide
+            .with(this)
+            .load(animeImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+
+        //using null as a string because it has been converted to a string before
+        tvEpisodes.text = if (animeEpisodes != "null") {
+            animeEpisodes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = animeStartDate
+
+        tvEndDate.text = if (animeEndDate != "null") {
+            animeEndDate
+        } else {
+            fieldIsNull()
+        }
+
+        tvUrl.text = animeUrl
+
+        val anime: AnimeResponse? = getDataFromCache(animeId.toString())
+        if (anime != null) {
+            showDetail(anime)
+        } else {
+            //taking the API's fields I want and displaying them
+            makeApiCall(baseUrl, animeId.toString())
+        }
+
+    }
+
+    private fun getDataFromCache(animeId: String): AnimeResponse? {
+        val jsonAnime: String? = sharedPreferences.getString(animeId, null)
+
+        return if (jsonAnime == null) {
+            null
+        } else {
+            val type: Type = object : TypeToken<AnimeResponse>() {}.type
+            gson.fromJson(jsonAnime, type)
+        }
+    }
+
+    private fun makeApiCall(BASE_URL: String, animeId: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(AnimeApi::class.java)
+        val call = service.getAnimeData(animeId) //based on the id
+
+        call.enqueue(object : Callback<AnimeResponse> {
+            override fun onResponse(
+                call: Call<AnimeResponse>,
+                response: Response<AnimeResponse>
+            ) {
+                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 AnimeResponse fields
+                    saveList(anime)
+                    showDetail(anime!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(anime: AnimeResponse) {
+        //elements from AnimeResponse
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+
+        tvSynopsis.text = anime.synopsis.toString()
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+
+    private fun fieldIsNull(): String {
+        return "Unknown"
+    }
+
+    fun saveList(anime: AnimeResponse?) {
+        val jsonString: String = gson.toJson(anime)
+
+        sharedPreferences
+            .edit()
+            .putString(anime?.mal_id.toString(), jsonString)
+            .apply()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimeAdapter.kt
new file mode 100644
index 0000000..3bb875b
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimeAdapter.kt
@@ -0,0 +1,82 @@
+package xyz.adjutor.aniki.presentation.view.anime
+
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.presentation.model.anime.SearchAnime
+
+class SearchAnimeAdapter(private val animeList: List<SearchAnime>) :
+    RecyclerView.Adapter<SearchAnimeAdapter.AnimeViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val animeTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val animeScore: TextView = itemView.findViewById(R.id.tv_score)
+        val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_layout, parent, false)
+
+        return AnimeViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return animeList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
+        val currentAnime: SearchAnime = animeList[position]
+        holder.animeTitle.text = currentAnime.title
+        holder.animeRank.text = "" //the rank isn't supplied by this API
+        holder.animeScore.text = currentAnime.score.toString()
+        val image: String = currentAnime.image_url.toString()
+        Glide
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.animeImage)
+
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentAnimeId = "theanimeid"
+            val currentAnimeUrl = "theanimeurl"
+            val currentAnimeImageUrl = "theanimeimageurl"
+            val currentAnimeTitle = "theanimetitle"
+            val currentAnimeEpisodes = "theanimeepisodes"
+            val currentAnimeScore = "theanimescore"
+            val currentAnimeStartDate = "theanimestartdate"
+            val currentAnimeEndDate = "theanimeenddate"
+
+            //intent is used to pass data to another activity
+
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailSearchAnimeActivity::class.java).apply {
+                    putExtra(currentAnimeId, currentAnime.mal_id.toString())
+                    putExtra(currentAnimeUrl, currentAnime.url.toString())
+                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
+                    putExtra(currentAnimeTitle, currentAnime.title)
+                    putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
+                    putExtra(currentAnimeScore, currentAnime.score.toString())
+                    putExtra(currentAnimeStartDate, currentAnime.start_date)
+                    putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
+                }
+            holder.itemView.context.startActivity(intent)
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt
new file mode 100644
index 0000000..5a5ad7e
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt
@@ -0,0 +1,137 @@
+package xyz.adjutor.aniki.presentation.view.anime
+
+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
+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.anime.SearchAnimeApi
+import xyz.adjutor.aniki.presentation.model.anime.SearchAnime
+import xyz.adjutor.aniki.presentation.model.anime.SearchAnimeResponse
+import xyz.adjutor.aniki.presentation.view.MainActivity
+
+class SearchAnimePage : 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_anime_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_SearchAnimePage_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(TextView.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, animeList: List<SearchAnime>) {
+        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
+        recyclerView.setHasFixedSize(true)
+        recyclerView.layoutManager = LinearLayoutManager(view.context)
+        recyclerView.adapter = SearchAnimeAdapter(animeList)
+        (recyclerView.adapter as SearchAnimeAdapter).notifyDataSetChanged()
+    }
+
+    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(SearchAnimeApi::class.java)
+        val call = service.getSearchAnimeData(q = query) //fate is an exemple, we'll have to replace it by the user input.
+
+        call.enqueue(object : Callback<SearchAnimeResponse> {
+            override fun onResponse(
+                call: Call<SearchAnimeResponse>,
+                response: Response<SearchAnimeResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val animeList: List<SearchAnime> = response.body()!!
+                        .getResults() //getting the "search" field containing our list of SearchAnimes
+
+                    showList(
+                        view,
+                        animeList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<SearchAnimeResponse>, t: Throwable) {
+                showError()
+            }
+
+        })
+    }
+
+    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
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimeAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimeAdapter.kt
new file mode 100644
index 0000000..0529c26
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimeAdapter.kt
@@ -0,0 +1,81 @@
+package xyz.adjutor.aniki.presentation.view.anime
+
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.presentation.model.anime.TopAnime
+
+class TopAnimeAdapter(private val animeList: List<TopAnime>) :
+    RecyclerView.Adapter<TopAnimeAdapter.AnimeViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class AnimeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val animeTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val animeRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val animeScore: TextView = itemView.findViewById(R.id.tv_score)
+        val animeImage: ImageView = itemView.findViewById(R.id.iv_image)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AnimeViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_layout, parent, false)
+
+        return AnimeViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return animeList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: AnimeViewHolder, position: Int) {
+        val currentAnime: TopAnime = animeList[position]
+        holder.animeTitle.text = currentAnime.title
+        holder.animeRank.text = currentAnime.rank.toString()
+        holder.animeScore.text = currentAnime.score.toString()
+        val image: String = currentAnime.image_url.toString()
+        Glide
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.animeImage)
+
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentAnimeId = "theanimeid"
+            val currentAnimeTitle = "theanimetitle"
+            val currentAnimeRank = "theanimerank"
+            val currentAnimeScore = "theanimescore"
+            val currentAnimeImageUrl = "theanimeimageurl"
+            val currentAnimeEpisodes = "theanimeepisodes"
+            val currentAnimeStartDate = "theanimestartdate"
+            val currentAnimeEndDate = "theanimeenddate"
+            val currentAnimeUrl = "theanimeurl"
+
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailTopAnimeActivity::class.java).apply {
+                    putExtra(currentAnimeId, currentAnime.mal_id.toString())
+                    putExtra(currentAnimeTitle, currentAnime.title)
+                    putExtra(currentAnimeRank, currentAnime.rank.toString())
+                    putExtra(currentAnimeScore, currentAnime.score.toString())
+                    putExtra(currentAnimeImageUrl, currentAnime.image_url.toString())
+                    putExtra(currentAnimeEpisodes, currentAnime.episodes.toString())
+                    putExtra(currentAnimeStartDate, currentAnime.start_date)
+                    putExtra(currentAnimeEndDate, currentAnime.end_date.toString())
+                    putExtra(currentAnimeUrl, currentAnime.url.toString())
+                }
+            holder.itemView.context.startActivity(intent)
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt
new file mode 100644
index 0000000..66197d7
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt
@@ -0,0 +1,176 @@
+package xyz.adjutor.aniki.presentation.view.anime
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+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
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.data.anime.TopAnimeApi
+import xyz.adjutor.aniki.presentation.model.anime.TopAnime
+import xyz.adjutor.aniki.presentation.model.anime.TopAnimeResponse
+import java.lang.reflect.Type
+
+class TopAnimePage : Fragment() {
+
+    private lateinit var sharedPreferences: SharedPreferences
+    val gson: Gson = GsonBuilder()
+        .setLenient()
+        .create()
+    var baseUrl = "https://api.jikan.moe/" //the api's base url
+    var page: Int = 1
+
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        // Inflate the layout for this fragment
+        val view = inflater.inflate(R.layout.top_anime_page, container, false)
+
+        sharedPreferences = view.context.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
+
+        val animeList: List<TopAnime>? = getDataFromCache()
+        if (animeList != null) {
+            showList(view, animeList)
+        } else {
+            makeApiCall(view, baseUrl, 1)
+        }
+
+        return view
+
+    }
+
+    private fun getDataFromCache(): List<TopAnime>? {
+        //the value of the animeList json, if nothing is found, return null
+        val jsonAnime: String? = sharedPreferences.getString("jsonAnimeList", null)
+
+        //if it's null, well, return null
+        return if (jsonAnime == null) {
+            null
+        } else { //else deserialize the list and return it
+            val listType: Type = object : TypeToken<List<TopAnime>>() {}.type
+            gson.fromJson(jsonAnime, listType)
+        }
+    }
+
+    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_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, 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
+        }
+
+    }
+
+    //display the recyclerview
+    fun showList(view: View, animeList: List<TopAnime>) {
+        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
+        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, page: Int) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(TopAnimeApi::class.java)
+        val call = service.getTopAnimeData(page)
+
+        call.enqueue(object : Callback<TopAnimeResponse> {
+            override fun onResponse(
+                call: Call<TopAnimeResponse>,
+                response: Response<TopAnimeResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val animeList: List<TopAnime> = response.body()!!
+                        .getResults() //getting the "top" field containing our list of TopAnimes
+                    saveList(animeList)
+                    showList(
+                        view,
+                        animeList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<TopAnimeResponse>, t: Throwable) {
+                showError()
+            }
+
+        })
+    }
+
+    private fun saveList(animeList: List<TopAnime>) {
+        val jsonString: String = gson.toJson(animeList)
+
+        sharedPreferences
+            .edit()
+            .putString("jsonAnimeList", jsonString)
+            .apply()
+    }
+
+    private fun showError() {
+        Snackbar.make(
+            requireView(),
+            "API ERROR : Verify your internet connection.",
+            Snackbar.LENGTH_LONG
+        )
+            .setAction("Action", null).show()
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailSearchMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailSearchMangaActivity.kt
new file mode 100644
index 0000000..d04760b
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailSearchMangaActivity.kt
@@ -0,0 +1,169 @@
+package xyz.adjutor.aniki.presentation.view.manga
+
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+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.MangaApi
+import xyz.adjutor.aniki.presentation.model.manga.MangaResponse
+
+class DetailSearchMangaActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    private val gson = GsonBuilder()
+        .setLenient()
+        .create()
+
+    //used in the list
+    private val intentMangaImageUrl = "themangaimageurl"
+    private val intentMangaTitle = "themangatitle"
+    private val intentMangaScore = "themangascore"
+
+    //only used for the detail
+    private val intentMangaId = "themangaid"
+    private val intentMangaUrl = "themangaurl"
+    private val intentMangaChapters = "themangachapters"
+    private val intentMangaVolumes = "themangavolumes"
+    private val intentMangaStartDate = "themangastartdate"
+    private val intentMangaEndDate = "themangaenddate"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_search_manga)
+
+        val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
+        val mangaTitle = intent.getStringExtra(intentMangaTitle)
+        val mangaScore = intent.getStringExtra(intentMangaScore)
+
+        val mangaId = intent.getStringExtra(intentMangaId)
+        val mangaUrl = intent.getStringExtra(intentMangaUrl)
+        val mangaChapters = intent.getStringExtra(intentMangaChapters)
+        val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
+        val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
+        val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
+
+
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+        val tvChapters: TextView = findViewById(R.id.tv_chapters)
+        val tvVolumes: TextView = findViewById(R.id.tv_volumes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+
+        Glide
+            .with(this)
+            .load(mangaImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+        tvTitle.text = mangaTitle
+        tvScore.text = mangaScore
+
+
+        tvId.text = mangaId
+        tvUrl.text = mangaUrl
+
+        //using null as a string because it has been converted to a string before
+        tvChapters.text = if (mangaChapters != "null") {
+            mangaChapters
+        } else {
+            fieldIsNull()
+        }
+
+        tvVolumes.text = if (mangaVolumes != "null") {
+            mangaVolumes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = splitDate(mangaStartDate!!)
+
+        tvEndDate.text = if (mangaEndDate != "null") {
+            splitDate(mangaEndDate!!)
+        } else {
+            fieldIsNull()
+        }
+
+        makeApiCall(baseUrl, mangaId.toString())
+
+    }
+
+    private fun splitDate(mangaDate: String): CharSequence {
+        val delimiter = "T"
+        return mangaDate
+            .split(delimiter) //split between the date and the time
+            .toTypedArray()[0] //convert it to an array and take the first string
+
+    }
+
+    private fun makeApiCall(BASE_URL: String, mangaId: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(MangaApi::class.java)
+        val call = service.getMangaData(mangaId) //based on the id
+
+        call.enqueue(object : Callback<MangaResponse> {
+            override fun onResponse(
+                call: Call<MangaResponse>,
+                response: Response<MangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val manga = response.body() //getting the MangaResponse fields
+                    showDetail(manga!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(manga: MangaResponse) {
+        //elements from MangaResponse
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+        val tvBackground: TextView = findViewById(R.id.tv_background)
+
+        tvSynopsis.text = manga.synopsis.toString()
+
+        tvRank.text = manga.rank.toString()
+
+        tvBackground.text = if (manga.background != null) {
+            manga.background.toString()
+        } else {
+            fieldIsNull()
+        }
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+
+    private fun fieldIsNull(): String {
+        return "Unknown"
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt
new file mode 100644
index 0000000..2bf2f14
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt
@@ -0,0 +1,193 @@
+package xyz.adjutor.aniki.presentation.view.manga
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+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.MangaApi
+import xyz.adjutor.aniki.presentation.model.manga.MangaResponse
+import java.lang.reflect.Type
+
+class DetailTopMangaActivity : AppCompatActivity() {
+
+    private var baseUrl = "https://api.jikan.moe/"
+    private lateinit var sharedPreferences: SharedPreferences
+    private val gson = GsonBuilder()
+        .setLenient()
+        .create()
+
+    //used in the list
+    private val intentMangaTitle = "themangatitle"
+    private val intentMangaRank = "themangarank"
+    private val intentMangaScore = "themangascore"
+    private val intentMangaImageUrl = "themangaimageurl"
+
+    //only used for the detail
+    private val intentMangaId = "themangaid"
+    private val intentMangaVolumes = "themangavolumes"
+    private val intentMangaStartDate = "themangastartdate"
+    private val intentMangaEndDate = "themangaenddate"
+    private val intentMangaUrl = "themangaurl"
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_detail_top_manga)
+
+        sharedPreferences = this.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
+
+        val mangaTitle = intent.getStringExtra(intentMangaTitle)
+        val mangaRank = intent.getStringExtra(intentMangaRank)
+        val mangaScore = intent.getStringExtra(intentMangaScore)
+        val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
+
+        val mangaId = intent.getStringExtra(intentMangaId)
+        val mangaVolumes = intent.getStringExtra(intentMangaVolumes)
+        val mangaStartDate = intent.getStringExtra(intentMangaStartDate)
+        val mangaEndDate = intent.getStringExtra(intentMangaEndDate)
+        val mangaUrl = intent.getStringExtra(intentMangaUrl)
+
+        val tvTitle: TextView = findViewById(R.id.tv_detail_title)
+        val tvRank: TextView = findViewById(R.id.tv_detail_rank)
+        val tvScore: TextView = findViewById(R.id.tv_detail_score)
+        val ivImage: ImageView = findViewById(R.id.iv_detail_image)
+
+        val tvId: TextView = findViewById(R.id.tv_detail_id)
+        val tvVolumes: TextView = findViewById(R.id.tv_volumes)
+        val tvStartDate: TextView = findViewById(R.id.tv_start_date)
+        val tvEndDate: TextView = findViewById(R.id.tv_end_date)
+        val tvUrl: TextView = findViewById(R.id.tv_url)
+
+        tvTitle.text = mangaTitle
+        tvRank.text = mangaRank
+        tvScore.text = mangaScore
+        Glide
+            .with(this)
+            .load(mangaImageUrl)
+            .apply(RequestOptions().override(400))
+            .into(ivImage)
+
+        tvId.text = mangaId
+
+        //using null as a string because it has been converted to a string before
+        tvVolumes.text = if (mangaVolumes != "null") {
+            mangaVolumes
+        } else {
+            fieldIsNull()
+        }
+
+        tvStartDate.text = mangaStartDate
+
+        tvEndDate.text = if (mangaEndDate != "null") {
+            mangaEndDate
+        } else {
+            fieldIsNull()
+        }
+
+        tvUrl.text = mangaUrl
+
+        val manga: MangaResponse? = getDataFromCache(mangaId.toString())
+        if (manga != null) {
+            showDetail(manga)
+        } else {
+            //taking the API's fields I want and displaying them
+            makeApiCall(baseUrl, mangaId.toString())
+        }
+
+    }
+
+    private fun getDataFromCache(mangaId: String): MangaResponse? {
+        val jsonManga: String? = sharedPreferences.getString(mangaId, null)
+
+        return if (jsonManga == null) {
+            null
+        } else {
+            val type: Type = object : TypeToken<MangaResponse>() {}.type
+            gson.fromJson(jsonManga, type)
+        }
+    }
+
+    private fun makeApiCall(BASE_URL: String, mangaId: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(MangaApi::class.java)
+        val call = service.getMangaData(mangaId) //based on the id
+
+        call.enqueue(object : Callback<MangaResponse> {
+            override fun onResponse(
+                call: Call<MangaResponse>,
+                response: Response<MangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val manga = response.body() //getting the MangaResponse fields
+                    saveList(manga)
+                    showDetail(manga!!)
+
+                } else {
+                    showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
+                showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    private fun showDetail(manga: MangaResponse) {
+        //elements from MangaResponse
+        val tvChapters: TextView = findViewById(R.id.tv_chapters)
+        val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
+        val tvBackground: TextView = findViewById(R.id.tv_background)
+
+        tvChapters.text = if (manga.chapters != null) {
+            manga.chapters.toString()
+        } else {
+            fieldIsNull()
+        }
+
+        tvSynopsis.text = manga.synopsis.toString()
+
+        tvBackground.text = if (manga.background != null) {
+            manga.background.toString()
+        } else {
+            fieldIsNull()
+        }
+
+    }
+
+    fun showError(text: String) {
+        Toast.makeText(this, text, Toast.LENGTH_LONG).show()
+    }
+
+    private fun fieldIsNull(): String {
+        return "Unknown"
+    }
+
+    fun saveList(manga: MangaResponse?) {
+        val jsonString: String = gson.toJson(manga)
+
+        sharedPreferences
+            .edit()
+            .putString(manga?.mal_id.toString(), jsonString)
+            .apply()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/SearchMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/SearchMangaAdapter.kt
new file mode 100644
index 0000000..c0813c8
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/SearchMangaAdapter.kt
@@ -0,0 +1,84 @@
+package xyz.adjutor.aniki.presentation.view.manga
+
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.presentation.model.manga.SearchManga
+
+class SearchMangaAdapter(private val mangaList: List<SearchManga>) :
+    RecyclerView.Adapter<SearchMangaAdapter.MangaViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val mangaTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
+        val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_layout, parent, false)
+
+        return MangaViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return mangaList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
+        val currentManga: SearchManga = mangaList[position]
+        holder.mangaTitle.text = currentManga.title
+        holder.mangaRank.text = "" //the rank isn't supplied by this API
+        holder.mangaScore.text = currentManga.score.toString()
+        val image: String = currentManga.image_url.toString()
+        Glide
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.mangaImage)
+
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentMangaId = "themangaid"
+            val currentMangaUrl = "themangaurl"
+            val currentMangaImageUrl = "themangaimageurl"
+            val currentMangaTitle = "themangatitle"
+            val currentMangaChapters = "themangachapters"
+            val currentMangaVolumes = "themangavolumes"
+            val currentMangaScore = "themangascore"
+            val currentMangaStartDate = "themangastartdate"
+            val currentMangaEndDate = "themangaenddate"
+
+            //intent is used to pass data to another activity
+
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailSearchMangaActivity::class.java).apply {
+                    putExtra(currentMangaId, currentManga.mal_id.toString())
+                    putExtra(currentMangaUrl, currentManga.url.toString())
+                    putExtra(currentMangaImageUrl, currentManga.image_url.toString())
+                    putExtra(currentMangaTitle, currentManga.title)
+                    putExtra(currentMangaChapters, currentManga.chapters.toString())
+                    putExtra(currentMangaVolumes, currentManga.volumes.toString())
+                    putExtra(currentMangaScore, currentManga.score.toString())
+                    putExtra(currentMangaStartDate, currentManga.start_date)
+                    putExtra(currentMangaEndDate, currentManga.end_date.toString())
+                }
+            holder.itemView.context.startActivity(intent)
+        }
+
+    }
+}
\ No newline at end of file
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
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaAdapter.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaAdapter.kt
new file mode 100644
index 0000000..5ab1713
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaAdapter.kt
@@ -0,0 +1,82 @@
+package xyz.adjutor.aniki.presentation.view.manga
+
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import xyz.adjutor.aniki.R
+import xyz.adjutor.aniki.presentation.model.manga.TopManga
+
+class TopMangaAdapter(private val mangaList: List<TopManga>) :
+    RecyclerView.Adapter<TopMangaAdapter.MangaViewHolder>() {
+
+    // Describes an item view and its place within the RecyclerView
+    class MangaViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+        val mangaTitle: TextView = itemView.findViewById(R.id.tv_title)
+        val mangaRank: TextView = itemView.findViewById(R.id.tv_rank)
+        val mangaScore: TextView = itemView.findViewById(R.id.tv_score)
+        val mangaImage: ImageView = itemView.findViewById(R.id.iv_image)
+        val cardview: CardView = itemView.findViewById(R.id.cv_cardView)
+    }
+
+    // Returns a new ViewHolder
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MangaViewHolder {
+        val view = LayoutInflater.from(parent.context)
+            .inflate(R.layout.item_layout, parent, false)
+
+        return MangaViewHolder(view)
+    }
+
+    // Returns size of data list
+    override fun getItemCount(): Int {
+        return mangaList.size
+    }
+
+    // Displays data at a certain position
+    override fun onBindViewHolder(holder: MangaViewHolder, position: Int) {
+        val currentManga: TopManga = mangaList[position]
+        holder.mangaTitle.text = currentManga.title
+        holder.mangaRank.text = currentManga.rank.toString()
+        holder.mangaScore.text = currentManga.score.toString()
+        val image: String = currentManga.image_url.toString()
+        Glide
+            .with(holder.itemView.context)
+            .load(image)
+            .apply(RequestOptions().override(400))
+            .into(holder.mangaImage)
+
+        //when you click on a selected cardview, some datas are sent to the other activity
+        holder.cardview.setOnClickListener {
+            val currentMangaId = "themangaid"
+            val currentMangaTitle = "themangatitle"
+            val currentMangaRank = "themangarank"
+            val currentMangaScore = "themangascore"
+            val currentMangaImageUrl = "themangaimageurl"
+            val currentMangaVolumes = "themangavolumes"
+            val currentMangaStartDate = "themangastartdate"
+            val currentMangaEndDate = "themangaenddate"
+            val currentMangaUrl = "themangaurl"
+
+            //intent is used to pass data to another activity
+            val intent: Intent =
+                Intent(holder.itemView.context, DetailTopMangaActivity::class.java).apply {
+                    putExtra(currentMangaId, currentManga.mal_id.toString())
+                    putExtra(currentMangaTitle, currentManga.title)
+                    putExtra(currentMangaRank, currentManga.rank.toString())
+                    putExtra(currentMangaScore, currentManga.score.toString())
+                    putExtra(currentMangaImageUrl, currentManga.image_url.toString())
+                    putExtra(currentMangaVolumes, currentManga.volumes.toString())
+                    putExtra(currentMangaStartDate, currentManga.start_date)
+                    putExtra(currentMangaEndDate, currentManga.end_date.toString())
+                    putExtra(currentMangaUrl, currentManga.url.toString())
+                }
+            holder.itemView.context.startActivity(intent)
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
new file mode 100644
index 0000000..edb5fea
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
@@ -0,0 +1,178 @@
+package xyz.adjutor.aniki.presentation.view.manga
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import androidx.fragment.app.Fragment
+import androidx.navigation.fragment.findNavController
+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
+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.TopMangaApi
+import xyz.adjutor.aniki.presentation.model.manga.TopManga
+import xyz.adjutor.aniki.presentation.model.manga.TopMangaResponse
+import java.lang.reflect.Type
+
+//view
+class TopMangaPage : Fragment() {
+
+    private lateinit var sharedPreferences: SharedPreferences
+    val gson: Gson = GsonBuilder()
+        .setLenient()
+        .create()
+    private var baseUrl = "https://api.jikan.moe/" //the api's base url
+    var page: Int = 1
+
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        // Inflate the layout for this fragment
+        val view = inflater.inflate(R.layout.top_manga_page, container, false)
+
+        sharedPreferences = view.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
+
+        val mangaList: List<TopManga>? = getDataFromCache()
+        if (mangaList != null) {
+            showList(view, mangaList)
+        } else {
+            makeApiCall(view, baseUrl, 1)
+        }
+
+        return view
+
+    }
+
+    private fun getDataFromCache(): List<TopManga>? {
+        //the value of the mangaList json, if nothing is found, return null
+        val jsonManga: String? = sharedPreferences.getString("jsonMangaList", null)
+
+        //if it's null, well, return null
+        return if (jsonManga == null) {
+            null
+        } else { //else deserialize the list and return it
+            val listType: Type = object : TypeToken<List<TopManga>>() {}.type
+            gson.fromJson(jsonManga, listType)
+        }
+    }
+
+    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_TopMangaPage_to_HomePage)
+        }
+        view.findViewById<Button>(R.id.button_prev).setOnClickListener {
+            if (page > 1) { // if we're not on the first page, because we can't go back if we're on the first one.
+                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, 1)
+            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_SHORT)
+                .setAction("Action", null).show()
+        }
+
+        //refresh when swiping down at the top of the page
+        val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
+        swipeRefresh.setOnRefreshListener {
+            updateList()
+            page = 1
+            swipeRefresh.isRefreshing = false
+        }
+
+    }
+
+    //display the recyclerview
+    fun showList(view: View, mangaList: List<TopManga>) {
+        val recyclerView: RecyclerView = view.findViewById(R.id.recycler_view)
+        recyclerView.setHasFixedSize(true)
+        recyclerView.layoutManager = LinearLayoutManager(view.context)
+        recyclerView.adapter = TopMangaAdapter(mangaList)
+        (recyclerView.adapter as TopMangaAdapter).notifyDataSetChanged()
+    }
+
+    private fun makeApiCall(view: View, BASE_URL: String, page: Int) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(TopMangaApi::class.java)
+        val call = service.getTopMangaData(page)
+
+        call.enqueue(object : Callback<TopMangaResponse> {
+            override fun onResponse(
+                call: Call<TopMangaResponse>,
+                response: Response<TopMangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val mangaList: List<TopManga> = response.body()!!
+                        .getResults() //getting the "top" field containing our list of TopMangas
+                    saveList(mangaList)
+                    showList(
+                        view,
+                        mangaList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<TopMangaResponse>, t: Throwable) {
+                showError()
+            }
+
+        })
+    }
+
+    private fun saveList(mangaList: List<TopManga>) {
+        val jsonString: String = gson.toJson(mangaList)
+
+        sharedPreferences
+            .edit()
+            .putString("jsonMangaList", jsonString)
+            .apply()
+    }
+
+    private fun showError() {
+        Snackbar.make(
+            requireView(),
+            "API ERROR : Verify your internet connection.",
+            Snackbar.LENGTH_LONG
+        )
+            .setAction("Action", null).show()
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_detail_top_anime.xml b/app/src/main/res/layout/activity_detail_top_anime.xml
index d4c9380..f352e61 100644
--- a/app/src/main/res/layout/activity_detail_top_anime.xml
+++ b/app/src/main/res/layout/activity_detail_top_anime.xml
@@ -8,7 +8,7 @@
         xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        tools:context=".presentation.view.DetailTopAnimeActivity">
+        tools:context=".presentation.view.anime.DetailTopAnimeActivity">
 
         <androidx.cardview.widget.CardView
             android:id="@+id/cv_header"
diff --git a/app/src/main/res/layout/activity_detail_top_manga.xml b/app/src/main/res/layout/activity_detail_top_manga.xml
index e659baf..cbfa296 100644
--- a/app/src/main/res/layout/activity_detail_top_manga.xml
+++ b/app/src/main/res/layout/activity_detail_top_manga.xml
@@ -8,7 +8,7 @@
         xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        tools:context=".presentation.view.DetailTopMangaActivity">
+        tools:context=".presentation.view.manga.DetailTopMangaActivity">
 
         <androidx.cardview.widget.CardView
             android:id="@+id/cv_header"
diff --git a/app/src/main/res/layout/search_anime_page.xml b/app/src/main/res/layout/search_anime_page.xml
index a3a1671..abbd762 100644
--- a/app/src/main/res/layout/search_anime_page.xml
+++ b/app/src/main/res/layout/search_anime_page.xml
@@ -5,7 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/very_dark_purple"
-    tools:context=".presentation.view.SearchAnimePage">
+    tools:context=".presentation.view.anime.SearchAnimePage">
 
     <com.google.android.material.textfield.TextInputEditText
         android:id="@+id/tiet_query"
diff --git a/app/src/main/res/layout/search_manga_page.xml b/app/src/main/res/layout/search_manga_page.xml
index a83b4ef..db4bd6c 100644
--- a/app/src/main/res/layout/search_manga_page.xml
+++ b/app/src/main/res/layout/search_manga_page.xml
@@ -5,7 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/very_dark_purple"
-    tools:context=".presentation.view.SearchMangaPage">
+    tools:context=".presentation.view.manga.SearchMangaPage">
 
     <com.google.android.material.textfield.TextInputEditText
         android:id="@+id/tiet_query"
diff --git a/app/src/main/res/layout/top_anime_page.xml b/app/src/main/res/layout/top_anime_page.xml
index 7b33f34..633e5f4 100644
--- a/app/src/main/res/layout/top_anime_page.xml
+++ b/app/src/main/res/layout/top_anime_page.xml
@@ -5,7 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/very_dark_purple"
-    tools:context=".presentation.view.TopAnimePage">
+    tools:context=".presentation.view.anime.TopAnimePage">
 
     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
         android:id="@+id/swiperefresh"
diff --git a/app/src/main/res/layout/top_manga_page.xml b/app/src/main/res/layout/top_manga_page.xml
index e3bbd47..6bb911b 100644
--- a/app/src/main/res/layout/top_manga_page.xml
+++ b/app/src/main/res/layout/top_manga_page.xml
@@ -5,7 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/very_dark_purple"
-    tools:context=".presentation.view.TopMangaPage">
+    tools:context=".presentation.view.manga.TopMangaPage">
 
     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
         android:id="@+id/swiperefresh"
diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml
index 95c7996..63639d8 100644
--- a/app/src/main/res/navigation/nav_graph.xml
+++ b/app/src/main/res/navigation/nav_graph.xml
@@ -28,7 +28,7 @@
 
     <fragment
         android:id="@+id/TopMangaPage"
-        android:name="xyz.adjutor.aniki.presentation.view.TopMangaPage"
+        android:name="xyz.adjutor.aniki.presentation.view.manga.TopMangaPage"
         android:label="@string/top_manga_page_label"
         tools:layout="@layout/top_manga_page">
 
@@ -38,7 +38,7 @@
     </fragment>
     <fragment
         android:id="@+id/TopAnimePage"
-        android:name="xyz.adjutor.aniki.presentation.view.TopAnimePage"
+        android:name="xyz.adjutor.aniki.presentation.view.anime.TopAnimePage"
         android:label="@string/top_anime_page_label"
         tools:layout="@layout/top_anime_page">
 
@@ -48,7 +48,7 @@
     </fragment>
     <fragment
         android:id="@+id/SearchMangaPage"
-        android:name="xyz.adjutor.aniki.presentation.view.SearchMangaPage"
+        android:name="xyz.adjutor.aniki.presentation.view.manga.SearchMangaPage"
         android:label="@string/search_manga_page_label"
         tools:layout="@layout/search_manga_page">
 
@@ -58,7 +58,7 @@
     </fragment>
     <fragment
         android:id="@+id/SearchAnimePage"
-        android:name="xyz.adjutor.aniki.presentation.view.SearchAnimePage"
+        android:name="xyz.adjutor.aniki.presentation.view.anime.SearchAnimePage"
         android:label="@string/search_anime_page_label"
         tools:layout="@layout/search_anime_page">
 
-- 
cgit v1.2.3


From d053033b3c74acdbd05ea5bc6549e87ff7ea008f Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 13 Apr 2021 13:34:34 +0200
Subject: Moving the basic variables.

---
 .../aniki/presentation/view/manga/TopMangaPage.kt    | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
index edb5fea..943019d 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
@@ -23,19 +23,21 @@ import retrofit2.Retrofit
 import retrofit2.converter.gson.GsonConverterFactory
 import xyz.adjutor.aniki.R
 import xyz.adjutor.aniki.data.manga.TopMangaApi
+import xyz.adjutor.aniki.presentation.controller.TopMangaController
 import xyz.adjutor.aniki.presentation.model.manga.TopManga
 import xyz.adjutor.aniki.presentation.model.manga.TopMangaResponse
 import java.lang.reflect.Type
+import kotlin.properties.Delegates
 
 //view
 class TopMangaPage : Fragment() {
 
+    lateinit var controller: TopMangaController
+
     private lateinit var sharedPreferences: SharedPreferences
-    val gson: Gson = GsonBuilder()
-        .setLenient()
-        .create()
-    private var baseUrl = "https://api.jikan.moe/" //the api's base url
-    var page: Int = 1
+    lateinit var gson: Gson
+    private lateinit var baseUrl: String //the api's base url
+    private var page by Delegates.notNull<Int>()
 
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
@@ -44,6 +46,14 @@ class TopMangaPage : Fragment() {
         // Inflate the layout for this fragment
         val view = inflater.inflate(R.layout.top_manga_page, container, false)
 
+        //controller.onStart()
+
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        page = 1
+
         sharedPreferences = view.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
 
         val mangaList: List<TopManga>? = getDataFromCache()
-- 
cgit v1.2.3


From 251afac13cd2731d9be660047501ac6f32d6e067 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 13 Apr 2021 15:39:45 +0200
Subject: MVC implemented to TopMangaPage

---
 .../presentation/controller/TopMangaController.kt  | 114 +++++++++++++++++-
 .../aniki/presentation/view/manga/TopMangaPage.kt  | 130 +++------------------
 2 files changed, 123 insertions(+), 121 deletions(-)

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
index cfee062..8eaa31d 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
@@ -1,29 +1,131 @@
 package xyz.adjutor.aniki.presentation.controller
 
+import android.content.Context
+import android.content.SharedPreferences
+import android.view.View
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.data.manga.TopMangaApi
+import xyz.adjutor.aniki.presentation.model.manga.TopManga
+import xyz.adjutor.aniki.presentation.model.manga.TopMangaResponse
+import xyz.adjutor.aniki.presentation.view.manga.TopMangaPage
+import java.lang.reflect.Type
+import kotlin.properties.Delegates
+
 class TopMangaController {
 
-    fun TopMangaController() {
+    lateinit var sharedPreferences: SharedPreferences
+    lateinit var gson: Gson
+    lateinit var baseUrl: String //the api's base url
+    var page by Delegates.notNull<Int>()
+    lateinit var view: TopMangaPage
+
+    fun onStart(topMangaPage: TopMangaPage, viewTopMangaPage: View) {
+
+        view = topMangaPage
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        page = 1
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+        sharedPreferences =
+            viewTopMangaPage.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
 
+
+        val mangaList: List<TopManga>? = getDataFromCache()
+        if (mangaList != null) {
+            view.showList(viewTopMangaPage, mangaList)
+        } else {
+            makeApiCall(view, baseUrl, 1)
+        }
     }
 
-    fun onStart() {
+    private fun makeApiCall(view: TopMangaPage, BASE_URL: String, page: Int) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(TopMangaApi::class.java)
+        val call = service.getTopMangaData(page)
 
+        call.enqueue(object : Callback<TopMangaResponse> {
+            override fun onResponse(
+                call: Call<TopMangaResponse>,
+                response: Response<TopMangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val mangaList: List<TopManga> = response.body()!!
+                        .getResults() //getting the "top" field containing our list of TopMangas
+                    saveList(mangaList)
+                    view.showList(
+                        view.requireView(),
+                        mangaList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    view.showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<TopMangaResponse>, t: Throwable) {
+                view.showError()
+            }
+
+        })
     }
 
-    fun onButtonTopMangaClick() {
+    private fun saveList(mangaList: List<TopManga>) {
+        val jsonString: String = gson.toJson(mangaList)
 
+        sharedPreferences
+            .edit()
+            .putString("jsonMangaList", jsonString)
+            .apply()
     }
 
-    fun onButtonTopAnimeClick() {
+    private fun getDataFromCache(): List<TopManga>? {
+        //the value of the mangaList json, if nothing is found, return null
+        val jsonManga: String? = sharedPreferences.getString("jsonMangaList", null)
 
+        //if it's null, well, return null
+        return if (jsonManga == null) {
+            null
+        } else { //else deserialize the list and return it
+            val listType: Type = object : TypeToken<List<TopManga>>() {}.type
+            gson.fromJson(jsonManga, listType)
+        }
     }
 
-    fun onButtonSearchMangaClick() {
 
+    fun onButtonPrevClick() {
+        if (page > 1) { // if we're not on the first page, because we can't go back if we're on the first one.
+            page -= 1
+            makeApiCall(view, baseUrl, page)
+            view.showText("Page $page has been loaded.")
+        } else {
+            view.showText("You're already on page 1.")
+        }
     }
 
-    fun onButtonSearchAnimeClick() {
+    fun onButtonNextClick() {
+        page += 1
+        makeApiCall(view, baseUrl, page)
+        view.showText("Page $page has been loaded.")
+    }
 
+    fun updateList() {
+        makeApiCall(view, baseUrl, 1)
+        view.showText("Data refreshed")
+        page = 1
     }
 
 }
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
index 943019d..2a05904 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
@@ -1,7 +1,5 @@
 package xyz.adjutor.aniki.presentation.view.manga
 
-import android.content.Context
-import android.content.SharedPreferences
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
@@ -13,32 +11,15 @@ 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
-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.TopMangaApi
 import xyz.adjutor.aniki.presentation.controller.TopMangaController
 import xyz.adjutor.aniki.presentation.model.manga.TopManga
-import xyz.adjutor.aniki.presentation.model.manga.TopMangaResponse
-import java.lang.reflect.Type
-import kotlin.properties.Delegates
 
 //view
 class TopMangaPage : Fragment() {
 
     lateinit var controller: TopMangaController
 
-    private lateinit var sharedPreferences: SharedPreferences
-    lateinit var gson: Gson
-    private lateinit var baseUrl: String //the api's base url
-    private var page by Delegates.notNull<Int>()
-
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
         savedInstanceState: Bundle?
@@ -46,40 +27,13 @@ class TopMangaPage : Fragment() {
         // Inflate the layout for this fragment
         val view = inflater.inflate(R.layout.top_manga_page, container, false)
 
-        //controller.onStart()
-
-        gson = GsonBuilder()
-            .setLenient()
-            .create()
-        baseUrl = "https://api.jikan.moe/" //the api's base url
-        page = 1
-
-        sharedPreferences = view.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
-
-        val mangaList: List<TopManga>? = getDataFromCache()
-        if (mangaList != null) {
-            showList(view, mangaList)
-        } else {
-            makeApiCall(view, baseUrl, 1)
-        }
+        controller = TopMangaController()
+        controller.onStart(this, view)
 
         return view
 
     }
 
-    private fun getDataFromCache(): List<TopManga>? {
-        //the value of the mangaList json, if nothing is found, return null
-        val jsonManga: String? = sharedPreferences.getString("jsonMangaList", null)
-
-        //if it's null, well, return null
-        return if (jsonManga == null) {
-            null
-        } else { //else deserialize the list and return it
-            val listType: Type = object : TypeToken<List<TopManga>>() {}.type
-            gson.fromJson(jsonManga, listType)
-        }
-    }
-
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
@@ -88,34 +42,16 @@ class TopMangaPage : Fragment() {
             findNavController().navigate(R.id.action_TopMangaPage_to_HomePage)
         }
         view.findViewById<Button>(R.id.button_prev).setOnClickListener {
-            if (page > 1) { // if we're not on the first page, because we can't go back if we're on the first one.
-                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()
-            }
+            controller.onButtonPrevClick()
         }
         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, 1)
-            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_SHORT)
-                .setAction("Action", null).show()
+            controller.onButtonNextClick()
         }
 
         //refresh when swiping down at the top of the page
         val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
         swipeRefresh.setOnRefreshListener {
-            updateList()
-            page = 1
+            controller.updateList()
             swipeRefresh.isRefreshing = false
         }
 
@@ -130,53 +66,8 @@ class TopMangaPage : Fragment() {
         (recyclerView.adapter as TopMangaAdapter).notifyDataSetChanged()
     }
 
-    private fun makeApiCall(view: View, BASE_URL: String, page: Int) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(TopMangaApi::class.java)
-        val call = service.getTopMangaData(page)
-
-        call.enqueue(object : Callback<TopMangaResponse> {
-            override fun onResponse(
-                call: Call<TopMangaResponse>,
-                response: Response<TopMangaResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val mangaList: List<TopManga> = response.body()!!
-                        .getResults() //getting the "top" field containing our list of TopMangas
-                    saveList(mangaList)
-                    showList(
-                        view,
-                        mangaList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<TopMangaResponse>, t: Throwable) {
-                showError()
-            }
-
-        })
-    }
-
-    private fun saveList(mangaList: List<TopManga>) {
-        val jsonString: String = gson.toJson(mangaList)
 
-        sharedPreferences
-            .edit()
-            .putString("jsonMangaList", jsonString)
-            .apply()
-    }
-
-    private fun showError() {
+    fun showError() {
         Snackbar.make(
             requireView(),
             "API ERROR : Verify your internet connection.",
@@ -185,4 +76,13 @@ class TopMangaPage : Fragment() {
             .setAction("Action", null).show()
     }
 
+    fun showText(text: String) {
+        Snackbar.make(
+            requireView(),
+            text,
+            Snackbar.LENGTH_SHORT
+        )
+            .setAction("Action", null).show()
+    }
+
 }
\ No newline at end of file
-- 
cgit v1.2.3


From 124b99a26cf427782c244eda19435ef4d23d01e6 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 13 Apr 2021 15:48:31 +0200
Subject: Gradle update

---
 app/build.gradle | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index d28b3c6..e8f6245 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -40,14 +40,14 @@ dependencies {
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
-    implementation 'androidx.navigation:navigation-fragment-ktx:2.3.4'
-    implementation 'androidx.navigation:navigation-ui-ktx:2.3.4'
+    implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
+    implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
     testImplementation 'junit:junit:4.13.2'
     androidTestImplementation 'androidx.test.ext:junit:1.1.2'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
 
     //Recycleview for lists
-    implementation "androidx.recyclerview:recyclerview:1.1.0"
+    implementation "androidx.recyclerview:recyclerview:1.2.0"
 
     //Retrofit for REST APIs
     implementation 'com.squareup.retrofit2:retrofit:2.9.0'
@@ -57,7 +57,7 @@ dependencies {
     testImplementation 'junit:junit:4.13.2'
 
     // Required for instrumented tests
-    androidTestImplementation 'androidx.annotation:annotation:1.1.0'
+    androidTestImplementation 'androidx.annotation:annotation:1.2.0'
     androidTestImplementation 'androidx.test.ext:junit:1.1.2'
 
     //Glide to display images properly
-- 
cgit v1.2.3


From 1ab9e165dcb9b3c49322a6ce3734c16c80364795 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Tue, 4 May 2021 15:00:16 +0200
Subject: Added the arch onto topanime

---
 .../presentation/controller/MainController.kt      |  29 -----
 .../presentation/controller/TopAnimeController.kt  | 131 +++++++++++++++++++++
 .../presentation/controller/TopMangaController.kt  |   2 +-
 .../adjutor/aniki/presentation/view/HomePage.kt    |   3 -
 .../aniki/presentation/view/anime/TopAnimePage.kt  | 127 +++-----------------
 .../aniki/presentation/view/manga/TopMangaPage.kt  |   1 -
 6 files changed, 151 insertions(+), 142 deletions(-)
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopAnimeController.kt

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt
deleted file mode 100644
index 133f84b..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/MainController.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-package xyz.adjutor.aniki.presentation.controller
-
-class MainController {
-
-    fun MainController() {
-
-    }
-
-    fun onStart() {
-
-    }
-
-    fun onButtonTopMangaClick() {
-
-    }
-
-    fun onButtonTopAnimeClick() {
-
-    }
-
-    fun onButtonSearchMangaClick() {
-
-    }
-
-    fun onButtonSearchAnimeClick() {
-
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopAnimeController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopAnimeController.kt
new file mode 100644
index 0000000..36026ec
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopAnimeController.kt
@@ -0,0 +1,131 @@
+package xyz.adjutor.aniki.presentation.controller
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.view.View
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.data.anime.TopAnimeApi
+import xyz.adjutor.aniki.presentation.model.anime.TopAnime
+import xyz.adjutor.aniki.presentation.model.anime.TopAnimeResponse
+import xyz.adjutor.aniki.presentation.view.anime.TopAnimePage
+import java.lang.reflect.Type
+import kotlin.properties.Delegates
+
+class TopAnimeController {
+
+    lateinit var sharedPreferences: SharedPreferences
+    lateinit var gson: Gson
+    lateinit var baseUrl: String //the api's base url
+    var page by Delegates.notNull<Int>()
+    lateinit var view: TopAnimePage
+
+    fun onStart(topAnimePage: TopAnimePage, viewTopAnimePage: View) {
+
+        view = topAnimePage
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        page = 1
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+        sharedPreferences =
+            viewTopAnimePage.context.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
+
+
+        val animeList: List<TopAnime>? = getDataFromCache()
+        if (animeList != null) {
+            view.showList(viewTopAnimePage, animeList)
+        } else {
+            makeApiCall(view, baseUrl, 1)
+        }
+    }
+
+    fun makeApiCall(view: TopAnimePage, BASE_URL: String, page: Int) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(TopAnimeApi::class.java)
+        val call = service.getTopAnimeData(page)
+
+        call.enqueue(object : Callback<TopAnimeResponse> {
+            override fun onResponse(
+                call: Call<TopAnimeResponse>,
+                response: Response<TopAnimeResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val animeList: List<TopAnime> = response.body()!!
+                        .getResults() //getting the "top" field containing our list of TopAnimes
+                    saveList(animeList)
+                    view.showList(
+                        view.requireView(),
+                        animeList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    view.showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<TopAnimeResponse>, t: Throwable) {
+                view.showError()
+            }
+
+        })
+    }
+
+    private fun saveList(animeList: List<TopAnime>) {
+        val jsonString: String = gson.toJson(animeList)
+
+        sharedPreferences
+            .edit()
+            .putString("jsonAnimeList", jsonString)
+            .apply()
+    }
+
+    private fun getDataFromCache(): List<TopAnime>? {
+        //the value of the animeList json, if nothing is found, return null
+        val jsonAnime: String? = sharedPreferences.getString("jsonAnimeList", null)
+
+        //if it's null, well, return null
+        return if (jsonAnime == null) {
+            null
+        } else { //else deserialize the list and return it
+            val listType: Type = object : TypeToken<List<TopAnime>>() {}.type
+            gson.fromJson(jsonAnime, listType)
+        }
+    }
+
+
+    fun onButtonPrevClick() {
+        if (page > 1) { // if we're not on the first page, because we can't go back if we're on the first one.
+            page -= 1
+            makeApiCall(view, baseUrl, page)
+            view.showText("Page $page has been loaded.")
+        } else {
+            view.showText("You're already on page 1. (If you're actually not, refresh the list.)")
+        }
+    }
+
+    fun onButtonNextClick() {
+        page += 1
+        makeApiCall(view, baseUrl, page)
+        view.showText("Page $page has been loaded.")
+    }
+
+    fun updateList() {
+        makeApiCall(view, baseUrl, 1)
+        view.showText("Data refreshed")
+        page = 1
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
index 8eaa31d..3fa1c2c 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
@@ -112,7 +112,7 @@ class TopMangaController {
             makeApiCall(view, baseUrl, page)
             view.showText("Page $page has been loaded.")
         } else {
-            view.showText("You're already on page 1.")
+            view.showText("You're already on page 1. (If you're actually not, refresh the list.)")
         }
     }
 
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt
index d740dba..f2abca1 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/HomePage.kt
@@ -8,12 +8,9 @@ import android.widget.Button
 import androidx.fragment.app.Fragment
 import androidx.navigation.fragment.findNavController
 import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.presentation.controller.MainController
 
 class HomePage : Fragment() {
 
-    lateinit var controller: MainController
-
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
         savedInstanceState: Bundle?
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt
index 66197d7..40df41c 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt
@@ -1,7 +1,5 @@
 package xyz.adjutor.aniki.presentation.view.anime
 
-import android.content.Context
-import android.content.SharedPreferences
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
@@ -13,28 +11,14 @@ 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
-import retrofit2.Callback
-import retrofit2.Response
-import retrofit2.Retrofit
-import retrofit2.converter.gson.GsonConverterFactory
 import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.data.anime.TopAnimeApi
+import xyz.adjutor.aniki.presentation.controller.TopAnimeController
 import xyz.adjutor.aniki.presentation.model.anime.TopAnime
-import xyz.adjutor.aniki.presentation.model.anime.TopAnimeResponse
-import java.lang.reflect.Type
 
+//view
 class TopAnimePage : Fragment() {
 
-    private lateinit var sharedPreferences: SharedPreferences
-    val gson: Gson = GsonBuilder()
-        .setLenient()
-        .create()
-    var baseUrl = "https://api.jikan.moe/" //the api's base url
-    var page: Int = 1
+    lateinit var controller: TopAnimeController
 
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
@@ -43,32 +27,13 @@ class TopAnimePage : Fragment() {
         // Inflate the layout for this fragment
         val view = inflater.inflate(R.layout.top_anime_page, container, false)
 
-        sharedPreferences = view.context.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
-
-        val animeList: List<TopAnime>? = getDataFromCache()
-        if (animeList != null) {
-            showList(view, animeList)
-        } else {
-            makeApiCall(view, baseUrl, 1)
-        }
+        controller = TopAnimeController()
+        controller.onStart(this, view)
 
         return view
 
     }
 
-    private fun getDataFromCache(): List<TopAnime>? {
-        //the value of the animeList json, if nothing is found, return null
-        val jsonAnime: String? = sharedPreferences.getString("jsonAnimeList", null)
-
-        //if it's null, well, return null
-        return if (jsonAnime == null) {
-            null
-        } else { //else deserialize the list and return it
-            val listType: Type = object : TypeToken<List<TopAnime>>() {}.type
-            gson.fromJson(jsonAnime, listType)
-        }
-    }
-
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
 
@@ -77,33 +42,16 @@ class TopAnimePage : Fragment() {
             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()
-            }
+            controller.onButtonPrevClick()
         }
         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, 1)
-            Snackbar.make(requireView(), "Data refreshed", Snackbar.LENGTH_SHORT)
-                .setAction("Action", null).show()
+            controller.onButtonNextClick()
         }
 
+        //refresh when swiping down at the top of the page
         val swipeRefresh: SwipeRefreshLayout = view.findViewById(R.id.swiperefresh)
         swipeRefresh.setOnRefreshListener {
-            updateList()
-            page = 1
+            controller.updateList()
             swipeRefresh.isRefreshing = false
         }
 
@@ -118,53 +66,7 @@ class TopAnimePage : Fragment() {
         (recyclerView.adapter as TopAnimeAdapter).notifyDataSetChanged()
     }
 
-    private fun makeApiCall(view: View, BASE_URL: String, page: Int) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(TopAnimeApi::class.java)
-        val call = service.getTopAnimeData(page)
-
-        call.enqueue(object : Callback<TopAnimeResponse> {
-            override fun onResponse(
-                call: Call<TopAnimeResponse>,
-                response: Response<TopAnimeResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val animeList: List<TopAnime> = response.body()!!
-                        .getResults() //getting the "top" field containing our list of TopAnimes
-                    saveList(animeList)
-                    showList(
-                        view,
-                        animeList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<TopAnimeResponse>, t: Throwable) {
-                showError()
-            }
-
-        })
-    }
-
-    private fun saveList(animeList: List<TopAnime>) {
-        val jsonString: String = gson.toJson(animeList)
-
-        sharedPreferences
-            .edit()
-            .putString("jsonAnimeList", jsonString)
-            .apply()
-    }
-
-    private fun showError() {
+    fun showError() {
         Snackbar.make(
             requireView(),
             "API ERROR : Verify your internet connection.",
@@ -173,4 +75,13 @@ class TopAnimePage : Fragment() {
             .setAction("Action", null).show()
     }
 
+    fun showText(text: String) {
+        Snackbar.make(
+            requireView(),
+            text,
+            Snackbar.LENGTH_SHORT
+        )
+            .setAction("Action", null).show()
+    }
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
index 2a05904..32fa1b1 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
@@ -66,7 +66,6 @@ class TopMangaPage : Fragment() {
         (recyclerView.adapter as TopMangaAdapter).notifyDataSetChanged()
     }
 
-
     fun showError() {
         Snackbar.make(
             requireView(),
-- 
cgit v1.2.3


From 0b99522225e1ed574233f9c9207a5a8375012bd3 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Mon, 10 May 2021 15:06:26 +0200
Subject: Finished search manga page controller

---
 .../controller/SearchMangaController.kt            | 73 ++++++++++++++++++++++
 .../presentation/view/manga/SearchMangaPage.kt     | 64 +++----------------
 build.gradle                                       |  6 +-
 gradle/wrapper/gradle-wrapper.properties           |  2 +-
 4 files changed, 87 insertions(+), 58 deletions(-)
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchMangaController.kt

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchMangaController.kt
new file mode 100644
index 0000000..572c57e
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchMangaController.kt
@@ -0,0 +1,73 @@
+package xyz.adjutor.aniki.presentation.controller
+
+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.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.manga.SearchMangaPage
+
+class SearchMangaController {
+
+    lateinit var gson: Gson
+    lateinit var baseUrl: String //the api's base url
+    lateinit var view: SearchMangaPage
+
+    fun onStart(searchMangaPage: SearchMangaPage) {
+
+        view = searchMangaPage
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+    }
+
+    //call the API and show the list
+    private fun makeApiCall(view: SearchMangaPage, 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
+
+                    view.showList(
+                        view.requireView(),
+                        mangaList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    view.showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<SearchMangaResponse>, t: Throwable) {
+                view.showError()
+            }
+
+        })
+    }
+
+    fun updateList(userInput: String) {
+        makeApiCall(view, baseUrl, userInput)
+    }
+
+}
\ No newline at end of file
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
index a571473..853ee22 100644
--- 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
@@ -15,34 +15,27 @@ 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.controller.SearchMangaController
 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
+    lateinit var controller: SearchMangaController
 
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View? {
         // Inflate the layout for this fragment
+        val view = inflater.inflate(R.layout.search_manga_page, container, false)
 
-        return inflater.inflate(R.layout.search_manga_page, container, false)
+        controller = SearchMangaController()
+        controller.onStart(this)
+
+        return view
     }
 
 
@@ -57,7 +50,7 @@ class SearchMangaPage : Fragment() {
         view.findViewById<Button>(R.id.button_query).setOnClickListener {
             val userInput = view.findViewById<TextInputEditText>(R.id.tiet_query).text.toString()
             hideKeyboard()
-            makeApiCall(view, baseUrl, userInput)
+            controller.updateList(userInput)
         }
 
         view.findViewById<TextInputEditText>(R.id.tiet_query)
@@ -66,7 +59,7 @@ class SearchMangaPage : Fragment() {
                     val userInput =
                         view.findViewById<TextInputEditText>(R.id.tiet_query).text.toString()
                     hideKeyboard()
-                    makeApiCall(view, baseUrl, userInput)
+                    controller.updateList(userInput)
                     return@OnEditorActionListener true
                 }
                 false
@@ -94,46 +87,9 @@ class SearchMangaPage : Fragment() {
         (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() {
+    fun showError() {
         Snackbar.make(
             requireView(),
             "API ERROR : Verify your internet connection or your query.",
diff --git a/build.gradle b/build.gradle
index a33d7ea..cd9f6d3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,10 +3,10 @@ buildscript {
     ext.kotlin_version = "1.3.72"
     repositories {
         google()
-        jcenter()
+        mavenCentral()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:4.1.3'
+        classpath 'com.android.tools.build:gradle:4.2.0'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 
         // NOTE: Do not place your application dependencies here; they belong
@@ -17,7 +17,7 @@ buildscript {
 allprojects {
     repositories {
         google()
-        jcenter()
+        mavenCentral()
     }
 }
 
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 356bc93..3d9a37e 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip
-- 
cgit v1.2.3


From ed924a477619edfca3c6d4c4a74545f8b62cf181 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Mon, 10 May 2021 15:12:59 +0200
Subject: Added search anime page controller

---
 .../controller/SearchAnimeController.kt            | 73 ++++++++++++++++++++++
 .../presentation/view/anime/SearchAnimePage.kt     | 70 +++++----------------
 2 files changed, 89 insertions(+), 54 deletions(-)
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchAnimeController.kt

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchAnimeController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchAnimeController.kt
new file mode 100644
index 0000000..d00137d
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchAnimeController.kt
@@ -0,0 +1,73 @@
+package xyz.adjutor.aniki.presentation.controller
+
+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.data.anime.SearchAnimeApi
+import xyz.adjutor.aniki.presentation.model.anime.SearchAnime
+import xyz.adjutor.aniki.presentation.model.anime.SearchAnimeResponse
+import xyz.adjutor.aniki.presentation.view.anime.SearchAnimePage
+
+class SearchAnimeController {
+
+    lateinit var gson: Gson
+    lateinit var baseUrl: String //the api's base url
+    lateinit var view: SearchAnimePage
+
+    fun onStart(searchAnimePage: SearchAnimePage) {
+
+        view = searchAnimePage
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+    }
+
+    //call the API and show the list
+    private fun makeApiCall(view: SearchAnimePage, BASE_URL: String, query: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(SearchAnimeApi::class.java)
+        val call =
+            service.getSearchAnimeData(q = query) //fate is an exemple, we'll have to replace it by the user input.
+
+        call.enqueue(object : Callback<SearchAnimeResponse> {
+            override fun onResponse(
+                call: Call<SearchAnimeResponse>,
+                response: Response<SearchAnimeResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val animeList: List<SearchAnime> = response.body()!!
+                        .getResults() //getting the "search" field containing our list of SearchAnimes
+
+                    view.showList(
+                        view.requireView(),
+                        animeList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    view.showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<SearchAnimeResponse>, t: Throwable) {
+                view.showError()
+            }
+
+        })
+    }
+
+    fun updateList(userInput: String) {
+        makeApiCall(view, baseUrl, userInput)
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt
index 5a5ad7e..4d01f4f 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt
@@ -15,33 +15,26 @@ 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.anime.SearchAnimeApi
+import xyz.adjutor.aniki.presentation.controller.SearchAnimeController
 import xyz.adjutor.aniki.presentation.model.anime.SearchAnime
-import xyz.adjutor.aniki.presentation.model.anime.SearchAnimeResponse
 import xyz.adjutor.aniki.presentation.view.MainActivity
 
 class SearchAnimePage : Fragment() {
 
-    val gson: Gson = GsonBuilder()
-        .setLenient()
-        .create()
-    private var baseUrl = "https://api.jikan.moe/" //the api's base url
+    lateinit var controller: SearchAnimeController
 
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View? {
         // Inflate the layout for this fragment
+        val view = inflater.inflate(R.layout.search_anime_page, container, false)
 
-        return inflater.inflate(R.layout.search_anime_page, container, false)
+        controller = SearchAnimeController()
+        controller.onStart(this)
+
+        return view
     }
 
 
@@ -56,7 +49,7 @@ class SearchAnimePage : Fragment() {
         view.findViewById<Button>(R.id.button_query).setOnClickListener {
             val userInput = view.findViewById<TextInputEditText>(R.id.tiet_query).text.toString()
             hideKeyboard()
-            makeApiCall(view, baseUrl, userInput)
+            controller.updateList(userInput)
         }
 
         view.findViewById<TextInputEditText>(R.id.tiet_query)
@@ -65,7 +58,7 @@ class SearchAnimePage : Fragment() {
                     val userInput =
                         view.findViewById<TextInputEditText>(R.id.tiet_query).text.toString()
                     hideKeyboard()
-                    makeApiCall(view, baseUrl, userInput)
+                    controller.updateList(userInput)
                     return@OnEditorActionListener true
                 }
                 false
@@ -92,45 +85,14 @@ class SearchAnimePage : Fragment() {
         (recyclerView.adapter as SearchAnimeAdapter).notifyDataSetChanged()
     }
 
-    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(SearchAnimeApi::class.java)
-        val call = service.getSearchAnimeData(q = query) //fate is an exemple, we'll have to replace it by the user input.
-
-        call.enqueue(object : Callback<SearchAnimeResponse> {
-            override fun onResponse(
-                call: Call<SearchAnimeResponse>,
-                response: Response<SearchAnimeResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val animeList: List<SearchAnime> = response.body()!!
-                        .getResults() //getting the "search" field containing our list of SearchAnimes
-
-                    showList(
-                        view,
-                        animeList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<SearchAnimeResponse>, t: Throwable) {
-                showError()
-            }
-
-        })
-    }
 
-    private fun showError() {
-        Snackbar.make(requireView(), "API ERROR : Verify your internet connection or your query.", Snackbar.LENGTH_LONG)
+    //display a snack
+    fun showError() {
+        Snackbar.make(
+            requireView(),
+            "API ERROR : Verify your internet connection or your query.",
+            Snackbar.LENGTH_LONG
+        )
             .setAction("Action", null).show()
     }
 
-- 
cgit v1.2.3


From 95e52439a3a6043f99d91eddbe06c838f57dac87 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Wed, 12 May 2021 14:45:28 +0200
Subject: rm README.md

---
 README.md | 58 ----------------------------------------------------------
 1 file changed, 58 deletions(-)
 delete mode 100644 README.md

diff --git a/README.md b/README.md
deleted file mode 100644
index da5ecc0..0000000
--- a/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# Android myanimelist client project. (WIP)
-
-## Features
-
-List of elements used in top manga and top anime with a recycler view
-SwipeRefresh used to refresh the list of data of the first page.
-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.
-URL link openable.
-
-Search pages for animes and mangas.
-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.
-
-## API
-Multiple calls of the REST API from jikan.moe.
-Usage of :
-+ /v3/top/manga
-+ /v3/top/anime
-+ /v3/manga
-+ /v3/anime
-+ /v3/search/manga
-+ /v3/search/anime
-
-## Data Storage
-Data storage with sharedpreferences used for the recycler view of top manga and top anime as well as the details
-Saves the detail page of an item when opened, not when the list is shown
-Usage of ScrollView in the detail page. Thus, items with long synopsis and background aren't cut down.
-
-## Design
-Used my "personal" theme colors for the app.
-It consists of some colors of the pink/purple "family" :
-+ very dark purple : #09022A
-+ very light magenta : #FF70FF
-+ strong pink : #D52C70
-+ slightly desaturated magenta : #C583B6
-+ grayish magenta : #C9A6C9
-
-Also added the "bangers" font for the titles.
-
-## Gitflow
-Development done with a Gitflow workflow. I used master, release, develop and feature branches.
-
-## Architecture
-I used the MVC architecture.
-
-## TO-DO
-+ Finishing MVC
-+ Adding Singleton
-+ Clicking on an image opens it full size
-+ Firebase
-+ Bottom navigation
-+ ...
-- 
cgit v1.2.3


From 95f421c72c2d700bf4fbe32d84919a461ffa6df2 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Wed, 12 May 2021 14:46:39 +0200
Subject: add README.md

---
 README.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)
 create mode 100644 README.md

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..da5ecc0
--- /dev/null
+++ b/README.md
@@ -0,0 +1,58 @@
+# Android myanimelist client project. (WIP)
+
+## Features
+
+List of elements used in top manga and top anime with a recycler view
+SwipeRefresh used to refresh the list of data of the first page.
+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.
+URL link openable.
+
+Search pages for animes and mangas.
+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.
+
+## API
+Multiple calls of the REST API from jikan.moe.
+Usage of :
++ /v3/top/manga
++ /v3/top/anime
++ /v3/manga
++ /v3/anime
++ /v3/search/manga
++ /v3/search/anime
+
+## Data Storage
+Data storage with sharedpreferences used for the recycler view of top manga and top anime as well as the details
+Saves the detail page of an item when opened, not when the list is shown
+Usage of ScrollView in the detail page. Thus, items with long synopsis and background aren't cut down.
+
+## Design
+Used my "personal" theme colors for the app.
+It consists of some colors of the pink/purple "family" :
++ very dark purple : #09022A
++ very light magenta : #FF70FF
++ strong pink : #D52C70
++ slightly desaturated magenta : #C583B6
++ grayish magenta : #C9A6C9
+
+Also added the "bangers" font for the titles.
+
+## Gitflow
+Development done with a Gitflow workflow. I used master, release, develop and feature branches.
+
+## Architecture
+I used the MVC architecture.
+
+## TO-DO
++ Finishing MVC
++ Adding Singleton
++ Clicking on an image opens it full size
++ Firebase
++ Bottom navigation
++ ...
-- 
cgit v1.2.3


From d860cdd577879910792380cf0f227b206159a6f1 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Wed, 12 May 2021 14:49:55 +0200
Subject: creating anime and manga packages for controllers

---
 .../controller/SearchAnimeController.kt            |  73 ------------
 .../controller/SearchMangaController.kt            |  73 ------------
 .../presentation/controller/TopAnimeController.kt  | 131 ---------------------
 .../presentation/controller/TopMangaController.kt  | 131 ---------------------
 .../controller/anime/SearchAnimeController.kt      |  73 ++++++++++++
 .../controller/anime/TopAnimeController.kt         | 131 +++++++++++++++++++++
 .../controller/manga/SearchMangaController.kt      |  73 ++++++++++++
 .../controller/manga/TopMangaController.kt         | 131 +++++++++++++++++++++
 .../presentation/view/anime/SearchAnimePage.kt     |   2 +-
 .../aniki/presentation/view/anime/TopAnimePage.kt  |   2 +-
 .../presentation/view/manga/SearchMangaPage.kt     |   2 +-
 .../aniki/presentation/view/manga/TopMangaPage.kt  |   2 +-
 12 files changed, 412 insertions(+), 412 deletions(-)
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchAnimeController.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchMangaController.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopAnimeController.kt
 delete mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/SearchAnimeController.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/TopAnimeController.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/SearchMangaController.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/TopMangaController.kt

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchAnimeController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchAnimeController.kt
deleted file mode 100644
index d00137d..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchAnimeController.kt
+++ /dev/null
@@ -1,73 +0,0 @@
-package xyz.adjutor.aniki.presentation.controller
-
-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.data.anime.SearchAnimeApi
-import xyz.adjutor.aniki.presentation.model.anime.SearchAnime
-import xyz.adjutor.aniki.presentation.model.anime.SearchAnimeResponse
-import xyz.adjutor.aniki.presentation.view.anime.SearchAnimePage
-
-class SearchAnimeController {
-
-    lateinit var gson: Gson
-    lateinit var baseUrl: String //the api's base url
-    lateinit var view: SearchAnimePage
-
-    fun onStart(searchAnimePage: SearchAnimePage) {
-
-        view = searchAnimePage
-        baseUrl = "https://api.jikan.moe/" //the api's base url
-        gson = GsonBuilder()
-            .setLenient()
-            .create()
-    }
-
-    //call the API and show the list
-    private fun makeApiCall(view: SearchAnimePage, BASE_URL: String, query: String) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(SearchAnimeApi::class.java)
-        val call =
-            service.getSearchAnimeData(q = query) //fate is an exemple, we'll have to replace it by the user input.
-
-        call.enqueue(object : Callback<SearchAnimeResponse> {
-            override fun onResponse(
-                call: Call<SearchAnimeResponse>,
-                response: Response<SearchAnimeResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val animeList: List<SearchAnime> = response.body()!!
-                        .getResults() //getting the "search" field containing our list of SearchAnimes
-
-                    view.showList(
-                        view.requireView(),
-                        animeList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    view.showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<SearchAnimeResponse>, t: Throwable) {
-                view.showError()
-            }
-
-        })
-    }
-
-    fun updateList(userInput: String) {
-        makeApiCall(view, baseUrl, userInput)
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchMangaController.kt
deleted file mode 100644
index 572c57e..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/SearchMangaController.kt
+++ /dev/null
@@ -1,73 +0,0 @@
-package xyz.adjutor.aniki.presentation.controller
-
-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.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.manga.SearchMangaPage
-
-class SearchMangaController {
-
-    lateinit var gson: Gson
-    lateinit var baseUrl: String //the api's base url
-    lateinit var view: SearchMangaPage
-
-    fun onStart(searchMangaPage: SearchMangaPage) {
-
-        view = searchMangaPage
-        baseUrl = "https://api.jikan.moe/" //the api's base url
-        gson = GsonBuilder()
-            .setLenient()
-            .create()
-    }
-
-    //call the API and show the list
-    private fun makeApiCall(view: SearchMangaPage, 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
-
-                    view.showList(
-                        view.requireView(),
-                        mangaList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    view.showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<SearchMangaResponse>, t: Throwable) {
-                view.showError()
-            }
-
-        })
-    }
-
-    fun updateList(userInput: String) {
-        makeApiCall(view, baseUrl, userInput)
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopAnimeController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopAnimeController.kt
deleted file mode 100644
index 36026ec..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopAnimeController.kt
+++ /dev/null
@@ -1,131 +0,0 @@
-package xyz.adjutor.aniki.presentation.controller
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.view.View
-import com.google.gson.Gson
-import com.google.gson.GsonBuilder
-import com.google.gson.reflect.TypeToken
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
-import retrofit2.Retrofit
-import retrofit2.converter.gson.GsonConverterFactory
-import xyz.adjutor.aniki.data.anime.TopAnimeApi
-import xyz.adjutor.aniki.presentation.model.anime.TopAnime
-import xyz.adjutor.aniki.presentation.model.anime.TopAnimeResponse
-import xyz.adjutor.aniki.presentation.view.anime.TopAnimePage
-import java.lang.reflect.Type
-import kotlin.properties.Delegates
-
-class TopAnimeController {
-
-    lateinit var sharedPreferences: SharedPreferences
-    lateinit var gson: Gson
-    lateinit var baseUrl: String //the api's base url
-    var page by Delegates.notNull<Int>()
-    lateinit var view: TopAnimePage
-
-    fun onStart(topAnimePage: TopAnimePage, viewTopAnimePage: View) {
-
-        view = topAnimePage
-        baseUrl = "https://api.jikan.moe/" //the api's base url
-        page = 1
-        gson = GsonBuilder()
-            .setLenient()
-            .create()
-        sharedPreferences =
-            viewTopAnimePage.context.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
-
-
-        val animeList: List<TopAnime>? = getDataFromCache()
-        if (animeList != null) {
-            view.showList(viewTopAnimePage, animeList)
-        } else {
-            makeApiCall(view, baseUrl, 1)
-        }
-    }
-
-    fun makeApiCall(view: TopAnimePage, BASE_URL: String, page: Int) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(TopAnimeApi::class.java)
-        val call = service.getTopAnimeData(page)
-
-        call.enqueue(object : Callback<TopAnimeResponse> {
-            override fun onResponse(
-                call: Call<TopAnimeResponse>,
-                response: Response<TopAnimeResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val animeList: List<TopAnime> = response.body()!!
-                        .getResults() //getting the "top" field containing our list of TopAnimes
-                    saveList(animeList)
-                    view.showList(
-                        view.requireView(),
-                        animeList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    view.showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<TopAnimeResponse>, t: Throwable) {
-                view.showError()
-            }
-
-        })
-    }
-
-    private fun saveList(animeList: List<TopAnime>) {
-        val jsonString: String = gson.toJson(animeList)
-
-        sharedPreferences
-            .edit()
-            .putString("jsonAnimeList", jsonString)
-            .apply()
-    }
-
-    private fun getDataFromCache(): List<TopAnime>? {
-        //the value of the animeList json, if nothing is found, return null
-        val jsonAnime: String? = sharedPreferences.getString("jsonAnimeList", null)
-
-        //if it's null, well, return null
-        return if (jsonAnime == null) {
-            null
-        } else { //else deserialize the list and return it
-            val listType: Type = object : TypeToken<List<TopAnime>>() {}.type
-            gson.fromJson(jsonAnime, listType)
-        }
-    }
-
-
-    fun onButtonPrevClick() {
-        if (page > 1) { // if we're not on the first page, because we can't go back if we're on the first one.
-            page -= 1
-            makeApiCall(view, baseUrl, page)
-            view.showText("Page $page has been loaded.")
-        } else {
-            view.showText("You're already on page 1. (If you're actually not, refresh the list.)")
-        }
-    }
-
-    fun onButtonNextClick() {
-        page += 1
-        makeApiCall(view, baseUrl, page)
-        view.showText("Page $page has been loaded.")
-    }
-
-    fun updateList() {
-        makeApiCall(view, baseUrl, 1)
-        view.showText("Data refreshed")
-        page = 1
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
deleted file mode 100644
index 3fa1c2c..0000000
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/TopMangaController.kt
+++ /dev/null
@@ -1,131 +0,0 @@
-package xyz.adjutor.aniki.presentation.controller
-
-import android.content.Context
-import android.content.SharedPreferences
-import android.view.View
-import com.google.gson.Gson
-import com.google.gson.GsonBuilder
-import com.google.gson.reflect.TypeToken
-import retrofit2.Call
-import retrofit2.Callback
-import retrofit2.Response
-import retrofit2.Retrofit
-import retrofit2.converter.gson.GsonConverterFactory
-import xyz.adjutor.aniki.data.manga.TopMangaApi
-import xyz.adjutor.aniki.presentation.model.manga.TopManga
-import xyz.adjutor.aniki.presentation.model.manga.TopMangaResponse
-import xyz.adjutor.aniki.presentation.view.manga.TopMangaPage
-import java.lang.reflect.Type
-import kotlin.properties.Delegates
-
-class TopMangaController {
-
-    lateinit var sharedPreferences: SharedPreferences
-    lateinit var gson: Gson
-    lateinit var baseUrl: String //the api's base url
-    var page by Delegates.notNull<Int>()
-    lateinit var view: TopMangaPage
-
-    fun onStart(topMangaPage: TopMangaPage, viewTopMangaPage: View) {
-
-        view = topMangaPage
-        baseUrl = "https://api.jikan.moe/" //the api's base url
-        page = 1
-        gson = GsonBuilder()
-            .setLenient()
-            .create()
-        sharedPreferences =
-            viewTopMangaPage.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
-
-
-        val mangaList: List<TopManga>? = getDataFromCache()
-        if (mangaList != null) {
-            view.showList(viewTopMangaPage, mangaList)
-        } else {
-            makeApiCall(view, baseUrl, 1)
-        }
-    }
-
-    private fun makeApiCall(view: TopMangaPage, BASE_URL: String, page: Int) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(TopMangaApi::class.java)
-        val call = service.getTopMangaData(page)
-
-        call.enqueue(object : Callback<TopMangaResponse> {
-            override fun onResponse(
-                call: Call<TopMangaResponse>,
-                response: Response<TopMangaResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val mangaList: List<TopManga> = response.body()!!
-                        .getResults() //getting the "top" field containing our list of TopMangas
-                    saveList(mangaList)
-                    view.showList(
-                        view.requireView(),
-                        mangaList
-                    ) //calling the method in charge of displaying on the recyclerview
-
-                } else {
-                    view.showError() //a snackbar
-                }
-            }
-
-            override fun onFailure(call: Call<TopMangaResponse>, t: Throwable) {
-                view.showError()
-            }
-
-        })
-    }
-
-    private fun saveList(mangaList: List<TopManga>) {
-        val jsonString: String = gson.toJson(mangaList)
-
-        sharedPreferences
-            .edit()
-            .putString("jsonMangaList", jsonString)
-            .apply()
-    }
-
-    private fun getDataFromCache(): List<TopManga>? {
-        //the value of the mangaList json, if nothing is found, return null
-        val jsonManga: String? = sharedPreferences.getString("jsonMangaList", null)
-
-        //if it's null, well, return null
-        return if (jsonManga == null) {
-            null
-        } else { //else deserialize the list and return it
-            val listType: Type = object : TypeToken<List<TopManga>>() {}.type
-            gson.fromJson(jsonManga, listType)
-        }
-    }
-
-
-    fun onButtonPrevClick() {
-        if (page > 1) { // if we're not on the first page, because we can't go back if we're on the first one.
-            page -= 1
-            makeApiCall(view, baseUrl, page)
-            view.showText("Page $page has been loaded.")
-        } else {
-            view.showText("You're already on page 1. (If you're actually not, refresh the list.)")
-        }
-    }
-
-    fun onButtonNextClick() {
-        page += 1
-        makeApiCall(view, baseUrl, page)
-        view.showText("Page $page has been loaded.")
-    }
-
-    fun updateList() {
-        makeApiCall(view, baseUrl, 1)
-        view.showText("Data refreshed")
-        page = 1
-    }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/SearchAnimeController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/SearchAnimeController.kt
new file mode 100644
index 0000000..aa8487e
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/SearchAnimeController.kt
@@ -0,0 +1,73 @@
+package xyz.adjutor.aniki.presentation.controller.anime
+
+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.data.anime.SearchAnimeApi
+import xyz.adjutor.aniki.presentation.model.anime.SearchAnime
+import xyz.adjutor.aniki.presentation.model.anime.SearchAnimeResponse
+import xyz.adjutor.aniki.presentation.view.anime.SearchAnimePage
+
+class SearchAnimeController {
+
+    lateinit var gson: Gson
+    lateinit var baseUrl: String //the api's base url
+    lateinit var view: SearchAnimePage
+
+    fun onStart(searchAnimePage: SearchAnimePage) {
+
+        view = searchAnimePage
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+    }
+
+    //call the API and show the list
+    private fun makeApiCall(view: SearchAnimePage, BASE_URL: String, query: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(SearchAnimeApi::class.java)
+        val call =
+            service.getSearchAnimeData(q = query) //fate is an exemple, we'll have to replace it by the user input.
+
+        call.enqueue(object : Callback<SearchAnimeResponse> {
+            override fun onResponse(
+                call: Call<SearchAnimeResponse>,
+                response: Response<SearchAnimeResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val animeList: List<SearchAnime> = response.body()!!
+                        .getResults() //getting the "search" field containing our list of SearchAnimes
+
+                    view.showList(
+                        view.requireView(),
+                        animeList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    view.showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<SearchAnimeResponse>, t: Throwable) {
+                view.showError()
+            }
+
+        })
+    }
+
+    fun updateList(userInput: String) {
+        makeApiCall(view, baseUrl, userInput)
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/TopAnimeController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/TopAnimeController.kt
new file mode 100644
index 0000000..7105af5
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/TopAnimeController.kt
@@ -0,0 +1,131 @@
+package xyz.adjutor.aniki.presentation.controller.anime
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.view.View
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.data.anime.TopAnimeApi
+import xyz.adjutor.aniki.presentation.model.anime.TopAnime
+import xyz.adjutor.aniki.presentation.model.anime.TopAnimeResponse
+import xyz.adjutor.aniki.presentation.view.anime.TopAnimePage
+import java.lang.reflect.Type
+import kotlin.properties.Delegates
+
+class TopAnimeController {
+
+    lateinit var sharedPreferences: SharedPreferences
+    lateinit var gson: Gson
+    lateinit var baseUrl: String //the api's base url
+    var page by Delegates.notNull<Int>()
+    lateinit var view: TopAnimePage
+
+    fun onStart(topAnimePage: TopAnimePage, viewTopAnimePage: View) {
+
+        view = topAnimePage
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        page = 1
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+        sharedPreferences =
+            viewTopAnimePage.context.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
+
+
+        val animeList: List<TopAnime>? = getDataFromCache()
+        if (animeList != null) {
+            view.showList(viewTopAnimePage, animeList)
+        } else {
+            makeApiCall(view, baseUrl, 1)
+        }
+    }
+
+    fun makeApiCall(view: TopAnimePage, BASE_URL: String, page: Int) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(TopAnimeApi::class.java)
+        val call = service.getTopAnimeData(page)
+
+        call.enqueue(object : Callback<TopAnimeResponse> {
+            override fun onResponse(
+                call: Call<TopAnimeResponse>,
+                response: Response<TopAnimeResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val animeList: List<TopAnime> = response.body()!!
+                        .getResults() //getting the "top" field containing our list of TopAnimes
+                    saveList(animeList)
+                    view.showList(
+                        view.requireView(),
+                        animeList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    view.showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<TopAnimeResponse>, t: Throwable) {
+                view.showError()
+            }
+
+        })
+    }
+
+    private fun saveList(animeList: List<TopAnime>) {
+        val jsonString: String = gson.toJson(animeList)
+
+        sharedPreferences
+            .edit()
+            .putString("jsonAnimeList", jsonString)
+            .apply()
+    }
+
+    private fun getDataFromCache(): List<TopAnime>? {
+        //the value of the animeList json, if nothing is found, return null
+        val jsonAnime: String? = sharedPreferences.getString("jsonAnimeList", null)
+
+        //if it's null, well, return null
+        return if (jsonAnime == null) {
+            null
+        } else { //else deserialize the list and return it
+            val listType: Type = object : TypeToken<List<TopAnime>>() {}.type
+            gson.fromJson(jsonAnime, listType)
+        }
+    }
+
+
+    fun onButtonPrevClick() {
+        if (page > 1) { // if we're not on the first page, because we can't go back if we're on the first one.
+            page -= 1
+            makeApiCall(view, baseUrl, page)
+            view.showText("Page $page has been loaded.")
+        } else {
+            view.showText("You're already on page 1. (If you're actually not, refresh the list.)")
+        }
+    }
+
+    fun onButtonNextClick() {
+        page += 1
+        makeApiCall(view, baseUrl, page)
+        view.showText("Page $page has been loaded.")
+    }
+
+    fun updateList() {
+        makeApiCall(view, baseUrl, 1)
+        view.showText("Data refreshed")
+        page = 1
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/SearchMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/SearchMangaController.kt
new file mode 100644
index 0000000..32e46eb
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/SearchMangaController.kt
@@ -0,0 +1,73 @@
+package xyz.adjutor.aniki.presentation.controller.manga
+
+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.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.manga.SearchMangaPage
+
+class SearchMangaController {
+
+    lateinit var gson: Gson
+    lateinit var baseUrl: String //the api's base url
+    lateinit var view: SearchMangaPage
+
+    fun onStart(searchMangaPage: SearchMangaPage) {
+
+        view = searchMangaPage
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+    }
+
+    //call the API and show the list
+    private fun makeApiCall(view: SearchMangaPage, 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
+
+                    view.showList(
+                        view.requireView(),
+                        mangaList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    view.showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<SearchMangaResponse>, t: Throwable) {
+                view.showError()
+            }
+
+        })
+    }
+
+    fun updateList(userInput: String) {
+        makeApiCall(view, baseUrl, userInput)
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/TopMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/TopMangaController.kt
new file mode 100644
index 0000000..845e750
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/TopMangaController.kt
@@ -0,0 +1,131 @@
+package xyz.adjutor.aniki.presentation.controller.manga
+
+import android.content.Context
+import android.content.SharedPreferences
+import android.view.View
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.data.manga.TopMangaApi
+import xyz.adjutor.aniki.presentation.model.manga.TopManga
+import xyz.adjutor.aniki.presentation.model.manga.TopMangaResponse
+import xyz.adjutor.aniki.presentation.view.manga.TopMangaPage
+import java.lang.reflect.Type
+import kotlin.properties.Delegates
+
+class TopMangaController {
+
+    lateinit var sharedPreferences: SharedPreferences
+    lateinit var gson: Gson
+    lateinit var baseUrl: String //the api's base url
+    var page by Delegates.notNull<Int>()
+    lateinit var view: TopMangaPage
+
+    fun onStart(topMangaPage: TopMangaPage, viewTopMangaPage: View) {
+
+        view = topMangaPage
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        page = 1
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+        sharedPreferences =
+            viewTopMangaPage.context.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
+
+
+        val mangaList: List<TopManga>? = getDataFromCache()
+        if (mangaList != null) {
+            view.showList(viewTopMangaPage, mangaList)
+        } else {
+            makeApiCall(view, baseUrl, 1)
+        }
+    }
+
+    private fun makeApiCall(view: TopMangaPage, BASE_URL: String, page: Int) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(TopMangaApi::class.java)
+        val call = service.getTopMangaData(page)
+
+        call.enqueue(object : Callback<TopMangaResponse> {
+            override fun onResponse(
+                call: Call<TopMangaResponse>,
+                response: Response<TopMangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val mangaList: List<TopManga> = response.body()!!
+                        .getResults() //getting the "top" field containing our list of TopMangas
+                    saveList(mangaList)
+                    view.showList(
+                        view.requireView(),
+                        mangaList
+                    ) //calling the method in charge of displaying on the recyclerview
+
+                } else {
+                    view.showError() //a snackbar
+                }
+            }
+
+            override fun onFailure(call: Call<TopMangaResponse>, t: Throwable) {
+                view.showError()
+            }
+
+        })
+    }
+
+    private fun saveList(mangaList: List<TopManga>) {
+        val jsonString: String = gson.toJson(mangaList)
+
+        sharedPreferences
+            .edit()
+            .putString("jsonMangaList", jsonString)
+            .apply()
+    }
+
+    private fun getDataFromCache(): List<TopManga>? {
+        //the value of the mangaList json, if nothing is found, return null
+        val jsonManga: String? = sharedPreferences.getString("jsonMangaList", null)
+
+        //if it's null, well, return null
+        return if (jsonManga == null) {
+            null
+        } else { //else deserialize the list and return it
+            val listType: Type = object : TypeToken<List<TopManga>>() {}.type
+            gson.fromJson(jsonManga, listType)
+        }
+    }
+
+
+    fun onButtonPrevClick() {
+        if (page > 1) { // if we're not on the first page, because we can't go back if we're on the first one.
+            page -= 1
+            makeApiCall(view, baseUrl, page)
+            view.showText("Page $page has been loaded.")
+        } else {
+            view.showText("You're already on page 1. (If you're actually not, refresh the list.)")
+        }
+    }
+
+    fun onButtonNextClick() {
+        page += 1
+        makeApiCall(view, baseUrl, page)
+        view.showText("Page $page has been loaded.")
+    }
+
+    fun updateList() {
+        makeApiCall(view, baseUrl, 1)
+        view.showText("Data refreshed")
+        page = 1
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt
index 4d01f4f..764601f 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/SearchAnimePage.kt
@@ -16,7 +16,7 @@ import androidx.recyclerview.widget.RecyclerView
 import com.google.android.material.snackbar.Snackbar
 import com.google.android.material.textfield.TextInputEditText
 import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.presentation.controller.SearchAnimeController
+import xyz.adjutor.aniki.presentation.controller.anime.SearchAnimeController
 import xyz.adjutor.aniki.presentation.model.anime.SearchAnime
 import xyz.adjutor.aniki.presentation.view.MainActivity
 
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt
index 40df41c..5453154 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/TopAnimePage.kt
@@ -12,7 +12,7 @@ import androidx.recyclerview.widget.RecyclerView
 import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
 import com.google.android.material.snackbar.Snackbar
 import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.presentation.controller.TopAnimeController
+import xyz.adjutor.aniki.presentation.controller.anime.TopAnimeController
 import xyz.adjutor.aniki.presentation.model.anime.TopAnime
 
 //view
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
index 853ee22..b6ae2bb 100644
--- 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
@@ -16,7 +16,7 @@ import androidx.recyclerview.widget.RecyclerView
 import com.google.android.material.snackbar.Snackbar
 import com.google.android.material.textfield.TextInputEditText
 import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.presentation.controller.SearchMangaController
+import xyz.adjutor.aniki.presentation.controller.manga.SearchMangaController
 import xyz.adjutor.aniki.presentation.model.manga.SearchManga
 import xyz.adjutor.aniki.presentation.view.MainActivity
 
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
index 32fa1b1..98eb0dd 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/TopMangaPage.kt
@@ -12,7 +12,7 @@ import androidx.recyclerview.widget.RecyclerView
 import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
 import com.google.android.material.snackbar.Snackbar
 import xyz.adjutor.aniki.R
-import xyz.adjutor.aniki.presentation.controller.TopMangaController
+import xyz.adjutor.aniki.presentation.controller.manga.TopMangaController
 import xyz.adjutor.aniki.presentation.model.manga.TopManga
 
 //view
-- 
cgit v1.2.3


From 55ae44495fb566050e20649452ce6bbe6978a100 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Wed, 12 May 2021 14:56:15 +0200
Subject: creating empty controller files for detail pages

---
 .../aniki/presentation/controller/anime/DetailSearchAnimeController.kt | 3 +++
 .../aniki/presentation/controller/anime/DetailTopAnimeController.kt    | 3 +++
 .../aniki/presentation/controller/manga/DetailSearchMangaController.kt | 3 +++
 .../aniki/presentation/controller/manga/DetailTopMangaController.kt    | 3 +++
 4 files changed, 12 insertions(+)
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailSearchAnimeController.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailTopAnimeController.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailSearchMangaController.kt
 create mode 100644 app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailSearchAnimeController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailSearchAnimeController.kt
new file mode 100644
index 0000000..5dc0a81
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailSearchAnimeController.kt
@@ -0,0 +1,3 @@
+package xyz.adjutor.aniki.presentation.controller.anime
+
+class DetailSearchAnimeController
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailTopAnimeController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailTopAnimeController.kt
new file mode 100644
index 0000000..01ec148
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailTopAnimeController.kt
@@ -0,0 +1,3 @@
+package xyz.adjutor.aniki.presentation.controller.anime
+
+class DetailTopAnimeController
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailSearchMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailSearchMangaController.kt
new file mode 100644
index 0000000..13993d8
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailSearchMangaController.kt
@@ -0,0 +1,3 @@
+package xyz.adjutor.aniki.presentation.controller.manga
+
+class DetailSearchMangaController
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt
new file mode 100644
index 0000000..e0f83b9
--- /dev/null
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt
@@ -0,0 +1,3 @@
+package xyz.adjutor.aniki.presentation.controller.manga
+
+class DetailTopMangaController
\ No newline at end of file
-- 
cgit v1.2.3


From ed22cdefdc8db6e09c801369aaf3bd5ef9950c60 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Thu, 13 May 2021 13:06:19 +0200
Subject: DetailTopMangaController.kt and the activity are working fine.

---
 .../controller/manga/DetailTopMangaController.kt   |  98 +++++++++++++++++-
 .../view/manga/DetailTopMangaActivity.kt           | 109 ++++-----------------
 2 files changed, 116 insertions(+), 91 deletions(-)

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt
index e0f83b9..2d99a45 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt
@@ -1,3 +1,99 @@
 package xyz.adjutor.aniki.presentation.controller.manga
 
-class DetailTopMangaController
\ No newline at end of file
+import android.content.Context
+import android.content.SharedPreferences
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.data.manga.MangaApi
+import xyz.adjutor.aniki.presentation.model.manga.MangaResponse
+import xyz.adjutor.aniki.presentation.view.manga.DetailTopMangaActivity
+import java.lang.reflect.Type
+
+class DetailTopMangaController {
+
+    private lateinit var sharedPreferences: SharedPreferences
+    lateinit var gson: Gson
+    private lateinit var baseUrl: String //the api's base url
+    lateinit var view: DetailTopMangaActivity
+
+    fun onStart(DetailTopMangaActivity: DetailTopMangaActivity) {
+
+        view = DetailTopMangaActivity
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+        sharedPreferences =
+            view.applicationContext.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
+    }
+
+    fun launch(mangaId: String) {
+        val manga: MangaResponse? = getDataFromCache(mangaId)
+        if (manga != null) {
+            view.showDetail(manga)
+        } else {
+            //taking the API's fields I want and displaying them
+            makeApiCall(baseUrl, mangaId)
+        }
+    }
+
+    private fun getDataFromCache(mangaId: String): MangaResponse? {
+        val jsonManga: String? = sharedPreferences.getString(mangaId, null)
+
+        return if (jsonManga == null) {
+            null
+        } else {
+            val type: Type = object : TypeToken<MangaResponse>() {}.type
+            gson.fromJson(jsonManga, type)
+        }
+    }
+
+    private fun makeApiCall(BASE_URL: String, mangaId: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(MangaApi::class.java)
+        val call = service.getMangaData(mangaId) //based on the id
+
+        call.enqueue(object : Callback<MangaResponse> {
+            override fun onResponse(
+                call: Call<MangaResponse>,
+                response: Response<MangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val manga = response.body() //getting the MangaResponse fields
+                    saveList(manga)
+                    view.showDetail(manga!!)
+
+                } else {
+                    view.showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
+                view.showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    fun saveList(manga: MangaResponse?) {
+        val jsonString: String = gson.toJson(manga)
+
+        sharedPreferences
+            .edit()
+            .putString(manga?.mal_id.toString(), jsonString)
+            .apply()
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt
index 2bf2f14..74f7595 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt
@@ -1,7 +1,5 @@
 package xyz.adjutor.aniki.presentation.view.manga
 
-import android.content.Context
-import android.content.SharedPreferences
 import android.os.Bundle
 import android.widget.ImageView
 import android.widget.TextView
@@ -9,44 +7,33 @@ import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
 import com.bumptech.glide.Glide
 import com.bumptech.glide.request.RequestOptions
-import com.google.gson.GsonBuilder
-import com.google.gson.reflect.TypeToken
-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.MangaApi
+import xyz.adjutor.aniki.presentation.controller.manga.DetailTopMangaController
 import xyz.adjutor.aniki.presentation.model.manga.MangaResponse
-import java.lang.reflect.Type
 
 class DetailTopMangaActivity : AppCompatActivity() {
 
-    private var baseUrl = "https://api.jikan.moe/"
-    private lateinit var sharedPreferences: SharedPreferences
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    //used in the list
-    private val intentMangaTitle = "themangatitle"
-    private val intentMangaRank = "themangarank"
-    private val intentMangaScore = "themangascore"
-    private val intentMangaImageUrl = "themangaimageurl"
-
-    //only used for the detail
-    private val intentMangaId = "themangaid"
-    private val intentMangaVolumes = "themangavolumes"
-    private val intentMangaStartDate = "themangastartdate"
-    private val intentMangaEndDate = "themangaenddate"
-    private val intentMangaUrl = "themangaurl"
+    lateinit var controller: DetailTopMangaController
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_detail_top_manga)
 
-        sharedPreferences = this.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
+        controller = DetailTopMangaController()
+        controller.onStart(this)
+
+        //used in the list
+        val intentMangaTitle = "themangatitle"
+        val intentMangaRank = "themangarank"
+        val intentMangaScore = "themangascore"
+        val intentMangaImageUrl = "themangaimageurl"
+
+        //only used for the detail
+        val intentMangaId = "themangaid"
+        val intentMangaVolumes = "themangavolumes"
+        val intentMangaStartDate = "themangastartdate"
+        val intentMangaEndDate = "themangaenddate"
+        val intentMangaUrl = "themangaurl"
 
         val mangaTitle = intent.getStringExtra(intentMangaTitle)
         val mangaRank = intent.getStringExtra(intentMangaRank)
@@ -98,61 +85,11 @@ class DetailTopMangaActivity : AppCompatActivity() {
 
         tvUrl.text = mangaUrl
 
-        val manga: MangaResponse? = getDataFromCache(mangaId.toString())
-        if (manga != null) {
-            showDetail(manga)
-        } else {
-            //taking the API's fields I want and displaying them
-            makeApiCall(baseUrl, mangaId.toString())
-        }
-
-    }
-
-    private fun getDataFromCache(mangaId: String): MangaResponse? {
-        val jsonManga: String? = sharedPreferences.getString(mangaId, null)
-
-        return if (jsonManga == null) {
-            null
-        } else {
-            val type: Type = object : TypeToken<MangaResponse>() {}.type
-            gson.fromJson(jsonManga, type)
-        }
-    }
-
-    private fun makeApiCall(BASE_URL: String, mangaId: String) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(MangaApi::class.java)
-        val call = service.getMangaData(mangaId) //based on the id
-
-        call.enqueue(object : Callback<MangaResponse> {
-            override fun onResponse(
-                call: Call<MangaResponse>,
-                response: Response<MangaResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+        controller.launch(mangaId.toString())
 
-                    val manga = response.body() //getting the MangaResponse fields
-                    saveList(manga)
-                    showDetail(manga!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
     }
 
-    private fun showDetail(manga: MangaResponse) {
+    fun showDetail(manga: MangaResponse) {
         //elements from MangaResponse
         val tvChapters: TextView = findViewById(R.id.tv_chapters)
         val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
@@ -182,12 +119,4 @@ class DetailTopMangaActivity : AppCompatActivity() {
         return "Unknown"
     }
 
-    fun saveList(manga: MangaResponse?) {
-        val jsonString: String = gson.toJson(manga)
-
-        sharedPreferences
-            .edit()
-            .putString(manga?.mal_id.toString(), jsonString)
-            .apply()
-    }
 }
\ No newline at end of file
-- 
cgit v1.2.3


From 69d34a4e3844c148cf637a5135872bb09ef3d07a Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Thu, 13 May 2021 13:09:14 +0200
Subject: Redefining how the controller is started.

---
 .../aniki/presentation/controller/manga/DetailTopMangaController.kt   | 4 +---
 .../adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt   | 3 +--
 2 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt
index 2d99a45..807421c 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailTopMangaController.kt
@@ -22,7 +22,7 @@ class DetailTopMangaController {
     private lateinit var baseUrl: String //the api's base url
     lateinit var view: DetailTopMangaActivity
 
-    fun onStart(DetailTopMangaActivity: DetailTopMangaActivity) {
+    fun onStart(DetailTopMangaActivity: DetailTopMangaActivity, mangaId: String) {
 
         view = DetailTopMangaActivity
         baseUrl = "https://api.jikan.moe/" //the api's base url
@@ -31,9 +31,7 @@ class DetailTopMangaController {
             .create()
         sharedPreferences =
             view.applicationContext.getSharedPreferences("sp_manga", Context.MODE_PRIVATE)
-    }
 
-    fun launch(mangaId: String) {
         val manga: MangaResponse? = getDataFromCache(mangaId)
         if (manga != null) {
             view.showDetail(manga)
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt
index 74f7595..2a4b28b 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailTopMangaActivity.kt
@@ -20,7 +20,6 @@ class DetailTopMangaActivity : AppCompatActivity() {
         setContentView(R.layout.activity_detail_top_manga)
 
         controller = DetailTopMangaController()
-        controller.onStart(this)
 
         //used in the list
         val intentMangaTitle = "themangatitle"
@@ -85,7 +84,7 @@ class DetailTopMangaActivity : AppCompatActivity() {
 
         tvUrl.text = mangaUrl
 
-        controller.launch(mangaId.toString())
+        controller.onStart(this, mangaId.toString())
 
     }
 
-- 
cgit v1.2.3


From d6c121e3f626d5e012cdeb984feee7cb522b1442 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Thu, 13 May 2021 13:19:44 +0200
Subject: DetailTopAnimeController.kt and the activity are working fine.

---
 .../controller/anime/DetailTopAnimeController.kt   |  96 ++++++++++++++++++-
 .../view/anime/DetailTopAnimeActivity.kt           | 104 ++++-----------------
 2 files changed, 111 insertions(+), 89 deletions(-)

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailTopAnimeController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailTopAnimeController.kt
index 01ec148..6f3cedb 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailTopAnimeController.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailTopAnimeController.kt
@@ -1,3 +1,97 @@
 package xyz.adjutor.aniki.presentation.controller.anime
 
-class DetailTopAnimeController
\ No newline at end of file
+import android.content.Context
+import android.content.SharedPreferences
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.google.gson.reflect.TypeToken
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
+import xyz.adjutor.aniki.data.anime.AnimeApi
+import xyz.adjutor.aniki.presentation.model.anime.AnimeResponse
+import xyz.adjutor.aniki.presentation.view.anime.DetailTopAnimeActivity
+import java.lang.reflect.Type
+
+class DetailTopAnimeController {
+
+    private lateinit var sharedPreferences: SharedPreferences
+    lateinit var gson: Gson
+    private lateinit var baseUrl: String //the api's base url
+    lateinit var view: DetailTopAnimeActivity
+
+    fun onStart(DetailTopAnimeActivity: DetailTopAnimeActivity, animeId: String) {
+
+        view = DetailTopAnimeActivity
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+        sharedPreferences =
+            view.applicationContext.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
+
+        val anime: AnimeResponse? = getDataFromCache(animeId)
+        if (anime != null) {
+            view.showDetail(anime)
+        } else {
+            //taking the API's fields I want and displaying them
+            makeApiCall(baseUrl, animeId)
+        }
+    }
+
+    private fun getDataFromCache(animeId: String): AnimeResponse? {
+        val jsonAnime: String? = sharedPreferences.getString(animeId, null)
+
+        return if (jsonAnime == null) {
+            null
+        } else {
+            val type: Type = object : TypeToken<AnimeResponse>() {}.type
+            gson.fromJson(jsonAnime, type)
+        }
+    }
+
+    private fun makeApiCall(BASE_URL: String, animeId: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(AnimeApi::class.java)
+        val call = service.getAnimeData(animeId) //based on the id
+
+        call.enqueue(object : Callback<AnimeResponse> {
+            override fun onResponse(
+                call: Call<AnimeResponse>,
+                response: Response<AnimeResponse>
+            ) {
+                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 AnimeResponse fields
+                    saveList(anime)
+                    view.showDetail(anime!!)
+
+                } else {
+                    view.showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
+                view.showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+    fun saveList(anime: AnimeResponse?) {
+        val jsonString: String = gson.toJson(anime)
+
+        sharedPreferences
+            .edit()
+            .putString(anime?.mal_id.toString(), jsonString)
+            .apply()
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailTopAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailTopAnimeActivity.kt
index 54c34d5..b8cf505 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailTopAnimeActivity.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailTopAnimeActivity.kt
@@ -1,7 +1,5 @@
 package xyz.adjutor.aniki.presentation.view.anime
 
-import android.content.Context
-import android.content.SharedPreferences
 import android.os.Bundle
 import android.widget.ImageView
 import android.widget.TextView
@@ -9,42 +7,30 @@ import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
 import com.bumptech.glide.Glide
 import com.bumptech.glide.request.RequestOptions
-import com.google.gson.GsonBuilder
-import com.google.gson.reflect.TypeToken
-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.anime.AnimeApi
+import xyz.adjutor.aniki.presentation.controller.anime.DetailTopAnimeController
 import xyz.adjutor.aniki.presentation.model.anime.AnimeResponse
-import java.lang.reflect.Type
 
 class DetailTopAnimeActivity : AppCompatActivity() {
 
-    private var baseUrl = "https://api.jikan.moe/"
-    private lateinit var sharedPreferences: SharedPreferences
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    private val intentAnimeId = "theanimeid"
-    private val intentAnimeTitle = "theanimetitle"
-    private val intentAnimeRank = "theanimerank"
-    private val intentAnimeScore = "theanimescore"
-    private val intentAnimeImageUrl = "theanimeimageurl"
-
-    private val intentAnimeEpisodes = "theanimeepisodes"
-    private val intentAnimeStartDate = "theanimestartdate"
-    private val intentAnimeEndDate = "theanimeenddate"
-    private val intentAnimeUrl = "theanimeurl"
+    lateinit var controller: DetailTopAnimeController
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_detail_top_anime)
 
-        sharedPreferences = this.getSharedPreferences("sp_anime", Context.MODE_PRIVATE)
+        controller = DetailTopAnimeController()
+
+        val intentAnimeId = "theanimeid"
+        val intentAnimeTitle = "theanimetitle"
+        val intentAnimeRank = "theanimerank"
+        val intentAnimeScore = "theanimescore"
+        val intentAnimeImageUrl = "theanimeimageurl"
+
+        val intentAnimeEpisodes = "theanimeepisodes"
+        val intentAnimeStartDate = "theanimestartdate"
+        val intentAnimeEndDate = "theanimeenddate"
+        val intentAnimeUrl = "theanimeurl"
 
         val animeId = intent.getStringExtra(intentAnimeId)
         val animeTitle = intent.getStringExtra(intentAnimeTitle)
@@ -95,61 +81,11 @@ class DetailTopAnimeActivity : AppCompatActivity() {
 
         tvUrl.text = animeUrl
 
-        val anime: AnimeResponse? = getDataFromCache(animeId.toString())
-        if (anime != null) {
-            showDetail(anime)
-        } else {
-            //taking the API's fields I want and displaying them
-            makeApiCall(baseUrl, animeId.toString())
-        }
-
-    }
-
-    private fun getDataFromCache(animeId: String): AnimeResponse? {
-        val jsonAnime: String? = sharedPreferences.getString(animeId, null)
-
-        return if (jsonAnime == null) {
-            null
-        } else {
-            val type: Type = object : TypeToken<AnimeResponse>() {}.type
-            gson.fromJson(jsonAnime, type)
-        }
-    }
-
-    private fun makeApiCall(BASE_URL: String, animeId: String) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(AnimeApi::class.java)
-        val call = service.getAnimeData(animeId) //based on the id
-
-        call.enqueue(object : Callback<AnimeResponse> {
-            override fun onResponse(
-                call: Call<AnimeResponse>,
-                response: Response<AnimeResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+        controller.onStart(this, animeId.toString())
 
-                    val anime = response.body() //getting the AnimeResponse fields
-                    saveList(anime)
-                    showDetail(anime!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
     }
 
-    private fun showDetail(anime: AnimeResponse) {
+    fun showDetail(anime: AnimeResponse) {
         //elements from AnimeResponse
         val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
 
@@ -165,12 +101,4 @@ class DetailTopAnimeActivity : AppCompatActivity() {
         return "Unknown"
     }
 
-    fun saveList(anime: AnimeResponse?) {
-        val jsonString: String = gson.toJson(anime)
-
-        sharedPreferences
-            .edit()
-            .putString(anime?.mal_id.toString(), jsonString)
-            .apply()
-    }
 }
\ No newline at end of file
-- 
cgit v1.2.3


From dea0bc3e943e46b9bbea14cc759ce1a62ef9f197 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Thu, 13 May 2021 13:30:29 +0200
Subject: DetailSearchMangaController.kt and activity OK

---
 .../manga/DetailSearchMangaController.kt           | 62 ++++++++++++++++-
 .../view/manga/DetailSearchMangaActivity.kt        | 77 ++++++----------------
 2 files changed, 80 insertions(+), 59 deletions(-)

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailSearchMangaController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailSearchMangaController.kt
index 13993d8..a874976 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailSearchMangaController.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/manga/DetailSearchMangaController.kt
@@ -1,3 +1,63 @@
 package xyz.adjutor.aniki.presentation.controller.manga
 
-class DetailSearchMangaController
\ No newline at end of file
+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.data.manga.MangaApi
+import xyz.adjutor.aniki.presentation.model.manga.MangaResponse
+import xyz.adjutor.aniki.presentation.view.manga.DetailSearchMangaActivity
+
+class DetailSearchMangaController {
+
+    lateinit var gson: Gson
+    private lateinit var baseUrl: String //the api's base url
+    lateinit var view: DetailSearchMangaActivity
+
+    fun onStart(DetailSearchMangaActivity: DetailSearchMangaActivity, mangaId: String) {
+
+        view = DetailSearchMangaActivity
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+
+        makeApiCall(baseUrl, mangaId)
+    }
+
+    private fun makeApiCall(BASE_URL: String, mangaId: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(MangaApi::class.java)
+        val call = service.getMangaData(mangaId) //based on the id
+
+        call.enqueue(object : Callback<MangaResponse> {
+            override fun onResponse(
+                call: Call<MangaResponse>,
+                response: Response<MangaResponse>
+            ) {
+                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
+
+                    val manga = response.body() //getting the MangaResponse fields
+                    view.showDetail(manga!!)
+
+                } else {
+                    view.showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
+                view.showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailSearchMangaActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailSearchMangaActivity.kt
index d04760b..83beb9b 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailSearchMangaActivity.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/manga/DetailSearchMangaActivity.kt
@@ -7,40 +7,33 @@ import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
 import com.bumptech.glide.Glide
 import com.bumptech.glide.request.RequestOptions
-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.MangaApi
+import xyz.adjutor.aniki.presentation.controller.manga.DetailSearchMangaController
 import xyz.adjutor.aniki.presentation.model.manga.MangaResponse
 
 class DetailSearchMangaActivity : AppCompatActivity() {
 
-    private var baseUrl = "https://api.jikan.moe/"
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    //used in the list
-    private val intentMangaImageUrl = "themangaimageurl"
-    private val intentMangaTitle = "themangatitle"
-    private val intentMangaScore = "themangascore"
-
-    //only used for the detail
-    private val intentMangaId = "themangaid"
-    private val intentMangaUrl = "themangaurl"
-    private val intentMangaChapters = "themangachapters"
-    private val intentMangaVolumes = "themangavolumes"
-    private val intentMangaStartDate = "themangastartdate"
-    private val intentMangaEndDate = "themangaenddate"
+    lateinit var controller: DetailSearchMangaController
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_detail_search_manga)
 
+        controller = DetailSearchMangaController()
+
+        //used in the list
+        val intentMangaImageUrl = "themangaimageurl"
+        val intentMangaTitle = "themangatitle"
+        val intentMangaScore = "themangascore"
+
+        //only used for the detail
+        val intentMangaId = "themangaid"
+        val intentMangaUrl = "themangaurl"
+        val intentMangaChapters = "themangachapters"
+        val intentMangaVolumes = "themangavolumes"
+        val intentMangaStartDate = "themangastartdate"
+        val intentMangaEndDate = "themangaenddate"
+
         val mangaImageUrl = intent.getStringExtra(intentMangaImageUrl)
         val mangaTitle = intent.getStringExtra(intentMangaTitle)
         val mangaScore = intent.getStringExtra(intentMangaScore)
@@ -97,7 +90,7 @@ class DetailSearchMangaActivity : AppCompatActivity() {
             fieldIsNull()
         }
 
-        makeApiCall(baseUrl, mangaId.toString())
+        controller.onStart(this, mangaId.toString())
 
     }
 
@@ -109,39 +102,7 @@ class DetailSearchMangaActivity : AppCompatActivity() {
 
     }
 
-    private fun makeApiCall(BASE_URL: String, mangaId: String) {
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(MangaApi::class.java)
-        val call = service.getMangaData(mangaId) //based on the id
-
-        call.enqueue(object : Callback<MangaResponse> {
-            override fun onResponse(
-                call: Call<MangaResponse>,
-                response: Response<MangaResponse>
-            ) {
-                if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty
-
-                    val manga = response.body() //getting the MangaResponse fields
-                    showDetail(manga!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<MangaResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(manga: MangaResponse) {
+    fun showDetail(manga: MangaResponse) {
         //elements from MangaResponse
         val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
         val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-- 
cgit v1.2.3


From be1df4b40a41ae1d4c727637a326ad32eb729ed9 Mon Sep 17 00:00:00 2001
From: Clyhtsuriva <aimeric@adjutor.xyz>
Date: Thu, 13 May 2021 13:35:46 +0200
Subject: DetailSearchAnimeController.kt and activity OK

---
 .../anime/DetailSearchAnimeController.kt           | 62 ++++++++++++++++-
 .../view/anime/DetailSearchAnimeActivity.kt        | 78 +++++-----------------
 2 files changed, 79 insertions(+), 61 deletions(-)

diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailSearchAnimeController.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailSearchAnimeController.kt
index 5dc0a81..3114d01 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailSearchAnimeController.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/controller/anime/DetailSearchAnimeController.kt
@@ -1,3 +1,63 @@
 package xyz.adjutor.aniki.presentation.controller.anime
 
-class DetailSearchAnimeController
\ No newline at end of file
+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.data.anime.AnimeApi
+import xyz.adjutor.aniki.presentation.model.anime.AnimeResponse
+import xyz.adjutor.aniki.presentation.view.anime.DetailSearchAnimeActivity
+
+class DetailSearchAnimeController {
+
+    lateinit var gson: Gson
+    private lateinit var baseUrl: String //the api's base url
+    lateinit var view: DetailSearchAnimeActivity
+
+    fun onStart(DetailSearchAnimeActivity: DetailSearchAnimeActivity, animeId: String) {
+
+        view = DetailSearchAnimeActivity
+        baseUrl = "https://api.jikan.moe/" //the api's base url
+        gson = GsonBuilder()
+            .setLenient()
+            .create()
+
+        makeApiCall(baseUrl, animeId)
+    }
+
+    private fun makeApiCall(BASE_URL: String, animeId: String) {
+
+        val retrofit = Retrofit.Builder()
+            .baseUrl(BASE_URL)
+            .addConverterFactory(GsonConverterFactory.create(gson))
+            .build()
+
+        val service = retrofit.create(AnimeApi::class.java)
+        val call = service.getAnimeData(animeId) //based on the id
+
+        call.enqueue(object : Callback<AnimeResponse> {
+            override fun onResponse(
+                call: Call<AnimeResponse>,
+                response: Response<AnimeResponse>
+            ) {
+                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 AnimeResponse fields
+                    view.showDetail(anime!!)
+
+                } else {
+                    view.showError("API ERROR : is not successful")
+                }
+            }
+
+            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
+                view.showError("API ERROR : onFailure")
+            }
+
+        })
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailSearchAnimeActivity.kt b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailSearchAnimeActivity.kt
index f9d1325..5acf1c3 100644
--- a/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailSearchAnimeActivity.kt
+++ b/app/src/main/java/xyz/adjutor/aniki/presentation/view/anime/DetailSearchAnimeActivity.kt
@@ -7,39 +7,32 @@ import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
 import com.bumptech.glide.Glide
 import com.bumptech.glide.request.RequestOptions
-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.anime.AnimeApi
+import xyz.adjutor.aniki.presentation.controller.anime.DetailSearchAnimeController
 import xyz.adjutor.aniki.presentation.model.anime.AnimeResponse
 
 class DetailSearchAnimeActivity : AppCompatActivity() {
 
-    private var baseUrl = "https://api.jikan.moe/"
-    private val gson = GsonBuilder()
-        .setLenient()
-        .create()
-
-    //used in the list
-    private val intentAnimeImageUrl = "theanimeimageurl"
-    private val intentAnimeTitle = "theanimetitle"
-    private val intentAnimeScore = "theanimescore"
-
-    //only used for the detail
-    private val intentAnimeId = "theanimeid"
-    private val intentAnimeUrl = "theanimeurl"
-    private val intentAnimeEpisodes = "theanimeepisodes"
-    private val intentAnimeStartDate = "theanimestartdate"
-    private val intentAnimeEndDate = "theanimeenddate"
+    lateinit var controller: DetailSearchAnimeController
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_detail_search_anime)
 
+        controller = DetailSearchAnimeController()
+
+        //used in the list
+        val intentAnimeImageUrl = "theanimeimageurl"
+        val intentAnimeTitle = "theanimetitle"
+        val intentAnimeScore = "theanimescore"
+
+        //only used for the detail
+        val intentAnimeId = "theanimeid"
+        val intentAnimeUrl = "theanimeurl"
+        val intentAnimeEpisodes = "theanimeepisodes"
+        val intentAnimeStartDate = "theanimestartdate"
+        val intentAnimeEndDate = "theanimeenddate"
+
         val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl)
         val animeTitle = intent.getStringExtra(intentAnimeTitle)
         val animeScore = intent.getStringExtra(intentAnimeScore)
@@ -88,7 +81,7 @@ class DetailSearchAnimeActivity : AppCompatActivity() {
             fieldIsNull()
         }
 
-        makeApiCall(baseUrl, animeId.toString())
+        controller.onStart(this, animeId.toString())
 
     }
 
@@ -100,42 +93,7 @@ class DetailSearchAnimeActivity : AppCompatActivity() {
 
     }
 
-    private fun makeApiCall(
-        BASE_URL: String,
-        animeId: String
-    ) { //we take the rest of the data that we need from the internet
-
-        val retrofit = Retrofit.Builder()
-            .baseUrl(BASE_URL)
-            .addConverterFactory(GsonConverterFactory.create(gson))
-            .build()
-
-        val service = retrofit.create(AnimeApi::class.java)
-        val call = service.getAnimeData(animeId) //based on the id
-
-        call.enqueue(object : Callback<AnimeResponse> {
-            override fun onResponse(
-                call: Call<AnimeResponse>,
-                response: Response<AnimeResponse>
-            ) {
-                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 AnimeResponse fields
-                    showDetail(anime!!)
-
-                } else {
-                    showError("API ERROR : is not successful")
-                }
-            }
-
-            override fun onFailure(call: Call<AnimeResponse>, t: Throwable) {
-                showError("API ERROR : onFailure")
-            }
-
-        })
-    }
-
-    private fun showDetail(anime: AnimeResponse) {
+    fun showDetail(anime: AnimeResponse) {
         //elements from AnimeResponse
         val tvSynopsis: TextView = findViewById(R.id.tv_synopsis)
         val tvRank: TextView = findViewById(R.id.tv_detail_rank)
-- 
cgit v1.2.3