Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/statistics: 통계 뷰 작업 완료 #164

Merged
merged 31 commits into from
May 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
49c3631
Feature/statistics: 현재 월 가져와 통계 첫 화면에 보여주기
mjkim1019 Apr 12, 2023
1bc1e2f
Feature/statistics: 통계에서 사용하는 API 선언
mjkim1019 Apr 12, 2023
da75439
Feature/statistics: 통계에서 사용하는 API 함수 구현 완료
mjkim1019 Apr 13, 2023
9464d05
Feature/statistics: 통계 화면에서 사용할 repository 생성 및 구현
mjkim1019 Apr 13, 2023
d4a2898
Feature/statistics: 통계 화면을 위한 api 연결 함수 viewModel에 구현
mjkim1019 Apr 13, 2023
62e553c
Feature/statistics: 집안일 현황 expand 했을 때 데이터 어떻게 받아올 지 구현
mjkim1019 Apr 13, 2023
9bcdc32
Feature/statistics: 통계화면 랭킹 관련 api 연결
mjkim1019 Apr 14, 2023
2f54187
Feature/statistics: 통계화면 랭킹 관련 데이터 받아 view에서 감지하는 작업
mjkim1019 Apr 14, 2023
35b2ff3
Feature/statistics: 통계화면 랭킹, 현황 adapter 생성
mjkim1019 Apr 14, 2023
37e7639
Feature/statistics: 가사 현황 item response 합침
mjkim1019 Apr 14, 2023
36e4c2f
Feature/statistics: StatsMemberAdapter 구현 완료
mjkim1019 Apr 14, 2023
15f8652
Feature/statistics: MonthlyStatsAdapter 구현 완료
mjkim1019 Apr 14, 2023
337b8c8
Feature/statistics: statisticsFragment에 adapter 연결
mjkim1019 Apr 14, 2023
917f60b
Feature/statistics: mainFragment ui 변경 (통계 화면 이동을 위한 버튼 추가
mjkim1019 Apr 19, 2023
4bddbea
Feature/statistics: main -> 통계화면 이동 함수 구현
mjkim1019 Apr 19, 2023
9aa0374
Feature/statistics: text 부분적으로 색깔 칠하기 성공
mjkim1019 Apr 19, 2023
daa15df
Feature/statistics: 통계 집안일 리스트 어댑터 연결 & api 받아와 보여주기 구현 완료
mjkim1019 Apr 21, 2023
8050ce2
Feature/statistics: 통계 집안일 리스트 기본틀 완성 (drop만 하면 됨)
mjkim1019 Apr 22, 2023
4a56516
Feature/statistics: flow로 아이템 하나씩 받아와 adapter list에 자연스럽게 추가되도록 수정
mjkim1019 Apr 22, 2023
2633c25
Feature/statistics: stats 집안일 리스트 어댑터 이름 StatusAdapter로 변경
mjkim1019 Apr 22, 2023
68d9bf8
Feature/statistics: stats 집안일 리스트 구현 완료
mjkim1019 Apr 22, 2023
4e9290a
Merge branch 'develop' into feature/statistics
mjkim1019 Apr 27, 2023
29fe9a8
Feature/statistics: 랭킹 뷰 기틀 완성 (detail 잡아야 함)
mjkim1019 Apr 27, 2023
06ae873
Feature/statistics: 랭킹 데이터 넣는 작업 진행 중
mjkim1019 May 3, 2023
1b99b7d
Style/statistics: ranker icon 추가
mjkim1019 May 3, 2023
251fcf6
Style/statistics: ranker view 작업중
mjkim1019 May 3, 2023
a081049
Style/statistics: ranker view 작업 완료
mjkim1019 May 3, 2023
4aea598
build/statistics: Flexbox 라이브러리 추가
mjkim1019 May 3, 2023
27a4d21
feature/statistics: 집안일 현황 리스트에서 Flexbox로 멤버 리스트 보여주게 구현
mjkim1019 May 3, 2023
f11c9ba
feature/statistics: 집안일 현황 디테일한 부분 잡기
mjkim1019 May 3, 2023
132d0a3
Merge branch 'develop' into feature/statistics
mjkim1019 May 11, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -136,5 +136,6 @@ dependencies {

implementation Dependencies.hilt
kapt Dependencies.hiltCompiler

implementation Dependencies.flexbox
}
Original file line number Diff line number Diff line change
@@ -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.*
Expand Down
Original file line number Diff line number Diff line change
@@ -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<HouseWorkStatsMember>
)

data class Ranker(
val rank: Int = 0,
val member: Member,
val houseWorkCnt: Int,
)
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class StatisticsFragment : BaseFragment<FragmentStatisticsBinding>(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())
}
Expand Down Expand Up @@ -69,8 +69,9 @@ class StatisticsFragment : BaseFragment<FragmentStatisticsBinding>(R.layout.frag
}

lifecycleScope.launchWhenStarted {
viewModel.rank.collectLatest {
viewModel.rankFlow.collectLatest {
rankAdapter.submitList(ArrayList(it))
Timber.d("rank: ${it}")
rankAdapter.notifyDataSetChanged()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*
Expand All @@ -21,8 +22,8 @@ class StatisticsViewModel @Inject constructor(
private val _statsFlow: MutableSharedFlow<Stats> = MutableSharedFlow()
val statsFlow get() = _statsFlow

private val _rank: MutableStateFlow<List<HouseWorkStatsMember>> = MutableStateFlow(listOf())
val rank: StateFlow<List<HouseWorkStatsMember>> get() = _rank
private val _rankFlow: MutableStateFlow<MutableList<Ranker>> = MutableStateFlow(mutableListOf())
val rankFlow: StateFlow<List<Ranker>> get() = _rankFlow

private val _totalChoreCnt: MutableStateFlow<Int> = MutableStateFlow(0)
val totalChoreCnt: StateFlow<Int> get() = _totalChoreCnt
Expand Down Expand Up @@ -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<Ranker>()
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)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,82 @@
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.databinding.BindingAdapter
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.databinding.DataBindingUtil
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

class RankAdapter(): RecyclerView.Adapter<RankAdapter.ViewHolder>() {
private var list: List<HouseWorkStatsMember> = listOf()//todo list 입력 뭐 받을지
class RankAdapter : RecyclerView.Adapter<RankAdapter.ViewHolder>() {
private var list: List<Ranker> = listOf()

inner class ViewHolder(private val binding: ItemRankBinding): RecyclerView.ViewHolder(binding.root){
fun bind(rank: HouseWorkStatsMember){
@SuppressLint("UseCompatLoadingForDrawables")
fun bind(ranker: Ranker){
val context = binding.root.context
binding.apply {
Glide.with(binding.root.context)
.load(ranker.member.profilePath)
.error(R.drawable.ic_profile1)
.circleCrop()
.into(ivMember)
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 (ranker.rank) {
1 -> {
ivRank.setImageDrawable(context.getDrawable(R.drawable.ic_crown))
bgView.backgroundTintList = ColorStateList.valueOf(context.getColor(R.color.highlight))
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))
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))
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)
}
}
}
}

@BindingAdapter("android:paddingHorizontal")
fun setLayoutPaddingHorizontal(view: View, dimen: Float){
view.setPadding(dimen.toInt(), view.paddingTop, dimen.toInt(), view.paddingBottom)
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
}
}



override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RankAdapter.ViewHolder {
return ViewHolder(ItemRankBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
Expand All @@ -34,7 +89,7 @@ class RankAdapter(): RecyclerView.Adapter<RankAdapter.ViewHolder>() {
return list.size
}

fun submitList(rankList: List<HouseWorkStatsMember>){
fun submitList(rankList: List<Ranker>){
this.list = rankList
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -20,10 +23,19 @@ class StatsAdapter(private var list: MutableList<Stats> ) : 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

clTotalChores.setOnClickListener {
isDroppedVar = !isDroppedVar
isDropped = isDroppedVar
}
btnDrop.setOnClickListener {
isDroppedVar = !isDroppedVar
isDropped = isDroppedVar
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +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
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/res/drawable/ic_2.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="9dp"
android:height="12dp"
android:viewportWidth="9"
android:viewportHeight="12">
<path
android:pathData="M8.796,12V10.298H3.773V10.215L5.779,8.221C8.006,6.122 8.619,5.088 8.624,3.807C8.619,1.912 7.061,0.53 4.757,0.53C2.486,0.53 0.878,1.923 0.89,4.066H2.823C2.818,2.917 3.569,2.188 4.729,2.188C5.84,2.188 6.674,2.851 6.68,3.912C6.674,4.856 6.077,5.53 4.934,6.674L0.939,10.525L0.945,12H8.796Z"
android:fillColor="#0C6DFF"/>
</vector>
9 changes: 9 additions & 0 deletions app/src/main/res/drawable/ic_3.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="10dp"
android:height="13dp"
android:viewportWidth="10"
android:viewportHeight="13">
<path
android:pathData="M5.05,12.155C7.497,12.155 9.282,10.768 9.271,8.862C9.282,7.436 8.376,6.414 6.773,6.199V6.11C8.017,5.851 8.856,4.939 8.845,3.663C8.856,1.934 7.37,0.53 5.083,0.53C2.862,0.53 1.138,1.834 1.094,3.729H3.044C3.083,2.785 4,2.188 5.072,2.188C6.166,2.188 6.884,2.829 6.884,3.779C6.884,4.768 6.044,5.436 4.84,5.436H3.834V7.006H4.84C6.315,7.006 7.193,7.735 7.188,8.757C7.193,9.757 6.293,10.442 5.044,10.442C3.867,10.442 2.961,9.845 2.912,8.928H0.856C0.912,10.84 2.635,12.155 5.05,12.155Z"
android:fillColor="#0C6DFF"/>
</vector>
10 changes: 10 additions & 0 deletions app/src/main/res/drawable/ic_crown.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="18dp"
android:height="13dp"
android:viewportWidth="18"
android:viewportHeight="13">
<path
android:pathData="M12.297,5.437L9.042,0L5.719,5.471L0,1.147L0,13H1.147H2.294H15.677H16.823H17.971V1.147L12.297,5.437Z"
android:fillColor="#FFE710"
android:fillType="evenOdd"/>
</vector>
4 changes: 3 additions & 1 deletion app/src/main/res/layout/fragment_statistics.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -137,6 +138,7 @@
android:clipToPadding="false"
app:layout_constraintBottom_toBottomOf="parent"
android:paddingBottom="60dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
/>

</androidx.constraintlayout.widget.ConstraintLayout>
Expand Down
15 changes: 10 additions & 5 deletions app/src/main/res/layout/item_member_statistics.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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_marginBottom="10dp"
android:layout_marginHorizontal="4dp"
android:minWidth="88dp">
<ImageView
android:id="@+id/iv_member"
android:layout_width="20dp"
Expand All @@ -37,25 +37,30 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_member"
app:layout_constraintEnd_toStartOf="@id/tv_cnt"
app:layout_constraintHorizontal_bias="0.2"
android:text="@{name}"
android:textColor="@color/gray_800"
android:textSize="12sp"
android:textFontWeight="400"
android:layout_marginStart="2dp"
android:ellipsize="end"
android:minWidth="34dp"
android:textAlignment="center"
/>
<TextView
android:id="@+id/tv_cnt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_name"
app:layout_constraintEnd_toEndOf="parent"
android:text="@{String.valueOf(cnt)}"
android:textSize="14sp"
android:textFontWeight="400"
android:textColor="@color/gray_700"
android:layout_marginStart="6dp"
android:paddingStart="6dp"
android:includeFontPadding="false" />

</androidx.constraintlayout.widget.ConstraintLayout>
Expand Down
Loading