Skip to content

Commit 8a0d24e

Browse files
authored
Merge pull request #18 from Team-Sopetit/feature/#8-add-daily-routine
#8 [ui] Daily Routine - 추가하기
2 parents affb3f6 + dea9844 commit 8a0d24e

24 files changed

+1288
-15
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@
4343
</intent-filter>
4444
</activity>
4545

46+
<activity
47+
android:name=".ui.dailyroutine.dailyroutineadd.DailyRoutineAddActivity"
48+
android:exported="false"
49+
android:screenOrientation="portrait" />
50+
4651
<activity
4752
android:name=".ui.happyroutine.addlist.HappyAddListActivity"
4853
android:exported="false"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.sopetit.softie.domain.entity
2+
3+
data class DailyCard(
4+
val backgroundImageUrl: String,
5+
val routineId: Int,
6+
val content: String
7+
)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.sopetit.softie.domain.entity
2+
3+
data class DailyRoutineAdd(
4+
val themeId: Int,
5+
val dailyRoutineCardList: List<DailyCard>
6+
)

app/src/main/java/com/sopetit/softie/domain/entity/Theme.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ data class Theme(
44
val themeId: Int,
55
val name: String,
66
val iconImageUrl: String,
7-
val backgroudnImageUrl: String
7+
val backgroundImageUrl: String
88
)

app/src/main/java/com/sopetit/softie/ui/dailyroutine/DailyRoutineFragment.kt

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.sopetit.softie.ui.dailyroutine
22

3+
import android.content.Intent
34
import android.os.Bundle
45
import android.view.View
56
import android.widget.TextView
67
import androidx.fragment.app.viewModels
78
import com.sopetit.softie.R
89
import com.sopetit.softie.databinding.FragmentDailyRoutineBinding
10+
import com.sopetit.softie.ui.dailyroutine.dailyroutineadd.DailyRoutineAddActivity
911
import com.sopetit.softie.util.OriginalBottomSheet.Companion.BOTTOM_SHEET_TAG
1012
import com.sopetit.softie.util.binding.BindingBottomSheet
1113
import com.sopetit.softie.util.binding.BindingFragment
@@ -24,6 +26,7 @@ class DailyRoutineFragment :
2426

2527
binding.viewModel = viewModel
2628

29+
moveToAddRoutine()
2730
initSetDailyRoutineContent()
2831
initSetDeleteView()
2932
initSetRoutineDelete()
@@ -43,12 +46,6 @@ class DailyRoutineFragment :
4346
btnDailyRoutineYetFinSecond,
4447
1
4548
)
46-
routineItemView(
47-
tvDailyRoutineAddNameThird,
48-
tvDailyRoutineIngThird,
49-
btnDailyRoutineYetFinThird,
50-
2
51-
)
5249
}
5350
}
5451

@@ -121,7 +118,6 @@ class DailyRoutineFragment :
121118
with(binding) {
122119
changeBtnSelectState(btnDailyRoutineRadioFirst, routineList[0].routineId)
123120
changeBtnSelectState(btnDailyRoutineRadioSecond, routineList[1].routineId)
124-
changeBtnSelectState(btnDailyRoutineRadioThird, routineList[2].routineId)
125121
}
126122
}
127123
}
@@ -176,4 +172,11 @@ class DailyRoutineFragment :
176172
}
177173
}
178174
}
175+
176+
private fun moveToAddRoutine() {
177+
binding.ivDailyRoutineEmpty.setOnClickListener {
178+
val intent = Intent(requireContext(), DailyRoutineAddActivity::class.java)
179+
startActivity(intent)
180+
}
181+
}
179182
}

app/src/main/java/com/sopetit/softie/ui/dailyroutine/DailyRoutineViewModel.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,6 @@ class DailyRoutineViewModel : ViewModel() {
2222
"",
2323
5,
2424
false
25-
),
26-
DailyRoutine(
27-
3,
28-
"이불 개기",
29-
"",
30-
10,
31-
true
3225
)
3326
)
3427
)
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
package com.sopetit.softie.ui.dailyroutine.dailyroutineadd
2+
3+
import android.graphics.Rect
4+
import android.os.Bundle
5+
import android.view.View
6+
import androidx.activity.viewModels
7+
import androidx.recyclerview.widget.RecyclerView
8+
import androidx.viewpager2.widget.CompositePageTransformer
9+
import androidx.viewpager2.widget.MarginPageTransformer
10+
import androidx.viewpager2.widget.ViewPager2
11+
import com.sopetit.softie.R
12+
import com.sopetit.softie.databinding.ActivityDailyRoutineAddBinding
13+
import com.sopetit.softie.domain.entity.Theme
14+
import com.sopetit.softie.util.binding.BindingActivity
15+
16+
class DailyRoutineAddActivity :
17+
BindingActivity<ActivityDailyRoutineAddBinding>(R.layout.activity_daily_routine_add) {
18+
private lateinit var viewPager: ViewPager2
19+
private lateinit var dailyRoutineAddCardPagerAdapter: DailyRoutineAddCardPagerAdapter
20+
private lateinit var dailyRoutineAddThemeAdapter: DailyRoutineAddThemeAdapter
21+
22+
private val dailyRoutineAddViewModel by viewModels<DailyRoutineAddViewModel>()
23+
24+
override fun onCreate(savedInstanceState: Bundle?) {
25+
super.onCreate(savedInstanceState)
26+
viewPager = binding.vpDailyRoutineAddCard
27+
binding.viewModel = dailyRoutineAddViewModel
28+
29+
setupAdapter()
30+
setViewPager()
31+
setupList()
32+
setIndicator()
33+
setItemDiv()
34+
initPagerDiv(0, 90)
35+
addClickListener()
36+
}
37+
38+
private fun addClickListener() {
39+
addRoutine()
40+
backToDailyRoutine()
41+
}
42+
43+
private fun setupAdapter() {
44+
with(binding) {
45+
dailyRoutineAddCardPagerAdapter = DailyRoutineAddCardPagerAdapter()
46+
vpDailyRoutineAddCard.adapter = dailyRoutineAddCardPagerAdapter
47+
dailyRoutineAddThemeAdapter = DailyRoutineAddThemeAdapter().apply {
48+
setOnItemClickListener(object : DailyRoutineAddThemeAdapter.OnItemClickListener {
49+
override fun onItemClick(item: Theme, position: Int) {
50+
setRoutineList(item.themeId)
51+
}
52+
})
53+
}
54+
rvDailyRoutineAddTheme.adapter = dailyRoutineAddThemeAdapter
55+
}
56+
}
57+
58+
private fun setupList() {
59+
dailyRoutineAddViewModel.mockThemeList.observe(this) {
60+
dailyRoutineAddCardPagerAdapter.submitList(dailyRoutineAddViewModel.startNewDayCardList.value)
61+
dailyRoutineAddThemeAdapter.submitList(dailyRoutineAddViewModel.mockThemeList.value)
62+
}
63+
}
64+
65+
private fun setRoutineList(themeId: Int) {
66+
dailyRoutineAddCardPagerAdapter.submitList(
67+
dailyRoutineAddViewModel.getDailyCardListForId(themeId)[0].dailyRoutineCardList
68+
)
69+
}
70+
71+
private fun initPagerDiv(previewWidth: Int, itemMargin: Int) {
72+
val decoMargin = previewWidth + itemMargin
73+
val pageTransX = decoMargin + previewWidth
74+
val decoration = PageDecoration(decoMargin)
75+
76+
binding.vpDailyRoutineAddCard.also {
77+
it.offscreenPageLimit = VIEW_PAGE.toInt()
78+
it.addItemDecoration(decoration)
79+
it.setPageTransformer { page, position ->
80+
page.translationX = position * -pageTransX
81+
}
82+
}
83+
}
84+
85+
private fun setViewPager() {
86+
with(binding.vpDailyRoutineAddCard) {
87+
adapter = dailyRoutineAddCardPagerAdapter
88+
offscreenPageLimit = VIEW_PAGE.toInt()
89+
90+
val dpValue = PADDING_PAGE
91+
val margin = (dpValue * resources.displayMetrics.density).toInt()
92+
setPadding(margin, PADDING_CARD, margin, PADDING_CARD)
93+
94+
setPageTransformer(
95+
CompositePageTransformer().apply {
96+
addTransformer(
97+
MarginPageTransformer(
98+
resources.getDimensionPixelOffset(R.dimen.viewpager_margin)
99+
)
100+
)
101+
}
102+
)
103+
}
104+
}
105+
106+
private fun setIndicator() {
107+
binding.diDailyRoutineAddIndicator.attachTo(binding.vpDailyRoutineAddCard)
108+
}
109+
110+
private class PageDecoration(private val margin: Int) : RecyclerView.ItemDecoration() {
111+
112+
override fun getItemOffsets(
113+
outRect: Rect,
114+
view: View,
115+
parent: RecyclerView,
116+
state: RecyclerView.State
117+
) {
118+
outRect.left = margin
119+
outRect.right = margin
120+
}
121+
}
122+
123+
class HorizontalItemDecorator(private val divHeight: Int) : RecyclerView.ItemDecoration() {
124+
@Override
125+
override fun getItemOffsets(
126+
outRect: Rect,
127+
view: View,
128+
parent: RecyclerView,
129+
state: RecyclerView.State
130+
) {
131+
super.getItemOffsets(outRect, view, parent, state)
132+
outRect.left = divHeight
133+
outRect.right = divHeight
134+
}
135+
}
136+
137+
private fun setItemDiv() {
138+
binding.rvDailyRoutineAddTheme.addItemDecoration(HorizontalItemDecorator(16))
139+
}
140+
141+
private fun addRoutine() {
142+
binding.btnDailyRoutineAdd.setOnClickListener {
143+
finish()
144+
}
145+
}
146+
147+
private fun backToDailyRoutine() {
148+
binding.ivDailyRoutineAddBack.setOnClickListener {
149+
finish()
150+
}
151+
}
152+
153+
companion object {
154+
const val VIEW_PAGE = 3
155+
const val PADDING_PAGE = 40
156+
const val PADDING_CARD = 0
157+
}
158+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.sopetit.softie.ui.dailyroutine.dailyroutineadd
2+
3+
import android.view.LayoutInflater
4+
import android.view.ViewGroup
5+
import androidx.recyclerview.widget.ListAdapter
6+
import androidx.recyclerview.widget.RecyclerView
7+
import coil.load
8+
import com.sopetit.softie.databinding.ItemDailyRoutineAddCardBinding
9+
import com.sopetit.softie.domain.entity.DailyCard
10+
import com.sopetit.softie.util.ItemDiffCallback
11+
import timber.log.Timber
12+
13+
class DailyRoutineAddCardPagerAdapter :
14+
ListAdapter<DailyCard, DailyRoutineAddCardPagerAdapter.DailyPagerViewHolder>(
15+
ItemDiffCallback<DailyCard>(
16+
onItemsTheSame = { oldItem, newItem -> oldItem.routineId == newItem.routineId },
17+
onContentsTheSame = { oldItem, newItem -> oldItem == newItem }
18+
)
19+
) {
20+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DailyPagerViewHolder {
21+
val binding = ItemDailyRoutineAddCardBinding.inflate(
22+
LayoutInflater.from(parent.context), parent, false
23+
)
24+
return DailyPagerViewHolder(binding)
25+
}
26+
27+
override fun onBindViewHolder(holder: DailyPagerViewHolder, position: Int) {
28+
holder.onBind(currentList[position])
29+
}
30+
31+
class DailyPagerViewHolder(private val binding: ItemDailyRoutineAddCardBinding) :
32+
RecyclerView.ViewHolder(binding.root) {
33+
fun onBind(data: DailyCard) {
34+
binding.tvDailyRoutineAddCard.load(data.backgroundImageUrl)
35+
Timber.d("load Image -> $data")
36+
binding.tvDailyRoutineAddCardName.text = data.content
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)