Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
760a02b
⚡️::calendarView 추가
dobbi030 Mar 18, 2022
7300303
Merge branch 'develop' into feature/13_calendar_xml
dobbi030 Mar 21, 2022
23e466b
⚡️:: 달력 외부 틀 생성
dobbi030 Mar 29, 2022
d66521e
♻️:: 달력 xml 추가
dobbi030 Mar 29, 2022
d8f961c
⚡️:: 달력 Fragment 추가
dobbi030 Mar 29, 2022
90d2666
⚡️:: 달력 안에 약속 리스트 추가
dobbi030 Apr 7, 2022
118e660
⚡️:: 달력 Adapter 추가
dobbi030 Apr 8, 2022
0a2682b
⚡️:: 달력 기능 추가
dobbi030 Apr 12, 2022
0d65a6b
⚡️:: schedule dialog xml 추가
dobbi030 Apr 12, 2022
1b2f990
🔀:: Merge 'develop' into 'feature/13'
dobbi030 Apr 13, 2022
cf94658
🐛:: 병합 오류
dobbi030 Apr 13, 2022
836f7e2
♻️:: Calendar Adapter 수정
dobbi030 Apr 14, 2022
22589ca
⚰️:: 달력 기능 전체 초기화
dobbi030 Apr 14, 2022
d82f2b6
⚡️:: Calendar Recyclerview with ListAdapter, DiffUtil
dobbi030 Apr 14, 2022
68fe4c6
⚡️:: 달력 날짜 표시 기능 추가
dobbi030 Apr 14, 2022
42b731f
⚡️:: 달력 날짜 타입 별 표시 기능 추가
dobbi030 Apr 14, 2022
680942f
♻️:: Calendar 세팅 함수화
dobbi030 Apr 14, 2022
f86f18a
⚡️:: 달 이동 기능 추가
dobbi030 Apr 14, 2022
e2c188c
🐛:: 달력 두 번 출력되던 문제 해결
dobbi030 Apr 14, 2022
e670303
⚡️:: 달력 날짜 선택 기능 추가
dobbi030 Apr 14, 2022
04e5cd5
⚡️:: 달력 날싸 선택 시 스케쥴 나타나는 기능 추가
dobbi030 Apr 15, 2022
b674e50
⚡️:: 스케쥴 선택시 스케쥴 정보 dialog 나타나는 기능 추가
dobbi030 Apr 19, 2022
f913906
♻️:: init mainActivity
dobbi030 Apr 19, 2022
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
3 changes: 3 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,7 @@ dependencies {

implementation(Dependency.BottomNav.NAV_FRAGMENT)
implementation(Dependency.BottomNav.NAV_UI)

implementation("com.github.bumptech.glide:glide:4.13.0")
annotationProcessor("com.github.bumptech.glide:compiler:4.13.0")
}
16 changes: 7 additions & 9 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gsps.gsp_android" >
package="com.gsps.gsp_android">

<!--갤러리 권한-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Expand All @@ -14,21 +14,20 @@
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.GSP_Android" >
android:theme="@style/Theme.GSP_Android">
<activity
android:name=".ui.main.SignUpActivity"
android:exported="false" >
</activity>
android:exported="false" />
<activity
android:name=".ui.main.SubAnnouncementActivity"
android:exported="false" />
<activity
android:name=".ui.main.AnnouncementActivity"
android:exported="false"/>
android:exported="false" />
<activity
android:name=".ui.main.MemberInfoActivity"
android:exported="false" />

<activity
android:name=".ui.main.InterestSettingActivity"
android:exported="false" />
Expand All @@ -48,7 +47,7 @@
android:theme="@style/Theme.MaterialComponents.DayNight.DarkActionBar" />
<activity
android:name=".ui.splash.SplashActivity"
android:exported="true" >
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand All @@ -57,7 +56,6 @@
</activity>
<activity
android:name=".ui.main.MainActivity"
android:exported="false"/>
android:exported="false" />
</application>

</manifest>
120 changes: 120 additions & 0 deletions app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package com.gsps.gsp_android.ui.main

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.gsps.gsp_android.R
import com.gsps.gsp_android.databinding.ItemDayBinding

class CalendarAdapter(val context: Context) :
ListAdapter<CalendarDayModel, RecyclerView.ViewHolder>(CalendarDiffCallback()) {
var lastCheckedPosition = -1

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return CalendarViewHolder(
ItemDayBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is CalendarViewHolder) {
holder.bind(getItem(position))
}
}

fun initCheck() {
lastCheckedPosition = -1
scheduleAdapter.submitList(null)
}

inner class CalendarViewHolder(private val binding: ItemDayBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: CalendarDayModel) {
binding.rbDay.text = item.dayOfMonth.toString()

setVisibility(binding, item)

binding.rbDay.setOnClickListener {
if (lastCheckedPosition == adapterPosition && item.isChecked) {
lastCheckedPosition = -1
item.isChecked = false
} else {
item.isChecked = true
if (lastCheckedPosition != -1) {
getItem(lastCheckedPosition).isChecked = false
setVisibility(binding, getItem(lastCheckedPosition))
notifyItemChanged(lastCheckedPosition)
}
lastCheckedPosition = adapterPosition
}
setVisibility(binding, item)

if (item.dateType == DateType.SELECTED) {
scheduleAdapter.submitList(item.plan)
} else {
scheduleAdapter.submitList(null)
}
}
}

private fun setDateType(item: CalendarDayModel) {
if (item.plan.isEmpty()) item.dateType = DateType.NORMAL
else item.dateType = DateType.PLANNED

if (item.isChecked) item.dateType = DateType.SELECTED

if (item.month == 0) item.dateType = DateType.EMPTY
}

private fun setVisibility(binding: ItemDayBinding, item: CalendarDayModel) {
setDateType(item)

when (item.dateType) {
DateType.EMPTY -> {
binding.rbDay.visibility = View.INVISIBLE
binding.ivPlan.visibility = View.INVISIBLE
}
DateType.NORMAL -> {
binding.rbDay.isChecked = false
binding.rbDay.visibility = View.VISIBLE
binding.ivPlan.visibility = View.INVISIBLE
}
DateType.PLANNED -> {
binding.rbDay.isChecked = false
binding.rbDay.visibility = View.VISIBLE
binding.ivPlan.visibility = View.VISIBLE
binding.ivPlan.setColorFilter(
ContextCompat.getColor(
context,
R.color.main_lighten
)
)
}
DateType.SELECTED -> {
binding.rbDay.isChecked = true
binding.rbDay.visibility = View.VISIBLE
binding.ivPlan.visibility = View.INVISIBLE
}
}
}
}
}

class CalendarDiffCallback : DiffUtil.ItemCallback<CalendarDayModel>() {
override fun areItemsTheSame(oldItem: CalendarDayModel, newItem: CalendarDayModel): Boolean {
return oldItem === newItem
}

override fun areContentsTheSame(oldItem: CalendarDayModel, newItem: CalendarDayModel): Boolean {
return oldItem == newItem
}
}
14 changes: 14 additions & 0 deletions app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.gsps.gsp_android.ui.main

data class CalendarDayModel(
var dateType: DateType = DateType.EMPTY,
var month: Int = 0,
var dayOfMonth: Int = 0,
var plan: MutableList<ScheduleModel> = mutableListOf(),
var isChecked: Boolean = false,
var dayOfWeek: Int = 0
)

enum class DateType {
EMPTY, NORMAL, PLANNED, SELECTED
}
134 changes: 134 additions & 0 deletions app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
package com.gsps.gsp_android.ui.main

import android.graphics.Rect
import android.view.View
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.gsps.gsp_android.R
import com.gsps.gsp_android.databinding.FragmentCalendarBinding
import com.gsps.gsp_android.ui.base.BaseFragment
import com.gsps.gsp_android.utils.DimensionUtils
import java.util.*

lateinit var scheduleAdapter: ScheduleAdapter

class CalendarFragment : BaseFragment<FragmentCalendarBinding>(R.layout.fragment_calendar) {
private val calendarAdapter: CalendarAdapter by lazy { CalendarAdapter(requireContext()) }

override fun initView() {
scheduleAdapter = ScheduleAdapter(requireContext())

binding.dayContainer.apply {
itemAnimator = null
layoutManager = GridLayoutManager(context, 7, GridLayoutManager.VERTICAL, false)
adapter = calendarAdapter
}

binding.scheduleContainer.apply {
itemAnimator = null
layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
adapter = scheduleAdapter
}

var calendar = Calendar.getInstance()

calendar.timeInMillis = System.currentTimeMillis()
calendar.set(Calendar.DAY_OF_MONTH, 1)

val tmpCal = calendar.timeInMillis
calendar.timeInMillis = tmpCal

setCalendar(calendar)

binding.btnLastMonth.setOnClickListener {
calendar = changeCalendar(calendar, -1)
setCalendar(calendar)
}

binding.btnNextMonth.setOnClickListener {
calendar = changeCalendar(calendar, +1)
setCalendar(calendar)
}

binding.tvMonth.setOnClickListener {
calendar.timeInMillis = System.currentTimeMillis()
calendar.set(Calendar.DAY_OF_MONTH, 1)

val tmpCal = calendar.timeInMillis
calendar.timeInMillis = tmpCal

setCalendar(calendar)
}

binding.scheduleContainer.addItemDecoration(object : RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)

val dimension = DimensionUtils()

when (parent.getChildAdapterPosition(view)) {
0 -> {
outRect.top = dimension.dpToPx(context!!, 16f)
outRect.bottom = dimension.dpToPx(context!!, 8f)
}
scheduleAdapter.itemCount - 1 -> {
outRect.top = dimension.dpToPx(context!!, 8f)
outRect.bottom = dimension.dpToPx(context!!, 16f)
}
else -> {
outRect.top = dimension.dpToPx(context!!, 8f)
outRect.bottom = dimension.dpToPx(context!!, 8f)
}
}

if (scheduleAdapter.itemCount == 1) {
outRect.top = dimension.dpToPx(context!!, 16f)
outRect.bottom = dimension.dpToPx(context!!, 16f)
}
}
})
}

private fun changeCalendar(calendar: Calendar, factor: Int): Calendar {
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH) + 1

when (factor) {
-1 -> {
if (month == 1)
calendar.set(year - 1, 11, 1)
else
calendar.set(year, month - 2, 1)
}
+1 -> {
if (month == 12)
calendar.set(year + 1, 0, 1)
else
calendar.set(year, month, 1)
}
}
return calendar
}

private fun setCalendar(calendar: Calendar) {
val maxDate = calendar.getActualMaximum(Calendar.DATE)
val week = calendar.get(Calendar.DAY_OF_WEEK) - 1
val month = calendar.get(Calendar.MONTH) + 1
val list = MutableList(week, init = { CalendarDayModel() })

for (i in 1..maxDate) {
list.add(CalendarDayModel(DateType.NORMAL, month, i))
}

binding.tvMonth.text = "${calendar.get(Calendar.YEAR)}년 ${month}월"

calendarAdapter.initCheck()
calendarAdapter.submitList(list)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,12 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.gsps.gsp_android.databinding.InterestsFullListItemBinding

class InterestsFullListAdapter(
context: Context,
private val itemList: MutableList<MemberModel>
) : RecyclerView.Adapter<InterestsFullListAdapter.InterestsFullListHolder>() {
class InterestsFullListAdapter(context: Context, private val itemList: MutableList<MemberModel>) :
RecyclerView.Adapter<InterestsFullListAdapter.InterestsFullListHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): InterestsFullListAdapter.InterestsFullListHolder {
): InterestsFullListHolder {
val binding =
InterestsFullListItemBinding.inflate(
LayoutInflater.from(parent.context),
Expand All @@ -24,7 +22,7 @@ class InterestsFullListAdapter(
}

override fun onBindViewHolder(
holder: InterestsFullListAdapter.InterestsFullListHolder,
holder: InterestsFullListHolder,
position: Int
) {
holder.bind(itemList[position])
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.gsps.gsp_android.ui.main

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.gsps.gsp_android.R

class MainActivity : AppCompatActivity() {
Expand Down
Loading