From 760a02b76507658e6f0bf69cc1f9eeb00505c13d Mon Sep 17 00:00:00 2001 From: river_is_line Date: Fri, 18 Mar 2022 15:52:05 +0900 Subject: [PATCH 01/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::calendarView=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gsps/gsp_android/ui/main/CalendarActivity.kt | 11 +++++++++++ app/src/main/res/layout/activity_calendar.xml | 9 +++++++++ 2 files changed, 20 insertions(+) create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/CalendarActivity.kt create mode 100644 app/src/main/res/layout/activity_calendar.xml diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarActivity.kt new file mode 100644 index 0000000..960a2ed --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarActivity.kt @@ -0,0 +1,11 @@ +package com.gsps.gsp_android.ui.main + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle + +class CalendarActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_calendar) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_calendar.xml b/app/src/main/res/layout/activity_calendar.xml new file mode 100644 index 0000000..6983fde --- /dev/null +++ b/app/src/main/res/layout/activity_calendar.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file From 23e466b43222a392a86b7d788fce819fbe9a582f Mon Sep 17 00:00:00 2001 From: river_is_line Date: Tue, 29 Mar 2022 20:37:13 +0900 Subject: [PATCH 02/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EB=8B=AC=EB=A0=A5?= =?UTF-8?q?=20=EC=99=B8=EB=B6=80=20=ED=8B=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsp_android/ui/main/CalendarFragment.kt | 11 + app/src/main/res/layout/fragment_calendar.xml | 191 ++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 203 insertions(+) create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt create mode 100644 app/src/main/res/layout/fragment_calendar.xml diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt new file mode 100644 index 0000000..4f97c06 --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -0,0 +1,11 @@ +package com.gsps.gsp_android.ui.main + +import com.gsps.gsp_android.R +import com.gsps.gsp_android.databinding.FragmentCalendarBinding +import com.gsps.gsp_android.ui.base.BaseFragment + +class CalendarFragment : BaseFragment(R.layout.fragment_calendar) { + override fun initView() { + + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml new file mode 100644 index 0000000..97526d1 --- /dev/null +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 172328c..73dbabd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,4 +7,5 @@ 비밀번호 찾기 이메일로 가입하기 아이디 형식이 잘못되었습니다 + 일정 \ No newline at end of file From d66521e1196d95231a994b8c5f5232d6761d4c51 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Tue, 29 Mar 2022 22:13:43 +0900 Subject: [PATCH 03/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F::=20=EB=8B=AC=EB=A0=A5?= =?UTF-8?q?=20xml=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/circle.xml | 8 ++++ .../rounded_corner_dark_gray_stroke.xml | 4 +- app/src/main/res/layout/activity_calendar.xml | 9 ---- app/src/main/res/layout/item_day.xml | 41 +++++++++++++++++++ app/src/main/res/layout/item_day_empty.xml | 17 ++++++++ 5 files changed, 68 insertions(+), 11 deletions(-) create mode 100644 app/src/main/res/drawable/circle.xml delete mode 100644 app/src/main/res/layout/activity_calendar.xml create mode 100644 app/src/main/res/layout/item_day.xml create mode 100644 app/src/main/res/layout/item_day_empty.xml diff --git a/app/src/main/res/drawable/circle.xml b/app/src/main/res/drawable/circle.xml new file mode 100644 index 0000000..9915a0b --- /dev/null +++ b/app/src/main/res/drawable/circle.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rounded_corner_dark_gray_stroke.xml b/app/src/main/res/drawable/rounded_corner_dark_gray_stroke.xml index bcb0a27..4632b95 100644 --- a/app/src/main/res/drawable/rounded_corner_dark_gray_stroke.xml +++ b/app/src/main/res/drawable/rounded_corner_dark_gray_stroke.xml @@ -1,6 +1,6 @@ - - android:shape="rectangle" > + - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_day.xml b/app/src/main/res/layout/item_day.xml new file mode 100644 index 0000000..08538ab --- /dev/null +++ b/app/src/main/res/layout/item_day.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_day_empty.xml b/app/src/main/res/layout/item_day_empty.xml new file mode 100644 index 0000000..80f174d --- /dev/null +++ b/app/src/main/res/layout/item_day_empty.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file From d8f961ca826a66b43ba6cab5bd237617c6f79eff Mon Sep 17 00:00:00 2001 From: river_is_line Date: Tue, 29 Mar 2022 22:14:16 +0900 Subject: [PATCH 04/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EB=8B=AC=EB=A0=A5?= =?UTF-8?q?=20Fragment=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsp_android/ui/main/CalendarActivity.kt | 11 ------- .../gsp_android/ui/main/CalendarAdapter.kt | 32 +++++++++++++++++++ .../gsp_android/ui/main/CalendarDayModel.kt | 8 +++++ .../com/gsps/gsp_android/ui/main/PlanModel.kt | 12 +++++++ 4 files changed, 52 insertions(+), 11 deletions(-) delete mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/CalendarActivity.kt create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/PlanModel.kt diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarActivity.kt deleted file mode 100644 index 960a2ed..0000000 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarActivity.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.gsps.gsp_android.ui.main - -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle - -class CalendarActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_calendar) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt new file mode 100644 index 0000000..47a4cef --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt @@ -0,0 +1,32 @@ +package com.gsps.gsp_android.ui.main + +import android.content.Context +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.gsps.gsp_android.databinding.ItemDayBinding +import com.gsps.gsp_android.databinding.ItemDayEmptyBinding + +class CalendarAdapter(context: Context, private val itemList: MutableList): RecyclerView.Adapter() { + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): RecyclerView.ViewHolder { + TODO("Not yet implemented") + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + TODO("Not yet implemented") + } + + override fun getItemCount(): Int { + return itemList.size + } + + class DayViewHolder(var binding: ItemDayBinding) { + + } + + class EmptyViewHolder(var binding: ItemDayEmptyBinding){ + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt new file mode 100644 index 0000000..bd9c41e --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt @@ -0,0 +1,8 @@ +package com.gsps.gsp_android.ui.main + +import java.time.LocalDate + +data class CalendarDayModel( + val date: LocalDate, + val plan: MutableList +) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/PlanModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/PlanModel.kt new file mode 100644 index 0000000..87a652b --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/PlanModel.kt @@ -0,0 +1,12 @@ +package com.gsps.gsp_android.ui.main + +import java.time.LocalDate +import java.time.LocalTime + +data class PlanModel( + val date: LocalDate, + val time: LocalTime, + val info: String, + val proposalCompanyId: Int, + val participantCompanyId: Int +) From 90d2666b92f37d701b53659ddc12c007453afc13 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Thu, 7 Apr 2022 20:14:04 +0900 Subject: [PATCH 05/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EB=8B=AC=EB=A0=A5?= =?UTF-8?q?=20=EC=95=88=EC=97=90=20=EC=95=BD=EC=86=8D=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsp_android/ui/main/CalendarAdapter.kt | 9 -- app/src/main/res/layout/fragment_calendar.xml | 31 ++++--- app/src/main/res/layout/item_day.xml | 21 +++-- app/src/main/res/layout/item_day_selected.xml | 36 ++++++++ app/src/main/res/layout/item_schedule.xml | 86 +++++++++++++++++++ 5 files changed, 154 insertions(+), 29 deletions(-) create mode 100644 app/src/main/res/layout/item_day_selected.xml create mode 100644 app/src/main/res/layout/item_schedule.xml diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt index 47a4cef..139e739 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt @@ -3,8 +3,6 @@ package com.gsps.gsp_android.ui.main import android.content.Context import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.gsps.gsp_android.databinding.ItemDayBinding -import com.gsps.gsp_android.databinding.ItemDayEmptyBinding class CalendarAdapter(context: Context, private val itemList: MutableList): RecyclerView.Adapter() { override fun onCreateViewHolder( @@ -22,11 +20,4 @@ class CalendarAdapter(context: Context, private val itemList: MutableList - + - @@ -172,20 +172,29 @@ android:textSize="16sp" /> - + android:layout_width="0dp" + android:layout_height="0.5dp" + android:layout_marginTop="15dp" + android:background="@color/medium_gray" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/llDayOfWeek" /> - + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_day.xml b/app/src/main/res/layout/item_day.xml index 08538ab..f9adbcf 100644 --- a/app/src/main/res/layout/item_day.xml +++ b/app/src/main/res/layout/item_day.xml @@ -6,12 +6,12 @@ + android:orientation="vertical" + app:layout_constraintTop_toTopOf="parent"> - @@ -20,22 +20,25 @@ android:id="@+id/tvDate" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_centerInParent="true" android:fontFamily="@font/noto_sans_kr_medium" android:includeFontPadding="false" - android:text="1" android:textColor="@color/black" android:textSize="16sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" tools:text="1" /> - + android:src="@drawable/circle" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tvDate" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/item_day_selected.xml b/app/src/main/res/layout/item_day_selected.xml new file mode 100644 index 0000000..d94aed3 --- /dev/null +++ b/app/src/main/res/layout/item_day_selected.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_schedule.xml b/app/src/main/res/layout/item_schedule.xml new file mode 100644 index 0000000..ac59447 --- /dev/null +++ b/app/src/main/res/layout/item_schedule.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + \ No newline at end of file From 118e6603220d0abe19710183f9fca328021f6e65 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Fri, 8 Apr 2022 23:00:12 +0900 Subject: [PATCH 06/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EB=8B=AC=EB=A0=A5?= =?UTF-8?q?=20Adapter=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsp_android/ui/main/CalendarAdapter.kt | 32 +++++++++++++++++-- .../gsp_android/ui/main/CalendarDayModel.kt | 5 +-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt index 139e739..ff50ffd 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt @@ -1,15 +1,36 @@ package com.gsps.gsp_android.ui.main import android.content.Context +import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.gsps.gsp_android.databinding.ItemDayBinding +import com.gsps.gsp_android.databinding.ItemDayEmptyBinding -class CalendarAdapter(context: Context, private val itemList: MutableList): RecyclerView.Adapter() { +class CalendarAdapter(context: Context, private val itemList: MutableList) : + RecyclerView.Adapter() { override fun onCreateViewHolder( parent: ViewGroup, viewType: Int ): RecyclerView.ViewHolder { - TODO("Not yet implemented") + if (viewType == 0) { + val itemDayBinding = + ItemDayBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return ViewHolder(itemDayBinding) + } + else if (viewType == 1) { + val itemDayEmptyBinding = ItemDayEmptyBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return EmptyViewHolder(itemDayEmptyBinding) + } + + } + + class EmptyViewHolder(itemDayEmptyBinding: ItemDayEmptyBinding) : RecyclerView.ViewHolder() { + + } + + class ViewHolder(itemDayBinding: ItemDayBinding) : RecyclerView.ViewHolder() { + } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { @@ -20,4 +41,11 @@ class CalendarAdapter(context: Context, private val itemList: MutableList 2 + itemList[position].plan.isEmpty() -> 0 + else -> 1 + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt index bd9c41e..1fa6cca 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt @@ -3,6 +3,7 @@ package com.gsps.gsp_android.ui.main import java.time.LocalDate data class CalendarDayModel( - val date: LocalDate, - val plan: MutableList + var date: LocalDate, + var plan: MutableList, + var isSelected: Boolean ) From 0a2682b95a6ec77b1515fceefc821f1462d3851f Mon Sep 17 00:00:00 2001 From: river_is_line Date: Tue, 12 Apr 2022 19:58:54 +0900 Subject: [PATCH 07/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EB=8B=AC=EB=A0=A5?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지난 달, 다음 달 이동 --- app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 8 +- .../gsp_android/ui/main/BindingAdapter.kt | 14 ++ .../gsp_android/ui/main/CalendarAdapter.kt | 87 ++++++--- .../gsp_android/ui/main/CalendarDayModel.kt | 10 +- .../gsp_android/ui/main/CalendarFragment.kt | 75 ++++++++ .../gsps/gsp_android/ui/main/MainActivity.kt | 7 + .../com/gsps/gsp_android/ui/main/PlanModel.kt | 12 -- .../gsp_android/ui/main/ScheduleAdapter.kt | 39 ++++ .../gsp_android/ui/main/ScheduleFragment.kt | 7 + .../gsps/gsp_android/ui/main/ScheduleModel.kt | 14 ++ app/src/main/res/layout/activity_main.xml | 14 +- app/src/main/res/layout/activity_sign_in.xml | 14 +- app/src/main/res/layout/fragment_calendar.xml | 9 +- app/src/main/res/layout/fragment_schedule.xml | 13 ++ app/src/main/res/layout/item_day.xml | 77 ++++---- app/src/main/res/layout/item_day_empty.xml | 17 -- app/src/main/res/layout/item_day_selected.xml | 36 ---- app/src/main/res/layout/item_schedule.xml | 167 +++++++++--------- app/src/main/res/values/strings.xml | 1 + 20 files changed, 389 insertions(+), 233 deletions(-) create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/BindingAdapter.kt delete mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/PlanModel.kt create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleFragment.kt create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt create mode 100644 app/src/main/res/layout/fragment_schedule.xml delete mode 100644 app/src/main/res/layout/item_day_empty.xml delete mode 100644 app/src/main/res/layout/item_day_selected.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b18fb05..8d20c28 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -59,6 +59,7 @@ dependencies { implementation("androidx.appcompat:appcompat:1.4.1") implementation("com.google.android.material:material:1.5.0") implementation("androidx.constraintlayout:constraintlayout:2.1.3") + implementation("androidx.legacy:legacy-support-v4:1.0.0") kapt(Dependency.AndroidX.ROOM_COMPILER) implementation(Dependency.Kotlin.COROUTINES_CORE) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 25c11f8..02136e1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,15 +16,17 @@ + + + - \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/BindingAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/BindingAdapter.kt new file mode 100644 index 0000000..5c476d5 --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/BindingAdapter.kt @@ -0,0 +1,14 @@ +package com.gsps.gsp_android.ui.main + +import android.widget.TextView +import androidx.databinding.BindingAdapter + +object BindingAdapter { + @JvmStatic + @BindingAdapter("app:setDate") + fun TextView.setDate(item: CalendarDayModel?) { + item?.let { + text = it.dayOfMonth.toString() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt index ff50ffd..af78722 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt @@ -1,51 +1,80 @@ package com.gsps.gsp_android.ui.main -import android.content.Context +import android.graphics.drawable.GradientDrawable import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup +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 -import com.gsps.gsp_android.databinding.ItemDayEmptyBinding -class CalendarAdapter(context: Context, private val itemList: MutableList) : - RecyclerView.Adapter() { +class CalendarAdapter : + ListAdapter(CalendarAdapterDiffCallback()) { override fun onCreateViewHolder( parent: ViewGroup, viewType: Int - ): RecyclerView.ViewHolder { - if (viewType == 0) { - val itemDayBinding = - ItemDayBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return ViewHolder(itemDayBinding) - } - else if (viewType == 1) { - val itemDayEmptyBinding = ItemDayEmptyBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return EmptyViewHolder(itemDayEmptyBinding) - } - + ): ViewHolder { + return ViewHolder.from(parent) } - class EmptyViewHolder(itemDayEmptyBinding: ItemDayEmptyBinding) : RecyclerView.ViewHolder() { - + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val item = getItem(position) + when { + item.dayOfMonth == 0 -> { + holder.ivSelected.visibility = View.GONE + holder.tvDate.visibility = View.GONE + holder.ivPlan.visibility = View.GONE + } + item.isSelected -> { + val drawable: GradientDrawable = holder.ivSelected.background as GradientDrawable + drawable.setColor(R.color.main_lighten.toInt()) + holder.tvDate.setTextColor(R.color.white.toInt()) + holder.ivPlan.visibility = View.GONE + } + item.plan.size == 0 -> { + holder.ivSelected.visibility = View.GONE + holder.tvDate.setTextColor(R.color.black.toInt()) + holder.ivPlan.visibility = View.GONE + } + else -> { + val drawable: GradientDrawable = holder.ivPlan.background as GradientDrawable + holder.ivSelected.visibility = View.GONE + holder.tvDate.setTextColor(R.color.black.toInt()) + drawable.setColor(R.color.main_lighten.toInt()) + } + } + holder.bind(item) } - class ViewHolder(itemDayBinding: ItemDayBinding) : RecyclerView.ViewHolder() { + class ViewHolder private constructor(private val itemDayBinding: ItemDayBinding) : + RecyclerView.ViewHolder(itemDayBinding.root) { + val ivSelected = itemDayBinding.ivSelected + val tvDate = itemDayBinding.tvDate + val ivPlan = itemDayBinding.ivPlan - } + fun bind(item: CalendarDayModel) { + itemDayBinding.calendarDayModel = item + itemDayBinding.executePendingBindings() + } - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - TODO("Not yet implemented") + companion object { + fun from(parent: ViewGroup): ViewHolder { + val binding = + ItemDayBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return ViewHolder(binding) + } + } } +} - override fun getItemCount(): Int { - return itemList.size +class CalendarAdapterDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: CalendarDayModel, newItem: CalendarDayModel): Boolean { + return oldItem.dayOfMonth == newItem.dayOfMonth } - override fun getItemViewType(position: Int): Int { - return when { - itemList[position].isSelected -> 2 - itemList[position].plan.isEmpty() -> 0 - else -> 1 - } + override fun areContentsTheSame(oldItem: CalendarDayModel, newItem: CalendarDayModel): Boolean { + return oldItem == newItem } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt index 1fa6cca..4f1880d 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt @@ -1,9 +1,11 @@ package com.gsps.gsp_android.ui.main -import java.time.LocalDate +import java.time.Year data class CalendarDayModel( - var date: LocalDate, - var plan: MutableList, - var isSelected: Boolean + var month: Int = 0, + var dayOfMonth: Int = 0, + var plan: MutableList = MutableList(0, init = { ScheduleModel() }), + var isSelected: Boolean = false, + var dayOfWeek: Int = 0 ) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt index 4f97c06..804c07a 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -1,11 +1,86 @@ package com.gsps.gsp_android.ui.main +import android.util.Log import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.FragmentCalendarBinding import com.gsps.gsp_android.ui.base.BaseFragment +import java.util.* class CalendarFragment : BaseFragment(R.layout.fragment_calendar) { override fun initView() { + val calendarAdapter = CalendarAdapter() + binding.calendar.adapter = calendarAdapter + var calendar = Calendar.getInstance() + + calendar.timeInMillis = System.currentTimeMillis() + calendar.set(Calendar.DAY_OF_MONTH, 1) + + val tempCalendar = calendar.timeInMillis + calendar.timeInMillis = tempCalendar + + setCalendar(calendarAdapter, calendar) + + binding.btnLastMonth.setOnClickListener { + Log.d("CalendarFragment", "Last Button Clicked!!!") + + calendar = changeMonth(calendar, -1) + setCalendar(calendarAdapter, calendar) + } + + binding.btnNextMonth.setOnClickListener { + Log.d("CalendarFragment", "Next Button Clicked!!!") + + calendar = changeMonth(calendar, +1) + setCalendar(calendarAdapter, calendar) + } + } + + private fun changeMonth(calendarNow: Calendar, factor: Int): Calendar { + val calendarPast = Calendar.getInstance() + if (factor == -1) { + when (calendarNow.get(Calendar.MONTH)) { + 0 -> calendarPast.set( + calendarNow.get(Calendar.YEAR) - 1, + 11, + 1 + ) + else -> calendarPast.set( + calendarNow.get(Calendar.YEAR), + calendarNow.get(Calendar.MONTH) - 1, + 1 + ) + } + } else { + when (calendarNow.get(Calendar.MONTH)) { + 11 -> calendarPast.set( + calendarNow.get(Calendar.YEAR) + 1, + 0, + 1 + ) + + else -> calendarPast.set( + calendarNow.get(Calendar.YEAR), + calendarNow.get(Calendar.MONTH) + 1, + 1 + ) + } + } + return calendarPast + } + + private fun setCalendar(adapter: CalendarAdapter, 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 = MutableList(week, init = { CalendarDayModel() }) + + for (i in 1..maxDate) { + list.add(CalendarDayModel(month, i)) + } + adapter.submitList(list) + + binding.tvMonth.text = + String.format(getString(R.string.set_year), calendar.get(Calendar.YEAR), month) } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt index 36f4310..2175a8e 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt @@ -2,11 +2,18 @@ package com.gsps.gsp_android.ui.main import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import androidx.fragment.app.FragmentManager import com.gsps.gsp_android.R class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + val fragment: CalendarFragment = CalendarFragment() + val fragmentManager: FragmentManager = supportFragmentManager + val fragmentTransaction = fragmentManager.beginTransaction() + fragmentTransaction.add(R.id.calendarContainer, fragment) + fragmentTransaction.commit() } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/PlanModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/PlanModel.kt deleted file mode 100644 index 87a652b..0000000 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/PlanModel.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.gsps.gsp_android.ui.main - -import java.time.LocalDate -import java.time.LocalTime - -data class PlanModel( - val date: LocalDate, - val time: LocalTime, - val info: String, - val proposalCompanyId: Int, - val participantCompanyId: Int -) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt new file mode 100644 index 0000000..07c7a3a --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt @@ -0,0 +1,39 @@ +package com.gsps.gsp_android.ui.main + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.gsps.gsp_android.databinding.ItemScheduleBinding + +class ScheduleAdapter( + context: Context, + private val itemList: MutableList +) : RecyclerView.Adapter() { + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ScheduleAdapter.ScheduleHolder { + val binding = + ItemScheduleBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return ScheduleHolder(binding) + } + + override fun onBindViewHolder( + holder: ScheduleAdapter.ScheduleHolder, + position: Int + ) { + holder.bind(itemList[position]) + } + + override fun getItemCount(): Int { + return itemList.size + } + + inner class ScheduleHolder(var binding: ItemScheduleBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(item: ScheduleModel) { + binding.scheduleModel = item + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleFragment.kt new file mode 100644 index 0000000..3671edd --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleFragment.kt @@ -0,0 +1,7 @@ +package com.gsps.gsp_android.ui.main + +import androidx.fragment.app.Fragment + +class ScheduleFragment : Fragment() { + +} \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt new file mode 100644 index 0000000..930d1dd --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt @@ -0,0 +1,14 @@ +package com.gsps.gsp_android.ui.main + +import java.time.LocalDate +import java.time.LocalTime + +data class ScheduleModel( + var date: LocalDate = LocalDate.now(), + var startTime: LocalTime = LocalTime.now(), + var endTime: LocalTime = LocalTime.now(), + var info: String = "", + var place: String = "", + var proposalCompanyId: Int = 0, + var participantCompanyId: Int = 0 +) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6654d70..e892a7c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,14 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_sign_in.xml b/app/src/main/res/layout/activity_sign_in.xml index ed8fa79..023203d 100644 --- a/app/src/main/res/layout/activity_sign_in.xml +++ b/app/src/main/res/layout/activity_sign_in.xml @@ -26,7 +26,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" - android:fontFamily="@font/notosanskr_bold" + android:fontFamily="@font/noto_sans_kr_bold" android:includeFontPadding="false" android:text="@string/sign_in" android:textColor="@color/black" @@ -52,7 +52,7 @@ android:id="@+id/sign_in_et_id" android:layout_width="match_parent" android:layout_height="wrap_content" - android:fontFamily="@font/notosanskr_regular" + android:fontFamily="@font/noto_sans_kr_regular" android:hint="@string/input_id" android:includeFontPadding="false" android:inputType="text" @@ -80,7 +80,7 @@ android:id="@+id/sign_in_et_pw" android:layout_width="match_parent" android:layout_height="wrap_content" - android:fontFamily="@font/notosanskr_regular" + android:fontFamily="@font/noto_sans_kr_regular" android:hint="@string/input_pw" android:includeFontPadding="false" android:inputType="textPassword" @@ -96,7 +96,7 @@ android:layout_height="36dp" android:layout_marginTop="40dp" android:background="@drawable/rounded_corner_main_lignten" - android:fontFamily="@font/notosanskr_medium" + android:fontFamily="@font/noto_sans_kr_medium" android:gravity="center" android:includeFontPadding="false" android:text="@string/sign_in" @@ -119,7 +119,7 @@ android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toStartOf="@id/sign_in_tv_divider" - android:fontFamily="@font/notosanskr_medium" + android:fontFamily="@font/noto_sans_kr_medium" android:includeFontPadding="false" android:text="@string/find_id" android:textColor="@color/dark_gray" @@ -142,7 +142,7 @@ android:layout_centerVertical="true" android:layout_marginTop="16dp" android:layout_toEndOf="@id/sign_in_tv_divider" - android:fontFamily="@font/notosanskr_medium" + android:fontFamily="@font/noto_sans_kr_medium" android:includeFontPadding="false" android:text="@string/find_pw" android:textColor="@color/dark_gray" @@ -157,7 +157,7 @@ android:layout_marginTop="40dp" android:layout_marginBottom="20dp" android:background="@drawable/rounded_corner_dark_gray_stroke" - android:fontFamily="@font/notosanskr_regular" + android:fontFamily="@font/noto_sans_kr_regular" android:gravity="center" android:includeFontPadding="false" android:text="@string/sign_up_with_email" diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml index d240484..d6b23fa 100644 --- a/app/src/main/res/layout/fragment_calendar.xml +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -186,14 +186,15 @@ android:id="@+id/calendar" android:layout_width="match_parent" android:layout_height="wrap_content" - app:layout_constraintTop_toBottomOf="@id/guideline" /> + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:layout_constraintTop_toBottomOf="@id/guideline" + app:spanCount="7" /> - diff --git a/app/src/main/res/layout/fragment_schedule.xml b/app/src/main/res/layout/fragment_schedule.xml new file mode 100644 index 0000000..09368ed --- /dev/null +++ b/app/src/main/res/layout/fragment_schedule.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_day.xml b/app/src/main/res/layout/item_day.xml index f9adbcf..68c2e7e 100644 --- a/app/src/main/res/layout/item_day.xml +++ b/app/src/main/res/layout/item_day.xml @@ -1,44 +1,55 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + + + android:layout_height="50dp"> - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + - - + \ No newline at end of file diff --git a/app/src/main/res/layout/item_day_empty.xml b/app/src/main/res/layout/item_day_empty.xml deleted file mode 100644 index 80f174d..0000000 --- a/app/src/main/res/layout/item_day_empty.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_day_selected.xml b/app/src/main/res/layout/item_day_selected.xml deleted file mode 100644 index d94aed3..0000000 --- a/app/src/main/res/layout/item_day_selected.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_schedule.xml b/app/src/main/res/layout/item_schedule.xml index ac59447..fa94246 100644 --- a/app/src/main/res/layout/item_schedule.xml +++ b/app/src/main/res/layout/item_schedule.xml @@ -1,86 +1,95 @@ - + - + + + - + - + - + - + - - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73dbabd..9da7b92 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,4 +8,5 @@ 이메일로 가입하기 아이디 형식이 잘못되었습니다 일정 + %d년 %d월 \ No newline at end of file From 0d65a6bb59a8056e444c9ffa2a13993c6aa9f0bc Mon Sep 17 00:00:00 2001 From: river_is_line Date: Tue, 12 Apr 2022 21:46:28 +0900 Subject: [PATCH 08/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20schedule=20dialog?= =?UTF-8?q?=20xml=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsps/gsp_android/ui/main/ScheduleModel.kt | 9 +- app/src/main/res/layout/dialog_schedule.xml | 186 ++++++++++++++++++ app/src/main/res/layout/fragment_calendar.xml | 6 +- app/src/main/res/values/strings.xml | 1 + 4 files changed, 195 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/layout/dialog_schedule.xml diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt index 930d1dd..f84f679 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt @@ -1,14 +1,15 @@ package com.gsps.gsp_android.ui.main -import java.time.LocalDate import java.time.LocalTime data class ScheduleModel( - var date: LocalDate = LocalDate.now(), + var year: Int = 2022, + var month: Int = 4, + var date: Int = 12, var startTime: LocalTime = LocalTime.now(), var endTime: LocalTime = LocalTime.now(), var info: String = "", var place: String = "", - var proposalCompanyId: Int = 0, - var participantCompanyId: Int = 0 + var companyName: String = "", + var logoUrl: String = "" ) diff --git a/app/src/main/res/layout/dialog_schedule.xml b/app/src/main/res/layout/dialog_schedule.xml new file mode 100644 index 0000000..8b545fc --- /dev/null +++ b/app/src/main/res/layout/dialog_schedule.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml index d6b23fa..b4bd222 100644 --- a/app/src/main/res/layout/fragment_calendar.xml +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -84,7 +84,7 @@ android:layout_marginTop="28dp" android:layout_marginBottom="14.5dp" android:orientation="horizontal" - app:layout_constraintBottom_toTopOf="@id/guideline" + app:layout_constraintBottom_toTopOf="@id/guidelineStart" app:layout_constraintTop_toBottomOf="@id/rlMonth"> 아이디 형식이 잘못되었습니다 일정 %d년 %d월 + 상세보기 \ No newline at end of file From cf946581b31e13809ba3590b0cd74197119ba0e9 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Wed, 13 Apr 2022 22:57:36 +0900 Subject: [PATCH 09/21] =?UTF-8?q?=F0=9F=90=9B::=20=EB=B3=91=ED=95=A9=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_sign_in.xml | 132 ++++++++----------- 1 file changed, 54 insertions(+), 78 deletions(-) diff --git a/app/src/main/res/layout/activity_sign_in.xml b/app/src/main/res/layout/activity_sign_in.xml index 63973be..f1cbdce 100644 --- a/app/src/main/res/layout/activity_sign_in.xml +++ b/app/src/main/res/layout/activity_sign_in.xml @@ -12,12 +12,8 @@ android:id="@+id/rlTop" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_centerInParent="true" - android:fontFamily="@font/noto_sans_kr_bold" - android:includeFontPadding="false" - android:text="@string/sign_in" - android:textColor="@color/black" - android:textSize="18sp" /> + android:layout_marginTop="14dp" + app:layout_constraintTop_toTopOf="parent"> - + android:layout_marginHorizontal="20dp" + android:layout_marginTop="59dp" + app:boxBackgroundColor="@color/white" + app:boxStrokeColor="@color/dark_gray" + app:boxStrokeWidthFocused="1dp" + app:errorEnabled="true" + app:hintEnabled="false" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/rlTop"> + android:layout_marginHorizontal="20dp" + app:boxBackgroundColor="@color/white" + app:boxStrokeColor="@color/dark_gray" + app:boxStrokeWidthFocused="1dp" + app:endIconMode="password_toggle" + app:endIconTint="@color/dark_gray" + app:hintEnabled="false" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tilId"> - - - - - - + - + + Date: Thu, 14 Apr 2022 19:39:56 +0900 Subject: [PATCH 10/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F::=20Calendar=20Adapter?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 8 +- .../gsp_android/ui/main/BindingAdapter.kt | 14 --- .../gsp_android/ui/main/CalendarAdapter.kt | 116 ++++++++++-------- .../gsp_android/ui/main/CalendarDayModel.kt | 54 ++++++-- .../gsp_android/ui/main/CalendarFragment.kt | 44 ++++--- .../ui/main/InterestsFullListAdapter.kt | 10 +- .../drawable/item_calendar_day_background.xml | 15 +++ .../drawable/item_calendar_day_textcolor.xml | 5 + app/src/main/res/layout/fragment_calendar.xml | 2 +- app/src/main/res/layout/item_day.xml | 34 ++--- 10 files changed, 181 insertions(+), 121 deletions(-) delete mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/BindingAdapter.kt create mode 100644 app/src/main/res/drawable/item_calendar_day_background.xml create mode 100644 app/src/main/res/drawable/item_calendar_day_textcolor.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 491d91a..e624b47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,16 +49,18 @@ + + + - \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/BindingAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/BindingAdapter.kt deleted file mode 100644 index 5c476d5..0000000 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/BindingAdapter.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.gsps.gsp_android.ui.main - -import android.widget.TextView -import androidx.databinding.BindingAdapter - -object BindingAdapter { - @JvmStatic - @BindingAdapter("app:setDate") - fun TextView.setDate(item: CalendarDayModel?) { - item?.let { - text = it.dayOfMonth.toString() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt index af78722..8dafbfc 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt @@ -1,80 +1,96 @@ package com.gsps.gsp_android.ui.main -import android.graphics.drawable.GradientDrawable +import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup 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 : - ListAdapter(CalendarAdapterDiffCallback()) { +class CalendarAdapter(context: Context, private val itemList: MutableList) : + RecyclerView.Adapter() { + private var isNewRadioButtonChecked: Boolean = false + private var lastCheckedPosition = -1 + private var isSomethingChecked = false + override fun onCreateViewHolder( parent: ViewGroup, viewType: Int - ): ViewHolder { - return ViewHolder.from(parent) + ): CalendarDayHolder { + val binding = ItemDayBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return CalendarDayHolder(binding) } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val item = getItem(position) - when { - item.dayOfMonth == 0 -> { - holder.ivSelected.visibility = View.GONE - holder.tvDate.visibility = View.GONE - holder.ivPlan.visibility = View.GONE - } - item.isSelected -> { - val drawable: GradientDrawable = holder.ivSelected.background as GradientDrawable - drawable.setColor(R.color.main_lighten.toInt()) - holder.tvDate.setTextColor(R.color.white.toInt()) - holder.ivPlan.visibility = View.GONE - } - item.plan.size == 0 -> { - holder.ivSelected.visibility = View.GONE - holder.tvDate.setTextColor(R.color.black.toInt()) - holder.ivPlan.visibility = View.GONE - } - else -> { - val drawable: GradientDrawable = holder.ivPlan.background as GradientDrawable - holder.ivSelected.visibility = View.GONE - holder.tvDate.setTextColor(R.color.black.toInt()) - drawable.setColor(R.color.main_lighten.toInt()) - } + override fun onBindViewHolder(holder: CalendarDayHolder, position: Int) { + if (isNewRadioButtonChecked) { + holder.binding.rbDay.isChecked = itemList[position].getChecked() + } else if (holder.adapterPosition == 0) { + lastCheckedPosition = 0; } - holder.bind(item) - } - class ViewHolder private constructor(private val itemDayBinding: ItemDayBinding) : - RecyclerView.ViewHolder(itemDayBinding.root) { - val ivSelected = itemDayBinding.ivSelected - val tvDate = itemDayBinding.tvDate - val ivPlan = itemDayBinding.ivPlan + holder.bind(itemList[position]) + } - fun bind(item: CalendarDayModel) { - itemDayBinding.calendarDayModel = item - itemDayBinding.executePendingBindings() + inner class CalendarDayHolder(val binding: ItemDayBinding) : + RecyclerView.ViewHolder(binding.root) { + init { + binding.rbDay.setOnClickListener { + if (lastCheckedPosition == adapterPosition && itemList[adapterPosition].getChecked()) { + binding.rbDay.visibility = View.VISIBLE + binding.ivPlan.visibility = View.VISIBLE + isNewRadioButtonChecked = false + isSomethingChecked = false + itemList[adapterPosition].setChecked(false) + notifyDataSetChanged() + } else { + binding.rbDay.visibility = View.VISIBLE + binding.ivPlan.visibility = View.INVISIBLE + isNewRadioButtonChecked = true + isSomethingChecked = true + itemList[lastCheckedPosition].setChecked(false) + itemList[adapterPosition].setChecked(true) + lastCheckedPosition = adapterPosition + notifyDataSetChanged() + } + } } - companion object { - fun from(parent: ViewGroup): ViewHolder { - val binding = - ItemDayBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return ViewHolder(binding) + fun bind(item: CalendarDayModel) { + when { + item.getDayOfMonth() == 0 -> { + binding.rbDay.visibility = View.INVISIBLE + binding.ivPlan.visibility = View.INVISIBLE + } + item.getPlan().size == 0 -> { + binding.rbDay.visibility = View.VISIBLE + binding.ivPlan.visibility = View.INVISIBLE + } } + + binding.calendarDayModel = item + binding.rbDay.text = item.getDayOfMonth().toString() + binding.executePendingBindings() } } + + override fun getItemCount(): Int { + return itemList.size + } } class CalendarAdapterDiffCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: CalendarDayModel, newItem: CalendarDayModel): Boolean { - return oldItem.dayOfMonth == newItem.dayOfMonth + override fun areItemsTheSame( + oldItem: CalendarDayModel, + newItem: CalendarDayModel + ): Boolean { + return oldItem.getDayOfMonth() == newItem.getDayOfMonth() } - override fun areContentsTheSame(oldItem: CalendarDayModel, newItem: CalendarDayModel): Boolean { + override fun areContentsTheSame( + oldItem: CalendarDayModel, + newItem: CalendarDayModel + ): Boolean { return oldItem == newItem } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt index 4f1880d..985b9b0 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt @@ -1,11 +1,49 @@ package com.gsps.gsp_android.ui.main -import java.time.Year - data class CalendarDayModel( - var month: Int = 0, - var dayOfMonth: Int = 0, - var plan: MutableList = MutableList(0, init = { ScheduleModel() }), - var isSelected: Boolean = false, - var dayOfWeek: Int = 0 -) + private var month: Int, + private var dayOfMonth: Int, + private var plan: MutableList, + private var isChecked: Boolean, + private var dayOfWeek: Int +) { + fun getMonth(): Int { + return month + } + + fun setMonth(month: Int) { + this.month = month + } + + fun getDayOfMonth(): Int { + return dayOfMonth + } + + fun setDayOfMonth(dayOfMonth: Int) { + this.dayOfMonth = dayOfMonth + } + + fun getDayOfWeek(): Int { + return dayOfMonth + } + + fun setDayOfWeek(dayOfWeek: Int) { + this.dayOfWeek = dayOfWeek + } + + fun getPlan(): MutableList { + return plan + } + + fun setPlan(plan: MutableList) { + this.plan = plan + } + + fun getChecked(): Boolean { + return isChecked + } + + fun setChecked(isChecked: Boolean) { + this.isChecked = isChecked + } +} diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt index 804c07a..5ad9788 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -1,6 +1,5 @@ package com.gsps.gsp_android.ui.main -import android.util.Log import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.FragmentCalendarBinding import com.gsps.gsp_android.ui.base.BaseFragment @@ -8,31 +7,36 @@ import java.util.* class CalendarFragment : BaseFragment(R.layout.fragment_calendar) { override fun initView() { - val calendarAdapter = CalendarAdapter() - binding.calendar.adapter = calendarAdapter - var calendar = Calendar.getInstance() calendar.timeInMillis = System.currentTimeMillis() calendar.set(Calendar.DAY_OF_MONTH, 1) - val tempCalendar = calendar.timeInMillis - calendar.timeInMillis = tempCalendar + val itemList: MutableList = setCalendar(calendar) + val plan: MutableList = mutableListOf(ScheduleModel()) + itemList[15].setPlan(plan) + val calendarAdapter = CalendarAdapter(requireContext(), itemList) - setCalendar(calendarAdapter, calendar) + binding.calendar.adapter = calendarAdapter binding.btnLastMonth.setOnClickListener { - Log.d("CalendarFragment", "Last Button Clicked!!!") - calendar = changeMonth(calendar, -1) - setCalendar(calendarAdapter, calendar) + + val lastItemList: MutableList = setCalendar(calendar) + val lastCalendarAdapter = CalendarAdapter(requireContext(), lastItemList) + + binding.calendar.removeAllViewsInLayout() + binding.calendar.adapter = lastCalendarAdapter } binding.btnNextMonth.setOnClickListener { - Log.d("CalendarFragment", "Next Button Clicked!!!") - calendar = changeMonth(calendar, +1) - setCalendar(calendarAdapter, calendar) + + val nextItemList: MutableList = setCalendar(calendar) + val nextCalendarAdapter = CalendarAdapter(requireContext(), nextItemList) + + binding.calendar.removeAllViewsInLayout() + binding.calendar.adapter = nextCalendarAdapter } } @@ -69,18 +73,24 @@ class CalendarFragment : BaseFragment(R.layout.fragment return calendarPast } - private fun setCalendar(adapter: CalendarAdapter, calendar: Calendar) { + private fun setCalendar(calendar: Calendar): MutableList { 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 = MutableList(week, init = { CalendarDayModel() }) + val list: MutableList = mutableListOf() + val plan: MutableList = mutableListOf() + + for (i in 1..week) { + list.add(CalendarDayModel(0, 0, plan, false, 0)) + } for (i in 1..maxDate) { - list.add(CalendarDayModel(month, i)) + list.add(CalendarDayModel(month, i, plan, false, week)) } - adapter.submitList(list) binding.tvMonth.text = String.format(getString(R.string.set_year), calendar.get(Calendar.YEAR), month) + + return list } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/InterestsFullListAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/InterestsFullListAdapter.kt index 906e135..e24ec0d 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/InterestsFullListAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/InterestsFullListAdapter.kt @@ -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 -) : RecyclerView.Adapter() { +class InterestsFullListAdapter(context: Context, private val itemList: MutableList) : + RecyclerView.Adapter() { override fun onCreateViewHolder( parent: ViewGroup, viewType: Int - ): InterestsFullListAdapter.InterestsFullListHolder { + ): InterestsFullListHolder { val binding = InterestsFullListItemBinding.inflate( LayoutInflater.from(parent.context), @@ -24,7 +22,7 @@ class InterestsFullListAdapter( } override fun onBindViewHolder( - holder: InterestsFullListAdapter.InterestsFullListHolder, + holder: InterestsFullListHolder, position: Int ) { holder.bind(itemList[position]) diff --git a/app/src/main/res/drawable/item_calendar_day_background.xml b/app/src/main/res/drawable/item_calendar_day_background.xml new file mode 100644 index 0000000..72f95a6 --- /dev/null +++ b/app/src/main/res/drawable/item_calendar_day_background.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/item_calendar_day_textcolor.xml b/app/src/main/res/drawable/item_calendar_day_textcolor.xml new file mode 100644 index 0000000..ed232f3 --- /dev/null +++ b/app/src/main/res/drawable/item_calendar_day_textcolor.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml index b4bd222..1ae37cd 100644 --- a/app/src/main/res/layout/fragment_calendar.xml +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -62,7 +62,7 @@ android:layout_height="wrap_content" android:layout_centerInParent="true" android:fontFamily="@font/noto_sans_kr_bold" - android:text="2022년 3월" + android:includeFontPadding="false" android:textColor="@color/black" android:textSize="14sp" /> diff --git a/app/src/main/res/layout/item_day.xml b/app/src/main/res/layout/item_day.xml index 68c2e7e..6a2e10a 100644 --- a/app/src/main/res/layout/item_day.xml +++ b/app/src/main/res/layout/item_day.xml @@ -14,42 +14,32 @@ android:layout_width="match_parent" android:layout_height="50dp"> - - - + android:gravity="center" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintBottom_toBottomOf="@id/rbDay" /> \ No newline at end of file From 22589ca9b10baae5a640bb5446719d81d7a533d5 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Thu, 14 Apr 2022 23:35:56 +0900 Subject: [PATCH 11/21] =?UTF-8?q?=E2=9A=B0=EF=B8=8F::=20=EB=8B=AC=EB=A0=A5?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=A0=84=EC=B2=B4=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsp_android/ui/main/CalendarAdapter.kt | 93 +------------------ .../gsp_android/ui/main/CalendarDayModel.kt | 52 ++--------- .../gsp_android/ui/main/CalendarFragment.kt | 85 ----------------- .../gsps/gsp_android/ui/main/ScheduleModel.kt | 17 ++-- app/src/main/res/layout/dialog_schedule.xml | 2 +- 5 files changed, 15 insertions(+), 234 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt index 8dafbfc..733d21c 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt @@ -1,96 +1,5 @@ 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.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.RecyclerView -import com.gsps.gsp_android.databinding.ItemDayBinding +class CalendarAdapter { -class CalendarAdapter(context: Context, private val itemList: MutableList) : - RecyclerView.Adapter() { - private var isNewRadioButtonChecked: Boolean = false - private var lastCheckedPosition = -1 - private var isSomethingChecked = false - - override fun onCreateViewHolder( - parent: ViewGroup, - viewType: Int - ): CalendarDayHolder { - val binding = ItemDayBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return CalendarDayHolder(binding) - } - - override fun onBindViewHolder(holder: CalendarDayHolder, position: Int) { - if (isNewRadioButtonChecked) { - holder.binding.rbDay.isChecked = itemList[position].getChecked() - } else if (holder.adapterPosition == 0) { - lastCheckedPosition = 0; - } - - holder.bind(itemList[position]) - } - - inner class CalendarDayHolder(val binding: ItemDayBinding) : - RecyclerView.ViewHolder(binding.root) { - init { - binding.rbDay.setOnClickListener { - if (lastCheckedPosition == adapterPosition && itemList[adapterPosition].getChecked()) { - binding.rbDay.visibility = View.VISIBLE - binding.ivPlan.visibility = View.VISIBLE - isNewRadioButtonChecked = false - isSomethingChecked = false - itemList[adapterPosition].setChecked(false) - notifyDataSetChanged() - } else { - binding.rbDay.visibility = View.VISIBLE - binding.ivPlan.visibility = View.INVISIBLE - isNewRadioButtonChecked = true - isSomethingChecked = true - itemList[lastCheckedPosition].setChecked(false) - itemList[adapterPosition].setChecked(true) - lastCheckedPosition = adapterPosition - notifyDataSetChanged() - } - } - } - - fun bind(item: CalendarDayModel) { - when { - item.getDayOfMonth() == 0 -> { - binding.rbDay.visibility = View.INVISIBLE - binding.ivPlan.visibility = View.INVISIBLE - } - item.getPlan().size == 0 -> { - binding.rbDay.visibility = View.VISIBLE - binding.ivPlan.visibility = View.INVISIBLE - } - } - - binding.calendarDayModel = item - binding.rbDay.text = item.getDayOfMonth().toString() - binding.executePendingBindings() - } - } - - override fun getItemCount(): Int { - return itemList.size - } -} - -class CalendarAdapterDiffCallback : DiffUtil.ItemCallback() { - override fun areItemsTheSame( - oldItem: CalendarDayModel, - newItem: CalendarDayModel - ): Boolean { - return oldItem.getDayOfMonth() == newItem.getDayOfMonth() - } - - override fun areContentsTheSame( - oldItem: CalendarDayModel, - newItem: CalendarDayModel - ): Boolean { - return oldItem == newItem - } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt index 985b9b0..7d8bcde 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt @@ -1,49 +1,9 @@ package com.gsps.gsp_android.ui.main data class CalendarDayModel( - private var month: Int, - private var dayOfMonth: Int, - private var plan: MutableList, - private var isChecked: Boolean, - private var dayOfWeek: Int -) { - fun getMonth(): Int { - return month - } - - fun setMonth(month: Int) { - this.month = month - } - - fun getDayOfMonth(): Int { - return dayOfMonth - } - - fun setDayOfMonth(dayOfMonth: Int) { - this.dayOfMonth = dayOfMonth - } - - fun getDayOfWeek(): Int { - return dayOfMonth - } - - fun setDayOfWeek(dayOfWeek: Int) { - this.dayOfWeek = dayOfWeek - } - - fun getPlan(): MutableList { - return plan - } - - fun setPlan(plan: MutableList) { - this.plan = plan - } - - fun getChecked(): Boolean { - return isChecked - } - - fun setChecked(isChecked: Boolean) { - this.isChecked = isChecked - } -} + var month: Int, + var dayOfMonth: Int, + var plan: MutableList, + var isChecked: Boolean, + var dayOfWeek: Int +) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt index 5ad9788..4f97c06 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -3,94 +3,9 @@ package com.gsps.gsp_android.ui.main import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.FragmentCalendarBinding import com.gsps.gsp_android.ui.base.BaseFragment -import java.util.* class CalendarFragment : BaseFragment(R.layout.fragment_calendar) { override fun initView() { - var calendar = Calendar.getInstance() - calendar.timeInMillis = System.currentTimeMillis() - calendar.set(Calendar.DAY_OF_MONTH, 1) - - val itemList: MutableList = setCalendar(calendar) - val plan: MutableList = mutableListOf(ScheduleModel()) - itemList[15].setPlan(plan) - val calendarAdapter = CalendarAdapter(requireContext(), itemList) - - binding.calendar.adapter = calendarAdapter - - binding.btnLastMonth.setOnClickListener { - calendar = changeMonth(calendar, -1) - - val lastItemList: MutableList = setCalendar(calendar) - val lastCalendarAdapter = CalendarAdapter(requireContext(), lastItemList) - - binding.calendar.removeAllViewsInLayout() - binding.calendar.adapter = lastCalendarAdapter - } - - binding.btnNextMonth.setOnClickListener { - calendar = changeMonth(calendar, +1) - - val nextItemList: MutableList = setCalendar(calendar) - val nextCalendarAdapter = CalendarAdapter(requireContext(), nextItemList) - - binding.calendar.removeAllViewsInLayout() - binding.calendar.adapter = nextCalendarAdapter - } - } - - private fun changeMonth(calendarNow: Calendar, factor: Int): Calendar { - val calendarPast = Calendar.getInstance() - if (factor == -1) { - when (calendarNow.get(Calendar.MONTH)) { - 0 -> calendarPast.set( - calendarNow.get(Calendar.YEAR) - 1, - 11, - 1 - ) - else -> calendarPast.set( - calendarNow.get(Calendar.YEAR), - calendarNow.get(Calendar.MONTH) - 1, - 1 - ) - } - } else { - when (calendarNow.get(Calendar.MONTH)) { - 11 -> calendarPast.set( - calendarNow.get(Calendar.YEAR) + 1, - 0, - 1 - ) - - else -> calendarPast.set( - calendarNow.get(Calendar.YEAR), - calendarNow.get(Calendar.MONTH) + 1, - 1 - ) - } - } - return calendarPast - } - - private fun setCalendar(calendar: Calendar): MutableList { - 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 = mutableListOf() - val plan: MutableList = mutableListOf() - - for (i in 1..week) { - list.add(CalendarDayModel(0, 0, plan, false, 0)) - } - - for (i in 1..maxDate) { - list.add(CalendarDayModel(month, i, plan, false, week)) - } - - binding.tvMonth.text = - String.format(getString(R.string.set_year), calendar.get(Calendar.YEAR), month) - - return list } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt index f84f679..2c1897b 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt @@ -1,15 +1,12 @@ package com.gsps.gsp_android.ui.main -import java.time.LocalTime +import java.util.* data class ScheduleModel( - var year: Int = 2022, - var month: Int = 4, - var date: Int = 12, - var startTime: LocalTime = LocalTime.now(), - var endTime: LocalTime = LocalTime.now(), - var info: String = "", - var place: String = "", - var companyName: String = "", - var logoUrl: String = "" + var start: Calendar, + var end: Calendar, + var title: String, + var place: String, + var companyName: String, + var logoUrl: String ) diff --git a/app/src/main/res/layout/dialog_schedule.xml b/app/src/main/res/layout/dialog_schedule.xml index 8b545fc..91dda50 100644 --- a/app/src/main/res/layout/dialog_schedule.xml +++ b/app/src/main/res/layout/dialog_schedule.xml @@ -41,7 +41,7 @@ android:layout_height="wrap_content" android:fontFamily="@font/noto_sans_kr_medium" android:includeFontPadding="true" - android:text="@{scheduleModel.info}" + android:text="@{scheduleModel.title}" android:textColor="@color/black" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="@id/ivSchedule" From d82f2b6d39773baa12e4dcc0700f9cd640581be9 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Fri, 15 Apr 2022 00:39:25 +0900 Subject: [PATCH 12/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20Calendar=20Recycle?= =?UTF-8?q?rview=20with=20ListAdapter,=20DiffUtil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsp_android/ui/main/CalendarAdapter.kt | 49 ++++++++++++++++++- .../gsp_android/ui/main/CalendarDayModel.kt | 5 ++ .../gsp_android/ui/main/CalendarFragment.kt | 7 +++ .../gsps/gsp_android/ui/main/ScheduleModel.kt | 6 +-- 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt index 733d21c..06e8d45 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt @@ -1,5 +1,52 @@ package com.gsps.gsp_android.ui.main -class CalendarAdapter { +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.gsps.gsp_android.databinding.ItemDayBinding +class CalendarAdapter : + ListAdapter(CalendarDiffCallback()) { + 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)) + } + } +} + +class CalendarViewHolder(private val binding: ItemDayBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(item: CalendarDayModel) { + with(binding) { + rbDay.text = item.dayOfMonth.toString() + + rbDay.setOnClickListener { + // rbDay 클릭 리스너 + // 1. 배경 색 바뀜, 하단 원 안 보임. + // 2. 달력 하단에 스케쥴 리스트 생성 됨. + } + } + } +} + +class CalendarDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: CalendarDayModel, newItem: CalendarDayModel): Boolean { + return oldItem === newItem + } + + override fun areContentsTheSame(oldItem: CalendarDayModel, newItem: CalendarDayModel): Boolean { + return oldItem == newItem + } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt index 7d8bcde..cca58be 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt @@ -1,9 +1,14 @@ package com.gsps.gsp_android.ui.main data class CalendarDayModel( + var dateType: DateType, var month: Int, var dayOfMonth: Int, var plan: MutableList, var isChecked: Boolean, var dayOfWeek: Int ) + +enum class DateType{ + EMPTY, NORMAL, PLANNED, SELECTED +} diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt index 4f97c06..935d28f 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -1,11 +1,18 @@ package com.gsps.gsp_android.ui.main +import androidx.recyclerview.widget.GridLayoutManager import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.FragmentCalendarBinding import com.gsps.gsp_android.ui.base.BaseFragment class CalendarFragment : BaseFragment(R.layout.fragment_calendar) { + val calendarAdapter: CalendarAdapter by lazy { CalendarAdapter() } override fun initView() { + binding.calendar.apply { + layoutManager = GridLayoutManager(context, 7, GridLayoutManager.VERTICAL, false) + adapter = calendarAdapter + } + /calendarAdapter.submitList() } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt index 2c1897b..9184d28 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt @@ -1,10 +1,10 @@ package com.gsps.gsp_android.ui.main -import java.util.* +import java.time.LocalTime data class ScheduleModel( - var start: Calendar, - var end: Calendar, + var start: LocalTime, + var end: LocalTime, var title: String, var place: String, var companyName: String, From 68fe4c667dc61e41208f0f1fad4317c3353f7314 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Fri, 15 Apr 2022 00:58:01 +0900 Subject: [PATCH 13/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EB=8B=AC=EB=A0=A5?= =?UTF-8?q?=20=EB=82=A0=EC=A7=9C=20=ED=91=9C=EC=8B=9C=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsp_android/ui/main/CalendarDayModel.kt | 14 +++++------ .../gsp_android/ui/main/CalendarFragment.kt | 23 ++++++++++++++++--- app/src/main/res/layout/dialog_schedule.xml | 4 ++-- app/src/main/res/layout/fragment_calendar.xml | 4 ++-- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt index cca58be..085209c 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarDayModel.kt @@ -1,14 +1,14 @@ package com.gsps.gsp_android.ui.main data class CalendarDayModel( - var dateType: DateType, - var month: Int, - var dayOfMonth: Int, - var plan: MutableList, - var isChecked: Boolean, - var dayOfWeek: Int + var dateType: DateType = DateType.EMPTY, + var month: Int = 0, + var dayOfMonth: Int = 0, + var plan: MutableList = mutableListOf(), + var isChecked: Boolean = false, + var dayOfWeek: Int = 0 ) -enum class DateType{ +enum class DateType { EMPTY, NORMAL, PLANNED, SELECTED } diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt index 935d28f..f0131ab 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -4,15 +4,32 @@ import androidx.recyclerview.widget.GridLayoutManager import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.FragmentCalendarBinding import com.gsps.gsp_android.ui.base.BaseFragment +import java.util.* class CalendarFragment : BaseFragment(R.layout.fragment_calendar) { - val calendarAdapter: CalendarAdapter by lazy { CalendarAdapter() } + private val calendarAdapter: CalendarAdapter by lazy { CalendarAdapter() } override fun initView() { - binding.calendar.apply { + binding.dayContainer.apply { layoutManager = GridLayoutManager(context, 7, GridLayoutManager.VERTICAL, false) adapter = calendarAdapter } - /calendarAdapter.submitList() + val calendar = Calendar.getInstance() + + calendar.timeInMillis = System.currentTimeMillis() + calendar.set(Calendar.DAY_OF_MONTH, 1) + + val tmpCal = calendar.timeInMillis + calendar.timeInMillis = tmpCal + + 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)) + + calendarAdapter.submitList(list) } } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_schedule.xml b/app/src/main/res/layout/dialog_schedule.xml index 91dda50..e30c619 100644 --- a/app/src/main/res/layout/dialog_schedule.xml +++ b/app/src/main/res/layout/dialog_schedule.xml @@ -67,7 +67,7 @@ android:layout_height="wrap_content" android:fontFamily="@font/noto_sans_kr_regular" android:includeFontPadding="true" - android:text="@{scheduleModel.startTime.toString()}" + android:text="3월 4일 09시 00분" android:textColor="@color/black" android:textSize="14sp" app:layout_constraintStart_toStartOf="@id/guidelineMiddle" @@ -92,7 +92,7 @@ android:layout_height="wrap_content" android:fontFamily="@font/noto_sans_kr_regular" android:includeFontPadding="true" - android:text="@{scheduleModel.endTime.toString()}" + android:text="3월 4일 10시 00분" android:textColor="@color/black" android:textSize="14sp" app:layout_constraintStart_toStartOf="@id/guidelineMiddle" diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml index 1ae37cd..58f8e8c 100644 --- a/app/src/main/res/layout/fragment_calendar.xml +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -183,7 +183,7 @@ app:layout_constraintTop_toBottomOf="@id/llDayOfWeek" /> + app:layout_constraintTop_toBottomOf="@id/dayContainer" /> \ No newline at end of file From 42b731ff2bff9d371eaaca5c30e679b47296b808 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Fri, 15 Apr 2022 01:37:55 +0900 Subject: [PATCH 14/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EB=8B=AC=EB=A0=A5?= =?UTF-8?q?=20=EB=82=A0=EC=A7=9C=20=ED=83=80=EC=9E=85=20=EB=B3=84=20?= =?UTF-8?q?=ED=91=9C=EC=8B=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsp_android/ui/main/CalendarAdapter.kt | 33 +++++++++++++++++++ .../gsp_android/ui/main/CalendarFragment.kt | 5 ++- .../gsps/gsp_android/ui/main/ScheduleModel.kt | 14 ++++---- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt index 06e8d45..3d8464d 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt @@ -1,6 +1,7 @@ package com.gsps.gsp_android.ui.main import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter @@ -30,8 +31,31 @@ class CalendarViewHolder(private val binding: ItemDayBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(item: CalendarDayModel) { with(binding) { + setDateType(item) rbDay.text = item.dayOfMonth.toString() + when (item.dateType) { + DateType.EMPTY -> { + rbDay.visibility = View.INVISIBLE + ivPlan.visibility = View.INVISIBLE + } + DateType.NORMAL -> { + rbDay.visibility = View.VISIBLE + rbDay.isChecked = false + ivPlan.visibility = View.INVISIBLE + } + DateType.PLANNED -> { + rbDay.visibility = View.VISIBLE + rbDay.isChecked = false + ivPlan.visibility = View.VISIBLE + } + DateType.SELECTED -> { + rbDay.visibility = View.VISIBLE + rbDay.isChecked = true + ivPlan.visibility = View.INVISIBLE + } + } + rbDay.setOnClickListener { // rbDay 클릭 리스너 // 1. 배경 색 바뀜, 하단 원 안 보임. @@ -39,6 +63,15 @@ class CalendarViewHolder(private val binding: ItemDayBinding) : } } } + + 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 + } } class CalendarDiffCallback : DiffUtil.ItemCallback() { diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt index f0131ab..cd0880e 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -1,5 +1,6 @@ package com.gsps.gsp_android.ui.main +import android.util.Log import androidx.recyclerview.widget.GridLayoutManager import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.FragmentCalendarBinding @@ -27,8 +28,10 @@ class CalendarFragment : BaseFragment(R.layout.fragment val month = calendar.get(Calendar.MONTH) + 1 val list = MutableList(week, init = { CalendarDayModel() }) - for (i in 1..maxDate) + for (i in 1..maxDate) { list.add(CalendarDayModel(DateType.NORMAL, month, i)) + list[week + i - 1].plan.add(ScheduleModel(title = "임시 약속")) + } calendarAdapter.submitList(list) } diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt index 9184d28..fc406d8 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt @@ -1,12 +1,14 @@ package com.gsps.gsp_android.ui.main +import java.time.Instant import java.time.LocalTime +import java.time.ZoneId data class ScheduleModel( - var start: LocalTime, - var end: LocalTime, - var title: String, - var place: String, - var companyName: String, - var logoUrl: String + var start: LocalTime = Instant.ofEpochMilli(System.currentTimeMillis()).atZone(ZoneId.systemDefault()).toLocalTime(), + var end: LocalTime = Instant.ofEpochMilli(System.currentTimeMillis()).atZone(ZoneId.systemDefault()).toLocalTime(), + var title: String = "", + var place: String = "", + var companyName: String = "", + var logoUrl: String = "" ) From 680942f6458a0c584f35eef0c45e3715fc3f612e Mon Sep 17 00:00:00 2001 From: river_is_line Date: Fri, 15 Apr 2022 01:45:11 +0900 Subject: [PATCH 15/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F::=20Calendar=20?= =?UTF-8?q?=EC=84=B8=ED=8C=85=20=ED=95=A8=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gsps/gsp_android/ui/main/CalendarFragment.kt | 7 ++++++- app/src/main/res/values/strings.xml | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt index cd0880e..e26ec2a 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -1,6 +1,5 @@ package com.gsps.gsp_android.ui.main -import android.util.Log import androidx.recyclerview.widget.GridLayoutManager import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.FragmentCalendarBinding @@ -23,6 +22,11 @@ class CalendarFragment : BaseFragment(R.layout.fragment val tmpCal = calendar.timeInMillis calendar.timeInMillis = tmpCal + setCalendar(calendar) + + } + + 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 @@ -33,6 +37,7 @@ class CalendarFragment : BaseFragment(R.layout.fragment list[week + i - 1].plan.add(ScheduleModel(title = "임시 약속")) } + binding.tvMonth.text = "${calendar.get(Calendar.YEAR)}년 ${month}월" calendarAdapter.submitList(list) } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 850287f..2a5e272 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -45,6 +45,5 @@ 협업 신청하러가기 신규가입회사 일정 - %d년 %d월 상세보기 \ No newline at end of file From f86f18a2ff3f4fa3eb4fec081aa37fcab5d15390 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Fri, 15 Apr 2022 02:25:21 +0900 Subject: [PATCH 16/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EB=8B=AC=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsp_android/ui/main/CalendarFragment.kt | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt index e26ec2a..1c88e9c 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -14,7 +14,7 @@ class CalendarFragment : BaseFragment(R.layout.fragment adapter = calendarAdapter } - val calendar = Calendar.getInstance() + var calendar = Calendar.getInstance() calendar.timeInMillis = System.currentTimeMillis() calendar.set(Calendar.DAY_OF_MONTH, 1) @@ -24,9 +24,49 @@ class CalendarFragment : BaseFragment(R.layout.fragment 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) + } + } + + 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 } - fun setCalendar(calendar: 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 From e2c188cf0ffd13f72163a3a5786295ecf2f8226d Mon Sep 17 00:00:00 2001 From: river_is_line Date: Fri, 15 Apr 2022 02:25:52 +0900 Subject: [PATCH 17/21] =?UTF-8?q?=F0=9F=90=9B::=20=EB=8B=AC=EB=A0=A5=20?= =?UTF-8?q?=EB=91=90=20=EB=B2=88=20=EC=B6=9C=EB=A0=A5=EB=90=98=EB=8D=98=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fragment 이중 호출 --- app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt | 2 +- app/src/main/res/layout/activity_main.xml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt index 2175a8e..7e02452 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt @@ -10,7 +10,7 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - val fragment: CalendarFragment = CalendarFragment() + val fragment = CalendarFragment() val fragmentManager: FragmentManager = supportFragmentManager val fragmentTransaction = fragmentManager.beginTransaction() fragmentTransaction.add(R.id.calendarContainer, fragment) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e892a7c..dc3580d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,9 +5,8 @@ android:layout_height="match_parent" tools:context=".ui.main.MainActivity"> - From e670303cb1a4d7ba7da5083c3b9b0b10f3b6e82a Mon Sep 17 00:00:00 2001 From: river_is_line Date: Fri, 15 Apr 2022 04:02:01 +0900 Subject: [PATCH 18/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EB=8B=AC=EB=A0=A5?= =?UTF-8?q?=20=EB=82=A0=EC=A7=9C=20=EC=84=A0=ED=83=9D=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsp_android/ui/main/CalendarAdapter.kt | 85 ++++++++++++------- .../gsp_android/ui/main/CalendarFragment.kt | 3 +- .../gsps/gsp_android/ui/main/MainActivity.kt | 2 +- app/src/main/res/layout/fragment_calendar.xml | 29 ++++--- app/src/main/res/layout/item_day.xml | 6 +- 5 files changed, 76 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt index 3d8464d..da0b300 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt @@ -10,6 +10,8 @@ import com.gsps.gsp_android.databinding.ItemDayBinding class CalendarAdapter : ListAdapter(CalendarDiffCallback()) { + var lastCheckedPosition = -1 + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return CalendarViewHolder( ItemDayBinding.inflate( @@ -25,53 +27,72 @@ class CalendarAdapter : holder.bind(getItem(position)) } } -} -class CalendarViewHolder(private val binding: ItemDayBinding) : - RecyclerView.ViewHolder(binding.root) { - fun bind(item: CalendarDayModel) { - with(binding) { + fun initCheck() { + lastCheckedPosition = -1 + } + + 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 { + // rbDay 클릭 리스너 + // 2. 달력 하단에 스케쥴 리스트 생성 됨. + 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) + } + } + + 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) - rbDay.text = item.dayOfMonth.toString() when (item.dateType) { DateType.EMPTY -> { - rbDay.visibility = View.INVISIBLE - ivPlan.visibility = View.INVISIBLE + binding.rbDay.visibility = View.INVISIBLE + binding.ivPlan.visibility = View.INVISIBLE } DateType.NORMAL -> { - rbDay.visibility = View.VISIBLE - rbDay.isChecked = false - ivPlan.visibility = View.INVISIBLE + binding.rbDay.isChecked = false + binding.rbDay.visibility = View.VISIBLE + binding.ivPlan.visibility = View.INVISIBLE } DateType.PLANNED -> { - rbDay.visibility = View.VISIBLE - rbDay.isChecked = false - ivPlan.visibility = View.VISIBLE + binding.rbDay.isChecked = false + binding.rbDay.visibility = View.VISIBLE + binding.ivPlan.visibility = View.VISIBLE } DateType.SELECTED -> { - rbDay.visibility = View.VISIBLE - rbDay.isChecked = true - ivPlan.visibility = View.INVISIBLE + binding.rbDay.isChecked = true + binding.rbDay.visibility = View.VISIBLE + binding.ivPlan.visibility = View.INVISIBLE } } - - rbDay.setOnClickListener { - // rbDay 클릭 리스너 - // 1. 배경 색 바뀜, 하단 원 안 보임. - // 2. 달력 하단에 스케쥴 리스트 생성 됨. - } } } - - 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 - } } class CalendarDiffCallback : DiffUtil.ItemCallback() { diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt index 1c88e9c..c503f4b 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -10,6 +10,7 @@ class CalendarFragment : BaseFragment(R.layout.fragment private val calendarAdapter: CalendarAdapter by lazy { CalendarAdapter() } override fun initView() { binding.dayContainer.apply { + itemAnimator = null layoutManager = GridLayoutManager(context, 7, GridLayoutManager.VERTICAL, false) adapter = calendarAdapter } @@ -74,10 +75,10 @@ class CalendarFragment : BaseFragment(R.layout.fragment for (i in 1..maxDate) { list.add(CalendarDayModel(DateType.NORMAL, month, i)) - list[week + i - 1].plan.add(ScheduleModel(title = "임시 약속")) } binding.tvMonth.text = "${calendar.get(Calendar.YEAR)}년 ${month}월" + calendarAdapter.initCheck() calendarAdapter.submitList(list) } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt index 7e02452..d547bad 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt @@ -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 androidx.fragment.app.FragmentManager import com.gsps.gsp_android.R diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml index 58f8e8c..65eef22 100644 --- a/app/src/main/res/layout/fragment_calendar.xml +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -38,7 +38,7 @@ app:layout_constraintTop_toBottomOf="@id/llTop"> - + android:layout_marginStart="55dp" + android:background="@color/dark_gray" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:textSize="14sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + android:layout_marginEnd="55dp" + android:background="@color/dark_gray" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + app:layout_constraintStart_toStartOf="parent" /> \ No newline at end of file From 04e5cd52aebd4b40bb324c5479db1230b250b756 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Fri, 15 Apr 2022 22:08:49 +0900 Subject: [PATCH 19/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EB=8B=AC=EB=A0=A5?= =?UTF-8?q?=20=EB=82=A0=EC=8B=B8=20=EC=84=A0=ED=83=9D=20=EC=8B=9C=20?= =?UTF-8?q?=EC=8A=A4=EC=BC=80=EC=A5=B4=20=EB=82=98=ED=83=80=EB=82=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gsp_android/ui/main/CalendarAdapter.kt | 9 ++- .../gsp_android/ui/main/CalendarFragment.kt | 11 ++++ .../gsp_android/ui/main/ScheduleAdapter.kt | 56 +++++++++++-------- .../gsp_android/ui/main/ScheduleFragment.kt | 7 --- .../gsps/gsp_android/ui/main/ScheduleModel.kt | 9 ++- app/src/main/res/layout/fragment_calendar.xml | 4 +- app/src/main/res/layout/fragment_schedule.xml | 13 ----- app/src/main/res/layout/item_schedule.xml | 1 + 8 files changed, 62 insertions(+), 48 deletions(-) delete mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleFragment.kt delete mode 100644 app/src/main/res/layout/fragment_schedule.xml diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt index da0b300..ac8ad09 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt @@ -12,6 +12,7 @@ class CalendarAdapter : ListAdapter(CalendarDiffCallback()) { var lastCheckedPosition = -1 + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return CalendarViewHolder( ItemDayBinding.inflate( @@ -40,8 +41,6 @@ class CalendarAdapter : setVisibility(binding, item) binding.rbDay.setOnClickListener { - // rbDay 클릭 리스너 - // 2. 달력 하단에 스케쥴 리스트 생성 됨. if (lastCheckedPosition == adapterPosition && item.isChecked) { lastCheckedPosition = -1 item.isChecked = false @@ -55,6 +54,12 @@ class CalendarAdapter : lastCheckedPosition = adapterPosition } setVisibility(binding, item) + + if (item.dateType == DateType.SELECTED) { + scheduleAdapter.submitList(item.plan) + } else { + scheduleAdapter.submitList(null) + } } } diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt index c503f4b..e01a309 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -1,13 +1,17 @@ package com.gsps.gsp_android.ui.main import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager import com.gsps.gsp_android.R import com.gsps.gsp_android.databinding.FragmentCalendarBinding import com.gsps.gsp_android.ui.base.BaseFragment import java.util.* +val scheduleAdapter: ScheduleAdapter by lazy { ScheduleAdapter() } + class CalendarFragment : BaseFragment(R.layout.fragment_calendar) { private val calendarAdapter: CalendarAdapter by lazy { CalendarAdapter() } + override fun initView() { binding.dayContainer.apply { itemAnimator = null @@ -15,6 +19,12 @@ class CalendarFragment : BaseFragment(R.layout.fragment adapter = calendarAdapter } + binding.scheduleContainer.apply { + itemAnimator = null + layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + adapter = scheduleAdapter + } + var calendar = Calendar.getInstance() calendar.timeInMillis = System.currentTimeMillis() @@ -75,6 +85,7 @@ class CalendarFragment : BaseFragment(R.layout.fragment for (i in 1..maxDate) { list.add(CalendarDayModel(DateType.NORMAL, month, i)) + list[week + i - 1].plan.add(ScheduleModel(title = "언니한테 붙잡힘", place = "인천시 연수구", companyName = "구름컴퍼니")) } binding.tvMonth.text = "${calendar.get(Calendar.YEAR)}년 ${month}월" diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt index 07c7a3a..fe0e54d 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt @@ -1,39 +1,51 @@ 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.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.gsps.gsp_android.databinding.ItemScheduleBinding +import java.time.format.DateTimeFormatter -class ScheduleAdapter( - context: Context, - private val itemList: MutableList -) : RecyclerView.Adapter() { - override fun onCreateViewHolder( - parent: ViewGroup, - viewType: Int - ): ScheduleAdapter.ScheduleHolder { +class ScheduleAdapter : + ListAdapter(ScheduleDiffCallback()) { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ScheduleViewHolder { val binding = ItemScheduleBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return ScheduleHolder(binding) + return ScheduleViewHolder(binding) } - override fun onBindViewHolder( - holder: ScheduleAdapter.ScheduleHolder, - position: Int - ) { - holder.bind(itemList[position]) + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is ScheduleViewHolder) { + holder.bind(getItem(position)) + } } +} - override fun getItemCount(): Int { - return itemList.size - } +class ScheduleViewHolder(private val binding: ItemScheduleBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(item: ScheduleModel) { + with(binding) { + tvScheduleTitle.text = item.title + tvLocation.text = item.place + tvUserName.text = item.companyName + tvScheduleTime.text = item.start.format(DateTimeFormatter.ofPattern("a H:mm")) - inner class ScheduleHolder(var binding: ItemScheduleBinding) : - RecyclerView.ViewHolder(binding.root) { - fun bind(item: ScheduleModel) { - binding.scheduleModel = item + clItem.setOnClickListener { + + } } } +} + +class ScheduleDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: ScheduleModel, newItem: ScheduleModel): Boolean { + return oldItem === newItem + } + + override fun areContentsTheSame(oldItem: ScheduleModel, newItem: ScheduleModel): Boolean { + return oldItem == newItem + } } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleFragment.kt deleted file mode 100644 index 3671edd..0000000 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleFragment.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.gsps.gsp_android.ui.main - -import androidx.fragment.app.Fragment - -class ScheduleFragment : Fragment() { - -} \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt index fc406d8..d0d07d3 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleModel.kt @@ -1,14 +1,17 @@ package com.gsps.gsp_android.ui.main import java.time.Instant -import java.time.LocalTime +import java.time.LocalDateTime import java.time.ZoneId data class ScheduleModel( - var start: LocalTime = Instant.ofEpochMilli(System.currentTimeMillis()).atZone(ZoneId.systemDefault()).toLocalTime(), - var end: LocalTime = Instant.ofEpochMilli(System.currentTimeMillis()).atZone(ZoneId.systemDefault()).toLocalTime(), + var start: LocalDateTime = Instant.ofEpochMilli(System.currentTimeMillis()) + .atZone(ZoneId.systemDefault()).toLocalDateTime(), + var end: LocalDateTime = Instant.ofEpochMilli(System.currentTimeMillis()) + .atZone(ZoneId.systemDefault()).toLocalDateTime(), var title: String = "", var place: String = "", + var placeDetail: String = "", var companyName: String = "", var logoUrl: String = "" ) diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml index 65eef22..1f987d5 100644 --- a/app/src/main/res/layout/fragment_calendar.xml +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -195,8 +195,10 @@ app:layout_constraintTop_toBottomOf="@id/guidelineStart" app:spanCount="7" /> - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_schedule.xml b/app/src/main/res/layout/item_schedule.xml index fa94246..80cc95f 100644 --- a/app/src/main/res/layout/item_schedule.xml +++ b/app/src/main/res/layout/item_schedule.xml @@ -9,6 +9,7 @@ From b674e50be6dc7f44f8048ce6d369ee970e3a2066 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Tue, 19 Apr 2022 19:50:19 +0900 Subject: [PATCH 20/21] =?UTF-8?q?=E2=9A=A1=EF=B8=8F::=20=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A5=B4=20=EC=84=A0=ED=83=9D=EC=8B=9C=20=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A5=B4=20=EC=A0=95=EB=B3=B4=20dialog=20=EB=82=98=ED=83=80?= =?UTF-8?q?=EB=82=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 3 + .../gsp_android/ui/main/CalendarAdapter.kt | 13 +- .../gsp_android/ui/main/CalendarFragment.kt | 45 ++++- .../gsp_android/ui/main/ScheduleAdapter.kt | 41 ++++- .../gsp_android/ui/main/ScheduleDialog.kt | 52 ++++++ .../gsps/gsp_android/utils/DimensionUtils.kt | 14 ++ app/src/main/res/layout/dialog_schedule.xml | 8 +- app/src/main/res/layout/fragment_calendar.xml | 4 +- app/src/main/res/layout/item_schedule.xml | 163 +++++++++--------- 9 files changed, 248 insertions(+), 95 deletions(-) create mode 100644 app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleDialog.kt create mode 100644 app/src/main/java/com/gsps/gsp_android/utils/DimensionUtils.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8d20c28..cee1912 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -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") } \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt index ac8ad09..ee8be81 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarAdapter.kt @@ -1,18 +1,20 @@ 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 : +class CalendarAdapter(val context: Context) : ListAdapter(CalendarDiffCallback()) { var lastCheckedPosition = -1 - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return CalendarViewHolder( ItemDayBinding.inflate( @@ -31,6 +33,7 @@ class CalendarAdapter : fun initCheck() { lastCheckedPosition = -1 + scheduleAdapter.submitList(null) } inner class CalendarViewHolder(private val binding: ItemDayBinding) : @@ -89,6 +92,12 @@ class CalendarAdapter : 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 diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt index e01a309..49cf13c 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/CalendarFragment.kt @@ -1,18 +1,24 @@ 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.* -val scheduleAdapter: ScheduleAdapter by lazy { ScheduleAdapter() } +lateinit var scheduleAdapter: ScheduleAdapter class CalendarFragment : BaseFragment(R.layout.fragment_calendar) { - private val calendarAdapter: CalendarAdapter by lazy { CalendarAdapter() } + 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) @@ -54,6 +60,39 @@ class CalendarFragment : BaseFragment(R.layout.fragment 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 { @@ -85,10 +124,10 @@ class CalendarFragment : BaseFragment(R.layout.fragment for (i in 1..maxDate) { list.add(CalendarDayModel(DateType.NORMAL, month, i)) - list[week + i - 1].plan.add(ScheduleModel(title = "언니한테 붙잡힘", place = "인천시 연수구", companyName = "구름컴퍼니")) } binding.tvMonth.text = "${calendar.get(Calendar.YEAR)}년 ${month}월" + calendarAdapter.initCheck() calendarAdapter.submitList(list) } diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt index fe0e54d..98a451c 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleAdapter.kt @@ -1,30 +1,37 @@ package com.gsps.gsp_android.ui.main +import android.content.Context +import android.graphics.drawable.GradientDrawable 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.ItemScheduleBinding import java.time.format.DateTimeFormatter -class ScheduleAdapter : +class ScheduleAdapter(private val context: Context) : ListAdapter(ScheduleDiffCallback()) { + lateinit var holder: ScheduleViewHolder + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ScheduleViewHolder { val binding = ItemScheduleBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return ScheduleViewHolder(binding) + return ScheduleViewHolder(context, binding) } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is ScheduleViewHolder) { + holder.setScheduleView(position) holder.bind(getItem(position)) + this.holder = holder } } } -class ScheduleViewHolder(private val binding: ItemScheduleBinding) : +class ScheduleViewHolder(private val context: Context, private val binding: ItemScheduleBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(item: ScheduleModel) { with(binding) { @@ -34,7 +41,28 @@ class ScheduleViewHolder(private val binding: ItemScheduleBinding) : tvScheduleTime.text = item.start.format(DateTimeFormatter.ofPattern("a H:mm")) clItem.setOnClickListener { - + val dialog = ScheduleDialog(context) + dialog.start(context, item) + } + } + } + + fun setScheduleView(position: Int) { + val drawable: GradientDrawable = + ContextCompat.getDrawable(context, R.drawable.circle) as GradientDrawable + + when (position % 3) { + 0 -> { + drawable.setColor(context.getColor(R.color.main_lighten)) + binding.icCircle.setImageDrawable(drawable) + } + 1 -> { + drawable.setColor(context.getColor(R.color.main)) + binding.icCircle.setImageDrawable(drawable) + } + 2 -> { + drawable.setColor(context.getColor(R.color.main_darken)) + binding.icCircle.setImageDrawable(drawable) } } } @@ -48,4 +76,5 @@ class ScheduleDiffCallback : DiffUtil.ItemCallback() { override fun areContentsTheSame(oldItem: ScheduleModel, newItem: ScheduleModel): Boolean { return oldItem == newItem } -} \ No newline at end of file +} + diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleDialog.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleDialog.kt new file mode 100644 index 0000000..5600c30 --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/ScheduleDialog.kt @@ -0,0 +1,52 @@ +package com.gsps.gsp_android.ui.main + +import android.app.Dialog +import android.content.Context +import android.view.LayoutInflater +import android.view.Window +import android.view.WindowManager +import androidx.databinding.DataBindingUtil +import com.bumptech.glide.Glide +import com.gsps.gsp_android.R +import com.gsps.gsp_android.databinding.DialogScheduleBinding +import com.gsps.gsp_android.utils.DimensionUtils +import java.time.format.DateTimeFormatter + +class ScheduleDialog(context: Context) : Dialog(context) { + private val dialog = Dialog(context) + private val binding: DialogScheduleBinding = + DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.dialog_schedule, null, false) + private val defaultImage = R.drawable.rounded_corner_4dp + + fun start(context: Context, item: ScheduleModel) { + val dimension = DimensionUtils() + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) + dialog.setContentView(binding.root) + dialog.setCancelable(true) + + with(binding) { + startTime.text = item.start.format(DateTimeFormatter.ofPattern("M월 d일 a H:mm")) + finishTime.text = item.end.format(DateTimeFormatter.ofPattern("M월 d일 a H:mm")) + tvScheduleTitle.text = item.title + place.text = "${item.place} ${item.placeDetail}" + userName.text = item.companyName + + Glide.with(context) + .load(item.logoUrl) + .placeholder(defaultImage) + .error(defaultImage) + .fallback(defaultImage) + .into(ivLogo) + + btnClose.setOnClickListener { + dialog.dismiss() + } + } + dialog.show() + dialog.window?.setLayout( + dimension.dpToPx(context, 320f), + WindowManager.LayoutParams.WRAP_CONTENT + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/utils/DimensionUtils.kt b/app/src/main/java/com/gsps/gsp_android/utils/DimensionUtils.kt new file mode 100644 index 0000000..a87ace9 --- /dev/null +++ b/app/src/main/java/com/gsps/gsp_android/utils/DimensionUtils.kt @@ -0,0 +1,14 @@ +package com.gsps.gsp_android.utils + +import android.content.Context +import android.util.TypedValue + +class DimensionUtils { + fun dpToPx(context: Context, dp: Float): Int { + return TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + dp.toFloat(), + context.resources.displayMetrics + ).toInt() + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_schedule.xml b/app/src/main/res/layout/dialog_schedule.xml index e30c619..cc9058e 100644 --- a/app/src/main/res/layout/dialog_schedule.xml +++ b/app/src/main/res/layout/dialog_schedule.xml @@ -25,6 +25,7 @@ android:layout_width="32dp" android:layout_height="32dp" android:layout_marginTop="24dp" + android:background="@drawable/rounded_corner_4dp" app:layout_constraintStart_toStartOf="@id/guidelineStart" app:layout_constraintTop_toTopOf="parent" /> @@ -41,7 +42,7 @@ android:layout_height="wrap_content" android:fontFamily="@font/noto_sans_kr_medium" android:includeFontPadding="true" - android:text="@{scheduleModel.title}" + android:text="임시 회의" android:textColor="@color/black" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="@id/ivSchedule" @@ -117,7 +118,7 @@ android:layout_height="wrap_content" android:fontFamily="@font/noto_sans_kr_regular" android:includeFontPadding="true" - android:text="@{scheduleModel.place}" + android:text="00시 00구 00동 00-00 00빌딩 0층" android:textColor="@color/black" android:textSize="14sp" app:layout_constraintStart_toStartOf="@id/guidelineMiddle" @@ -156,7 +157,7 @@ android:layout_marginStart="4dp" android:fontFamily="@font/noto_sans_kr_regular" android:includeFontPadding="true" - android:text="@{scheduleModel.companyName}" + android:text="Adobe" android:textColor="@color/black" android:textSize="14sp" /> @@ -175,6 +176,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="20dp" android:layout_marginBottom="24dp" + android:clickable="true" android:fontFamily="@font/noto_sans_kr_regular" android:text="@string/show_detail" android:textColor="@color/main" diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml index 1f987d5..2ff4097 100644 --- a/app/src/main/res/layout/fragment_calendar.xml +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -197,11 +197,11 @@ diff --git a/app/src/main/res/layout/item_schedule.xml b/app/src/main/res/layout/item_schedule.xml index 80cc95f..c6c3d00 100644 --- a/app/src/main/res/layout/item_schedule.xml +++ b/app/src/main/res/layout/item_schedule.xml @@ -3,94 +3,99 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + + type="com.gsps.gsp_android.ui.main.ScheduleModel" /> - + android:layout_height="wrap_content" + android:orientation="vertical"> + + - + - + - + - + - + - - + + + \ No newline at end of file From f91390656717a01cc57523fade90b4ed025b70e2 Mon Sep 17 00:00:00 2001 From: river_is_line Date: Tue, 19 Apr 2022 19:50:43 +0900 Subject: [PATCH 21/21] =?UTF-8?q?=E2=99=BB=EF=B8=8F::=20init=20mainActivit?= =?UTF-8?q?y?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 21 +++++++------------ .../gsps/gsp_android/ui/main/MainActivity.kt | 7 ------- app/src/main/res/layout/activity_main.xml | 5 ----- 3 files changed, 8 insertions(+), 25 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e624b47..b78de2a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="com.gsps.gsp_android"> @@ -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"> - + android:exported="false" /> + android:exported="false" /> - + @@ -48,19 +47,15 @@ android:theme="@style/Theme.MaterialComponents.DayNight.DarkActionBar" /> - - - - + - \ No newline at end of file diff --git a/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt b/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt index d547bad..bef0587 100644 --- a/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt +++ b/app/src/main/java/com/gsps/gsp_android/ui/main/MainActivity.kt @@ -2,18 +2,11 @@ package com.gsps.gsp_android.ui.main import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.FragmentManager import com.gsps.gsp_android.R class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - - val fragment = CalendarFragment() - val fragmentManager: FragmentManager = supportFragmentManager - val fragmentTransaction = fragmentManager.beginTransaction() - fragmentTransaction.add(R.id.calendarContainer, fragment) - fragmentTransaction.commit() } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index dc3580d..34223ea 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,9 +5,4 @@ android:layout_height="match_parent" tools:context=".ui.main.MainActivity"> - - \ No newline at end of file