diff --git a/app/src/main/java/com/thechance/qurio/data/local/CharactersDataSource.kt b/app/src/main/java/com/thechance/qurio/data/local/CharactersDataSource.kt index f727bec..1467686 100644 --- a/app/src/main/java/com/thechance/qurio/data/local/CharactersDataSource.kt +++ b/app/src/main/java/com/thechance/qurio/data/local/CharactersDataSource.kt @@ -43,10 +43,6 @@ object CharactersDataSource { fun getCharacterById(id: Int): Character? { return charactersCache?.firstOrNull { it.id == id } } - fun resetCharacters(context: Context) { - charactersCache = createCharacters(context).toMutableList() - } - private fun createCharacters(context: Context): List = listOf( Character( id = 1, diff --git a/app/src/main/java/com/thechance/qurio/data/local/UserDataSource.kt b/app/src/main/java/com/thechance/qurio/data/local/UserDataSource.kt new file mode 100644 index 0000000..ada1e92 --- /dev/null +++ b/app/src/main/java/com/thechance/qurio/data/local/UserDataSource.kt @@ -0,0 +1,31 @@ +package com.thechance.qurio.data.local +import android.content.Context +import com.thechance.qurio.R +import com.thechance.qurio.domain.entity.Character + + +object UserDataSource{ + + private var currentCharacter: Character?=null + + private var lives: Int = 4 + private var points: Int = 700 + private var awards: Int = 0 + private var currentStreak: Int = 0 + + fun getUserCharacter() = currentCharacter + fun updateUserCharacter(newCharacter: Character) { currentCharacter = newCharacter } + + fun getUserStatistics(): Triple = Triple(lives, points, awards) + fun updateLives(newLives: Int) { lives = newLives } + + fun updatePoints(newPoints: Int) { points = newPoints } + fun addPoints(pointsToAdd: Int) { points += pointsToAdd } + fun updateAwards(newAwards: Int) { awards = newAwards } + fun incrementAwards() { awards++ } + + fun getUserStreak() = currentStreak + fun updateStreak(newStreak: Int) { currentStreak = newStreak } + fun incrementStreak() { currentStreak++ } + fun resetStreak() { currentStreak = 0 } +} diff --git a/app/src/main/java/com/thechance/qurio/data/repository/CharactersRepositoryImpl.kt b/app/src/main/java/com/thechance/qurio/data/repository/CharactersRepositoryImpl.kt index 00cc1da..23da68d 100644 --- a/app/src/main/java/com/thechance/qurio/data/repository/CharactersRepositoryImpl.kt +++ b/app/src/main/java/com/thechance/qurio/data/repository/CharactersRepositoryImpl.kt @@ -6,8 +6,9 @@ import com.thechance.qurio.domain.entity.Character import com.thechance.qurio.domain.repository.CharactersRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import javax.inject.Inject -class CharactersRepositoryImpl(private val context: Context) : CharactersRepository { +class CharactersRepositoryImpl @Inject constructor(private val context: Context) : CharactersRepository { override suspend fun getAllCharacters(): List = withContext(Dispatchers.IO) { CharactersDataSource.getAllCharacters(context) diff --git a/app/src/main/java/com/thechance/qurio/data/repository/UserRepositoryImpl.kt b/app/src/main/java/com/thechance/qurio/data/repository/UserRepositoryImpl.kt new file mode 100644 index 0000000..827b476 --- /dev/null +++ b/app/src/main/java/com/thechance/qurio/data/repository/UserRepositoryImpl.kt @@ -0,0 +1,51 @@ +package com.thechance.qurio.data.repository + +import android.content.Context +import com.thechance.qurio.data.local.CharactersDataSource +import com.thechance.qurio.data.local.UserDataSource +import com.thechance.qurio.domain.entity.Character +import com.thechance.qurio.domain.repository.user.UserRepository +import javax.inject.Inject + +class UserRepositoryImpl @Inject constructor( + private val context: Context, +) : UserRepository { + + + override suspend fun getUserCharacter(): Character { + return UserDataSource?.getUserCharacter() ?: CharactersDataSource.getAllCharacters(context=context)[0] + } + + override suspend fun updateUserCharacter(character: Character) { + UserDataSource.updateUserCharacter(character) + } + + override suspend fun getUserStatistics(): Triple { + return UserDataSource.getUserStatistics() + } + + override suspend fun getUserStreak(): Int { + return UserDataSource.getUserStreak() + } + + override suspend fun updateStreak(streak: Int) { + UserDataSource.updateStreak(streak) + } + + override suspend fun incrementStreak() { + UserDataSource.incrementStreak() + } + + override suspend fun addPoints(points: Int) { + UserDataSource.addPoints(points) + } + + override suspend fun updateLives(lives: Int) { + UserDataSource.updateLives(lives) + } + + override suspend fun updatePoints(points: Int) { + UserDataSource.updatePoints(points) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/thechance/qurio/di/DataModule.kt b/app/src/main/java/com/thechance/qurio/di/DataModule.kt index 4c88d34..3d30184 100644 --- a/app/src/main/java/com/thechance/qurio/di/DataModule.kt +++ b/app/src/main/java/com/thechance/qurio/di/DataModule.kt @@ -8,7 +8,13 @@ import androidx.datastore.preferences.preferencesDataStoreFile import androidx.room.Room import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import com.thechance.qurio.data.ApiService +import com.thechance.qurio.data.local.UserDataSource import com.thechance.qurio.data.local.dao.GameSessionDao +import com.thechance.qurio.data.util.LoggingInterceptor +import com.thechance.qurio.presentation.main.QurioApp +import com.thechance.qurio.data.remote.service.GameService +import com.thechance.qurio.data.repository.GameRepositoryImpl +import com.thechance.qurio.domain.repository.game.GameRepository import com.thechance.qurio.data.local.dao.PlayedGameDao import com.thechance.qurio.data.local.database.QurioDatabase import com.thechance.qurio.data.remote.service.GameService diff --git a/app/src/main/java/com/thechance/qurio/di/FragmentModule.kt b/app/src/main/java/com/thechance/qurio/di/FragmentModule.kt index a3bc008..7e3931f 100644 --- a/app/src/main/java/com/thechance/qurio/di/FragmentModule.kt +++ b/app/src/main/java/com/thechance/qurio/di/FragmentModule.kt @@ -2,6 +2,9 @@ package com.thechance.qurio.di import com.thechance.qurio.presentation.screen.achievements.AchievementsDialogFragment import com.thechance.qurio.presentation.screen.buylife.BuyLifeDialogFragment +import com.thechance.qurio.presentation.screen.characters.CharacterBuyDialogFragment +import com.thechance.qurio.presentation.screen.characters.CharacterDescDialogFragment +import com.thechance.qurio.presentation.screen.characters.CharacterDialogFragment import com.thechance.qurio.presentation.screen.difficulty.DifficultyLevelDialogFragment import com.thechance.qurio.presentation.screen.example.ExampleFragment import com.thechance.qurio.presentation.screen.games_screen.GamesFragment @@ -46,7 +49,12 @@ abstract class FragmentModule { @ContributesAndroidInjector abstract fun contributeBuyLifeDialogFragment(): BuyLifeDialogFragment - + @ContributesAndroidInjector + abstract fun contributeCharacterDialogFragment(): CharacterDialogFragment + @ContributesAndroidInjector + abstract fun contributeCharacterDescDialogFragment(): CharacterDescDialogFragment + @ContributesAndroidInjector + abstract fun contributeCharacterBuyDialogFragment(): CharacterBuyDialogFragment @ContributesAndroidInjector abstract fun contributeDifficultyLevelDialogFragment(): DifficultyLevelDialogFragment } \ No newline at end of file diff --git a/app/src/main/java/com/thechance/qurio/di/RepositoryModule.kt b/app/src/main/java/com/thechance/qurio/di/RepositoryModule.kt index 4ddde8e..df0cb23 100644 --- a/app/src/main/java/com/thechance/qurio/di/RepositoryModule.kt +++ b/app/src/main/java/com/thechance/qurio/di/RepositoryModule.kt @@ -1,6 +1,7 @@ package com.thechance.qurio.di import com.thechance.qurio.data.repository.AchievementsRepositoryImpl +import com.thechance.qurio.data.repository.CharactersRepositoryImpl import com.thechance.qurio.data.repository.ExampleRepositoryImpl import com.thechance.qurio.data.repository.TGameRepository import com.thechance.qurio.data.repository.TGameRepositoryImpl @@ -9,11 +10,14 @@ import com.thechance.qurio.data.repository.GameSessionRepositoryImpl import com.thechance.qurio.data.repository.ResultsRepositoryImpl import com.thechance.qurio.data.repository.UserPreferencesRepositoryImpl import com.thechance.qurio.data.repository.GameRepositoryImpl +import com.thechance.qurio.data.repository.UserRepositoryImpl import com.thechance.qurio.domain.repository.AchievementsRepository +import com.thechance.qurio.domain.repository.CharactersRepository import com.thechance.qurio.domain.repository.ExampleRepository import com.thechance.qurio.domain.repository.ResultsRepository import com.thechance.qurio.domain.repository.UserPreferencesRepository import com.thechance.qurio.domain.repository.game.GameRepository +import com.thechance.qurio.domain.repository.user.UserRepository import dagger.Binds import dagger.Module @@ -54,4 +58,14 @@ abstract class RepositoryModule { abstract fun bindGameRepository( impl: GameRepositoryImpl ): GameRepository + + + @Binds + abstract fun bindUserRepository( + impl: UserRepositoryImpl + ): UserRepository + @Binds + abstract fun bindCharacterRepository( + impl: CharactersRepositoryImpl + ): CharactersRepository } \ No newline at end of file diff --git a/app/src/main/java/com/thechance/qurio/domain/entity/UserStatistics.kt b/app/src/main/java/com/thechance/qurio/domain/entity/UserStatistics.kt new file mode 100644 index 0000000..7786f6b --- /dev/null +++ b/app/src/main/java/com/thechance/qurio/domain/entity/UserStatistics.kt @@ -0,0 +1,7 @@ +package com.thechance.qurio.domain.entity + +data class UserStatistics( + val lives: Int, + val points: Int, + val awards: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/thechance/qurio/domain/repository/UserRepository.kt b/app/src/main/java/com/thechance/qurio/domain/repository/UserRepository.kt new file mode 100644 index 0000000..0caa2c4 --- /dev/null +++ b/app/src/main/java/com/thechance/qurio/domain/repository/UserRepository.kt @@ -0,0 +1,15 @@ +package com.thechance.qurio.domain.repository.user + +import com.thechance.qurio.domain.entity.Character + +interface UserRepository { + suspend fun getUserCharacter(): Character + suspend fun updateUserCharacter(character: Character) + suspend fun getUserStatistics(): Triple + suspend fun getUserStreak(): Int + suspend fun updateStreak(streak: Int) + suspend fun incrementStreak() + suspend fun addPoints(points: Int) + suspend fun updateLives(lives: Int) + suspend fun updatePoints(points: Int) +} \ No newline at end of file diff --git a/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifeDialogFragment.kt b/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifeDialogFragment.kt index 67cb5c3..41fee2e 100644 --- a/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifeDialogFragment.kt +++ b/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifeDialogFragment.kt @@ -86,7 +86,13 @@ class BuyLifeDialogFragment : DialogFragment(), BuyLifeView { // Optionally hide a loading indicator binding.buttonBuy.isEnabled = true } + override fun enableBuyButton() { + binding.buttonBuy.isEnabled = true + } + override fun disableBuyButton() { + binding.buttonBuy.isEnabled = false + } override fun showError(message: String) { Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() } @@ -99,6 +105,12 @@ class BuyLifeDialogFragment : DialogFragment(), BuyLifeView { showError("Failed to buy life") } } + override fun onLifeBoughtSuccessfully() { + parentFragmentManager.setFragmentResult("life_bought", Bundle().apply { + putBoolean("success", true) + }) + dismiss() + } override fun onDestroyView() { super.onDestroyView() diff --git a/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifePresenter.kt b/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifePresenter.kt index 9ae7d8b..23ee3be 100644 --- a/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifePresenter.kt +++ b/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifePresenter.kt @@ -1,24 +1,73 @@ package com.thechance.qurio.presentation.screen.buylife +import com.thechance.qurio.domain.repository.user.UserRepository import com.thechance.qurio.presentation.base.BasePresenter import javax.inject.Inject -class BuyLifePresenter @Inject constructor() : BasePresenter() { +class BuyLifePresenter @Inject constructor( + private val userRepository: UserRepository +) : BasePresenter() { + private var lifeCount: Int = 1 private var price: Int = 200 + private var userPoints: Int = 0 fun loadLifeInfo() { + tryToExecute( + callee = { userRepository.getUserStatistics() }, + onSuccess = ::onLoadLifeInfoSuccess, + onError = ::onError + ) + } + + private fun onLoadLifeInfoSuccess(statistics: Triple) { + val (_, points, _) = statistics + userPoints = points + view.showLifeCount(lifeCount) view.showPrice(price) + + if (userPoints < price) { + view.showError("Not enough points to buy a life!") + view.disableBuyButton() + } else { + view.enableBuyButton() + } } fun buyLife() { view.showLoading() - // TODO: Add the business logic - // Simulate success + tryToExecute( + callee = { userRepository.getUserStatistics() }, + onSuccess = ::onBuyLifeSuccess, + onError = ::onBuyLifeError + ) + } + + private suspend fun onBuyLifeSuccess(statistics: Triple) { + val (lives, points, _) = statistics + + if (points >= price) { + userRepository.updateLives(lives + 1) + userRepository.updatePoints(points - price) + view.hideLoading() + view.onLifeBoughtSuccessfully() + } else { + view.hideLoading() + view.showError("Not enough points to buy a life!") + view.disableBuyButton() + view.onLifeBought(false) + } + } + + private fun onBuyLifeError(throwable: Throwable) { view.hideLoading() - view.onLifeBought(true) + view.showError(throwable.message ?: "Failed to buy life") + view.onLifeBought(false) } -} + private fun onError(throwable: Throwable) { + view.showError(throwable.message ?: "Failed to load life info") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifeView.kt b/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifeView.kt index 2f70c03..3406bba 100644 --- a/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifeView.kt +++ b/app/src/main/java/com/thechance/qurio/presentation/screen/buylife/BuyLifeView.kt @@ -7,7 +7,10 @@ interface BuyLifeView : BaseView { fun showPrice(price: Int) fun showLoading() fun hideLoading() + fun onLifeBoughtSuccessfully() fun showError(message: String) fun onLifeBought(success: Boolean) + fun enableBuyButton() + fun disableBuyButton() } diff --git a/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterBuyDialogFragment.kt b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterBuyDialogFragment.kt index 7a10a1b..65fe445 100644 --- a/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterBuyDialogFragment.kt +++ b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterBuyDialogFragment.kt @@ -9,23 +9,24 @@ import android.view.ViewGroup import android.widget.Toast import androidx.core.graphics.drawable.toDrawable import androidx.fragment.app.DialogFragment -import androidx.lifecycle.lifecycleScope -import com.thechance.qurio.data.repository.CharactersRepositoryImpl import com.thechance.qurio.databinding.DialogCharacterBuyBinding import com.thechance.qurio.domain.entity.Character -import kotlinx.coroutines.launch +import com.thechance.qurio.presentation.screen.home.HomeFragment +import dagger.android.support.AndroidSupportInjection +import javax.inject.Inject -class CharacterBuyDialogFragment : DialogFragment() { +class CharacterBuyDialogFragment : DialogFragment(){ private var _binding: DialogCharacterBuyBinding? = null private val binding get() = _binding!! - private lateinit var character: Character - private var onBuyConfirmed: (() -> Unit)? = null - private val repository by lazy { CharactersRepositoryImpl(requireContext()) } + private lateinit var character: Character + @Inject + lateinit var presenter : CharacterPresenter override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = super.onCreateDialog(savedInstanceState) + AndroidSupportInjection.inject(this) dialog.window?.apply { setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) @@ -54,50 +55,52 @@ class CharacterBuyDialogFragment : DialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + presenter.attachView(object : CharacterView { + override fun showLoading() {} + override fun hideLoading() {} + override fun showError(message: String) {} + override fun showCharacters(characters: List) {} + override fun openCharacterDetails(character: Character) {} + }) + binding.characterImg.setImageResource(character.imageLockedRes) binding.textPrice.text = character.price.toString() binding.text.text binding.buttonBuy.setOnClickListener { - performPurchase() - dismiss() + binding.buttonBuy.isEnabled = false + presenter.buyCharacter( + character = character, + onSuccess = { + var fragment = parentFragment + while (fragment != null && fragment !is HomeFragment) { + fragment = fragment.parentFragment + } + + if (fragment is HomeFragment) { + fragment.childFragmentManager.setFragmentResult("character_bought", Bundle().apply { + putBoolean("success", true) + }) + } + + dismiss() + }, + onError = { errorMessage -> + Toast.makeText(requireContext(), errorMessage, Toast.LENGTH_SHORT).show() + binding.buttonBuy.isEnabled = true + } + ) } binding.buttonCancel.setOnClickListener { dismiss() - + CharacterDialogNavigator.showCharacterDetails(parentFragmentManager, character) } } - private fun performPurchase() { - binding.buttonBuy.isEnabled = false - - lifecycleScope.launch { - try { - repository.updateCharacterLockState(character.id, true) - Toast.makeText( - requireContext(), - "Character unlocked successfully!", - Toast.LENGTH_SHORT - ).show() - onBuyConfirmed?.invoke() - dismiss() - } catch (e: Exception) { - - Toast.makeText( - requireContext(), - "Failed to unlock character: ${e.message}", - Toast.LENGTH_SHORT - ).show() - - //todo:check money , if user not have enough money buy button will be disabled - //todo:Deducting coins from user balance - } - } - } override fun onDestroyView() { super.onDestroyView() @@ -107,11 +110,9 @@ class CharacterBuyDialogFragment : DialogFragment() { companion object { fun newInstance( character: Character, - onBuyConfirmed: () -> Unit ): CharacterBuyDialogFragment { return CharacterBuyDialogFragment().apply { this.character = character - this.onBuyConfirmed = onBuyConfirmed } } } diff --git a/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterBuyView.kt b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterBuyView.kt new file mode 100644 index 0000000..90e1c29 --- /dev/null +++ b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterBuyView.kt @@ -0,0 +1,4 @@ +package com.thechance.qurio.presentation.screen.characters + +interface CharacterBuyView { +} \ No newline at end of file diff --git a/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterDescDialogFragment.kt b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterDescDialogFragment.kt index 6ec69e6..fdf9d39 100644 --- a/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterDescDialogFragment.kt +++ b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterDescDialogFragment.kt @@ -11,6 +11,7 @@ import androidx.core.graphics.drawable.toDrawable import androidx.fragment.app.DialogFragment import com.thechance.qurio.databinding.DialogCharacterDescriptionBinding import com.thechance.qurio.domain.entity.Character +import dagger.android.support.AndroidSupportInjection class CharacterDescDialogFragment : DialogFragment() { @@ -21,6 +22,7 @@ class CharacterDescDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = super.onCreateDialog(savedInstanceState) + AndroidSupportInjection.inject(this) dialog.window?.apply { setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) @@ -48,8 +50,9 @@ class CharacterDescDialogFragment : DialogFragment() { @SuppressLint("SetTextI18n") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + println("parent") + super.onViewCreated(view, savedInstanceState) binding.tvCharacterName.text = character.name binding.tvCharacterAge.text ="Age: ${character.age}" binding.tvCharacterDesc.text =character.description @@ -69,14 +72,12 @@ class CharacterDescDialogFragment : DialogFragment() { private fun showBuyDialog() { - val buyDialog = CharacterBuyDialogFragment.newInstance(character) { - } - buyDialog.show(parentFragmentManager, "BuyCharacterDialog") + CharacterDialogNavigator.showBuyDialog(parentFragmentManager, character) } + private fun showCharacterDialog() { + CharacterDialogNavigator.showCharacterList(parentFragmentManager) dismiss() - CharacterDialogFragment() - .show(parentFragmentManager, "Character_dialog") } diff --git a/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterDialogFragment.kt b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterDialogFragment.kt index 0e1a0e6..3b131b6 100644 --- a/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterDialogFragment.kt +++ b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterDialogFragment.kt @@ -14,9 +14,10 @@ import com.google.android.flexbox.FlexDirection import com.google.android.flexbox.FlexWrap import com.google.android.flexbox.FlexboxLayoutManager import com.google.android.flexbox.JustifyContent -import com.thechance.qurio.data.repository.CharactersRepositoryImpl import com.thechance.qurio.databinding.DialogCharactersBinding import com.thechance.qurio.domain.entity.Character +import dagger.android.support.AndroidSupportInjection +import javax.inject.Inject class CharacterDialogFragment : DialogFragment(), CharacterView { @@ -24,10 +25,11 @@ class CharacterDialogFragment : DialogFragment(), CharacterView { private val binding get() = _binding!! private var selectedCharacter: Character? = null - private val presenter by lazy { CharacterPresenter(CharactersRepositoryImpl(requireContext())) } - + @Inject + lateinit var presenter : CharacterPresenter override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = super.onCreateDialog(savedInstanceState) + AndroidSupportInjection.inject(this) dialog.window?.apply { setBackgroundDrawable(Color.TRANSPARENT.toDrawable()) @@ -91,16 +93,11 @@ class CharacterDialogFragment : DialogFragment(), CharacterView { } override fun openCharacterDetails(character: Character) { - showCharacterDialog(character) - } - - - private fun showCharacterDialog(character: Character) { dismiss() - CharacterDescDialogFragment.newInstance(character) - .show(parentFragmentManager, "Character_desc") + CharacterDialogNavigator.showCharacterDetails(parentFragmentManager, character) } + override fun onDestroyView() { super.onDestroyView() presenter.detachView() diff --git a/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterDialogNavigator.kt b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterDialogNavigator.kt new file mode 100644 index 0000000..ec09d29 --- /dev/null +++ b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterDialogNavigator.kt @@ -0,0 +1,24 @@ +package com.thechance.qurio.presentation.screen.characters +import com.thechance.qurio.domain.entity.Character + +object CharacterDialogNavigator { + fun showCharacterList(fragmentManager: androidx.fragment.app.FragmentManager) { + CharacterDialogFragment().show(fragmentManager, "CharacterDialog") + } + + fun showCharacterDetails( + fragmentManager: androidx.fragment.app.FragmentManager, + character: Character + ) { + CharacterDescDialogFragment.newInstance(character) + .show(fragmentManager, "CharacterDescDialog") + } + + fun showBuyDialog( + fragmentManager: androidx.fragment.app.FragmentManager, + character: Character + ) { + CharacterBuyDialogFragment.newInstance(character) + .show(fragmentManager, "CharacterBuyDialog") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterPresenter.kt b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterPresenter.kt index e40c6f0..4a654db 100644 --- a/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterPresenter.kt +++ b/app/src/main/java/com/thechance/qurio/presentation/screen/characters/CharacterPresenter.kt @@ -2,11 +2,13 @@ package com.thechance.qurio.presentation.screen.characters import com.thechance.qurio.domain.entity.Character import com.thechance.qurio.domain.repository.CharactersRepository +import com.thechance.qurio.domain.repository.user.UserRepository import com.thechance.qurio.presentation.base.BasePresenter import javax.inject.Inject class CharacterPresenter @Inject constructor( - private val charactersRepository: CharactersRepository + private val charactersRepository: CharactersRepository, + private val userRepository: UserRepository ): BasePresenter() { fun loadCharacters() { tryToExecute( @@ -47,4 +49,42 @@ class CharacterPresenter @Inject constructor( ) } + var characterPoint = 0 + var characterId = 0 + fun buyCharacter(character: Character, onSuccess: () -> Unit = {}, onError: (String) -> Unit = {}) { + view.showLoading() + characterPoint = character.price + characterId = character.id + + tryToExecute( + callee = { userRepository.getUserStatistics() }, + onSuccess = { statistics -> + onBuyCharacterSuccess(statistics, onSuccess, onError) + }, + onError = { throwable -> + view.hideLoading() + onError(throwable.message ?: "Failed to buy character") + } + ) + } + + private suspend fun onBuyCharacterSuccess( + statistics: Triple, + onSuccess: () -> Unit, + onError: (String) -> Unit + ) { + val (_, points, _) = statistics + + if (points >= characterPoint) { + userRepository.updatePoints(points - characterPoint) + unlockCharacter(characterId, true) + view.hideLoading() + onSuccess() + } else { + view.hideLoading() + onError("Not enough points to buy a Character!") + } + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/thechance/qurio/presentation/screen/home/HomeFragment.kt b/app/src/main/java/com/thechance/qurio/presentation/screen/home/HomeFragment.kt index 33f3ae7..cc00214 100644 --- a/app/src/main/java/com/thechance/qurio/presentation/screen/home/HomeFragment.kt +++ b/app/src/main/java/com/thechance/qurio/presentation/screen/home/HomeFragment.kt @@ -38,6 +38,29 @@ class HomeFragment : BaseFragment( setupAllGamesButton() setupGamesRecyclerView() setupAllLastGamesButton() + setupLifePurchaseListener() + setupCharacterPurchaseListener() + } + private fun setupCharacterPurchaseListener() { + childFragmentManager.setFragmentResultListener( + "character_bought", + viewLifecycleOwner + ) { _, bundle -> + val success = bundle.getBoolean("success", false) + if (success) { + println("suc") + presenter.refreshData() + } + } + } + private fun setupLifePurchaseListener() { + childFragmentManager.setFragmentResultListener("life_bought", viewLifecycleOwner) { _, bundle -> + val success = bundle.getBoolean("success", false) + if (success) { + println("s") + presenter.refreshData() + } + } } private fun setupCharacterButton() { @@ -167,7 +190,9 @@ class HomeFragment : BaseFragment( override fun setGames(games: List) { gamesAdapter.setItems(games) } - + override fun onResume() { + super.onResume() + } override fun setUserLastGames(lastGames: List) { val adapter = PlayedGamesAdapter(lastGames) binding.lastGamesRecyclerview.adapter = adapter diff --git a/app/src/main/java/com/thechance/qurio/presentation/screen/home/HomePresenter.kt b/app/src/main/java/com/thechance/qurio/presentation/screen/home/HomePresenter.kt index cfe7100..cb56a03 100644 --- a/app/src/main/java/com/thechance/qurio/presentation/screen/home/HomePresenter.kt +++ b/app/src/main/java/com/thechance/qurio/presentation/screen/home/HomePresenter.kt @@ -3,13 +3,15 @@ package com.thechance.qurio.presentation.screen.home import com.thechance.qurio.domain.entity.GameCategory import com.thechance.qurio.domain.entity.PlayedGame import com.thechance.qurio.domain.repository.game.GameRepository +import com.thechance.qurio.domain.repository.user.UserRepository import com.thechance.qurio.presentation.base.BasePresenter import com.thechance.qurio.presentation.screen.games_screen.toUi import com.thechance.qurio.presentation.screen.played_games_screen.toUi import kotlinx.coroutines.flow.Flow import javax.inject.Inject class HomePresenter @Inject constructor( - private val gameRepository: GameRepository + private val gameRepository: GameRepository, + private val userRepository: UserRepository ) : BasePresenter() { init { getUserCharacter() @@ -21,7 +23,7 @@ class HomePresenter @Inject constructor( private fun getUserCharacter() { tryToExecute( - callee = { "Rika" }, + callee = { userRepository.getUserCharacter().name }, onSuccess = ::onGetUserCharacterSuccess, onError = ::onError ) @@ -37,19 +39,20 @@ class HomePresenter @Inject constructor( private fun getUserStatistics() { tryToExecute( - callee = { Triple(4, 5200,2) }, + callee = {userRepository.getUserStatistics()}, onSuccess = ::onGetUserStatisticsSuccess, onError = ::onError ) } private fun onGetUserStatisticsSuccess(statistics: Triple) { + println("get$statistics") view.setUserStatistics(statistics) } private fun getUserStreak() { tryToExecute( - callee = { 5 }, + callee = { userRepository.getUserStreak()}, onSuccess = ::onGetUserStreakSuccess, onError = ::onError ) @@ -58,7 +61,10 @@ class HomePresenter @Inject constructor( private fun onGetUserStreakSuccess(streak: Int) { view.setUserStreak(streak) } - + fun refreshData() { + getUserStatistics() + getUserStreak() + } private fun getGames() { tryToExecute( callee = gameRepository::getGames,