Skip to content

Commit

Permalink
[MERGE] #11 -> develop
Browse files Browse the repository at this point in the history
[UI/#11] OurTodo / 투두 리스트 제외 UI & 기능 구현
  • Loading branch information
Marchbreeze authored Jan 7, 2024
2 parents 3aee068 + 02a337f commit 9aad080
Show file tree
Hide file tree
Showing 39 changed files with 1,014 additions and 1 deletion.
8 changes: 7 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,15 @@
</intent-filter>
</activity>

<activity
android:name="com.going.presentation.todo.TodoActivity"
android:exported="false"
android:screenOrientation="portrait" />

<activity
android:name="com.going.presentation.onboarding.OnboardingProfileSettingActivity"
android:exported="false" />
android:exported="false"
android:screenOrientation="portrait" />

<activity
android:name="com.going.presentation.tendencytest.TendencyTestSplashActivity"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.going.domain.entity.response

data class TripParticipantsListModel(
val participant: List<TripParticipantModel>,
val styleA: Int,
val styleB: Int,
val styleC: Int,
val styleD: Int,
val styleE: Int,
) {
data class TripParticipantModel(
val participantId: Long,
val name: String,
val result: Int
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.going.presentation.todo

import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
import androidx.fragment.app.replace
import com.going.presentation.R
import com.going.presentation.databinding.ActivityTodoBinding
import com.going.presentation.todo.mytodo.MyTodoFragment
import com.going.presentation.todo.ourtodo.OurTodoFragment
import com.going.ui.base.BaseActivity
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class TodoActivity() : BaseActivity<ActivityTodoBinding>(R.layout.activity_todo) {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

initBnvItemIconTintList()
initBnvItemSelectedListener()
}

private fun initBnvItemIconTintList() {
binding.bnvTodo.itemIconTintList = null
binding.bnvTodo.selectedItemId = R.id.menu_our_todo
}

private fun initBnvItemSelectedListener() {
supportFragmentManager.findFragmentById(R.id.fcv_todo) ?: navigateTo<OurTodoFragment>()

binding.bnvTodo.setOnItemSelectedListener { menu ->
when (menu.itemId) {
R.id.menu_our_todo -> navigateTo<OurTodoFragment>()

R.id.menu_my_todo -> navigateTo<MyTodoFragment>()

else -> return@setOnItemSelectedListener false
}
true
}
}

private inline fun <reified T : Fragment> navigateTo() {
supportFragmentManager.commit {
replace<T>(R.id.fcv_todo, T::class.java.canonicalName)
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
package com.going.presentation.todo.mytodo

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.going.presentation.todo.mytodo

import android.os.Bundle
import android.view.View
import com.going.presentation.R
import com.going.presentation.databinding.FragmentMyTodoBinding
import com.going.ui.base.BaseFragment
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MyTodoFragment() : BaseFragment<FragmentMyTodoBinding>(R.layout.fragment_my_todo) {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
package com.going.presentation.todo.mytodo

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
package com.going.presentation.todo.mytodo

Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.going.presentation.todo.ourtodo

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
import com.going.domain.entity.response.TripParticipantsListModel.TripParticipantModel
import com.going.presentation.databinding.ItemTodoFriendsBinding
import com.going.ui.extension.ItemDiffCallback

class OurTodoAdapter : ListAdapter<TripParticipantModel, OurTodoViewHolder>(diffUtil) {

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

override fun onBindViewHolder(holder: OurTodoViewHolder, position: Int) {
holder.onBind(getItem(position))
}

fun addList(newItems: List<TripParticipantModel>) {
val currentItems = currentList.toMutableList()
currentItems.addAll(newItems)
submitList(currentItems)
}

companion object {
private val diffUtil = ItemDiffCallback<TripParticipantModel>(
onItemsTheSame = { old, new -> old.participantId == new.participantId },
onContentsTheSame = { old, new -> old == new },
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.going.presentation.todo.ourtodo

import android.os.Bundle
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.style.ForegroundColorSpan
import android.view.View
import androidx.core.content.ContextCompat
import androidx.fragment.app.activityViewModels
import com.going.presentation.R
import com.going.presentation.databinding.FragmentOurTodoBinding
import com.going.presentation.todo.ourtodo.todolist.OurTodoViewPagerAdapter
import com.going.ui.base.BaseFragment
import com.google.android.material.tabs.TabLayoutMediator
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class OurTodoFragment() : BaseFragment<FragmentOurTodoBinding>(R.layout.fragment_our_todo) {

private val tabTextList = listOf(TAB_UNCOMPLETE, TAB_COMPLETE)

private var _adapter: OurTodoAdapter? = null
private val adapter
get() = requireNotNull(_adapter) { getString(R.string.adapter_not_initialized_error_msg) }

private val viewModel by activityViewModels<OurTodoViewModel>()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

initAdapter()
setDateTextColor()
setProgressBarStatus()
setTabLayout()
setViewPager()
}

private fun initAdapter() {
_adapter = OurTodoAdapter()
binding.rvOurTripFriend.adapter = adapter
adapter.submitList(viewModel.mockParticipantsList)
}

private fun setDateTextColor() {
binding.tvOurTodoTitleDown.apply {
text = SpannableStringBuilder(text).apply {
setSpan(
ForegroundColorSpan(
ContextCompat.getColor(
requireContext(), R.color.red_500
)
), 6, length - 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
}
}

private fun setProgressBarStatus() {
binding.progressBarOurTodo.progress = 40
}

private fun setTabLayout() {
binding.tabOurTodo.apply {
for (tabName in tabTextList) {
val tab = this.newTab()
tab.text = tabName
this.addTab(tab)
}
}
}

private fun setViewPager() {
binding.vpOurTodo.adapter = OurTodoViewPagerAdapter(this)
TabLayoutMediator(binding.tabOurTodo, binding.vpOurTodo) { tab, pos ->
tab.text = tabTextList[pos]
}.attach()
}

override fun onDestroyView() {
super.onDestroyView()
_adapter = null
}

companion object {
const val TAB_UNCOMPLETE = "미완료 todo"
const val TAB_COMPLETE = "완료 todo"
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.going.presentation.todo.ourtodo

import androidx.recyclerview.widget.RecyclerView
import coil.load
import coil.transform.CircleCropTransformation
import com.going.domain.entity.response.TripParticipantsListModel.TripParticipantModel
import com.going.presentation.R
import com.going.presentation.databinding.ItemTodoFriendsBinding

class OurTodoViewHolder(val binding: ItemTodoFriendsBinding) : RecyclerView.ViewHolder(binding.root) {

fun onBind(item: TripParticipantModel) {
binding.run {
tvTodoFriend.text = item.name
ivTodoFriend.load(R.drawable.ic_todo_friend) {
transformations(CircleCropTransformation())
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.going.presentation.todo.ourtodo

import androidx.lifecycle.ViewModel
import com.going.domain.entity.response.TripParticipantsListModel.TripParticipantModel

// @HiltViewModel
class OurTodoViewModel : ViewModel() {

val mockParticipantsList: List<TripParticipantModel> = listOf(
TripParticipantModel(0, "일지민", 100),
TripParticipantModel(1, "이지민", 100),
TripParticipantModel(2, "삼지민", 100),
TripParticipantModel(3, "사지민", 100),
TripParticipantModel(4, "오지민", 100),
TripParticipantModel(5, "육지민", 100),
TripParticipantModel(6, "칠지민", 100)
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.going.presentation.todo.ourtodo.todolist

import com.going.presentation.R
import com.going.presentation.databinding.FragmentOurTodoCompleteBinding
import com.going.ui.base.BaseFragment
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class OurTodoCompleteFragment() :
BaseFragment<FragmentOurTodoCompleteBinding>(R.layout.fragment_our_todo_complete) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.going.presentation.todo.ourtodo.todolist

import com.going.presentation.R
import com.going.presentation.databinding.FragmentOurTodoUncompleteBinding
import com.going.ui.base.BaseFragment
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class OurTodoUncompleteFragment() :
BaseFragment<FragmentOurTodoUncompleteBinding>(R.layout.fragment_our_todo_uncomplete) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.going.presentation.todo.ourtodo.todolist

import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter

class OurTodoViewPagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {

override fun getItemCount(): Int = 2

override fun createFragment(position: Int): Fragment {
return when (position) {
0 -> OurTodoUncompleteFragment()
else -> OurTodoCompleteFragment()
}
}
}
9 changes: 9 additions & 0 deletions presentation/src/main/res/drawable/ic_back.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="48dp"
android:height="48dp"
android:viewportWidth="48"
android:viewportHeight="48">
<path
android:pathData="M32,23.3C32,23.134 31.866,23 31.7,23H20.554C20.287,23 20.153,22.677 20.342,22.488L25.207,17.623C25.325,17.505 25.324,17.315 25.206,17.198L24.212,16.211C24.095,16.094 23.906,16.094 23.789,16.211L16.212,23.788C16.095,23.905 16.095,24.095 16.212,24.212L23.788,31.788C23.905,31.905 24.095,31.905 24.212,31.788L25.198,30.802C25.315,30.685 25.315,30.495 25.198,30.378L20.341,25.512C20.152,25.323 20.286,25 20.553,25H31.7C31.866,25 32,24.866 32,24.7V23.3Z"
android:fillColor="#4A4D63"/>
</vector>
10 changes: 10 additions & 0 deletions presentation/src/main/res/drawable/ic_calendar.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="12dp"
android:height="13dp"
android:viewportWidth="12"
android:viewportHeight="13">
<path
android:pathData="M3.231,0.5C3.486,0.5 3.692,0.707 3.692,0.962V1.423H8.308V0.962C8.308,0.707 8.514,0.5 8.769,0.5C9.024,0.5 9.231,0.707 9.231,0.962V1.423H10.615C11.38,1.423 12,2.043 12,2.808V11.115C12,11.88 11.38,12.5 10.615,12.5H1.385C0.62,12.5 0,11.88 0,11.115V2.808C0,2.043 0.62,1.423 1.385,1.423H2.769V0.962C2.769,0.707 2.976,0.5 3.231,0.5ZM8.308,2.346V2.808C8.308,3.063 8.514,3.269 8.769,3.269C9.024,3.269 9.231,3.063 9.231,2.808V2.346H10.615C10.87,2.346 11.077,2.553 11.077,2.808V4.192H0.923V2.808C0.923,2.553 1.13,2.346 1.385,2.346H2.769V2.808C2.769,3.063 2.976,3.269 3.231,3.269C3.486,3.269 3.692,3.063 3.692,2.808V2.346H8.308ZM0.923,5.115V11.115C0.923,11.37 1.13,11.577 1.385,11.577H10.615C10.87,11.577 11.077,11.37 11.077,11.115V5.115H0.923ZM5.538,6.5C5.538,6.245 5.745,6.038 6,6.038C6.255,6.038 6.462,6.245 6.462,6.5C6.462,6.755 6.255,6.962 6,6.962C5.745,6.962 5.538,6.755 5.538,6.5ZM7.846,6.038C7.591,6.038 7.385,6.245 7.385,6.5C7.385,6.755 7.591,6.962 7.846,6.962C8.101,6.962 8.308,6.755 8.308,6.5C8.308,6.245 8.101,6.038 7.846,6.038ZM9.231,6.5C9.231,6.245 9.437,6.038 9.692,6.038C9.947,6.038 10.154,6.245 10.154,6.5C10.154,6.755 9.947,6.962 9.692,6.962C9.437,6.962 9.231,6.755 9.231,6.5ZM9.692,7.885C9.437,7.885 9.231,8.091 9.231,8.346C9.231,8.601 9.437,8.808 9.692,8.808C9.947,8.808 10.154,8.601 10.154,8.346C10.154,8.091 9.947,7.885 9.692,7.885ZM7.385,8.346C7.385,8.091 7.591,7.885 7.846,7.885C8.101,7.885 8.308,8.091 8.308,8.346C8.308,8.601 8.101,8.808 7.846,8.808C7.591,8.808 7.385,8.601 7.385,8.346ZM6,7.885C5.745,7.885 5.538,8.091 5.538,8.346C5.538,8.601 5.745,8.808 6,8.808C6.255,8.808 6.462,8.601 6.462,8.346C6.462,8.091 6.255,7.885 6,7.885ZM3.692,8.346C3.692,8.091 3.899,7.885 4.154,7.885C4.409,7.885 4.615,8.091 4.615,8.346C4.615,8.601 4.409,8.808 4.154,8.808C3.899,8.808 3.692,8.601 3.692,8.346ZM2.308,7.885C2.053,7.885 1.846,8.091 1.846,8.346C1.846,8.601 2.053,8.808 2.308,8.808C2.563,8.808 2.769,8.601 2.769,8.346C2.769,8.091 2.563,7.885 2.308,7.885ZM1.846,10.192C1.846,9.937 2.053,9.731 2.308,9.731C2.563,9.731 2.769,9.937 2.769,10.192C2.769,10.447 2.563,10.654 2.308,10.654C2.053,10.654 1.846,10.447 1.846,10.192ZM4.154,9.731C3.899,9.731 3.692,9.937 3.692,10.192C3.692,10.447 3.899,10.654 4.154,10.654C4.409,10.654 4.615,10.447 4.615,10.192C4.615,9.937 4.409,9.731 4.154,9.731ZM5.538,10.192C5.538,9.937 5.745,9.731 6,9.731C6.255,9.731 6.462,9.937 6.462,10.192C6.462,10.447 6.255,10.654 6,10.654C5.745,10.654 5.538,10.447 5.538,10.192ZM7.846,9.731C7.591,9.731 7.385,9.937 7.385,10.192C7.385,10.447 7.591,10.654 7.846,10.654C8.101,10.654 8.308,10.447 8.308,10.192C8.308,9.937 8.101,9.731 7.846,9.731Z"
android:fillColor="#9093A8"
android:fillType="evenOdd"/>
</vector>
10 changes: 10 additions & 0 deletions presentation/src/main/res/drawable/ic_enter.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="18dp"
android:viewportWidth="18"
android:viewportHeight="18">
<path
android:pathData="M7.068,12.475C7.029,12.432 7.029,12.366 7.068,12.324L10.005,9.075C10.043,9.033 10.043,8.967 10.005,8.925L7.068,5.676C7.029,5.633 7.029,5.568 7.068,5.525L7.46,5.092C7.504,5.043 7.582,5.043 7.627,5.092L10.887,8.7C11.038,8.865 11.038,9.135 10.887,9.3L7.627,12.908C7.582,12.957 7.504,12.957 7.46,12.908L7.068,12.475Z"
android:fillColor="#1D1F29"
android:fillType="evenOdd"/>
</vector>
9 changes: 9 additions & 0 deletions presentation/src/main/res/drawable/ic_plus.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="14dp"
android:height="14dp"
android:viewportWidth="14"
android:viewportHeight="14">
<path
android:pathData="M5.951,14V8.057H0V6.004H5.951V0H8.175V6.004H14V8.057H8.175V14H5.951Z"
android:fillColor="#ffffff"/>
</vector>
21 changes: 21 additions & 0 deletions presentation/src/main/res/drawable/ic_todo_add_background.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="90dp"
android:height="74dp"
android:viewportWidth="90"
android:viewportHeight="74">
<path
android:pathData="M0,0h90v74h-90z">
<aapt:attr name="android:fillColor">
<gradient
android:startX="31.5"
android:startY="74"
android:endX="1"
android:endY="74"
android:type="linear">
<item android:offset="0" android:color="#FFFFFFFF"/>
<item android:offset="1" android:color="#00FFFFFF"/>
</gradient>
</aapt:attr>
</path>
</vector>
Loading

0 comments on commit 9aad080

Please sign in to comment.