Skip to content

Commit

Permalink
[0.2.0.alpha/AN_FEAT] 포켓몬 상세에서 정보 화면, id(Long -> String) (#240)
Browse files Browse the repository at this point in the history
* chore: 포켓몬 상세 탭 타이틀을 string-array 로 한다

* chore: strings 리소스에 dex 를 pokemon_list 와 detail 로

* feat: 포켓몬 상세에서 필요한 데이터 정의

* feat: 포켓몬 상세에서 필요한 데이터 바이옴 추가

* feat: 데이터 레이어 Biome 추가

* feat: 포켓몬 상세 정보에서 바이옴 정보 item UI

* feat: 포켓몬 상세 정보에서 바이옴 뷰 홀더

* feat: 포켓몬 상세 정보 프래그먼트 ui xml

* feat: 포켓몬 상세 정보에서 바이옴 어댑터

* feat: 포켓몬 상세 뷰모델에 바이옴 상세로 네비게이션하는 이벤트 추가

* feat: 바이옴 상세 액티비티 동반 객체에 intent 추가

* feat(PokemonInformationFragment): 포켓몬 상세 액티비티 뷰모델, 어댑터 연결

* feat(PokemonDetailActivity): 포켓몬 상세에서 바이옴 상세로 네비게이션

* fix(Biome): 바이옴 이미지 url 변경

* feat(PokemonInformationFragmen): 바이옴 라사이클러뷰에 데코레이션

* feat: 바이옴 타이틀과 바이옴 아이템 사이 구분선 추가

* feat(NewPokemon,NewPokemonUiModel): id 를 Long -> String

* feat presentation layer 에 NewPokeMonUiModel 적용

* feat(DexRepository): 포켓몬 리스트 리턴을 NewPokemon 으로

* feat(DexDataSource): 포켓몬 리스트 리턴을 NewPokemon 으로

* feat(NewPokemonDetail, NewAbility): response 에서 데이터로

* feat(DexRepository,RemoteDexDataSource.kt) 에서 데이터를 NewPokemonDetail 로

* feat(AbilityDetail): NewPokemon 리스트로

* refactor: 포켓몬 상세 액티비티 뷰모델에서 pokemonId 는 String

* feat: PokemonSkill 의 클래스 변경됨

* feat: 포켓몬 특성 id 를 Long -> String 으로

* refactor: Ability 의 id 를 Long -> String

- issue: 포켓몬 상세에서 특성 상세로 이동 시 예외

* refactor: 포켓몬 상세에서 특성 상세로 이동하도록 한다
- 이전 커밋(80872b6) 이슈 해결

* chore: ktlint

* refactor: NewPokemon -> Pokemon

* refactor: NewSKill -> PokemonSkill

* refactor: NewPokemonDetail -> PokemonDetail

* chore: 네이밍 NewPokemonSKills -> PokemonDetailSkills

* refactor: NewAbility -> PokemonDetailAbility

* refactor: id: Long 을 모두 id: String 로 변경

* fix(data/unitTest): id 값을 String 으로

* fix: 특성 상세 프래그먼트에서 bundle 이 null 일 때 처리

* fix: Pokemon 클래스의 더미데이터 복구

* chore: 포켓몬 상세 특성 ui model 네이밍 변경

* feat: 기술머신으로 배우는 PokemonSkill 리스트 추가

* test: data 레이어의 모델의 id String 으로

* chore: ktlint

* refactor: getStringArrayOf 를 확장 유틸함수로

---------

Co-authored-by: sh1mj1 <[email protected]>
  • Loading branch information
murjune and sh1mj1 committed Aug 19, 2024
1 parent bc3e8a1 commit 5707f7c
Show file tree
Hide file tree
Showing 64 changed files with 903 additions and 412 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ class AbilityActivity : BindingActivity<ActivityAbilityBinding>(R.layout.activit
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState == null) {
val abilityId = intent.getLongExtra(ABILITY_ID, INVALID_ABILITY)
if (abilityId == INVALID_ABILITY) {
val abilityId = intent.getStringExtra(ABILITY_ID) ?: ""
if (abilityId.isBlank()) {
navigateToAbilityList()
return
}
Expand All @@ -30,7 +30,7 @@ class AbilityActivity : BindingActivity<ActivityAbilityBinding>(R.layout.activit
}
}

private fun navigateToAbilityDetail(abilityId: Long) {
private fun navigateToAbilityDetail(abilityId: String) {
supportFragmentManager.commit {
replace<AbilityDetailFragment>(
containerViewId = R.id.fragment_container_ability,
Expand All @@ -41,11 +41,10 @@ class AbilityActivity : BindingActivity<ActivityAbilityBinding>(R.layout.activit

companion object {
private const val ABILITY_ID = "abilityId"
private const val INVALID_ABILITY = -1L

fun intent(
context: Context,
abilityId: Long = INVALID_ABILITY,
abilityId: String,
): Intent =
Intent(context, AbilityActivity::class.java).apply {
putExtra(ABILITY_ID, abilityId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class AbilityFragment : ErrorHandleFragment<FragmentAbilityBinding>(R.layout.fra

private val adapter: AbilityAdapter by lazy { AbilityAdapter(viewModel) }

override val toolbar: Toolbar?
override val toolbar: Toolbar
get() = binding.toolbarAbility

override fun onViewCreated(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package poke.rogue.helper.presentation.ability

interface AbilityUiEventHandler {
fun navigateToDetail(abilityId: Long)
fun navigateToDetail(abilityId: String)
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ class AbilityViewModel(
) : ErrorHandleViewModel(logger),
AbilityQueryHandler,
AbilityUiEventHandler {
private val _navigationToDetailEvent = MutableSharedFlow<Long>()
val navigationToDetailEvent: SharedFlow<Long> = _navigationToDetailEvent.asSharedFlow()
private val _navigationToDetailEvent = MutableSharedFlow<String>()
val navigationToDetailEvent: SharedFlow<String> = _navigationToDetailEvent.asSharedFlow()

private val searchQuery = MutableStateFlow("")

Expand Down Expand Up @@ -64,7 +64,7 @@ class AbilityViewModel(

private suspend fun queriedAbilities(query: String): List<AbilityUiModel> = abilityRepository.abilities(query).map { it.toUi() }

override fun navigateToDetail(abilityId: Long) {
override fun navigateToDetail(abilityId: String) {
viewModelScope.launch {
_navigationToDetailEvent.emit(abilityId)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ class AbilityDetailFragment :

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val id = arguments?.getLong(ABILITY_ID) ?: INVALID_ABILITY_ID
viewModel.updateAbilityDetail(id)
val abilityId = arguments?.getString(ABILITY_ID) ?: ""
viewModel.updateAbilityDetail(abilityId)
}

override fun onViewCreated(
Expand Down Expand Up @@ -106,14 +106,11 @@ class AbilityDetailFragment :

companion object {
private const val ABILITY_ID = "abilityId"
private const val CONTAINER_ID = "containerId"
private const val INVALID_ABILITY_ID = -1L
private const val INVALID_CONTAINER_ID = -1
private val TAG = AbilityDetailFragment::class.java.simpleName

fun bundleOf(abilityId: Long) =
fun bundleOf(abilityId: String) =
Bundle().apply {
putLong(ABILITY_ID, abilityId)
putString(ABILITY_ID, abilityId)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package poke.rogue.helper.presentation.ability.detail

interface AbilityDetailUiEventHandler {
fun navigateToPokemonDetail(pokemonId: Long)
fun navigateToPokemonDetail(pokemonId: String)

fun navigateToHome()
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ class AbilityDetailViewModel(
MutableStateFlow<AbilityDetailUiState<AbilityDetailUiModel>>(AbilityDetailUiState.Loading)
val abilityDetail = _abilityDetail.asStateFlow()

private val _navigationToPokemonDetailEvent = MutableSharedFlow<Long>()
val navigationToPokemonDetailEvent: SharedFlow<Long> =
private val _navigationToPokemonDetailEvent = MutableSharedFlow<String>()
val navigationToPokemonDetailEvent: SharedFlow<String> =
_navigationToPokemonDetailEvent.asSharedFlow()

private val _navigateToHomeEvent = MutableSharedFlow<Boolean>()
Expand All @@ -42,7 +42,7 @@ class AbilityDetailViewModel(
abilityDetail.map { it is AbilityDetailUiState.Success && it.data.pokemons.isEmpty() }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000L), false)

override fun navigateToPokemonDetail(pokemonId: Long) {
override fun navigateToPokemonDetail(pokemonId: String) {
viewModelScope.launch {
_navigationToPokemonDetailEvent.emit(pokemonId)
}
Expand All @@ -54,8 +54,8 @@ class AbilityDetailViewModel(
}
}

fun updateAbilityDetail(abilityId: Long) {
if (abilityId == -1L) {
fun updateAbilityDetail(abilityId: String) {
if (abilityId.isBlank()) {
_errorEvent.tryEmit(Unit)
return
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,5 @@ fun AbilityDetail.toUi(): AbilityDetailUiModel =
AbilityDetailUiModel(
title = this.title,
description = this.description,
pokemons = this.pokemons.map { it.toUi() },
pokemons = pokemons.toUi(),
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package poke.rogue.helper.presentation.ability.model
import poke.rogue.helper.data.model.Ability

data class AbilityUiModel(
val id: Long,
val id: String,
val title: String,
val description: String,
val shortening: Boolean = true,
Expand All @@ -14,36 +14,36 @@ data class AbilityUiModel(

val DUMMY =
AbilityUiModel(
id = -1,
id = "-1",
title = DUMMY_ABILITY_NAME,
description = DUMMY_ABILITY_DESCRIPTION,
)
val dummys: List<AbilityUiModel> =
listOf(
AbilityUiModel(1, "악취", "악취를 풍겨서 공격했을 때 상대가 풀죽을 때가 있다."),
AbilityUiModel(2, "잔비", "등장했을 때 날씨를 비로 만든다."),
AbilityUiModel(3, "가속", "매 턴 스피드가 올라간다."),
AbilityUiModel(4, "전투무장", "단단한 껍질에 보호받아 상대의 공격이 급소에 맞지 않는다."),
AbilityUiModel(5, "옹골참", "상대 기술을 받아도 일격으로 쓰러지지 않는다. 일격필살 기술도 효과 없다."),
AbilityUiModel(6, "유연", "주변을 습하게 함으로써 자폭 등 폭발하는 기술을 아무도 못 쓰게 한다."),
AbilityUiModel(7, "모래숨기", "모래바람일 때 회피율이 올라간다."),
AbilityUiModel(8, "정전기", "정전기를 몸에 둘러 접촉한 상대를 마비시킬 때가 있다."),
AbilityUiModel(9, "축전 (P)", "전기타입의 기술을 받으면 데미지를 받지 않고 회복한다."),
AbilityUiModel(10, "저수 (P)", "물타입의 기술을 받으면 데미지를 받지 않고 회복한다."),
AbilityUiModel(11, "둔감", "둔감해서 헤롱헤롱이나 도발 상태가 되지 않는다."),
AbilityUiModel(12, "날씨부정", "모든 날씨의 영향이 없어진다."),
AbilityUiModel(13, "복안", "복안을 가지고 있어 기술의 명중률이 올라간다."),
AbilityUiModel(14, "불면", "잠들지 못하는 체질이라 잠듦 상태가 되지 않는다."),
AbilityUiModel(15, "변색", "상대에게 받은 기술의 타입으로 자신의 타입이 변화한다."),
AbilityUiModel(16, "면역", "체내에 면역을 가지고 있어 독 상태가 되지 않는다."),
AbilityUiModel(17, "타오르는불꽃", "불꽃타입의 기술을 받으면 불꽃을 받아서 자신이 사용하는 불꽃타입의 기술이 강해진다."),
AbilityUiModel(18, "인분 (P)", "인분에 보호받아 기술의 추가 효과를 받지 않게 된다."),
AbilityUiModel(19, "마이페이스", "마이페이스라서 혼란 상태가 되지 않는다."),
AbilityUiModel(20, "홉반", "흡반으로 지면에 달라붙어 포켓몬을 교체시키는 기술이나 도구의 효과를 발휘하지 못하게 한다."),
AbilityUiModel(21, "위협", "등장했을 때 위협해서 상대를 위축시켜 상대의 공격을 떨어뜨린다."),
AbilityUiModel(22, "그림자밝기", "상대의 그림자를 밟아 도망치거나 교체할 수 없게 한다."),
AbilityUiModel(23, "까칠한피부", "공격을 받았을 때 자신에게 접촉한 상대를 까칠까칠한 피부로 상처를 입힌다."),
AbilityUiModel(24, "불가사의부적", "효과가 굉장한 기술만 맞는 불가사의한 힘."),
AbilityUiModel("1", "악취", "악취를 풍겨서 공격했을 때 상대가 풀죽을 때가 있다."),
AbilityUiModel("2", "잔비", "등장했을 때 날씨를 비로 만든다."),
AbilityUiModel("3", "가속", "매 턴 스피드가 올라간다."),
AbilityUiModel("4", "전투무장", "단단한 껍질에 보호받아 상대의 공격이 급소에 맞지 않는다."),
AbilityUiModel("5", "옹골참", "상대 기술을 받아도 일격으로 쓰러지지 않는다. 일격필살 기술도 효과 없다."),
AbilityUiModel("6", "유연", "주변을 습하게 함으로써 자폭 등 폭발하는 기술을 아무도 못 쓰게 한다."),
AbilityUiModel("7", "모래숨기", "모래바람일 때 회피율이 올라간다."),
AbilityUiModel("8", "정전기", "정전기를 몸에 둘러 접촉한 상대를 마비시킬 때가 있다."),
AbilityUiModel("9", "축전 (P)", "전기타입의 기술을 받으면 데미지를 받지 않고 회복한다."),
AbilityUiModel("10", "저수 (P)", "물타입의 기술을 받으면 데미지를 받지 않고 회복한다."),
AbilityUiModel("11", "둔감", "둔감해서 헤롱헤롱이나 도발 상태가 되지 않는다."),
AbilityUiModel("12", "날씨부정", "모든 날씨의 영향이 없어진다."),
AbilityUiModel("13", "복안", "복안을 가지고 있어 기술의 명중률이 올라간다."),
AbilityUiModel("14", "불면", "잠들지 못하는 체질이라 잠듦 상태가 되지 않는다."),
AbilityUiModel("15", "변색", "상대에게 받은 기술의 타입으로 자신의 타입이 변화한다."),
AbilityUiModel("16", "면역", "체내에 면역을 가지고 있어 독 상태가 되지 않는다."),
AbilityUiModel("17", "타오르는불꽃", "불꽃타입의 기술을 받으면 불꽃을 받아서 자신이 사용하는 불꽃타입의 기술이 강해진다."),
AbilityUiModel("18", "인분 (P)", "인분에 보호받아 기술의 추가 효과를 받지 않게 된다."),
AbilityUiModel("19", "마이페이스", "마이페이스라서 혼란 상태가 되지 않는다."),
AbilityUiModel("20", "홉반", "흡반으로 지면에 달라붙어 포켓몬을 교체시키는 기술이나 도구의 효과를 발휘하지 못하게 한다."),
AbilityUiModel("21", "위협", "등장했을 때 위협해서 상대를 위축시켜 상대의 공격을 떨어뜨린다."),
AbilityUiModel("22", "그림자밝기", "상대의 그림자를 밟아 도망치거나 교체할 수 없게 한다."),
AbilityUiModel("23", "까칠한피부", "공격을 받았을 때 자신에게 접촉한 상대를 까칠까칠한 피부로 상처를 입힌다."),
AbilityUiModel("24", "불가사의부적", "효과가 굉장한 기술만 맞는 불가사의한 힘."),
)
}
}
Expand All @@ -57,7 +57,7 @@ fun Ability.toUi(): AbilityUiModel =

fun AbilityDetailUiModel.toUi(): AbilityUiModel =
AbilityUiModel(
id = 0,
id = "0",
title = title,
description = description,
shortening = false,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package poke.rogue.helper.presentation.biome

interface BiomeUiEventHandler {
fun navigateToDetail(biomeId: Long)
fun navigateToDetail(biomeId: String)
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ import poke.rogue.helper.presentation.base.error.ErrorHandleViewModel
class BiomeViewModel(logger: AnalyticsLogger = analyticsLogger()) :
ErrorHandleViewModel(logger),
BiomeUiEventHandler {
private val _navigationToDetailEvent = MutableSharedFlow<Long>()
val navigationToDetailEvent: SharedFlow<Long> = _navigationToDetailEvent.asSharedFlow()
private val _navigationToDetailEvent = MutableSharedFlow<String>()
val navigationToDetailEvent: SharedFlow<String> = _navigationToDetailEvent.asSharedFlow()

override fun navigateToDetail(biomeId: Long) {
override fun navigateToDetail(biomeId: String) {
viewModelScope.launch {
_navigationToDetailEvent.emit(biomeId)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package poke.rogue.helper.presentation.biome.detail

import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.widget.Toolbar
import com.google.android.material.tabs.TabLayoutMediator
Expand Down Expand Up @@ -39,5 +41,12 @@ class BiomeDetailActivity :

companion object {
const val BIOME_ID = "biomeId"

fun intent(
context: Context,
biomeId: String,
): Intent =
Intent(context, BiomeDetailActivity::class.java)
.putExtra(BIOME_ID, biomeId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ class BiomeDetailUiModel(
pokemons =
(1..9).map {
PokemonUiModel(
id = it.toLong(),
dexNumber = it.toLong(),
name = "일반 $it",
imageUrl = dummyUrl(it.toLong()),
Expand All @@ -45,7 +44,6 @@ class BiomeDetailUiModel(
pokemons =
(10..21).map {
PokemonUiModel(
id = it.toLong(),
dexNumber = it.toLong(),
name = "희귀 $it",
imageUrl = dummyUrl(it.toLong()),
Expand All @@ -60,7 +58,6 @@ class BiomeDetailUiModel(
pokemons =
(22..24).map {
PokemonUiModel(
id = it.toLong(),
dexNumber = it.toLong(),
name = "전설 $it",
imageUrl = dummyUrl(it.toLong()),
Expand All @@ -78,7 +75,6 @@ class BiomeDetailUiModel(
pokemons =
(990..1005).map {
PokemonUiModel(
id = it.toLong(),
dexNumber = it.toLong(),
name = "일반 보스 $it",
imageUrl = dummyUrl(it.toLong()),
Expand All @@ -93,7 +89,6 @@ class BiomeDetailUiModel(
pokemons =
(1006..1011).map {
PokemonUiModel(
id = it.toLong(),
dexNumber = it.toLong(),
name = "희귀 보스 $it",
imageUrl = dummyUrl(it.toLong()),
Expand All @@ -108,7 +103,6 @@ class BiomeDetailUiModel(
pokemons =
(1012..1015).map {
PokemonUiModel(
id = it.toLong(),
dexNumber = it.toLong(),
name = "전설 보스 $it",
imageUrl = dummyUrl(it.toLong()),
Expand All @@ -126,7 +120,6 @@ class BiomeDetailUiModel(
pokemons =
(871..874).map {
PokemonUiModel(
id = it.toLong(),
dexNumber = it.toLong(),
name = "심지몬 $it",
imageUrl = dummyUrl(it.toLong()),
Expand All @@ -141,7 +134,6 @@ class BiomeDetailUiModel(
pokemons =
(901..905).map {
PokemonUiModel(
id = it.toLong(),
dexNumber = it.toLong(),
name = "꼬상몬 $it",
imageUrl = dummyUrl(it.toLong()),
Expand All @@ -156,7 +148,6 @@ class BiomeDetailUiModel(
pokemons =
(100..105).map {
PokemonUiModel(
id = it.toLong(),
dexNumber = it.toLong(),
name = "비토몬 $it",
imageUrl = dummyUrl(it.toLong()),
Expand Down
Loading

0 comments on commit 5707f7c

Please sign in to comment.