Skip to content

Commit

Permalink
Merge pull request #20 from Team-Sopetit/feature/#10-ui-happy-add-vie…
Browse files Browse the repository at this point in the history
…w-list

#10 [ui] 행복루틴 추가하기(목록) 뷰
  • Loading branch information
pump9918 authored Jan 11, 2024
2 parents e29620f + ea1c32e commit 1cc529c
Show file tree
Hide file tree
Showing 21 changed files with 761 additions and 2 deletions.
6 changes: 6 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,19 @@
<activity
android:name=".ui.storytelling.StoryTellingActivity"
android:exported="true"
android:screenOrientation="portrait" />

<activity
android:name=".ui.main.happy.addlist.HappyAddListActivity"
android:exported="true"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

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

data class HappyChip(
val themeId: Int,
val name: String,
)
10 changes: 10 additions & 0 deletions app/src/main/java/com/sopetit/softie/domain/entity/HappyContent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.sopetit.softie.domain.entity

import androidx.annotation.DrawableRes

data class HappyContent(
val routineId: Int,
val title: String,
val content: String,
@DrawableRes val imageUrl: Int,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.sopetit.softie.ui.main.happy.addlist

import android.content.Intent
import android.os.Bundle
import androidx.activity.viewModels
import androidx.recyclerview.widget.RecyclerView
import com.sopetit.softie.R
import com.sopetit.softie.databinding.ActivityHappyAddListBinding
import com.sopetit.softie.domain.entity.HappyContent
import com.sopetit.softie.ui.main.MainActivity
import com.sopetit.softie.util.HorizontalChipItemDecoration
import com.sopetit.softie.util.VerticalItemDecoration
import com.sopetit.softie.util.binding.BindingActivity
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class HappyAddListActivity :
BindingActivity<ActivityHappyAddListBinding>(R.layout.activity_happy_add_list) {

private val viewModel by viewModels<HappyAddListViewModel>()
private lateinit var itemDeco: RecyclerView.ItemDecoration
private lateinit var chipDeco: RecyclerView.ItemDecoration

private var happyAddListChipContentAdapter: HappyAddListChipContentAdapter? = null
private var happyAddListContentAdapter: HappyAddListContentAdapter? = null

private val themeId = 0

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityHappyAddListBinding.inflate(layoutInflater)
setContentView(binding.root)

setChipAdapters()
setBackEnter()
setItemDeco()
setupAdapter(themeId)
}

private fun setChipAdapters() {
happyAddListChipContentAdapter = HappyAddListChipContentAdapter()
happyAddListContentAdapter = HappyAddListContentAdapter(::moveToDetail)
}

private fun setBackEnter() {
binding.ivHappyAddBackArrow.setOnClickListener {
finish()
}
}

private fun setItemDeco() {
itemDeco = VerticalItemDecoration(applicationContext)
binding.rvHappyAddList.addItemDecoration(itemDeco)
chipDeco = HorizontalChipItemDecoration(applicationContext)
binding.rvHappyAddListChip.addItemDecoration(chipDeco)
}

private fun setupAdapter(themeId: Int) {
with(binding) {
rvHappyAddListChip.adapter = happyAddListChipContentAdapter
rvHappyAddList.adapter = happyAddListContentAdapter
}
happyAddListChipContentAdapter?.submitList(viewModel.mockHappyChipList.value)
happyAddListContentAdapter?.submitList(viewModel.mockHappyContentList.value)

happyAddListChipContentAdapter?.setOnChipClickListener { handleChipClick(it.themeId) }
}

private fun handleChipClick(themeId: Int) {
val listToSubmit = when (themeId) {
1 -> viewModel.mockHappyContentList.value
2 -> viewModel.mockHappyContentListOne.value
3 -> viewModel.mockHappyContentListTwo.value
4 -> viewModel.mockHappyContentListThree.value
5 -> viewModel.mockHappyContentListFour.value
6 -> viewModel.mockHappyContentListFive.value
else -> viewModel.mockHappyContentList.value
}

listToSubmit?.let { makeSubmitList(it) }
}

private fun makeSubmitList(list: List<HappyContent>) {
happyAddListContentAdapter?.submitList(list)
}

private fun moveToDetail(id: Int) {
Intent(this, MainActivity::class.java).apply {
putExtra(ID, id)
startActivity(this)
}
}

companion object {
const val ID = "id"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.sopetit.softie.ui.main.happy.addlist

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.sopetit.softie.databinding.ItemHappyAddListChipBinding
import com.sopetit.softie.domain.entity.HappyChip
import com.sopetit.softie.util.ItemDiffCallback

class HappyAddListChipContentAdapter :
ListAdapter<HappyChip, HappyAddListChipContentAdapter.HappyAddListChipContentViewHolder>(
ItemDiffCallback<HappyChip>(
onItemsTheSame = { oldItem, newItem -> oldItem.themeId == newItem.themeId },
onContentsTheSame = { oldItem, newItem -> oldItem == newItem }
)
) {
private val selectedPositions = HashSet<Int>()
private var onItemClickListener: ((HappyChip) -> Unit)? = null

inner class HappyAddListChipContentViewHolder(
private val binding: ItemHappyAddListChipBinding,
) : RecyclerView.ViewHolder(binding.root) {
fun onBind(data: HappyChip) {
binding.itemHappyAddChipComponent.text = data.name
binding.itemHappyAddChipComponent.isChecked = isSelected(adapterPosition)

binding.root.setOnClickListener {
chipCurrentSelection(adapterPosition)
notifyDataSetChanged()
onItemClickListener?.let { it(data) }
}
}
}

private fun isSelected(position: Int) = selectedPositions.contains(position)

private fun chipCurrentSelection(position: Int) {
if (isSelected(position)) {
selectedPositions.remove(position)
} else {
selectedPositions.clear()
selectedPositions.add(position)
}
}

fun setOnChipClickListener(listener: (HappyChip) -> Unit) {
onItemClickListener = listener
}

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

override fun onBindViewHolder(holder: HappyAddListChipContentViewHolder, position: Int) {
holder.onBind(getItem(position))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.sopetit.softie.ui.main.happy.addlist

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.sopetit.softie.databinding.ItemHappyAddListBinding
import com.sopetit.softie.domain.entity.HappyContent
import com.sopetit.softie.util.ItemDiffCallback

class HappyAddListContentAdapter(private val moveToDetail: (Int) -> Unit) :
ListAdapter<HappyContent, HappyAddListContentAdapter.HappyAddListContentViewHolder>(
ItemDiffCallback<HappyContent>(
onItemsTheSame = { oldItem, newItem -> oldItem == newItem },
onContentsTheSame = { oldItem, newItem -> oldItem == newItem }
)
) {

inner class HappyAddListContentViewHolder(
private val binding: ItemHappyAddListBinding,
private val moveToDetail: (Int) -> Unit,
) :
RecyclerView.ViewHolder(binding.root) {
fun onBind(data: HappyContent) {
binding.tvHappyListItemTitle.text = data.title
binding.tvHappyListItemContent.text = data.content
binding.ivHappyListItemIcon.setImageResource(data.imageUrl)

binding.root.setOnClickListener {
moveToDetail(data.routineId)
}
}
}

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

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

0 comments on commit 1cc529c

Please sign in to comment.