Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions app/src/main/java/com/egobook/app/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.egobook.app
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
Expand Down Expand Up @@ -51,7 +52,8 @@ class MainActivity : AppCompatActivity(), BlurController, NotificationController
R.id.diaryWriteFragment, // 일기 작성 화면
R.id.calenderFragment, // 달력 화면
R.id.storeFragment,
R.id.accountFragment //계정 화면
R.id.accountFragment, //계정 화면
R.id.psychologyFragment
-> {
binding.bottomNavigation.visibility = View.GONE
}
Expand Down Expand Up @@ -95,7 +97,8 @@ class MainActivity : AppCompatActivity(), BlurController, NotificationController
RewardedAd.load(this, adUnitId, adRequest, object : RewardedAdLoadCallback() {
override fun onAdFailedToLoad(adError: LoadAdError) {
rewardedAd = null
Log.d("AdMob", "광고 로드 실패")
Toast.makeText(this@MainActivity, "광고를 불러오는데 실패했습니다", Toast.LENGTH_SHORT).show()
Log.d("AdMob", "광고 로드 실패, $adError")
}

override fun onAdLoaded(ad: RewardedAd) {
Expand Down
37 changes: 30 additions & 7 deletions app/src/main/java/com/egobook/app/ui/home/PsychologyViewModel.kt
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@
package com.egobook.app.ui.home

import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.egobook.app.ui.home.repository.DailyPsychologyDto
import com.egobook.app.ui.home.repository.PsychologyKnowledge
import com.egobook.app.ui.home.repository.PsychologyReward
import com.egobook.app.ui.home.repository.SavedPsychologyDto
import com.egobook.app.ui.home.repository.UserPsychologyRepository
import com.egobook.app.ui.home.repository.UserRepository
import com.egobook.app.ui.home.user.Ink
import com.egobook.app.ui.home.user.Level
import com.egobook.app.ui.home.user.User
import com.egobook.app.ui.shop.CustomItem
import com.egobook.app.ui.shop.StoreRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
Expand All @@ -25,6 +19,14 @@ class PsychologyViewModel @Inject constructor(
private val psychologyRepository: UserPsychologyRepository
) : ViewModel() {

init {
loadDailyPsychology()
loadSavedPsychology()
}

private val _savedPsychologies = MutableStateFlow(emptyList<SavedPsychologyDto>())
val savedPsychologies: StateFlow<List<SavedPsychologyDto>> = _savedPsychologies.asStateFlow()

private val _dailyPhycologyDto = MutableStateFlow(
DailyPsychologyDto(
date = "0000-00-00",
Expand All @@ -50,6 +52,27 @@ class PsychologyViewModel @Inject constructor(
viewModelScope.launch {
_dailyPhycologyDto.value = psychologyRepository.loadDailyPsychology()
}
}

fun savePsychology(knowledgeId: Int) {
viewModelScope.launch {
psychologyRepository.saveDailyPsychology(knowledgeId)
loadDailyPsychology()
loadSavedPsychology()
}
}

fun deletePsychology(knowledgeId: Int) {
viewModelScope.launch {
psychologyRepository.deletePsychology(knowledgeId)
loadDailyPsychology()
loadSavedPsychology()
}
}

fun loadSavedPsychology() {
viewModelScope.launch {
_savedPsychologies.value = psychologyRepository.loadSavedPsychology()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import com.egobook.app.ui.home.user.Tendency
import com.egobook.app.ui.home.user.User
import retrofit2.Retrofit
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Path
import javax.inject.Inject
import javax.inject.Singleton

Expand All @@ -28,6 +30,11 @@ interface UserTendencyRepository {
interface UserPsychologyRepository {
suspend fun isReadDailyPsychology(): Boolean
suspend fun loadDailyPsychology(): DailyPsychologyDto
suspend fun saveDailyPsychology(knowledgeId: Int): SavingPsychologyLogDto

suspend fun deletePsychology(knowledgeId: Int): DeletingPsychologyLogDto

suspend fun loadSavedPsychology(): List<SavedPsychologyDto>
}

interface NetworkUserService {
Expand Down Expand Up @@ -95,12 +102,48 @@ data class DailyPsychologyDto(

)

data class SavingPsychologyLogDto(
val knowledgeId: Long,
val saved: Boolean,
val toastMessage: String
)

data class DeletingPsychologyLogDto(
val saved: Boolean,
val knowledgeId: Long,
val toastMessage: String
)

data class SavedPsychologyDto(
val knowledgeId: Int,
val preview: String,
val savedAt: String,
val source: String,
val title: String
)

data class SavedPsychologyGroupDto(
val values: List<SavedPsychologyDto>,
val hasNext: Boolean,
val nextCursor: Int
)

interface NetworkPsychologyService {
@GET("/psychology/daily/status")
suspend fun isReadDailyPsychology(): BaseResponse<PsychologyStateDto>

@GET("/psychology/daily")
suspend fun loadDailyPsychology(): BaseResponse<DailyPsychologyDto>

@POST("/psychology/{knowledgeId}/save")
suspend fun savePsychology(@Path("knowledgeId") knowledgeId: Int): BaseResponse<SavingPsychologyLogDto>

@DELETE("/psychology/{knowledgeId}/save")
suspend fun deletePsychology(@Path("knowledgeId") knowledgeId: Int): BaseResponse<DeletingPsychologyLogDto>

@GET("/psychology/saved")
suspend fun loadSavedPsychology(): BaseResponse<SavedPsychologyGroupDto>

}

@Singleton
Expand Down Expand Up @@ -145,7 +188,7 @@ class NetworkUserRepository @Inject constructor(
)
return watchingAdResponse.message
}

override suspend fun isReadDailyPsychology(): Boolean {
val psychologyResponse: BaseResponse<PsychologyStateDto> =
psychologyService.isReadDailyPsychology()
Expand All @@ -159,4 +202,22 @@ class NetworkUserRepository @Inject constructor(
return psychologyResponse.data
}

override suspend fun saveDailyPsychology(knowledgeId: Int): SavingPsychologyLogDto {
val psychologyResponse: BaseResponse<SavingPsychologyLogDto> =
psychologyService.savePsychology(knowledgeId)
return psychologyResponse.data
}

override suspend fun deletePsychology(knowledgeId: Int): DeletingPsychologyLogDto {
val psychologyResponse: BaseResponse<DeletingPsychologyLogDto> =
psychologyService.deletePsychology(knowledgeId)
return psychologyResponse.data
}

override suspend fun loadSavedPsychology(): List<SavedPsychologyDto> {
val psychologyResponse: BaseResponse<SavedPsychologyGroupDto> =
psychologyService.loadSavedPsychology()
return psychologyResponse.data.values
}

}
12 changes: 1 addition & 11 deletions app/src/main/java/com/egobook/app/ui/home/ui/HomeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -92,17 +92,7 @@ class HomeFragment(): Fragment() {
}

binding.ivBottle.setOnClickListener {
applyScreenBlur(BlurLevel.BASE)
val dialog = PsychologyDialog()
dialog.isCancelable = false
dialog.show(parentFragmentManager, "DailyPsychologyDialog")
binding.ivDailyBottle.visibility = View.INVISIBLE

parentFragmentManager.setFragmentResultListener("psychology_key", viewLifecycleOwner) { _, _ ->
Log.d("jang", "다이얼로그 닫힘 감지 - 데이터 갱신")
viewModel.fetchUser()
viewModel.fetchDailyPhycologyReadState()
}
findNavController().navigate(R.id.action_homeFragment_to_psychologyFragment)
}

binding.ivAd.setOnClickListener {
Expand Down
21 changes: 16 additions & 5 deletions app/src/main/java/com/egobook/app/ui/home/ui/PsychologyDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,22 @@ import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.setFragmentResult
import androidx.lifecycle.lifecycleScope
import com.egobook.app.R
import com.egobook.app.databinding.DialogAdBinding
import com.egobook.app.databinding.DialogPsychologyBinding
import com.egobook.app.removeScreenBlur
import com.egobook.app.ui.home.HomeViewModel
import com.egobook.app.ui.home.PsychologyViewModel
import kotlinx.coroutines.launch
import kotlin.math.max

class PsychologyDialog() : DialogFragment() {

private var _binding: DialogPsychologyBinding? = null
private val binding get() = checkNotNull(_binding) { "Fragment가 제거되었습니다." }

private var ink: Int = 0

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand All @@ -38,19 +42,26 @@ class PsychologyDialog() : DialogFragment() {

val viewModel: PsychologyViewModel by activityViewModels()

viewModel.loadDailyPsychology()

viewLifecycleOwner.lifecycleScope.launch {
viewModel.dailyPhycologyDto.collect { dailyPhycologyDto ->
binding.tvPsychologyContent.text = dailyPhycologyDto.knowledge.content
binding.tvPsychologySource.text = dailyPhycologyDto.knowledge.source
binding.tvPsychologyDate.text = dailyPhycologyDto.date
if(dailyPhycologyDto.reward == null) {
binding.btnReward.text = "메인으로 돌아가기"
ink = max(ink, dailyPhycologyDto.reward?.inkGranted ?: 0)
binding.btnReward.text = "잉크 ${ink}개 획득!"
if (dailyPhycologyDto.isBookmarked) {
binding.ivBookmark.setImageResource(R.drawable.ic_bookmark_clicked)
} else {
binding.btnReward.text = "잉크 ${dailyPhycologyDto.reward.inkGranted}개 획득!"
binding.ivBookmark.setImageResource(R.drawable.ic_bookmark_unclicked)
}
}
}

binding.ivBookmark.setOnClickListener {
if (viewModel.dailyPhycologyDto.value.isBookmarked) {
viewModel.deletePsychology(viewModel.dailyPhycologyDto.value.knowledge.knowledgeId)
} else {
viewModel.savePsychology(viewModel.dailyPhycologyDto.value.knowledge.knowledgeId)
}
}

Expand Down
78 changes: 78 additions & 0 deletions app/src/main/java/com/egobook/app/ui/home/ui/PsychologyFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.egobook.app.ui.home.ui

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.egobook.app.R
import com.egobook.app.databinding.FragmentPsychologyBinding
import com.egobook.app.ui.home.PsychologyViewModel
import com.egobook.app.ui.home.repository.SavedPsychologyDto
import com.egobook.app.ui.shop.ItemAdapter
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch

@AndroidEntryPoint
class PsychologyFragment(): Fragment() {
private lateinit var binding: FragmentPsychologyBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentPsychologyBinding.inflate(inflater)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val viewModel: PsychologyViewModel by activityViewModels()
viewLifecycleOwner.lifecycleScope.launch {
viewModel.dailyPhycologyDto.collect { dailyPhycologyDto ->
binding.tvPsychologyContent.text = dailyPhycologyDto.knowledge.content
binding.tvPsychologySource.text = dailyPhycologyDto.knowledge.source
binding.tvPsychologyDate.text = dailyPhycologyDto.date
if (dailyPhycologyDto.isBookmarked) {
binding.ivBookmark.setImageResource(R.drawable.ic_bookmark_clicked)
} else {
binding.ivBookmark.setImageResource(R.drawable.ic_bookmark_unclicked)
}
}
}
binding.ivBookmark.setOnClickListener {
if (viewModel.dailyPhycologyDto.value.isBookmarked) {
viewModel.deletePsychology(viewModel.dailyPhycologyDto.value.knowledge.knowledgeId)
} else {
viewModel.savePsychology(viewModel.dailyPhycologyDto.value.knowledge.knowledgeId)
}
}
binding.ivBackButton.setOnClickListener {
findNavController().navigate(R.id.action_psychologyFragment_to_homeFragment)
}

val itemAdapter = SavedPsychologyAdapter { savedPsychologyDto ->
viewModel.deletePsychology(savedPsychologyDto.knowledgeId)
}

binding.rvSavedPsychologies.apply {
adapter = itemAdapter
layoutManager = LinearLayoutManager(context)
}

viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.savedPsychologies.collect { psychologies ->
itemAdapter.submitList(psychologies)
}
}
}
}
}
Loading