Skip to content

Commit

Permalink
Merge pull request #18 from Team-Sopetit/feature/#8-add-daily-routine
Browse files Browse the repository at this point in the history
#8 [ui] Daily Routine - 추가하기
  • Loading branch information
minemi00 authored Jan 14, 2024
2 parents affb3f6 + dea9844 commit 8a0d24e
Show file tree
Hide file tree
Showing 24 changed files with 1,288 additions and 15 deletions.
5 changes: 5 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@
</intent-filter>
</activity>

<activity
android:name=".ui.dailyroutine.dailyroutineadd.DailyRoutineAddActivity"
android:exported="false"
android:screenOrientation="portrait" />

<activity
android:name=".ui.happyroutine.addlist.HappyAddListActivity"
android:exported="false"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.sopetit.softie.domain.entity

data class DailyCard(
val backgroundImageUrl: String,
val routineId: Int,
val content: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.sopetit.softie.domain.entity

data class DailyRoutineAdd(
val themeId: Int,
val dailyRoutineCardList: List<DailyCard>
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ data class Theme(
val themeId: Int,
val name: String,
val iconImageUrl: String,
val backgroudnImageUrl: String
val backgroundImageUrl: String
)
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.sopetit.softie.ui.dailyroutine

import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.fragment.app.viewModels
import com.sopetit.softie.R
import com.sopetit.softie.databinding.FragmentDailyRoutineBinding
import com.sopetit.softie.ui.dailyroutine.dailyroutineadd.DailyRoutineAddActivity
import com.sopetit.softie.util.OriginalBottomSheet.Companion.BOTTOM_SHEET_TAG
import com.sopetit.softie.util.binding.BindingBottomSheet
import com.sopetit.softie.util.binding.BindingFragment
Expand All @@ -24,6 +26,7 @@ class DailyRoutineFragment :

binding.viewModel = viewModel

moveToAddRoutine()
initSetDailyRoutineContent()
initSetDeleteView()
initSetRoutineDelete()
Expand All @@ -43,12 +46,6 @@ class DailyRoutineFragment :
btnDailyRoutineYetFinSecond,
1
)
routineItemView(
tvDailyRoutineAddNameThird,
tvDailyRoutineIngThird,
btnDailyRoutineYetFinThird,
2
)
}
}

Expand Down Expand Up @@ -121,7 +118,6 @@ class DailyRoutineFragment :
with(binding) {
changeBtnSelectState(btnDailyRoutineRadioFirst, routineList[0].routineId)
changeBtnSelectState(btnDailyRoutineRadioSecond, routineList[1].routineId)
changeBtnSelectState(btnDailyRoutineRadioThird, routineList[2].routineId)
}
}
}
Expand Down Expand Up @@ -176,4 +172,11 @@ class DailyRoutineFragment :
}
}
}

private fun moveToAddRoutine() {
binding.ivDailyRoutineEmpty.setOnClickListener {
val intent = Intent(requireContext(), DailyRoutineAddActivity::class.java)
startActivity(intent)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,6 @@ class DailyRoutineViewModel : ViewModel() {
"",
5,
false
),
DailyRoutine(
3,
"이불 개기",
"",
10,
true
)
)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
package com.sopetit.softie.ui.dailyroutine.dailyroutineadd

import android.graphics.Rect
import android.os.Bundle
import android.view.View
import androidx.activity.viewModels
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.CompositePageTransformer
import androidx.viewpager2.widget.MarginPageTransformer
import androidx.viewpager2.widget.ViewPager2
import com.sopetit.softie.R
import com.sopetit.softie.databinding.ActivityDailyRoutineAddBinding
import com.sopetit.softie.domain.entity.Theme
import com.sopetit.softie.util.binding.BindingActivity

class DailyRoutineAddActivity :
BindingActivity<ActivityDailyRoutineAddBinding>(R.layout.activity_daily_routine_add) {
private lateinit var viewPager: ViewPager2
private lateinit var dailyRoutineAddCardPagerAdapter: DailyRoutineAddCardPagerAdapter
private lateinit var dailyRoutineAddThemeAdapter: DailyRoutineAddThemeAdapter

private val dailyRoutineAddViewModel by viewModels<DailyRoutineAddViewModel>()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewPager = binding.vpDailyRoutineAddCard
binding.viewModel = dailyRoutineAddViewModel

setupAdapter()
setViewPager()
setupList()
setIndicator()
setItemDiv()
initPagerDiv(0, 90)
addClickListener()
}

private fun addClickListener() {
addRoutine()
backToDailyRoutine()
}

private fun setupAdapter() {
with(binding) {
dailyRoutineAddCardPagerAdapter = DailyRoutineAddCardPagerAdapter()
vpDailyRoutineAddCard.adapter = dailyRoutineAddCardPagerAdapter
dailyRoutineAddThemeAdapter = DailyRoutineAddThemeAdapter().apply {
setOnItemClickListener(object : DailyRoutineAddThemeAdapter.OnItemClickListener {
override fun onItemClick(item: Theme, position: Int) {
setRoutineList(item.themeId)
}
})
}
rvDailyRoutineAddTheme.adapter = dailyRoutineAddThemeAdapter
}
}

private fun setupList() {
dailyRoutineAddViewModel.mockThemeList.observe(this) {
dailyRoutineAddCardPagerAdapter.submitList(dailyRoutineAddViewModel.startNewDayCardList.value)
dailyRoutineAddThemeAdapter.submitList(dailyRoutineAddViewModel.mockThemeList.value)
}
}

private fun setRoutineList(themeId: Int) {
dailyRoutineAddCardPagerAdapter.submitList(
dailyRoutineAddViewModel.getDailyCardListForId(themeId)[0].dailyRoutineCardList
)
}

private fun initPagerDiv(previewWidth: Int, itemMargin: Int) {
val decoMargin = previewWidth + itemMargin
val pageTransX = decoMargin + previewWidth
val decoration = PageDecoration(decoMargin)

binding.vpDailyRoutineAddCard.also {
it.offscreenPageLimit = VIEW_PAGE.toInt()
it.addItemDecoration(decoration)
it.setPageTransformer { page, position ->
page.translationX = position * -pageTransX
}
}
}

private fun setViewPager() {
with(binding.vpDailyRoutineAddCard) {
adapter = dailyRoutineAddCardPagerAdapter
offscreenPageLimit = VIEW_PAGE.toInt()

val dpValue = PADDING_PAGE
val margin = (dpValue * resources.displayMetrics.density).toInt()
setPadding(margin, PADDING_CARD, margin, PADDING_CARD)

setPageTransformer(
CompositePageTransformer().apply {
addTransformer(
MarginPageTransformer(
resources.getDimensionPixelOffset(R.dimen.viewpager_margin)
)
)
}
)
}
}

private fun setIndicator() {
binding.diDailyRoutineAddIndicator.attachTo(binding.vpDailyRoutineAddCard)
}

private class PageDecoration(private val margin: Int) : RecyclerView.ItemDecoration() {

override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
outRect.left = margin
outRect.right = margin
}
}

class HorizontalItemDecorator(private val divHeight: Int) : RecyclerView.ItemDecoration() {
@Override
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
outRect.left = divHeight
outRect.right = divHeight
}
}

private fun setItemDiv() {
binding.rvDailyRoutineAddTheme.addItemDecoration(HorizontalItemDecorator(16))
}

private fun addRoutine() {
binding.btnDailyRoutineAdd.setOnClickListener {
finish()
}
}

private fun backToDailyRoutine() {
binding.ivDailyRoutineAddBack.setOnClickListener {
finish()
}
}

companion object {
const val VIEW_PAGE = 3
const val PADDING_PAGE = 40
const val PADDING_CARD = 0
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.sopetit.softie.ui.dailyroutine.dailyroutineadd

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.sopetit.softie.databinding.ItemDailyRoutineAddCardBinding
import com.sopetit.softie.domain.entity.DailyCard
import com.sopetit.softie.util.ItemDiffCallback
import timber.log.Timber

class DailyRoutineAddCardPagerAdapter :
ListAdapter<DailyCard, DailyRoutineAddCardPagerAdapter.DailyPagerViewHolder>(
ItemDiffCallback<DailyCard>(
onItemsTheSame = { oldItem, newItem -> oldItem.routineId == newItem.routineId },
onContentsTheSame = { oldItem, newItem -> oldItem == newItem }
)
) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DailyPagerViewHolder {
val binding = ItemDailyRoutineAddCardBinding.inflate(
LayoutInflater.from(parent.context), parent, false
)
return DailyPagerViewHolder(binding)
}

override fun onBindViewHolder(holder: DailyPagerViewHolder, position: Int) {
holder.onBind(currentList[position])
}

class DailyPagerViewHolder(private val binding: ItemDailyRoutineAddCardBinding) :
RecyclerView.ViewHolder(binding.root) {
fun onBind(data: DailyCard) {
binding.tvDailyRoutineAddCard.load(data.backgroundImageUrl)
Timber.d("load Image -> $data")
binding.tvDailyRoutineAddCardName.text = data.content
}
}
}
Loading

0 comments on commit 8a0d24e

Please sign in to comment.