Skip to content
This repository has been archived by the owner on Oct 20, 2024. It is now read-only.

๐Ÿ“– ๊ฐ์ • ๋ณ„ ์ผ๊ธฐ ์กฐํšŒ & Custom Number Picker (Only Year and Month) #48

Merged
merged 7 commits into from
Aug 6, 2024
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
package com.nabi.data.datasource

import com.nabi.data.model.BaseResponse
import com.nabi.data.model.PageableResponse
import com.nabi.data.model.emotion.DiaryStatisticsResponseDTO
import com.nabi.data.model.emotion.SearchEmotionResponseDTO

interface EmotionRemoteDataSource {

suspend fun getDiaryStatistics(accessToken: String, startDate: String, endDate: String): Result<BaseResponse<DiaryStatisticsResponseDTO>>

suspend fun searchDiaryByEmotion(
accessToken: String,
emotion: String,
page: Int,
size: Int,
sort: String
): Result<BaseResponse<PageableResponse<SearchEmotionResponseDTO>>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package com.nabi.data.datasourceImpl

import com.nabi.data.datasource.EmotionRemoteDataSource
import com.nabi.data.model.BaseResponse
import com.nabi.data.model.PageableResponse
import com.nabi.data.model.emotion.DiaryStatisticsResponseDTO
import com.nabi.data.model.emotion.SearchEmotionResponseDTO
import com.nabi.data.service.EmotionService
import javax.inject.Inject

Expand Down Expand Up @@ -32,4 +34,27 @@ class EmotionRemoteDataSourceImpl @Inject constructor(
}
}

override suspend fun searchDiaryByEmotion(
accessToken: String,
emotion: String,
page: Int,
size: Int,
sort: String
): Result<BaseResponse<PageableResponse<SearchEmotionResponseDTO>>> {
return try {
val response = emotionService.searchDiaryByEmotion(accessToken, emotion, page, size, sort)
if (response.isSuccessful) {
val emotionResponse = response.body()
if (emotionResponse != null) {
Result.success(emotionResponse)
} else {
Result.failure(Exception("Search Emotion failed: response body is null"))
}
} else {
Result.failure(Exception("Search Emotion failed: ${response.message()}"))
}
} catch (e: Exception) {
Result.failure(e)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.nabi.data.model.emotion

import com.google.gson.annotations.SerializedName

data class SearchEmotionResponseDTO(
@SerializedName("diaryEntryDate") val diaryEntryDate: String,
@SerializedName("content") val content: String,
@SerializedName("diaryId") val diaryId: Int
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.nabi.data.repository

import com.nabi.data.datasource.EmotionRemoteDataSource
import com.nabi.domain.model.PageableInfo
import com.nabi.domain.model.diary.SearchDiary
import com.nabi.domain.model.emotion.EmotionStatistics
import com.nabi.domain.repository.EmotionRepository
import javax.inject.Inject
Expand Down Expand Up @@ -33,4 +35,49 @@ class EmotionRepositoryImpl @Inject constructor(
Result.failure(result.exceptionOrNull() ?: Exception("Unknown error"))
}
}

override suspend fun searchDiaryByEmotion(
accessToken: String,
emotion: String,
page: Int,
size: Int,
sort: String
): Result<Pair<PageableInfo, List<SearchDiary>>> {
val result = emotionRemoteDataSource.searchDiaryByEmotion(accessToken, emotion, page, size, sort)

return if (result.isSuccess) {
val res = result.getOrNull()
if (res != null) {
val data = res.data
if (data != null) {
val pageableInfo = PageableInfo(
totalPages = data.totalPages,
totalElements = data.totalElements,
elementSize = data.size,
currentPageNumber = data.number,
isLastPage = data.last
)

if (data.size == 0) {
Result.success(Pair(pageableInfo, emptyList()))
} else {
val searchDiaryList = data.content.map {
SearchDiary(
it.content,
it.diaryEntryDate,
it.diaryId
)
}
Result.success(Pair(pageableInfo, searchDiaryList))
}
} else {
Result.failure(Exception("Search Emotion Data is null"))
}
} else {
Result.failure(Exception("Search Emotion Data Failed: response body is null"))
}
} else {
Result.failure(result.exceptionOrNull() ?: Exception("Unknown error"))
}
}
}
11 changes: 11 additions & 0 deletions Nabi/data/src/main/java/com/nabi/data/service/EmotionService.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.nabi.data.service

import com.nabi.data.model.BaseResponse
import com.nabi.data.model.PageableResponse
import com.nabi.data.model.emotion.DiaryStatisticsResponseDTO
import com.nabi.data.model.emotion.SearchEmotionResponseDTO
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Header
import retrofit2.http.Path
import retrofit2.http.Query

interface EmotionService {

Expand All @@ -16,4 +19,12 @@ interface EmotionService {
@Path("endDate") endDate: String
): Response<BaseResponse<DiaryStatisticsResponseDTO>>

@GET("/emotion/search")
suspend fun searchDiaryByEmotion(
@Header("Authorization") accessToken: String,
@Query("emotion") emotion: String,
@Query("page") page: Int,
@Query("size") size: Int,
@Query("sort") sort: String
): Response<BaseResponse<PageableResponse<SearchEmotionResponseDTO>>>
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
package com.nabi.domain.repository

import com.nabi.domain.model.PageableInfo
import com.nabi.domain.model.diary.SearchDiary
import com.nabi.domain.model.emotion.EmotionStatistics

interface EmotionRepository {

suspend fun getDiaryStatistics(accessToken: String, startDate: String, endDate: String): Result<EmotionStatistics>

suspend fun searchDiaryByEmotion(
accessToken: String,
emotion: String,
page: Int,
size: Int,
sort: String
): Result<Pair<PageableInfo, List<SearchDiary>>>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.nabi.domain.usecase.emotion

import com.nabi.domain.model.PageableInfo
import com.nabi.domain.model.diary.DiaryInfo
import com.nabi.domain.model.diary.SearchDiary
import com.nabi.domain.model.emotion.EmotionStatistics
import com.nabi.domain.repository.EmotionRepository

class SearchEmotionUseCase(private val repository: EmotionRepository) {
suspend operator fun invoke(accessToken: String, emotion: String, page: Int, size: Int, sort: String): Result<Pair<PageableInfo, List<SearchDiary>>>{
return repository.searchDiaryByEmotion("Bearer $accessToken", emotion, page, size, sort)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.nabi.nabi.di

import com.nabi.domain.repository.EmotionRepository
import com.nabi.domain.usecase.emotion.GetEmotionStatisticsUseCase
import com.nabi.domain.usecase.emotion.SearchEmotionUseCase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand All @@ -14,9 +15,17 @@ object EmotionUseCaseModule {

@Provides
@Singleton
fun provideHomeUseCase(
fun provideGetEmotionStatisticsUseCase(
repository: EmotionRepository
): GetEmotionStatisticsUseCase {
return GetEmotionStatisticsUseCase(repository = repository)
}

@Provides
@Singleton
fun provideSearchEmotionUseCase(
repository: EmotionRepository
): SearchEmotionUseCase {
return SearchEmotionUseCase(repository = repository)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.nabi.nabi.extension

import android.app.Dialog
import android.content.Context
import android.graphics.Point
import android.os.Build
import android.view.WindowManager

fun Context.dialogResize(dialog: Dialog, width: Float, height: Float){
val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager

if (Build.VERSION.SDK_INT < 30){
val display = windowManager.defaultDisplay
val size = Point()

display.getSize(size)

val window = dialog.window

val x = (size.x * width).toInt()
val y = (size.y * height).toInt()

window?.setLayout(x, y)

} else{
val rect = windowManager.currentWindowMetrics.bounds

val window = dialog.window
val x = (rect.width() * width).toInt()
val y = (rect.height() * height).toInt()

window?.setLayout(x, y)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.nabi.nabi.views.diary.emotion

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.nabi.domain.model.diary.SearchDiary
import com.nabi.nabi.databinding.ItemSearchDiaryBinding
import com.nabi.nabi.views.OnRvItemClickListener

class EmotionSearchAdapter : ListAdapter<SearchDiary, EmotionSearchAdapter.SearchResultViewHolder>(diaryDiffUtil) {

companion object {
private val diaryDiffUtil = object : DiffUtil.ItemCallback<SearchDiary>() {
override fun areItemsTheSame(oldItem: SearchDiary, newItem: SearchDiary): Boolean =
oldItem.diaryId == newItem.diaryId

override fun areContentsTheSame(oldItem: SearchDiary, newItem: SearchDiary): Boolean =
oldItem == newItem
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchResultViewHolder {
val binding = ItemSearchDiaryBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return SearchResultViewHolder(binding)
}

override fun onBindViewHolder(holder: SearchResultViewHolder, position: Int) {
holder.bind(getItem(position))
}

inner class SearchResultViewHolder(val binding: ItemSearchDiaryBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: SearchDiary) {
binding.tvSearchDiaryDate.text = item.diaryEntryDate
binding.tvContent.text = item.previewContent

itemView.setOnClickListener {
rvItemClickListener.onClick(item.diaryId)
}
}
}

private lateinit var rvItemClickListener: OnRvItemClickListener<Int>

fun setRvItemClickListener(rvItemClickListener: OnRvItemClickListener<Int>){
this.rvItemClickListener = rvItemClickListener
}

override fun submitList(list: List<SearchDiary>?) {
list?.let {
val filteredList = it.distinctBy { diary -> diary.diaryId }
super.submitList(filteredList)
} ?: super.submitList(null)
}
}
Loading