From e6dec42ca6a797fc0660ced0066bd6e1d628b03e Mon Sep 17 00:00:00 2001 From: Bandal Date: Sat, 20 Jul 2024 23:31:52 +0900 Subject: [PATCH 01/11] =?UTF-8?q?chore:=20=EC=BA=98=EB=A6=B0=EB=8D=94=20?= =?UTF-8?q?=ED=94=84=EB=A0=88=EC=A0=A0=ED=85=8C=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calendar-presentation/.gitignore | 1 + calendar-presentation/build.gradle.kts | 7 ++++++ calendar-presentation/consumer-rules.pro | 0 calendar-presentation/proguard-rules.pro | 21 ++++++++++++++++++ .../presentation/ExampleInstrumentedTest.kt | 22 +++++++++++++++++++ .../src/main/AndroidManifest.xml | 2 ++ .../calendar/presentation/Calendar.kt | 13 +++++++++++ .../calendar/presentation/ExampleUnitTest.kt | 11 ++++++++++ main-presentation/build.gradle.kts | 1 + .../com/teamhy2/feature/main/MainActivity.kt | 6 ++--- settings.gradle.kts | 1 + 11 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 calendar-presentation/.gitignore create mode 100644 calendar-presentation/build.gradle.kts create mode 100644 calendar-presentation/consumer-rules.pro create mode 100644 calendar-presentation/proguard-rules.pro create mode 100644 calendar-presentation/src/androidTest/java/com/hongikyeolgong2/calendar/presentation/ExampleInstrumentedTest.kt create mode 100644 calendar-presentation/src/main/AndroidManifest.xml create mode 100644 calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt create mode 100644 calendar-presentation/src/test/java/com/hongikyeolgong2/calendar/presentation/ExampleUnitTest.kt diff --git a/calendar-presentation/.gitignore b/calendar-presentation/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/calendar-presentation/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/calendar-presentation/build.gradle.kts b/calendar-presentation/build.gradle.kts new file mode 100644 index 00000000..dcd2da62 --- /dev/null +++ b/calendar-presentation/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("hongikyeolgong2.android.feature") +} + +android { + namespace = "com.teamhy2.hongikyeolgong2.calendar.presentation" +} diff --git a/calendar-presentation/consumer-rules.pro b/calendar-presentation/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/calendar-presentation/proguard-rules.pro b/calendar-presentation/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/calendar-presentation/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/calendar-presentation/src/androidTest/java/com/hongikyeolgong2/calendar/presentation/ExampleInstrumentedTest.kt b/calendar-presentation/src/androidTest/java/com/hongikyeolgong2/calendar/presentation/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..31ac9226 --- /dev/null +++ b/calendar-presentation/src/androidTest/java/com/hongikyeolgong2/calendar/presentation/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.hongikyeolgong2.calendar.presentation + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import junit.framework.TestCase.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.hongikyeolgong2.calendar.presentation.test", appContext.packageName) + } +} diff --git a/calendar-presentation/src/main/AndroidManifest.xml b/calendar-presentation/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8072ee00 --- /dev/null +++ b/calendar-presentation/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt new file mode 100644 index 00000000..c2cde976 --- /dev/null +++ b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt @@ -0,0 +1,13 @@ +package com.hongikyeolgong2.calendar.presentation + +import androidx.compose.foundation.layout.Column +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +@Composable +fun Hy2Calendar(modifier: Modifier = Modifier) { + Column(modifier = modifier) { + Text(text = "test") + } +} diff --git a/calendar-presentation/src/test/java/com/hongikyeolgong2/calendar/presentation/ExampleUnitTest.kt b/calendar-presentation/src/test/java/com/hongikyeolgong2/calendar/presentation/ExampleUnitTest.kt new file mode 100644 index 00000000..b1aa534a --- /dev/null +++ b/calendar-presentation/src/test/java/com/hongikyeolgong2/calendar/presentation/ExampleUnitTest.kt @@ -0,0 +1,11 @@ +package com.hongikyeolgong2.calendar.presentation + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/main-presentation/build.gradle.kts b/main-presentation/build.gradle.kts index ebecc402..3cd54a53 100644 --- a/main-presentation/build.gradle.kts +++ b/main-presentation/build.gradle.kts @@ -9,6 +9,7 @@ android { dependencies { // TODO: 사용하는 feature 모듈의 의존성 추가 // ex) implementation(projects.feature.home) + implementation(projects.calendarPresentation) implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) diff --git a/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt b/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt index 9b02cbe6..d9077bca 100644 --- a/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt +++ b/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt @@ -11,6 +11,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import com.hongikyeolgong2.calendar.presentation.Hy2Calendar import com.teamhy2.designsystem.ui.theme.HY2Theme import com.teamhy2.designsystem.ui.theme.White import dagger.hilt.android.AndroidEntryPoint @@ -24,10 +25,7 @@ class MainActivity : AppCompatActivity() { setContent { HY2Theme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> - Greeting( - name = "Android", - modifier = Modifier.padding(innerPadding), - ) + Hy2Calendar(modifier = Modifier.padding(innerPadding)) } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 648d2f76..8eb004f1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -24,4 +24,5 @@ rootProject.name = "HongikYeolgong2" include(":app") include(":core:designsystem") include(":calendar-domain") +include(":calendar-presentation") include(":main-presentation") From e3f3bf95aa08b3853802eda86981265e3c5990f0 Mon Sep 17 00:00:00 2001 From: Bandal Date: Sun, 21 Jul 2024 23:46:44 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20=EC=BA=98=EB=A6=B0=EB=8D=94?= =?UTF-8?q?=EC=9D=98=20=EB=B6=80=EC=88=98=EC=A0=81=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 캘린더 헤더(연 달 표시, 이전 달 다음 달 버튼) - 캘린더 요일 표시 --- .../calendar/presentation/Calendar.kt | 117 +++++++++++++++++- .../calendar/presentation/DayOfWeek.kt | 11 ++ .../src/main/res/values/strings.xml | 5 + .../src/main/res/drawable/ic_arrow_left.xml | 12 ++ .../src/main/res/drawable/ic_arrow_right.xml | 12 ++ 5 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/DayOfWeek.kt create mode 100644 calendar-presentation/src/main/res/values/strings.xml create mode 100644 core/designsystem/src/main/res/drawable/ic_arrow_left.xml create mode 100644 core/designsystem/src/main/res/drawable/ic_arrow_right.xml diff --git a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt index c2cde976..d12f8cce 100644 --- a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt +++ b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt @@ -1,13 +1,128 @@ package com.hongikyeolgong2.calendar.presentation +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.teamhy2.designsystem.R +import com.teamhy2.designsystem.ui.theme.Gray100 +import com.teamhy2.designsystem.ui.theme.Gray300 +import com.teamhy2.designsystem.ui.theme.HY2Theme +import com.teamhy2.designsystem.ui.theme.HY2Typography +import com.teamhy2.hongikyeolgong2.calendar.presentation.R.string.description_next_month +import com.teamhy2.hongikyeolgong2.calendar.presentation.R.string.description_previous_month @Composable fun Hy2Calendar(modifier: Modifier = Modifier) { Column(modifier = modifier) { - Text(text = "test") + CalendarHeader( + title = "Jan 2024", + onPreviousMonthClick = { /*TODO*/ }, + onNextMonthClick = { /*TODO*/ }, + ) + Row(modifier = Modifier.padding(bottom = 8.dp)) { + DayOfWeek.entries.forEach { dayOfWeek -> + DayOfWeek( + name = dayOfWeek.abbreviation, + modifier = Modifier.weight(1f), + ) + } + } + } +} + +@Composable +fun CalendarHeader( + title: String, + onPreviousMonthClick: () -> Unit, + onNextMonthClick: () -> Unit, + modifier: Modifier = Modifier, +) { + Row( + modifier = modifier, + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = title, + style = HY2Typography().title01, + color = Gray100, + ) + Spacer(modifier = Modifier.weight(1f)) + Icon( + painter = painterResource(id = R.drawable.ic_arrow_left), + modifier = + Modifier.clickable( + interactionSource = MutableInteractionSource(), + indication = null, + onClick = onPreviousMonthClick, + ), + tint = Gray300, + contentDescription = stringResource(description_previous_month), + ) + Icon( + painter = painterResource(id = R.drawable.ic_arrow_right), + modifier = + Modifier.clickable( + interactionSource = MutableInteractionSource(), + indication = null, + onClick = onNextMonthClick, + ), + tint = Gray300, + contentDescription = stringResource(description_next_month), + ) + } +} + +@Composable +fun DayOfWeek( + name: String, + modifier: Modifier = Modifier, +) { + Text( + text = name, + modifier = modifier, + textAlign = TextAlign.Center, + style = HY2Typography().body04, + color = Gray300, + ) +} + +@Preview +@Composable +private fun Hy2CalendarPreview() { + HY2Theme { + Hy2Calendar() + } +} + +@Preview +@Composable +private fun CalendarHeaderPreview() { + HY2Theme { + CalendarHeader( + title = "Jan 2024", + onPreviousMonthClick = { }, + onNextMonthClick = { }, + ) + } +} + +@Preview +@Composable +private fun DayOfWeekPreview() { + HY2Theme { + DayOfWeek(name = "Mon") } } diff --git a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/DayOfWeek.kt b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/DayOfWeek.kt new file mode 100644 index 00000000..e22a3dc3 --- /dev/null +++ b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/DayOfWeek.kt @@ -0,0 +1,11 @@ +package com.hongikyeolgong2.calendar.presentation + +enum class DayOfWeek(val abbreviation: String) { + Sunday("Sun"), + Monday("Mon"), + Tuesday("Tue"), + Wednesday("Wed"), + Thursday("Thu"), + Friday("Fri"), + Saturday("Sat"), +} diff --git a/calendar-presentation/src/main/res/values/strings.xml b/calendar-presentation/src/main/res/values/strings.xml new file mode 100644 index 00000000..fc463867 --- /dev/null +++ b/calendar-presentation/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + + previous month + next month + diff --git a/core/designsystem/src/main/res/drawable/ic_arrow_left.xml b/core/designsystem/src/main/res/drawable/ic_arrow_left.xml new file mode 100644 index 00000000..0e4f7b87 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_arrow_left.xml @@ -0,0 +1,12 @@ + + + diff --git a/core/designsystem/src/main/res/drawable/ic_arrow_right.xml b/core/designsystem/src/main/res/drawable/ic_arrow_right.xml new file mode 100644 index 00000000..06c99d65 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_arrow_right.xml @@ -0,0 +1,12 @@ + + + From bdd73963defff21e32a68177e0eda86bf51138ff Mon Sep 17 00:00:00 2001 From: Bandal Date: Mon, 22 Jul 2024 23:54:52 +0900 Subject: [PATCH 03/11] =?UTF-8?q?feat:=20=EC=BA=98=EB=A6=B0=EB=8D=94=20?= =?UTF-8?q?=EC=9D=BC=20=ED=91=9C=EC=8B=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/presentation/Calendar.kt | 62 +++++++++++++++++-- main-presentation/build.gradle.kts | 1 + .../com/teamhy2/feature/main/MainActivity.kt | 12 +++- 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt index d12f8cce..b534af46 100644 --- a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt +++ b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt @@ -1,36 +1,54 @@ package com.hongikyeolgong2.calendar.presentation +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.hongikyeolgong2.calendar.model.Calendar +import com.hongikyeolgong2.calendar.model.StudyDay import com.teamhy2.designsystem.R import com.teamhy2.designsystem.ui.theme.Gray100 import com.teamhy2.designsystem.ui.theme.Gray300 +import com.teamhy2.designsystem.ui.theme.Gray800 import com.teamhy2.designsystem.ui.theme.HY2Theme import com.teamhy2.designsystem.ui.theme.HY2Typography +import com.teamhy2.designsystem.ui.theme.White import com.teamhy2.hongikyeolgong2.calendar.presentation.R.string.description_next_month import com.teamhy2.hongikyeolgong2.calendar.presentation.R.string.description_previous_month @Composable -fun Hy2Calendar(modifier: Modifier = Modifier) { +fun Hy2Calendar( + calendar: Calendar, + onPreviousMonthClick: () -> Unit, + onNextMonthClick: () -> Unit, + modifier: Modifier = Modifier, +) { Column(modifier = modifier) { CalendarHeader( - title = "Jan 2024", - onPreviousMonthClick = { /*TODO*/ }, - onNextMonthClick = { /*TODO*/ }, + title = calendar.now, + onPreviousMonthClick = onPreviousMonthClick, + onNextMonthClick = onNextMonthClick, ) Row(modifier = Modifier.padding(bottom = 8.dp)) { DayOfWeek.entries.forEach { dayOfWeek -> @@ -40,6 +58,15 @@ fun Hy2Calendar(modifier: Modifier = Modifier) { ) } } + LazyVerticalGrid( + columns = GridCells.Fixed(7), + verticalArrangement = Arrangement.spacedBy(5.dp), + horizontalArrangement = Arrangement.spacedBy(5.dp), + ) { + items(calendar.getMonth()) { + Day(studyDay = it, modifier = Modifier.weight(1f)) + } + } } } @@ -99,11 +126,36 @@ fun DayOfWeek( ) } +@Composable +fun Day( + studyDay: StudyDay, + modifier: Modifier = Modifier, +) { + Box( + modifier = + modifier + .height(33.dp) + .clip(RoundedCornerShape(8.dp)) + .background(Gray800), + contentAlignment = Alignment.Center, + ) { + Text( + text = studyDay.date.dayOfMonth.toString(), + style = HY2Typography().body03, + color = White, + ) + } +} + @Preview @Composable private fun Hy2CalendarPreview() { HY2Theme { - Hy2Calendar() + Hy2Calendar( + calendar = Calendar(), + onPreviousMonthClick = {}, + onNextMonthClick = {}, + ) } } diff --git a/main-presentation/build.gradle.kts b/main-presentation/build.gradle.kts index 3cd54a53..597383e3 100644 --- a/main-presentation/build.gradle.kts +++ b/main-presentation/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { // TODO: 사용하는 feature 모듈의 의존성 추가 // ex) implementation(projects.feature.home) implementation(projects.calendarPresentation) + implementation(projects.calendarDomain) implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) diff --git a/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt b/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt index d9077bca..13fac216 100644 --- a/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt +++ b/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt @@ -4,6 +4,7 @@ import android.os.Bundle import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold @@ -11,6 +12,8 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.hongikyeolgong2.calendar.model.Calendar import com.hongikyeolgong2.calendar.presentation.Hy2Calendar import com.teamhy2.designsystem.ui.theme.HY2Theme import com.teamhy2.designsystem.ui.theme.White @@ -25,7 +28,14 @@ class MainActivity : AppCompatActivity() { setContent { HY2Theme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> - Hy2Calendar(modifier = Modifier.padding(innerPadding)) + Column(Modifier.padding(innerPadding)) { + Hy2Calendar( + calendar = Calendar(), + onPreviousMonthClick = { /* TODO: 구현 필요 */ }, + onNextMonthClick = { /* TODO: 구현 필요 */ }, + modifier = Modifier.padding(horizontal = 26.dp), + ) + } } } } From b249a2b7b277ba12b485cd525d754dabeeb04159 Mon Sep 17 00:00:00 2001 From: Bandal Date: Tue, 23 Jul 2024 22:58:26 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat:=20=EC=97=B4=EB=9E=8C=EC=8B=A4=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EB=8F=84=20=EA=B0=9D=EC=B2=B4=EC=97=90=20?= =?UTF-8?q?=ED=95=9C=EB=B2=88=EB=8F=84=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=8C=EC=9D=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/hongikyeolgong2/calendar/model/StudyRoomUsage.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/StudyRoomUsage.kt b/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/StudyRoomUsage.kt index 90927ae0..9805ce09 100644 --- a/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/StudyRoomUsage.kt +++ b/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/StudyRoomUsage.kt @@ -1,6 +1,7 @@ package com.hongikyeolgong2.calendar.model enum class StudyRoomUsage { + NEVER_USED, USED_ONCE, USED_ONCE_EXTENDED_ONCE, USED_ONCE_EXTENDED_TWICE, From 933abfb12d4a34083e8c319cd7d4b91fc36cb272 Mon Sep 17 00:00:00 2001 From: Bandal Date: Tue, 23 Jul 2024 23:02:11 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat:=20=EC=BA=98=EB=A6=B0=EB=8D=94?= =?UTF-8?q?=EC=97=90=20=ED=91=9C=EC=8B=9C=EB=90=A0=20=EB=82=A0=EC=9D=84=20?= =?UTF-8?q?=ED=91=9C=EC=8B=9C=ED=95=98=EB=8A=94=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EC=A0=80=EB=B8=94=EC=9D=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/presentation/Day.kt | 167 ++++++++++++++++++ .../src/main/res/drawable/bg_day_0.png | Bin 0 -> 347 bytes .../src/main/res/drawable/bg_day_1.png | Bin 0 -> 10615 bytes .../src/main/res/drawable/bg_day_2.png | Bin 0 -> 11365 bytes .../src/main/res/drawable/bg_day_3.png | Bin 0 -> 7441 bytes 5 files changed, 167 insertions(+) create mode 100644 calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Day.kt create mode 100644 calendar-presentation/src/main/res/drawable/bg_day_0.png create mode 100644 calendar-presentation/src/main/res/drawable/bg_day_1.png create mode 100644 calendar-presentation/src/main/res/drawable/bg_day_2.png create mode 100644 calendar-presentation/src/main/res/drawable/bg_day_3.png diff --git a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Day.kt b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Day.kt new file mode 100644 index 00000000..d43fb196 --- /dev/null +++ b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Day.kt @@ -0,0 +1,167 @@ +package com.hongikyeolgong2.calendar.presentation + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.hongikyeolgong2.calendar.model.StudyDay +import com.hongikyeolgong2.calendar.model.StudyRoomUsage +import com.teamhy2.designsystem.ui.theme.Blue200 +import com.teamhy2.designsystem.ui.theme.Blue400 +import com.teamhy2.designsystem.ui.theme.Gray100 +import com.teamhy2.designsystem.ui.theme.Gray300 +import com.teamhy2.designsystem.ui.theme.Gray600 +import com.teamhy2.designsystem.ui.theme.HY2Theme +import com.teamhy2.designsystem.ui.theme.HY2Typography +import com.teamhy2.designsystem.ui.theme.White +import com.teamhy2.hongikyeolgong2.calendar.presentation.R.drawable.bg_day_0 +import com.teamhy2.hongikyeolgong2.calendar.presentation.R.drawable.bg_day_1 +import com.teamhy2.hongikyeolgong2.calendar.presentation.R.drawable.bg_day_2 +import com.teamhy2.hongikyeolgong2.calendar.presentation.R.drawable.bg_day_3 +import java.time.LocalDate + +private const val DEFAULT_RADIUS = 8 +private const val DAY_SIZE_RATIO = 1.212f + +@Composable +fun Day( + studyDay: StudyDay, + modifier: Modifier = Modifier, +) { + val dayUi = DayUi.of(studyDay.studyRoomUsage) + + Box( + modifier = + modifier + .aspectRatio(DAY_SIZE_RATIO, false) + .then(dayUi.modifier), + contentAlignment = Alignment.Center, + ) { + Image( + painter = painterResource(id = dayUi.background), + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier.matchParentSize(), + ) + Text( + text = studyDay.date.dayOfMonth.toString(), + style = HY2Typography().body03, + color = dayUi.textColor, + ) + } +} + +enum class DayUi( + val textColor: Color, + @DrawableRes val background: Int, + val modifier: Modifier, +) { + NEVER_USED( + textColor = Gray300, + background = bg_day_0, + modifier = + Modifier + .clip(RoundedCornerShape(DEFAULT_RADIUS.dp)), + ), + USED_ONCE( + textColor = Gray100, + background = bg_day_1, + modifier = + Modifier + .clip(RoundedCornerShape(DEFAULT_RADIUS.dp)) + .border( + width = 1.dp, + color = Blue400, + shape = RoundedCornerShape(DEFAULT_RADIUS.dp), + ), + ), + USED_ONCE_EXTENDED_ONCE( + textColor = White, + background = bg_day_2, + modifier = + Modifier + .clip(RoundedCornerShape(DEFAULT_RADIUS.dp)) + .border(width = 1.dp, color = Blue200, shape = RoundedCornerShape(DEFAULT_RADIUS.dp)), + ), + USED_ONCE_EXTENDED_TWICE( + textColor = Gray600, + background = bg_day_3, + modifier = + Modifier + .clip(RoundedCornerShape(DEFAULT_RADIUS.dp)) + .border( + width = 1.dp, + color = Color(0xFFCECF37), + shape = RoundedCornerShape(DEFAULT_RADIUS.dp), + ), + ), + ; + + companion object { + fun of(studyRoomUsage: StudyRoomUsage): DayUi { + return when (studyRoomUsage) { + StudyRoomUsage.NEVER_USED -> NEVER_USED + StudyRoomUsage.USED_ONCE -> USED_ONCE + StudyRoomUsage.USED_ONCE_EXTENDED_ONCE -> USED_ONCE_EXTENDED_ONCE + StudyRoomUsage.USED_ONCE_EXTENDED_TWICE -> USED_ONCE_EXTENDED_TWICE + } + } + } +} + +@Preview +@Composable +private fun NeverUsedDayPreview() { + HY2Theme { + Day( + studyDay = StudyDay(LocalDate.now(), StudyRoomUsage.NEVER_USED), + modifier = Modifier.size(40.dp), + ) + } +} + +@Preview +@Composable +private fun UsedOnceDayPreview() { + HY2Theme { + Day( + studyDay = StudyDay(LocalDate.now(), StudyRoomUsage.USED_ONCE), + modifier = Modifier.size(40.dp), + ) + } +} + +@Preview +@Composable +private fun UsedOnceExtendedOnceDayPreview() { + HY2Theme { + Day( + studyDay = StudyDay(LocalDate.now(), StudyRoomUsage.USED_ONCE_EXTENDED_ONCE), + modifier = Modifier.size(40.dp), + ) + } +} + +@Preview +@Composable +private fun UsedOnceExtendedTwiceDayPreview() { + HY2Theme { + Day( + studyDay = StudyDay(LocalDate.now(), StudyRoomUsage.USED_ONCE_EXTENDED_TWICE), + modifier = Modifier.size(40.dp), + ) + } +} diff --git a/calendar-presentation/src/main/res/drawable/bg_day_0.png b/calendar-presentation/src/main/res/drawable/bg_day_0.png new file mode 100644 index 0000000000000000000000000000000000000000..cd582958b606c2ede08c502279a59657070bc960 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^6+oQK!3HD)N{@5_Db50q$YKTtMGFvSbe(3H02E{_ z4sv&5Sa(k5C6L3C?&#~tz_78O`%fY(kpIEc#WAFU@$E%NUIqoAuB~0O?SCJ?EN8yr zz@6v&9Ir_&;p`KZQMd3bnDfBmU}4i^mg7TO;P<{wOx7(+7Muh6ox#)9&t;ucLK6V% C>wQT8 literal 0 HcmV?d00001 diff --git a/calendar-presentation/src/main/res/drawable/bg_day_1.png b/calendar-presentation/src/main/res/drawable/bg_day_1.png new file mode 100644 index 0000000000000000000000000000000000000000..69476b0b6b0176e074ebef504b96d7618506603c GIT binary patch literal 10615 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 literal 0 HcmV?d00001 diff --git a/calendar-presentation/src/main/res/drawable/bg_day_3.png b/calendar-presentation/src/main/res/drawable/bg_day_3.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8c5ceed65fb6f57ab51654f9df8451c0a5e662 GIT binary patch literal 7441 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 P00000NkvXXu0mjfg1~z^ literal 0 HcmV?d00001 From 0060f8b78e2571cac7e46c4b8f6a6d742c4a3ebd Mon Sep 17 00:00:00 2001 From: Bandal Date: Wed, 24 Jul 2024 21:25:42 +0900 Subject: [PATCH 06/11] =?UTF-8?q?feat:=20=EC=BA=98=EB=A6=B0=EB=8D=94?= =?UTF-8?q?=EB=8A=94=20=ED=98=84=EC=9E=AC=20=EC=8B=9C=EA=B0=84=EC=9D=B4=20?= =?UTF-8?q?=ED=8F=AC=ED=95=A8=EB=90=9C=20=EB=8B=AC=EC=9D=98=20=EB=82=A0?= =?UTF-8?q?=EB=93=A4=EC=9D=84=20=EA=B0=80=EC=A0=B8=EC=98=AC=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/model/Calendar.kt | 20 ++++++-- .../calendar/model/CalendarTest.kt | 48 ++++++++++++++++++- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/Calendar.kt b/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/Calendar.kt index edd2b8a6..fd71132a 100644 --- a/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/Calendar.kt +++ b/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/Calendar.kt @@ -15,6 +15,22 @@ class Calendar( val now: String get() = dateTimeFormatter.format(date) + fun getMonth(): List { + val studyDaysWithMonth = getStudyDaysByMonth() + val existingDays = studyDaysWithMonth.associateBy { it.date.dayOfMonth } + + return (1..getLastDayOfMonth()).map { day -> + existingDays[day] ?: StudyDay( + date = date.withDayOfMonth(day), + studyRoomUsage = StudyRoomUsage.NEVER_USED, + ) + }.sortedBy { it.date.dayOfMonth } + } + + fun getStudyDaysByMonth(): List { + return studyDays.filter { it.date.month == date.month } + } + fun getLastDayOfMonth(): Int { return YearMonth.from(date).atEndOfMonth().dayOfMonth } @@ -27,10 +43,6 @@ class Calendar( date = date.plusMonths(1) } - fun getStudyDaysByMonth(): List { - return studyDays.filter { it.date.month == date.month } - } - companion object { private const val DEFAULT_DATE_TIME_FORMAT_PATTERN = "MMM yyyy" } diff --git a/calendar-domain/src/test/kotlin/com/hongikyeolgong2/calendar/model/CalendarTest.kt b/calendar-domain/src/test/kotlin/com/hongikyeolgong2/calendar/model/CalendarTest.kt index 3eacce31..0488bf97 100644 --- a/calendar-domain/src/test/kotlin/com/hongikyeolgong2/calendar/model/CalendarTest.kt +++ b/calendar-domain/src/test/kotlin/com/hongikyeolgong2/calendar/model/CalendarTest.kt @@ -7,6 +7,44 @@ import java.time.format.DateTimeFormatter import java.util.Locale class CalendarTest : BehaviorSpec({ + Given("현재 날짜가 포함된 달의 모든 날을 가져올 수 있다.") { + var date: LocalDate + var calendar: Calendar + var actual: List + + When("2024년 1월 5일이 주어지면") { + date = LocalDate.of(2024, 1, 5) + calendar = Calendar(date) + + Then("31개의 날들이 반환된다") { + actual = calendar.getMonth() + actual.size shouldBe 31 + } + + Then("순서를 유지한체 1일부터 31일 까지 반환된다") { + actual = calendar.getMonth() + actual.first().date shouldBe LocalDate.of(2024, 1, 1) + actual.last().date shouldBe LocalDate.of(2024, 1, 31) + } + } + + When("2024년 2월 15일이 주어지면") { + date = LocalDate.of(2024, 2, 15) + calendar = Calendar(date) + + Then("29개의 날들이 반환된다") { + actual = calendar.getMonth() + actual.size shouldBe 29 + } + + Then("윤년이기 때문에 1부터 29일까지 반환된다.") { + actual = calendar.getMonth() + actual.first().date shouldBe LocalDate.of(2024, 2, 1) + actual.last().date shouldBe LocalDate.of(2024, 2, 29) + } + } + } + Given("LocalDate가 주어지면, 해당 달의 끝날짜를 알 수 있다.") { var date: LocalDate var calendar: Calendar @@ -178,8 +216,14 @@ class CalendarTest : BehaviorSpec({ actual shouldBe listOf( StudyDay(LocalDate.of(2024, 2, 1), StudyRoomUsage.USED_ONCE), - StudyDay(LocalDate.of(2024, 2, 3), StudyRoomUsage.USED_ONCE_EXTENDED_ONCE), - StudyDay(LocalDate.of(2024, 2, 4), StudyRoomUsage.USED_ONCE_EXTENDED_ONCE), + StudyDay( + LocalDate.of(2024, 2, 3), + StudyRoomUsage.USED_ONCE_EXTENDED_ONCE, + ), + StudyDay( + LocalDate.of(2024, 2, 4), + StudyRoomUsage.USED_ONCE_EXTENDED_ONCE, + ), ) } } From 4e212dfb6dd47432a5fb9a16d0077fd8515fe89f Mon Sep 17 00:00:00 2001 From: Bandal Date: Wed, 24 Jul 2024 21:26:41 +0900 Subject: [PATCH 07/11] =?UTF-8?q?feat:=20=EC=BA=98=EB=A6=B0=EB=8D=94?= =?UTF-8?q?=EA=B0=80=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20DateTimeFormatter=EC=9D=98=20Locale=EC=9D=84=20?= =?UTF-8?q?=EC=98=81=EC=96=B4=EA=B6=8C=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/hongikyeolgong2/calendar/model/Calendar.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/Calendar.kt b/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/Calendar.kt index fd71132a..110b73c4 100644 --- a/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/Calendar.kt +++ b/calendar-domain/src/main/java/com/hongikyeolgong2/calendar/model/Calendar.kt @@ -3,11 +3,12 @@ package com.hongikyeolgong2.calendar.model import java.time.LocalDate import java.time.YearMonth import java.time.format.DateTimeFormatter +import java.util.Locale class Calendar( initDate: LocalDate = LocalDate.now(), private val dateTimeFormatter: DateTimeFormatter = - DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT_PATTERN), + DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT_PATTERN).withLocale(Locale.ENGLISH), private val studyDays: List = emptyList(), ) { private var date: LocalDate = initDate From ef6e823faa69a6902deb6b5ab1dde15120efdd30 Mon Sep 17 00:00:00 2001 From: Bandal Date: Wed, 24 Jul 2024 21:28:33 +0900 Subject: [PATCH 08/11] =?UTF-8?q?feat:=20=EC=BA=98=EB=A6=B0=EB=8D=94=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EC=A0=80=EB=B8=94=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calendar-presentation/build.gradle.kts | 4 + .../calendar/presentation/Calendar.kt | 98 ++++++++++++------- 2 files changed, 68 insertions(+), 34 deletions(-) diff --git a/calendar-presentation/build.gradle.kts b/calendar-presentation/build.gradle.kts index dcd2da62..aa178191 100644 --- a/calendar-presentation/build.gradle.kts +++ b/calendar-presentation/build.gradle.kts @@ -5,3 +5,7 @@ plugins { android { namespace = "com.teamhy2.hongikyeolgong2.calendar.presentation" } + +dependencies { + implementation(projects.calendarDomain) +} diff --git a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt index b534af46..490a1dd4 100644 --- a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt +++ b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt @@ -1,6 +1,5 @@ package com.hongikyeolgong2.calendar.presentation -import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement @@ -13,13 +12,15 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -27,29 +28,33 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.hongikyeolgong2.calendar.model.Calendar import com.hongikyeolgong2.calendar.model.StudyDay +import com.hongikyeolgong2.calendar.model.StudyRoomUsage import com.teamhy2.designsystem.R import com.teamhy2.designsystem.ui.theme.Gray100 import com.teamhy2.designsystem.ui.theme.Gray300 -import com.teamhy2.designsystem.ui.theme.Gray800 import com.teamhy2.designsystem.ui.theme.HY2Theme import com.teamhy2.designsystem.ui.theme.HY2Typography -import com.teamhy2.designsystem.ui.theme.White import com.teamhy2.hongikyeolgong2.calendar.presentation.R.string.description_next_month import com.teamhy2.hongikyeolgong2.calendar.presentation.R.string.description_previous_month +import java.time.LocalDate + +private const val DAY_DEFAULT_MARGIN = 5 @Composable fun Hy2Calendar( - calendar: Calendar, + title: String, + days: List, onPreviousMonthClick: () -> Unit, onNextMonthClick: () -> Unit, modifier: Modifier = Modifier, ) { Column(modifier = modifier) { CalendarHeader( - title = calendar.now, + title = title, onPreviousMonthClick = onPreviousMonthClick, onNextMonthClick = onNextMonthClick, ) + Spacer(modifier = Modifier.height(12.dp)) Row(modifier = Modifier.padding(bottom = 8.dp)) { DayOfWeek.entries.forEach { dayOfWeek -> DayOfWeek( @@ -60,10 +65,14 @@ fun Hy2Calendar( } LazyVerticalGrid( columns = GridCells.Fixed(7), - verticalArrangement = Arrangement.spacedBy(5.dp), - horizontalArrangement = Arrangement.spacedBy(5.dp), + verticalArrangement = Arrangement.spacedBy(DAY_DEFAULT_MARGIN.dp), + horizontalArrangement = Arrangement.spacedBy(DAY_DEFAULT_MARGIN.dp), ) { - items(calendar.getMonth()) { + items((days.first().date.dayOfWeek.ordinal + 1) % 7) { + Box(modifier = Modifier.weight(1f)) + } + + items(days) { Day(studyDay = it, modifier = Modifier.weight(1f)) } } @@ -126,35 +135,56 @@ fun DayOfWeek( ) } -@Composable -fun Day( - studyDay: StudyDay, - modifier: Modifier = Modifier, -) { - Box( - modifier = - modifier - .height(33.dp) - .clip(RoundedCornerShape(8.dp)) - .background(Gray800), - contentAlignment = Alignment.Center, - ) { - Text( - text = studyDay.date.dayOfMonth.toString(), - style = HY2Typography().body03, - color = White, - ) - } -} - @Preview @Composable private fun Hy2CalendarPreview() { HY2Theme { + val calendar by remember { + mutableStateOf( + Calendar( + studyDays = + listOf( + StudyDay( + date = LocalDate.now().withDayOfMonth(2), + studyRoomUsage = StudyRoomUsage.USED_ONCE_EXTENDED_ONCE, + ), + StudyDay( + date = LocalDate.now().withDayOfMonth(5), + studyRoomUsage = StudyRoomUsage.USED_ONCE, + ), + StudyDay( + date = LocalDate.now().withDayOfMonth(10), + studyRoomUsage = StudyRoomUsage.USED_ONCE_EXTENDED_TWICE, + ), + StudyDay( + date = LocalDate.now().withDayOfMonth(20), + studyRoomUsage = StudyRoomUsage.NEVER_USED, + ), + ), + ), + ) + } + var title by remember { + mutableStateOf(calendar.now) + } + + var month by remember { + mutableStateOf(calendar.getMonth()) + } + Hy2Calendar( - calendar = Calendar(), - onPreviousMonthClick = {}, - onNextMonthClick = {}, + title = title, + days = month, + onPreviousMonthClick = { + calendar.moveToPreviousMonth() + title = calendar.now + month = calendar.getMonth() + }, + onNextMonthClick = { + calendar.moveToNextMonth() + title = calendar.now + month = calendar.getMonth() + }, ) } } From b9f976adcf5faffee898ee5eb8ce35d32125e4a3 Mon Sep 17 00:00:00 2001 From: Bandal Date: Wed, 24 Jul 2024 21:29:29 +0900 Subject: [PATCH 09/11] =?UTF-8?q?chore:=20=EC=9E=84=EC=8B=9C=EB=A1=9C=20?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=EC=95=A1=ED=8B=B0=EB=B9=84=ED=8B=B0=EC=97=90?= =?UTF-8?q?=20=EB=84=A3=EC=9D=80=20=EC=BB=B4=ED=8F=AC=EC=A0=80=EB=B8=94=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/teamhy2/feature/main/MainActivity.kt | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt b/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt index 13fac216..4aae18d3 100644 --- a/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt +++ b/main-presentation/src/main/java/com/teamhy2/feature/main/MainActivity.kt @@ -12,9 +12,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.hongikyeolgong2.calendar.model.Calendar -import com.hongikyeolgong2.calendar.presentation.Hy2Calendar import com.teamhy2.designsystem.ui.theme.HY2Theme import com.teamhy2.designsystem.ui.theme.White import dagger.hilt.android.AndroidEntryPoint @@ -29,12 +26,7 @@ class MainActivity : AppCompatActivity() { HY2Theme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> Column(Modifier.padding(innerPadding)) { - Hy2Calendar( - calendar = Calendar(), - onPreviousMonthClick = { /* TODO: 구현 필요 */ }, - onNextMonthClick = { /* TODO: 구현 필요 */ }, - modifier = Modifier.padding(horizontal = 26.dp), - ) + Text("Hello World!") } } } From 544b353db311e4875493d420bea18702f67d9a97 Mon Sep 17 00:00:00 2001 From: Bandal Date: Fri, 26 Jul 2024 23:58:03 +0900 Subject: [PATCH 10/11] =?UTF-8?q?refactor:=20=EC=BA=98=EB=A6=B0=EB=8D=94?= =?UTF-8?q?=20=EC=BB=B4=ED=8F=AC=EC=A0=80=EB=B8=94=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calendar/presentation/Calendar.kt | 57 ++++++++++++------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt index 490a1dd4..d814897c 100644 --- a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt +++ b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height @@ -55,27 +56,8 @@ fun Hy2Calendar( onNextMonthClick = onNextMonthClick, ) Spacer(modifier = Modifier.height(12.dp)) - Row(modifier = Modifier.padding(bottom = 8.dp)) { - DayOfWeek.entries.forEach { dayOfWeek -> - DayOfWeek( - name = dayOfWeek.abbreviation, - modifier = Modifier.weight(1f), - ) - } - } - LazyVerticalGrid( - columns = GridCells.Fixed(7), - verticalArrangement = Arrangement.spacedBy(DAY_DEFAULT_MARGIN.dp), - horizontalArrangement = Arrangement.spacedBy(DAY_DEFAULT_MARGIN.dp), - ) { - items((days.first().date.dayOfWeek.ordinal + 1) % 7) { - Box(modifier = Modifier.weight(1f)) - } - - items(days) { - Day(studyDay = it, modifier = Modifier.weight(1f)) - } - } + CalendarDayOfWeeks() + CalendarBody(days = days) } } @@ -121,6 +103,18 @@ fun CalendarHeader( } } +@Composable +private fun CalendarDayOfWeeks() { + Row(modifier = Modifier.padding(bottom = 8.dp)) { + DayOfWeek.entries.forEach { dayOfWeek -> + DayOfWeek( + name = dayOfWeek.abbreviation, + modifier = Modifier.weight(1f), + ) + } + } +} + @Composable fun DayOfWeek( name: String, @@ -135,6 +129,27 @@ fun DayOfWeek( ) } +@Composable +fun ColumnScope.CalendarBody( + days: List, + modifier: Modifier = Modifier, +) { + LazyVerticalGrid( + columns = GridCells.Fixed(7), + verticalArrangement = Arrangement.spacedBy(DAY_DEFAULT_MARGIN.dp), + horizontalArrangement = Arrangement.spacedBy(DAY_DEFAULT_MARGIN.dp), + modifier = modifier, + ) { + items((days.first().date.dayOfWeek.ordinal + 1) % 7) { + Box(modifier = Modifier.weight(1f)) + } + + items(days) { + Day(studyDay = it, modifier = Modifier.weight(1f)) + } + } +} + @Preview @Composable private fun Hy2CalendarPreview() { From 790f85f1719ad58413d867f9f0167de62780f04f Mon Sep 17 00:00:00 2001 From: Bandal Date: Sat, 27 Jul 2024 00:11:32 +0900 Subject: [PATCH 11/11] =?UTF-8?q?refactor:=20=EC=BA=98=EB=A6=B0=EB=8D=94?= =?UTF-8?q?=20=EC=BB=B4=ED=8F=AC=EC=A0=80=EB=B8=94=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=20=EC=A0=9C=ED=95=9C=EC=9E=90=EB=A5=BC=20pri?= =?UTF-8?q?vate=EC=9C=BC=EB=A1=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hongikyeolgong2/calendar/presentation/Calendar.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt index d814897c..b40e8709 100644 --- a/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt +++ b/calendar-presentation/src/main/java/com/hongikyeolgong2/calendar/presentation/Calendar.kt @@ -62,7 +62,7 @@ fun Hy2Calendar( } @Composable -fun CalendarHeader( +private fun CalendarHeader( title: String, onPreviousMonthClick: () -> Unit, onNextMonthClick: () -> Unit, @@ -116,7 +116,7 @@ private fun CalendarDayOfWeeks() { } @Composable -fun DayOfWeek( +private fun DayOfWeek( name: String, modifier: Modifier = Modifier, ) { @@ -130,7 +130,7 @@ fun DayOfWeek( } @Composable -fun ColumnScope.CalendarBody( +private fun ColumnScope.CalendarBody( days: List, modifier: Modifier = Modifier, ) {