diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 2d62373ca..f5e6d84ae 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -70,5 +70,9 @@ gradlePlugin { id = "snutt.semantic.versioning" implementationClass = "SemanticVersioningConventionPlugin" } + register("jvmLibrary") { + id = "snutt.jvm.library" + implementationClass = "JvmLibraryConventionPlugin" + } } } diff --git a/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt new file mode 100644 index 000000000..16caaff3f --- /dev/null +++ b/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt @@ -0,0 +1,14 @@ +import com.wafflestudio.snutt2.configureKotlinJvm +import org.gradle.api.Plugin +import org.gradle.api.Project + +class JvmLibraryConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("org.jetbrains.kotlin.jvm") + } + configureKotlinJvm() + } + } +} \ No newline at end of file diff --git a/core/model/.gitignore b/core/model/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/core/model/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts new file mode 100644 index 000000000..cb5c12f64 --- /dev/null +++ b/core/model/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + alias(libs.plugins.snutt.jvm.library) +} \ No newline at end of file diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Building.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Building.kt new file mode 100644 index 000000000..e1d40288e --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Building.kt @@ -0,0 +1,9 @@ +package com.wafflestudio.snutt2.core.model.data + +data class Building( + val campus: Campus, + val buildingNumber: String, + val buildingNameKor: String, + val buildingNameEng: String, + val coordinate: GeoCoordinate, +) diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Campus.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Campus.kt new file mode 100644 index 000000000..147fe5850 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Campus.kt @@ -0,0 +1,7 @@ +package com.wafflestudio.snutt2.core.model.data + +enum class Campus { + GWANAK, + YEONGEON, + PYEONGCHANG, +} diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/CourseBook.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/CourseBook.kt new file mode 100644 index 000000000..30e2cc713 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/CourseBook.kt @@ -0,0 +1,6 @@ +package com.wafflestudio.snutt2.core.model.data + +data class CourseBook( + val semester: Long, + val year: Long, +) diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Day.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Day.kt new file mode 100644 index 000000000..7f4f30669 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Day.kt @@ -0,0 +1,11 @@ +package com.wafflestudio.snutt2.core.model.data + +enum class Day { + MON, + TUE, + WED, + THU, + FRI, + SAT, + SUN, +} diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/GeoCoordinate.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/GeoCoordinate.kt new file mode 100644 index 000000000..a902114b2 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/GeoCoordinate.kt @@ -0,0 +1,6 @@ +package com.wafflestudio.snutt2.core.model.data + +data class GeoCoordinate( + val latitude: Double, + val longitude: Double, +) diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/LectureColor.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/LectureColor.kt new file mode 100644 index 000000000..52e56b20b --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/LectureColor.kt @@ -0,0 +1,43 @@ +package com.wafflestudio.snutt2.core.model.data + +data class LectureColor( + val lightForeGround: Int, + val lightBackGround: Int, + val darkForeGround: Int, + val darkBackGround: Int, +) { + constructor( + fgString: String, + bgString: String, + ) : this( + lightForeGround = parseColor(fgString), + lightBackGround = parseColor(bgString), + darkForeGround = parseColor(fgString), + darkBackGround = parseColor(bgString), + ) + + constructor( + fg: Int, + bg: Int, + ) : this( + lightForeGround = fg, + lightBackGround = bg, + darkForeGround = fg, + darkBackGround = bg, + ) +} + +private fun parseColor(colorString: String): Int { // from android.graphics.Color + if (colorString[0] == '#') { + // Use a long to avoid rollovers on #ffXXXXXX + var color = colorString.substring(1).toLong(16) + if (colorString.length == 7) { + // Set the alpha value + color = color or 0x00000000ff000000L + } else { + require(colorString.length == 9) { "Unknown color" } + } + return color.toInt() + } + throw IllegalArgumentException("Unknown color") +} diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Nickname.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Nickname.kt new file mode 100644 index 000000000..3df123ab6 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Nickname.kt @@ -0,0 +1,10 @@ +package com.wafflestudio.snutt2.core.model.data + +data class Nickname( + val nickname: String, + val tag: String, +) { + override fun toString(): String { + return "$nickname#$tag" + } +} diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Notification.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Notification.kt new file mode 100644 index 000000000..712ee8c63 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Notification.kt @@ -0,0 +1,22 @@ +package com.wafflestudio.snutt2.core.model.data + +import java.time.LocalDateTime + +data class Notification( + val id: String?, + val title: String, + val message: String, + val createdAt: LocalDateTime, + val type: Type, + val deeplink: String?, +) { + enum class Type { + Normal, + NewCourseBook, + LectureUpdated, + LectureDeleted, + Vacancy, + Friend, + Fallback, + } +} diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/PlaceTime.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/PlaceTime.kt new file mode 100644 index 000000000..0d6b34678 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/PlaceTime.kt @@ -0,0 +1,6 @@ +package com.wafflestudio.snutt2.core.model.data + +data class PlaceTime( + val timetableBlock: TimetableBlock, + val placeName: String, +) diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Popup.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Popup.kt new file mode 100644 index 000000000..010549795 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Popup.kt @@ -0,0 +1,7 @@ +package com.wafflestudio.snutt2.core.model.data + +data class Popup( + val key: String, + val imageUri: String, + val popupHideDays: Int?, +) diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/RemoteConfig.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/RemoteConfig.kt new file mode 100644 index 000000000..98ad78fc2 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/RemoteConfig.kt @@ -0,0 +1,9 @@ +package com.wafflestudio.snutt2.core.model.data + +data class RemoteConfig( + val friendsBundleSrc: String?, + val vacancyNotificationBannerEnabled: Boolean, + val sugangSNUUrl: String?, + val settingPageNewBadgeTitles: List, + val disableMapFeature: Boolean, +) diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/SimpleTimetable.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/SimpleTimetable.kt new file mode 100644 index 000000000..f6aa2ad62 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/SimpleTimetable.kt @@ -0,0 +1,10 @@ +package com.wafflestudio.snutt2.core.model.data + +data class SimpleTimetable( + val id: String, + val courseBook: CourseBook, + val title: String, + val updatedAt: String, + val totalCredit: Long, + val isPrimary: Boolean, +) diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Tag.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Tag.kt new file mode 100644 index 000000000..ffb8f8482 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Tag.kt @@ -0,0 +1,23 @@ +package com.wafflestudio.snutt2.core.model.data + +data class Tag( + val type: Type, + val name: String, +) { + companion object { + val TIME_EMPTY: Tag = Tag(Type.TIME, "빈 시간대로 검색") + val TIME_SELECT: Tag = Tag(Type.TIME, "시간대 직접 선택") + val ETC_ENG: Tag = Tag(Type.ETC, "영어진행 강의") + val ETC_MILITARY: Tag = Tag(Type.ETC, "군휴학 원격수업") + } + + enum class Type { + CLASSIFICATION, + DEPARTMENT, + ACADEMIC_YEAR, + CREDIT, + TIME, + CATEGORY, + ETC, + } +} diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Theme.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Theme.kt new file mode 100644 index 000000000..873ac8744 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Theme.kt @@ -0,0 +1,398 @@ +package com.wafflestudio.snutt2.core.model.data + +data class Theme( + val id: String, + val name: String, + val colors: List, + val isCustom: Boolean, +) { + object BuiltIn { + val SNUTT = Theme( + id = "SNUTT", + name = "SNUTT", + colors = listOf( + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xE54459, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xD95F71, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xF58D3D, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xDF6E3C, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xFAC42D, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xE68937, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xA6D930, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x95B03E, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x2BC267, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x419343, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x1BD0C8, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x5BA0D7, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x1D99E8, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x58C1B7, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x4F48C4, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x3E35A7, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xAF56B3, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x783891, + ), + ), + isCustom = false, + ) + val MODERN = Theme( + id = "모던", + name = "모던", + colors = listOf( + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xF0652A, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xBB592F, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xF5AD3E, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xE08B45, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x998F36, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xB4B194, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x89C291, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x5B967C, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x266F55, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x266F55, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x13808F, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x13808F, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x366689, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x426586, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x432920, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x5C4335, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xD82F3D, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xAD2F31, + ), + ), + isCustom = false, + ) + val AUTUMN = Theme( + id = "가을", + name = "가을", + colors = listOf( + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xB82E31, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xA93A36, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xDB701C, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xD56738, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xEAA32A, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xCC973F, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xC6C013, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xA0942F, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x3A856E, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x4E8370, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x19B2AC, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x29625A, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x3994CE, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x4171A2, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x3F3A9C, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x4F48C4, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x924396, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x783891, + ), + ), + isCustom = false, + ) + val CHERRY = Theme( + id = "벚꽃", + name = "벚꽃", + colors = listOf( + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xFD79A8, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xA43C58, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xFEC9DD, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x7C164F, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xFEB0CC, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x99446E, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xFE93BF, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xA77085, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xE9B1D0, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xB290B8, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xC67D97, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xBDB4BF, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xBB8EA7, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xBB8EA7, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xBDB4BF, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x736C75, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xE16597, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xC76F92, + ), + ), + isCustom = false, + ) + val ICE = Theme( + id = "얼음", + name = "얼음", + colors = listOf( + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xAABDCF, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x014D79, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xC0E9E8, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x788DA4, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x66B6CA, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xAEC1C9, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x015F95, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x48595B, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xA8D0DB, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x1C6C8E, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x458ED0, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x64909C, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x62A9D1, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x88B1C6, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x20363D, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x44576B, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x6D8A96, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x757C80, + ), + ), + isCustom = false, + ) + val GRASS = Theme( + id = "잔디", + name = "잔디", + colors = listOf( + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x4FBEAA, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x2D5A45, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x9FC1A4, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x429587, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x5A8173, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x86A99A, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x84AEB1, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x597B6A, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x266F55, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x42635B, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0xD0E0C4, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x586C5D, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x59886D, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x324845, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x476060, + darkForeGround = 0xFFFFFF, + darkBackGround = 0xAAB6B1, + ), + LectureColor( + lightForeGround = 0xFFFFFF, + lightBackGround = 0x3D7068, + darkForeGround = 0xFFFFFF, + darkBackGround = 0x747877, + ), + ), + isCustom = false, + ) + + fun fromCode(code: Int): Theme { + return when (code) { + 0 -> SNUTT + 1 -> MODERN + 2 -> AUTUMN + 3 -> CHERRY + 4 -> ICE + 5 -> GRASS + else -> SNUTT + } + } + } + + companion object { + val DefaultCustomTheme = Theme( + id = "", + name = "새 커스텀 테마", + colors = listOf(LectureColor(0xffffff, 0x1bd0c8)), + isCustom = true, + ) + } +} diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/ThemeMode.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/ThemeMode.kt new file mode 100644 index 000000000..ce3385113 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/ThemeMode.kt @@ -0,0 +1,16 @@ +package com.wafflestudio.snutt2.core.model.data + +enum class ThemeMode { + DARK, + LIGHT, + AUTO, + ; + + override fun toString(): String { + return when (this) { + DARK -> "다크" + LIGHT -> "라이트" + AUTO -> "자동" + } + } +} diff --git a/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Time.kt b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Time.kt new file mode 100644 index 000000000..000a1a584 --- /dev/null +++ b/core/model/src/main/java/com/wafflestudio/snutt2/core/model/data/Time.kt @@ -0,0 +1,16 @@ +package com.wafflestudio.snutt2.core.model.data + +data class Time( + val timeInMinutes: Int, +) : Comparable