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() {}.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 { override fun onResponse(call: Call, response: Response) { if(response.isSuccessful && response.body() != null){ //if the code returned is >= 200 and < 300 AND the the body ain't empty val anime = response.body() //getting the RestAnimeResponse fields saveList(anime) showDetail(anime!!) } else { showError("API ERROR : is not successful") } } override fun onFailure(call: Call, 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() } }