From 49c3631bfb225e8cc4f24f601421d6672badee10 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Wed, 12 Apr 2023 22:20:26 +0900 Subject: [PATCH 01/28] =?UTF-8?q?Feature/statistics:=20=ED=98=84=EC=9E=AC?= =?UTF-8?q?=20=EC=9B=94=20=EA=B0=80=EC=A0=B8=EC=99=80=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=20=EC=B2=AB=20=ED=99=94=EB=A9=B4=EC=97=90=20=EB=B3=B4=EC=97=AC?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../housekeeper/ui/statistics/StatisticsFragment.kt | 6 +++++- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt index 68554087..71f9148c 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt @@ -5,6 +5,8 @@ import com.depromeet.housekeeper.R import com.depromeet.housekeeper.base.BaseFragment import com.depromeet.housekeeper.databinding.FragmentStatisticsBinding import dagger.hilt.android.AndroidEntryPoint +import java.text.SimpleDateFormat +import java.util.* @AndroidEntryPoint class StatisticsFragment : BaseFragment(R.layout.fragment_statistics) { @@ -19,8 +21,10 @@ class StatisticsFragment : BaseFragment(R.layout.frag } fun initView() { + val dateFormat = SimpleDateFormat("MM") + val currentMonth: String = dateFormat.format(Date()) binding.tvMonthTitle.text = - String.format(getString(R.string.statistics_month_title, 1)) //todo 달 넣기 + String.format(getString(R.string.statistics_month_title, currentMonth)) binding.tvTitle.text = String.format(getString(R.string.statistics_title, "김민주")) //todo 이름 넣기 binding.tvTotalChores.text = String.format(getString(R.string.statistics_total_chores, 16)) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e9f9c0f3..e5264d75 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -91,7 +91,7 @@ 되돌리기 - %d월 통계 + %s월 통계 이번달 %s님이 \n가장 많은 집안일을 완료했어요! 이번달 집안일 현황을 확인해보세요 전체 집안일 수행 %d회 From 1bc1e2f705cf545fb31a31ac5ac1d582a237d173 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Wed, 12 Apr 2023 22:50:00 +0900 Subject: [PATCH 02/28] =?UTF-8?q?Feature/statistics:=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8A=94=20API?= =?UTF-8?q?=20=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../depromeet/housekeeper/data/ApiService.kt | 8 +++++++ .../model/response/StatisticsResponse.kt | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt diff --git a/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt b/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt index 3913f185..fdeffbb7 100644 --- a/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt +++ b/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt @@ -99,6 +99,14 @@ interface ApiService { @DELETE("/api/rules/{ruleId}") suspend fun deleteRule(@Path("ruleId") ruleId: Int): Response + /** + * statistics 집안일 통계 API + */ + @GET("/api/statistics") // yearMonth: yyyy-MM + suspend fun getStatisticsList(@Query("yearMonth") yearMonth: String): StatisticsListResponse + + @GET("/api/statistics/team-member") + suspend fun getHouseWorkStatistics(@Query("houseWorkName") houseWorkName: String, @Query("month") month: String): HouseWorkStatisticsResponse /** * teams diff --git a/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt b/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt new file mode 100644 index 00000000..a098d57d --- /dev/null +++ b/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt @@ -0,0 +1,24 @@ +package com.depromeet.housekeeper.model.response + +import com.squareup.moshi.Json + +data class StatisticsListResponse( + @Json(name = "statisticsResponse") val statisticsList: List +) +data class StatisticsStatus( + val houseWorkCount: Int, + val houseWorkName: String, +) + +data class HouseWorkStatisticsResponse( + @Json(name = "houseWorkStatics") val houseWorkStatisticsList: List +) +data class HouseWorkStatisticsStatus( + val houseWorkCount: Int, + val member: Member, +) +data class Member( + val memberId: Int, + val memberName: String, + val profilePath: String = "", +) \ No newline at end of file From da75439ee75d1c74ca63df535fa18065998805c5 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Thu, 13 Apr 2023 16:23:47 +0900 Subject: [PATCH 03/28] =?UTF-8?q?Feature/statistics:=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8A=94=20API?= =?UTF-8?q?=20=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/depromeet/housekeeper/data/ApiService.kt | 4 ++-- .../data/dataSource/RemoteDataSource.kt | 7 +++++++ .../data/dataSource/RemoteDataSourceImpl.kt | 15 +++++++++++++++ .../model/response/StatisticsResponse.kt | 12 ++++++------ 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt b/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt index fdeffbb7..1e97b7b9 100644 --- a/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt +++ b/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt @@ -103,10 +103,10 @@ interface ApiService { * statistics 집안일 통계 API */ @GET("/api/statistics") // yearMonth: yyyy-MM - suspend fun getStatisticsList(@Query("yearMonth") yearMonth: String): StatisticsListResponse + suspend fun getStatisticsList(@Query("yearMonth") yearMonth: String): StatsListResponse @GET("/api/statistics/team-member") - suspend fun getHouseWorkStatistics(@Query("houseWorkName") houseWorkName: String, @Query("month") month: String): HouseWorkStatisticsResponse + suspend fun getHouseWorkStatistics(@Query("houseWorkName") houseWorkName: String, @Query("month") month: String): HouseWorkStatsResponse /** * teams diff --git a/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt b/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt index 8aa51698..113bcb1a 100644 --- a/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt +++ b/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt @@ -1,5 +1,6 @@ package com.depromeet.housekeeper.data.dataSource +import androidx.work.impl.model.WorkName import com.depromeet.housekeeper.model.request.* import com.depromeet.housekeeper.model.response.* import kotlinx.coroutines.flow.Flow @@ -62,6 +63,12 @@ interface RemoteDataSource { suspend fun getRules(): Flow> suspend fun deleteRule(ruleId: Int): Flow> + /** + * statistics 집안일 통계 API + */ + suspend fun getStatsList(yearMonth: String): Flow> + suspend fun getHouseWorkStats(houseWorkName: String, month: String): Flow> + /** * teams */ diff --git a/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSourceImpl.kt b/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSourceImpl.kt index 8dcaebc5..05a55b56 100644 --- a/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSourceImpl.kt +++ b/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSourceImpl.kt @@ -138,6 +138,21 @@ class RemoteDataSourceImpl @Inject constructor( }.flowOn(ioDispatcher) + /** + * statistics + */ + override suspend fun getStatsList(yearMonth: String): Flow> = safeFlow{ + apiService.getStatisticsList(yearMonth) + }.flowOn(ioDispatcher) + + override suspend fun getHouseWorkStats( + houseWorkName: String, + month: String + ): Flow> = safeFlow{ + apiService.getHouseWorkStatistics(houseWorkName, month) + }.flowOn(ioDispatcher) + + /** * teams */ diff --git a/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt b/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt index a098d57d..e0ed52a6 100644 --- a/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt +++ b/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt @@ -2,18 +2,18 @@ package com.depromeet.housekeeper.model.response import com.squareup.moshi.Json -data class StatisticsListResponse( - @Json(name = "statisticsResponse") val statisticsList: List +data class StatsListResponse( + @Json(name = "statisticsResponse") val statisticsList: List ) -data class StatisticsStatus( +data class StatsStatus( val houseWorkCount: Int, val houseWorkName: String, ) -data class HouseWorkStatisticsResponse( - @Json(name = "houseWorkStatics") val houseWorkStatisticsList: List +data class HouseWorkStatsResponse( + @Json(name = "houseWorkStatics") val houseWorkStatisticsList: List ) -data class HouseWorkStatisticsStatus( +data class HouseWorkStatsStatus( val houseWorkCount: Int, val member: Member, ) From 9464d056650d733b749eac3deabceb310e5b4f8f Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Thu, 13 Apr 2023 16:40:08 +0900 Subject: [PATCH 04/28] =?UTF-8?q?Feature/statistics:=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=20=ED=99=94=EB=A9=B4=EC=97=90=EC=84=9C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=A0=20repository=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/dataSource/RemoteDataSource.kt | 2 +- .../data/repository/StatisticsRepository.kt | 18 ++++++++++++++++++ .../housekeeper/di/RepositoryModule.kt | 7 +++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/depromeet/housekeeper/data/repository/StatisticsRepository.kt diff --git a/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt b/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt index 113bcb1a..f53b70f8 100644 --- a/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt +++ b/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt @@ -64,7 +64,7 @@ interface RemoteDataSource { suspend fun deleteRule(ruleId: Int): Flow> /** - * statistics 집안일 통계 API + * statistics */ suspend fun getStatsList(yearMonth: String): Flow> suspend fun getHouseWorkStats(houseWorkName: String, month: String): Flow> diff --git a/app/src/main/java/com/depromeet/housekeeper/data/repository/StatisticsRepository.kt b/app/src/main/java/com/depromeet/housekeeper/data/repository/StatisticsRepository.kt new file mode 100644 index 00000000..de0be052 --- /dev/null +++ b/app/src/main/java/com/depromeet/housekeeper/data/repository/StatisticsRepository.kt @@ -0,0 +1,18 @@ +package com.depromeet.housekeeper.data.repository + +import com.depromeet.housekeeper.data.dataSource.RemoteDataSourceImpl +import com.depromeet.housekeeper.model.response.ApiResult +import com.depromeet.housekeeper.model.response.StatsListResponse +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow + +class StatisticsRepository constructor( + private val remoteDataSource: RemoteDataSourceImpl, + private val externalScope: CoroutineScope? = null +) { + suspend fun getStatistics(yearMonth: String): Flow> = + remoteDataSource.getStatsList(yearMonth) + + suspend fun getHoseWorkStatistics(houseWorkName: String, month: String) = + remoteDataSource.getHouseWorkStats(houseWorkName, month) +} \ No newline at end of file diff --git a/app/src/main/java/com/depromeet/housekeeper/di/RepositoryModule.kt b/app/src/main/java/com/depromeet/housekeeper/di/RepositoryModule.kt index 179e0627..d455150f 100644 --- a/app/src/main/java/com/depromeet/housekeeper/di/RepositoryModule.kt +++ b/app/src/main/java/com/depromeet/housekeeper/di/RepositoryModule.kt @@ -2,6 +2,7 @@ package com.depromeet.housekeeper.di import com.depromeet.housekeeper.data.dataSource.RemoteDataSourceImpl import com.depromeet.housekeeper.data.repository.MainRepository +import com.depromeet.housekeeper.data.repository.StatisticsRepository import com.depromeet.housekeeper.data.repository.UserRepository import dagger.Module import dagger.Provides @@ -25,4 +26,10 @@ class RepositoryModule { return MainRepository(remoteDataSourceImpl) } + @Provides + @ViewModelScoped + fun provideStatisticsRepository(remoteDataSourceImpl: RemoteDataSourceImpl): StatisticsRepository { + return StatisticsRepository(remoteDataSourceImpl) + } + } \ No newline at end of file From d4a289874d5fc935edbf8a03e7aa3aab01fe47b7 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Thu, 13 Apr 2023 17:14:40 +0900 Subject: [PATCH 05/28] =?UTF-8?q?Feature/statistics:=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=20=ED=99=94=EB=A9=B4=EC=9D=84=20=EC=9C=84=ED=95=9C=20api=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0=20=ED=95=A8=EC=88=98=20viewModel=EC=97=90=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/StatisticsFragment.kt | 23 +++++++++- .../ui/statistics/StatisticsViewModel.kt | 43 ++++++++++++++++++- 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt index 71f9148c..882bedaa 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt @@ -1,10 +1,13 @@ package com.depromeet.housekeeper.ui.statistics import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope import com.depromeet.housekeeper.R import com.depromeet.housekeeper.base.BaseFragment import com.depromeet.housekeeper.databinding.FragmentStatisticsBinding import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.collectLatest import java.text.SimpleDateFormat import java.util.* @@ -18,15 +21,31 @@ class StatisticsFragment : BaseFragment(R.layout.frag override fun viewCreated() { initView() + bindingVm() } fun initView() { - val dateFormat = SimpleDateFormat("MM") - val currentMonth: String = dateFormat.format(Date()) + val yearMonthFormat = SimpleDateFormat("yyyy-MM") + viewModel.getStatistics(yearMonthFormat.format(Date())) + + val monthFormat = SimpleDateFormat("MM") + val currentMonth: String = monthFormat.format(Date()) binding.tvMonthTitle.text = String.format(getString(R.string.statistics_month_title, currentMonth)) binding.tvTitle.text = String.format(getString(R.string.statistics_title, "김민주")) //todo 이름 넣기 binding.tvTotalChores.text = String.format(getString(R.string.statistics_total_chores, 16)) } + + fun bindingVm(){ + lifecycleScope.launchWhenStarted { + viewModel.statsList.collect{ + // todo adapter list로 넣기 + } + } + + lifecycleScope.launchWhenStarted { + viewModel.statsHouseWork.collectLatest { } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt index 90b1830c..2d47f744 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt @@ -1,9 +1,50 @@ package com.depromeet.housekeeper.ui.statistics +import androidx.lifecycle.viewModelScope import com.depromeet.housekeeper.base.BaseViewModel +import com.depromeet.housekeeper.data.repository.StatisticsRepository +import com.depromeet.housekeeper.model.response.HouseWorkStatsStatus +import com.depromeet.housekeeper.model.response.StatsStatus import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class StatisticsViewModel @Inject constructor() : BaseViewModel() { +class StatisticsViewModel @Inject constructor( + private val statsRepository: StatisticsRepository +) : BaseViewModel() { + + private val _statsList: MutableStateFlow> = MutableStateFlow(listOf()) + val statsList: StateFlow> get() = _statsList + + private val _statsHouseWork: MutableStateFlow> = + MutableStateFlow(mutableMapOf()) + val statsHouseWork: StateFlow> get() = _statsHouseWork + + /** + * Network Communication + */ + fun getStatistics(yearMonth: String) { + viewModelScope.launch { + statsRepository.getStatistics(yearMonth).collectLatest { + val result = receiveApiResult(it) ?: return@collectLatest + + _statsList.value = result.statisticsList + } + } + } + + fun getHouseWorkStatistics(houseWorkName: String, yearMonth: String) { + viewModelScope.launch { + statsRepository.getHoseWorkStatistics(houseWorkName, yearMonth).collectLatest { + val result = receiveApiResult(it) ?: return@collectLatest + + //todo 데이터 받아와 처리 + _statsHouseWork.value[houseWorkName] = result.houseWorkStatisticsList[0] + } + } + } } \ No newline at end of file From 62e553cb7da6d5c5d9c3d6c9e38fba107aade9f0 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Thu, 13 Apr 2023 17:41:59 +0900 Subject: [PATCH 06/28] =?UTF-8?q?Feature/statistics:=20=EC=A7=91=EC=95=88?= =?UTF-8?q?=EC=9D=BC=20=ED=98=84=ED=99=A9=20expand=20=ED=96=88=EC=9D=84=20?= =?UTF-8?q?=EB=95=8C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=96=B4=EB=96=BB?= =?UTF-8?q?=EA=B2=8C=20=EB=B0=9B=EC=95=84=EC=98=AC=20=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../housekeeper/model/response/StatisticsResponse.kt | 4 ++-- .../housekeeper/ui/statistics/StatisticsViewModel.kt | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt b/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt index e0ed52a6..d7cde0d3 100644 --- a/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt +++ b/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt @@ -11,9 +11,9 @@ data class StatsStatus( ) data class HouseWorkStatsResponse( - @Json(name = "houseWorkStatics") val houseWorkStatisticsList: List + @Json(name = "houseWorkStatics") val houseWorkStatisticsList: List ) -data class HouseWorkStatsStatus( +data class HouseWorkStatsMember( val houseWorkCount: Int, val member: Member, ) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt index 2d47f744..cc4deac2 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt @@ -3,7 +3,7 @@ package com.depromeet.housekeeper.ui.statistics import androidx.lifecycle.viewModelScope import com.depromeet.housekeeper.base.BaseViewModel import com.depromeet.housekeeper.data.repository.StatisticsRepository -import com.depromeet.housekeeper.model.response.HouseWorkStatsStatus +import com.depromeet.housekeeper.model.response.HouseWorkStatsMember import com.depromeet.housekeeper.model.response.StatsStatus import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -20,9 +20,9 @@ class StatisticsViewModel @Inject constructor( private val _statsList: MutableStateFlow> = MutableStateFlow(listOf()) val statsList: StateFlow> get() = _statsList - private val _statsHouseWork: MutableStateFlow> = + private val _statsHouseWork: MutableStateFlow>> = MutableStateFlow(mutableMapOf()) - val statsHouseWork: StateFlow> get() = _statsHouseWork + val statsHouseWork: StateFlow>> get() = _statsHouseWork /** * Network Communication @@ -42,8 +42,7 @@ class StatisticsViewModel @Inject constructor( statsRepository.getHoseWorkStatistics(houseWorkName, yearMonth).collectLatest { val result = receiveApiResult(it) ?: return@collectLatest - //todo 데이터 받아와 처리 - _statsHouseWork.value[houseWorkName] = result.houseWorkStatisticsList[0] + _statsHouseWork.value[houseWorkName] = result.houseWorkStatisticsList.sortedByDescending { it.houseWorkCount } } } } From 9bcdc326b5589f089a2326b3385135ab707f4abc Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Sat, 15 Apr 2023 03:16:58 +0900 Subject: [PATCH 07/28] =?UTF-8?q?Feature/statistics:=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EB=9E=AD=ED=82=B9=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?api=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/depromeet/housekeeper/data/ApiService.kt | 3 +++ .../data/dataSource/RemoteDataSource.kt | 1 + .../data/dataSource/RemoteDataSourceImpl.kt | 14 ++++++++++---- .../data/repository/StatisticsRepository.kt | 9 ++++++++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt b/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt index 1e97b7b9..b440221e 100644 --- a/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt +++ b/app/src/main/java/com/depromeet/housekeeper/data/ApiService.kt @@ -105,6 +105,9 @@ interface ApiService { @GET("/api/statistics") // yearMonth: yyyy-MM suspend fun getStatisticsList(@Query("yearMonth") yearMonth: String): StatsListResponse + @GET("/api/statistics/ranking") + suspend fun getStatisticsLanking(@Query("month") yearMonth: String): HouseWorkStatsResponse + @GET("/api/statistics/team-member") suspend fun getHouseWorkStatistics(@Query("houseWorkName") houseWorkName: String, @Query("month") month: String): HouseWorkStatsResponse diff --git a/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt b/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt index f53b70f8..ffd07642 100644 --- a/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt +++ b/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSource.kt @@ -67,6 +67,7 @@ interface RemoteDataSource { * statistics */ suspend fun getStatsList(yearMonth: String): Flow> + suspend fun getStatsRanking(yearMonth: String): Flow> suspend fun getHouseWorkStats(houseWorkName: String, month: String): Flow> /** diff --git a/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSourceImpl.kt b/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSourceImpl.kt index 05a55b56..71f9736b 100644 --- a/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSourceImpl.kt +++ b/app/src/main/java/com/depromeet/housekeeper/data/dataSource/RemoteDataSourceImpl.kt @@ -141,14 +141,20 @@ class RemoteDataSourceImpl @Inject constructor( /** * statistics */ - override suspend fun getStatsList(yearMonth: String): Flow> = safeFlow{ - apiService.getStatisticsList(yearMonth) - }.flowOn(ioDispatcher) + override suspend fun getStatsList(yearMonth: String): Flow> = + safeFlow { + apiService.getStatisticsList(yearMonth) + }.flowOn(ioDispatcher) + + override suspend fun getStatsRanking(yearMonth: String): Flow> = + safeFlow { + apiService.getStatisticsLanking(yearMonth) + }.flowOn(ioDispatcher) override suspend fun getHouseWorkStats( houseWorkName: String, month: String - ): Flow> = safeFlow{ + ): Flow> = safeFlow { apiService.getHouseWorkStatistics(houseWorkName, month) }.flowOn(ioDispatcher) diff --git a/app/src/main/java/com/depromeet/housekeeper/data/repository/StatisticsRepository.kt b/app/src/main/java/com/depromeet/housekeeper/data/repository/StatisticsRepository.kt index de0be052..e6de0613 100644 --- a/app/src/main/java/com/depromeet/housekeeper/data/repository/StatisticsRepository.kt +++ b/app/src/main/java/com/depromeet/housekeeper/data/repository/StatisticsRepository.kt @@ -2,6 +2,7 @@ package com.depromeet.housekeeper.data.repository import com.depromeet.housekeeper.data.dataSource.RemoteDataSourceImpl import com.depromeet.housekeeper.model.response.ApiResult +import com.depromeet.housekeeper.model.response.HouseWorkStatsResponse import com.depromeet.housekeeper.model.response.StatsListResponse import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -13,6 +14,12 @@ class StatisticsRepository constructor( suspend fun getStatistics(yearMonth: String): Flow> = remoteDataSource.getStatsList(yearMonth) - suspend fun getHoseWorkStatistics(houseWorkName: String, month: String) = + suspend fun getStatisticsRanking(yearMonth: String): Flow> = + remoteDataSource.getStatsRanking(yearMonth) + + suspend fun getHoseWorkStatistics( + houseWorkName: String, + month: String + ): Flow> = remoteDataSource.getHouseWorkStats(houseWorkName, month) } \ No newline at end of file From 2f541872671d44840b7a2da102eed0766ca67c96 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Sat, 15 Apr 2023 03:17:19 +0900 Subject: [PATCH 08/28] =?UTF-8?q?Feature/statistics:=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EB=9E=AD=ED=82=B9=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=B0=9B=EC=95=84=20view?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EA=B0=90=EC=A7=80=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/StatisticsFragment.kt | 6 ++++++ .../ui/statistics/StatisticsViewModel.kt | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt index 882bedaa..a2180ca7 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt @@ -44,6 +44,12 @@ class StatisticsFragment : BaseFragment(R.layout.frag } } + lifecycleScope.launchWhenStarted { + viewModel.rank.collectLatest { + //todo rank adapter list에 넣기 + } + } + lifecycleScope.launchWhenStarted { viewModel.statsHouseWork.collectLatest { } } diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt index cc4deac2..00f3959d 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.viewModelScope import com.depromeet.housekeeper.base.BaseViewModel import com.depromeet.housekeeper.data.repository.StatisticsRepository import com.depromeet.housekeeper.model.response.HouseWorkStatsMember +import com.depromeet.housekeeper.model.response.HouseWorkStatsResponse import com.depromeet.housekeeper.model.response.StatsStatus import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -20,6 +21,9 @@ class StatisticsViewModel @Inject constructor( private val _statsList: MutableStateFlow> = MutableStateFlow(listOf()) val statsList: StateFlow> get() = _statsList + private val _rank: MutableStateFlow> = MutableStateFlow(listOf()) + val rank: StateFlow> get() = _rank + private val _statsHouseWork: MutableStateFlow>> = MutableStateFlow(mutableMapOf()) val statsHouseWork: StateFlow>> get() = _statsHouseWork @@ -37,6 +41,16 @@ class StatisticsViewModel @Inject constructor( } } + fun getRanking(yearMonth: String) { + viewModelScope.launch { + statsRepository.getStatisticsRanking(yearMonth).collectLatest { + val result = receiveApiResult(it) ?: return@collectLatest + + _rank.value = result.houseWorkStatisticsList + } + } + } + fun getHouseWorkStatistics(houseWorkName: String, yearMonth: String) { viewModelScope.launch { statsRepository.getHoseWorkStatistics(houseWorkName, yearMonth).collectLatest { From 35b2ff3ca807425f5b30191c8252b8a7f5dddb46 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Sat, 15 Apr 2023 03:43:01 +0900 Subject: [PATCH 09/28] =?UTF-8?q?Feature/statistics:=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EB=9E=AD=ED=82=B9,=20=ED=98=84=ED=99=A9?= =?UTF-8?q?=20adapter=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/StatisticsFragment.kt | 19 +++++++-- .../statistics/adapter/MonthlyStatsAdapter.kt | 39 +++++++++++++++++++ .../ui/statistics/adapter/RankAdapter.kt | 12 ++++-- 3 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt index a2180ca7..14b5e7da 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt @@ -5,6 +5,8 @@ import androidx.lifecycle.lifecycleScope import com.depromeet.housekeeper.R import com.depromeet.housekeeper.base.BaseFragment import com.depromeet.housekeeper.databinding.FragmentStatisticsBinding +import com.depromeet.housekeeper.ui.statistics.adapter.MonthlyStatsAdapter +import com.depromeet.housekeeper.ui.statistics.adapter.RankAdapter import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collectLatest @@ -15,6 +17,8 @@ import java.util.* class StatisticsFragment : BaseFragment(R.layout.fragment_statistics) { private val viewModel: StatisticsViewModel by viewModels() + private lateinit var rankAdapter: RankAdapter + private lateinit var statsAdapter: MonthlyStatsAdapter override fun createView(binding: FragmentStatisticsBinding) { } @@ -26,7 +30,9 @@ class StatisticsFragment : BaseFragment(R.layout.frag fun initView() { val yearMonthFormat = SimpleDateFormat("yyyy-MM") - viewModel.getStatistics(yearMonthFormat.format(Date())) + val yearMonth = yearMonthFormat.format(Date()) + viewModel.getStatistics(yearMonth) + viewModel.getRanking(yearMonth) val monthFormat = SimpleDateFormat("MM") val currentMonth: String = monthFormat.format(Date()) @@ -35,18 +41,25 @@ class StatisticsFragment : BaseFragment(R.layout.frag binding.tvTitle.text = String.format(getString(R.string.statistics_title, "김민주")) //todo 이름 넣기 binding.tvTotalChores.text = String.format(getString(R.string.statistics_total_chores, 16)) + + setAdapter() + } + + fun setAdapter(){ + rankAdapter = RankAdapter() } fun bindingVm(){ + lifecycleScope.launchWhenStarted { viewModel.statsList.collect{ - // todo adapter list로 넣기 + statsAdapter.submitList(it) } } lifecycleScope.launchWhenStarted { viewModel.rank.collectLatest { - //todo rank adapter list에 넣기 + rankAdapter.submitList(it) } } diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt new file mode 100644 index 00000000..d1e82e1f --- /dev/null +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt @@ -0,0 +1,39 @@ +package com.depromeet.housekeeper.ui.statistics.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.depromeet.housekeeper.databinding.ItemStatisticsBinding +import com.depromeet.housekeeper.model.response.StatsStatus + +class MonthlyStatsAdapter : RecyclerView.Adapter() { + private var list: List = listOf() + + inner class ViewHolder(val binding: ItemStatisticsBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: StatsStatus) { + //todo + } + + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): MonthlyStatsAdapter.ViewHolder { + return ViewHolder(ItemStatisticsBinding.inflate(LayoutInflater.from(parent.context), parent, false)) + } + + override fun onBindViewHolder(holder: MonthlyStatsAdapter.ViewHolder, position: Int) { + return holder.bind(list[position]) + } + + override fun getItemCount(): Int { + return list.size + } + + fun submitList(statsList: List) { + this.list = statsList + } +} \ No newline at end of file diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt index 29be1f07..0f8ea07f 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt @@ -6,13 +6,13 @@ import android.view.ViewGroup import androidx.databinding.BindingAdapter import androidx.recyclerview.widget.RecyclerView import com.depromeet.housekeeper.databinding.ItemRankBinding +import com.depromeet.housekeeper.model.response.HouseWorkStatsMember -class RankAdapter( - private val list: Array //todo list 입력 뭐 받을지 -): RecyclerView.Adapter() { +class RankAdapter(): RecyclerView.Adapter() { + private var list: List = listOf()//todo list 입력 뭐 받을지 inner class ViewHolder(private val binding: ItemRankBinding): RecyclerView.ViewHolder(binding.root){ - fun bind(rank: Int){ + fun bind(rank: HouseWorkStatsMember){ } @@ -34,4 +34,8 @@ class RankAdapter( return list.size } + fun submitList(rankList: List){ + this.list = rankList + } + } \ No newline at end of file From 37e763983b2a723315248d1fef131b9d32e4552c Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Sat, 15 Apr 2023 04:03:43 +0900 Subject: [PATCH 10/28] =?UTF-8?q?Feature/statistics:=20=EA=B0=80=EC=82=AC?= =?UTF-8?q?=20=ED=98=84=ED=99=A9=20item=20response=20=ED=95=A9=EC=B9=A8=20?= =?UTF-8?q?=EC=9D=B4=EC=9C=A0:=20drop=20=ED=95=A0=20=EB=95=8C=20=ED=95=9C?= =?UTF-8?q?=EB=B2=88=EC=97=90=20=EB=8B=A4=20=EA=B0=80=EC=A0=B8=EC=98=A4?= =?UTF-8?q?=EB=8A=94=20=EC=8B=9C=EA=B0=84=EB=B3=B5=EC=9E=A1=EB=8F=84=20 +) \ No newline at end of file diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt index 00f3959d..f18d9c25 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt @@ -6,6 +6,7 @@ import com.depromeet.housekeeper.data.repository.StatisticsRepository import com.depromeet.housekeeper.model.response.HouseWorkStatsMember import com.depromeet.housekeeper.model.response.HouseWorkStatsResponse import com.depromeet.housekeeper.model.response.StatsStatus +import com.depromeet.housekeeper.model.ui.Stats import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -18,8 +19,8 @@ class StatisticsViewModel @Inject constructor( private val statsRepository: StatisticsRepository ) : BaseViewModel() { - private val _statsList: MutableStateFlow> = MutableStateFlow(listOf()) - val statsList: StateFlow> get() = _statsList + private val _statsList: MutableStateFlow> = MutableStateFlow(mutableListOf()) + val statsList: StateFlow> get() = _statsList private val _rank: MutableStateFlow> = MutableStateFlow(listOf()) val rank: StateFlow> get() = _rank @@ -36,7 +37,17 @@ class StatisticsViewModel @Inject constructor( statsRepository.getStatistics(yearMonth).collectLatest { val result = receiveApiResult(it) ?: return@collectLatest - _statsList.value = result.statisticsList + result.statisticsList.forEach { status -> + statsRepository.getHoseWorkStatistics(status.houseWorkName, yearMonth).collectLatest { + val result = receiveApiResult(it) ?: return@collectLatest + + val stats = Stats( + houseWorkName = status.houseWorkName, + totalCount = status.houseWorkCount, + members = result.houseWorkStatisticsList,) + _statsList.value.add(stats) + } + } } } } @@ -51,13 +62,4 @@ class StatisticsViewModel @Inject constructor( } } - fun getHouseWorkStatistics(houseWorkName: String, yearMonth: String) { - viewModelScope.launch { - statsRepository.getHoseWorkStatistics(houseWorkName, yearMonth).collectLatest { - val result = receiveApiResult(it) ?: return@collectLatest - - _statsHouseWork.value[houseWorkName] = result.houseWorkStatisticsList.sortedByDescending { it.houseWorkCount } - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt index d1e82e1f..38c6b741 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt @@ -4,15 +4,16 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.depromeet.housekeeper.databinding.ItemStatisticsBinding -import com.depromeet.housekeeper.model.response.StatsStatus +import com.depromeet.housekeeper.model.ui.Stats + class MonthlyStatsAdapter : RecyclerView.Adapter() { - private var list: List = listOf() + private var list: List = listOf() inner class ViewHolder(val binding: ItemStatisticsBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(item: StatsStatus) { + fun bind(item: Stats) { //todo } @@ -33,7 +34,7 @@ class MonthlyStatsAdapter : RecyclerView.Adapter return list.size } - fun submitList(statsList: List) { + fun submitList(statsList: List) { this.list = statsList } } \ No newline at end of file From 36e4c2ff6defd57bdae8e17ad279352bbfae74bc Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Sat, 15 Apr 2023 04:15:05 +0900 Subject: [PATCH 11/28] =?UTF-8?q?Feature/statistics:=20StatsMemberAdapter?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../statistics/adapter/StatsMemberAdapter.kt | 36 +++++++++++++++++++ .../res/layout/item_member_statistics.xml | 18 +++++++--- 2 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsMemberAdapter.kt diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsMemberAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsMemberAdapter.kt new file mode 100644 index 00000000..039a7010 --- /dev/null +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsMemberAdapter.kt @@ -0,0 +1,36 @@ +package com.depromeet.housekeeper.ui.statistics.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.depromeet.housekeeper.databinding.ItemMemberStatisticsBinding +import com.depromeet.housekeeper.model.response.HouseWorkStatsMember + +class StatsMemberAdapter(val list: List) : + RecyclerView.Adapter() +{ + inner class ViewHolder(val binding: ItemMemberStatisticsBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(item: HouseWorkStatsMember) { + binding.apply { + imgUrl = item.member.profilePath + name = item.member.memberName + cnt = item.houseWorkCount + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(ItemMemberStatisticsBinding.inflate(LayoutInflater.from(parent.context), parent, false)) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + return holder.bind(list[position]) + } + + override fun getItemCount(): Int { + return list.size + } + + +} \ No newline at end of file diff --git a/app/src/main/res/layout/item_member_statistics.xml b/app/src/main/res/layout/item_member_statistics.xml index 606d0dd2..38670944 100644 --- a/app/src/main/res/layout/item_member_statistics.xml +++ b/app/src/main/res/layout/item_member_statistics.xml @@ -3,7 +3,15 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> - + + + + android:background="@drawable/bg_solid_5" + android:minWidth="88dp"> Date: Sat, 15 Apr 2023 04:29:05 +0900 Subject: [PATCH 12/28] =?UTF-8?q?Feature/statistics:=20MonthlyStatsAdapter?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/adapter/MonthlyStatsAdapter.kt | 8 +++++++- app/src/main/res/layout/item_statistics.xml | 8 ++++++-- app/src/main/res/values/strings.xml | 3 +++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt index 38c6b741..860fe4de 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt @@ -3,6 +3,7 @@ package com.depromeet.housekeeper.ui.statistics.adapter import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.depromeet.housekeeper.R import com.depromeet.housekeeper.databinding.ItemStatisticsBinding import com.depromeet.housekeeper.model.ui.Stats @@ -14,7 +15,12 @@ class MonthlyStatsAdapter : RecyclerView.Adapter RecyclerView.ViewHolder(binding.root) { fun bind(item: Stats) { - //todo + binding.apply { + houseWorkName = item.houseWorkName + val totalCnt = binding.root.context.getString(R.string.statistics_total_complete, item.totalCount) + tvTotalChores.text = String.format(totalCnt) + rvMemberList.adapter = StatsMemberAdapter(item.members) + } } } diff --git a/app/src/main/res/layout/item_statistics.xml b/app/src/main/res/layout/item_statistics.xml index 2bdc5b8a..2be30807 100644 --- a/app/src/main/res/layout/item_statistics.xml +++ b/app/src/main/res/layout/item_statistics.xml @@ -2,6 +2,9 @@ + @@ -18,7 +21,7 @@ android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="바닥 청소" + android:text="@{houseWorkName}" android:textColor="@color/gray_800" android:textFontWeight="600" android:textSize="16sp" @@ -38,7 +41,7 @@ android:id="@+id/tv_total_chores" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="총 12회 완료" + android:text="@string/statistics_total_complete" android:textColor="@color/gray_800" android:textSize="12sp" app:layout_constraintBottom_toBottomOf="parent" @@ -56,6 +59,7 @@ 이번달 집안일 현황을 확인해보세요 전체 집안일 수행 %d회 + + 총 %d회 완료 + From 337b8c8993849ec065ba58b603e87ccfbc7bd0d2 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Sat, 15 Apr 2023 04:40:24 +0900 Subject: [PATCH 13/28] =?UTF-8?q?Feature/statistics:=20statisticsFragment?= =?UTF-8?q?=EC=97=90=20adapter=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/StatisticsFragment.kt | 17 ++++++++--------- .../ui/statistics/StatisticsViewModel.kt | 4 ---- app/src/main/res/layout/fragment_statistics.xml | 1 + 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt index 14b5e7da..fd5b0fb8 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt @@ -24,10 +24,16 @@ class StatisticsFragment : BaseFragment(R.layout.frag } override fun viewCreated() { + setAdapter() initView() bindingVm() } + fun setAdapter(){ + rankAdapter = RankAdapter() + statsAdapter = MonthlyStatsAdapter() + } + fun initView() { val yearMonthFormat = SimpleDateFormat("yyyy-MM") val yearMonth = yearMonthFormat.format(Date()) @@ -42,11 +48,8 @@ class StatisticsFragment : BaseFragment(R.layout.frag String.format(getString(R.string.statistics_title, "김민주")) //todo 이름 넣기 binding.tvTotalChores.text = String.format(getString(R.string.statistics_total_chores, 16)) - setAdapter() - } - - fun setAdapter(){ - rankAdapter = RankAdapter() + binding.rvRanking.adapter = rankAdapter + binding.rvMonthlyStats.adapter = statsAdapter } fun bindingVm(){ @@ -62,9 +65,5 @@ class StatisticsFragment : BaseFragment(R.layout.frag rankAdapter.submitList(it) } } - - lifecycleScope.launchWhenStarted { - viewModel.statsHouseWork.collectLatest { } - } } } \ No newline at end of file diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt index f18d9c25..59d6d2eb 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt @@ -25,10 +25,6 @@ class StatisticsViewModel @Inject constructor( private val _rank: MutableStateFlow> = MutableStateFlow(listOf()) val rank: StateFlow> get() = _rank - private val _statsHouseWork: MutableStateFlow>> = - MutableStateFlow(mutableMapOf()) - val statsHouseWork: StateFlow>> get() = _statsHouseWork - /** * Network Communication */ diff --git a/app/src/main/res/layout/fragment_statistics.xml b/app/src/main/res/layout/fragment_statistics.xml index 25624dc8..b3395f9f 100644 --- a/app/src/main/res/layout/fragment_statistics.xml +++ b/app/src/main/res/layout/fragment_statistics.xml @@ -127,6 +127,7 @@ app:layout_constraintTop_toBottomOf="@id/tv_check_info" /> Date: Wed, 19 Apr 2023 20:24:32 +0900 Subject: [PATCH 14/28] =?UTF-8?q?Feature/statistics:=20mainFragment=20ui?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20(=ED=86=B5=EA=B3=84=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=9D=B4=EB=8F=99=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/img_chart.xml | 18 +++++++++++++ app/src/main/res/layout/fragment_main.xml | 31 ++++++++++++++++++----- app/src/main/res/layout/layout_rules.xml | 11 ++++---- 3 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 app/src/main/res/drawable/img_chart.xml diff --git a/app/src/main/res/drawable/img_chart.xml b/app/src/main/res/drawable/img_chart.xml new file mode 100644 index 00000000..14c6d1f3 --- /dev/null +++ b/app/src/main/res/drawable/img_chart.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index a5dfa653..bd65e537 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -108,13 +108,13 @@ + android:layout_height="wrap_content" + android:paddingHorizontal="24dp"> + + + + + diff --git a/app/src/main/res/layout/layout_rules.xml b/app/src/main/res/layout/layout_rules.xml index 44ed07fa..1c884e98 100644 --- a/app/src/main/res/layout/layout_rules.xml +++ b/app/src/main/res/layout/layout_rules.xml @@ -15,6 +15,7 @@ android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="44dp" android:background="@drawable/home_positive_backgorund_8" android:gravity="center" android:orientation="vertical" @@ -22,19 +23,19 @@ android:paddingTop="8dp" android:paddingEnd="16dp" android:paddingBottom="8dp" - tools:context=".ui.MainFragment"> + tools:context=".ui.MainFragment" + android:backgroundTint="@color/normal"> + app:layout_constraintTop_toTopOf="parent" /> Date: Wed, 19 Apr 2023 20:58:22 +0900 Subject: [PATCH 15/28] =?UTF-8?q?Feature/statistics:=20text=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EC=83=89=EA=B9=94=20?= =?UTF-8?q?=EC=B9=A0=ED=95=98=EA=B8=B0=20=EC=84=B1=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/StatisticsFragment.kt | 6 +++-- .../main/res/layout/fragment_statistics.xml | 23 ++++++++++--------- app/src/main/res/values/strings.xml | 4 ++-- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt index fd5b0fb8..d97895aa 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt @@ -1,5 +1,7 @@ package com.depromeet.housekeeper.ui.statistics +import android.text.Html +import androidx.core.text.HtmlCompat import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import com.depromeet.housekeeper.R @@ -45,8 +47,8 @@ class StatisticsFragment : BaseFragment(R.layout.frag binding.tvMonthTitle.text = String.format(getString(R.string.statistics_month_title, currentMonth)) binding.tvTitle.text = - String.format(getString(R.string.statistics_title, "김민주")) //todo 이름 넣기 - binding.tvTotalChores.text = String.format(getString(R.string.statistics_total_chores, 16)) + HtmlCompat.fromHtml(getString(R.string.statistics_title, "김민주"), HtmlCompat.FROM_HTML_MODE_LEGACY) //todo 이름 넣기 + binding.tvTotalChores.text = HtmlCompat.fromHtml(getString(R.string.statistics_total_chores, 16), HtmlCompat.FROM_HTML_MODE_LEGACY) binding.rvRanking.adapter = rankAdapter binding.rvMonthlyStats.adapter = statsAdapter diff --git a/app/src/main/res/layout/fragment_statistics.xml b/app/src/main/res/layout/fragment_statistics.xml index b3395f9f..5380dee3 100644 --- a/app/src/main/res/layout/fragment_statistics.xml +++ b/app/src/main/res/layout/fragment_statistics.xml @@ -25,13 +25,12 @@ android:layout_marginVertical="13dp" android:text="@string/statistics_month_title" android:textColor="@color/black" - android:textFontWeight="600" - android:textSize="16sp" + style="@style/Title.T1" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - + android:textStyle="bold" /> @@ -95,21 +94,23 @@ + app:layout_constraintTop_toBottomOf="@id/rv_ranking" + android:layout_marginHorizontal="24dp"/> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1cd5d726..d7de1ac8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -92,9 +92,9 @@ %s월 통계 - 이번달 %s님이 \n가장 많은 집안일을 완료했어요! + 이번달 <font color="#0C6DFF">%s</font>님이 <br>가장 많은 집안일을 완료했어요! 이번달 집안일 현황을 확인해보세요 - 전체 집안일 수행 %d회 + 전체 집안일 수행 <font color="#0C6DFF">%d회 </font> 총 %d회 완료 From daa15df8de083e31d819ad27612a9163cc9a4d3b Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Fri, 21 Apr 2023 20:29:23 +0900 Subject: [PATCH 16/28] =?UTF-8?q?Feature/statistics:=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=20=EC=A7=91=EC=95=88=EC=9D=BC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=96=B4=EB=8C=91=ED=84=B0=20=EC=97=B0=EA=B2=B0=20&=20api=20?= =?UTF-8?q?=EB=B0=9B=EC=95=84=EC=99=80=20=EB=B3=B4=EC=97=AC=EC=A3=BC?= =?UTF-8?q?=EA=B8=B0=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/response/StatisticsResponse.kt | 2 +- .../ui/statistics/StatisticsFragment.kt | 37 +++++++++++++++---- .../ui/statistics/StatisticsViewModel.kt | 22 +++++++---- .../statistics/adapter/MonthlyStatsAdapter.kt | 17 +++++---- 4 files changed, 54 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt b/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt index 4f3185cd..ec06fb45 100644 --- a/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt +++ b/app/src/main/java/com/depromeet/housekeeper/model/response/StatisticsResponse.kt @@ -3,7 +3,7 @@ package com.depromeet.housekeeper.model.response import com.squareup.moshi.Json data class StatsListResponse( - @Json(name = "statisticsResponse") val statisticsList: List + @Json(name = "statisticResponseDtos") val statisticsList: List ) data class StatsStatus( val houseWorkCount: Int, diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt index d97895aa..6082cfbf 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt @@ -4,16 +4,20 @@ import android.text.Html import androidx.core.text.HtmlCompat import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager import com.depromeet.housekeeper.R import com.depromeet.housekeeper.base.BaseFragment import com.depromeet.housekeeper.databinding.FragmentStatisticsBinding import com.depromeet.housekeeper.ui.statistics.adapter.MonthlyStatsAdapter import com.depromeet.housekeeper.ui.statistics.adapter.RankAdapter +import com.depromeet.housekeeper.util.PrefsManager import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collectLatest +import timber.log.Timber import java.text.SimpleDateFormat import java.util.* +import kotlin.collections.ArrayList @AndroidEntryPoint class StatisticsFragment : BaseFragment(R.layout.fragment_statistics) { @@ -33,7 +37,12 @@ class StatisticsFragment : BaseFragment(R.layout.frag fun setAdapter(){ rankAdapter = RankAdapter() - statsAdapter = MonthlyStatsAdapter() + statsAdapter = MonthlyStatsAdapter(mutableListOf()) + + binding.rvRanking.adapter = rankAdapter + //binding.rvRanking.layoutManager = LinearLayoutManager(requireContext()) + binding.rvMonthlyStats.adapter = statsAdapter + binding.rvMonthlyStats.layoutManager = LinearLayoutManager(requireContext()) } fun initView() { @@ -47,25 +56,37 @@ class StatisticsFragment : BaseFragment(R.layout.frag binding.tvMonthTitle.text = String.format(getString(R.string.statistics_month_title, currentMonth)) binding.tvTitle.text = - HtmlCompat.fromHtml(getString(R.string.statistics_title, "김민주"), HtmlCompat.FROM_HTML_MODE_LEGACY) //todo 이름 넣기 - binding.tvTotalChores.text = HtmlCompat.fromHtml(getString(R.string.statistics_total_chores, 16), HtmlCompat.FROM_HTML_MODE_LEGACY) + HtmlCompat.fromHtml(getString(R.string.statistics_title, PrefsManager.userName), HtmlCompat.FROM_HTML_MODE_LEGACY) //todo 이름 넣기 + - binding.rvRanking.adapter = rankAdapter - binding.rvMonthlyStats.adapter = statsAdapter } fun bindingVm(){ lifecycleScope.launchWhenStarted { - viewModel.statsList.collect{ - statsAdapter.submitList(it) + viewModel.statsFlow.collect{ + Timber.d("statsList: ${it.size}, ${statsAdapter.itemCount}") + statsAdapter.submitList(ArrayList(it)) + statsAdapter.notifyDataSetChanged() } } lifecycleScope.launchWhenStarted { viewModel.rank.collectLatest { - rankAdapter.submitList(it) + rankAdapter.submitList(ArrayList(it)) + rankAdapter.notifyDataSetChanged() + } + } + + lifecycleScope.launchWhenStarted { + viewModel.totalChoreCnt.collectLatest { + setChoreCntTv(it) } } } + + private fun setChoreCntTv(cnt: Int){ + binding.tvTotalChores.text = HtmlCompat.fromHtml(getString(R.string.statistics_total_chores, cnt), HtmlCompat.FROM_HTML_MODE_LEGACY) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt index 59d6d2eb..0da4e603 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt @@ -8,10 +8,9 @@ import com.depromeet.housekeeper.model.response.HouseWorkStatsResponse import com.depromeet.housekeeper.model.response.StatsStatus import com.depromeet.housekeeper.model.ui.Stats import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -19,12 +18,18 @@ class StatisticsViewModel @Inject constructor( private val statsRepository: StatisticsRepository ) : BaseViewModel() { - private val _statsList: MutableStateFlow> = MutableStateFlow(mutableListOf()) - val statsList: StateFlow> get() = _statsList + private val _statsFlow: MutableSharedFlow> = MutableSharedFlow() + val statsFlow get() = _statsFlow + + private val _statsList: MutableList = mutableListOf() + val statsList: List get() = _statsList private val _rank: MutableStateFlow> = MutableStateFlow(listOf()) val rank: StateFlow> get() = _rank + private val _totalChoreCnt: MutableStateFlow = MutableStateFlow(0) + val totalChoreCnt: StateFlow get() = _totalChoreCnt + /** * Network Communication */ @@ -33,15 +38,18 @@ class StatisticsViewModel @Inject constructor( statsRepository.getStatistics(yearMonth).collectLatest { val result = receiveApiResult(it) ?: return@collectLatest + _totalChoreCnt.value = result.statisticsList.size + Timber.d("totalChoreCnt: ${_totalChoreCnt.value}") + result.statisticsList.forEach { status -> statsRepository.getHoseWorkStatistics(status.houseWorkName, yearMonth).collectLatest { val result = receiveApiResult(it) ?: return@collectLatest - val stats = Stats( houseWorkName = status.houseWorkName, totalCount = status.houseWorkCount, members = result.houseWorkStatisticsList,) - _statsList.value.add(stats) + _statsList.add(stats) + _statsFlow.emit(statsList) } } } diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt index 860fe4de..60defe75 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt @@ -6,15 +6,16 @@ import androidx.recyclerview.widget.RecyclerView import com.depromeet.housekeeper.R import com.depromeet.housekeeper.databinding.ItemStatisticsBinding import com.depromeet.housekeeper.model.ui.Stats +import timber.log.Timber -class MonthlyStatsAdapter : RecyclerView.Adapter() { - private var list: List = listOf() +class MonthlyStatsAdapter(private var list: MutableList ) : RecyclerView.Adapter() { - inner class ViewHolder(val binding: ItemStatisticsBinding) : + inner class ViewHolder(private val binding: ItemStatisticsBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(item: Stats) { + Timber.d("stats: ${item}") binding.apply { houseWorkName = item.houseWorkName val totalCnt = binding.root.context.getString(R.string.statistics_total_complete, item.totalCount) @@ -22,18 +23,17 @@ class MonthlyStatsAdapter : RecyclerView.Adapter rvMemberList.adapter = StatsMemberAdapter(item.members) } } - } override fun onCreateViewHolder( parent: ViewGroup, viewType: Int - ): MonthlyStatsAdapter.ViewHolder { + ): ViewHolder { return ViewHolder(ItemStatisticsBinding.inflate(LayoutInflater.from(parent.context), parent, false)) } - override fun onBindViewHolder(holder: MonthlyStatsAdapter.ViewHolder, position: Int) { - return holder.bind(list[position]) + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(list[position]) } override fun getItemCount(): Int { @@ -41,6 +41,7 @@ class MonthlyStatsAdapter : RecyclerView.Adapter } fun submitList(statsList: List) { - this.list = statsList + list = statsList.toMutableList() + notifyDataSetChanged() } } \ No newline at end of file From 8050ce291ab435f922444104907c8c3701697dc2 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Sat, 22 Apr 2023 18:28:04 +0900 Subject: [PATCH 17/28] =?UTF-8?q?Feature/statistics:=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=20=EC=A7=91=EC=95=88=EC=9D=BC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=ED=8B=80=20=EC=99=84=EC=84=B1=20(drop?= =?UTF-8?q?=EB=A7=8C=20=ED=95=98=EB=A9=B4=20=EB=90=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/adapter/MonthlyStatsAdapter.kt | 3 ++- app/src/main/res/drawable/ic_kakao.xml | 3 ++- app/src/main/res/layout/fragment_main.xml | 1 + app/src/main/res/layout/fragment_statistics.xml | 8 ++++++-- app/src/main/res/layout/item_statistics.xml | 16 ++++++++++------ app/src/main/res/values/strings.xml | 1 + 6 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt index 60defe75..de7fb4d0 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt @@ -17,7 +17,7 @@ class MonthlyStatsAdapter(private var list: MutableList ) : RecyclerView. fun bind(item: Stats) { Timber.d("stats: ${item}") binding.apply { - houseWorkName = item.houseWorkName + houseWorkName = item.houseWorkName.ifBlank { "기타" } val totalCnt = binding.root.context.getString(R.string.statistics_total_complete, item.totalCount) tvTotalChores.text = String.format(totalCnt) rvMemberList.adapter = StatsMemberAdapter(item.members) @@ -41,6 +41,7 @@ class MonthlyStatsAdapter(private var list: MutableList ) : RecyclerView. } fun submitList(statsList: List) { + list.clear() list = statsList.toMutableList() notifyDataSetChanged() } diff --git a/app/src/main/res/drawable/ic_kakao.xml b/app/src/main/res/drawable/ic_kakao.xml index 42b98c73..66126cab 100644 --- a/app/src/main/res/drawable/ic_kakao.xml +++ b/app/src/main/res/drawable/ic_kakao.xml @@ -8,5 +8,6 @@ android:pathData="M7.8516,8.3923H9.0103L8.4309,6.7961L7.8516,8.3923Z" /> + android:pathData="M10.559,0C5.0033,0 0.5,3.4427 0.5,7.6901C0.5,10.436 2.3832,12.848 5.2152,14.206C5.0614,14.7208 4.2247,17.5202 4.1919,17.7406C4.1919,17.7406 4.1715,17.9056 4.2818,17.9684C4.3187,17.9865 4.359,17.997 4.4002,17.9995C4.4415,18.0019 4.4828,17.9961 4.5217,17.9825C4.8389,17.9394 8.1971,15.6558 8.7774,15.2629C9.3677,15.3423 9.963,15.3815 10.559,15.3801C16.1147,15.3801 20.618,11.9374 20.618,7.6901C20.618,3.4427 16.1147,0 10.559,0ZM5.5808,6.4962C5.5682,7.5841 5.5904,8.7282 5.5721,9.7992C5.5663,10.1415 5.3631,10.2437 5.0885,10.3412C5.0574,10.3519 5.024,10.3541 4.9917,10.3478C4.6774,10.2878 4.4269,10.179 4.4191,9.8001C4.3969,8.7301 4.4259,7.5841 4.4104,6.4962C4.1445,6.4859 3.7653,6.5065 3.5187,6.4962C3.1763,6.4746 2.9383,6.2636 2.9529,5.9495C2.9674,5.6353 3.1405,5.4093 3.5245,5.4037C4.4317,5.3905 5.5556,5.3905 6.4629,5.4037C6.8498,5.4093 7.0219,5.6362 7.0335,5.9495C7.0451,6.2627 6.8111,6.4746 6.4696,6.4962C6.2259,6.5065 5.8477,6.4859 5.5808,6.4962ZM10.4555,10.2897C10.3395,10.3409 10.2135,10.3674 10.086,10.3675C9.8442,10.3675 9.6595,10.2737 9.6024,10.119L9.3123,9.3894H7.5461L7.256,10.119C7.1999,10.2718 7.0151,10.3675 6.7724,10.3675C6.6452,10.3675 6.5195,10.3409 6.4039,10.2897C6.2433,10.2184 6.0895,10.0214 6.2656,9.4906L7.6574,5.9476C7.7157,5.7915 7.8203,5.6556 7.9579,5.5569C8.0955,5.4581 8.2601,5.4009 8.4311,5.3924C8.602,5. + 4018 8.7663,5.4595 8.9038,5.5583C9.0413,5.6571 9.1459,5.7928 9.2049,5.9485L10.5919,9.4897C10.7689,10.0214 10.6151,10.2221 10.4555,10.2897ZM13.3881,10.2897H11.5262C11.382,10.2924 11.2426,10.2397 11.1383,10.1431C11.0341,10.0464 10.9736,9.9137 10.9701,9.7739V5.9551C10.9763,5.8068 11.0414,5.6665 11.1518,5.5637C11.2622,5.4609 11.4094,5.4034 11.5625,5.4034C11.7156,5.4034 11.8628,5.4609 11.9732,5.5637C12.0836,5.6665 12.1487,5.8068 12.1549,5.9551V9.2609H13.3881C13.4607,9.2566 13.5333,9.2668 13.6017,9.2908C13.67,9.3148 13.7326,9.3521 13.7855,9.4004C13.8384,9.4488 13.8806,9.5071 13.9094,9.5718C13.9383,9.6365 13.9531,9.7062 13.9531,9.7767C13.9531,9.8471 13.9383,9.9169 13.9094,9.9816C13.8806,10.0463 13.8384,10.1046 13.7855,10.1529C13.7326,10.2012 13.67,10.2385 13.6017,10.2625C13.5333,10.2865 13.4607,10.2967 13.3881,10.2925V10.2897ZM17.934,9.8658C17.9189,9.9768 17.87,10.0809 17.7935,10.1648C17.7171,10.2487 17.6166,10.3085 17.5048,10.3367C17.3931,10.3649 17.2752,10.3602 17.1662,10.323C17.0573,10.2859 16.9623,10.2181 16.8933,10.1284L15.5324,8.3812L15.3312,8.5763V9.8039C15.3312,9.9531 15.2701,10.0962 15.1613,10.2017C15.0524,10.3073 14.9048,10.3666 14.7509,10.3666C14.597,10.3666 14.4494,10.3073 14.3406,10.2017C14.2317,10.0962 14.1706,9.9531 14.1706,9.8039V5.9588C14.1706,5.8096 14.2317,5.6665 14.3406,5.561C14.4494,5.4554 14.597,5.3962 14.7509,5.3962C14.9048,5.3962 15.0524,5.4554 15.1613,5.561C15.2701,5.6665 15.3312,5.8096 15.3312,5.9588V7.1649L16.9503,5.595C16.9927,5.5543 17.043,5.5223 17.0983,5.5007C17.1536,5.4791 17.2128,5.4685 17.2724,5.4693C17.4173,5.473 17.5558,5.5285 17.6611,5.625C17.7664,5.7216 17.8312,5.8525 17.8431,5.9926C17.8483,6.0551 17.8397,6.118 17.8178,6.177C17.796,6.2361 17.7614,6.2899 17.7164,6.3349L16.3913,7.6169L17.8199,9.4522C17.9124,9.5712 17.9524,9.721 17.9311,9.8686L17.934,9.8658Z" /> diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index bd65e537..04361f84 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -146,6 +146,7 @@ android:background="@drawable/home_positive_backgorund_8" android:backgroundTint="@color/normal" android:clickable="true" + android:contentDescription="@string/label_statistics_btn" > + android:layout_marginTop="10dp" + app:layout_constraintTop_toBottomOf="@id/tv_total_chores" + android:clipToPadding="false" + app:layout_constraintBottom_toBottomOf="parent" + android:paddingBottom="60dp" + /> diff --git a/app/src/main/res/layout/item_statistics.xml b/app/src/main/res/layout/item_statistics.xml index 2be30807..64644fbb 100644 --- a/app/src/main/res/layout/item_statistics.xml +++ b/app/src/main/res/layout/item_statistics.xml @@ -2,6 +2,7 @@ + @@ -15,7 +16,8 @@ android:layout_height="wrap_content" android:background="@drawable/bg_border_8" android:padding="16dp" - android:elevation="2dp"> + android:elevation="4dp" + android:layout_marginVertical="8dp"> + app:layout_constraintTop_toTopOf="parent" + android:includeFontPadding="false"/> + android:orientation="horizontal" + android:visibility="@{isDropped ? View.VISIBLE: View.GONE, default = gone}"/> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d7de1ac8..66edeec0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -89,6 +89,7 @@ 오늘 완료 되돌리기 + 통계화면으로 이동 %s월 통계 From 4a5651694a64e756eddfa515d38ac598442f58db Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Sat, 22 Apr 2023 18:55:17 +0900 Subject: [PATCH 18/28] =?UTF-8?q?Feature/statistics:=20flow=EB=A1=9C=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C=20=ED=95=98=EB=82=98=EC=94=A9=20?= =?UTF-8?q?=EB=B0=9B=EC=95=84=EC=99=80=20adapter=20list=EC=97=90=20?= =?UTF-8?q?=EC=9E=90=EC=97=B0=EC=8A=A4=EB=9F=BD=EA=B2=8C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/StatisticsFragment.kt | 5 ++--- .../ui/statistics/StatisticsViewModel.kt | 8 ++------ .../ui/statistics/adapter/MonthlyStatsAdapter.kt | 14 ++++++++++---- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt index 6082cfbf..99be4c64 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt @@ -65,9 +65,8 @@ class StatisticsFragment : BaseFragment(R.layout.frag lifecycleScope.launchWhenStarted { viewModel.statsFlow.collect{ - Timber.d("statsList: ${it.size}, ${statsAdapter.itemCount}") - statsAdapter.submitList(ArrayList(it)) - statsAdapter.notifyDataSetChanged() + Timber.d("stats: ${it}, ${statsAdapter.itemCount}") + statsAdapter.submitItem(it) } } diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt index 0da4e603..482abaa4 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt @@ -18,12 +18,9 @@ class StatisticsViewModel @Inject constructor( private val statsRepository: StatisticsRepository ) : BaseViewModel() { - private val _statsFlow: MutableSharedFlow> = MutableSharedFlow() + private val _statsFlow: MutableSharedFlow = MutableSharedFlow() val statsFlow get() = _statsFlow - private val _statsList: MutableList = mutableListOf() - val statsList: List get() = _statsList - private val _rank: MutableStateFlow> = MutableStateFlow(listOf()) val rank: StateFlow> get() = _rank @@ -48,8 +45,7 @@ class StatisticsViewModel @Inject constructor( houseWorkName = status.houseWorkName, totalCount = status.houseWorkCount, members = result.houseWorkStatisticsList,) - _statsList.add(stats) - _statsFlow.emit(statsList) + _statsFlow.emit(stats) } } } diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt index de7fb4d0..6fabfccc 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt @@ -21,6 +21,13 @@ class MonthlyStatsAdapter(private var list: MutableList ) : RecyclerView. val totalCnt = binding.root.context.getString(R.string.statistics_total_complete, item.totalCount) tvTotalChores.text = String.format(totalCnt) rvMemberList.adapter = StatsMemberAdapter(item.members) + var isDroppedVar = false + isDropped = isDroppedVar + + btnDrop.setOnClickListener { + isDroppedVar = !isDroppedVar + isDropped = isDroppedVar + } } } } @@ -40,9 +47,8 @@ class MonthlyStatsAdapter(private var list: MutableList ) : RecyclerView. return list.size } - fun submitList(statsList: List) { - list.clear() - list = statsList.toMutableList() - notifyDataSetChanged() + fun submitItem(stats: Stats){ + list.add( stats) + notifyItemInserted(list.size-1) } } \ No newline at end of file From 2633c250591f4721b8fa971a4cced490bed029e0 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Sat, 22 Apr 2023 18:56:31 +0900 Subject: [PATCH 19/28] =?UTF-8?q?Feature/statistics:=20stats=20=EC=A7=91?= =?UTF-8?q?=EC=95=88=EC=9D=BC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=96=B4?= =?UTF-8?q?=EB=8C=91=ED=84=B0=20=EC=9D=B4=EB=A6=84=20StatusAdapter?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../housekeeper/ui/statistics/StatisticsFragment.kt | 8 +++----- .../adapter/{MonthlyStatsAdapter.kt => StatsAdapter.kt} | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) rename app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/{MonthlyStatsAdapter.kt => StatsAdapter.kt} (93%) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt index 99be4c64..6f21fca4 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt @@ -1,6 +1,5 @@ package com.depromeet.housekeeper.ui.statistics -import android.text.Html import androidx.core.text.HtmlCompat import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope @@ -8,11 +7,10 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.depromeet.housekeeper.R import com.depromeet.housekeeper.base.BaseFragment import com.depromeet.housekeeper.databinding.FragmentStatisticsBinding -import com.depromeet.housekeeper.ui.statistics.adapter.MonthlyStatsAdapter +import com.depromeet.housekeeper.ui.statistics.adapter.StatsAdapter import com.depromeet.housekeeper.ui.statistics.adapter.RankAdapter import com.depromeet.housekeeper.util.PrefsManager import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collectLatest import timber.log.Timber import java.text.SimpleDateFormat @@ -24,7 +22,7 @@ class StatisticsFragment : BaseFragment(R.layout.frag private val viewModel: StatisticsViewModel by viewModels() private lateinit var rankAdapter: RankAdapter - private lateinit var statsAdapter: MonthlyStatsAdapter + private lateinit var statsAdapter: StatsAdapter override fun createView(binding: FragmentStatisticsBinding) { } @@ -37,7 +35,7 @@ class StatisticsFragment : BaseFragment(R.layout.frag fun setAdapter(){ rankAdapter = RankAdapter() - statsAdapter = MonthlyStatsAdapter(mutableListOf()) + statsAdapter = StatsAdapter(mutableListOf()) binding.rvRanking.adapter = rankAdapter //binding.rvRanking.layoutManager = LinearLayoutManager(requireContext()) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt similarity index 93% rename from app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt rename to app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt index 6fabfccc..6de1edb6 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/MonthlyStatsAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt @@ -9,7 +9,7 @@ import com.depromeet.housekeeper.model.ui.Stats import timber.log.Timber -class MonthlyStatsAdapter(private var list: MutableList ) : RecyclerView.Adapter() { +class StatsAdapter(private var list: MutableList ) : RecyclerView.Adapter() { inner class ViewHolder(private val binding: ItemStatisticsBinding) : RecyclerView.ViewHolder(binding.root) { From 68d9bf8403f0ade02efcbdc04553fe762e61109e Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Sat, 22 Apr 2023 19:37:50 +0900 Subject: [PATCH 20/28] =?UTF-8?q?Feature/statistics:=20stats=20=EC=A7=91?= =?UTF-8?q?=EC=95=88=EC=9D=BC=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../statistics/adapter/StatsMemberAdapter.kt | 16 +++++++++++++- .../res/layout/item_member_statistics.xml | 17 +++++++------- app/src/main/res/layout/item_statistics.xml | 22 ++++++++++++------- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsMemberAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsMemberAdapter.kt index 039a7010..b43a423d 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsMemberAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsMemberAdapter.kt @@ -1,8 +1,13 @@ package com.depromeet.housekeeper.ui.statistics.adapter + +import android.graphics.Typeface import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.depromeet.housekeeper.R import com.depromeet.housekeeper.databinding.ItemMemberStatisticsBinding import com.depromeet.housekeeper.model.response.HouseWorkStatsMember @@ -13,9 +18,18 @@ class StatsMemberAdapter(val list: List) : RecyclerView.ViewHolder(binding.root) { fun bind(item: HouseWorkStatsMember) { binding.apply { - imgUrl = item.member.profilePath + Glide.with(binding.root.context) + .load(item.member.profilePath) + .error(R.drawable.ic_profile1) + .circleCrop() + .into(ivMember) name = item.member.memberName cnt = item.houseWorkCount + + if (list[0] == item){ // 백엔드에서 sort해서 제공해줌 + tvCnt.setTextColor(ContextCompat.getColor(binding.root.context, R.color.highlight)) + tvCnt.setTypeface(tvCnt.typeface, Typeface.BOLD) + } } } } diff --git a/app/src/main/res/layout/item_member_statistics.xml b/app/src/main/res/layout/item_member_statistics.xml index 38670944..70b44629 100644 --- a/app/src/main/res/layout/item_member_statistics.xml +++ b/app/src/main/res/layout/item_member_statistics.xml @@ -3,9 +3,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> - @@ -19,9 +16,11 @@ android:layout_height="wrap_content" android:paddingVertical="6dp" android:paddingStart="3dp" - android:paddingEnd="9dp" + android:paddingEnd="8dp" android:background="@drawable/bg_solid_5" - android:minWidth="88dp"> + android:minWidth="88dp" + android:layout_marginEnd="8dp" + android:layout_marginBottom="16dp"> + android:includeFontPadding="false" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_statistics.xml b/app/src/main/res/layout/item_statistics.xml index 64644fbb..dbfd2b8c 100644 --- a/app/src/main/res/layout/item_statistics.xml +++ b/app/src/main/res/layout/item_statistics.xml @@ -15,7 +15,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_border_8" - android:padding="16dp" + android:paddingTop="16dp" android:elevation="4dp" android:layout_marginVertical="8dp"> @@ -29,7 +29,8 @@ android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - android:includeFontPadding="false"/> + android:includeFontPadding="false" + android:layout_marginStart="16dp"/> @@ -71,7 +76,8 @@ android:layout_marginTop="12dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" android:orientation="horizontal" - android:visibility="@{isDropped ? View.VISIBLE: View.GONE, default = gone}"/> + android:visibility="@{isDropped ? View.VISIBLE: View.GONE, default = gone}" + android:paddingHorizontal="16dp"/> \ No newline at end of file From 29fe9a8f1daf0efda3248469238d002128d645e8 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Fri, 28 Apr 2023 04:47:08 +0900 Subject: [PATCH 21/28] =?UTF-8?q?Feature/statistics:=20=EB=9E=AD=ED=82=B9?= =?UTF-8?q?=20=EB=B7=B0=20=EA=B8=B0=ED=8B=80=20=EC=99=84=EC=84=B1=20(detai?= =?UTF-8?q?l=20=EC=9E=A1=EC=95=84=EC=95=BC=20=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/StatisticsFragment.kt | 3 +- .../ui/statistics/adapter/RankAdapter.kt | 21 +++++-- .../main/res/layout/fragment_statistics.xml | 4 +- app/src/main/res/layout/item_rank.xml | 58 ++++++++++++------- app/src/main/res/values/strings.xml | 1 + 5 files changed, 59 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt index 6f21fca4..6fc3ebaa 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt @@ -38,7 +38,7 @@ class StatisticsFragment : BaseFragment(R.layout.frag statsAdapter = StatsAdapter(mutableListOf()) binding.rvRanking.adapter = rankAdapter - //binding.rvRanking.layoutManager = LinearLayoutManager(requireContext()) + binding.rvRanking.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) binding.rvMonthlyStats.adapter = statsAdapter binding.rvMonthlyStats.layoutManager = LinearLayoutManager(requireContext()) } @@ -71,6 +71,7 @@ class StatisticsFragment : BaseFragment(R.layout.frag lifecycleScope.launchWhenStarted { viewModel.rank.collectLatest { rankAdapter.submitList(ArrayList(it)) + Timber.d("rank: ${it}") rankAdapter.notifyDataSetChanged() } } diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt index 0f8ea07f..59c5319c 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt @@ -5,6 +5,8 @@ import android.view.View import android.view.ViewGroup import androidx.databinding.BindingAdapter import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.depromeet.housekeeper.R import com.depromeet.housekeeper.databinding.ItemRankBinding import com.depromeet.housekeeper.model.response.HouseWorkStatsMember @@ -13,13 +15,22 @@ class RankAdapter(): RecyclerView.Adapter() { inner class ViewHolder(private val binding: ItemRankBinding): RecyclerView.ViewHolder(binding.root){ fun bind(rank: HouseWorkStatsMember){ - + binding.apply { + Glide.with(binding.root.context) + .load(rank.member.profilePath) + .error(R.drawable.ic_profile1) + .circleCrop() + .into(ivMember) + tvName.text = rank.member.memberName + tvCnt.text = String.format(binding.root.context.getString(R.string.statistics_count, rank.houseWorkCount)) + isRanker = false + } } - @BindingAdapter("android:paddingHorizontal") - fun setLayoutPaddingHorizontal(view: View, dimen: Float){ - view.setPadding(dimen.toInt(), view.paddingTop, dimen.toInt(), view.paddingBottom) - } +// @BindingAdapter("android:paddingHorizontal") +// fun setLayoutPaddingHorizontal(view: View, dimen: Float){ +// view.setPadding(dimen.toInt(), view.paddingTop, dimen.toInt(), view.paddingBottom) +// } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RankAdapter.ViewHolder { diff --git a/app/src/main/res/layout/fragment_statistics.xml b/app/src/main/res/layout/fragment_statistics.xml index 68eee66e..412a640f 100644 --- a/app/src/main/res/layout/fragment_statistics.xml +++ b/app/src/main/res/layout/fragment_statistics.xml @@ -82,9 +82,10 @@ android:id="@+id/rv_ranking" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="36dp" + android:layout_marginTop="22dp" android:clipToPadding="false" android:orientation="horizontal" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" android:paddingHorizontal="24dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" @@ -137,6 +138,7 @@ android:clipToPadding="false" app:layout_constraintBottom_toBottomOf="parent" android:paddingBottom="60dp" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> diff --git a/app/src/main/res/layout/item_rank.xml b/app/src/main/res/layout/item_rank.xml index be6b4ac4..9fd564d3 100644 --- a/app/src/main/res/layout/item_rank.xml +++ b/app/src/main/res/layout/item_rank.xml @@ -12,10 +12,16 @@ + android:layout_width="74dp" + android:layout_height="147dp" + android:layout_marginEnd="8dp"> + + + app:layout_constraintBottom_toTopOf="@id/ll_profile" + android:layout_marginBottom="7dp" + android:maxLines="1"/> - + app:layout_constraintTop_toTopOf="parent" + android:layout_marginTop="41dp"> - - - + android:textSize="12sp" + android:ellipsize="end" + android:maxLines="1"/> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 66edeec0..c4d6519f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -96,6 +96,7 @@ 이번달 <font color="#0C6DFF">%s</font>님이 <br>가장 많은 집안일을 완료했어요! 이번달 집안일 현황을 확인해보세요 전체 집안일 수행 <font color="#0C6DFF">%d회 </font> + %d개 총 %d회 완료 From 06ae8739a8f91a548dd4c51d4d7147ba7bed14e0 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Wed, 3 May 2023 14:00:08 +0900 Subject: [PATCH 22/28] =?UTF-8?q?Feature/statistics:=20=EB=9E=AD=ED=82=B9?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=84=A3=EB=8A=94=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=20=EC=A7=84=ED=96=89=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../housekeeper/model/ui/Statistics.kt | 7 +++ .../ui/statistics/StatisticsFragment.kt | 2 +- .../ui/statistics/StatisticsViewModel.kt | 18 ++++++-- .../ui/statistics/adapter/RankAdapter.kt | 46 +++++++++++++------ app/src/main/res/layout/item_rank.xml | 6 ++- app/src/main/res/values/dimens.xml | 3 ++ 6 files changed, 63 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/model/ui/Statistics.kt b/app/src/main/java/com/depromeet/housekeeper/model/ui/Statistics.kt index a455f737..f0531f42 100644 --- a/app/src/main/java/com/depromeet/housekeeper/model/ui/Statistics.kt +++ b/app/src/main/java/com/depromeet/housekeeper/model/ui/Statistics.kt @@ -1,9 +1,16 @@ package com.depromeet.housekeeper.model.ui import com.depromeet.housekeeper.model.response.HouseWorkStatsMember +import com.depromeet.housekeeper.model.response.Member data class Stats( val houseWorkName: String, val totalCount: Int, val members: List +) + +data class Ranker( + val rank: Int = 0, + val member: Member, + val houseWorkCnt: Int, ) \ No newline at end of file diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt index 6fc3ebaa..ee00dcf7 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsFragment.kt @@ -69,7 +69,7 @@ class StatisticsFragment : BaseFragment(R.layout.frag } lifecycleScope.launchWhenStarted { - viewModel.rank.collectLatest { + viewModel.rankFlow.collectLatest { rankAdapter.submitList(ArrayList(it)) Timber.d("rank: ${it}") rankAdapter.notifyDataSetChanged() diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt index 482abaa4..342681c7 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/StatisticsViewModel.kt @@ -6,6 +6,7 @@ import com.depromeet.housekeeper.data.repository.StatisticsRepository import com.depromeet.housekeeper.model.response.HouseWorkStatsMember import com.depromeet.housekeeper.model.response.HouseWorkStatsResponse import com.depromeet.housekeeper.model.response.StatsStatus +import com.depromeet.housekeeper.model.ui.Ranker import com.depromeet.housekeeper.model.ui.Stats import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.* @@ -21,8 +22,8 @@ class StatisticsViewModel @Inject constructor( private val _statsFlow: MutableSharedFlow = MutableSharedFlow() val statsFlow get() = _statsFlow - private val _rank: MutableStateFlow> = MutableStateFlow(listOf()) - val rank: StateFlow> get() = _rank + private val _rankFlow: MutableStateFlow> = MutableStateFlow(mutableListOf()) + val rankFlow: StateFlow> get() = _rankFlow private val _totalChoreCnt: MutableStateFlow = MutableStateFlow(0) val totalChoreCnt: StateFlow get() = _totalChoreCnt @@ -57,7 +58,18 @@ class StatisticsViewModel @Inject constructor( statsRepository.getStatisticsRanking(yearMonth).collectLatest { val result = receiveApiResult(it) ?: return@collectLatest - _rank.value = result.houseWorkStatisticsList + var size = result.houseWorkStatisticsList.size + val list = mutableListOf() + for (i: Int in 1..size) { + val cur = result.houseWorkStatisticsList[i-1] + val ranker = Ranker( + rank = i, + member = cur.member, + houseWorkCnt = cur.houseWorkCount + ) + list.add(ranker) + } + _rankFlow.emit(list) } } } diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt index 59c5319c..f461691b 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt @@ -1,20 +1,21 @@ package com.depromeet.housekeeper.ui.statistics.adapter import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.databinding.BindingAdapter +import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.depromeet.housekeeper.R import com.depromeet.housekeeper.databinding.ItemRankBinding -import com.depromeet.housekeeper.model.response.HouseWorkStatsMember +import com.depromeet.housekeeper.model.ui.Ranker +import com.depromeet.housekeeper.util.dp2px -class RankAdapter(): RecyclerView.Adapter() { - private var list: List = listOf()//todo list 입력 뭐 받을지 +class RankAdapter : RecyclerView.Adapter() { + private var list: List = listOf() inner class ViewHolder(private val binding: ItemRankBinding): RecyclerView.ViewHolder(binding.root){ - fun bind(rank: HouseWorkStatsMember){ + fun bind(rank: Ranker){ + val context = binding.root.context binding.apply { Glide.with(binding.root.context) .load(rank.member.profilePath) @@ -22,15 +23,34 @@ class RankAdapter(): RecyclerView.Adapter() { .circleCrop() .into(ivMember) tvName.text = rank.member.memberName - tvCnt.text = String.format(binding.root.context.getString(R.string.statistics_count, rank.houseWorkCount)) - isRanker = false + tvCnt.text = String.format(context.getString(R.string.statistics_count, rank.houseWorkCnt)) + if (rank.rank <= 3){ + isRanker = true + } + tvRank.text = rank.rank.toString() + when (rank.rank) { + 1 -> { + bgView.setBackgroundColor(context.getColor(R.color.highlight)) + val params = tvRank.layoutParams as ConstraintLayout.LayoutParams + params.bottomMargin = context.resources.getDimensionPixelSize(R.dimen.item_rank_bottom_margin_1) + tvRank.layoutParams = params + } + 2 -> { + bgView.setBackgroundColor(context.getColor(R.color.positive_10)) + val params = tvRank.layoutParams as ConstraintLayout.LayoutParams + params.bottomMargin = context.resources.getDimensionPixelSize(R.dimen.item_rank_bottom_margin_2) + tvRank.layoutParams = params + } + 3 -> { + bgView.setBackgroundColor(context.getColor(R.color.positive_0)) + val params = tvRank.layoutParams as ConstraintLayout.LayoutParams + params.bottomMargin = context.resources.getDimensionPixelSize(R.dimen.item_rank_bottom_margin_3) + tvRank.layoutParams = params + } + } } } -// @BindingAdapter("android:paddingHorizontal") -// fun setLayoutPaddingHorizontal(view: View, dimen: Float){ -// view.setPadding(dimen.toInt(), view.paddingTop, dimen.toInt(), view.paddingBottom) -// } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RankAdapter.ViewHolder { @@ -45,7 +65,7 @@ class RankAdapter(): RecyclerView.Adapter() { return list.size } - fun submitList(rankList: List){ + fun submitList(rankList: List){ this.list = rankList } diff --git a/app/src/main/res/layout/item_rank.xml b/app/src/main/res/layout/item_rank.xml index 9fd564d3..f13f2747 100644 --- a/app/src/main/res/layout/item_rank.xml +++ b/app/src/main/res/layout/item_rank.xml @@ -9,6 +9,7 @@ + - 6dp 13dp 5dp + 7dp + 3dp + -1dp \ No newline at end of file From 1b99b7d2a22feeb42832a0dbbae7688c4fc5f11c Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Wed, 3 May 2023 14:03:21 +0900 Subject: [PATCH 23/28] =?UTF-8?q?Style/statistics:=20ranker=20icon=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../depromeet/housekeeper/ExampleInstrumentedTest.kt | 1 - app/src/main/res/drawable/ic_2.xml | 9 +++++++++ app/src/main/res/drawable/ic_3.xml | 9 +++++++++ app/src/main/res/drawable/ic_crown.xml | 10 ++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_2.xml create mode 100644 app/src/main/res/drawable/ic_3.xml create mode 100644 app/src/main/res/drawable/ic_crown.xml diff --git a/app/src/androidTest/java/com/depromeet/housekeeper/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/depromeet/housekeeper/ExampleInstrumentedTest.kt index 29117d89..ebd012f2 100644 --- a/app/src/androidTest/java/com/depromeet/housekeeper/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/com/depromeet/housekeeper/ExampleInstrumentedTest.kt @@ -1,6 +1,5 @@ package com.depromeet.housekeeper -import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import androidx.test.runner.AndroidJUnit4 import org.junit.Assert.* diff --git a/app/src/main/res/drawable/ic_2.xml b/app/src/main/res/drawable/ic_2.xml new file mode 100644 index 00000000..a24a4d76 --- /dev/null +++ b/app/src/main/res/drawable/ic_2.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_3.xml b/app/src/main/res/drawable/ic_3.xml new file mode 100644 index 00000000..5cab09e1 --- /dev/null +++ b/app/src/main/res/drawable/ic_3.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_crown.xml b/app/src/main/res/drawable/ic_crown.xml new file mode 100644 index 00000000..9a2edf4a --- /dev/null +++ b/app/src/main/res/drawable/ic_crown.xml @@ -0,0 +1,10 @@ + + + From 251fcf6b2a8d7a27c53e2d7a1bffaea5967bb9f3 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Wed, 3 May 2023 14:47:09 +0900 Subject: [PATCH 24/28] =?UTF-8?q?Style/statistics:=20ranker=20view=20?= =?UTF-8?q?=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/adapter/RankAdapter.kt | 42 ++++++++++++------- app/src/main/res/layout/item_rank.xml | 16 ++----- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt index f461691b..26820ce5 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt @@ -1,6 +1,11 @@ package com.depromeet.housekeeper.ui.statistics.adapter +import android.annotation.SuppressLint +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Typeface import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.RecyclerView @@ -8,12 +13,12 @@ import com.bumptech.glide.Glide import com.depromeet.housekeeper.R import com.depromeet.housekeeper.databinding.ItemRankBinding import com.depromeet.housekeeper.model.ui.Ranker -import com.depromeet.housekeeper.util.dp2px class RankAdapter : RecyclerView.Adapter() { private var list: List = listOf() inner class ViewHolder(private val binding: ItemRankBinding): RecyclerView.ViewHolder(binding.root){ + @SuppressLint("UseCompatLoadingForDrawables") fun bind(rank: Ranker){ val context = binding.root.context binding.apply { @@ -26,33 +31,42 @@ class RankAdapter : RecyclerView.Adapter() { tvCnt.text = String.format(context.getString(R.string.statistics_count, rank.houseWorkCnt)) if (rank.rank <= 3){ isRanker = true + tvCnt.setTypeface(null, Typeface.BOLD) } - tvRank.text = rank.rank.toString() + when (rank.rank) { 1 -> { - bgView.setBackgroundColor(context.getColor(R.color.highlight)) - val params = tvRank.layoutParams as ConstraintLayout.LayoutParams - params.bottomMargin = context.resources.getDimensionPixelSize(R.dimen.item_rank_bottom_margin_1) - tvRank.layoutParams = params + ivRank.setImageDrawable(context.getDrawable(R.drawable.ic_crown)) + bgView.backgroundTintList = ColorStateList.valueOf(context.getColor(R.color.highlight)) + setRankerMargin(ivRank, context, R.dimen.item_rank_bottom_margin_1) + tvName.setTextColor(context.getColor(R.color.white)) + tvCnt.setTextColor(context.getColor(R.color.white)) } 2 -> { - bgView.setBackgroundColor(context.getColor(R.color.positive_10)) - val params = tvRank.layoutParams as ConstraintLayout.LayoutParams - params.bottomMargin = context.resources.getDimensionPixelSize(R.dimen.item_rank_bottom_margin_2) - tvRank.layoutParams = params + ivRank.setImageDrawable(context.getDrawable(R.drawable.ic_2)) + bgView.backgroundTintList = ColorStateList.valueOf(context.getColor(R.color.positive_10)) + setRankerMargin(ivRank, context, R.dimen.item_rank_bottom_margin_2) + tvCnt.setTextColor(context.getColor(R.color.gray_800)) } 3 -> { - bgView.setBackgroundColor(context.getColor(R.color.positive_0)) - val params = tvRank.layoutParams as ConstraintLayout.LayoutParams - params.bottomMargin = context.resources.getDimensionPixelSize(R.dimen.item_rank_bottom_margin_3) - tvRank.layoutParams = params + ivRank.setImageDrawable(context.getDrawable(R.drawable.ic_3)) + bgView.backgroundTintList = ColorStateList.valueOf(context.getColor(R.color.positive_0)) + setRankerMargin(ivRank, context, R.dimen.item_rank_bottom_margin_3) + tvCnt.setTextColor(context.getColor(R.color.gray_800)) } } } } + private fun setRankerMargin(target: View, context: Context, dimen: Int){ + val params = target.layoutParams as ConstraintLayout.LayoutParams + params.bottomMargin = context.resources.getDimensionPixelSize(dimen) + target.layoutParams = params + } } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RankAdapter.ViewHolder { return ViewHolder(ItemRankBinding.inflate(LayoutInflater.from(parent.context), parent, false)) } diff --git a/app/src/main/res/layout/item_rank.xml b/app/src/main/res/layout/item_rank.xml index f13f2747..b48ce064 100644 --- a/app/src/main/res/layout/item_rank.xml +++ b/app/src/main/res/layout/item_rank.xml @@ -21,26 +21,18 @@ android:id="@+id/bg_view" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/bg_highlight_box" - android:backgroundTint="@color/positive_10" + android:background="@drawable/bg_rect_r4" android:visibility="@{isRanker ? View.VISIBLE : View.INVISIBLE, default = invisible}" /> - + app:layout_constraintBottom_toTopOf="@id/ll_profile" /> Date: Wed, 3 May 2023 15:31:41 +0900 Subject: [PATCH 25/28] =?UTF-8?q?Style/statistics:=20ranker=20view=20?= =?UTF-8?q?=EC=9E=91=EC=97=85=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/adapter/RankAdapter.kt | 30 ++++++++++++------- .../housekeeper/util/BindingAdapter.kt | 15 ++++++++++ app/src/main/res/layout/item_rank.xml | 6 ++-- app/src/main/res/values/dimens.xml | 10 ++----- 4 files changed, 41 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt index 26820ce5..0f0ecf85 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/RankAdapter.kt @@ -8,6 +8,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.constraintlayout.widget.ConstraintLayout +import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.depromeet.housekeeper.R @@ -19,50 +20,59 @@ class RankAdapter : RecyclerView.Adapter() { inner class ViewHolder(private val binding: ItemRankBinding): RecyclerView.ViewHolder(binding.root){ @SuppressLint("UseCompatLoadingForDrawables") - fun bind(rank: Ranker){ + fun bind(ranker: Ranker){ val context = binding.root.context binding.apply { Glide.with(binding.root.context) - .load(rank.member.profilePath) + .load(ranker.member.profilePath) .error(R.drawable.ic_profile1) .circleCrop() .into(ivMember) - tvName.text = rank.member.memberName - tvCnt.text = String.format(context.getString(R.string.statistics_count, rank.houseWorkCnt)) - if (rank.rank <= 3){ + tvName.text = ranker.member.memberName + tvCnt.text = String.format(context.getString(R.string.statistics_count, ranker.houseWorkCnt)) + rankNum = ranker.rank + if (ranker.rank <= 3){ isRanker = true tvCnt.setTypeface(null, Typeface.BOLD) } - when (rank.rank) { + when (ranker.rank) { 1 -> { ivRank.setImageDrawable(context.getDrawable(R.drawable.ic_crown)) bgView.backgroundTintList = ColorStateList.valueOf(context.getColor(R.color.highlight)) - setRankerMargin(ivRank, context, R.dimen.item_rank_bottom_margin_1) + setBottomMargin(ivRank, context, R.dimen.item_rank_bottom_margin_1) tvName.setTextColor(context.getColor(R.color.white)) tvCnt.setTextColor(context.getColor(R.color.white)) } 2 -> { ivRank.setImageDrawable(context.getDrawable(R.drawable.ic_2)) bgView.backgroundTintList = ColorStateList.valueOf(context.getColor(R.color.positive_10)) - setRankerMargin(ivRank, context, R.dimen.item_rank_bottom_margin_2) + setBottomMargin(ivRank, context, R.dimen.item_rank_bottom_margin_2) tvCnt.setTextColor(context.getColor(R.color.gray_800)) + setTopMargin(bgView, context, R.dimen.item_rank_top_margin_2) } 3 -> { ivRank.setImageDrawable(context.getDrawable(R.drawable.ic_3)) bgView.backgroundTintList = ColorStateList.valueOf(context.getColor(R.color.positive_0)) - setRankerMargin(ivRank, context, R.dimen.item_rank_bottom_margin_3) + setBottomMargin(ivRank, context, R.dimen.item_rank_bottom_margin_3) tvCnt.setTextColor(context.getColor(R.color.gray_800)) + setTopMargin(bgView, context, R.dimen.item_rank_top_margin_3) } } } } - private fun setRankerMargin(target: View, context: Context, dimen: Int){ + private fun setBottomMargin(target: View, context: Context, dimen: Int){ val params = target.layoutParams as ConstraintLayout.LayoutParams params.bottomMargin = context.resources.getDimensionPixelSize(dimen) target.layoutParams = params } + + private fun setTopMargin(target: View, context: Context, dimen: Int){ + val params = target.layoutParams as ConstraintLayout.LayoutParams + params.topMargin = context.resources.getDimensionPixelSize(dimen) + target.layoutParams = params + } } diff --git a/app/src/main/java/com/depromeet/housekeeper/util/BindingAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/util/BindingAdapter.kt index ae377baa..15b8c3a3 100644 --- a/app/src/main/java/com/depromeet/housekeeper/util/BindingAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/util/BindingAdapter.kt @@ -1,11 +1,14 @@ package com.depromeet.housekeeper.util +import android.content.Context import android.graphics.Typeface import android.graphics.drawable.Drawable import android.text.util.Linkify +import android.view.View import android.widget.ImageButton import android.widget.ImageView import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout import com.bumptech.glide.Glide import com.depromeet.housekeeper.R import com.depromeet.housekeeper.model.enums.SignViewType @@ -77,4 +80,16 @@ object BindingAdapter { imageButton.isSelected = selected } + @androidx.databinding.BindingAdapter("app:rankBottomMargin") + @JvmStatic + fun setBottomMargin(target: ImageView, rank: Int){ + val params = target.layoutParams as ConstraintLayout.LayoutParams + when(rank){ + 1-> params.bottomMargin = R.dimen.item_rank_bottom_margin_1 + 2-> params.bottomMargin = R.dimen.item_rank_bottom_margin_2 + 3-> params.bottomMargin = R.dimen.item_rank_bottom_margin_3 + } + target.layoutParams = params + } + } \ No newline at end of file diff --git a/app/src/main/res/layout/item_rank.xml b/app/src/main/res/layout/item_rank.xml index b48ce064..c91f4909 100644 --- a/app/src/main/res/layout/item_rank.xml +++ b/app/src/main/res/layout/item_rank.xml @@ -9,7 +9,9 @@ - + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index c7be982b..3f0ca79d 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,14 +1,8 @@ - 41dp - 33dp - 26dp - 21dp - 11dp - 6dp - 13dp - 5dp 7dp 3dp -1dp + 8dp + 16dp \ No newline at end of file From 4aea5980aae94a1bebb81c912f5689c7c59c64d2 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Wed, 3 May 2023 15:43:56 +0900 Subject: [PATCH 26/28] =?UTF-8?q?build/statistics:=20Flexbox=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=B8=8C=EB=9F=AC=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 ++ .../housekeeper/ui/statistics/adapter/StatsAdapter.kt | 1 + .../src/main/kotlin/deptromeet/housekeeper/Dependencies.kt | 3 +++ 3 files changed, 6 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index dbbfc0f4..697e0f07 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -134,4 +134,6 @@ dependencies { implementation Dependencies.hilt kapt Dependencies.hiltCompiler + implementation Dependencies.flexbox + } \ No newline at end of file diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt index 6de1edb6..c0e413c8 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt @@ -20,6 +20,7 @@ class StatsAdapter(private var list: MutableList ) : RecyclerView.Adapter houseWorkName = item.houseWorkName.ifBlank { "기타" } val totalCnt = binding.root.context.getString(R.string.statistics_total_complete, item.totalCount) tvTotalChores.text = String.format(totalCnt) + rvMemberList.adapter = StatsMemberAdapter(item.members) var isDroppedVar = false isDropped = isDroppedVar diff --git a/buildSrc/src/main/kotlin/deptromeet/housekeeper/Dependencies.kt b/buildSrc/src/main/kotlin/deptromeet/housekeeper/Dependencies.kt index 44eca4b2..3c17288c 100644 --- a/buildSrc/src/main/kotlin/deptromeet/housekeeper/Dependencies.kt +++ b/buildSrc/src/main/kotlin/deptromeet/housekeeper/Dependencies.kt @@ -111,4 +111,7 @@ object Dependencies { const val hilt = "com.google.dagger:hilt-android:$HILT" const val hiltCompiler = "com.google.dagger:hilt-compiler:$HILT" const val hiltPlugin = "com.google.dagger:hilt-android-gradle-plugin:$HILT" + + private const val FLEXBOX = "3.0.0" + const val flexbox = "com.google.android.flexbox:flexbox:$FLEXBOX" } \ No newline at end of file From 27a4d21f3aeecaab89c33477744d5aabfdd212db Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Wed, 3 May 2023 16:09:05 +0900 Subject: [PATCH 27/28] =?UTF-8?q?feature/statistics:=20=EC=A7=91=EC=95=88?= =?UTF-8?q?=EC=9D=BC=20=ED=98=84=ED=99=A9=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=EC=84=9C=20Flexbox=EB=A1=9C=20=EB=A9=A4=EB=B2=84=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=B3=B4=EC=97=AC=EC=A3=BC?= =?UTF-8?q?=EA=B2=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/statistics/adapter/StatsAdapter.kt | 9 ++++++++- app/src/main/res/layout/item_member_statistics.xml | 14 +++++++++----- app/src/main/res/layout/item_statistics.xml | 13 +++++++++---- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt index c0e413c8..cc5880f5 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt @@ -6,6 +6,9 @@ import androidx.recyclerview.widget.RecyclerView import com.depromeet.housekeeper.R import com.depromeet.housekeeper.databinding.ItemStatisticsBinding import com.depromeet.housekeeper.model.ui.Stats +import com.google.android.flexbox.FlexDirection +import com.google.android.flexbox.FlexboxLayoutManager +import com.google.android.flexbox.JustifyContent import timber.log.Timber @@ -20,7 +23,11 @@ class StatsAdapter(private var list: MutableList ) : RecyclerView.Adapter houseWorkName = item.houseWorkName.ifBlank { "기타" } val totalCnt = binding.root.context.getString(R.string.statistics_total_complete, item.totalCount) tvTotalChores.text = String.format(totalCnt) - + val flexboxLayoutManager = FlexboxLayoutManager(binding.root.context).apply { + flexDirection = FlexDirection.ROW + justifyContent = JustifyContent.SPACE_BETWEEN + } + rvMemberList.layoutManager = flexboxLayoutManager rvMemberList.adapter = StatsMemberAdapter(item.members) var isDroppedVar = false isDropped = isDroppedVar diff --git a/app/src/main/res/layout/item_member_statistics.xml b/app/src/main/res/layout/item_member_statistics.xml index 70b44629..1bb07f7c 100644 --- a/app/src/main/res/layout/item_member_statistics.xml +++ b/app/src/main/res/layout/item_member_statistics.xml @@ -15,12 +15,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingVertical="6dp" - android:paddingStart="3dp" + android:paddingStart="4dp" android:paddingEnd="8dp" android:background="@drawable/bg_solid_5" - android:minWidth="88dp" - android:layout_marginEnd="8dp" - android:layout_marginBottom="16dp"> + android:layout_marginVertical="5dp" + android:layout_marginHorizontal="4dp" + android:minWidth="88dp"> diff --git a/app/src/main/res/layout/item_statistics.xml b/app/src/main/res/layout/item_statistics.xml index dbfd2b8c..641e2850 100644 --- a/app/src/main/res/layout/item_statistics.xml +++ b/app/src/main/res/layout/item_statistics.xml @@ -51,6 +51,7 @@ app:layout_constraintTop_toTopOf="parent" android:includeFontPadding="false" android:layout_marginStart="16dp" + android:paddingBottom="12dp" /> + android:paddingHorizontal="12dp" + android:paddingBottom="4dp"/> + + \ No newline at end of file From f11c9bab642942195c0ac73d8b6bb32d461784d1 Mon Sep 17 00:00:00 2001 From: Minju Kim Date: Wed, 3 May 2023 16:23:54 +0900 Subject: [PATCH 28/28] =?UTF-8?q?feature/statistics:=20=EC=A7=91=EC=95=88?= =?UTF-8?q?=EC=9D=BC=20=ED=98=84=ED=99=A9=20=EB=94=94=ED=85=8C=EC=9D=BC?= =?UTF-8?q?=ED=95=9C=20=EB=B6=80=EB=B6=84=20=EC=9E=A1=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../housekeeper/ui/statistics/adapter/StatsAdapter.kt | 4 ++++ app/src/main/res/layout/item_member_statistics.xml | 5 +++-- app/src/main/res/layout/item_statistics.xml | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt index cc5880f5..e119fd40 100644 --- a/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt +++ b/app/src/main/java/com/depromeet/housekeeper/ui/statistics/adapter/StatsAdapter.kt @@ -32,6 +32,10 @@ class StatsAdapter(private var list: MutableList ) : RecyclerView.Adapter var isDroppedVar = false isDropped = isDroppedVar + clTotalChores.setOnClickListener { + isDroppedVar = !isDroppedVar + isDropped = isDroppedVar + } btnDrop.setOnClickListener { isDroppedVar = !isDroppedVar isDropped = isDroppedVar diff --git a/app/src/main/res/layout/item_member_statistics.xml b/app/src/main/res/layout/item_member_statistics.xml index 1bb07f7c..56dca55a 100644 --- a/app/src/main/res/layout/item_member_statistics.xml +++ b/app/src/main/res/layout/item_member_statistics.xml @@ -18,7 +18,7 @@ android:paddingStart="4dp" android:paddingEnd="8dp" android:background="@drawable/bg_solid_5" - android:layout_marginVertical="5dp" + android:layout_marginBottom="10dp" android:layout_marginHorizontal="4dp" android:minWidth="88dp">