mirror of
https://github.com/owenlejeune/MYDex.git
synced 2025-11-15 03:22:47 -05:00
some base evolution details implementation
This commit is contained in:
@@ -1,6 +1,11 @@
|
|||||||
package com.owenlejeune.mydex.api.pokeapi.v2
|
package com.owenlejeune.mydex.api.pokeapi.v2
|
||||||
|
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionChain
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionTrigger
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.items.Item
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.location.Location
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.misc.PaginatedResponse
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.misc.PaginatedResponse
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.move.Move
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.Pokemon
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.Pokemon
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonSpecies
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonSpecies
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonStat
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonStat
|
||||||
@@ -31,4 +36,19 @@ interface PokemonApi {
|
|||||||
@GET("egg-group/{id}")
|
@GET("egg-group/{id}")
|
||||||
suspend fun getEggGroup(@Path("id") id: Int): Response<EggGroup>
|
suspend fun getEggGroup(@Path("id") id: Int): Response<EggGroup>
|
||||||
|
|
||||||
|
@GET("evolution-chain/{id}")
|
||||||
|
suspend fun getEvolutionChain(@Path("id") id: Int): Response<EvolutionChain>
|
||||||
|
|
||||||
|
@GET("evolution-trigger/{id}")
|
||||||
|
suspend fun getEvolutionTrigger(@Path("id") id: Int): Response<EvolutionTrigger>
|
||||||
|
|
||||||
|
@GET("item/{id}")
|
||||||
|
suspend fun getItem(@Path("id") id: Int): Response<Item>
|
||||||
|
|
||||||
|
@GET("move/{id}")
|
||||||
|
suspend fun getMove(@Path("id") id: Int): Response<Move>
|
||||||
|
|
||||||
|
@GET("location/{id}")
|
||||||
|
suspend fun getLocation(@Path("id") id: Int): Response<Location>
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,12 @@
|
|||||||
package com.owenlejeune.mydex.api.pokeapi.v2
|
package com.owenlejeune.mydex.api.pokeapi.v2
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionChain
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionTrigger
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.items.Item
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.location.Location
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.misc.PaginatedResponse
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.misc.PaginatedResponse
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.move.Move
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.Pokemon
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.Pokemon
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonSpecies
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonSpecies
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonStat
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonStat
|
||||||
@@ -51,5 +56,25 @@ class PokemonService: KoinComponent {
|
|||||||
suspend fun getEggGroup(id: Int): Response<EggGroup> {
|
suspend fun getEggGroup(id: Int): Response<EggGroup> {
|
||||||
return service.getEggGroup(id)
|
return service.getEggGroup(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun getEvolutionChain(id: Int): Response<EvolutionChain> {
|
||||||
|
return service.getEvolutionChain(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun getEvolutionTrigger(id: Int): Response<EvolutionTrigger> {
|
||||||
|
return service.getEvolutionTrigger(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun getItem(id: Int): Response<Item> {
|
||||||
|
return service.getItem(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun getMove(id: Int): Response<Move> {
|
||||||
|
return service.getMove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun getLocation(id: Int): Response<Location> {
|
||||||
|
return service.getLocation(id)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,6 @@ import com.owenlejeune.mydex.api.pokeapi.v2.model.misc.NameAndUrl
|
|||||||
class ChainLink(
|
class ChainLink(
|
||||||
@SerializedName("is_baby") val isBaby: Boolean,
|
@SerializedName("is_baby") val isBaby: Boolean,
|
||||||
@SerializedName("species") val species: NameAndUrl,
|
@SerializedName("species") val species: NameAndUrl,
|
||||||
@SerializedName("evolution_details") val evolutionDetails: EvolutionDetails,
|
@SerializedName("evolution_details") val evolutionDetails: List<EvolutionDetails>,
|
||||||
@SerializedName("evolves_to") val evolves_to: List<ChainLink?>?
|
@SerializedName("evolves_to") val evolves_to: List<ChainLink?>?
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,22 +4,22 @@ import com.google.gson.annotations.SerializedName
|
|||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.misc.NameAndUrl
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.misc.NameAndUrl
|
||||||
|
|
||||||
class EvolutionDetails(
|
class EvolutionDetails(
|
||||||
@SerializedName("item") val item: NameAndUrl,
|
@SerializedName("item") val item: NameAndUrl?,
|
||||||
@SerializedName("trigger") val trigger: NameAndUrl,
|
@SerializedName("trigger") val trigger: NameAndUrl,
|
||||||
@SerializedName("gender") val gender: Int,
|
@SerializedName("gender") val gender: Int?,
|
||||||
@SerializedName("held_item") val heldItem: NameAndUrl,
|
@SerializedName("held_item") val heldItem: NameAndUrl?,
|
||||||
@SerializedName("known_move") val knownMove: NameAndUrl,
|
@SerializedName("known_move") val knownMove: NameAndUrl?,
|
||||||
@SerializedName("known_move_type") val knownMoveType: NameAndUrl,
|
@SerializedName("known_move_type") val knownMoveType: NameAndUrl?,
|
||||||
@SerializedName("location") val location: NameAndUrl,
|
@SerializedName("location") val location: NameAndUrl?,
|
||||||
@SerializedName("min_level") val minLevel: Int,
|
@SerializedName("min_level") val minLevel: Int?,
|
||||||
@SerializedName("min_happiness") val minHappiness: Int,
|
@SerializedName("min_happiness") val minHappiness: Int?,
|
||||||
@SerializedName("min_beauty") val minBeauty: Int,
|
@SerializedName("min_beauty") val minBeauty: Int?,
|
||||||
@SerializedName("min_affection") val minAffection: Int,
|
@SerializedName("min_affection") val minAffection: Int?,
|
||||||
@SerializedName("needs_overworld_rain") val needsOverworldRain: Boolean,
|
@SerializedName("needs_overworld_rain") val needsOverworldRain: Boolean,
|
||||||
@SerializedName("party_species") val partySpecies: NameAndUrl,
|
@SerializedName("party_species") val partySpecies: NameAndUrl?,
|
||||||
@SerializedName("party_type") val partyType: NameAndUrl,
|
@SerializedName("party_type") val partyType: NameAndUrl?,
|
||||||
@SerializedName("relative_physical_stats") val relativePhysicalStats: Int,
|
@SerializedName("relative_physical_stats") val relativePhysicalStats: Int?,
|
||||||
@SerializedName("time_of_day") val timeOfDay: String,
|
@SerializedName("time_of_day") val timeOfDay: String?,
|
||||||
@SerializedName("trade_species") val tradeSpecies: NameAndUrl,
|
@SerializedName("trade_species") val tradeSpecies: NameAndUrl?,
|
||||||
@SerializedName("turn_upside_down") val turnUpsideDown: Boolean
|
@SerializedName("turn_upside_down") val turnUpsideDown: Boolean
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -7,4 +7,8 @@ fun List<NameAndLanguage>.getNameForLanguage(): String? {
|
|||||||
val lang = Locale.current.language
|
val lang = Locale.current.language
|
||||||
val defLang = "en"
|
val defLang = "en"
|
||||||
return find { it.language.name == lang }?.name ?: find { it.language.name == defLang}?.name
|
return find { it.language.name == lang }?.name ?: find { it.language.name == defLang}?.name
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> List<T>.getIfNotEmpty(index: Int): T? {
|
||||||
|
return if (isNotEmpty()) get(index) else null
|
||||||
}
|
}
|
||||||
@@ -32,6 +32,8 @@ import com.google.accompanist.pager.HorizontalPager
|
|||||||
import com.google.accompanist.pager.rememberPagerState
|
import com.google.accompanist.pager.rememberPagerState
|
||||||
import com.owenlejeune.mydex.R
|
import com.owenlejeune.mydex.R
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.PokemonService
|
import com.owenlejeune.mydex.api.pokeapi.v2.PokemonService
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.ChainLink
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionChain
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.Pokemon
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.Pokemon
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonSpecies
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonSpecies
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonStat
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonStat
|
||||||
@@ -39,6 +41,7 @@ import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonType
|
|||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.egggroup.EggGroup
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.egggroup.EggGroup
|
||||||
import com.owenlejeune.mydex.extensions.adjustBy
|
import com.owenlejeune.mydex.extensions.adjustBy
|
||||||
import com.owenlejeune.mydex.extensions.getIdFromUrl
|
import com.owenlejeune.mydex.extensions.getIdFromUrl
|
||||||
|
import com.owenlejeune.mydex.extensions.getIfNotEmpty
|
||||||
import com.owenlejeune.mydex.extensions.getNameForLanguage
|
import com.owenlejeune.mydex.extensions.getNameForLanguage
|
||||||
import com.owenlejeune.mydex.preferences.AppPreferences
|
import com.owenlejeune.mydex.preferences.AppPreferences
|
||||||
import com.owenlejeune.mydex.ui.components.PokemonTypeLabel
|
import com.owenlejeune.mydex.ui.components.PokemonTypeLabel
|
||||||
@@ -528,10 +531,52 @@ private fun EvolutionView(
|
|||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(all = 24.dp)
|
.padding(all = 24.dp)
|
||||||
.verticalScroll(state = scrollState)
|
.verticalScroll(state = scrollState)
|
||||||
.background(color = Color.Red)
|
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
) {
|
) {
|
||||||
Text(text = "Evolution")
|
Text(text = "Evolution")
|
||||||
|
|
||||||
|
val id = pokemonSpecies.evolutionChainUrl.getIdFromUrl()
|
||||||
|
val evolutionChain = remember { mutableStateOf<EvolutionChain?>(null) }
|
||||||
|
if (evolutionChain.value == null) {
|
||||||
|
DataManager.getEvolutionChainById(id) { ec ->
|
||||||
|
evolutionChain.value = ec
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val evolutionStages = remember { mutableListOf<EvolutionStage>() }
|
||||||
|
val nextChain = evolutionChain.value?.chain
|
||||||
|
if (evolutionStages.isEmpty()) {
|
||||||
|
EvolutionUtils.getEvolutionFromChainLink(nextChain) { es ->
|
||||||
|
evolutionStages.addAll(es)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
evolutionStages.forEach { evolutionStage ->
|
||||||
|
if (evolutionStage.evolvesTo?.isNotEmpty() == true) {
|
||||||
|
Row {
|
||||||
|
Text(
|
||||||
|
text = evolutionStage.evolvesFrom.names.getNameForLanguage()
|
||||||
|
?: evolutionStage.evolvesFrom.name, modifier = Modifier.weight(1f)
|
||||||
|
)
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.weight(2f)
|
||||||
|
) {
|
||||||
|
evolutionStage.evolvesTo.forEach { et ->
|
||||||
|
Row {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.weight(1f)
|
||||||
|
) {
|
||||||
|
Text(text = et.triggerAndCondition.trigger)
|
||||||
|
Text(text = et.triggerAndCondition.condition)
|
||||||
|
}
|
||||||
|
Text(text = et.evolvesTo.name, modifier = Modifier.weight(1f))
|
||||||
|
}
|
||||||
|
Divider(modifier = Modifier.height(2.dp), color = MaterialTheme.colorScheme.onSurface)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
package com.owenlejeune.mydex.utils
|
package com.owenlejeune.mydex.utils
|
||||||
|
|
||||||
import android.util.SparseArray
|
import android.util.SparseArray
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionChain
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionTrigger
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.items.Item
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.location.Location
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.move.Move
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.Pokemon
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.Pokemon
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonSpecies
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonSpecies
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonStat
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonStat
|
||||||
@@ -14,5 +19,10 @@ object AppCache {
|
|||||||
var cachedTypes = SparseArray<PokemonType>()
|
var cachedTypes = SparseArray<PokemonType>()
|
||||||
var cachedStats = SparseArray<PokemonStat>()
|
var cachedStats = SparseArray<PokemonStat>()
|
||||||
var cachedEggGroups = SparseArray<EggGroup>()
|
var cachedEggGroups = SparseArray<EggGroup>()
|
||||||
|
var cachedEvolutionChains = SparseArray<EvolutionChain>()
|
||||||
|
var cachedEvolutionTriggers = SparseArray<EvolutionTrigger>()
|
||||||
|
var cachedItems = SparseArray<Item>()
|
||||||
|
var cachedMoves = SparseArray<Move>()
|
||||||
|
var cachedLocations = SparseArray<Location>()
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,11 @@
|
|||||||
package com.owenlejeune.mydex.utils
|
package com.owenlejeune.mydex.utils
|
||||||
|
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.PokemonService
|
import com.owenlejeune.mydex.api.pokeapi.v2.PokemonService
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionChain
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionTrigger
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.items.Item
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.location.Location
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.move.Move
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.Pokemon
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.Pokemon
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonSpecies
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonSpecies
|
||||||
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonStat
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonStat
|
||||||
@@ -27,6 +32,15 @@ object DataManager: KoinComponent {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun getPokemonByIdSync(id: Int): Pokemon {
|
||||||
|
return getByIdSync(
|
||||||
|
id = id,
|
||||||
|
retriever = { AppCache.cachedPokemon[it] },
|
||||||
|
fetcher = { service.getPokemon(it) },
|
||||||
|
storer = { AppCache.cachedPokemon.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun getPokemonSpeciesById(id: Int, callback: (PokemonSpecies) -> Unit) {
|
fun getPokemonSpeciesById(id: Int, callback: (PokemonSpecies) -> Unit) {
|
||||||
getById(
|
getById(
|
||||||
id = id,
|
id = id,
|
||||||
@@ -37,6 +51,15 @@ object DataManager: KoinComponent {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun getPokemonSpeciesByIdSync(id: Int): PokemonSpecies {
|
||||||
|
return getByIdSync(
|
||||||
|
id = id,
|
||||||
|
retriever = { AppCache.cachedSpecies[id] },
|
||||||
|
fetcher = { service.getPokemonSpecies(id) },
|
||||||
|
storer = { AppCache.cachedSpecies.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun getTypeById(id: Int, callback: (PokemonType) -> Unit) {
|
fun getTypeById(id: Int, callback: (PokemonType) -> Unit) {
|
||||||
getById(
|
getById(
|
||||||
id = id,
|
id = id,
|
||||||
@@ -47,6 +70,15 @@ object DataManager: KoinComponent {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun getTypeByIdSync(id: Int): PokemonType {
|
||||||
|
return getByIdSync(
|
||||||
|
id = id,
|
||||||
|
retriever = { AppCache.cachedTypes[it] },
|
||||||
|
fetcher = { service.getPokemonType(it) },
|
||||||
|
storer = { AppCache.cachedTypes.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun getStatById(id: Int, callback: (PokemonStat) -> Unit) {
|
fun getStatById(id: Int, callback: (PokemonStat) -> Unit) {
|
||||||
getById(
|
getById(
|
||||||
id = id,
|
id = id,
|
||||||
@@ -57,6 +89,15 @@ object DataManager: KoinComponent {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun getStatByIdSync(id: Int): PokemonStat {
|
||||||
|
return getByIdSync(
|
||||||
|
id = id,
|
||||||
|
retriever = { AppCache.cachedStats[id] },
|
||||||
|
fetcher = { service.getPokemonStat(id) },
|
||||||
|
storer = { AppCache.cachedStats.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun getEggGroupById(id: Int, callback: (EggGroup) -> Unit) {
|
fun getEggGroupById(id: Int, callback: (EggGroup) -> Unit) {
|
||||||
getById(
|
getById(
|
||||||
id = id,
|
id = id,
|
||||||
@@ -67,6 +108,101 @@ object DataManager: KoinComponent {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun getEggGroupById(id: Int): EggGroup {
|
||||||
|
return getByIdSync(
|
||||||
|
id = id,
|
||||||
|
retriever = { AppCache.cachedEggGroups[id] },
|
||||||
|
fetcher = { service.getEggGroup(id) },
|
||||||
|
storer = { AppCache.cachedEggGroups.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getEvolutionChainById(id: Int, callback: (EvolutionChain) -> Unit) {
|
||||||
|
getById(
|
||||||
|
id = id,
|
||||||
|
callback = callback,
|
||||||
|
retriever = { AppCache.cachedEvolutionChains[id] },
|
||||||
|
fetcher = { service.getEvolutionChain(id) },
|
||||||
|
storer = { AppCache.cachedEvolutionChains.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getEvolutionTriggerById(id: Int, callback: (EvolutionTrigger) -> Unit) {
|
||||||
|
getById(
|
||||||
|
id = id,
|
||||||
|
callback = callback,
|
||||||
|
retriever = { AppCache.cachedEvolutionTriggers[id] },
|
||||||
|
fetcher = { service.getEvolutionTrigger(id) },
|
||||||
|
storer = { AppCache.cachedEvolutionTriggers.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun getEvolutionTriggerByIdSync(id: Int): EvolutionTrigger {
|
||||||
|
return getByIdSync(
|
||||||
|
id = id,
|
||||||
|
retriever = { AppCache.cachedEvolutionTriggers[id] },
|
||||||
|
fetcher = { service.getEvolutionTrigger(id) },
|
||||||
|
storer = { AppCache.cachedEvolutionTriggers.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getItemById(id: Int, callback: (Item) -> Unit) {
|
||||||
|
getById(
|
||||||
|
id = id,
|
||||||
|
callback = callback,
|
||||||
|
retriever = { AppCache.cachedItems[id] },
|
||||||
|
fetcher = { service.getItem(id) },
|
||||||
|
storer = { AppCache.cachedItems.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun getItemByIdSync(id: Int): Item {
|
||||||
|
return getByIdSync(
|
||||||
|
id = id,
|
||||||
|
retriever = { AppCache.cachedItems[id] },
|
||||||
|
fetcher = { service.getItem(id) },
|
||||||
|
storer = { AppCache.cachedItems.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getMoveById(id: Int, callback: (Move) -> Unit) {
|
||||||
|
getById(
|
||||||
|
id = id,
|
||||||
|
callback = callback,
|
||||||
|
retriever = { AppCache.cachedMoves[id] },
|
||||||
|
fetcher = { service.getMove(id) },
|
||||||
|
storer = { AppCache.cachedMoves.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun getMoveByIdSync(id: Int): Move {
|
||||||
|
return getByIdSync(
|
||||||
|
id = id,
|
||||||
|
retriever = { AppCache.cachedMoves[id] },
|
||||||
|
fetcher = { service.getMove(id) },
|
||||||
|
storer = { AppCache.cachedMoves.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getLocationById(id: Int, callback: (Location) -> Unit) {
|
||||||
|
getById(
|
||||||
|
id = id,
|
||||||
|
callback = callback,
|
||||||
|
retriever = { AppCache.cachedLocations[id] },
|
||||||
|
fetcher = { service.getLocation(id) },
|
||||||
|
storer = { AppCache.cachedLocations.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun getLocationByIdSync(id: Int): Location {
|
||||||
|
return getByIdSync(
|
||||||
|
id = id,
|
||||||
|
retriever = { AppCache.cachedLocations[id] },
|
||||||
|
fetcher = { service.getLocation(id) },
|
||||||
|
storer = { AppCache.cachedLocations.put(it.id, it) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
private fun <T> getById(
|
private fun <T> getById(
|
||||||
id: Int,
|
id: Int,
|
||||||
callback: (T) -> Unit,
|
callback: (T) -> Unit,
|
||||||
@@ -88,4 +224,18 @@ object DataManager: KoinComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private suspend fun <T> getByIdSync(
|
||||||
|
id: Int,
|
||||||
|
retriever: (Int) -> T?,
|
||||||
|
fetcher: suspend (Int) -> Response<T>,
|
||||||
|
storer: (T) -> Unit
|
||||||
|
): T {
|
||||||
|
val retreived = retriever(id)
|
||||||
|
if (retreived != null) {
|
||||||
|
return retreived
|
||||||
|
}
|
||||||
|
val fetched = fetcher(id)
|
||||||
|
return fetched.body()!!.apply { storer(this) }
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
113
app/src/main/java/com/owenlejeune/mydex/utils/EvolutionUtils.kt
Normal file
113
app/src/main/java/com/owenlejeune/mydex/utils/EvolutionUtils.kt
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
package com.owenlejeune.mydex.utils
|
||||||
|
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.PokemonService
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.ChainLink
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionDetails
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionTrigger
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.pokemon.PokemonSpecies
|
||||||
|
import com.owenlejeune.mydex.extensions.getIdFromUrl
|
||||||
|
import com.owenlejeune.mydex.extensions.getIfNotEmpty
|
||||||
|
import com.owenlejeune.mydex.extensions.getNameForLanguage
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
|
object EvolutionUtils {
|
||||||
|
|
||||||
|
fun getEvolutionFromChainLink(
|
||||||
|
link: ChainLink?,
|
||||||
|
callback: (List<EvolutionStage>) -> Unit
|
||||||
|
) {
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
val evolutionStages = ArrayList<EvolutionStage>()
|
||||||
|
|
||||||
|
var nextLink: ChainLink? = link
|
||||||
|
while(nextLink != null) {
|
||||||
|
val id = nextLink.species.url.getIdFromUrl()
|
||||||
|
val evolvesFrom = DataManager.getPokemonSpeciesByIdSync(id)
|
||||||
|
|
||||||
|
if (nextLink.evolves_to != null) {
|
||||||
|
val evolutions = ArrayList<Evolution>()
|
||||||
|
nextLink.evolves_to!!.forEach { et ->
|
||||||
|
et?.let {
|
||||||
|
val etId = it.species.url.getIdFromUrl()
|
||||||
|
val evolvesTo = DataManager.getPokemonSpeciesByIdSync(etId)
|
||||||
|
|
||||||
|
it.evolutionDetails.forEach { details ->
|
||||||
|
val triggerAndCondition =
|
||||||
|
evolutionDetailsToTriggerAndCondition(details)
|
||||||
|
evolutions.add(Evolution(evolvesTo, triggerAndCondition))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val es = EvolutionStage(evolvesFrom, evolutions)
|
||||||
|
evolutionStages.add(es)
|
||||||
|
}
|
||||||
|
nextLink = nextLink.evolves_to?.getIfNotEmpty(0)
|
||||||
|
}
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
callback(evolutionStages)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun evolutionDetailsToTriggerAndCondition(details: EvolutionDetails): EvolutionTriggerAndCondition {
|
||||||
|
val trigger = details.trigger.name
|
||||||
|
val condition = if (details.item != null) {
|
||||||
|
details.item.name
|
||||||
|
} else if (details.gender != null) {
|
||||||
|
if (details.gender == 1) "female" else "male"
|
||||||
|
} else if (details.heldItem != null) {
|
||||||
|
details.heldItem.name
|
||||||
|
} else if (details.knownMove != null) {
|
||||||
|
details.knownMove.name
|
||||||
|
} else if (details.knownMoveType != null) {
|
||||||
|
details.knownMoveType.name
|
||||||
|
} else if (details.location != null) {
|
||||||
|
details.location.name
|
||||||
|
} else if (details.minLevel != null) {
|
||||||
|
details.minLevel.toString()
|
||||||
|
} else if (details.minHappiness != null) {
|
||||||
|
details.minHappiness.toString()
|
||||||
|
} else if (details.minBeauty != null) {
|
||||||
|
details.minBeauty.toString()
|
||||||
|
} else if (details.minAffection != null) {
|
||||||
|
details.minAffection.toString()
|
||||||
|
} else if (details.needsOverworldRain) {
|
||||||
|
"Needs rain"
|
||||||
|
} else if (details.partySpecies != null) {
|
||||||
|
details.partySpecies.name
|
||||||
|
} else if (details.partyType != null) {
|
||||||
|
details.partyType.name
|
||||||
|
} else if (details.relativePhysicalStats != null) {
|
||||||
|
details.relativePhysicalStats.toString()
|
||||||
|
} else if (details.timeOfDay != null) {
|
||||||
|
details.timeOfDay
|
||||||
|
} else if (details.tradeSpecies != null) {
|
||||||
|
details.tradeSpecies.name
|
||||||
|
} else if (details.turnUpsideDown) {
|
||||||
|
"Turn 3DS upside-down"
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
return EvolutionTriggerAndCondition(trigger, condition)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class EvolutionStage(
|
||||||
|
val evolvesFrom: PokemonSpecies,
|
||||||
|
val evolvesTo: List<Evolution>?
|
||||||
|
)
|
||||||
|
|
||||||
|
class Evolution(
|
||||||
|
val evolvesTo: PokemonSpecies,
|
||||||
|
val triggerAndCondition: EvolutionTriggerAndCondition
|
||||||
|
)
|
||||||
|
|
||||||
|
class EvolutionTriggerAndCondition(
|
||||||
|
// trigger: EvolutionTrigger,
|
||||||
|
val trigger: String,
|
||||||
|
val condition: String
|
||||||
|
)
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.owenlejeune.mydex.utils
|
package com.owenlejeune.mydex.utils
|
||||||
|
|
||||||
|
import com.owenlejeune.mydex.api.pokeapi.v2.model.evolution.EvolutionDetails
|
||||||
import kotlin.math.ceil
|
import kotlin.math.ceil
|
||||||
import kotlin.math.floor
|
import kotlin.math.floor
|
||||||
|
|
||||||
@@ -51,4 +52,8 @@ object PokeUtils {
|
|||||||
return genderRate.toFloat() * GENDER_RATE * 100
|
return genderRate.toFloat() * GENDER_RATE * 100
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun evolutionDetailsToConditionString(evolutionDetails: EvolutionDetails): String {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user