From 309de7803579695cf55d0a456d4bf44b82f7c067 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Mon, 17 Feb 2025 01:55:31 +0900 Subject: [PATCH 001/210] =?UTF-8?q?[fix/#145]=20ci/cd=EC=97=90=20LocalProp?= =?UTF-8?q?erties=20=EB=94=94=EB=B2=84=EA=B7=B8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EB=AC=B8=EC=9E=90=EC=97=B4=20=ED=98=95=EC=8B=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/android_cd.yml | 11 +++++++---- .github/workflows/android_ci.yml | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/android_cd.yml b/.github/workflows/android_cd.yml index 8601af45..2c03ce13 100644 --- a/.github/workflows/android_cd.yml +++ b/.github/workflows/android_cd.yml @@ -51,12 +51,15 @@ jobs: FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET }} run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json - # 7. local.properties - - name: Add local.properties + # Add Local Properties + - name: Add Local Properties env: BASE_URL: ${{ secrets.BASE_URL }} - run: | - echo "base.url=\"$BASE_URL\"" >> app/local.properties + run: echo "baseUrl=$BASE_URL" >> local.properties + + # 7. Debug Local Properties Check + - name: Debug Local Properties + run: cat local.properties # 8. Ktlint - name: Run Ktlint Check diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml index 89bba90a..1d5b25fe 100644 --- a/.github/workflows/android_ci.yml +++ b/.github/workflows/android_ci.yml @@ -58,6 +58,10 @@ jobs: BASE_URL: ${{ secrets.BASE_URL }} run: echo "baseUrl=$BASE_URL" >> local.properties + # Debug Local Properties Check + - name: Debug Local Properties + run: cat local.properties + # Run Lint and Build - name: Run lint and build run: ./gradlew ktlintCheck assembleDebug From 0ae825c3ef57190dcdeea482bb4fe7c4e25d18cc Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Feb 2025 14:10:50 +0900 Subject: [PATCH 002/210] =?UTF-8?q?[FIX/#148]=20=EB=94=94=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EB=AA=A8=EB=93=9C=20DEBUG=20=EA=B0=92=EC=9D=84=20t?= =?UTF-8?q?rue=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 --- build-logic/src/main/java/com/yapp/convention/Extension.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build-logic/src/main/java/com/yapp/convention/Extension.kt b/build-logic/src/main/java/com/yapp/convention/Extension.kt index 7faecb26..ee6bb060 100644 --- a/build-logic/src/main/java/com/yapp/convention/Extension.kt +++ b/build-logic/src/main/java/com/yapp/convention/Extension.kt @@ -27,12 +27,11 @@ internal val ExtensionContainer.libs: VersionCatalog internal fun CommonExtension<*, *, *, *, *, *>.addBuildConfigFields(project: Project) { val baseUrl = project.getLocalProperty("baseUrl", "https://default.example.com") - val isDebug = project.providers.gradleProperty("isDebug").orNull?.toBoolean() ?: false buildTypes { getByName("debug") { buildConfigField("String", "BASE_URL", "\"$baseUrl\"") - buildConfigField("boolean", "DEBUG", isDebug.toString()) + buildConfigField("boolean", "DEBUG", "true") } getByName("release") { buildConfigField("String", "BASE_URL", "\"$baseUrl\"") From ebb9d72d736c2202f16c5a170e7edaadb59cf24e Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Feb 2025 17:36:26 +0900 Subject: [PATCH 003/210] =?UTF-8?q?[FEAT/#148]=20=ED=91=B8=EC=8B=9C=20?= =?UTF-8?q?=EC=95=8C=EB=9E=8C=20=E2=80=9C=EC=95=8C=EB=9E=8C=20=ED=95=B4?= =?UTF-8?q?=EC=A0=9C=E2=80=9D=20=EB=B2=84=ED=8A=BC=20=ED=81=B4=EB=A6=AD=20?= =?UTF-8?q?=EC=8B=9C,=20=EC=98=A4=EB=8A=98=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=EB=AF=B8=EC=88=98=EB=A0=B9=20=EC=8B=9C=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interaction/AlarmDismissPendingIntent.kt | 22 +++++++ .../com/yapp/alarm/services/AlarmService.kt | 66 ++++++++++++------- .../java/com/yapp/mission/MissionNavGraph.kt | 2 +- 3 files changed, 67 insertions(+), 23 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt index c68f575d..1fe42370 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt @@ -5,6 +5,7 @@ import android.app.PendingIntent.FLAG_IMMUTABLE import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.content.Context import android.content.Intent +import android.net.Uri import com.yapp.alarm.AlarmConstants import com.yapp.alarm.receivers.AlarmReceiver @@ -30,3 +31,24 @@ fun createAlarmDismissIntent( putExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, notificationId) } } + +fun createNavigateToMissionPendingIntent( + applicationContext: Context, + notificationId: Long, +): PendingIntent { + val navigateToMissionIntent = createNavigateToMissionIntent(notificationId) + return PendingIntent.getActivity( + applicationContext, + notificationId.toInt(), + navigateToMissionIntent, + FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE, + ) +} + +fun createNavigateToMissionIntent( + notificationId: Long, +): Intent { + return Intent(Intent.ACTION_VIEW, Uri.parse("orbitapp://mission?notificationId=$notificationId")).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + } +} diff --git a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt index f719e769..a2523828 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt @@ -26,13 +26,19 @@ import com.yapp.alarm.AlarmHelper import com.yapp.alarm.pendingIntent.interaction.createAlarmAlertPendingIntent import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissPendingIntent import com.yapp.alarm.pendingIntent.interaction.createAlarmSnoozePendingIntent +import com.yapp.alarm.pendingIntent.interaction.createNavigateToMissionPendingIntent +import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm import com.yapp.domain.usecase.AlarmUseCase import com.yapp.media.sound.SoundPlayer import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import java.time.LocalDate +import java.time.format.DateTimeFormatter import javax.inject.Inject @AndroidEntryPoint @@ -52,8 +58,10 @@ class AlarmService : Service() { @Inject lateinit var alarmHelper: AlarmHelper - private inner class ServiceHandler(looper: Looper) : Handler(looper) { + @Inject + lateinit var userPreferences: UserPreferences + private inner class ServiceHandler(looper: Looper) : Handler(looper) { override fun handleMessage(message: Message) { super.handleMessage(message) @@ -74,15 +82,31 @@ class AlarmService : Service() { val isDismiss = bundle.getBoolean(AlarmConstants.EXTRA_IS_DISMISS, false) val isOneTimeAlarm = alarm.repeatDays == 0 + val shouldNavigateToMission = runBlocking { + val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + fortuneDate != todayDate + } + Log.d("AlarmService", "shouldNavigateToMission: $shouldNavigateToMission") + when (isDismiss) { - true -> { - stopSelf() + true -> stopSelf() + false -> { + startForeground( + notificationId.toInt(), + createNotification(alarm, shouldNavigateToMission), + ) + if (alarm.isVibrationEnabled) startVibration() + if (alarm.isSoundEnabled) startSound(alarm.soundUri, alarm.soundVolume) } + } + when (isDismiss) { + true -> stopSelf() false -> { startForeground( notificationId.toInt(), - createNotification(alarm), + createNotification(alarm, shouldNavigateToMission), ) if (alarm.isVibrationEnabled) startVibration() if (alarm.isSoundEnabled) startSound(alarm.soundUri, alarm.soundVolume) @@ -128,26 +152,24 @@ class AlarmService : Service() { stopSelf() } - private fun createNotification( - alarm: Alarm, - ): Notification { - Log.d("AlarmForegroundService", "createNotification()") - - val closeIntent = Intent(AlarmConstants.ACTION_ALARM_INTERACTION_ACTIVITY_CLOSE).apply { - putExtra(AlarmConstants.EXTRA_IS_SNOOZED, true) - } - applicationContext.sendBroadcast(closeIntent) - + private fun createNotification(alarm: Alarm, shouldNavigateToMission: Boolean): Notification { val alarmAlertPendingIntent = createAlarmAlertPendingIntent(applicationContext, alarm) - val alarmDismissPendingIntent = - createAlarmDismissPendingIntent(applicationContext, pendingIntentId = alarm.id) - val snoozePendingIntent = if (alarm.isSnoozeEnabled && alarm.snoozeCount != 0) { - createAlarmSnoozePendingIntent( - applicationContext, - alarm, + val alarmDismissPendingIntent = if (shouldNavigateToMission) { + createNavigateToMissionPendingIntent( + applicationContext = applicationContext, + notificationId = alarm.id, ) + } else { + createAlarmDismissPendingIntent( + applicationContext = applicationContext, + pendingIntentId = alarm.id, + ) + } + + val snoozePendingIntent = if (alarm.isSnoozeEnabled && alarm.snoozeCount != 0) { + createAlarmSnoozePendingIntent(applicationContext, alarm) } else { null } @@ -162,8 +184,8 @@ class AlarmService : Service() { .setFullScreenIntent(alarmAlertPendingIntent, true) .addAction(core.designsystem.R.drawable.ic_cancel, "알람 해제", alarmDismissPendingIntent) - if (snoozePendingIntent != null) { - builder.addAction(core.designsystem.R.drawable.ic_cancel, "미루기", snoozePendingIntent) + snoozePendingIntent?.let { + builder.addAction(core.designsystem.R.drawable.ic_cancel, "미루기", it) } return builder.build() diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt index 81f0776c..80dcbac3 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt @@ -20,7 +20,7 @@ fun NavGraphBuilder.missionNavGraph( route = MissionDestination.Mission.route, deepLinks = listOf( navDeepLink { - uriPattern = "orbitapp://mission" + uriPattern = "orbitapp://mission?notificationId={notificationId}" }, ), ) { backStackEntry -> From 006ff39cd3e5c6adfd78ab4b05d5f2d01af47797 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Feb 2025 17:39:57 +0900 Subject: [PATCH 004/210] =?UTF-8?q?[FEAT/#148]=20=ED=91=B8=EC=8B=9C=20?= =?UTF-8?q?=EC=95=8C=EB=9E=8C=20=E2=80=9C=EC=95=8C=EB=9E=8C=20=ED=95=B4?= =?UTF-8?q?=EC=A0=9C=E2=80=9D=20=EB=B2=84=ED=8A=BC=20=ED=81=B4=EB=A6=AD?= =?UTF-8?q?=EC=9D=84=20=ED=86=B5=ED=95=9C=20=EB=AF=B8=EC=85=98=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EB=B0=8F=20AlarmDismissIntent=20=EB=B0=9C=EC=86=A1?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/mission/build.gradle.kts | 1 + .../java/com/yapp/mission/MissionViewModel.kt | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/feature/mission/build.gradle.kts b/feature/mission/build.gradle.kts index 1648c0a3..a9c9e824 100644 --- a/feature/mission/build.gradle.kts +++ b/feature/mission/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { implementation(projects.core.ui) implementation(projects.core.common) implementation(projects.core.media) + implementation(projects.core.alarm) implementation(projects.domain) implementation(projects.core.datastore) implementation(libs.orbit.core) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index 861a2f1c..0dff9b18 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -1,7 +1,10 @@ package com.yapp.mission +import android.app.Application import android.util.Log +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope +import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent import com.yapp.common.navigation.destination.FortuneDestination import com.yapp.common.navigation.destination.HomeDestination import com.yapp.common.navigation.destination.MissionDestination @@ -22,9 +25,17 @@ class MissionViewModel @Inject constructor( private val hapticFeedbackManager: HapticFeedbackManager, private val fortuneRepository: FortuneRepository, private val userPreferences: UserPreferences, + private val app: Application, + savedStateHandle: SavedStateHandle, ) : BaseViewModel( MissionContract.State(), ) { + init { + val notificationId = savedStateHandle.get("notificationId")?.toLong() + if (notificationId != null) { + sendAlarmDismissIntent(notificationId) + } + } fun processAction(action: MissionContract.Action) { when (action) { @@ -140,4 +151,12 @@ class MissionViewModel @Inject constructor( kotlinx.coroutines.delay(2000) updateState { copy(showOverlay = false, showOverlayText = false) } } + + private fun sendAlarmDismissIntent(id: Long) { + val alarmDismissIntent = createAlarmDismissIntent( + context = app, + notificationId = id, + ) + app.sendBroadcast(alarmDismissIntent) + } } From b268bb0fc8f0e56f3b60b42cd6838864ac13e2b4 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Feb 2025 17:40:47 +0900 Subject: [PATCH 005/210] =?UTF-8?q?[REFACTOR/#148]=20OritNavHost=EC=9D=98?= =?UTF-8?q?=20startDestination=EC=9D=84=20OrbitNavigator=EC=9D=98=20startD?= =?UTF-8?q?estination=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 --- .../main/java/com/yapp/common/navigation/OrbitNavigator.kt | 4 ++-- .../src/main/java/com/yapp/navigator/OrbitNavHost.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt index bfbd7ec8..e465ab6f 100644 --- a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt +++ b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt @@ -8,13 +8,13 @@ import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions import com.yapp.common.navigation.destination.HomeDestination -import com.yapp.common.navigation.destination.OnboardingDestination +import com.yapp.common.navigation.destination.SplashDestination import com.yapp.common.navigation.destination.TopLevelDestination class OrbitNavigator( val navController: NavHostController, ) { - val startDestination = OnboardingDestination.Route.route + val startDestination = SplashDestination.Route.route private val currentDestination: NavDestination? @Composable get() = navController diff --git a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt index 69cc2889..6fe6b82a 100644 --- a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt +++ b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt @@ -58,7 +58,7 @@ internal fun OrbitNavHost( ) { NavHost( navController = navigator.navController, - startDestination = SplashDestination.Route.route, + startDestination = navigator.startDestination, modifier = Modifier.navigationBarsPadding(), ) { composable(SplashDestination.Route.route) { From 5f5ba17abd0a0650d3c1a405d8a4568e7296854f Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Feb 2025 17:41:09 +0900 Subject: [PATCH 006/210] =?UTF-8?q?[UI/#148]=20AlarmListItem=20=EA=B8=80?= =?UTF-8?q?=EC=9E=90=20=EA=B0=84=EA=B2=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/alarm/component/AlarmListItem.kt | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt index 5bd10a47..df221657 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -159,6 +160,7 @@ private fun AlarmListItemContent( text = ":", style = OrbitTheme.typography.title2Medium, color = if (isActive) OrbitTheme.colors.white else OrbitTheme.colors.gray_500, + modifier = Modifier.offset(y = (-2).dp), ) Spacer(modifier = Modifier.width(3.dp)) @@ -273,3 +275,65 @@ private fun AlarmListItemPreview() { } } } + +@Preview +@Composable +private fun AlarmListItemContentPreview() { + OrbitTheme { + Column { + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = "오전", + style = OrbitTheme.typography.title2Medium, + color = OrbitTheme.colors.white, + ) + + Spacer(modifier = Modifier.width(6.dp)) + + Text( + text = "6:00", + style = OrbitTheme.typography.title2Medium, + color = OrbitTheme.colors.white, + ) + } + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = "오전", + style = OrbitTheme.typography.title2Medium, + color = OrbitTheme.colors.white, + ) + + Spacer(modifier = Modifier.width(6.dp)) + + Text( + text = "6", + style = OrbitTheme.typography.title2Medium, + color = OrbitTheme.colors.white, + ) + + Spacer(modifier = Modifier.width(3.dp)) + + Text( + modifier = Modifier.offset( + y = (-2).dp, + ), + text = ":", + style = OrbitTheme.typography.title2Medium, + color = OrbitTheme.colors.white, + ) + + Spacer(modifier = Modifier.width(3.dp)) + + Text( + text = "00", + style = OrbitTheme.typography.title2Medium, + color = OrbitTheme.colors.white, + ) + } + } + } +} From 1f50eb8ac56748e7a115cc2343f0f2a78e6501e0 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Feb 2025 22:50:31 +0900 Subject: [PATCH 007/210] =?UTF-8?q?[FIX/#150]=20AlarmDay=20toDayOfWeek=20?= =?UTF-8?q?=EB=B3=80=ED=99=98=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/src/main/java/com/yapp/domain/model/AlarmDay.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt b/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt index 8ed498de..f3254c52 100644 --- a/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt +++ b/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt @@ -12,7 +12,7 @@ enum class AlarmDay(val bitValue: Int) { } fun AlarmDay.toDayOfWeek(): java.time.DayOfWeek { - return java.time.DayOfWeek.of(this.ordinal + 1) + return java.time.DayOfWeek.of(((this.ordinal + 6) % 7) + 1) } fun Set.toRepeatDays(): Int { From e2315e23eb300bff6c674cc8075992107cd58603 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Feb 2025 22:52:20 +0900 Subject: [PATCH 008/210] =?UTF-8?q?[FIX/#150]=20=EB=8B=A4=EC=9D=8C=20?= =?UTF-8?q?=EC=95=8C=EB=9E=8C=20=EC=8B=9C=EA=B0=84=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EC=8B=9C=20AM/PM=20=EC=97=AC=EB=B6=80=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt index b79d722e..e73b4b72 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt @@ -2,11 +2,9 @@ package com.yapp.alarm import android.app.AlarmManager import android.app.Application -import android.content.Intent import android.util.Log import com.yapp.alarm.pendingIntent.schedule.createAlarmReceiverPendingIntentForSchedule import com.yapp.alarm.pendingIntent.schedule.createAlarmReceiverPendingIntentForUnSchedule -import com.yapp.alarm.services.AlarmService import com.yapp.domain.model.Alarm import com.yapp.domain.model.AlarmDay import com.yapp.domain.model.toAlarmDays @@ -53,10 +51,6 @@ class AlarmHelper @Inject constructor( } } - fun stopAlarm() { - app.stopService(Intent(app, AlarmService::class.java)) - } - private fun setRepeatingAlarm(day: AlarmDay, alarm: Alarm) { val alarmReceiverPendingIntent = createAlarmReceiverPendingIntentForSchedule(app, alarm, day) From 0ed5a66a39a8e7b8952bf3a7ebf41eb0edc21305 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 00:35:20 +0900 Subject: [PATCH 009/210] =?UTF-8?q?[FEAT/#150]=20=EB=B0=98=EB=B3=B5=20?= =?UTF-8?q?=EC=9A=94=EC=9D=BC=20=EC=95=8C=EB=9E=8C=20=ED=8A=B8=EB=A6=AC?= =?UTF-8?q?=EA=B1=B0=20=EC=8B=9C,=20=EB=8B=A4=EC=9D=8C=20=EB=B0=98?= =?UTF-8?q?=EB=B3=B5=20=EC=9A=94=EC=9D=BC=20=EC=95=8C=EB=9E=8C=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=98=88=EC=95=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/alarm/AlarmConstants.kt | 1 + .../main/java/com/yapp/alarm/AlarmHelper.kt | 8 ++++ .../schedule/ScheduleAlarmPendingIntent.kt | 9 ++-- .../com/yapp/alarm/services/AlarmService.kt | 48 ++++++++++++++----- 4 files changed, 48 insertions(+), 18 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt index 3a1e95fb..979726f1 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt @@ -9,6 +9,7 @@ object AlarmConstants { const val EXTRA_NOTIFICATION_ID = "com.yapp.orbit.EXTRA_NOTIFICATION_ID" const val EXTRA_ALARM = "com.yapp.orbit.EXTRA_ALARM" + const val EXTRA_ALARM_DAY = "com.yapp.orbit.EXTRA_ALARM_DAY" const val EXTRA_IS_SNOOZED = "com.yapp.orbit.EXTRA_IS_SNOOZED" const val EXTRA_IS_DISMISS = "com.yapp.orbit.EXTRA_IS_DISMISS" diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt index e73b4b72..1581bf2f 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt @@ -17,6 +17,14 @@ class AlarmHelper @Inject constructor( private val app: Application, private val alarmManager: AlarmManager, ) { + fun scheduleAlarm(alarm: Alarm, day: AlarmDay?) { + if (day != null) { + setRepeatingAlarm(day, alarm) + } else { + setNonRepeatingAlarm(alarm) + } + } + fun scheduleAlarm(alarm: Alarm) { val selectedDays = alarm.repeatDays.toAlarmDays() diff --git a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt index 2e8967ca..517eedbd 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/schedule/ScheduleAlarmPendingIntent.kt @@ -13,10 +13,7 @@ fun createAlarmReceiverPendingIntentForSchedule( alarm: Alarm, day: AlarmDay? = null, ): PendingIntent { - val alarmReceiverIntent = createAlarmReceiverIntent( - app, - alarm, - ) + val alarmReceiverIntent = createAlarmReceiverIntent(app, alarm, day) return PendingIntent.getBroadcast( app, generateAlarmIntentId(alarm.id.toInt(), day), @@ -28,15 +25,17 @@ fun createAlarmReceiverPendingIntentForSchedule( private fun createAlarmReceiverIntent( app: Application, alarm: Alarm, + day: AlarmDay? = null, ): Intent { return Intent(AlarmConstants.ACTION_ALARM_TRIGGERED).apply { setClass(app, AlarmReceiver::class.java) putExtra(AlarmConstants.EXTRA_ALARM, alarm) + day?.let { putExtra(AlarmConstants.EXTRA_ALARM_DAY, it.name) } } } fun generateAlarmIntentId(id: Int, day: AlarmDay?): Int { return day?.let { - (id * 10) + it.ordinal + 1 + (id * 10) + ((day.ordinal + 6) % 7) + 1 } ?: id } diff --git a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt index f719e769..6653a83d 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt @@ -27,12 +27,16 @@ import com.yapp.alarm.pendingIntent.interaction.createAlarmAlertPendingIntent import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissPendingIntent import com.yapp.alarm.pendingIntent.interaction.createAlarmSnoozePendingIntent import com.yapp.domain.model.Alarm +import com.yapp.domain.model.AlarmDay +import com.yapp.domain.model.toAlarmDays +import com.yapp.domain.model.toDayOfWeek import com.yapp.domain.usecase.AlarmUseCase import com.yapp.media.sound.SoundPlayer import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import java.time.LocalDateTime import javax.inject.Inject @AndroidEntryPoint @@ -74,19 +78,24 @@ class AlarmService : Service() { val isDismiss = bundle.getBoolean(AlarmConstants.EXTRA_IS_DISMISS, false) val isOneTimeAlarm = alarm.repeatDays == 0 - when (isDismiss) { - true -> { - stopSelf() - } - - false -> { - startForeground( - notificationId.toInt(), - createNotification(alarm), - ) - if (alarm.isVibrationEnabled) startVibration() - if (alarm.isSoundEnabled) startSound(alarm.soundUri, alarm.soundVolume) - } + Log.d("AlarmService", "AlarmService started for alarm: $alarm") + + if (!isOneTimeAlarm) { + bundle.getString(AlarmConstants.EXTRA_ALARM_DAY) + ?.let { AlarmDay.valueOf(it) } + ?.let { + findNextRepeatDay(alarm)?.let { nextRepeatDay -> + alarmHelper.scheduleAlarm(alarm, nextRepeatDay) + } + } + } + + if (isDismiss) { + stopSelf() + } else { + startForeground(notificationId.toInt(), createNotification(alarm)) + if (alarm.isVibrationEnabled) startVibration() + if (alarm.isSoundEnabled) startSound(alarm.soundUri, alarm.soundVolume) } if (isOneTimeAlarm) { @@ -188,6 +197,19 @@ class AlarmService : Service() { notificationManager.createNotificationChannel(channel) } + private fun findNextRepeatDay(alarm: Alarm): AlarmDay? { + val selectedDays = alarm.repeatDays.toAlarmDays() + val now = LocalDateTime.now() + + // 다음 주 포함 이후 가장 가까운 반복 요일 찾기 + return selectedDays.minByOrNull { day -> + val targetDayOfWeek = day.toDayOfWeek() + val daysUntil = ((targetDayOfWeek.value - now.dayOfWeek.value) + 7) % 7 + + if (daysUntil == 0) 7 else daysUntil + } + } + private fun turnOffAlarm(alarmId: Long) { CoroutineScope(Dispatchers.IO).launch { alarmUseCase.updateAlarmActive( From 4cbbeddcf02c93569dce706cc9243bd63bb49fcb Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 01:03:35 +0900 Subject: [PATCH 010/210] =?UTF-8?q?[FIX/#150]=20=EB=B0=98=EB=B3=B5=20?= =?UTF-8?q?=EC=9A=94=EC=9D=BC=20=EC=95=8C=EB=9E=8C=20=ED=8A=B8=EB=A6=AC?= =?UTF-8?q?=EA=B1=B0=20=EC=8B=9C,=20=EB=8B=A4=EC=9D=8C=20=EC=A3=BC=20?= =?UTF-8?q?=EB=8F=99=EC=9D=BC=20=EC=9A=94=EC=9D=BC=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EC=98=88=EC=95=BD=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=A4=91=EB=B3=B5=20=EC=98=88?= =?UTF-8?q?=EC=95=BD=20=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 --- .../java/com/yapp/alarm/AlarmConstants.kt | 2 + .../main/java/com/yapp/alarm/AlarmHelper.kt | 42 +++++++++++++++---- .../com/yapp/alarm/services/AlarmService.kt | 22 +--------- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt index 979726f1..a3cc255c 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt @@ -13,4 +13,6 @@ object AlarmConstants { const val EXTRA_IS_SNOOZED = "com.yapp.orbit.EXTRA_IS_SNOOZED" const val EXTRA_IS_DISMISS = "com.yapp.orbit.EXTRA_IS_DISMISS" + + const val WEEK_INTERVAL_MILLIS: Long = 7 * 24 * 60 * 60 * 1000 } diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt index 1581bf2f..341a8dc1 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt @@ -17,14 +17,6 @@ class AlarmHelper @Inject constructor( private val app: Application, private val alarmManager: AlarmManager, ) { - fun scheduleAlarm(alarm: Alarm, day: AlarmDay?) { - if (day != null) { - setRepeatingAlarm(day, alarm) - } else { - setNonRepeatingAlarm(alarm) - } - } - fun scheduleAlarm(alarm: Alarm) { val selectedDays = alarm.repeatDays.toAlarmDays() @@ -37,6 +29,18 @@ class AlarmHelper @Inject constructor( } } + fun scheduleWeeklyAlarm(alarm: Alarm, day: AlarmDay) { + val triggerMillis = getNextAlarmTimeMillis(alarm, day) + AlarmConstants.WEEK_INTERVAL_MILLIS + val pendingIntent = createAlarmReceiverPendingIntentForSchedule(app, alarm, day) + + alarmManager.setExactAndAllowWhileIdle( + AlarmManager.RTC_WAKEUP, + triggerMillis, + pendingIntent, + ) + Log.d("AlarmHelper", "Scheduled weekly alarm for $day next week at: $triggerMillis") + } + fun unScheduleAlarm(alarm: Alarm) { val selectedDays = alarm.repeatDays.toAlarmDays() @@ -56,6 +60,15 @@ class AlarmHelper @Inject constructor( ) alarmManager.cancel(pendingIntent) } + + /*selectedDays.forEach { day -> + val weeklyPendingIntent = createAlarmReceiverPendingIntentForSchedule( + app, + alarm, + day, + ) + alarmManager.cancel(weeklyPendingIntent) + }*/ } } @@ -116,4 +129,17 @@ class AlarmHelper @Inject constructor( return epochMillis } + + fun findNextRepeatDay(alarm: Alarm): AlarmDay? { + val selectedDays = alarm.repeatDays.toAlarmDays() + val now = LocalDateTime.now() + + // 다음 주 포함 이후 가장 가까운 반복 요일 찾기 + return selectedDays.minByOrNull { day -> + val targetDayOfWeek = day.toDayOfWeek() + val daysUntil = ((targetDayOfWeek.value - now.dayOfWeek.value) + 7) % 7 + + if (daysUntil == 0) 7 else daysUntil + } + } } diff --git a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt index 6653a83d..03d61e1f 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt @@ -28,15 +28,12 @@ import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissPendingIntent import com.yapp.alarm.pendingIntent.interaction.createAlarmSnoozePendingIntent import com.yapp.domain.model.Alarm import com.yapp.domain.model.AlarmDay -import com.yapp.domain.model.toAlarmDays -import com.yapp.domain.model.toDayOfWeek import com.yapp.domain.usecase.AlarmUseCase import com.yapp.media.sound.SoundPlayer import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import java.time.LocalDateTime import javax.inject.Inject @AndroidEntryPoint @@ -83,10 +80,8 @@ class AlarmService : Service() { if (!isOneTimeAlarm) { bundle.getString(AlarmConstants.EXTRA_ALARM_DAY) ?.let { AlarmDay.valueOf(it) } - ?.let { - findNextRepeatDay(alarm)?.let { nextRepeatDay -> - alarmHelper.scheduleAlarm(alarm, nextRepeatDay) - } + ?.let { alarmDay -> + alarmHelper.scheduleWeeklyAlarm(alarm, alarmDay) } } @@ -197,19 +192,6 @@ class AlarmService : Service() { notificationManager.createNotificationChannel(channel) } - private fun findNextRepeatDay(alarm: Alarm): AlarmDay? { - val selectedDays = alarm.repeatDays.toAlarmDays() - val now = LocalDateTime.now() - - // 다음 주 포함 이후 가장 가까운 반복 요일 찾기 - return selectedDays.minByOrNull { day -> - val targetDayOfWeek = day.toDayOfWeek() - val daysUntil = ((targetDayOfWeek.value - now.dayOfWeek.value) + 7) % 7 - - if (daysUntil == 0) 7 else daysUntil - } - } - private fun turnOffAlarm(alarmId: Long) { CoroutineScope(Dispatchers.IO).launch { alarmUseCase.updateAlarmActive( From 30ab080c279bca3f7db8bf071fd0f3662f7a9c09 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 10:36:42 +0900 Subject: [PATCH 011/210] =?UTF-8?q?[REMOVE/#150]=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/alarm/services/AlarmService.kt | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt index a2523828..2df8dcc8 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt @@ -101,18 +101,6 @@ class AlarmService : Service() { } } - when (isDismiss) { - true -> stopSelf() - false -> { - startForeground( - notificationId.toInt(), - createNotification(alarm, shouldNavigateToMission), - ) - if (alarm.isVibrationEnabled) startVibration() - if (alarm.isSoundEnabled) startSound(alarm.soundUri, alarm.soundVolume) - } - } - if (isOneTimeAlarm) { turnOffAlarm(alarmId = notificationId) } From 26b4969cf65c8a7c781e4bb3771adcbe42450c03 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 10:39:53 +0900 Subject: [PATCH 012/210] =?UTF-8?q?[REMOVE/#150]=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=BD=94=EB=93=9C=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/yapp/alarm/AlarmHelper.kt | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt index 341a8dc1..66ad1824 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt @@ -60,15 +60,6 @@ class AlarmHelper @Inject constructor( ) alarmManager.cancel(pendingIntent) } - - /*selectedDays.forEach { day -> - val weeklyPendingIntent = createAlarmReceiverPendingIntentForSchedule( - app, - alarm, - day, - ) - alarmManager.cancel(weeklyPendingIntent) - }*/ } } @@ -129,17 +120,4 @@ class AlarmHelper @Inject constructor( return epochMillis } - - fun findNextRepeatDay(alarm: Alarm): AlarmDay? { - val selectedDays = alarm.repeatDays.toAlarmDays() - val now = LocalDateTime.now() - - // 다음 주 포함 이후 가장 가까운 반복 요일 찾기 - return selectedDays.minByOrNull { day -> - val targetDayOfWeek = day.toDayOfWeek() - val daysUntil = ((targetDayOfWeek.value - now.dayOfWeek.value) + 7) % 7 - - if (daysUntil == 0) 7 else daysUntil - } - } } From 814dc12d77e8b5f5f3851b9369d86dc5ea7c5f07 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Tue, 18 Feb 2025 16:45:21 +0900 Subject: [PATCH 013/210] =?UTF-8?q?[ADD/#145]=20clickable=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=EC=97=90=20pressed=20=EC=86=8D=EC=84=B1=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/ui/extensions/CustomClickable.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt b/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt index 5863a08e..f3ee0b15 100644 --- a/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt +++ b/core/ui/src/main/java/com/yapp/ui/extensions/CustomClickable.kt @@ -6,10 +6,14 @@ import androidx.compose.foundation.indication import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.material3.ripple 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.Modifier import androidx.compose.ui.composed import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.input.pointer.pointerInput @Composable @@ -17,6 +21,8 @@ fun Modifier.customClickable( rippleEnabled: Boolean = true, rippleColor: Color? = null, enabled: Boolean = true, + fadeOnPress: Boolean = false, + pressedAlpha: Float = 0.5f, onClick: (() -> Unit)?, onLongClick: (() -> Unit)? = null, onPress: (() -> Unit)? = null, @@ -30,19 +36,28 @@ fun Modifier.customClickable( null } + var isPressed by remember { mutableStateOf(false) } + this.then( Modifier .pointerInput(Unit) { detectTapGestures( onPress = { + isPressed = true onPress?.invoke() tryAwaitRelease() + isPressed = false onRelease?.invoke() }, onTap = { onClick?.invoke() }, onLongPress = { onLongClick?.invoke() }, ) } + .graphicsLayer { + if (fadeOnPress) { + alpha = if (isPressed) pressedAlpha else 1f + } + } .indication(interactionSource, rippleIndication), ) } From 8369348a66bf3a1e73d947b11e63c10cc3970f6c Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Tue, 18 Feb 2025 16:45:59 +0900 Subject: [PATCH 014/210] =?UTF-8?q?[ADD/#145]=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=ED=83=91=EC=95=B1=EB=B0=94=20=EB=92=A4=EB=A1=9C=EA=B0=80?= =?UTF-8?q?=EA=B8=B0=20=ED=81=B4=EB=A6=AD=20=ED=9A=A8=EA=B3=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/fortune/component/FortuneTopAppBar.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt index ed9489ed..0282f8fb 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/component/FortuneTopAppBar.kt @@ -35,7 +35,12 @@ fun FortuneTopAppBar( painter = painterResource(id = core.designsystem.R.drawable.ic_close), contentDescription = "Close", modifier = Modifier - .customClickable(onClick = onCloseClick), + .customClickable( + rippleEnabled = false, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onCloseClick, + ), tint = OrbitTheme.colors.white, ) Spacer(modifier = Modifier.padding(end = 12.dp)) From 7ea17efe482bb19d141bc0165b18a220ec9e5adc Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Tue, 18 Feb 2025 16:46:43 +0900 Subject: [PATCH 015/210] =?UTF-8?q?[REFACTOR/#145]=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=ED=81=B4=EB=A6=AD=20=ED=9A=A8=EA=B3=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/mission/MissionProgressScreen.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt index 27774149..93b559cb 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt @@ -8,7 +8,6 @@ import androidx.compose.animation.fadeIn import androidx.compose.animation.scaleIn import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -41,6 +40,7 @@ import com.yapp.mission.component.FlipCard import com.yapp.mission.component.MissionProgressBar import com.yapp.ui.component.dialog.OrbitDialog import com.yapp.ui.component.lottie.LottieAnimation +import com.yapp.ui.extensions.customClickable import com.yapp.ui.utils.heightForScreenPercentage import com.yapp.ui.utils.paddingForScreenPercentage @@ -107,9 +107,12 @@ fun MissionProgressScreen( ) { Row( modifier = Modifier - .clickable { - eventDispatcher(MissionContract.Action.ShowExitDialog) - }, + .customClickable( + rippleEnabled = false, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = { eventDispatcher(MissionContract.Action.ShowExitDialog) }, + ), ) { Icon( painter = painterResource(id = core.designsystem.R.drawable.ic_cancel), From 81dcac5a7153db670623f78110959961585989bc Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Tue, 18 Feb 2025 16:46:53 +0900 Subject: [PATCH 016/210] =?UTF-8?q?[REFACTOR/#145]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EB=AA=A8=EB=93=88=20=ED=81=B4=EB=A6=AD=20=ED=9A=A8?= =?UTF-8?q?=EA=B3=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/onboarding/OnboardingNameScreen.kt | 6 ++++++ .../onboarding/component/OnbardingTopAppBar.kt | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt index db135bea..07451046 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.text.KeyboardActions import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -118,6 +119,11 @@ fun OnboardingNameScreen( modifier = Modifier .fillMaxWidth() .paddingForScreenPercentage(horizontalPercentage = 0.192f, topPercentage = 0.086f), + keyboardActions = KeyboardActions( + onDone = { + focusManager.clearFocus() + }, + ), ) } } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt index 2ca70ab0..daca8c79 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/component/OnbardingTopAppBar.kt @@ -1,7 +1,6 @@ package com.yapp.onboarding.component import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -19,6 +18,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.ui.extensions.customClickable @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -37,7 +37,12 @@ fun OnBoardingTopAppBar( contentDescription = "Back", tint = OrbitTheme.colors.white, modifier = Modifier - .clickable(onClick = onBackClick) + .customClickable( + rippleEnabled = false, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onBackClick, + ) .padding(start = 20.dp), ) } @@ -67,5 +72,10 @@ fun OnBoardingTopAppBar( @Composable @Preview fun OnBoardingTopAppBarPreview() { - OnBoardingTopAppBar(currentStep = 1, totalSteps = 3) + OnBoardingTopAppBar( + currentStep = 1, + totalSteps = 3, + onBackClick = {}, + showTopAppBarActions = true, + ) } From f688b70749f8816e4163d2315cdf599a5bae6c77 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Tue, 18 Feb 2025 16:47:05 +0900 Subject: [PATCH 017/210] =?UTF-8?q?[REFACTOR/#145]=20=EC=84=B8=ED=8C=85=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=ED=81=B4=EB=A6=AD=20=ED=9A=A8=EA=B3=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/setting/SettingScreen.kt | 27 +++++++++++++------ .../com/yapp/setting/component/InquiryCard.kt | 9 +++++-- .../setting/component/SettingTopAppBar.kt | 8 +++++- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt index f7aaa76b..909f94bf 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt @@ -1,7 +1,6 @@ package com.yapp.setting import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -24,6 +23,7 @@ import com.yapp.setting.component.SettingTopAppBar import com.yapp.setting.component.TableOfContentsText import com.yapp.setting.component.UserInfoCard import com.yapp.setting.component.VersionCodeText +import com.yapp.ui.extensions.customClickable @Composable fun SettingRoute( @@ -85,7 +85,12 @@ fun SettingScreen( birth = state.birthDate, modifier = Modifier .padding(horizontal = 24.dp) - .clickable { onNavigateToEditProfile() }, + .customClickable( + rippleEnabled = true, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = { onNavigateToEditProfile() }, + ), ) Spacer(modifier = Modifier.height(24.dp)) InquiryCard( @@ -107,18 +112,24 @@ fun SettingScreen( SettingItem( itemTitle = "이용약관", modifier = Modifier - .clickable { - onTermsClick() - } + .customClickable( + rippleEnabled = true, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onTermsClick, + ) .padding(horizontal = 24.dp), ) Spacer(modifier = Modifier.height(24.dp)) SettingItem( itemTitle = "개인정보 처리방침", modifier = Modifier - .clickable { - onPrivacyPolicyClick() - } + .customClickable( + rippleEnabled = true, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onPrivacyPolicyClick, + ) .padding(horizontal = 24.dp), ) Spacer(modifier = Modifier.weight(1f)) diff --git a/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt b/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt index 4f3613ac..88cd7f78 100644 --- a/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt +++ b/feature/setting/src/main/java/com/yapp/setting/component/InquiryCard.kt @@ -2,7 +2,6 @@ package com.yapp.setting.component import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -21,6 +20,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.ui.extensions.customClickable @Composable fun InquiryCard( @@ -76,7 +76,12 @@ fun InquirySendRow( Row( modifier = Modifier .wrapContentWidth() - .clickable(onClick = onInquiryClick) + .customClickable( + rippleEnabled = true, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onInquiryClick, + ) .padding(horizontal = 4.dp, vertical = 6.dp), verticalAlignment = Alignment.CenterVertically, ) { diff --git a/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt b/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt index 0cf5998a..bcc055c6 100644 --- a/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt +++ b/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.ui.extensions.customClickable @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -51,7 +52,12 @@ fun SettingTopAppBar( contentDescription = "Back", tint = OrbitTheme.colors.white, modifier = Modifier - .clickable(onClick = onBackClick) + .customClickable( + rippleEnabled = false, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onBackClick, + ) .padding(start = 20.dp), ) } From d1e3fc9c17b3fb261027dfea3b6f087780e25db5 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Tue, 18 Feb 2025 16:47:29 +0900 Subject: [PATCH 018/210] =?UTF-8?q?[REFACTOR/#145]=20Textfield=20KeyboardA?= =?UTF-8?q?ction,=20SingleLine=20=EC=86=8D=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/ui/component/textfield/OrbitTextField.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt index b1b0d178..a01b2cc2 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.selection.LocalTextSelectionColors import androidx.compose.foundation.text.selection.TextSelectionColors @@ -50,6 +51,7 @@ fun OrbitTextField( warningMessage: String, focusRequester: FocusRequester? = null, keyboardOptions: KeyboardOptions = KeyboardOptions.Default, + keyboardActions: KeyboardActions = KeyboardActions.Default, textAlign: TextAlign = TextAlign.Center, enabled: Boolean = true, ) { @@ -87,6 +89,7 @@ fun OrbitTextField( onFocusChanged = { isFocused = it }, focusRequester = actualFocusRequester, keyboardOptions = keyboardOptions, + keyboardActions = keyboardActions, isValid = isValid, isFocused = isFocused, textAlign = textAlign, @@ -134,6 +137,7 @@ private fun TextFieldContainer( focusRequester: FocusRequester, onFocusChanged: (Boolean) -> Unit, keyboardOptions: KeyboardOptions, + keyboardActions: KeyboardActions, textAlign: TextAlign, enabled: Boolean, ) { @@ -185,7 +189,9 @@ private fun TextFieldContainer( }, textAlign = textAlign, ), + singleLine = true, keyboardOptions = keyboardOptions, + keyboardActions = keyboardActions, cursorBrush = SolidColor(OrbitTheme.colors.white), enabled = enabled, decorationBox = { innerTextField -> From 658b52b27b11d405dea830a7b5c1fae85722841b Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 16:47:57 +0900 Subject: [PATCH 019/210] =?UTF-8?q?[UI/#142]=20=ED=99=9C=EC=84=B1=ED=99=94?= =?UTF-8?q?=EB=90=9C=20=EC=95=8C=EB=9E=8C=EC=9D=B4=20=EC=97=86=EC=9D=84=20?= =?UTF-8?q?=EC=8B=9C=20=EC=BA=90=EB=A6=AD=ED=84=B0=20=EB=B3=80=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/drawable/ic_charcter_no_alarm.xml | 129 ++++++++++++++++++ .../src/main/java/com/yapp/home/HomeScreen.kt | 27 ++-- 2 files changed, 147 insertions(+), 9 deletions(-) create mode 100644 core/designsystem/src/main/res/drawable/ic_charcter_no_alarm.xml diff --git a/core/designsystem/src/main/res/drawable/ic_charcter_no_alarm.xml b/core/designsystem/src/main/res/drawable/ic_charcter_no_alarm.xml new file mode 100644 index 00000000..4687e813 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_charcter_no_alarm.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt index f37909de..55fd97c5 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt @@ -1,6 +1,5 @@ package com.yapp.home -import android.util.Log import androidx.compose.animation.core.animateDpAsState import androidx.compose.animation.core.tween import androidx.compose.foundation.Canvas @@ -163,7 +162,6 @@ fun HomeScreen( eventDispatcher(HomeContract.Action.NavigateToSetting) }, onMailClick = { - Log.d("HomeScreen", "ShowDailyFortune") eventDispatcher(HomeContract.Action.ShowDailyFortune) }, onAddClick = { @@ -334,7 +332,6 @@ private fun HomeContent( HomeCharacterAnimation( fortuneScore = state.lastFortuneScore, hasActivatedAlarm = state.hasActivatedAlarm, - eventDispatcher = eventDispatcher, ) Spacer(modifier = Modifier.height(8.dp)) HomeFortuneDescription( @@ -479,11 +476,10 @@ private fun HomeCharacterAnimation( modifier: Modifier = Modifier, fortuneScore: Int, hasActivatedAlarm: Boolean, - eventDispatcher: (HomeContract.Action) -> Unit, ) { val (bubbleRes, starRes) = when { !hasActivatedAlarm -> { - Pair(null, core.designsystem.R.raw.fortune_preload) + Pair(null, core.designsystem.R.drawable.ic_charcter_no_alarm) } fortuneScore in 0..49 -> { Pair( @@ -523,10 +519,23 @@ private fun HomeCharacterAnimation( ) Spacer(modifier = Modifier.height(16.dp)) } ?: Spacer(modifier = Modifier.height(62.dp)) - LottieAnimation( - modifier = Modifier.size(110.dp), - resId = starRes, - ) + if (hasActivatedAlarm) { + LottieAnimation( + modifier = Modifier.size(110.dp), + resId = starRes, + ) + } else { + Image( + painter = painterResource(id = starRes), + contentDescription = "IMG_MAIN_STAR_GRAY", + modifier = Modifier + .size(110.dp) + .graphicsLayer { + scaleX = 1.25f + scaleY = 1.25f + }, + ) + } } } From 52ecd6cc707cc9d2a61d3c30dce4ff04c9140559 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Tue, 18 Feb 2025 16:48:12 +0900 Subject: [PATCH 020/210] =?UTF-8?q?[REFACTOR/#145]=20isDebug=EA=B0=92=20St?= =?UTF-8?q?ring=EC=9C=BC=EB=A1=9C=20=EB=84=A3=EB=8A=94=20=EB=B0=A9?= =?UTF-8?q?=EB=B2=95=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-logic/src/main/java/com/yapp/convention/Extension.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build-logic/src/main/java/com/yapp/convention/Extension.kt b/build-logic/src/main/java/com/yapp/convention/Extension.kt index 7faecb26..ee6bb060 100644 --- a/build-logic/src/main/java/com/yapp/convention/Extension.kt +++ b/build-logic/src/main/java/com/yapp/convention/Extension.kt @@ -27,12 +27,11 @@ internal val ExtensionContainer.libs: VersionCatalog internal fun CommonExtension<*, *, *, *, *, *>.addBuildConfigFields(project: Project) { val baseUrl = project.getLocalProperty("baseUrl", "https://default.example.com") - val isDebug = project.providers.gradleProperty("isDebug").orNull?.toBoolean() ?: false buildTypes { getByName("debug") { buildConfigField("String", "BASE_URL", "\"$baseUrl\"") - buildConfigField("boolean", "DEBUG", isDebug.toString()) + buildConfigField("boolean", "DEBUG", "true") } getByName("release") { buildConfigField("String", "BASE_URL", "\"$baseUrl\"") From 05d4ed8e39a5d9007da4999d3c027bc31e4b565e Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 17:13:31 +0900 Subject: [PATCH 021/210] =?UTF-8?q?[UI/#142]=20=EB=8B=B9=EC=9D=BC=20?= =?UTF-8?q?=EC=9A=B4=EC=84=B8=20=EC=A0=90=EC=88=98=EC=97=90=20=EB=94=B0?= =?UTF-8?q?=EB=A5=B8=20=EC=BA=90=EB=A6=AD=ED=84=B0=20=EB=B3=80=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/datastore/UserPreferences.kt | 13 ++++++++++++ .../main/java/com/yapp/home/HomeViewModel.kt | 20 +++++++++++++++++++ .../java/com/yapp/mission/MissionViewModel.kt | 6 ++++++ 3 files changed, 39 insertions(+) diff --git a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt index 47a6492e..799ba2d7 100644 --- a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt +++ b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt @@ -27,6 +27,7 @@ class UserPreferences @Inject constructor( val FORTUNE_ID = longPreferencesKey("fortune_id") val FORTUNE_DATE = stringPreferencesKey("fortune_date") val FORTUNE_IMAGE_ID = intPreferencesKey("fortune_image_id") + val FORTUNE_SCORE = intPreferencesKey("fortune_score") } val userIdFlow: Flow = dataStore.data @@ -54,6 +55,11 @@ class UserPreferences @Inject constructor( .map { it[Keys.FORTUNE_IMAGE_ID] } .distinctUntilChanged() + val fortuneScoreFlow: Flow = dataStore.data + .catch { emit(emptyPreferences()) } + .map { it[Keys.FORTUNE_SCORE] } + .distinctUntilChanged() + suspend fun saveUserId(userId: Long) { dataStore.edit { preferences -> preferences[Keys.USER_ID] = userId @@ -74,6 +80,12 @@ class UserPreferences @Inject constructor( } } + suspend fun saveFortuneScore(score: Int) { + dataStore.edit { preferences -> + preferences[Keys.FORTUNE_SCORE] = score + } + } + suspend fun setOnboardingCompleted() { dataStore.edit { preferences -> preferences[Keys.ONBOARDING_COMPLETED] = true @@ -91,6 +103,7 @@ class UserPreferences @Inject constructor( preferences.remove(Keys.FORTUNE_ID) preferences.remove(Keys.FORTUNE_DATE) preferences.remove(Keys.FORTUNE_IMAGE_ID) + preferences.remove(Keys.FORTUNE_SCORE) } } } diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index 0b8de16d..fc9ae92a 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -34,6 +34,7 @@ class HomeViewModel @Inject constructor( ) { init { loadAllAlarms() + loadDailyFortuneScore() } fun processAction(action: HomeContract.Action) { @@ -384,6 +385,25 @@ class HomeViewModel @Inject constructor( } } + private fun loadDailyFortuneScore() { + viewModelScope.launch { + val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + + if (fortuneDate != todayDate) { + updateState { + currentState.copy(lastFortuneScore = -1) + } + } else { + userPreferences.fortuneScoreFlow.firstOrNull()?.let { + updateState { + currentState.copy(lastFortuneScore = it) + } + } + } + } + } + private fun showNoDailyFortuneDialog() { updateState { copy(isNoDailyFortuneDialogVisible = true) } } diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index 0dff9b18..835405f8 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -93,6 +93,12 @@ class MissionViewModel @Inject constructor( val fortuneData = fortune.getOrThrow() userPreferences.saveFortuneId(fortuneData.id) + fortuneRepository.getFortune(fortuneData.id).onSuccess { + userPreferences.saveFortuneScore(it.avgFortuneScore) + }.onFailure { + Log.e("MissionViewModel", "운세 데이터 요청 실패: ${it.message}") + } + emitSideEffect( MissionContract.SideEffect.Navigate( route = FortuneDestination.Route.route, From 51864f9796c155137a49bfafb3f8c67af2abd9d3 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 17:18:56 +0900 Subject: [PATCH 022/210] =?UTF-8?q?[REFACTOR/#142]=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=9A=B4=EC=84=B8=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=ED=98=B8=EC=B6=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/mission/MissionViewModel.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index 835405f8..b659f00b 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -92,12 +92,7 @@ class MissionViewModel @Inject constructor( fortuneResult.onSuccess { fortune -> val fortuneData = fortune.getOrThrow() userPreferences.saveFortuneId(fortuneData.id) - - fortuneRepository.getFortune(fortuneData.id).onSuccess { - userPreferences.saveFortuneScore(it.avgFortuneScore) - }.onFailure { - Log.e("MissionViewModel", "운세 데이터 요청 실패: ${it.message}") - } + userPreferences.saveFortuneScore(fortuneData.avgFortuneScore) emitSideEffect( MissionContract.SideEffect.Navigate( @@ -125,6 +120,7 @@ class MissionViewModel @Inject constructor( fortuneResult.onSuccess { fortune -> val fortuneData = fortune.getOrThrow() userPreferences.saveFortuneId(fortuneData.id) + userPreferences.saveFortuneScore(fortuneData.avgFortuneScore) emitSideEffect( MissionContract.SideEffect.Navigate( From aed700e4ed71ec9e2588c05380c5b23d82f1138e Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 21:21:33 +0900 Subject: [PATCH 023/210] =?UTF-8?q?[REFACTOR/#152]=20PickerItem=20?= =?UTF-8?q?=EA=B3=A1=EB=A5=A0=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20=EC=95=88?= =?UTF-8?q?=EC=93=B0=EB=8A=94=20=EB=B3=80=EC=88=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/ui/component/timepicker/OrbitPickerItem.kt | 3 +-- .../yapp/ui/component/timepicker/OrbitYearMonthPicker.kt | 8 +++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt index 532c2aff..76ba98d8 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitPickerItem.kt @@ -34,7 +34,6 @@ fun OrbitPickerItem( modifier: Modifier = Modifier, items: List, state: PickerState = rememberPickerState(), - startIndex: Int = 0, visibleItemsCount: Int, textModifier: Modifier = Modifier, infiniteScroll: Boolean = true, @@ -140,7 +139,7 @@ fun OrbitPickerItem( 0.2f } - val scaleY = 1f - (0.4f * (distanceFromCenter / maxDistance)).coerceIn(0f, 0.4f) + val scaleY = 1f - (0.2f * (distanceFromCenter / maxDistance)).coerceIn(0f, 0.4f) Text( text = getItemForIndex(index, items, infiniteScroll, visibleItemsMiddle), diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt index 606d88b8..4548ab8a 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt @@ -16,6 +16,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -42,7 +43,7 @@ fun OrbitYearMonthPicker( val lunarState = remember { mutableStateOf(initialLunar) } val yearState = remember { mutableStateOf(initialYear.toInt()) } val monthState = remember { mutableStateOf(initialMonth.toInt()) } - val dayState = remember { mutableStateOf(initialDay.toInt()) } + val dayState = remember { mutableIntStateOf(initialDay.toInt()) } val dayItems = remember { mutableStateListOf() } LaunchedEffect(yearState.value, monthState.value) { val maxDay = getMaxDaysInMonth(yearState.value, monthState.value) @@ -72,8 +73,7 @@ fun OrbitYearMonthPicker( val startIndex = yearItems.indexOf(initialYear).takeIf { it >= 0 } ?: 0 val yearPickerState = rememberPickerState(startIndex = startIndex) val monthItems = (1..12).map { it.toString() } - val dayStartIndex = remember { dayItems.indexOf(initialDay).takeIf { it >= 0 } ?: 0 } - val monthStartIndex = remember { monthItems.indexOf(initialMonth).takeIf { it >= 0 } ?: 0 } + Box( modifier = Modifier.fillMaxWidth(), ) { @@ -119,7 +119,6 @@ fun OrbitYearMonthPicker( modifier = Modifier.width(screenWidth * 0.16f), textModifier = Modifier.padding(8.dp), infiniteScroll = false, - startIndex = monthStartIndex, onValueChange = { monthState.value = it.toInt() }, ) OrbitPickerItem( @@ -130,7 +129,6 @@ fun OrbitYearMonthPicker( modifier = Modifier.width(screenWidth * 0.16f), textModifier = Modifier.padding(8.dp), infiniteScroll = false, - startIndex = dayStartIndex, onValueChange = { dayState.value = it.toInt() }, ) } From aeac08502436e16e6de9db22c557a7215717dfa9 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 22:24:15 +0900 Subject: [PATCH 024/210] =?UTF-8?q?[UI/#152]=20AlarmListItem=20RippleEffec?= =?UTF-8?q?t=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/alarm/component/AlarmListItem.kt | 103 ++++++++++-------- 1 file changed, 58 insertions(+), 45 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt index df221657..4cea370e 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt @@ -3,7 +3,6 @@ package com.yapp.alarm.component import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -14,9 +13,15 @@ import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.material.ripple.RippleAlpha +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.LocalRippleConfiguration +import androidx.compose.material3.RippleConfiguration import androidx.compose.material3.Text +import androidx.compose.material3.ripple import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -35,6 +40,7 @@ import java.time.LocalDateTime import java.time.LocalTime import java.time.format.DateTimeFormatter +@OptIn(ExperimentalMaterial3Api::class) @Composable internal fun AlarmListItem( modifier: Modifier = Modifier, @@ -52,53 +58,60 @@ internal fun AlarmListItem( onToggleActive: (Long) -> Unit, ) { val interactionSource = remember { MutableInteractionSource() } - val isPressed by interactionSource.collectIsPressedAsState() - - Row( - modifier = modifier - .fillMaxWidth() - .background( - when { - isPressed || selected -> OrbitTheme.colors.gray_800 - else -> OrbitTheme.colors.gray_900 - }, - ) - .padding(horizontal = 24.dp, vertical = 20.dp) - .clickable( - interactionSource = interactionSource, - indication = null, - ) { - if (selectable) { - onToggleSelect(id) - } else { - onClick(id) - } - }, - verticalAlignment = Alignment.CenterVertically, + + CompositionLocalProvider( + LocalRippleConfiguration provides RippleConfiguration( + rippleAlpha = RippleAlpha( + pressedAlpha = 1f, + focusedAlpha = 1f, + hoveredAlpha = 1f, + draggedAlpha = 1f, + ), + ), ) { - if (selectable) { - OrbitCheckBox( - checked = selected, - onCheckedChange = { onToggleSelect(id) }, - ) - Spacer(modifier = Modifier.width(26.dp)) - } + Row( + modifier = modifier + .fillMaxWidth() + .background(OrbitTheme.colors.gray_900) + .clickable( + interactionSource = interactionSource, + indication = ripple( + color = OrbitTheme.colors.gray_800, + ), + ) { + if (selectable) { + onToggleSelect(id) + } else { + onClick(id) + } + } + .padding(horizontal = 24.dp, vertical = 20.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + if (selectable) { + OrbitCheckBox( + checked = selected, + onCheckedChange = { onToggleSelect(id) }, + ) + Spacer(modifier = Modifier.width(26.dp)) + } - AlarmListItemContent( - repeatDays = repeatDays, - isActive = isActive, - isHolidayAlarmOff = isHolidayAlarmOff, - isAm = isAm, - hour = hour, - minute = minute, - ) + AlarmListItemContent( + repeatDays = repeatDays, + isActive = isActive, + isHolidayAlarmOff = isHolidayAlarmOff, + isAm = isAm, + hour = hour, + minute = minute, + ) - if (!selectable) { - Spacer(modifier = Modifier.weight(1f)) - OrbitSwitch( - isChecked = isActive, - ) { - onToggleActive(id) + if (!selectable) { + Spacer(modifier = Modifier.weight(1f)) + OrbitSwitch( + isChecked = isActive, + ) { + onToggleActive(id) + } } } } From 6773d6ec1eb88b84067b1887e25ab8d18a0da5fa Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 22:42:22 +0900 Subject: [PATCH 025/210] =?UTF-8?q?[UI/#152]=20AlarmListDropDownMenuItem?= =?UTF-8?q?=20RippleEffect=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../home/component/AlarmListDropDownMenu.kt | 83 ++++++++++++------- 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt b/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt index 174bcd34..60ae8666 100644 --- a/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt +++ b/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt @@ -3,29 +3,36 @@ package com.yapp.home.component import android.util.Log import androidx.annotation.DrawableRes import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ripple.RippleAlpha import androidx.compose.material3.Button import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.LocalRippleConfiguration +import androidx.compose.material3.RippleConfiguration +import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.ripple import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider 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.tooling.preview.Preview @@ -57,6 +64,7 @@ internal fun AlarmListDropDownMenu( } } +@OptIn(ExperimentalMaterial3Api::class) @Composable private fun AlarmListDropDownMenuItem( text: String, @@ -64,36 +72,53 @@ private fun AlarmListDropDownMenuItem( onClick: () -> Unit, ) { val interactionSource = remember { MutableInteractionSource() } - val isPressed by interactionSource.collectIsPressedAsState() - Row( - modifier = Modifier - .width(120.dp) - .background( - color = if (isPressed) OrbitTheme.colors.gray_600 else OrbitTheme.colors.gray_700, - shape = RoundedCornerShape(12.dp), - ) - .clickable( - interactionSource = interactionSource, - indication = null, - onClick = onClick, - ) - .padding(horizontal = 14.dp, vertical = 8.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween, + CompositionLocalProvider( + LocalRippleConfiguration provides RippleConfiguration( + rippleAlpha = RippleAlpha( + pressedAlpha = 1f, + focusedAlpha = 1f, + hoveredAlpha = 1f, + draggedAlpha = 1f, + ), + ), ) { - Text( - text = text, - style = OrbitTheme.typography.body1SemiBold, - color = OrbitTheme.colors.white, - ) + Surface( + modifier = Modifier + .width(120.dp) + .clip(RoundedCornerShape(12.dp)) + .clickable( + interactionSource = interactionSource, + indication = ripple( + bounded = false, + color = OrbitTheme.colors.gray_600, + ), + onClick = onClick, + ), + color = OrbitTheme.colors.gray_700, + shape = RoundedCornerShape(12.dp), + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Text( + text = text, + style = OrbitTheme.typography.body1SemiBold, + color = OrbitTheme.colors.white, + ) - Icon( - modifier = Modifier.size(20.dp), - painter = painterResource(id = iconRes), - contentDescription = "Icon", - tint = OrbitTheme.colors.white, - ) + Icon( + modifier = Modifier.size(20.dp), + painter = painterResource(id = iconRes), + contentDescription = "Icon", + tint = OrbitTheme.colors.white, + ) + } + } } } From 7e61c281a60ed8bad1772c8b7dd0ff77f08c4323 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 22:58:19 +0900 Subject: [PATCH 026/210] =?UTF-8?q?[UI/#152]=20AlarmAddEditSettingItem=20R?= =?UTF-8?q?ippleEffect=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/alarm/addedit/AlarmAddEditScreen.kt | 93 ++++++++++++------- 1 file changed, 62 insertions(+), 31 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt index 156b8a66..5fb76de2 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt @@ -19,14 +19,19 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ripple.RippleAlpha import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.LocalRippleConfiguration +import androidx.compose.material3.RippleConfiguration import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarResult import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.material3.ripple import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -456,7 +461,14 @@ private fun AlarmAddEditSettingsSection( }.title }" } - state.soundState.isSoundEnabled -> state.soundState.sounds.getOrElse(state.soundState.soundIndex) { AlarmSound("", Uri.EMPTY) }.title + + state.soundState.isSoundEnabled -> state.soundState.sounds.getOrElse(state.soundState.soundIndex) { + AlarmSound( + "", + Uri.EMPTY, + ) + }.title + state.soundState.isVibrationEnabled -> stringResource(id = R.string.alarm_add_edit_vibration) else -> stringResource(id = R.string.alarm_add_edit_alarm_selected_option_none) }, @@ -471,44 +483,63 @@ private fun AlarmAddEditSettingsSection( } } +@OptIn(ExperimentalMaterial3Api::class) @Composable private fun AlarmAddEditSettingItem( label: String, description: String, onClick: () -> Unit, ) { - Row( - modifier = Modifier - .fillMaxWidth() - .clickable { - onClick() - } - .padding( - horizontal = 20.dp, - vertical = 14.dp, + val interactionSource = remember { MutableInteractionSource() } + + CompositionLocalProvider( + LocalRippleConfiguration provides RippleConfiguration( + rippleAlpha = RippleAlpha( + pressedAlpha = 1f, + focusedAlpha = 1f, + hoveredAlpha = 1f, + draggedAlpha = 1f, ), - verticalAlignment = Alignment.CenterVertically, + ), ) { - Text( - label, - modifier = Modifier.width(80.dp), - style = OrbitTheme.typography.body1SemiBold, - color = OrbitTheme.colors.white, - ) - Text( - description, - modifier = Modifier.weight(1f), - style = OrbitTheme.typography.body2Regular, - color = OrbitTheme.colors.gray_50, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - textAlign = TextAlign.End, - ) - Icon( - painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right), - contentDescription = "Arrow", - tint = OrbitTheme.colors.gray_300, - ) + Row( + modifier = Modifier + .fillMaxWidth() + .clickable( + interactionSource = interactionSource, + indication = ripple( + color = OrbitTheme.colors.gray_700, + ), + ) { + onClick() + } + .padding( + horizontal = 20.dp, + vertical = 14.dp, + ), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + label, + modifier = Modifier.width(80.dp), + style = OrbitTheme.typography.body1SemiBold, + color = OrbitTheme.colors.white, + ) + Text( + description, + modifier = Modifier.weight(1f), + style = OrbitTheme.typography.body2Regular, + color = OrbitTheme.colors.gray_50, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + textAlign = TextAlign.End, + ) + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right), + contentDescription = "Arrow", + tint = OrbitTheme.colors.gray_300, + ) + } } } From a848564c1ab024904ec30091f91feb3acf497b04 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 23:10:32 +0900 Subject: [PATCH 027/210] =?UTF-8?q?[FIX/#152]=20=EC=98=A4=EB=8A=98=20?= =?UTF-8?q?=EB=8F=84=EC=B0=A9=ED=95=98=EB=8A=94=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20=ED=8F=AC=EB=A7=B7=EC=9D=84=20=E2=80=9Ca?= =?UTF-8?q?=20h:mm=E2=80=9D=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/home/src/main/java/com/yapp/home/HomeViewModel.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index fc9ae92a..e0069bb4 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -350,6 +350,8 @@ class HomeViewModel @Inject constructor( val tomorrow = today.plusDays(1) return when { + inputDateTime.toLocalDate() == today -> + resourceProvider.getString(R.string.home_fortune_delivery_today, inputDateTime.format(DateTimeFormatter.ofPattern("a h:mm"))) inputDateTime.toLocalDate() == tomorrow -> resourceProvider.getString(R.string.home_fortune_delivery_tomorrow, inputDateTime.format(DateTimeFormatter.ofPattern("a h:mm"))) inputDateTime.year == now.year -> From b4719a77601edf273b747b0e93faed4b342d524c Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 23:13:32 +0900 Subject: [PATCH 028/210] =?UTF-8?q?[UI/#152]=20AlarmListItem=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20=EC=8B=9C=20=EC=83=89=EC=83=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/alarm/component/AlarmListItem.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt index 4cea370e..d12cb377 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt @@ -72,7 +72,9 @@ internal fun AlarmListItem( Row( modifier = modifier .fillMaxWidth() - .background(OrbitTheme.colors.gray_900) + .background( + if (selected) OrbitTheme.colors.gray_800 else OrbitTheme.colors.gray_900, + ) .clickable( interactionSource = interactionSource, indication = ripple( From 5d6abe93822d9def5242e3e1d6350177d30e8f89 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 23:33:50 +0900 Subject: [PATCH 029/210] =?UTF-8?q?[FIX/#156]=20actions/cache@v4=EB=A1=9C?= =?UTF-8?q?=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/android_ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml index 1d5b25fe..c696fd26 100644 --- a/.github/workflows/android_ci.yml +++ b/.github/workflows/android_ci.yml @@ -14,7 +14,7 @@ jobs: steps: # Gradle Cache - name: Cache Gradle packages - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: | ~/.gradle/caches From 04f9722829d28558f31f9193d48b4c2cc04bb9b6 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Feb 2025 23:42:51 +0900 Subject: [PATCH 030/210] [CI/#156] Re-run GitHub Actions From 0c081fb37ef0bf13ecd747a6d325d4b2e8b87613 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 19 Feb 2025 12:06:53 +0900 Subject: [PATCH 031/210] =?UTF-8?q?[FEAT/#160]=20UserPreferences=EC=97=90?= =?UTF-8?q?=20=EC=9C=A0=EC=A0=80=20=EC=9D=B4=EB=A6=84=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/datastore/UserPreferences.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt index 799ba2d7..f1d9baa0 100644 --- a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt +++ b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt @@ -23,6 +23,7 @@ class UserPreferences @Inject constructor( ) { private object Keys { val USER_ID = longPreferencesKey("user_id") + val USER_NAME = stringPreferencesKey("user_name") val ONBOARDING_COMPLETED = booleanPreferencesKey("onboarding_completed") val FORTUNE_ID = longPreferencesKey("fortune_id") val FORTUNE_DATE = stringPreferencesKey("fortune_date") @@ -35,6 +36,11 @@ class UserPreferences @Inject constructor( .map { it[Keys.USER_ID] } .distinctUntilChanged() + val userNameFlow: Flow = dataStore.data + .catch { emit(emptyPreferences()) } + .map { it[Keys.USER_NAME] } + .distinctUntilChanged() + val onboardingCompletedFlow: Flow = dataStore.data .catch { emit(emptyPreferences()) } .map { it[Keys.ONBOARDING_COMPLETED] ?: false } @@ -66,6 +72,12 @@ class UserPreferences @Inject constructor( } } + suspend fun saveUserName(userName: String) { + dataStore.edit { preferences -> + preferences[Keys.USER_NAME] = userName + } + } + suspend fun saveFortuneId(fortuneId: Long) { val currentDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) dataStore.edit { preferences -> From c4625351d865cb3617ff55ef6c6c27b2700bef91 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 19 Feb 2025 12:07:23 +0900 Subject: [PATCH 032/210] =?UTF-8?q?[FEAT/#160]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EC=99=84=EB=A3=8C,=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EC=8B=9C=20=EB=B3=80=EA=B2=BD=ED=95=9C?= =?UTF-8?q?=20=EC=9C=A0=EC=A0=80=20=EC=9D=B4=EB=A6=84=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/onboarding/OnboardingViewModel.kt | 2 ++ .../src/main/java/com/yapp/setting/EditProfileViewModel.kt | 1 + 2 files changed, 3 insertions(+) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt index 2077b323..e7cc2518 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt @@ -62,7 +62,9 @@ class OnboardingViewModel @Inject constructor( if (result.isSuccess) { val userId = result.getOrNull() ?: return@launch + val userName = state.userName userPreferences.saveUserId(userId) + userPreferences.saveUserName(userName) updateState { copy(isBottomSheetOpen = false) } moveToNextStep() diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt index 9e0049ca..eb4a5f96 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt @@ -135,6 +135,7 @@ class EditProfileViewModel @Inject constructor( if (result.isSuccess) { Log.d("EditProfileViewModel", "사용자 정보 수정 성공") + userPreferences.saveUserName(state.name) emitSideEffect(SettingContract.SideEffect.NavigateBack) } else { Log.e("EditProfileViewModel", "사용자 정보 수정 실패") From a5b58639f0920db69ddb4ddb3d9c929adc8b6250 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 19 Feb 2025 12:07:57 +0900 Subject: [PATCH 033/210] =?UTF-8?q?[FIX/#160]=20=EC=98=A4=EB=8A=98?= =?UTF-8?q?=EC=9D=98=20=EC=9A=B4=EC=84=B8=20=EB=AC=B8=EA=B5=AC=EC=97=90=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EC=9D=B4=EB=A6=84=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../home/src/main/java/com/yapp/home/HomeContract.kt | 2 +- .../src/main/java/com/yapp/home/HomeViewModel.kt | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/home/HomeContract.kt b/feature/home/src/main/java/com/yapp/home/HomeContract.kt index a6ea0717..10672da7 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeContract.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeContract.kt @@ -20,7 +20,7 @@ sealed class HomeContract { val pendingAlarmToggle: Pair? = null, val lastFortuneScore: Int = -1, val deliveryTime: String = "받을 수 있는 운세가 없어요", - val name: String = "동현", + val name: String = "", ) : UiState { val isAllSelected: Boolean get() = alarms.isNotEmpty() && selectedAlarmIds.size == alarms.size diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index e0069bb4..c83d3767 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -35,6 +35,7 @@ class HomeViewModel @Inject constructor( init { loadAllAlarms() loadDailyFortuneScore() + loadUserName() } fun processAction(action: HomeContract.Action) { @@ -394,7 +395,9 @@ class HomeViewModel @Inject constructor( if (fortuneDate != todayDate) { updateState { - currentState.copy(lastFortuneScore = -1) + currentState.copy( + lastFortuneScore = -1, + ) } } else { userPreferences.fortuneScoreFlow.firstOrNull()?.let { @@ -406,6 +409,13 @@ class HomeViewModel @Inject constructor( } } + private fun loadUserName() { + viewModelScope.launch { + val userName = userPreferences.userNameFlow.firstOrNull() ?: "" + updateState { copy(name = userName) } + } + } + private fun showNoDailyFortuneDialog() { updateState { copy(isNoDailyFortuneDialogVisible = true) } } From e793a1718446755faf69c7fbbfb45d76ea09aa30 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 19 Feb 2025 12:15:40 +0900 Subject: [PATCH 034/210] =?UTF-8?q?[FEAT/#160]=20collect=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=97=AC=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=8B=A4=EC=8B=9C=EA=B0=84=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/home/HomeViewModel.kt | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index c83d3767..ecb5837f 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -390,19 +390,18 @@ class HomeViewModel @Inject constructor( private fun loadDailyFortuneScore() { viewModelScope.launch { - val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() - val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + userPreferences.fortuneDateFlow.collect { fortuneDate -> + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) - if (fortuneDate != todayDate) { - updateState { - currentState.copy( - lastFortuneScore = -1, - ) - } - } else { - userPreferences.fortuneScoreFlow.firstOrNull()?.let { + if (fortuneDate != todayDate) { updateState { - currentState.copy(lastFortuneScore = it) + currentState.copy(lastFortuneScore = -1) + } + } else { + userPreferences.fortuneScoreFlow.collect { score -> + updateState { + currentState.copy(lastFortuneScore = score ?: -1) + } } } } @@ -411,8 +410,9 @@ class HomeViewModel @Inject constructor( private fun loadUserName() { viewModelScope.launch { - val userName = userPreferences.userNameFlow.firstOrNull() ?: "" - updateState { copy(name = userName) } + userPreferences.userNameFlow.collect { userName -> + updateState { copy(name = userName ?: "") } + } } } From 152f94fdb7dc6cabd7b4e6094d020d77c5f4aeef Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Thu, 20 Feb 2025 03:22:47 +0900 Subject: [PATCH 035/210] =?UTF-8?q?[REFACTOR/#145]=20TextField=20showWarni?= =?UTF-8?q?ng=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/ui/component/textfield/OrbitTextField.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt index a01b2cc2..829da49e 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt @@ -48,7 +48,7 @@ fun OrbitTextField( modifier: Modifier = Modifier, showWarning: Boolean = false, isValid: Boolean = false, - warningMessage: String, + warningMessage: String? = null, focusRequester: FocusRequester? = null, keyboardOptions: KeyboardOptions = KeyboardOptions.Default, keyboardActions: KeyboardActions = KeyboardActions.Default, @@ -96,9 +96,11 @@ fun OrbitTextField( enabled = enabled, ) - Box { - if (showWarning) { - WarningMessage(warningMessage, textAlign) + when (showWarning) { + true -> warningMessage?.let { + WarningMessage(it, textAlign) + } + false -> { } } } From 2f960e49f695cc17b361edaeb4cbdf0aafb9a7c4 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Thu, 20 Feb 2025 03:24:32 +0900 Subject: [PATCH 036/210] =?UTF-8?q?[REFACTOR/#145]=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=20=EC=88=98=EC=A0=95=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/setting/EditProfileScreen.kt | 58 +++++++++++++------ .../com/yapp/setting/EditProfileViewModel.kt | 12 +++- .../java/com/yapp/setting/SettingContract.kt | 4 ++ 3 files changed, 55 insertions(+), 19 deletions(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt index 830b66a9..dae4b5f7 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt @@ -20,10 +20,13 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -95,17 +98,19 @@ fun EditProfileScreen( ) { val focusManager = LocalFocusManager.current - val nameTextFieldValue = remember(state.name) { - TextFieldValue( - text = state.name, - selection = TextRange(state.name.length), - ) + val nameTextFieldValue = remember { mutableStateOf(TextFieldValue(state.name)) } + val birthTimeTextFieldValue = remember { mutableStateOf(TextFieldValue(state.timeOfBirth)) } + + LaunchedEffect(state.name) { + if (state.name != nameTextFieldValue.value.text) { + nameTextFieldValue.value = TextFieldValue(state.name) + } } - val birthTimeTextFieldValue = remember(state.timeOfBirth) { - TextFieldValue( - text = state.timeOfBirth, - selection = TextRange(state.timeOfBirth.length), - ) + + LaunchedEffect(state.timeOfBirth) { + if (state.timeOfBirth != birthTimeTextFieldValue.value.text) { + birthTimeTextFieldValue.value = TextFieldValue(state.timeOfBirth) + } } Column( @@ -124,6 +129,7 @@ fun EditProfileScreen( title = "프로필 수정", actionTitle = "저장", onActionClick = onSaveUserInfo, + isActionEnabled = state.isActionEnabled, ) Column( @@ -138,8 +144,9 @@ fun EditProfileScreen( ) Spacer(modifier = Modifier.height(8.dp)) OrbitTextField( - text = nameTextFieldValue, + text = nameTextFieldValue.value, onTextChange = { newValue -> + nameTextFieldValue.value = newValue onUpdateName(newValue.text) }, hint = "이름 입력", @@ -150,6 +157,9 @@ fun EditProfileScreen( .fillMaxWidth() .padding(horizontal = 18.dp), textAlign = TextAlign.Start, + keyboardActions = KeyboardActions( + onDone = { focusManager.clearFocus() }, + ), ) Spacer(modifier = Modifier.height(18.dp)) ContentsTitle( @@ -210,19 +220,24 @@ fun EditProfileScreen( verticalAlignment = Alignment.CenterVertically, ) { OrbitTextField( - text = birthTimeTextFieldValue, + text = birthTimeTextFieldValue.value, onTextChange = { newValue -> - val formattedTime = formatTimeInput(newValue.text, state.timeOfBirth) - onUpdateTimeOfBirth(formattedTime) + val formattedValue = formatTimeInput(newValue.text, state.timeOfBirth) + birthTimeTextFieldValue.value = formattedValue + onUpdateTimeOfBirth(formattedValue.text) }, hint = "시간모름", isValid = state.isTimeValid, showWarning = !state.isTimeValid, - warningMessage = "올바른 시간을 입력해주세요.", enabled = !state.isTimeUnknown, modifier = Modifier .weight(1f), textAlign = TextAlign.Start, + keyboardActions = KeyboardActions( + onDone = { + focusManager.clearFocus() + }, + ), ) Spacer(modifier = Modifier.width(12.dp)) @@ -239,7 +254,7 @@ fun EditProfileScreen( color = if (state.isTimeUnknown) OrbitTheme.colors.main else OrbitTheme.colors.white, ) } - if (!state.isTimeValid) { + if (!state.isTimeUnknown && !state.isTimeValid) { WarningMessage( message = "올바른 시간을 입력해주세요.", textAlign = TextAlign.Start, @@ -261,11 +276,11 @@ fun EditProfileScreen( } } -fun formatTimeInput(input: String, previousText: String): String { +fun formatTimeInput(input: String, previousText: String): TextFieldValue { val sanitizedValue = input.filter { it.isDigit() } val isDeleting = sanitizedValue.length < previousText.filter { it.isDigit() }.length - return when { + val newText = when { isDeleting && previousText.endsWith(":") -> sanitizedValue sanitizedValue.length > 2 -> { val hours = sanitizedValue.take(2) @@ -283,6 +298,13 @@ fun formatTimeInput(input: String, previousText: String): String { else -> sanitizedValue } + val cursorPosition = if (newText.length == 3 && newText.endsWith(":")) { + 3 + } else { + newText.length + } + + return TextFieldValue(newText, TextRange(cursorPosition)) } @Composable diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt index 9e0049ca..1a2713e9 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt @@ -53,6 +53,7 @@ class EditProfileViewModel @Inject constructor( copy( isMaleSelected = action.isMale, isFemaleSelected = !action.isMale, + selectedGender = if (action.isMale) "남성" else "여성", ) } @@ -135,7 +136,16 @@ class EditProfileViewModel @Inject constructor( if (result.isSuccess) { Log.d("EditProfileViewModel", "사용자 정보 수정 성공") - emitSideEffect(SettingContract.SideEffect.NavigateBack) + + emitSideEffect(SettingContract.SideEffect.UserInfoUpdated) + + emitSideEffect( + SettingContract.SideEffect.Navigate( + route = SettingDestination.Setting.route, + popUpTo = SettingDestination.Setting.route, + inclusive = true, + ), + ) } else { Log.e("EditProfileViewModel", "사용자 정보 수정 실패") } diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt index 31275f24..7be266f5 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt @@ -28,6 +28,8 @@ sealed class SettingContract { return "$birthType $year $month $day" } + val isActionEnabled: Boolean + get() = isNameValid && isTimeValid && selectedGender != null } sealed class Action { @@ -47,6 +49,7 @@ sealed class SettingContract { data object HideDialog : Action() data object SubmitUserInfo : Action() data class OpenWebView(val url: String) : Action() + data object RefreshUserInfo : Action() } enum class FieldType(val validationRegex: Regex) { @@ -63,5 +66,6 @@ sealed class SettingContract { data object NavigateBack : SideEffect() data class OpenWebView(val url: String) : SideEffect() + data object UserInfoUpdated : SideEffect() } } From efa135968da0adda31ac5fae864d4fc166f1776b Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Thu, 20 Feb 2025 03:24:50 +0900 Subject: [PATCH 037/210] =?UTF-8?q?[REFACTOR/#145]=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=20=EC=88=98=EC=A0=95=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/setting/component/SettingTopAppBar.kt | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt b/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt index bcc055c6..ba86c10a 100644 --- a/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt +++ b/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt @@ -1,8 +1,6 @@ package com.yapp.setting.component import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -12,8 +10,6 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource @@ -31,10 +27,8 @@ fun SettingTopAppBar( showTopAppBarActions: Boolean = true, title: String, actionTitle: String? = null, + isActionEnabled: Boolean = false, ) { - val interactionSource = remember { MutableInteractionSource() } - val isPressed by interactionSource.collectIsPressedAsState() - TopAppBar( title = { Text( @@ -71,12 +65,11 @@ fun SettingTopAppBar( Text( text = actionTitle ?: "", style = OrbitTheme.typography.body1Medium, - color = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.gray_500, + color = if (isActionEnabled) OrbitTheme.colors.white else OrbitTheme.colors.gray_300, modifier = Modifier .padding(horizontal = 8.dp, vertical = 4.dp) .clickable( - interactionSource = interactionSource, - indication = null, + enabled = isActionEnabled, onClick = onActionClick, ), ) From 69e0fbee83df70de4b672d719143e2c23a903c44 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Thu, 20 Feb 2025 03:25:26 +0900 Subject: [PATCH 038/210] =?UTF-8?q?[REFACTOR/#145]=20=EC=84=B8=ED=8C=85?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=A7=84=EC=9E=85=20=EC=8B=9C=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=EC=A0=95=EB=B3=B4=20=EA=B0=B1=EC=8B=A0(=EC=9E=84?= =?UTF-8?q?=EC=8B=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/setting/SettingNavGraph.kt | 1 + .../java/com/yapp/setting/SettingScreen.kt | 7 ++++- .../java/com/yapp/setting/SettingViewModel.kt | 29 ++++++++++++------- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt b/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt index 36e41aa8..98f597f3 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt @@ -130,5 +130,6 @@ private fun handleSettingSideEffect( is SettingContract.SideEffect.OpenWebView -> { navigator.navigateTo("${WebViewDestination.WebView.route}/${Uri.encode(sideEffect.url)}") } + else -> {} } } diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt index 909f94bf..6bf9a234 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview @@ -31,6 +32,10 @@ fun SettingRoute( ) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + LaunchedEffect(Unit) { + viewModel.refreshUserInfo() // 이걸 어찌 할까요 + } + SettingScreen( state = state, onNavigateToEditProfile = { @@ -41,7 +46,7 @@ fun SettingRoute( onBackClick = { viewModel.onAction(SettingContract.Action.PreviousStep) }, onInquiryClick = { viewModel.onAction( - SettingContract.Action.OpenWebView("http://pf.kakao.com/_YxiPsn/chat"), + SettingContract.Action.OpenWebView("https://forms.gle/Q6wpKj3YAyS2jxq57"), ) }, onTermsClick = { diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt index 4a82c925..fbbb768e 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt @@ -7,6 +7,7 @@ import com.yapp.datastore.UserPreferences import com.yapp.domain.repository.UserInfoRepository import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import org.orbitmvi.orbit.syntax.simple.intent import javax.inject.Inject @@ -15,21 +16,29 @@ import javax.inject.Inject class SettingViewModel @Inject constructor( private val userInfoRepository: UserInfoRepository, private val userPreferences: UserPreferences, -) : - BaseViewModel( - SettingContract.State(), - ) { - - init { +) : BaseViewModel( + SettingContract.State(), +) { + fun refreshUserInfo() { viewModelScope.launch { - userPreferences.userIdFlow.collect { userId -> - if (userId != null) { - fetchUserInfo(userId) - } + val userId = userPreferences.userIdFlow.firstOrNull() + if (userId != null) { + fetchUserInfo(userId) } } } +// init { +// viewModelScope.launch { +// container.sideEffectFlow.collect { sideEffect -> +// when (sideEffect) { +// is SettingContract.SideEffect.UserInfoUpdated -> refreshUserInfo() +// else -> {} +// } +// } +// } +// } + fun onAction(action: SettingContract.Action) = intent { when (action) { is SettingContract.Action.UpdateName -> updateState { From b16e68d2d1e638bda9299b228b54672af2041010 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Thu, 20 Feb 2025 03:26:15 +0900 Subject: [PATCH 039/210] =?UTF-8?q?[REFACTOR/#145]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EB=B0=94=ED=85=80=EC=8B=9C=ED=8A=B8=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=95=84=EB=8B=88=EC=98=A4=20=ED=81=B4=EB=A6=AD=20?= =?UTF-8?q?=EC=8B=9C=20=EC=9D=B4=EB=8F=99=20->=20=EC=8B=9C=ED=8A=B8=20?= =?UTF-8?q?=EB=8B=AB=EA=B8=B0=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt index 24ca5151..904fd30f 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt @@ -46,7 +46,6 @@ fun OnboardingGenderRoute( }, onDismissRequest = { viewModel.processAction(OnboardingContract.Action.ToggleBottomSheet) - viewModel.processAction(OnboardingContract.Action.PreviousStep) }, onConfirmRequest = { viewModel.processAction(OnboardingContract.Action.ToggleBottomSheet) From b342a43780977a023dfb5319ea28033ad59dff74 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 20 Feb 2025 16:12:56 +0900 Subject: [PATCH 040/210] =?UTF-8?q?[UI/#162]=20OrbitToolTip=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/ui/component/tooltip/OrbitToolTip.kt | 166 ++++++++++++++++++ .../src/main/java/com/yapp/ui/utils/DpToPx.kt | 5 + 2 files changed, 171 insertions(+) create mode 100644 core/ui/src/main/java/com/yapp/ui/component/tooltip/OrbitToolTip.kt diff --git a/core/ui/src/main/java/com/yapp/ui/component/tooltip/OrbitToolTip.kt b/core/ui/src/main/java/com/yapp/ui/component/tooltip/OrbitToolTip.kt new file mode 100644 index 00000000..7f044eff --- /dev/null +++ b/core/ui/src/main/java/com/yapp/ui/component/tooltip/OrbitToolTip.kt @@ -0,0 +1,166 @@ +package com.yapp.ui.component.tooltip + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +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.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.Surface +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.geometry.Rect +import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Outline +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Popup +import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.ui.utils.toPx +import com.yapp.ui.utils.toRoundPx + +@Composable +fun OrbitToolTip( + backgroundColor: Color = OrbitTheme.colors.gray_900, + textColor: Color = OrbitTheme.colors.gray_100, + textStyle: TextStyle = OrbitTheme.typography.label2SemiBold, + offset: IntOffset = IntOffset(0, 0), + text: String, +) { + val popupOffset = IntOffset( + x = offset.x + 15.dp.toRoundPx(), + y = offset.y + 2.dp.toRoundPx(), + ) + + Popup( + alignment = Alignment.Center, + offset = popupOffset, + ) { + Column( + horizontalAlignment = Alignment.Start, + ) { + Row { + Spacer(modifier = Modifier.width(15.dp)) + + Spacer( + modifier = Modifier + .width(10.dp) + .height(5.dp) + .background( + color = backgroundColor, + shape = RoundedTopTriangleShape(1.dp.toPx()), + ), + ) + } + + Surface( + shape = RoundedCornerShape(8.dp), + color = backgroundColor, + ) { + Text( + modifier = Modifier.padding( + vertical = 6.dp, + horizontal = 10.dp, + ), + text = text, + style = textStyle, + color = textColor, + ) + } + } + } +} + +class RoundedTopTriangleShape(private val radius: Float) : Shape { + override fun createOutline( + size: Size, + layoutDirection: LayoutDirection, + density: Density, + ): Outline { + val path = Path().apply { + val topX = size.width / 2f + val topY = 0f + val bottomLeftX = 0f + val bottomLeftY = size.height + val bottomRightX = size.width + val bottomRightY = size.height + + // 왼쪽 아래 꼭짓점 시작 + moveTo(bottomLeftX, bottomLeftY) + + lineTo(topX - radius, topY) + + arcTo( + rect = Rect( + left = topX - radius, + top = topY, + right = topX + radius, + bottom = topY + (2 * radius), + ), + startAngleDegrees = 180f, + sweepAngleDegrees = 180f, + forceMoveTo = false, + ) + + lineTo(bottomRightX, bottomRightY) + + close() + } + + return Outline.Generic(path) + } +} + +@Preview +@Composable +fun ReversedPopup() { + OrbitTheme { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Gray), + ) { + Box( + modifier = Modifier.align(Alignment.Center), + ) { + Box( + modifier = Modifier + .size(32.dp) + .clip(CircleShape) + .clickable {}, + contentAlignment = Alignment.Center, + ) { + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_mail), + contentDescription = "Mail", + tint = OrbitTheme.colors.white, + ) + } + + OrbitToolTip( + text = "운세 도착", + offset = IntOffset(x = 0, y = 32.dp.toRoundPx()), + ) + } + } + } +} diff --git a/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt b/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt index 5733c274..b08f3c85 100644 --- a/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt +++ b/core/ui/src/main/java/com/yapp/ui/utils/DpToPx.kt @@ -8,3 +8,8 @@ import androidx.compose.ui.unit.Dp fun Dp.toPx(): Float { return with(LocalDensity.current) { this@toPx.toPx() } } + +@Composable +fun Dp.toRoundPx(): Int { + return with(LocalDensity.current) { this@toRoundPx.roundToPx() } +} From 3194c0928559ac8b8fbf3029251fb0705b633592 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 20 Feb 2025 17:17:25 +0900 Subject: [PATCH 041/210] =?UTF-8?q?[FEAT/#162]=20UserPreferences=EC=97=90?= =?UTF-8?q?=20=ED=99=95=EC=9D=B8=20=EC=95=88=ED=95=9C=20=EC=9A=B4=EC=84=B8?= =?UTF-8?q?=20=EC=97=AC=EB=B6=80=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/datastore/UserPreferences.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt index f1d9baa0..9b57e27a 100644 --- a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt +++ b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt @@ -29,6 +29,7 @@ class UserPreferences @Inject constructor( val FORTUNE_DATE = stringPreferencesKey("fortune_date") val FORTUNE_IMAGE_ID = intPreferencesKey("fortune_image_id") val FORTUNE_SCORE = intPreferencesKey("fortune_score") + val FORTUNE_CHECKED = booleanPreferencesKey("fortune_checked") } val userIdFlow: Flow = dataStore.data @@ -66,6 +67,16 @@ class UserPreferences @Inject constructor( .map { it[Keys.FORTUNE_SCORE] } .distinctUntilChanged() + val hasNewFortuneFlow: Flow = dataStore.data + .catch { emit(emptyPreferences()) } + .map { preferences -> + val savedDate = preferences[Keys.FORTUNE_DATE] + val isChecked = preferences[Keys.FORTUNE_CHECKED] ?: true + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + savedDate == todayDate && !isChecked + } + .distinctUntilChanged() + suspend fun saveUserId(userId: Long) { dataStore.edit { preferences -> preferences[Keys.USER_ID] = userId @@ -83,6 +94,13 @@ class UserPreferences @Inject constructor( dataStore.edit { preferences -> preferences[Keys.FORTUNE_ID] = fortuneId preferences[Keys.FORTUNE_DATE] = currentDate + preferences[Keys.FORTUNE_CHECKED] = false + } + } + + suspend fun markFortuneAsChecked() { + dataStore.edit { preferences -> + preferences[Keys.FORTUNE_CHECKED] = true } } @@ -116,6 +134,7 @@ class UserPreferences @Inject constructor( preferences.remove(Keys.FORTUNE_DATE) preferences.remove(Keys.FORTUNE_IMAGE_ID) preferences.remove(Keys.FORTUNE_SCORE) + preferences.remove(Keys.FORTUNE_CHECKED) } } } From 93af0e1f5c2be72c1516a0c443e5a2bea8791523 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 20 Feb 2025 17:17:59 +0900 Subject: [PATCH 042/210] =?UTF-8?q?[UI/#162]=20=ED=99=95=EC=9D=B8=20?= =?UTF-8?q?=EC=95=88=ED=95=9C=20=EC=9A=B4=EC=84=B8=20=EC=A1=B4=EC=9E=AC=20?= =?UTF-8?q?=EC=8B=9C=20=ED=88=B4=ED=8C=81=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/home/HomeContract.kt | 3 + .../src/main/java/com/yapp/home/HomeScreen.kt | 77 ++++++++++++++---- .../main/java/com/yapp/home/HomeViewModel.kt | 81 ++++++------------- feature/home/src/main/res/values/strings.xml | 2 + 4 files changed, 93 insertions(+), 70 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/home/HomeContract.kt b/feature/home/src/main/java/com/yapp/home/HomeContract.kt index 10672da7..b51aa7a6 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeContract.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeContract.kt @@ -17,6 +17,8 @@ sealed class HomeContract { val isDeleteDialogVisible: Boolean = false, val isNoActivatedAlarmDialogVisible: Boolean = false, val isNoDailyFortuneDialogVisible: Boolean = false, + val hasNewFortune: Boolean = false, + val isToolTipVisible: Boolean = false, val pendingAlarmToggle: Pair? = null, val lastFortuneScore: Int = -1, val deliveryTime: String = "받을 수 있는 운세가 없어요", @@ -41,6 +43,7 @@ sealed class HomeContract { data object HideNoActivatedAlarmDialog : Action() data object ShowNoDailyFortuneDialog : Action() data object HideNoDailyFortuneDialog : Action() + data object HideToolTip : Action() data object RollbackPendingAlarmToggle : Action() data object ConfirmDeletion : Action() data class DeleteSingleAlarm(val alarmId: Long) : Action() diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt index 55fd97c5..685ff2ad 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt @@ -54,6 +54,7 @@ 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 androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -63,6 +64,7 @@ import com.yapp.home.component.bottomsheet.AlarmListBottomSheet import com.yapp.ui.component.dialog.OrbitDialog import com.yapp.ui.component.lottie.LottieAnimation import com.yapp.ui.component.snackbar.showCustomSnackBar +import com.yapp.ui.component.tooltip.OrbitToolTip import com.yapp.ui.utils.heightForScreenPercentage import com.yapp.ui.utils.toPx import feature.home.R @@ -167,6 +169,8 @@ fun HomeScreen( onAddClick = { eventDispatcher(HomeContract.Action.NavigateToAlarmCreation) }, + hasNewFortune = state.hasNewFortune, + isTooltipVisible = state.isToolTipVisible, ) } else { HomeContent( @@ -262,7 +266,14 @@ private fun HomeContent( } } - Box { + Box( + modifier = Modifier.clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + ) { + eventDispatcher(HomeContract.Action.HideToolTip) + }, + ) { AlarmListBottomSheet( alarms = state.alarms, menuExpanded = state.dropdownMenuExpanded, @@ -345,6 +356,8 @@ private fun HomeContent( HomeTopBar( onSettingClick = { eventDispatcher(HomeContract.Action.NavigateToSetting) }, onMailClick = { eventDispatcher(HomeContract.Action.ShowDailyFortune) }, + hasNewFortune = state.hasNewFortune, + isShowTooltip = state.isToolTipVisible, ) } } @@ -370,6 +383,8 @@ private fun HomeContent( private fun HomeTopBar( onSettingClick: () -> Unit, onMailClick: () -> Unit, + hasNewFortune: Boolean, + isShowTooltip: Boolean, ) { Box( modifier = Modifier.statusBarsPadding(), @@ -383,20 +398,48 @@ private fun HomeTopBar( ) { Spacer(modifier = Modifier.weight(1f)) - Box( - modifier = Modifier - .size(32.dp) - .clip(CircleShape) - .clickable { - onMailClick() - }, - contentAlignment = Alignment.Center, - ) { - Icon( - painter = painterResource(id = core.designsystem.R.drawable.ic_mail), - contentDescription = "Mail", - tint = OrbitTheme.colors.white, - ) + Box { + Box( + contentAlignment = Alignment.BottomEnd, + ) { + Box( + modifier = Modifier + .size(32.dp) + .clip(CircleShape) + .clickable { + onMailClick() + }, + contentAlignment = Alignment.Center, + ) { + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_mail), + contentDescription = "Mail", + tint = OrbitTheme.colors.white, + ) + } + + if (hasNewFortune) { + Spacer( + modifier = Modifier + .size(7.dp) + .background( + color = OrbitTheme.colors.alert, + shape = CircleShape, + ) + .padding( + end = 4.dp, + bottom = 6.dp, + ), + ) + } + } + + if (isShowTooltip) { + OrbitToolTip( + text = stringResource(id = R.string.home_tool_tip_fortune_arrived), + offset = IntOffset(x = 0, y = 32.dp.toPx().toInt()), + ) + } } Spacer(modifier = Modifier.width(12.dp)) @@ -583,6 +626,8 @@ private fun HomeAlarmEmptyScreen( onSettingClick: () -> Unit, onMailClick: () -> Unit, onAddClick: () -> Unit, + hasNewFortune: Boolean, + isTooltipVisible: Boolean, ) { Column( modifier = Modifier @@ -593,6 +638,8 @@ private fun HomeAlarmEmptyScreen( HomeTopBar( onSettingClick = onSettingClick, onMailClick = onMailClick, + hasNewFortune = hasNewFortune, + isShowTooltip = isTooltipVisible, ) Spacer(modifier = Modifier.heightForScreenPercentage(0.13f)) diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index ecb5837f..1c702a86 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -15,6 +15,7 @@ import com.yapp.domain.usecase.AlarmUseCase import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import feature.home.R +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import java.time.LocalDate @@ -34,7 +35,7 @@ class HomeViewModel @Inject constructor( ) { init { loadAllAlarms() - loadDailyFortuneScore() + loadDailyFortuneState() loadUserName() } @@ -52,6 +53,7 @@ class HomeViewModel @Inject constructor( HomeContract.Action.HideNoActivatedAlarmDialog -> hideNoActivatedAlarmDialog() HomeContract.Action.ShowNoDailyFortuneDialog -> showNoDailyFortuneDialog() HomeContract.Action.HideNoDailyFortuneDialog -> hideNoDailyFortuneDialog() + HomeContract.Action.HideToolTip -> hideToolTip() HomeContract.Action.RollbackPendingAlarmToggle -> rollbackAlarmActivation() HomeContract.Action.ConfirmDeletion -> confirmDeletion() is HomeContract.Action.DeleteSingleAlarm -> deleteSingleAlarm(action.alarmId) @@ -381,6 +383,7 @@ class HomeViewModel @Inject constructor( if (fortuneDate != todayDate) { processAction(HomeContract.Action.ShowNoDailyFortuneDialog) } else { + userPreferences.markFortuneAsChecked() emitSideEffect( HomeContract.SideEffect.Navigate(FortuneDestination.Fortune.route), ) @@ -388,21 +391,26 @@ class HomeViewModel @Inject constructor( } } - private fun loadDailyFortuneScore() { + private fun loadDailyFortuneState() { viewModelScope.launch { - userPreferences.fortuneDateFlow.collect { fortuneDate -> - val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) - if (fortuneDate != todayDate) { - updateState { - currentState.copy(lastFortuneScore = -1) - } - } else { - userPreferences.fortuneScoreFlow.collect { score -> - updateState { - currentState.copy(lastFortuneScore = score ?: -1) - } - } + combine( + userPreferences.fortuneDateFlow, + userPreferences.fortuneScoreFlow, + userPreferences.hasNewFortuneFlow + ) { fortuneDate, fortuneScore, hasNewFortune -> + val isTodayFortuneAvailable = fortuneDate == todayDate + val finalFortuneScore = if (isTodayFortuneAvailable) fortuneScore ?: -1 else -1 + + Triple(finalFortuneScore, hasNewFortune, isTodayFortuneAvailable) + }.collect { (finalFortuneScore, hasNewFortune, isTodayFortuneAvailable) -> // ✅ 수집 후 상태 업데이트 + updateState { + copy( + lastFortuneScore = finalFortuneScore, + hasNewFortune = hasNewFortune, + isToolTipVisible = hasNewFortune + ) } } } @@ -424,6 +432,10 @@ class HomeViewModel @Inject constructor( updateState { copy(isNoDailyFortuneDialogVisible = false) } } + private fun hideToolTip() { + updateState { copy(isToolTipVisible = false) } + } + private fun navigateToSetting() { emitSideEffect( HomeContract.SideEffect.Navigate( @@ -431,45 +443,4 @@ class HomeViewModel @Inject constructor( ), ) } - - /* - private fun loadMoreAlarms() { - val currentPage = currentState.paginationState.currentPage - if (currentState.paginationState.isLoading || !currentState.paginationState.hasMoreData) return - - val pageSize = 10 - val offset = currentPage * pageSize - - updateState { - copy( - paginationState = currentState.paginationState.copy(isLoading = true), - ) - } - - viewModelScope.launch { - alarmUseCase.getPagedAlarms(limit = pageSize, offset = offset) - .onSuccess { - updateState { - copy( - alarms = currentState.alarms + it, - paginationState = currentState.paginationState.copy( - currentPage = currentPage + 1, - isLoading = false, - hasMoreData = it.size == pageSize, - ), - initialLoading = false, - ) - } - } - .onFailure { - Log.e("HomeViewModel", "Failed to get paged alarms", it) - updateState { - copy( - paginationState = currentState.paginationState.copy(isLoading = false), - initialLoading = false, - ) - } - } - } - }*/ } diff --git a/feature/home/src/main/res/values/strings.xml b/feature/home/src/main/res/values/strings.xml index 2554cf1f..07b2869c 100644 --- a/feature/home/src/main/res/values/strings.xml +++ b/feature/home/src/main/res/values/strings.xml @@ -4,6 +4,8 @@ 기상 알람이 없어요 알람을 추가하고\n운세 편지를 받아보세요 + 운세 도착 + 운세 편지를 받고 싶다면\n기상 알람을 켜줘 미래에서 운세 편지를\n작성 중이야! 오늘 %s의 하루는\n주의가 필요해 From bbfb26c9ae5b48638f7c129456275d00c6cf719a Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 20 Feb 2025 17:38:22 +0900 Subject: [PATCH 043/210] =?UTF-8?q?[REFACTOR/#162]=20=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=EC=95=88=ED=95=98=EB=8A=94=20isTodayFortuneAvailable=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/home/src/main/java/com/yapp/home/HomeViewModel.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index 1c702a86..3a15f883 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -398,18 +398,18 @@ class HomeViewModel @Inject constructor( combine( userPreferences.fortuneDateFlow, userPreferences.fortuneScoreFlow, - userPreferences.hasNewFortuneFlow + userPreferences.hasNewFortuneFlow, ) { fortuneDate, fortuneScore, hasNewFortune -> val isTodayFortuneAvailable = fortuneDate == todayDate val finalFortuneScore = if (isTodayFortuneAvailable) fortuneScore ?: -1 else -1 - Triple(finalFortuneScore, hasNewFortune, isTodayFortuneAvailable) - }.collect { (finalFortuneScore, hasNewFortune, isTodayFortuneAvailable) -> // ✅ 수집 후 상태 업데이트 + Pair(finalFortuneScore, hasNewFortune) + }.collect { (finalFortuneScore, hasNewFortune) -> updateState { copy( lastFortuneScore = finalFortuneScore, hasNewFortune = hasNewFortune, - isToolTipVisible = hasNewFortune + isToolTipVisible = hasNewFortune, ) } } From 9292fb7789a5e261ebf39b07527a382fbbf52e4f Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Thu, 20 Feb 2025 22:07:05 +0900 Subject: [PATCH 044/210] [REFACTOR/#147] ktlint format --- .../src/main/java/com/yapp/setting/EditProfileViewModel.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt index 385e1214..ffbfb904 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt @@ -146,7 +146,6 @@ class EditProfileViewModel @Inject constructor( inclusive = true, ), ) - } else { Log.e("EditProfileViewModel", "사용자 정보 수정 실패") } From d331f36b2140deb693da0f14e39db55f57a8c66b Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Thu, 20 Feb 2025 22:25:19 +0900 Subject: [PATCH 045/210] =?UTF-8?q?[REFACTOR/#147]=20=EC=83=9D=EB=85=84?= =?UTF-8?q?=EC=9B=94=EC=9D=BC=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=ED=83=91=EB=B0=94=20=EC=95=A1=EC=85=98=20=ED=99=9C?= =?UTF-8?q?=EC=84=B1=ED=99=94=20=EB=B0=8F=20=EC=95=A1=EC=85=98=20=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=89=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/setting/EditBirthdayScreen.kt | 1 + .../main/java/com/yapp/setting/component/SettingTopAppBar.kt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt b/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt index 6478df74..ad38bfda 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt @@ -72,6 +72,7 @@ fun EditBirthdayScreen( showTopAppBarActions = true, title = "생년월일 수정", actionTitle = "확인", + isActionEnabled = true, onActionClick = { onConfirm() }, diff --git a/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt b/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt index ba86c10a..42a2b922 100644 --- a/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt +++ b/feature/setting/src/main/java/com/yapp/setting/component/SettingTopAppBar.kt @@ -65,7 +65,7 @@ fun SettingTopAppBar( Text( text = actionTitle ?: "", style = OrbitTheme.typography.body1Medium, - color = if (isActionEnabled) OrbitTheme.colors.white else OrbitTheme.colors.gray_300, + color = if (isActionEnabled) OrbitTheme.colors.main else OrbitTheme.colors.gray_300, modifier = Modifier .padding(horizontal = 8.dp, vertical = 4.dp) .clickable( From 4830b2aa6e14b68f27223d75ae121f1766559803 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 20 Feb 2025 23:15:13 +0900 Subject: [PATCH 046/210] =?UTF-8?q?[FEAT/#165]=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=8A=A4=EC=99=80=EC=9D=B4=ED=94=84=EB=A1=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EC=8B=9C=20snooze=20=EB=98=90=EB=8A=94=20dismiss?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/alarm/services/AlarmService.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt index 3b0e8272..8d620af4 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt @@ -184,6 +184,9 @@ class AlarmService : Service() { .setPriority(NotificationCompat.PRIORITY_HIGH) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setFullScreenIntent(alarmAlertPendingIntent, true) + .setDeleteIntent( + snoozePendingIntent ?: alarmDismissPendingIntent, + ) .addAction(core.designsystem.R.drawable.ic_cancel, "알람 해제", alarmDismissPendingIntent) snoozePendingIntent?.let { From 08b289133fa9fb71f6f114de8e08b0f2e0f620fe Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 20 Feb 2025 23:15:33 +0900 Subject: [PATCH 047/210] =?UTF-8?q?[FEAT/#165]=20=EC=95=8C=EB=9E=8C?= =?UTF-8?q?=EC=9D=84=20=EB=AF=B8=EB=A3=A8=EA=B1=B0=EB=82=98=20=ED=95=B4?= =?UTF-8?q?=EC=A0=9C=20=EC=8B=9C=20=ED=86=A0=EC=8A=A4=ED=8A=B8=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EB=85=B8=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt index b7a3c68a..1afc7652 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.Intent import android.os.Build import android.util.Log +import android.widget.Toast import com.yapp.alarm.AlarmConstants import com.yapp.alarm.AlarmHelper import com.yapp.alarm.services.AlarmService @@ -38,14 +39,17 @@ class AlarmReceiver : BroadcastReceiver() { @Suppress("DEPRECATION") intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM) } - alarm?.let { handleSnooze(context, it) } + + Toast.makeText(context, "알람이 ${alarm?.snoozeInterval}분 후 다시 울려요", Toast.LENGTH_SHORT).show() } AlarmConstants.ACTION_ALARM_DISMISSED -> { Log.d("AlarmReceiver", "Alarm Dismissed") context.stopService(alarmServiceIntent) sendBroadCastToCloseAlarmInteractionActivity(context) + + Toast.makeText(context, "알람이 해제되었어요", Toast.LENGTH_SHORT).show() } } } From 57c8fbcd609213f57bf7259064998fe23059042c Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 03:35:07 +0900 Subject: [PATCH 048/210] =?UTF-8?q?[REFACTOR/#166]=20API=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=20=EC=8B=A4=ED=8C=A8=20=EC=8B=9C=20=EB=8B=A4=EC=9D=B4=EC=96=BC?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EB=9D=84=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/onboarding/OnboardingContract.kt | 23 ++++++++++++++++++- .../yapp/onboarding/OnboardingGenderScreen.kt | 12 ++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt index 0a987a74..8cf14d84 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt @@ -19,6 +19,7 @@ sealed class OnboardingContract { val isBirthTimeValid: Boolean = false, val isValid: Boolean = false, val isBottomSheetOpen: Boolean = false, + val isShowWarningDialog: Boolean = false, ) : UiState { val birthDateFormatted: String get() { @@ -61,11 +62,13 @@ sealed class OnboardingContract { data object ToggleBottomSheet : Action() data object CompleteOnboarding : Action() data class OpenWebView(val url: String) : Action() + data object ShowWarningDialog : Action() + data object HideWarningDialog : Action() } enum class FieldType(val validationRegex: Regex) { TIME(Regex("^(24:00|([0-1]\\d|2[0-3]):[0-5]\\d)\$")), - NAME(Regex("^(?=.{1,13}\$)(?=.{1,6}(?:[가-힣]|[a-zA-Z]{2})\$)[가-힣a-zA-Z]*\$")), + NAME(Regex("^(?!.*[0-9@#\$%^&*!\\s])[가-힣a-zA-Z]*$")), } sealed class SideEffect : com.yapp.ui.base.SideEffect { @@ -79,4 +82,22 @@ sealed class OnboardingContract { data object OnboardingCompleted : SideEffect() data class OpenWebView(val url: String) : SideEffect() } + + companion object { + fun truncateTextToLimit(text: String, maxLength: Int = 12): String { + var totalLength = 0 + val result = StringBuilder() + + for (char in text) { + val charWeight = if (char in '가'..'힣') 2 else 1 + + if (totalLength + charWeight > maxLength) break + + totalLength += charWeight + result.append(char) + } + + return result.toString() + } + } } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt index 904fd30f..4fdd2f9c 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.UserInfoBottomSheet +import com.yapp.ui.component.dialog.OrbitDialog import com.yapp.ui.toggle.OrbitGenderToggle import com.yapp.ui.utils.heightForScreenPercentage import com.yapp.ui.utils.paddingForScreenPercentage @@ -112,6 +113,17 @@ fun OnboardingGenderScreen( } } + if (state.isShowWarningDialog) { + OrbitDialog( + title = stringResource(id = R.string.onboarding_warning_dialog_title), + message = stringResource(id = R.string.onboarding_warning_dialog_message), + confirmText = stringResource(id = R.string.onboarding_warning_dialog_btn_confirm), + onConfirm = { + onConfirmRequest() + }, + ) + } + UserInfoBottomSheet( isSheetOpen = state.isBottomSheetOpen, onDismissRequest = onDismissRequest, From a74a69efcf5c17ed4c3a431bb5ca18bd09a7ea5c Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 03:35:23 +0900 Subject: [PATCH 049/210] =?UTF-8?q?[REFACTOR/#166]=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=A0=95=EA=B7=9C=EC=8B=9D=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/onboarding/OnboardingNameScreen.kt | 21 +++++-- .../yapp/onboarding/OnboardingViewModel.kt | 57 +++++++++++++------ 2 files changed, 55 insertions(+), 23 deletions(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt index 07451046..a072f067 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt @@ -41,7 +41,7 @@ fun OnboardingNameRoute( focusRequester.requestFocus() } BackHandler { - viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리 + viewModel.processAction(OnboardingContract.Action.PreviousStep) } OnboardingNameScreen( @@ -52,7 +52,12 @@ fun OnboardingNameRoute( onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) }, onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) }, onTextChange = { value -> - viewModel.processAction(OnboardingContract.Action.UpdateField(value, OnboardingContract.FieldType.NAME)) + viewModel.processAction( + OnboardingContract.Action.UpdateField( + value, + OnboardingContract.FieldType.NAME, + ), + ) }, ) } @@ -106,10 +111,13 @@ fun OnboardingNameScreen( OrbitTextField( text = textFieldValue, onTextChange = { newValue -> + val truncatedText = OnboardingContract.truncateTextToLimit(newValue.text) + textFieldValue = newValue.copy( - selection = TextRange(newValue.text.length), + text = truncatedText, + selection = TextRange(truncatedText.length), ) - onTextChange(newValue.text) + onTextChange(truncatedText) }, hint = "이름 입력", isValid = state.isValid, @@ -118,7 +126,10 @@ fun OnboardingNameScreen( focusRequester = focusRequester, modifier = Modifier .fillMaxWidth() - .paddingForScreenPercentage(horizontalPercentage = 0.192f, topPercentage = 0.086f), + .paddingForScreenPercentage( + horizontalPercentage = 0.192f, + topPercentage = 0.086f, + ), keyboardActions = KeyboardActions( onDone = { focusManager.clearFocus() diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt index e7cc2518..d3873d9e 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt @@ -45,6 +45,8 @@ class OnboardingViewModel @Inject constructor( is OnboardingContract.Action.ToggleBottomSheet -> toggleBottomSheet() is OnboardingContract.Action.CompleteOnboarding -> completeOnboarding() is OnboardingContract.Action.OpenWebView -> openWebView(action.url) + is OnboardingContract.Action.ShowWarningDialog -> showWarningDialog() + is OnboardingContract.Action.HideWarningDialog -> hideWarningDialog() } } @@ -69,7 +71,7 @@ class OnboardingViewModel @Inject constructor( updateState { copy(isBottomSheetOpen = false) } moveToNextStep() } else { - emitSideEffect(OnboardingContract.SideEffect.NavigateBack) + processAction(OnboardingContract.Action.ShowWarningDialog) } } } @@ -79,6 +81,11 @@ class OnboardingViewModel @Inject constructor( val nextStep = currentStep + 1 val nextRoute = OnboardingDestination.nextRoute(currentStep) + Log.d("OnboardingViewModel", "🔥 moveToNextStep 호출 - CurrentStep: $currentStep, NextStep: $nextStep") + Log.d("OnboardingViewModel", "🔥 현재 birthDate: ${currentState.birthDate}, birthType: ${currentState.birthType}") + savedStateHandle["birthDate"] = currentState.birthDate + savedStateHandle["birthType"] = currentState.birthType + if (nextRoute != null) { savedStateHandle["currentStep"] = nextStep updateState { copy(currentStep = nextStep) } @@ -162,14 +169,15 @@ class OnboardingViewModel @Inject constructor( } OnboardingContract.FieldType.NAME -> { - val isValid = value.matches(fieldType.validationRegex) + val truncatedValue = OnboardingContract.truncateTextToLimit(value) + val isValid = truncatedValue.matches(fieldType.validationRegex) updateState { copy( - textFieldValue = value, - userName = value, - showWarning = value.isNotEmpty() && !isValid, - isButtonEnabled = value.isNotEmpty() && isValid, + textFieldValue = truncatedValue, + userName = truncatedValue, + showWarning = !isValid, + isButtonEnabled = truncatedValue.isNotEmpty() && isValid, isValid = isValid, ) } @@ -180,19 +188,24 @@ class OnboardingViewModel @Inject constructor( private fun updateBirthDate(lunar: String, year: Int, month: Int, day: Int) { val formattedDate = "$year-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}" - if (currentState.birthDate == formattedDate && currentState.birthType == lunar) { - return - } - hapticFeedbackManager.performHapticFeedback(HapticType.LIGHT_TICK) - savedStateHandle["birthDate"] = formattedDate - savedStateHandle["birthType"] = lunar + Log.d("OnboardingViewModel", "updateBirthDate 호출 - New: $formattedDate, Old: ${currentState.birthDate}") - updateState { - copy( - birthDate = formattedDate, - birthType = lunar, - isBirthDateValid = true, - ) + if (currentState.birthDate != formattedDate || currentState.birthType != lunar) { + Log.d("OnboardingViewModel", "BirthDate 변경 감지 - 업데이트 수행") + + hapticFeedbackManager.performHapticFeedback(HapticType.LIGHT_TICK) + savedStateHandle["birthDate"] = formattedDate + savedStateHandle["birthType"] = lunar + + updateState { + copy( + birthDate = formattedDate, + birthType = lunar, + isBirthDateValid = true, + ) + } + } else { + Log.d("OnboardingViewModel", "BirthDate 변경 없음 - 업데이트 생략") } } @@ -226,4 +239,12 @@ class OnboardingViewModel @Inject constructor( private fun openWebView(url: String) { emitSideEffect(OnboardingContract.SideEffect.OpenWebView(url)) } + + private fun showWarningDialog() { + updateState { copy(isShowWarningDialog = true) } + } + + private fun hideWarningDialog() { + updateState { copy(isShowWarningDialog = false) } + } } From 4c0b63a7d8d5e9c9fd4036e27f88a81ecb011c66 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 03:35:34 +0900 Subject: [PATCH 050/210] =?UTF-8?q?[REFACTOR/#166]=20=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A7=81=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/onboarding/src/main/res/values/values.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/feature/onboarding/src/main/res/values/values.xml b/feature/onboarding/src/main/res/values/values.xml index 715f1b0c..833f3d60 100644 --- a/feature/onboarding/src/main/res/values/values.xml +++ b/feature/onboarding/src/main/res/values/values.xml @@ -33,4 +33,8 @@ 기상 미션을 수행하면\n운세를 확인 할 수 있어요 오르비의 하루 운세로\n아침을 즐겁게 시작해 보세요! + 오류 + 서비스가 일시적으로 사용 불가능합니다.\n잠시 후 다시 시도해주세요. + 확인 + From 48e63fe61790dedf1beba10661413d7f3e40dbb3 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 03:41:07 +0900 Subject: [PATCH 051/210] =?UTF-8?q?[REFACTOR/#166]=20=ED=94=BC=EC=BB=A4?= =?UTF-8?q?=EC=88=98=EC=A0=95(=EC=A7=84=ED=96=89=EC=A4=91)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/component/timepicker/OrbitYearMonthPicker.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt index 4548ab8a..721079c2 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt @@ -27,7 +27,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme -import kotlinx.coroutines.delay @Composable fun OrbitYearMonthPicker( @@ -56,8 +55,14 @@ fun OrbitYearMonthPicker( } LaunchedEffect(lunarState.value, yearState.value, monthState.value, dayState.value) { - delay(300) - onValueChange(lunarState.value, yearState.value, monthState.value, dayState.value) + val formattedDate = "${yearState.value}-${monthState.value.toString().padStart(2, '0')}-${dayState.value.toString().padStart(2, '0')}" + val initialFormattedDate = "$initialYear-$initialMonth-$initialDay" + if (formattedDate != initialFormattedDate || lunarState.value != initialLunar) { + Log.d("OrbitYearMonthPicker", "onValueChange 트리거를 왜 자꾸 하는건데: $formattedDate") + onValueChange(lunarState.value, yearState.value, monthState.value, dayState.value) + } else { + Log.d("OrbitYearMonthPicker", "값이 동일하므로 onValueChange 안해야되는데;") + } } Surface( From 75e5c5feed54c5e81ecfae2888940d3af9f2d978 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Fri, 21 Feb 2025 12:34:19 +0900 Subject: [PATCH 052/210] =?UTF-8?q?[REFACTOR/#166]=20=EC=95=88=20=EC=93=B0?= =?UTF-8?q?=EB=8A=94=20=EB=B3=80=EC=88=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/ui/component/timepicker/PickerState.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt index bd8258d8..120e3398 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/PickerState.kt @@ -9,7 +9,6 @@ class PickerState( val lazyListState: LazyListState, var selectedItem: String, var startIndex: Int, - var initialized: Boolean = false, ) @Composable From abfe01ba6c798b87eacee13017a7cced74885e2d Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Fri, 21 Feb 2025 12:44:07 +0900 Subject: [PATCH 053/210] =?UTF-8?q?[FIX/#166]=20=EC=83=9D=EB=85=84?= =?UTF-8?q?=EC=9B=94=EC=9D=BC=20=EC=9E=85=EB=A0=A5=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9D=B4=20=EC=95=84=EB=8B=90=20=EA=B2=BD=EC=9A=B0=20updateBir?= =?UTF-8?q?thDate=20=EC=8B=A4=ED=96=89=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../timepicker/OrbitYearMonthPicker.kt | 37 ++++++++----------- .../onboarding/OnboardingTimeOfBirthScreen.kt | 4 ++ .../yapp/onboarding/OnboardingViewModel.kt | 33 +++++++---------- 3 files changed, 33 insertions(+), 41 deletions(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt index 721079c2..a133d0be 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt @@ -10,8 +10,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Surface import androidx.compose.runtime.Composable @@ -39,39 +37,34 @@ fun OrbitYearMonthPicker( onValueChange: (String, Int, Int, Int) -> Unit, ) { val screenWidth = LocalConfiguration.current.screenWidthDp.dp + val lunarState = remember { mutableStateOf(initialLunar) } - val yearState = remember { mutableStateOf(initialYear.toInt()) } - val monthState = remember { mutableStateOf(initialMonth.toInt()) } + val yearState = remember { mutableIntStateOf(initialYear.toInt()) } + val monthState = remember { mutableIntStateOf(initialMonth.toInt()) } val dayState = remember { mutableIntStateOf(initialDay.toInt()) } val dayItems = remember { mutableStateListOf() } - LaunchedEffect(yearState.value, monthState.value) { - val maxDay = getMaxDaysInMonth(yearState.value, monthState.value) + + LaunchedEffect(yearState.intValue, monthState.intValue) { + val maxDay = getMaxDaysInMonth(yearState.intValue, monthState.intValue) dayItems.clear() dayItems.addAll((1..maxDay).map { it.toString().padStart(2, '0') }) - if (dayState.value > maxDay) { - dayState.value = maxDay + if (dayState.intValue > maxDay) { + dayState.intValue = maxDay } } - LaunchedEffect(lunarState.value, yearState.value, monthState.value, dayState.value) { - val formattedDate = "${yearState.value}-${monthState.value.toString().padStart(2, '0')}-${dayState.value.toString().padStart(2, '0')}" - val initialFormattedDate = "$initialYear-$initialMonth-$initialDay" - if (formattedDate != initialFormattedDate || lunarState.value != initialLunar) { - Log.d("OrbitYearMonthPicker", "onValueChange 트리거를 왜 자꾸 하는건데: $formattedDate") - onValueChange(lunarState.value, yearState.value, monthState.value, dayState.value) - } else { - Log.d("OrbitYearMonthPicker", "값이 동일하므로 onValueChange 안해야되는데;") - } + LaunchedEffect(lunarState.value, yearState.intValue, monthState.intValue, dayState.intValue) { + onValueChange(lunarState.value, yearState.intValue, monthState.intValue, dayState.intValue) } Surface( - modifier = modifier.fillMaxWidth().wrapContentHeight(), + modifier = modifier.fillMaxWidth(), ) { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Bottom, - modifier = Modifier.wrapContentSize().background(OrbitTheme.colors.gray_900), + modifier = Modifier.background(OrbitTheme.colors.gray_900), ) { val lunarItems = listOf("양력", "음력") val yearItems = (1900..2024).map { it.toString() } @@ -114,7 +107,7 @@ fun OrbitYearMonthPicker( modifier = Modifier.width(screenWidth * 0.28f), textModifier = Modifier.padding(8.dp), infiniteScroll = false, - onValueChange = { yearState.value = it.toInt() }, + onValueChange = { yearState.intValue = it.toInt() }, ) OrbitPickerItem( items = monthItems, @@ -124,7 +117,7 @@ fun OrbitYearMonthPicker( modifier = Modifier.width(screenWidth * 0.16f), textModifier = Modifier.padding(8.dp), infiniteScroll = false, - onValueChange = { monthState.value = it.toInt() }, + onValueChange = { monthState.intValue = it.toInt() }, ) OrbitPickerItem( items = dayItems, @@ -134,7 +127,7 @@ fun OrbitYearMonthPicker( modifier = Modifier.width(screenWidth * 0.16f), textModifier = Modifier.padding(8.dp), infiniteScroll = false, - onValueChange = { dayState.value = it.toInt() }, + onValueChange = { dayState.intValue = it.toInt() }, ) } } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt index f08e098e..94c7cbb1 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt @@ -1,5 +1,6 @@ package com.yapp.onboarding +import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -51,6 +52,9 @@ fun OnboardingTimeOfBirthRoute( LaunchedEffect(key1 = Unit) { focusRequester.requestFocus() } + BackHandler { + viewModel.processAction(OnboardingContract.Action.PreviousStep) + } OnboardingTimeOfBirthScreen( state = state, diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt index d3873d9e..6ff4b913 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt @@ -31,6 +31,9 @@ class OnboardingViewModel @Inject constructor( birthType = savedStateHandle["birthType"] ?: "양력", ), ) { + private val currentRoute: String? + get() = OnboardingDestination.routes.getOrNull(currentState.currentStep - 1)?.route + fun processAction(action: OnboardingContract.Action) { when (action) { is OnboardingContract.Action.NextStep -> moveToNextStep() @@ -81,8 +84,6 @@ class OnboardingViewModel @Inject constructor( val nextStep = currentStep + 1 val nextRoute = OnboardingDestination.nextRoute(currentStep) - Log.d("OnboardingViewModel", "🔥 moveToNextStep 호출 - CurrentStep: $currentStep, NextStep: $nextStep") - Log.d("OnboardingViewModel", "🔥 현재 birthDate: ${currentState.birthDate}, birthType: ${currentState.birthType}") savedStateHandle["birthDate"] = currentState.birthDate savedStateHandle["birthType"] = currentState.birthType @@ -186,26 +187,20 @@ class OnboardingViewModel @Inject constructor( } private fun updateBirthDate(lunar: String, year: Int, month: Int, day: Int) { - val formattedDate = "$year-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}" - - Log.d("OnboardingViewModel", "updateBirthDate 호출 - New: $formattedDate, Old: ${currentState.birthDate}") + if (currentRoute != OnboardingDestination.Birthday.route) return - if (currentState.birthDate != formattedDate || currentState.birthType != lunar) { - Log.d("OnboardingViewModel", "BirthDate 변경 감지 - 업데이트 수행") + val formattedDate = "$year-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}" - hapticFeedbackManager.performHapticFeedback(HapticType.LIGHT_TICK) - savedStateHandle["birthDate"] = formattedDate - savedStateHandle["birthType"] = lunar + hapticFeedbackManager.performHapticFeedback(HapticType.LIGHT_TICK) + savedStateHandle["birthDate"] = formattedDate + savedStateHandle["birthType"] = lunar - updateState { - copy( - birthDate = formattedDate, - birthType = lunar, - isBirthDateValid = true, - ) - } - } else { - Log.d("OnboardingViewModel", "BirthDate 변경 없음 - 업데이트 생략") + updateState { + copy( + birthDate = formattedDate, + birthType = lunar, + isBirthDateValid = true, + ) } } From 47d1009b9e09d0826469d6c70a8a471294028ad3 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 15:00:03 +0900 Subject: [PATCH 054/210] =?UTF-8?q?[FEAT/#167]=20=EC=B2=AB=20=EB=B2=88?= =?UTF-8?q?=EC=A7=B8=20=EC=95=8C=EB=9E=8C=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D(=20=EB=91=90=EB=B2=88=EC=A7=B8=20=EB=B0=9C?= =?UTF-8?q?=EA=B2=AC=EC=8B=9C=20=EC=95=84=EC=9D=B4=EB=94=94=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/alarm/receivers/AlarmReceiver.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt index 1afc7652..7b59a530 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt @@ -9,8 +9,13 @@ import android.widget.Toast import com.yapp.alarm.AlarmConstants import com.yapp.alarm.AlarmHelper import com.yapp.alarm.services.AlarmService +import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.launch import java.time.LocalDateTime import javax.inject.Inject @@ -20,6 +25,9 @@ class AlarmReceiver : BroadcastReceiver() { @Inject lateinit var alarmHelper: AlarmHelper + @Inject + lateinit var userPreferences: UserPreferences + override fun onReceive(context: Context?, intent: Intent?) { context ?: return intent ?: return @@ -46,6 +54,12 @@ class AlarmReceiver : BroadcastReceiver() { AlarmConstants.ACTION_ALARM_DISMISSED -> { Log.d("AlarmReceiver", "Alarm Dismissed") + val alarmId = intent.getLongExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, -1L) + if (alarmId != -1L) { + handleFirstAlarmDismissed(context, alarmId) + } else { + Log.e("AlarmReceiver", "알람 ID 수신 실패") + } context.stopService(alarmServiceIntent) sendBroadCastToCloseAlarmInteractionActivity(context) @@ -92,6 +106,19 @@ class AlarmReceiver : BroadcastReceiver() { alarmHelper.scheduleAlarm(updatedAlarm) } + private fun handleFirstAlarmDismissed(context: Context, alarmId: Long) { + CoroutineScope(Dispatchers.IO).launch { + val existingId = userPreferences.firstDismissedAlarmIdFlow.firstOrNull() + if (existingId == null) { + // 첫 번째 알람 해제 기록 + userPreferences.saveFirstDismissedAlarmId(alarmId) + } else if (existingId != alarmId) { + // 두 번째 알람 해제 감지 - 기존 기록 삭제 + userPreferences.clearDismissedAlarmId() + } + } + } + private fun sendBroadCastToCloseAlarmInteractionActivity(context: Context) { Log.d("AlarmReceiver", "Send Broadcast to close Alarm Interaction Activity") val alarmAlertActivityCloseIntent = From 91110ccb070315b55632f6108e51ce49cc33496f Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 15:00:49 +0900 Subject: [PATCH 055/210] =?UTF-8?q?[FEAT/#167]=20=EC=B2=AB=20=EB=B2=88?= =?UTF-8?q?=EC=A7=B8=20=EC=95=8C=EB=9E=8C=20=EC=A0=80=EC=9E=A5=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/datastore/UserPreferences.kt | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt index 9b57e27a..35298556 100644 --- a/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt +++ b/core/datastore/src/main/java/com/yapp/datastore/UserPreferences.kt @@ -1,5 +1,6 @@ package com.yapp.datastore +import android.util.Log import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey @@ -30,6 +31,8 @@ class UserPreferences @Inject constructor( val FORTUNE_IMAGE_ID = intPreferencesKey("fortune_image_id") val FORTUNE_SCORE = intPreferencesKey("fortune_score") val FORTUNE_CHECKED = booleanPreferencesKey("fortune_checked") + val FIRST_DISMISSED_ALARM_ID = longPreferencesKey("first_dismissed_alarm_id") + val DISMISSED_DATE = stringPreferencesKey("dismissed_date") } val userIdFlow: Flow = dataStore.data @@ -77,6 +80,20 @@ class UserPreferences @Inject constructor( } .distinctUntilChanged() + val firstDismissedAlarmIdFlow: Flow = dataStore.data + .catch { emit(emptyPreferences()) } + .map { preferences -> + val savedDate = preferences[Keys.DISMISSED_DATE] + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + + if (savedDate == todayDate) { + preferences[Keys.FIRST_DISMISSED_ALARM_ID] + } else { + null + } + } + .distinctUntilChanged() + suspend fun saveUserId(userId: Long) { dataStore.edit { preferences -> preferences[Keys.USER_ID] = userId @@ -116,12 +133,32 @@ class UserPreferences @Inject constructor( } } + suspend fun saveFirstDismissedAlarmId(alarmId: Long) { + dataStore.edit { preferences -> + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + if (preferences[Keys.FIRST_DISMISSED_ALARM_ID] == null) { + preferences[Keys.FIRST_DISMISSED_ALARM_ID] = alarmId + preferences[Keys.DISMISSED_DATE] = todayDate + Log.d("UserPreferences", "첫 해제된 알람 ID 저장 완료: $alarmId (날짜: $todayDate)") + } else { + Log.d("UserPreferences", "이미 첫 알람 해제 ID가 저장되어 있음)") + } + } + } + suspend fun setOnboardingCompleted() { dataStore.edit { preferences -> preferences[Keys.ONBOARDING_COMPLETED] = true } } + suspend fun clearDismissedAlarmId() { + dataStore.edit { preferences -> + preferences.remove(Keys.FIRST_DISMISSED_ALARM_ID) + preferences.remove(Keys.DISMISSED_DATE) + } + } + suspend fun clearUserData() { dataStore.edit { preferences -> preferences.clear() From 8ed1c12d1c854b56123ae182b59da5c4eea7af99 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 15:01:12 +0900 Subject: [PATCH 056/210] =?UTF-8?q?[ADD/#167]=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EC=8A=A4=ED=86=A0=EC=96=B4=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/alarm-interaction/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/alarm-interaction/build.gradle.kts b/feature/alarm-interaction/build.gradle.kts index c0b81866..49219a6a 100644 --- a/feature/alarm-interaction/build.gradle.kts +++ b/feature/alarm-interaction/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { implementation(projects.core.alarm) implementation(projects.core.media) implementation(projects.domain) + implementation(projects.core.datastore) implementation(libs.orbit.core) implementation(libs.orbit.compose) implementation(libs.orbit.viewmodel) From 00aac0a974b3b8cefb620db2925a1b980c38d318 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 15:01:54 +0900 Subject: [PATCH 057/210] =?UTF-8?q?[FEAT/#167]=20=EB=B3=B4=EC=83=81=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/fortune/FortuneScreen.kt | 4 +++- .../java/com/yapp/fortune/page/FortuneCompletePage.kt | 11 +++++++++-- .../main/java/com/yapp/fortune/page/FortunePager.kt | 2 ++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt index 79929d26..9a31f2e5 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt @@ -46,6 +46,7 @@ fun FortuneRoute( state = state, pagerState = pagerState, onNextStep = { viewModel.onAction(FortuneContract.Action.NextStep) }, + onNavigateToHome = { viewModel.onAction(FortuneContract.Action.NavigateToHome) }, onCloseClick = { viewModel.onAction(FortuneContract.Action.NavigateToHome) }, ) } @@ -55,6 +56,7 @@ fun FortuneScreen( state: FortuneContract.State, pagerState: PagerState, onNextStep: () -> Unit, + onNavigateToHome: () -> Unit, onCloseClick: () -> Unit, ) { val backgroundRes = when (state.currentStep) { @@ -93,7 +95,7 @@ fun FortuneScreen( activeColor = OrbitTheme.colors.white, ) - FortunePager(state, pagerState, onNextStep) + FortunePager(state, pagerState, onNextStep, onNavigateToHome) } } } diff --git a/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt b/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt index 2494c929..2d6d7a79 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt @@ -27,6 +27,7 @@ import com.yapp.ui.utils.paddingForScreenPercentage fun FortuneCompletePage( hasReward: Boolean, onCompleteClick: () -> Unit, + onNavigateToHome: () -> Unit, ) { val message = if (hasReward) { "첫 알람에 잘 일어났네!\n보상으로 행운 부적을 줄게" @@ -80,7 +81,13 @@ fun FortuneCompletePage( OrbitButton( label = if (hasReward) "부적 보러가기" else "완료", modifier = Modifier.padding(horizontal = 20.dp, vertical = 12.dp), - onClick = onCompleteClick, + onClick = { + if (hasReward) { + onCompleteClick() + } else { + onNavigateToHome() + } + }, enabled = true, ) } @@ -90,5 +97,5 @@ fun FortuneCompletePage( @Composable @Preview fun FortuneCompletePagePreview() { - FortuneCompletePage(hasReward = true, onCompleteClick = {}) + FortuneCompletePage(hasReward = true, onCompleteClick = {}, onNavigateToHome = {}) } diff --git a/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt b/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt index c86296d2..08b7cfc5 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/page/FortunePager.kt @@ -16,6 +16,7 @@ fun FortunePager( state: FortuneContract.State, pagerState: PagerState, onNextStep: () -> Unit, + onNavigateToHome: () -> Unit, ) { val coroutineScope = rememberCoroutineScope() HorizontalPager( @@ -53,6 +54,7 @@ fun FortunePager( 5 -> FortuneCompletePage( hasReward = state.hasReward, onCompleteClick = onNextStep, + onNavigateToHome = onNavigateToHome, ) else -> {} } From 8b8360980579605cb3810e9e4cf62c16a9427ace Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 15:02:16 +0900 Subject: [PATCH 058/210] =?UTF-8?q?[FEAT/#167]=20=EB=B3=B4=EC=83=81=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/fortune/FortuneViewModel.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt index 56f13f00..cfd930f5 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt @@ -18,6 +18,8 @@ import kotlinx.coroutines.launch import org.orbitmvi.orbit.syntax.simple.intent import org.orbitmvi.orbit.syntax.simple.postSideEffect import org.orbitmvi.orbit.syntax.simple.reduce +import java.time.LocalDate +import java.time.format.DateTimeFormatter import javax.inject.Inject @HiltViewModel @@ -33,11 +35,12 @@ class FortuneViewModel @Inject constructor( init { viewModelScope.launch { val fortuneId = userPreferences.fortuneIdFlow.firstOrNull() - fortuneId?.let { getFortune(it) } + val firstDismissedAlarmId = userPreferences.firstDismissedAlarmIdFlow.firstOrNull() + val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() + fortuneId?.let { getFortune(it, firstDismissedAlarmId, fortuneDate) } } } - - private fun getFortune(fortuneId: Long) = intent { + private fun getFortune(fortuneId: Long, firstDismissedAlarmId: Long?, fortuneDate: String?) = intent { updateState { copy(isLoading = true) } fortuneRepository.getFortune(fortuneId).onSuccess { fortune -> @@ -45,6 +48,8 @@ class FortuneViewModel @Inject constructor( val imageId = savedImageId ?: getRandomImage() val formattedTitle = fortune.dailyFortuneTitle.replace(",", ",\n").trim() + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + val hasReward = (fortuneDate == todayDate) && (firstDismissedAlarmId != null) updateState { copy( isLoading = false, @@ -53,6 +58,7 @@ class FortuneViewModel @Inject constructor( avgFortuneScore = fortune.avgFortuneScore, fortunePages = fortune.toFortunePages(), fortuneImageId = imageId, + hasReward = hasReward, ) } }.onFailure { error -> From b05c4a5fd2bdf7b7c88dbd42f31393f860eb0925 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 18:24:46 +0900 Subject: [PATCH 059/210] =?UTF-8?q?[REFACTOR/#172]=20=EC=BD=94=EB=94=94?= =?UTF-8?q?=EB=B0=95=EC=8A=A4=20=EC=82=AC=EC=9D=B4=20=EC=97=AC=EB=B0=B1=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt | 2 +- .../src/main/java/com/yapp/fortune/page/content/CodyContent.kt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt index 4ff5b412..ff64e917 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/component/CodyBox.kt @@ -23,7 +23,7 @@ fun CodyBox( clothsNameLabel: String, ) { Column( - modifier = Modifier.width(120.dp), + modifier = Modifier.width(110.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { Icon( diff --git a/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt b/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt index e3336cb7..3f9abb42 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/page/content/CodyContent.kt @@ -35,7 +35,6 @@ fun CodyContent( ) { codyList.chunked(2).forEach { rowItems -> Row( - horizontalArrangement = Arrangement.spacedBy(16.dp), verticalAlignment = Alignment.CenterVertically, ) { rowItems.forEach { item -> From b60130ec8f64c62403259094904f869f9c97e0d3 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 18:25:08 +0900 Subject: [PATCH 060/210] =?UTF-8?q?[REFACTOR/#172]=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=B0=B0=EC=B9=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fortune/component/DetailHoroScopeText.kt | 34 +++++++------------ 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt index dddca249..d5d5cf5c 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/component/DetailHoroScopeText.kt @@ -2,13 +2,10 @@ package com.yapp.fortune.component import androidx.annotation.DrawableRes import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -37,25 +34,18 @@ fun DetailHoroScopeText( .paddingForScreenPercentage(horizontalPercentage = 0.055f), horizontalAlignment = Alignment.CenterHorizontally, ) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - ) { - Image( - painter = painterResource(id = iconRes), - contentDescription = null, - modifier = Modifier - .size(24.dp) - .padding(end = 4.dp), - ) - Text( - text = fortuneTitleText, - style = OrbitTheme.typography.label1SemiBold, - color = color, - textAlign = TextAlign.Start, - ) - } + Image( + painter = painterResource(id = iconRes), + contentDescription = null, + modifier = Modifier.size(24.dp), + ) + Spacer(modifier = Modifier.height(3.dp)) + Text( + text = fortuneTitleText, + style = OrbitTheme.typography.label1SemiBold, + color = color, + textAlign = TextAlign.Start, + ) Spacer(modifier = Modifier.height(8.dp)) Text( text = fortuneSubTitleText, From e1d0807c6804cecb3d6fc9fdcae30b706032f192 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 18:25:45 +0900 Subject: [PATCH 061/210] =?UTF-8?q?[REFACTOR/#172]=20=EB=B3=B4=EC=83=81=20?= =?UTF-8?q?UX=EB=9D=BC=EC=9D=B4=ED=8C=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/fortune/FortuneRewardScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt index 0997bfcd..990d2e80 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt @@ -97,7 +97,7 @@ fun FortuneRewardScreen( .fillMaxWidth() .padding(start = 30.dp) .align(Alignment.Start), - text = "$nickName\n부적에 소원을 적으면\n이루어질거야!", + text = "$nickName\n부적을 가지고 있으면\n행운이 찾아올거야", style = OrbitTheme.typography.H1, color = OrbitTheme.colors.white, ) From ae0c24e8762bd9a76806f3b6d9f6a274647c668e Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 18:26:19 +0900 Subject: [PATCH 062/210] =?UTF-8?q?[ADD/#172]=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=EC=A7=84=EC=9E=85=20=EC=8B=9C=20=EB=A1=9C=EB=94=A9=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/fortune/FortuneScreen.kt | 67 +++++++++++++------ 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt index 9a31f2e5..7aaf3fa6 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable @@ -24,6 +25,7 @@ import com.yapp.designsystem.theme.OrbitTheme import com.yapp.fortune.component.FortuneTopAppBar import com.yapp.fortune.component.SlidingIndicator import com.yapp.fortune.page.FortunePager +import com.yapp.ui.component.lottie.LottieAnimation @Composable fun FortuneRoute( @@ -71,35 +73,56 @@ fun FortuneScreen( .background(Color(0xFF4891F0)) .navigationBarsPadding(), ) { - Image( - painter = painterResource(id = backgroundRes), - contentDescription = null, - contentScale = ContentScale.Crop, - modifier = Modifier.matchParentSize(), - ) - Column( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - FortuneTopAppBar( - titleLabel = "미래에서 온 편지", - onCloseClick = onCloseClick, + if (state.isLoading) { + FortuneLoadingScreen() + } else { + Image( + painter = painterResource(id = backgroundRes), + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier.matchParentSize(), ) - SlidingIndicator( - currentIndex = pagerState.currentPage, - count = 6, - dotHeight = 5.dp, - spacing = 4.dp, - inactiveColor = OrbitTheme.colors.white.copy(0.2f), - activeColor = OrbitTheme.colors.white, - ) + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + FortuneTopAppBar( + titleLabel = "미래에서 온 편지", + onCloseClick = onCloseClick, + ) + + SlidingIndicator( + currentIndex = pagerState.currentPage, + count = 6, + dotHeight = 5.dp, + spacing = 4.dp, + inactiveColor = OrbitTheme.colors.white.copy(0.2f), + activeColor = OrbitTheme.colors.white, + ) - FortunePager(state, pagerState, onNextStep, onNavigateToHome) + FortunePager(state, pagerState, onNextStep, onNavigateToHome) + } } } } +@Composable +fun FortuneLoadingScreen() { + Box( + modifier = Modifier + .fillMaxSize() + .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f)), + contentAlignment = Alignment.Center, + ) { + LottieAnimation( + modifier = Modifier + .size(70.dp), + resId = core.designsystem.R.raw.star_loading, + ) + } +} + @Composable @Preview fun FortuneRoutePreview() { From affce8a7f86273d903e10b84865785ec4be8243d Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 21:03:19 +0900 Subject: [PATCH 063/210] =?UTF-8?q?[REFACTOR/#174]=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/mission/MissionContract.kt | 2 +- .../src/main/java/com/yapp/mission/MissionProgressScreen.kt | 4 ++-- .../src/main/java/com/yapp/mission/MissionViewModel.kt | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt index d246e6ef..70848f1d 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt @@ -8,7 +8,7 @@ sealed class MissionContract { val missionProgress: Int = 0, val isMissionCompleted: Boolean = false, val isFlipped: Boolean = false, - val clickCount: Int = 0, + val shakeCount: Int = 0, val rotationY: Float = 0f, val rotationZ: Float = 0f, val showExitDialog: Boolean = false, diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt index 93b559cb..042328d0 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt @@ -133,7 +133,7 @@ fun MissionProgressScreen( Spacer(modifier = Modifier.heightForScreenPercentage(0.0246f)) MissionProgressBar( - currentProgress = state.clickCount, + currentProgress = state.shakeCount, totalProgress = 10, modifier = Modifier .fillMaxWidth() @@ -150,7 +150,7 @@ fun MissionProgressScreen( ) Spacer(modifier = Modifier.heightForScreenPercentage(0.005f)) Text( - text = state.clickCount.toString(), + text = state.shakeCount.toString(), color = OrbitTheme.colors.white, style = OrbitTheme.typography.displaySemiBold, modifier = Modifier.alpha(if (state.showOverlay) 0f else 1f), diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index b659f00b..e58934d7 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -63,17 +63,17 @@ class MissionViewModel @Inject constructor( if (currentState.showOverlay) updateState { copy(showOverlay = false) } if (currentState.showOverlayText) updateState { copy(showOverlayText = false) } - val currentCount = currentState.clickCount + val currentCount = currentState.shakeCount if (currentCount < 9) { hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS) - updateState { copy(clickCount = currentCount + 1) } + updateState { copy(shakeCount = currentCount + 1) } } else if (currentCount == 9 && !currentState.isFlipped) { hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS) postFortune() updateState { copy( isMissionCompleted = true, - clickCount = 10, + shakeCount = 10, isFlipped = true, ) } From df5fd3c55163ce5258d630ee6123fb7d2fb0680d Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 21:03:34 +0900 Subject: [PATCH 064/210] =?UTF-8?q?[MOD/#174]=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=ED=81=B4=EB=A6=AD=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/mission/component/FlipCard.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt b/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt index 7b88dded..630ba25a 100644 --- a/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt +++ b/feature/mission/src/main/java/com/yapp/mission/component/FlipCard.kt @@ -6,7 +6,6 @@ import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween import androidx.compose.foundation.Image -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.wrapContentSize @@ -50,8 +49,8 @@ fun FlipCard( } } - LaunchedEffect(state.clickCount) { - if (state.clickCount in 1..9) { + LaunchedEffect(state.shakeCount) { + if (state.shakeCount in 1..9) { rotationZ.animateTo( targetValue = -20f, animationSpec = tween(durationMillis = 66, easing = LinearEasing), @@ -76,8 +75,7 @@ fun FlipCard( rotationY = rotationY.value, scaleX = scale.value, scaleY = scale.value, - ) - .clickable { eventDispatcher(MissionContract.Action.ClickCard) }, + ), contentAlignment = Alignment.Center, ) { if (rotationY.value <= 90f) { From 3c5f9c2ad3c0636102884e04d1a78801e2518e4f Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Fri, 21 Feb 2025 21:24:47 +0900 Subject: [PATCH 065/210] [RELEASE] v1.0.0 --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2c391bf4..a724d82f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -9,8 +9,8 @@ android { namespace = "com.yapp.orbit" defaultConfig { - versionCode = 1 - versionName = "0.0.2" + versionCode = 2 + versionName = "1.0.0" targetSdk = 34 } From 14109e83f699b25c0ecf86041ddbefb42314fa0a Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Fri, 21 Feb 2025 22:57:15 +0900 Subject: [PATCH 066/210] =?UTF-8?q?[fix/#178]=20=ED=99=88=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20=EC=8B=9C=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EC=8A=A4=ED=83=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/onboarding/OnboardingViewModel.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt index 6ff4b913..945aaee0 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt @@ -3,6 +3,7 @@ package com.yapp.onboarding import android.util.Log import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope +import com.yapp.common.navigation.destination.HomeDestination import com.yapp.common.navigation.destination.OnboardingDestination import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm @@ -227,7 +228,13 @@ class OnboardingViewModel @Inject constructor( private fun completeOnboarding() { viewModelScope.launch { userPreferences.setOnboardingCompleted() - emitSideEffect(OnboardingContract.SideEffect.OnboardingCompleted) + emitSideEffect( + OnboardingContract.SideEffect.Navigate( + route = HomeDestination.Route.route, + popUpTo = OnboardingDestination.Route.route, + inclusive = true, + ), + ) } } From eab19be6a21da9ee760c54b1c72e1b5b42505d42 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 24 Feb 2025 17:26:50 +0900 Subject: [PATCH 067/210] =?UTF-8?q?[FEAT/#180]=20OrbitButton=EC=97=90=200.?= =?UTF-8?q?5=EC=B4=88=20=EB=94=94=EB=B0=94=EC=9A=B4=EC=8B=B1=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/ui/component/button/OrbitButton.kt | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt b/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt index 04c1a925..668ee8b9 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt @@ -13,7 +13,10 @@ import androidx.compose.material3.ButtonDefaults 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.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape @@ -21,6 +24,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch @Composable fun OrbitButton( @@ -28,6 +33,7 @@ fun OrbitButton( modifier: Modifier = Modifier, onClick: () -> Unit, enabled: Boolean = false, + debounceTime: Long = 500L, height: Dp = 54.dp, containerColor: Color = OrbitTheme.colors.main, contentColor: Color = OrbitTheme.colors.gray_900, @@ -39,6 +45,8 @@ fun OrbitButton( ) { val interactionSource = remember { MutableInteractionSource() } val isPressed = interactionSource.collectIsPressedAsState().value + val coroutineScope = rememberCoroutineScope() + var isClickable by remember { mutableStateOf(true) } val padding by animateDpAsState( targetValue = if (isPressed) 2.dp else 0.dp, @@ -46,8 +54,19 @@ fun OrbitButton( label = "PaddingAnimation", ) + fun handleClick() { + if (isClickable) { + isClickable = false + onClick() + coroutineScope.launch { + delay(debounceTime) + isClickable = true + } + } + } + Button( - onClick = onClick, + onClick = ::handleClick, enabled = enabled, shape = shape, colors = ButtonDefaults.buttonColors( From edca4efcf6b4ee4263bed28e8306042250b76926 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 26 Feb 2025 00:22:47 +0900 Subject: [PATCH 068/210] =?UTF-8?q?[CHORE/#182]=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=EC=A0=90=EC=88=98=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=BA=90?= =?UTF-8?q?=EB=A6=AD=ED=84=B0=20=EC=97=90=EC=85=8B=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/drawable/ic_character_no_alarm.xml | 84 ++++++++++++ .../res/drawable/ic_charcter_no_alarm.xml | 129 ------------------ .../src/main/res/raw/fortune_preload.json | 2 +- .../src/main/java/com/yapp/home/HomeScreen.kt | 2 +- 4 files changed, 86 insertions(+), 131 deletions(-) create mode 100644 core/designsystem/src/main/res/drawable/ic_character_no_alarm.xml delete mode 100644 core/designsystem/src/main/res/drawable/ic_charcter_no_alarm.xml diff --git a/core/designsystem/src/main/res/drawable/ic_character_no_alarm.xml b/core/designsystem/src/main/res/drawable/ic_character_no_alarm.xml new file mode 100644 index 00000000..69255ae7 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_character_no_alarm.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/designsystem/src/main/res/drawable/ic_charcter_no_alarm.xml b/core/designsystem/src/main/res/drawable/ic_charcter_no_alarm.xml deleted file mode 100644 index 4687e813..00000000 --- a/core/designsystem/src/main/res/drawable/ic_charcter_no_alarm.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/designsystem/src/main/res/raw/fortune_preload.json b/core/designsystem/src/main/res/raw/fortune_preload.json index 54154ad5..5a989fc7 100644 --- a/core/designsystem/src/main/res/raw/fortune_preload.json +++ b/core/designsystem/src/main/res/raw/fortune_preload.json @@ -1 +1 @@ -{"ddd":0,"h":550,"w":550,"meta":{"g":"@lottiefiles/toolkit-js 0.57.2-beta.0","tc":"#232323"},"layers":[{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"128","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[61.5,60.5]},"s":{"a":0,"k":[100,100]},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[424,88,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[426,76,0],"t":40},{"s":[424,88,0],"t":81}],"x":"var $bm_rt;\n$bm_rt = transform.position;"},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[10],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"1","ind":1},{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"126","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[34,34.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[159.75,367.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[12],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"2","ind":2},{"ty":2,"sr":1,"st":0,"op":82,"ip":0,"ln":"99","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[32,84]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[157.5,368.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-7],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[3],"t":40},{"s":[-7],"t":82}]},"o":{"a":0,"k":100}},"refId":"3","ind":3},{"ty":2,"sr":1,"st":0,"op":15,"ip":0,"ln":"103","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"4","ind":4},{"ty":2,"sr":1,"st":15,"op":21,"ip":15,"ln":"107","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":5},{"ty":2,"sr":1,"st":21,"op":55,"ip":21,"ln":"114","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"4","ind":6},{"ty":2,"sr":1,"st":49,"op":61,"ip":55,"ln":"131","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":7},{"ty":2,"sr":1,"st":72,"op":82,"ip":61,"ln":"133","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"4","ind":8}],"v":"5.7.0","fr":25,"op":82,"ip":0,"assets":[{"id":"1","e":1,"w":123,"h":121,"p":"data:image/png;base64,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","u":""},{"id":"2","e":1,"w":68,"h":69,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABFCAMAAADEkbAlAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABaUExURUdwTP////3+/v////////////////////////////3+/v39/v////f5+v////////j5+////////////////////////////9Xc5NXc5P///9Xc5O7x9OPo7S4sF6sAAAAadFJOUwAJEN4t6vT7AQQgPNBOF7eCp4xYZZvFcd7Fv+W+XAAAA0BJREFUWMPlmOuSoyAQhQOiKIqigiYxef/X3G6IShLxlv2xVdupmZqaqv7Sp0Hpw+Xyn0UKkY2RpicAkEcIpbQsSwE/lJBjHPh+zC+FYIzlNhgTwIF69gIyAl8vMF3KVuseQutW5sAheyhYA7UAm66axpgawphG9a1kUsotUSMil5gP2VXVdYWNrqvqRl2HYbjKNQrqeBEAAPlFEUUxRJIkcRxFRTW4AMwGotUKCJ3Nh2w+BoCiYQyVBhiECiZbKAIJCMDU+xycPybIcBNriLqyhA+ACw8yXMUCoxT5iMAa7osx+BT6zWBSK4fgIQQo8im3BUbfvBBezjfFV6Q+Ga0yVREn4SIm7HOm5N4Gs4y6wzLuW8H9YmZBKaFMImOzjDHmWuQIyaiQvTnA8Gq5ToWUuW6qKNmLQMrzvStpZsUU8XIdAXLy3pWUiFybLj5SiN8W6joChYTEhMHcb63tCBRyrA6vFOXUYEf2iuFfC3R1alpcmmNifD0IKdkpNfMD7VrS4/oehzw9iLBrs9oE/iskHI8Zgn3tIr53Ubw/PyFnWvIBMf8EBPaa/h2Ce+3UNvGW+C9B8nMQ7m37LQgP/2f4vZK79yo435PH/JK1SzxB+Lk3WxbebOtE7p0Z2fezww+pGXBi2vcUh9XcLj+8T55vJ4bA12NyVM0EEfYQPbhR+Ps56obIV2eT+6HW8ntip9EbHY/i8Cm6QomL2ihJ0nmwWNGzfETzJKqalpWjWRiPQH7gAeZJ3Jk+FySbZhzhjq8DghIQoySjs2vxStnHgToKEJOXZJ7vMzfl7BUECxNDQ3QuvELmeWvf4MeRYbR8Y9gFwjG22DVxWS2mh4aQd7OCgqAte+ZpWFvoh5asnFbGm2RhCq2LjVGWo5Suhn5AHV9+EmZqqOU1mIc4FgFSVAs9JemSZbIUE3QqzrwVYCVBCvQ0W/Zu6Lu0b7u4m2/g4wgRutG+zVnYGlu74qyXtZDJFLEzol1lLELQFXvtTCBgnBVFM/sKsMRVDZZYt86hZ2vGOnOY2Va7AHPeIMGZfLJ15ZA6jDX4fa8UWHz41fcAsISd1w3uqkEIvKiQrxgvLOiBiw/LwTsLQMEHokRAmPAH3uowRR/Tl6YAAAAASUVORK5CYII=","u":""},{"id":"3","e":1,"w":64,"h":168,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACoCAMAAABnoBgDAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABRUExURUdwTI60532v7H6w7X6w7X6w7H6w7X6u632v7ISy6svLyz5/0H2v632v68LHzDx+0MnJy8rKyjt/z8vLy8nJyX+w7cvLyz5/0KK83oyv22GSz9D6oqIAAAAVdFJOUwAQgJ+579skZUcqzZCg8Yyiez3JkLnlnz4AAAJPSURBVGje5ZjrTuswEAYdXzZ26qSFYkJ5/wcFeuBIpXG0zigCif2/07U1n7eKMb+1uhSz89dyNvaNzdFJuSnf0p58uSvR/7gNpQBAJ2W51BNU+ov6FmUvQNQCPAWMFUCmAKcF2ApALULcC6A2KVGT+t0AiYZBbVKoACwNg6Nh8BQgNAyBhqF01OWeAhINQ6QuWwrQmtQValKgJgk1SahJnpo0UpMyNclSQDUMmYbBU4DQMAgNQ6GrRW2S7AaINAyRhiHTMDgaBk/DIBRQaBi0IvT7ARINQ4SrRb0ehZrkqUmemlRNU6Bh0K7HSE2K1KRETaq7bCnA0TB4GgahYQgUUGgYtCaN1KRMTbIUUA9DpmFwFCA0DEpA/X9WoWnSmiT7ASINQ6RhyBTgaBg8DYNQQKBhUK7Hnqq4Akg0DBGuFu16FGqSpyZ5atJITbLUpEhNitSkRE1acdlSgKOrxdM0CQ0DBhQaBqVJIzUpU5MsBayEIVOAo2kSGgYMKDQMSpMCBQhVUahJnpo0UpMyfdQsNWklDIECdOsxURXXAOmnJxD6omxa8JeX/zUNbS/Ke+vzbQ363XT53nst7Uf66Xm5ztqP9KcK4KQFDBXAg4EjDAaO0Bk2wlnfvzzCqQFgHhYAqQWw5MJg2Ajnpv6FEZ7aAPf3ODQCzPm2f2rtN8OETnB3j0M74OYQpw39pv88xDRtG+D9efzovszz/LppgOs1TK/zRx3MVsJl/lfdVsLhE3D8ccDhDwOO9BIfKeDrDL1hI2y+gq9beAQA0x+Pi/1vhq86U19TQfcAAAAASUVORK5CYII=","u":""},{"id":"4","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""},{"id":"5","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""}]} \ No newline at end of file +{"ddd":0,"h":550,"w":550,"meta":{"g":"@lottiefiles/toolkit-js 0.57.2-beta.0","tc":"#172b4c"},"layers":[{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"207","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[210,210]},"s":{"a":0,"k":[130,130,92.857]},"p":{"a":0,"k":[275.5,280.5,0]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"1","ind":1},{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"115","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[61.5,60.5]},"s":{"a":0,"k":[100,100]},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[424,88,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[426,76,0],"t":40},{"s":[424,88,0],"t":81}],"x":"var $bm_rt;\n$bm_rt = transform.position;"},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[10],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"2","ind":2},{"ty":2,"sr":1,"st":0,"op":1503,"ip":0,"ln":"116","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[34,34.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[159.75,367.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[0],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[12],"t":40},{"s":[0],"t":82}]},"o":{"a":0,"k":100}},"refId":"3","ind":3},{"ty":2,"sr":1,"st":0,"op":82,"ip":0,"ln":"117","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[32,84]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[157.5,368.5,0]},"r":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-7],"t":0},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[3],"t":40},{"s":[-7],"t":82}]},"o":{"a":0,"k":100}},"refId":"4","ind":4},{"ty":2,"sr":1,"st":0,"op":15,"ip":0,"ln":"118","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":5},{"ty":2,"sr":1,"st":15,"op":21,"ip":15,"ln":"119","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"6","ind":6},{"ty":2,"sr":1,"st":21,"op":55,"ip":21,"ln":"120","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":7},{"ty":2,"sr":1,"st":49,"op":61,"ip":55,"ln":"121","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"6","ind":8},{"ty":2,"sr":1,"st":72,"op":82,"ip":61,"ln":"122","hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[280,280.5]},"s":{"a":0,"k":[100,100]},"p":{"a":0,"k":[275,275]},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"refId":"5","ind":9}],"v":"5.7.0","fr":25,"op":82,"ip":0,"assets":[{"id":"1","e":1,"w":420,"h":420,"p":"data:image/png;base64,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","u":""},{"id":"2","e":1,"w":123,"h":121,"p":"data:image/png;base64,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","u":""},{"id":"3","e":1,"w":68,"h":69,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABFCAYAAADzT0AXAAAACXBIWXMAACxLAAAsSwGlPZapAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAxeSURBVHgB7VzddhxHEa6eXUm2ZdmysBKsOMaKEweUEw4cLrgkfgLyBrwCHB6AnxeAwxOQJ+CKewceIIfDRQADljC2hWVH/z+70u7Q307Xbm1tVc+sLUguXOfUmZme7p7ur7+q6p3pXqLX8lpeyxQS6CsgZVnKdgShBWdJ16XQ/iBzCCWdo3wpgCQAuLOtdF6kc6kFjYMCEHpRT6OeJe2l9PI8wPm/AJIAYBC4s+2ks+I4k87nUp6ZdBxUQxUA3agnSjtUgTQA51WA+Z8AIkxAAoDOodNz6XjB0bl0nE3aSu0EC9Dp46hHUfej7iU9iHqY0gFOL4LSp5eQNp2jCCCYAQzAxaiXos6LI/SyOJ9P+Tg/M4YBweiDIQAEAOxG3Y66FfUFdP3J1t2zbm+pV/aex7b8LpWZys+cC0OESUgmoOPo8ELUq0qvpHQog8RggB1tGpmP9CFsMsyQnahbRyfdzqPNFz/s9fofiGZttEL45fvvrPyWpvAvrwSIcI4MBDMBHV6MuhT1etSvpfNFGoHBQLCZsImwb+F6uZ3oELMEoDBTtv/2cPP7Z/3eZaeZG5Eiv1iLwDQB5aUAMYBgNmD0r1EFwnLUN6O+QRUgzAxmA/sJZkNL1MmMk23kcAvhCHNyeNzpbzx5/ibVSvjN2p2VH9eBMjUgEQwOhegMOobRZiYwCAzE9XQPQEgfwQAwCEGp+3gaOdhBGN7ZP6Qnz3ZmqFHj6U9Fu/Xxt1ZvrHtZGgMiWIERxegCCLABnf961BvpCF1O99g82CzYFArx/OA2v759ZWQIRYY0H9hQrhdF+54HSqOKEhgYTXaW6CwYsBL17ahvUQUIwIF5MCPmaBIIOevko9ceDYoJ0oONTTo961FjCWH9UtH97urq6s7ErbqyyUQYDIw2zAAA3Ir6DaoAWUnpAApAsH/Q/kA/U4Mj03VeL72MYIT1x1tTgRIruL/27s17RrovghkYZUQIsAIgvBN1lSpQAA78hDSNFk06RfMRTdsi8gdVdgAowNjdP6LtvcPQFJgQ6Ndrd27+ZCzNffI4GIgQYMHtqO8lBTAwE2aFNI2mI24+mmzWWPVogEL39Iye7xyUOxEYaiD9srz34Xtv3+frwmzRaKIF742Rh2+4HfWbUdei3k3XSAdzLqa8VqiU17JjMoySys9l9H2rkzJPOTvTppXlxbB8bYGaSEHhV+PXvvBEC+ZwM+q7Ud+PeocqvwGfgbmH9BW6ofInu75vdc40h0w567XBQJaXrpRQqpNA3/n84dMf8aUHiPQbMBX4CwByO13DTAAWm4imuDwP5EcT/Y5D5td5iSbByQpY8kYDUPr9s5/z+QQgKarw7BPzCbADTpR9BkDi3xuF0XAdTj2GyHKaGbJc6TxDpnmdDtcjKPMX5/KglOH2nx88+ginY4CIyRfYARZgkgUgbqVzpAGMlmr0WCMozxBdRrODVLlg5Cfjmfre8Pk3lhepTuIPwZ/JQlVtFTvgE+AfAMS3o36PKkeK66V0X9N6Wpkm6uhyuXmLV2e59cUebW3vZ5/X3T+9pk0GBcAOOEuYC/wFmMEOVPuMqWya7LDZJOLwtY5iMj37E2Bp8XJtW1sLrY+HgCRzQYfhLDHv4B9qmIoDDJ5w1Y5GzfWwkYZKcHJRKfcM0zRbRRHqfEkrtH6gnSIDAqPj9xgABw62pRreBAwiP7x6PsXyG7r+JqE36OurC5coK2X/Iw8Q/DjjFzqYhSLqFE4Dc1GgSaQJmXRS9WhTy+WdAHRh/gLlJdyWnWSHym+8+Bcrh1hrVKzOBPJt3KNsDjCiSZ+VY6cXlcpoNjTTblFOBoCIcCvffi2kc8kOPeJ1jlXPMTyqy454pkRO+VzInkifv3Qh60c0Q/gFsXy7JSOLZ59arBEKDfJZdXojr/O4piLqLovgtnkgGhB+G6bfeVoPlg/SkmNCqRvp5JHg53xIcMpZEmba+S8vFiD8LYXDbIv8V36atqQa5zGlDgxSea10DZTVlgnQWq0sQcZGn6MMvwWXnxHdB1CeoqTq1/c8R52rx6pT57UceR6JJHLkmQnys4D1s74uqhBNTrKs8tZI6nOLPd6kzDPTRkCw6HmI9eVdo25R2GJJneOV5XKmZ9XrlW0AVh6fwsjFL5ULylN6mlHwANP36xiRu59zzHxNp6dnlBPtVDUzpg2t1v2yJi0n1iRPO1KPwaaf6/XziwLaqjCbDU/U6hprnZNRJzfKYpk3YStr6p1GhmVOutMxROpYRUqs2aTnRJtEJm9+08Qhy3seiMP6e708QwpVyK3IeLg88nlTv2BR2wJA16Wf7+Wx8geYS6d7Sjmx3onKe00Y4oVly/b1hMxquGdaRD779LzDjDydTh6MmHW9UAX7NPqy3qNmDrGO/kSTDtA78nndvKR08lp1Da+PawCJP3PWpa9gMHhRihfy5EjIdE8s/+Dls+4H8k1XMsN73lD2j04oJ/FX/6fWkkepfXGfjHNNTauBnjPNARAyaZZJkXFvTKL/KI+OO5ST+BLkU+1UeaUfrwPtkx8WyWg01+Pd02ZTGxUaPqc06hwrf3jcqWMyfXDn5n0GRC6IxfqtTjpKUHJijRQ1SNOds1gm2SfzWmar2TMss39Yby5YbiV/7TI7UPI4HQGKt7ZAm0Jw0nL5rXy5OolsB+yxbQhOv2b+EcryExylyTBDAIZcBGs5WFJpwUlr4ky9+3UhP5em2VTOzLazz+9FhuAoAQGEvAYUq4P30zkvmdYdzDk/PefIiTdvIXUt62wqw+cvXZ3vFUVR2pnCJx/evfUQ5wNA0lJFDQjWX4Epg6XSUzTGMgcNThP/MN5m26949yZ82my73VlZXtxqt4sxZxL7/sdwYeGnvFxT+xAGBGBg2TSAASh4A88vjTRLyGi85z/0vRwrZOea+KMyU99gSfiVyxefXrow+4ftvaO9w073Wdnvf7b61vLvqXITA9EvkGEeDMiLpAAFH6zwjrVwHuqGOyev7oyXzwJOSx24YDdYjrXxz9rt1vry0sJn8Tvt5/H631T1eZh/6EMSZVD4OBXGovpnVDHlMBXsG53JsUSnBSefZo0117CuKXOfZ99gPfzhc6oAgG5S1S/0tSdXN+t3HowmV/A0Ff6CKlB4XqI7ozspj16D+doDVdehfZNXL+fhacQBjcDYiPqvqP+hivldGh/kcUASUmeiEgDymCqmgDUnNBmGtX/QjWzSeE63nKZVNmSew2XRWQwizB5gPIz6z6hPaMSOM7323fpqA5ag4wAAgCzRaB0qPmDpNerkdNAzG09yUcK674HDzAAYzIx/RP07jdixT8p3sFiAsN3tpcIAYpFGC3P50+YcTYY8Itsp6o4EI2+dfyCRl5xy0kzADADwIOpfqQIF7EDA4F1X9YAgUxRmyXaqBB+/8eGbdzJAsDqAl2SS6KA30qGmQzmfk2MMO08eSICBgABmgBV/oQqUR1SBNDB7b5uI+aET+9UiKGyDqJw3+OhNgQs0+v5rRQcvrNaBkvMVsgyO/P4GHeVggM6DEQCCTQVgDGbeuf147pffWChO70v2JbyHjidmaACoibXvYApMaUY0tm6uMfG4mmsrTf5C57kTnD+CAJwnAIEjBVMAkjV1mJC6TYgchvGwQqTxKwJ4al7eDZOSJiT9SxNQPB9jTfO5DRgwmAimBfB3HFoBBFiBoDCcRzXZqZkFJPmTLo3oigrBDgbjIClAwRpW+Bpe4ax3SxHlHac32+XIwc/mVxToJNiL0QcYj4QCCJj6Do0mX422rdZuU02gMC2Zpic0+hGIEcAWESzf5O1kvLmQ/Yv3nZjPyQBAskFuPJTP3Uqdh+N/LIDAvYNU5myaPbyN9u0KULiBPEpoGJwVbBdrWsEUXqzHkUluL/PWmkhzkGxgNvIAwGnuimeCGZvpyIzYp9HLral3edfZ9ZiIPTS8UwKd5l2YcuMh1rjyLkw2I7kNldnCe2uIJs2CfcRx6iTv04W/gJkAkBfpejfdP6YREFPsORvJVICwqG1nvCERnb+WlFnC+3R5jy6HbwkKC/+xQZfGzQMdBf0Bxm468jnuwZcAOH45Xn4pe//V3l25pR2dX6DJndvSr+hd2zKEdmjktI+SHgo9SGnHNHrF+cp/gsDy0oBIEYzh1Ue8Rk0u4JOTO71zW34gY3Ph0M7//sA68ZnkPP9D5FwAYRGskbu+JVByG7sMyRxVeLQZmJ5I4w9n/AcHL/XvD3XyXwkwA9iyFtg5AAAAAElFTkSuQmCC","u":""},{"id":"4","e":1,"w":64,"h":168,"p":"data:image/png;base64,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","u":""},{"id":"5","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""},{"id":"6","e":1,"w":560,"h":561,"p":"data:image/png;base64,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","u":""}]} \ No newline at end of file diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt index 685ff2ad..3114e877 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt @@ -522,7 +522,7 @@ private fun HomeCharacterAnimation( ) { val (bubbleRes, starRes) = when { !hasActivatedAlarm -> { - Pair(null, core.designsystem.R.drawable.ic_charcter_no_alarm) + Pair(null, core.designsystem.R.drawable.ic_character_no_alarm) } fortuneScore in 0..49 -> { Pair( From d5c02889fd76ec2f5ead74b53e1e196fc24e284f Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 26 Feb 2025 01:48:20 +0900 Subject: [PATCH 069/210] =?UTF-8?q?[UI/#182]=20BottomSheet=20=EC=83=81?= =?UTF-8?q?=EB=8B=A8=20stroke=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/ui/component/OrbitBottomSheet.kt | 82 +++++++++++- .../bottomsheet/AlarmListBottomSheet.kt | 117 ++++++++++-------- 2 files changed, 143 insertions(+), 56 deletions(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt b/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt index 2a926524..c0e70869 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt @@ -1,7 +1,7 @@ package com.yapp.ui.component +import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.shape.RoundedCornerShape @@ -19,9 +19,14 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Rect import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.PathMeasure import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme import kotlinx.coroutines.launch @@ -37,7 +42,9 @@ fun OrbitBottomSheet( onDismissRequest: () -> Unit = {}, shape: Shape = RoundedCornerShape(topStart = 30.dp, topEnd = 30.dp), containerColor: Color = OrbitTheme.colors.gray_800, - content: @Composable ColumnScope.() -> Unit, + strokeColor: Color = OrbitTheme.colors.gray_600, + strokeThickness: Dp = 2.dp, + content: @Composable () -> Unit, ) { val scope = rememberCoroutineScope() if (isSheetOpen) { @@ -54,7 +61,76 @@ fun OrbitBottomSheet( containerColor = containerColor, dragHandle = null, ) { - content() + Box { + content() + BottomSheetTopRoundedStroke( + strokeColor = strokeColor, + strokeThickness = strokeThickness, + ) + } + } + } +} + +@Composable +fun BottomSheetTopRoundedStroke( + modifier: Modifier = Modifier, + strokeColor: Color, + strokeThickness: Dp = 1.dp, + radius: Dp = 30.dp, +) { + Canvas( + modifier = modifier + .fillMaxWidth() + .height(radius + strokeThickness), // Stroke 고려 + ) { + val width = size.width + val height = size.height + val radiusPx = radius.toPx() + val fadeWidth = radiusPx // 양 끝에서 선이 얇아지는 범위 + + val path = Path().apply { + moveTo(0f, height) // 왼쪽 끝 + arcTo( + rect = Rect(0f, 0f, radiusPx * 2, radiusPx * 2), + startAngleDegrees = 180f, + sweepAngleDegrees = 90f, + forceMoveTo = false, + ) + lineTo(width - radiusPx, 0f) + arcTo( + rect = Rect(width - radiusPx * 2, 0f, width, radiusPx * 2), + startAngleDegrees = 270f, + sweepAngleDegrees = 90f, + forceMoveTo = false, + ) + } + + val pathMeasure = PathMeasure().apply { setPath(path, false) } + val totalLength = pathMeasure.length + val segmentCount = 100 + + for (i in 0 until segmentCount) { + val start = i * (totalLength / segmentCount) + val end = (i + 1) * (totalLength / segmentCount) + + val segmentPath = Path() + if (pathMeasure.getSegment(start, end, segmentPath, true)) { + val minThickness = 0.dp.toPx() + val maxThickness = strokeThickness.toPx() + + val thickness = when { + start < fadeWidth -> minThickness + (maxThickness - minThickness) * (start / fadeWidth) + start > totalLength - fadeWidth -> minThickness + (maxThickness - minThickness) * ((totalLength - start) / fadeWidth) + else -> maxThickness + } + + drawPath( + path = segmentPath, + color = strokeColor, + style = Stroke(width = thickness), + ) + } } } } diff --git a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt index fef4ba66..1a91ab86 100644 --- a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt +++ b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt @@ -51,6 +51,7 @@ import com.yapp.alarm.component.AlarmListItem import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.Alarm import com.yapp.home.component.AlarmListDropDownMenu +import com.yapp.ui.component.BottomSheetTopRoundedStroke import com.yapp.ui.component.checkbox.OrbitCheckBox import com.yapp.ui.utils.OnLoadMore import feature.home.R @@ -195,66 +196,76 @@ internal fun AlarmBottomSheetContent( onLoadMore() } - Column( - modifier = modifier - .fillMaxSize() - .background( - color = OrbitTheme.colors.gray_900, - shape = RoundedCornerShape(topStart = cornerRadius, topEnd = cornerRadius), - ), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer(modifier = Modifier.height(topPadding)) - - if (isSelectionMode) { - AlarmSelectionTopBar( - checked = isAllSelected, - onClickCheckAll = onClickCheckAll, - onClickClose = onClickClose, - ) - } else { - AlarmListTopBar( - menuExpanded = menuExpanded, - onClickAdd = onClickAdd, - onClickMore = onClickMore, - onDismissRequest = onDismissRequest, - onClickEdit = onClickEdit, - ) - } - - LazyColumn( - state = listState, + Box { + Column( + modifier = modifier + .fillMaxSize() + .background( + color = OrbitTheme.colors.gray_900, + shape = RoundedCornerShape(topStart = cornerRadius, topEnd = cornerRadius), + ), + horizontalAlignment = Alignment.CenterHorizontally, ) { - itemsIndexed(alarms) { index, alarm -> - AlarmListItem( - id = alarm.id, - repeatDays = alarm.repeatDays, - isHolidayAlarmOff = alarm.isHolidayAlarmOff, - selectable = isSelectionMode, - selected = selectedAlarmIds.contains(alarm.id), - onClick = onClickAlarm, - onToggleSelect = onToggleSelect, - isAm = alarm.isAm, - hour = alarm.hour, - minute = alarm.minute, - isActive = alarm.isAlarmActive, - onToggleActive = onToggleActive, + Spacer(modifier = Modifier.height(topPadding)) + + if (isSelectionMode) { + AlarmSelectionTopBar( + checked = isAllSelected, + onClickCheckAll = onClickCheckAll, + onClickClose = onClickClose, ) - if (index != alarms.size - 1) { - Spacer( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(OrbitTheme.colors.gray_800) - .padding(horizontal = 24.dp), + } else { + AlarmListTopBar( + menuExpanded = menuExpanded, + onClickAdd = onClickAdd, + onClickMore = onClickMore, + onDismissRequest = onDismissRequest, + onClickEdit = onClickEdit, + ) + } + + LazyColumn( + state = listState, + ) { + itemsIndexed(alarms) { index, alarm -> + AlarmListItem( + id = alarm.id, + repeatDays = alarm.repeatDays, + isHolidayAlarmOff = alarm.isHolidayAlarmOff, + selectable = isSelectionMode, + selected = selectedAlarmIds.contains(alarm.id), + onClick = onClickAlarm, + onToggleSelect = onToggleSelect, + isAm = alarm.isAm, + hour = alarm.hour, + minute = alarm.minute, + isActive = alarm.isAlarmActive, + onToggleActive = onToggleActive, ) + if (index != alarms.size - 1) { + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(1.dp) + .background(OrbitTheme.colors.gray_800) + .padding(horizontal = 24.dp), + ) + } } - } - item { - Spacer(modifier = Modifier.height(104.dp)) + item { + Spacer(modifier = Modifier.height(104.dp)) + } } } + + if (cornerRadius > 0.dp) { + BottomSheetTopRoundedStroke( + strokeColor = OrbitTheme.colors.gray_600, + strokeThickness = 1.dp, + radius = cornerRadius, + ) + } } } From a513ab5bc16ecc422ca75f69806c2f20b56e7328 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 26 Feb 2025 21:10:13 +0900 Subject: [PATCH 070/210] =?UTF-8?q?[UI/#182]=20BottomSheet=20=EC=83=81?= =?UTF-8?q?=EB=8B=A8=20stroke=20=EC=83=89=EC=83=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/ui/component/OrbitBottomSheet.kt | 4 +- .../bottomsheet/AlarmListBottomSheet.kt | 117 ++++++++---------- 2 files changed, 55 insertions(+), 66 deletions(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt b/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt index c0e70869..baf7e50b 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/OrbitBottomSheet.kt @@ -42,8 +42,8 @@ fun OrbitBottomSheet( onDismissRequest: () -> Unit = {}, shape: Shape = RoundedCornerShape(topStart = 30.dp, topEnd = 30.dp), containerColor: Color = OrbitTheme.colors.gray_800, - strokeColor: Color = OrbitTheme.colors.gray_600, - strokeThickness: Dp = 2.dp, + strokeColor: Color = OrbitTheme.colors.gray_700, + strokeThickness: Dp = 1.dp, content: @Composable () -> Unit, ) { val scope = rememberCoroutineScope() diff --git a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt index 1a91ab86..fef4ba66 100644 --- a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt +++ b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt @@ -51,7 +51,6 @@ import com.yapp.alarm.component.AlarmListItem import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.Alarm import com.yapp.home.component.AlarmListDropDownMenu -import com.yapp.ui.component.BottomSheetTopRoundedStroke import com.yapp.ui.component.checkbox.OrbitCheckBox import com.yapp.ui.utils.OnLoadMore import feature.home.R @@ -196,75 +195,65 @@ internal fun AlarmBottomSheetContent( onLoadMore() } - Box { - Column( - modifier = modifier - .fillMaxSize() - .background( - color = OrbitTheme.colors.gray_900, - shape = RoundedCornerShape(topStart = cornerRadius, topEnd = cornerRadius), - ), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer(modifier = Modifier.height(topPadding)) + Column( + modifier = modifier + .fillMaxSize() + .background( + color = OrbitTheme.colors.gray_900, + shape = RoundedCornerShape(topStart = cornerRadius, topEnd = cornerRadius), + ), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Spacer(modifier = Modifier.height(topPadding)) - if (isSelectionMode) { - AlarmSelectionTopBar( - checked = isAllSelected, - onClickCheckAll = onClickCheckAll, - onClickClose = onClickClose, - ) - } else { - AlarmListTopBar( - menuExpanded = menuExpanded, - onClickAdd = onClickAdd, - onClickMore = onClickMore, - onDismissRequest = onDismissRequest, - onClickEdit = onClickEdit, - ) - } + if (isSelectionMode) { + AlarmSelectionTopBar( + checked = isAllSelected, + onClickCheckAll = onClickCheckAll, + onClickClose = onClickClose, + ) + } else { + AlarmListTopBar( + menuExpanded = menuExpanded, + onClickAdd = onClickAdd, + onClickMore = onClickMore, + onDismissRequest = onDismissRequest, + onClickEdit = onClickEdit, + ) + } - LazyColumn( - state = listState, - ) { - itemsIndexed(alarms) { index, alarm -> - AlarmListItem( - id = alarm.id, - repeatDays = alarm.repeatDays, - isHolidayAlarmOff = alarm.isHolidayAlarmOff, - selectable = isSelectionMode, - selected = selectedAlarmIds.contains(alarm.id), - onClick = onClickAlarm, - onToggleSelect = onToggleSelect, - isAm = alarm.isAm, - hour = alarm.hour, - minute = alarm.minute, - isActive = alarm.isAlarmActive, - onToggleActive = onToggleActive, + LazyColumn( + state = listState, + ) { + itemsIndexed(alarms) { index, alarm -> + AlarmListItem( + id = alarm.id, + repeatDays = alarm.repeatDays, + isHolidayAlarmOff = alarm.isHolidayAlarmOff, + selectable = isSelectionMode, + selected = selectedAlarmIds.contains(alarm.id), + onClick = onClickAlarm, + onToggleSelect = onToggleSelect, + isAm = alarm.isAm, + hour = alarm.hour, + minute = alarm.minute, + isActive = alarm.isAlarmActive, + onToggleActive = onToggleActive, + ) + if (index != alarms.size - 1) { + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(1.dp) + .background(OrbitTheme.colors.gray_800) + .padding(horizontal = 24.dp), ) - if (index != alarms.size - 1) { - Spacer( - modifier = Modifier - .fillMaxWidth() - .height(1.dp) - .background(OrbitTheme.colors.gray_800) - .padding(horizontal = 24.dp), - ) - } - } - - item { - Spacer(modifier = Modifier.height(104.dp)) } } - } - if (cornerRadius > 0.dp) { - BottomSheetTopRoundedStroke( - strokeColor = OrbitTheme.colors.gray_600, - strokeThickness = 1.dp, - radius = cornerRadius, - ) + item { + Spacer(modifier = Modifier.height(104.dp)) + } } } } From 330f6673245be26b9436a2d78da6543778bfef08 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 26 Feb 2025 21:19:36 +0900 Subject: [PATCH 071/210] =?UTF-8?q?[UI/#182]=20=ED=99=95=EC=9D=B8=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=9A=B4=EC=84=B8=20=EB=B9=A8?= =?UTF-8?q?=EA=B0=84=20=EC=A0=90=20=ED=91=9C=EC=8B=9C=20=EC=9C=84=EC=B9=98?= =?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 --- .../src/main/java/com/yapp/home/HomeScreen.kt | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt index 3114e877..fea7bd46 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt @@ -399,9 +399,7 @@ private fun HomeTopBar( Spacer(modifier = Modifier.weight(1f)) Box { - Box( - contentAlignment = Alignment.BottomEnd, - ) { + Box(contentAlignment = Alignment.BottomEnd) { Box( modifier = Modifier .size(32.dp) @@ -421,14 +419,14 @@ private fun HomeTopBar( if (hasNewFortune) { Spacer( modifier = Modifier + .padding( + end = 4.dp, + bottom = 6.dp, + ) .size(7.dp) .background( color = OrbitTheme.colors.alert, shape = CircleShape, - ) - .padding( - end = 4.dp, - bottom = 6.dp, ), ) } @@ -814,3 +812,16 @@ fun HomeScreenPreview() { ) } } + +@Preview +@Composable +fun HomeTopBarPreview() { + OrbitTheme { + HomeTopBar( + onSettingClick = {}, + onMailClick = {}, + hasNewFortune = true, + isShowTooltip = true, + ) + } +} From 7d61401cb279cc58c78aac5af18b2db578b9ee96 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 26 Feb 2025 21:39:24 +0900 Subject: [PATCH 072/210] =?UTF-8?q?[UI/#182]=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=95=84=EC=9D=B4=ED=85=9C=20div?= =?UTF-8?q?ider=20=ED=8C=A8=EB=94=A9=20=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/home/component/bottomsheet/AlarmListBottomSheet.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt index fef4ba66..5f167cf0 100644 --- a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt +++ b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt @@ -243,10 +243,10 @@ internal fun AlarmBottomSheetContent( if (index != alarms.size - 1) { Spacer( modifier = Modifier + .padding(horizontal = 24.dp) .fillMaxWidth() .height(1.dp) - .background(OrbitTheme.colors.gray_800) - .padding(horizontal = 24.dp), + .background(OrbitTheme.colors.gray_800), ) } } From d55d2c372a310612a7d6969738e54d1a55a0dbf1 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 26 Feb 2025 21:48:00 +0900 Subject: [PATCH 073/210] =?UTF-8?q?[UI/#182]=20=EB=82=A8=EC=9D=80=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=EC=9D=B4=201=EB=B6=84=20=EB=AF=B8=EB=A7=8C?= =?UTF-8?q?=EC=9D=B4=EB=A9=B4=20"=EA=B3=A7=20=EC=9A=B8=EB=A0=A4=EC=9A=94"?= =?UTF-8?q?=20=EB=A1=9C=20=EB=AC=B8=EA=B5=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt index c1ecb0f1..c40ca593 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt @@ -480,6 +480,7 @@ class AlarmAddEditViewModel @Inject constructor( return when { days > 0 -> "${days}일 ${hours}시간 후에 울려요" hours > 0 -> "${hours}시간 ${minutes}분 후에 울려요" + minutes == 0L -> "곧 울려요" else -> "${minutes}분 후에 울려요" } } From 100d9d6fee9da776ee6f9e4a3683f95aa0266378 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 27 Feb 2025 17:28:17 +0900 Subject: [PATCH 074/210] =?UTF-8?q?[FEAT/#182]=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=8B=9C=20=EC=B4=88=EA=B8=B0=EA=B0=92=20?= =?UTF-8?q?=ED=98=84=EC=9E=AC=20=EC=8B=9C=EA=B0=84=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/alarm/addedit/AlarmAddEditViewModel.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt index c40ca593..6c44844e 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt @@ -20,6 +20,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import feature.home.R import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch +import java.time.LocalTime import javax.inject.Inject @HiltViewModel @@ -57,9 +58,23 @@ class AlarmAddEditViewModel @Inject constructor( alarmUseCase.initializeSoundPlayer(defaultSound.uri) + val now = LocalTime.now() + val initialAmPm = if (now.hour < 12) "오전" else "오후" + val initialHour = if (now.hour == 0 || now.hour == 12) 12 else now.hour % 12 + val initialMinute = now.minute + updateState { copy( initialLoading = false, + timeState = timeState.copy( + initialAmPm = initialAmPm, + initialHour = "$initialHour", + initialMinute = initialMinute.toString().padStart(2, '0'), + currentAmPm = initialAmPm, + currentHour = initialHour, + currentMinute = initialMinute, + alarmMessage = getAlarmMessage(initialAmPm, initialHour, initialMinute, emptySet()), + ), soundState = soundState.copy(sounds = sounds, soundIndex = defaultSoundIndex), ) } From 8c7d3158f8831d96dfb49e151c8babbe004524c0 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 27 Feb 2025 22:06:57 +0900 Subject: [PATCH 075/210] =?UTF-8?q?[FIX/#184]=20=EC=8A=A4=EB=82=B5?= =?UTF-8?q?=EB=B0=94=20=ED=91=9C=EC=8B=9C=20=EC=A4=91=20=EC=A6=89=EA=B0=81?= =?UTF-8?q?=EC=A0=81=EC=9D=B8=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=B4=20collectLatest=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt | 3 ++- feature/home/src/main/java/com/yapp/home/HomeScreen.kt | 3 ++- .../src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt | 3 ++- .../src/main/java/com/yapp/setting/SettingNavGraph.kt | 5 +++-- feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt | 3 ++- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt index 5fb76de2..5b7ba527 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt @@ -68,6 +68,7 @@ import com.yapp.ui.component.snackbar.showCustomSnackBar import com.yapp.ui.component.switch.OrbitSwitch import com.yapp.ui.component.timepicker.OrbitPicker import feature.home.R +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @Composable @@ -82,7 +83,7 @@ fun AlarmAddEditRoute( val coroutineScope = rememberCoroutineScope() LaunchedEffect(sideEffect) { - sideEffect.collect { effect -> + sideEffect.collectLatest { effect -> when (effect) { is AlarmAddEditContract.SideEffect.NavigateBack -> { navigator.navigateBack() diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt index fea7bd46..8754c695 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt @@ -68,6 +68,7 @@ import com.yapp.ui.component.tooltip.OrbitToolTip import com.yapp.ui.utils.heightForScreenPercentage import com.yapp.ui.utils.toPx import feature.home.R +import kotlinx.coroutines.flow.collectLatest @Composable fun HomeRoute( @@ -111,7 +112,7 @@ fun HomeRoute( } LaunchedEffect(sideEffect) { - sideEffect.collect { effect -> + sideEffect.collectLatest { effect -> when (effect) { is HomeContract.SideEffect.NavigateBack -> { navigator.navigateBack() diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt index e2c9ac62..9f14e243 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt @@ -9,6 +9,7 @@ import com.yapp.common.navigation.OrbitNavigator import com.yapp.common.navigation.destination.OnboardingDestination import com.yapp.common.navigation.destination.WebViewDestination import com.yapp.common.navigation.extensions.sharedHiltViewModel +import kotlinx.coroutines.flow.collectLatest fun NavGraphBuilder.onboardingNavGraph( navigator: OrbitNavigator, @@ -23,7 +24,7 @@ fun NavGraphBuilder.onboardingNavGraph( val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> handleSideEffect(sideEffect, navigator, viewModel, onFinishOnboarding) } } diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt b/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt index 98f597f3..dfaf89ea 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt @@ -14,6 +14,7 @@ import com.yapp.common.navigation.destination.SettingDestination import com.yapp.common.navigation.destination.WebViewDestination import com.yapp.common.navigation.extensions.sharedHiltViewModel import com.yapp.ui.base.BaseViewModel +import kotlinx.coroutines.flow.collectLatest fun NavGraphBuilder.settingNavGraph( navigator: OrbitNavigator, @@ -30,7 +31,7 @@ fun NavGraphBuilder.settingNavGraph( backStackEntry.sharedHiltViewModel(navigator.navController) LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> handleSettingSideEffect(sideEffect, navigator, viewModel) } } @@ -98,7 +99,7 @@ fun NavGraphBuilder.settingNavGraph( backStackEntry.sharedHiltViewModel(navigator.navController) LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> handleSettingSideEffect(sideEffect, navigator, viewModel) } } diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt index 78ade0cd..152edd15 100644 --- a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt +++ b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt @@ -22,6 +22,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.common.navigation.OrbitNavigator import com.yapp.common.navigation.destination.SplashDestination import com.yapp.designsystem.theme.OrbitTheme +import kotlinx.coroutines.flow.collectLatest @Composable fun SplashRoute( @@ -32,7 +33,7 @@ fun SplashRoute( val sideEffect = viewModel.container.sideEffectFlow LaunchedEffect(sideEffect) { - sideEffect.collect { effect -> + sideEffect.collectLatest { effect -> when (effect) { is SplashContract.SideEffect.Navigate -> { navigator.navigateTo( From 363b22c9d21801630ac1b33784f3163fe6d20a05 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 27 Feb 2025 22:09:23 +0900 Subject: [PATCH 076/210] =?UTF-8?q?[UI/#184]=20OrbitButton=20=EB=94=94?= =?UTF-8?q?=EB=B0=94=EC=9A=B4=EC=8B=B1=20=EC=8B=9C=EA=B0=84=20=EB=8F=99?= =?UTF-8?q?=EC=95=88=20=EB=B9=84=ED=99=9C=EC=84=B1=ED=99=94=20=EC=83=89?= =?UTF-8?q?=EC=83=81=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/ui/component/button/OrbitButton.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt b/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt index 668ee8b9..b1c97a1d 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/button/OrbitButton.kt @@ -67,7 +67,7 @@ fun OrbitButton( Button( onClick = ::handleClick, - enabled = enabled, + enabled = enabled && isClickable, shape = shape, colors = ButtonDefaults.buttonColors( containerColor = if (isPressed) pressedContainerColor else containerColor, From e87dab49b0edc7066ca7d95fb4b4073c1f854849 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Fri, 28 Feb 2025 01:39:56 +0900 Subject: [PATCH 077/210] =?UTF-8?q?[UI/#184]=20AlarmListItem=20=EC=9A=B0?= =?UTF-8?q?=20->=20=EC=A2=8C=20=EC=8A=A4=EC=99=80=EC=9D=B4=ED=94=84=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/drawable/ic_trash.xml | 10 + .../com/yapp/alarm/component/AlarmListItem.kt | 207 +++++++++--------- 2 files changed, 116 insertions(+), 101 deletions(-) create mode 100644 core/designsystem/src/main/res/drawable/ic_trash.xml diff --git a/core/designsystem/src/main/res/drawable/ic_trash.xml b/core/designsystem/src/main/res/drawable/ic_trash.xml new file mode 100644 index 00000000..541852eb --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_trash.xml @@ -0,0 +1,10 @@ + + + diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt index d12cb377..1d5765e3 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt @@ -4,9 +4,11 @@ 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.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset @@ -18,18 +20,26 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.LocalRippleConfiguration import androidx.compose.material3.RippleConfiguration +import androidx.compose.material3.SwipeToDismissBox +import androidx.compose.material3.SwipeToDismissBoxValue import androidx.compose.material3.Text +import androidx.compose.material3.rememberSwipeToDismissBoxState import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf 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.graphics.Color +import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.AlarmDay @@ -47,10 +57,12 @@ internal fun AlarmListItem( id: Long, repeatDays: Int, isHolidayAlarmOff: Boolean, + swipeable: Boolean = true, selectable: Boolean = false, selected: Boolean = false, onClick: (Long) -> Unit, onToggleSelect: (Long) -> Unit, + onSwipe: (Long) -> Unit, isAm: Boolean, hour: Int, minute: Int, @@ -59,6 +71,25 @@ internal fun AlarmListItem( ) { val interactionSource = remember { MutableInteractionSource() } + var width by remember { mutableIntStateOf(0) } + + val dismissState = rememberSwipeToDismissBoxState( + confirmValueChange = { + return@rememberSwipeToDismissBoxState it == SwipeToDismissBoxValue.EndToStart + }, + positionalThreshold = { + width * 0.6f + }, + ) + + if (dismissState.currentValue != SwipeToDismissBoxValue.Settled) { + LaunchedEffect(dismissState.currentValue) { + if (dismissState.currentValue == SwipeToDismissBoxValue.EndToStart) { + onSwipe(id) + } + } + } + CompositionLocalProvider( LocalRippleConfiguration provides RippleConfiguration( rippleAlpha = RippleAlpha( @@ -69,50 +100,82 @@ internal fun AlarmListItem( ), ), ) { - Row( - modifier = modifier - .fillMaxWidth() - .background( - if (selected) OrbitTheme.colors.gray_800 else OrbitTheme.colors.gray_900, - ) - .clickable( - interactionSource = interactionSource, - indication = ripple( - color = OrbitTheme.colors.gray_800, - ), + SwipeToDismissBox( + state = dismissState, + enableDismissFromStartToEnd = false, + enableDismissFromEndToStart = swipeable, + gesturesEnabled = swipeable, + backgroundContent = { + Box( + modifier = Modifier + .fillMaxSize() + .background(OrbitTheme.colors.gray_500) + .onGloballyPositioned { width = it.size.width }, + contentAlignment = Alignment.CenterStart, ) { - if (selectable) { - onToggleSelect(id) - } else { - onClick(id) - } + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_trash), + contentDescription = "Delete", + tint = Color.White, + modifier = Modifier + .size(24.dp) + .offset { + val offsetX = width * (1 - dismissState.progress * 0.5f) - 12.dp.toPx() + + IntOffset( + x = offsetX.toInt(), + y = 0, + ) + }, + ) } - .padding(horizontal = 24.dp, vertical = 20.dp), - verticalAlignment = Alignment.CenterVertically, + }, ) { - if (selectable) { - OrbitCheckBox( - checked = selected, - onCheckedChange = { onToggleSelect(id) }, - ) - Spacer(modifier = Modifier.width(26.dp)) - } + Row( + modifier = modifier + .fillMaxWidth() + .background( + if (selected) OrbitTheme.colors.gray_800 else OrbitTheme.colors.gray_900, + ) + .clickable( + interactionSource = interactionSource, + indication = ripple( + color = OrbitTheme.colors.gray_800, + ), + ) { + if (selectable) { + onToggleSelect(id) + } else { + onClick(id) + } + } + .padding(horizontal = 24.dp, vertical = 20.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + if (selectable) { + OrbitCheckBox( + checked = selected, + onCheckedChange = { onToggleSelect(id) }, + ) + Spacer(modifier = Modifier.width(26.dp)) + } - AlarmListItemContent( - repeatDays = repeatDays, - isActive = isActive, - isHolidayAlarmOff = isHolidayAlarmOff, - isAm = isAm, - hour = hour, - minute = minute, - ) + AlarmListItemContent( + repeatDays = repeatDays, + isActive = isActive, + isHolidayAlarmOff = isHolidayAlarmOff, + isAm = isAm, + hour = hour, + minute = minute, + ) - if (!selectable) { - Spacer(modifier = Modifier.weight(1f)) - OrbitSwitch( - isChecked = isActive, - ) { - onToggleActive(id) + if (!selectable) { + Spacer(modifier = Modifier.weight(1f)) + OrbitSwitch( + isChecked = isActive, + ) { + onToggleActive(id) + } } } } @@ -251,6 +314,7 @@ private fun AlarmListItemPreview() { repeatDays = selectedDays, isHolidayAlarmOff = true, selectable = true, + swipeable = false, selected = selected, isAm = true, hour = 6, @@ -263,6 +327,7 @@ private fun AlarmListItemPreview() { onToggleSelect = { selected = !selected }, + onSwipe = { }, ) Spacer( modifier = Modifier @@ -277,6 +342,7 @@ private fun AlarmListItemPreview() { isHolidayAlarmOff = false, selectable = false, selected = false, + swipeable = true, isAm = true, hour = 6, minute = 0, @@ -286,69 +352,8 @@ private fun AlarmListItemPreview() { isActive = !isActive }, onToggleSelect = { }, + onSwipe = { }, ) } } } - -@Preview -@Composable -private fun AlarmListItemContentPreview() { - OrbitTheme { - Column { - Row( - verticalAlignment = Alignment.CenterVertically, - ) { - Text( - text = "오전", - style = OrbitTheme.typography.title2Medium, - color = OrbitTheme.colors.white, - ) - - Spacer(modifier = Modifier.width(6.dp)) - - Text( - text = "6:00", - style = OrbitTheme.typography.title2Medium, - color = OrbitTheme.colors.white, - ) - } - Row( - verticalAlignment = Alignment.CenterVertically, - ) { - Text( - text = "오전", - style = OrbitTheme.typography.title2Medium, - color = OrbitTheme.colors.white, - ) - - Spacer(modifier = Modifier.width(6.dp)) - - Text( - text = "6", - style = OrbitTheme.typography.title2Medium, - color = OrbitTheme.colors.white, - ) - - Spacer(modifier = Modifier.width(3.dp)) - - Text( - modifier = Modifier.offset( - y = (-2).dp, - ), - text = ":", - style = OrbitTheme.typography.title2Medium, - color = OrbitTheme.colors.white, - ) - - Spacer(modifier = Modifier.width(3.dp)) - - Text( - text = "00", - style = OrbitTheme.typography.title2Medium, - color = OrbitTheme.colors.white, - ) - } - } - } -} From 5e738a8235b0c067fb5384b72d0cff7d0b5bce23 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Fri, 28 Feb 2025 01:41:27 +0900 Subject: [PATCH 078/210] =?UTF-8?q?[FEAT/#184]=20=EC=95=8C=EB=9E=8C=20Swip?= =?UTF-8?q?e=20to=20delete=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/home/HomeContract.kt | 3 +- .../src/main/java/com/yapp/home/HomeScreen.kt | 9 ++---- .../main/java/com/yapp/home/HomeViewModel.kt | 3 +- .../bottomsheet/AlarmListBottomSheet.kt | 31 +++++++------------ 4 files changed, 16 insertions(+), 30 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/home/HomeContract.kt b/feature/home/src/main/java/com/yapp/home/HomeContract.kt index b51aa7a6..7a8c33a0 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeContract.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeContract.kt @@ -36,6 +36,7 @@ sealed class HomeContract { data object ToggleDropdownMenuVisibility : Action() data class ToggleAlarmSelection(val alarmId: Long) : Action() data class ToggleAlarmActivation(val alarmId: Long) : Action() + data class SwipeToDeleteAlarm(val id: Long) : Action() data object ToggleAllAlarmSelection : Action() data object ShowDeleteDialog : Action() data object HideDeleteDialog : Action() @@ -61,8 +62,6 @@ sealed class HomeContract { val inclusive: Boolean = false, ) : SideEffect() - data object NavigateBack : SideEffect() - data class ShowSnackBar( val message: String, val label: String = "", diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt index 8754c695..a09bf8c5 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt @@ -114,9 +114,6 @@ fun HomeRoute( LaunchedEffect(sideEffect) { sideEffect.collectLatest { effect -> when (effect) { - is HomeContract.SideEffect.NavigateBack -> { - navigator.navigateBack() - } is HomeContract.SideEffect.Navigate -> { navigator.navigateTo( route = effect.route, @@ -282,8 +279,6 @@ private fun HomeContent( isSelectionMode = state.isSelectionMode, selectedAlarmIds = state.selectedAlarmIds, halfExpandedHeight = sheetHalfExpandHeight, - isLoading = false, - hasMoreData = false, listState = listState, onClickAlarm = { alarmId -> eventDispatcher(HomeContract.Action.EditAlarm(alarmId)) @@ -312,8 +307,8 @@ private fun HomeContent( onToggleActive = { alarmId -> eventDispatcher(HomeContract.Action.ToggleAlarmActivation(alarmId)) }, - onLoadMore = { - eventDispatcher(HomeContract.Action.LoadMoreAlarms) + onSwipe = { alarmId -> + eventDispatcher(HomeContract.Action.SwipeToDeleteAlarm(alarmId)) }, ) { Box( diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index 3a15f883..1bf8a586 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -47,6 +47,7 @@ class HomeViewModel @Inject constructor( is HomeContract.Action.ToggleAlarmSelection -> toggleAlarmSelection(action.alarmId) HomeContract.Action.ToggleAllAlarmSelection -> toggleAllAlarmSelection() is HomeContract.Action.ToggleAlarmActivation -> toggleAlarmActivation(action.alarmId) + is HomeContract.Action.SwipeToDeleteAlarm -> deleteSingleAlarm(action.id) HomeContract.Action.ShowDeleteDialog -> showDeleteDialog() HomeContract.Action.HideDeleteDialog -> hideDeleteDialog() HomeContract.Action.ShowNoActivatedAlarmDialog -> showNoActivatedAlarmDialog() @@ -244,7 +245,6 @@ class HomeViewModel @Inject constructor( ) } - Log.d("HomeViewModel", "Deleting alarms: $alarmsToDelete") emitSideEffect( HomeContract.SideEffect.ShowSnackBar( message = resourceProvider.getString(R.string.alarm_deleted), @@ -253,6 +253,7 @@ class HomeViewModel @Inject constructor( onDismiss = { viewModelScope.launch { alarmsToDelete.forEach { alarm -> + Log.d("HomeViewModel", "Deleting alarm: ${alarm.id}") alarmUseCase.deleteAlarm(alarm.id) alarmHelper.unScheduleAlarm(alarm) } diff --git a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt index 5f167cf0..0dcb7e03 100644 --- a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt +++ b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt @@ -52,7 +52,6 @@ import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.Alarm import com.yapp.home.component.AlarmListDropDownMenu import com.yapp.ui.component.checkbox.OrbitCheckBox -import com.yapp.ui.utils.OnLoadMore import feature.home.R import kotlinx.coroutines.launch @@ -69,8 +68,6 @@ internal fun AlarmListBottomSheet( isSelectionMode: Boolean, selectedAlarmIds: Set, halfExpandedHeight: Dp = 0.dp, - isLoading: Boolean, - hasMoreData: Boolean, listState: LazyListState, onClickAlarm: (Long) -> Unit, onClickAdd: () -> Unit, @@ -81,7 +78,7 @@ internal fun AlarmListBottomSheet( onDismissRequest: () -> Unit, onToggleSelect: (Long) -> Unit, onToggleActive: (Long) -> Unit, - onLoadMore: () -> Unit, + onSwipe: (Long) -> Unit, content: @Composable () -> Unit, ) { var expandedType by remember { mutableStateOf(BottomSheetExpandState.HALF_EXPANDED) } @@ -102,9 +99,9 @@ internal fun AlarmListBottomSheet( val nestedScrollConnection = remember { object : androidx.compose.ui.input.nestedscroll.NestedScrollConnection { override fun onPreScroll( - available: Offset, // 변경된 부분 + available: Offset, source: androidx.compose.ui.input.nestedscroll.NestedScrollSource, - ): Offset { // 변경된 부분 + ): Offset { if (available.y < 0 && sheetState.currentValue == SheetValue.PartiallyExpanded) { coroutineScope.launch { sheetState.expand() } } @@ -141,9 +138,7 @@ internal fun AlarmListBottomSheet( onDismissRequest = onDismissRequest, onToggleSelect = onToggleSelect, onToggleActive = onToggleActive, - isLoading = isLoading, - hasMoreData = hasMoreData, - onLoadMore = onLoadMore, + onSwipe = onSwipe, ) }, sheetShadowElevation = 0.dp, @@ -178,23 +173,14 @@ internal fun AlarmBottomSheetContent( onDismissRequest: () -> Unit, onToggleSelect: (Long) -> Unit, onToggleActive: (Long) -> Unit, + onSwipe: (Long) -> Unit, expandedType: BottomSheetExpandState, - isLoading: Boolean, - hasMoreData: Boolean, - onLoadMore: () -> Unit, ) { val statusBarHeight = WindowInsets.statusBars.asPaddingValues().calculateTopPadding() val cornerRadius = if (expandedType == BottomSheetExpandState.HALF_EXPANDED) 16.dp else 0.dp val topPadding = if (expandedType == BottomSheetExpandState.HALF_EXPANDED) 14.dp else 14.dp + statusBarHeight - listState.OnLoadMore( - hasMoreData = hasMoreData, - isLoading = isLoading, - ) { - onLoadMore() - } - Column( modifier = modifier .fillMaxSize() @@ -225,11 +211,15 @@ internal fun AlarmBottomSheetContent( LazyColumn( state = listState, ) { - itemsIndexed(alarms) { index, alarm -> + itemsIndexed( + items = alarms, + key = { _, alarm -> alarm.id }, + ) { index, alarm -> AlarmListItem( id = alarm.id, repeatDays = alarm.repeatDays, isHolidayAlarmOff = alarm.isHolidayAlarmOff, + swipeable = !isSelectionMode, selectable = isSelectionMode, selected = selectedAlarmIds.contains(alarm.id), onClick = onClickAlarm, @@ -239,6 +229,7 @@ internal fun AlarmBottomSheetContent( minute = alarm.minute, isActive = alarm.isAlarmActive, onToggleActive = onToggleActive, + onSwipe = onSwipe, ) if (index != alarms.size - 1) { Spacer( From d423ec29d6b8e655ea685da57628262537348474 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sat, 1 Mar 2025 15:20:36 +0900 Subject: [PATCH 079/210] =?UTF-8?q?[FIX/#184]=20=EB=B0=98=EB=B3=B5=20?= =?UTF-8?q?=EC=95=8C=EB=9E=8C=EC=97=90=EC=84=9C=20=EC=98=A4=EB=8A=98=20?= =?UTF-8?q?=EB=82=A0=EC=A7=9C=EB=A5=BC=20=EA=B3=A0=EB=A0=A4=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt index 6c44844e..e6089abc 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt @@ -521,6 +521,11 @@ class AlarmAddEditViewModel @Inject constructor( val currentDayOfWeek = now.dayOfWeek.value val selectedDaysOfWeek = selectedDays.map { it.toDayOfWeek().value }.sorted() + + if (selectedDaysOfWeek.contains(currentDayOfWeek) && now.toLocalTime().isBefore(alarmTimeToday.toLocalTime())) { + return alarmTimeToday + } + val nextDay = selectedDaysOfWeek.firstOrNull { it > currentDayOfWeek } ?: selectedDaysOfWeek.first() val daysToAdd = if (nextDay > currentDayOfWeek) { @@ -528,6 +533,7 @@ class AlarmAddEditViewModel @Inject constructor( } else { 7 - (currentDayOfWeek - nextDay) } + val nextAlarmDate = now.toLocalDate().plusDays(daysToAdd.toLong()) return nextAlarmDate.atTime(alarmTimeToday.toLocalTime()) } From ad33eeb8d28563844a047fdb49acdf5b246e07f1 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Sat, 1 Mar 2025 17:57:46 +0900 Subject: [PATCH 080/210] =?UTF-8?q?[refactor/#185]=20Picker=20Day=EA=B0=92?= =?UTF-8?q?=2001=20->=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt index a133d0be..4bb7f0c8 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt @@ -33,7 +33,7 @@ fun OrbitYearMonthPicker( initialLunar: String = "양력", initialYear: String = "2000", initialMonth: String = "1", - initialDay: String = "01", + initialDay: String = "1", onValueChange: (String, Int, Int, Int) -> Unit, ) { val screenWidth = LocalConfiguration.current.screenWidthDp.dp @@ -47,7 +47,7 @@ fun OrbitYearMonthPicker( LaunchedEffect(yearState.intValue, monthState.intValue) { val maxDay = getMaxDaysInMonth(yearState.intValue, monthState.intValue) dayItems.clear() - dayItems.addAll((1..maxDay).map { it.toString().padStart(2, '0') }) + dayItems.addAll((1..maxDay).map { it.toString() }) if (dayState.intValue > maxDay) { dayState.intValue = maxDay From eb528f513b3aa4028e42625d7de02f1e182b713c Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Sat, 1 Mar 2025 17:59:08 +0900 Subject: [PATCH 081/210] =?UTF-8?q?[ui/#185]=20=EC=8B=9C=EA=B0=84=EB=AA=A8?= =?UTF-8?q?=EB=A6=84=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/UnknownBirthTimeButton.kt | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 feature/onboarding/src/main/java/com/yapp/onboarding/component/UnknownBirthTimeButton.kt diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/component/UnknownBirthTimeButton.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/component/UnknownBirthTimeButton.kt new file mode 100644 index 00000000..dd7ce8c8 --- /dev/null +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/component/UnknownBirthTimeButton.kt @@ -0,0 +1,79 @@ +package com.yapp.onboarding.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsPressedAsState +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +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.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.yapp.designsystem.theme.OrbitTheme +import feature.onboarding.R + +@Composable +fun UnknownBirthTimeButton( + modifier: Modifier = Modifier, + onClick: () -> Unit, + containerColor: Color = Color.Transparent, + contentColor: Color = OrbitTheme.colors.white, + pressedContainerColor: Color = OrbitTheme.colors.gray_800, + pressedContentColor: Color = OrbitTheme.colors.main, + shape: Shape = RoundedCornerShape(12.dp), +) { + val interactionSource = remember { MutableInteractionSource() } + val isPressed by interactionSource.collectIsPressedAsState() + + val currentContainerColor = if (isPressed) pressedContainerColor else containerColor + val currentContentColor = if (isPressed) pressedContentColor else contentColor + + Row( + modifier = modifier + .background(currentContainerColor, shape) + .clickable( + interactionSource = interactionSource, + indication = null, + onClick = onClick, + ) + .padding(horizontal = 24.dp, vertical = 6.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, + ) { + Text( + text = stringResource(id = R.string.onboarding_step4_text_check), + style = OrbitTheme.typography.body1Medium, + color = currentContentColor, + ) + Spacer(modifier = Modifier.width(4.dp)) + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right), + contentDescription = null, + modifier = Modifier.size(20.dp), + tint = currentContentColor, + ) + } +} + +@Composable +@Preview +fun PreviewUnknownBirthTimeButton() { + UnknownBirthTimeButton( + onClick = { /*TODO*/ }, + ) +} From 5eeb27d9169f431b8981eab697489c802c3fd429 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Sat, 1 Mar 2025 17:59:54 +0900 Subject: [PATCH 082/210] =?UTF-8?q?[refactor/#185]=20=EC=83=9D=EB=85=84?= =?UTF-8?q?=EC=9B=94=EC=9D=BC=20=ED=99=94=EB=A9=B4=EC=97=90=20"=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=EB=AA=A8=EB=A6=84"=EB=B2=84=ED=8A=BC=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/OnboardingTimeOfBirthScreen.kt | 42 ++++--------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt index 94c7cbb1..f5d67f0e 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt @@ -3,13 +3,11 @@ package com.yapp.onboarding import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -23,7 +21,6 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.SoftwareKeyboardController -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.KeyboardType @@ -34,6 +31,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.onboarding.component.UnknownBirthTimeButton import com.yapp.ui.component.textfield.OrbitTextField import com.yapp.ui.extensions.customClickable import com.yapp.ui.utils.heightForScreenPercentage @@ -94,7 +92,6 @@ fun OnboardingTimeOfBirthScreen( ), ) } - var isPressed by remember { mutableStateOf(false) } OnboardingScreen( currentStep = currentStep, @@ -148,37 +145,16 @@ fun OnboardingTimeOfBirthScreen( ) } - Row( + UnknownBirthTimeButton( modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp) .align(Alignment.CenterHorizontally) - .customClickable( - rippleEnabled = false, - onClick = { - textFieldValue = TextFieldValue("시간모름") - onTextChange("시간모름") - onNextClick() - }, - onPress = { isPressed = true }, - onRelease = { isPressed = false }, - ), - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - painter = painterResource(id = core.designsystem.R.drawable.ic_check), - contentDescription = "Check", - tint = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.white, // ✅ 클릭 여부에 따라 색상 변경 - ) - Text( - text = stringResource(id = R.string.onboarding_step4_text_check), - style = OrbitTheme.typography.body1Medium, - color = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.white, // ✅ 클릭 여부에 따라 색상 변경 - modifier = Modifier.padding(start = 4.dp), - textAlign = TextAlign.Center, - ) - } + .padding(bottom = 20.dp), + onClick = { + textFieldValue = TextFieldValue("시간모름") + onTextChange("시간모름") + onNextClick() + }, + ) } } } From 37ff4b0bb7c57929e1fbf4def7e30f966f025fa8 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Sat, 1 Mar 2025 20:43:49 +0900 Subject: [PATCH 083/210] =?UTF-8?q?[refactor/#185]=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=EB=A7=90=ED=92=80=EC=84=A0=20=ED=8F=B0=ED=8A=B8=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 --- .../src/main/java/com/yapp/fortune/component/SpeechBubble.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt b/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt index e7c8300f..02add410 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/component/SpeechBubble.kt @@ -19,7 +19,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme -import feature.fortune.R @Composable fun SpeechBubble( @@ -27,7 +26,7 @@ fun SpeechBubble( text: String, backGroundColor: Color = OrbitTheme.colors.white.copy(alpha = 0.2f), textColor: Color = OrbitTheme.colors.white, - textStyle: TextStyle = OrbitTheme.typography.body1Medium, + textStyle: TextStyle = OrbitTheme.typography.H3, verticalPadding: Dp = 10.dp, horizontalPadding: Dp = 16.dp, ) { From ff14205438f64036a9b2c1edbdadc7fc0adc1739 Mon Sep 17 00:00:00 2001 From: Moonsu Kang Date: Sat, 1 Mar 2025 21:07:27 +0900 Subject: [PATCH 084/210] =?UTF-8?q?[refactor/#185]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EC=9D=B4=EB=A6=84=EC=9E=85=EB=A0=A5=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=EB=AC=B8=EA=B5=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/onboarding/src/main/res/values/values.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/onboarding/src/main/res/values/values.xml b/feature/onboarding/src/main/res/values/values.xml index 833f3d60..840c5f0f 100644 --- a/feature/onboarding/src/main/res/values/values.xml +++ b/feature/onboarding/src/main/res/values/values.xml @@ -11,7 +11,7 @@ 태어난 시간을 알려주세요 태어난 시간을 몰라요 - 입력한 숫자를 확인해 주세요 + 입력한 내용를 확인해 주세요 어떤 이름으로 불리길\n원하시나요? 입력한 내용을 확인해 주세요 From 1cf481d2acacd5be69b1b0135a20fcbbdd6eb4a8 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sun, 2 Mar 2025 01:26:52 +0900 Subject: [PATCH 085/210] =?UTF-8?q?[FIX/#184]=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=ED=9B=84=20=EB=B3=B5=EA=B5=AC=20=EC=8B=9C=20dismissState=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/alarm/component/AlarmListItem.kt | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt index 1d5765e3..b6de8c76 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt @@ -1,5 +1,7 @@ package com.yapp.alarm.component +import android.os.Handler +import android.os.Looper import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource @@ -27,7 +29,6 @@ import androidx.compose.material3.rememberSwipeToDismissBoxState import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf @@ -75,6 +76,9 @@ internal fun AlarmListItem( val dismissState = rememberSwipeToDismissBoxState( confirmValueChange = { + Handler(Looper.getMainLooper()).postDelayed({ + onSwipe(id) + }, 200,) return@rememberSwipeToDismissBoxState it == SwipeToDismissBoxValue.EndToStart }, positionalThreshold = { @@ -82,14 +86,6 @@ internal fun AlarmListItem( }, ) - if (dismissState.currentValue != SwipeToDismissBoxValue.Settled) { - LaunchedEffect(dismissState.currentValue) { - if (dismissState.currentValue == SwipeToDismissBoxValue.EndToStart) { - onSwipe(id) - } - } - } - CompositionLocalProvider( LocalRippleConfiguration provides RippleConfiguration( rippleAlpha = RippleAlpha( From 2891760673bb4f881a2ace18a5db8972f9a56e50 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sun, 2 Mar 2025 01:28:18 +0900 Subject: [PATCH 086/210] =?UTF-8?q?[FEAT/#184]=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C/=EB=B3=B5=EA=B5=AC=20=EC=8B=9C=20=EC=8B=A4?= =?UTF-8?q?=EC=A0=9C=20DB=EC=97=90=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/home/HomeViewModel.kt | 42 +++++++------------ 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index 1bf8a586..61fbd8a4 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -230,19 +230,14 @@ class HomeViewModel @Inject constructor( private fun deleteAlarms(alarmIds: Set) { if (alarmIds.isEmpty()) return - val alarmsWithIndex = currentState.alarms.withIndex() - .filter { it.value.id in alarmIds } - .map { it.index to it.value } + val alarmsToDelete = currentState.alarms + .filter { it.id in alarmIds } - val alarmsToDelete = alarmsWithIndex.map { it.second } - - updateState { - copy( - alarms = currentState.alarms - alarmsToDelete.toSet(), - selectedAlarmIds = emptySet(), - isDeleteDialogVisible = false, - isSelectionMode = false, - ) + viewModelScope.launch { + alarmsToDelete.forEach { alarm -> + alarmUseCase.deleteAlarm(alarm.id) + alarmHelper.unScheduleAlarm(alarm) + } } emitSideEffect( @@ -250,29 +245,20 @@ class HomeViewModel @Inject constructor( message = resourceProvider.getString(R.string.alarm_deleted), label = resourceProvider.getString(R.string.alarm_delete_dialog_btn_cancel), iconRes = resourceProvider.getDrawable(core.designsystem.R.drawable.ic_check_green), - onDismiss = { - viewModelScope.launch { - alarmsToDelete.forEach { alarm -> - Log.d("HomeViewModel", "Deleting alarm: ${alarm.id}") - alarmUseCase.deleteAlarm(alarm.id) - alarmHelper.unScheduleAlarm(alarm) - } - } - }, + onDismiss = { }, onAction = { - restoreDeletedAlarms(alarmsWithIndex) + restoreDeletedAlarms(alarmsToDelete) }, ), ) } - private fun restoreDeletedAlarms(alarmsWithIndex: List>) { - updateState { - val restoredAlarms = currentState.alarms.toMutableList() - alarmsWithIndex.forEach { (index, alarm) -> - restoredAlarms.add(index, alarm) + private fun restoreDeletedAlarms(alarmsWithIndex: List) { + viewModelScope.launch { + alarmsWithIndex.forEach { alarm -> + alarmUseCase.insertAlarm(alarm) + alarmHelper.scheduleAlarm(alarm) } - copy(alarms = restoredAlarms) } } From 66681d178a66ef376444496c906370fe2e97959e Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sun, 2 Mar 2025 22:24:37 +0900 Subject: [PATCH 087/210] =?UTF-8?q?[FIX/#184]=20`SwipeToDismissBoxValue.En?= =?UTF-8?q?dToStart`=20=EC=83=81=ED=83=9C=EA=B0=80=20=EB=90=98=EC=97=88?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C=EB=A7=8C=20onSwipe(id)=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/alarm/component/AlarmListItem.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt index b6de8c76..58a5b471 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt @@ -76,13 +76,15 @@ internal fun AlarmListItem( val dismissState = rememberSwipeToDismissBoxState( confirmValueChange = { - Handler(Looper.getMainLooper()).postDelayed({ - onSwipe(id) - }, 200,) + if (it == SwipeToDismissBoxValue.EndToStart) { + Handler(Looper.getMainLooper()).postDelayed({ + onSwipe(id) + }, 200,) + } return@rememberSwipeToDismissBoxState it == SwipeToDismissBoxValue.EndToStart }, positionalThreshold = { - width * 0.6f + width * 0.8f }, ) @@ -103,7 +105,7 @@ internal fun AlarmListItem( gesturesEnabled = swipeable, backgroundContent = { Box( - modifier = Modifier + modifier = modifier .fillMaxSize() .background(OrbitTheme.colors.gray_500) .onGloballyPositioned { width = it.size.width }, From 32a54b43ff0ac727629f1dd74890c8fb12c2c563 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 3 Mar 2025 01:49:05 +0900 Subject: [PATCH 088/210] =?UTF-8?q?[UI/#184]=20AlarmListItemMenu=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=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 --- .../com/yapp/alarm/component/AlarmListItem.kt | 142 +++++++++++++++++- 1 file changed, 135 insertions(+), 7 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt index 58a5b471..7f2d2a28 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt @@ -2,8 +2,11 @@ package com.yapp.alarm.component import android.os.Handler import android.os.Looper +import androidx.annotation.DrawableRes +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -17,11 +20,13 @@ import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ripple.RippleAlpha import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.LocalRippleConfiguration import androidx.compose.material3.RippleConfiguration +import androidx.compose.material3.Surface import androidx.compose.material3.SwipeToDismissBox import androidx.compose.material3.SwipeToDismissBoxValue import androidx.compose.material3.Text @@ -30,28 +35,34 @@ import androidx.compose.material3.ripple import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf 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.graphics.Color import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.layout.positionInRoot +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.AlarmDay import com.yapp.domain.model.toRepeatDays import com.yapp.ui.component.checkbox.OrbitCheckBox import com.yapp.ui.component.switch.OrbitSwitch +import feature.home.R import java.time.LocalDateTime import java.time.LocalTime import java.time.format.DateTimeFormatter -@OptIn(ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @Composable internal fun AlarmListItem( modifier: Modifier = Modifier, @@ -62,6 +73,7 @@ internal fun AlarmListItem( selectable: Boolean = false, selected: Boolean = false, onClick: (Long) -> Unit, + onLongPress: (Long, Float, Float) -> Unit, onToggleSelect: (Long) -> Unit, onSwipe: (Long) -> Unit, isAm: Boolean, @@ -71,8 +83,12 @@ internal fun AlarmListItem( onToggleActive: (Long) -> Unit, ) { val interactionSource = remember { MutableInteractionSource() } + val density = LocalDensity.current + val configuration = LocalConfiguration.current + val screenHeightPx = with(density) { configuration.screenHeightDp.dp.toPx() } - var width by remember { mutableIntStateOf(0) } + var itemPosition by remember { mutableStateOf(Pair(0f, 0f)) } + var itemSize by remember { mutableStateOf(IntSize(0, 0)) } val dismissState = rememberSwipeToDismissBoxState( confirmValueChange = { @@ -84,7 +100,7 @@ internal fun AlarmListItem( return@rememberSwipeToDismissBoxState it == SwipeToDismissBoxValue.EndToStart }, positionalThreshold = { - width * 0.8f + itemSize.width * 0.8f }, ) @@ -108,7 +124,13 @@ internal fun AlarmListItem( modifier = modifier .fillMaxSize() .background(OrbitTheme.colors.gray_500) - .onGloballyPositioned { width = it.size.width }, + .onGloballyPositioned { + itemSize = it.size + itemPosition = Pair( + it.positionInRoot().x, + it.positionInRoot().y, + ) + }, contentAlignment = Alignment.CenterStart, ) { Icon( @@ -118,7 +140,7 @@ internal fun AlarmListItem( modifier = Modifier .size(24.dp) .offset { - val offsetX = width * (1 - dismissState.progress * 0.5f) - 12.dp.toPx() + val offsetX = itemSize.width * (1 - dismissState.progress * 0.5f) - 12.dp.toPx() IntOffset( x = offsetX.toInt(), @@ -135,11 +157,21 @@ internal fun AlarmListItem( .background( if (selected) OrbitTheme.colors.gray_800 else OrbitTheme.colors.gray_900, ) - .clickable( + .combinedClickable( interactionSource = interactionSource, indication = ripple( color = OrbitTheme.colors.gray_800, ), + onLongClick = { + val minRequiredSpace = itemSize.height + with(density) { 42.dp.toPx() } + val adjustedY = if (itemPosition.second + minRequiredSpace > screenHeightPx) { + screenHeightPx - minRequiredSpace + } else { + itemPosition.second + } + + onLongPress(id, itemPosition.first, adjustedY) + }, ) { if (selectable) { onToggleSelect(id) @@ -298,6 +330,65 @@ private fun getNextAlarmDateWithTime(isAm: Boolean, hour: Int, minute: Int): Str return nextAlarmDate.format(DateTimeFormatter.ofPattern("M월 d일")) } +@OptIn(ExperimentalMaterial3Api::class) +@Composable +internal fun AlarmListItemMenu( + text: String, + @DrawableRes iconRes: Int, + onClick: () -> Unit, +) { + val interactionSource = remember { MutableInteractionSource() } + + CompositionLocalProvider( + LocalRippleConfiguration provides RippleConfiguration( + rippleAlpha = RippleAlpha( + pressedAlpha = 1f, + focusedAlpha = 1f, + hoveredAlpha = 1f, + draggedAlpha = 1f, + ), + ), + ) { + Surface( + modifier = Modifier + .width(120.dp) + .height(42.dp) + .clip(RoundedCornerShape(12.dp)) + .clickable( + interactionSource = interactionSource, + indication = ripple( + bounded = false, + color = OrbitTheme.colors.gray_600, + ), + onClick = onClick, + ), + color = OrbitTheme.colors.gray_700, + shape = RoundedCornerShape(12.dp), + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Text( + text = text, + style = OrbitTheme.typography.body1SemiBold, + color = OrbitTheme.colors.alert, + ) + + Icon( + modifier = Modifier.size(20.dp), + painter = painterResource(id = iconRes), + contentDescription = "Icon", + tint = OrbitTheme.colors.alert, + ) + } + } + } +} + @Preview @Composable private fun AlarmListItemPreview() { @@ -319,6 +410,7 @@ private fun AlarmListItemPreview() { minute = 0, isActive = isActive, onClick = { }, + onLongPress = { _, _, _ -> }, onToggleActive = { isActive = !isActive }, @@ -346,6 +438,7 @@ private fun AlarmListItemPreview() { minute = 0, isActive = isActive, onClick = { }, + onLongPress = { _, _, _ -> }, onToggleActive = { isActive = !isActive }, @@ -355,3 +448,38 @@ private fun AlarmListItemPreview() { } } } + +@Preview +@Composable +private fun AlarmListItemMenuPreview() { + OrbitTheme { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + AlarmListItem( + id = 0, + repeatDays = 0, + isHolidayAlarmOff = false, + selectable = false, + swipeable = false, + selected = false, + isAm = true, + hour = 6, + minute = 0, + isActive = true, + onClick = { }, + onLongPress = { _, _, _ -> }, + onToggleActive = { }, + onToggleSelect = { }, + onSwipe = { }, + ) + + AlarmListItemMenu( + text = stringResource(id = R.string.alarm_delete_dialog_btn_delete), + iconRes = core.designsystem.R.drawable.ic_trash, + ) { + } + } + } +} From d2c297594979271f5a137495c5f00dbf8bb9f65f Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 3 Mar 2025 01:50:04 +0900 Subject: [PATCH 089/210] =?UTF-8?q?[FEAT/#184]=20AlarmListItem=20=EA=B8=B8?= =?UTF-8?q?=EA=B2=8C=20=EB=88=84=EB=A5=BC=20=EC=8B=9C=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EC=9C=84=EC=B9=98=20=EC=A0=95=EB=B3=B4=20=EC=A0=84?= =?UTF-8?q?=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/home/component/bottomsheet/AlarmListBottomSheet.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt index 0dcb7e03..a9d1b4c4 100644 --- a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt +++ b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt @@ -70,6 +70,7 @@ internal fun AlarmListBottomSheet( halfExpandedHeight: Dp = 0.dp, listState: LazyListState, onClickAlarm: (Long) -> Unit, + onLongPressAlarm: (Long, Float, Float) -> Unit, onClickAdd: () -> Unit, onClickMore: () -> Unit, onClickCheckAll: () -> Unit, @@ -129,6 +130,7 @@ internal fun AlarmListBottomSheet( selectedAlarmIds = selectedAlarmIds, listState = listState, onClickAlarm = onClickAlarm, + onLongPressAlarm = onLongPressAlarm, onClickAdd = onClickAdd, onClickMore = onClickMore, onClickCheckAll = onClickCheckAll, @@ -165,6 +167,7 @@ internal fun AlarmBottomSheetContent( selectedAlarmIds: Set, listState: LazyListState, onClickAlarm: (Long) -> Unit, + onLongPressAlarm: (Long, Float, Float) -> Unit, onClickAdd: () -> Unit, onClickMore: () -> Unit, onClickCheckAll: () -> Unit, @@ -223,6 +226,7 @@ internal fun AlarmBottomSheetContent( selectable = isSelectionMode, selected = selectedAlarmIds.contains(alarm.id), onClick = onClickAlarm, + onLongPress = onLongPressAlarm, onToggleSelect = onToggleSelect, isAm = alarm.isAm, hour = alarm.hour, From 521a0426bc708a454983152984533b38a754cc98 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 3 Mar 2025 01:51:00 +0900 Subject: [PATCH 090/210] =?UTF-8?q?[FEAT/#184]=20AlarmListItem=20=EA=B8=B8?= =?UTF-8?q?=EA=B2=8C=20=EB=88=84=EB=A5=BC=20=EC=8B=9C=20=EA=B0=9C=EB=B3=84?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20=EB=A9=94=EB=89=B4=20=ED=91=9C=EC=8B=9C?= =?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 --- .../main/java/com/yapp/home/HomeContract.kt | 4 + .../src/main/java/com/yapp/home/HomeScreen.kt | 305 ++++++++++++------ .../main/java/com/yapp/home/HomeViewModel.kt | 24 ++ 3 files changed, 229 insertions(+), 104 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/home/HomeContract.kt b/feature/home/src/main/java/com/yapp/home/HomeContract.kt index 7a8c33a0..d1976d2a 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeContract.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeContract.kt @@ -23,6 +23,8 @@ sealed class HomeContract { val lastFortuneScore: Int = -1, val deliveryTime: String = "받을 수 있는 운세가 없어요", val name: String = "", + val activeItemMenu: Long? = null, + val activeItemMenuPosition: Pair? = null, ) : UiState { val isAllSelected: Boolean get() = alarms.isNotEmpty() && selectedAlarmIds.size == alarms.size @@ -53,6 +55,8 @@ sealed class HomeContract { data class EditAlarm(val alarmId: Long) : Action() data object ShowDailyFortune : Action() data object NavigateToSetting : Action() + data class ShowItemMenu(val alarmId: Long, val x: Float, val y: Float) : Action() + data object HideItemMenu : Action() } sealed class SideEffect : com.yapp.ui.base.SideEffect { diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt index a09bf8c5..c356a488 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt @@ -5,9 +5,11 @@ import androidx.compose.animation.core.tween import androidx.compose.foundation.Canvas import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.collectIsPressedAsState +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -16,6 +18,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBarsPadding @@ -39,6 +42,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.blur import androidx.compose.ui.draw.clip import androidx.compose.ui.geometry.CornerRadius import androidx.compose.ui.geometry.Offset @@ -49,6 +53,7 @@ import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.layout import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -56,10 +61,14 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.alarm.component.AlarmListItem +import com.yapp.alarm.component.AlarmListItemMenu import com.yapp.common.navigation.OrbitNavigator import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.domain.model.Alarm import com.yapp.home.component.bottomsheet.AlarmListBottomSheet import com.yapp.ui.component.dialog.OrbitDialog import com.yapp.ui.component.lottie.LottieAnimation @@ -265,112 +274,153 @@ private fun HomeContent( } Box( - modifier = Modifier.clickable( - interactionSource = remember { MutableInteractionSource() }, - indication = null, - ) { - eventDispatcher(HomeContract.Action.HideToolTip) - }, - ) { - AlarmListBottomSheet( - alarms = state.alarms, - menuExpanded = state.dropdownMenuExpanded, - isAllSelected = state.isAllSelected, - isSelectionMode = state.isSelectionMode, - selectedAlarmIds = state.selectedAlarmIds, - halfExpandedHeight = sheetHalfExpandHeight, - listState = listState, - onClickAlarm = { alarmId -> - eventDispatcher(HomeContract.Action.EditAlarm(alarmId)) - }, - onClickAdd = { - eventDispatcher(HomeContract.Action.NavigateToAlarmCreation) - }, - onClickMore = { - eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility) - }, - onClickCheckAll = { - eventDispatcher(HomeContract.Action.ToggleAllAlarmSelection) - }, - onClickClose = { - eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode) - }, - onClickEdit = { - eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode) - }, - onDismissRequest = { - eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility) - }, - onToggleSelect = { alarmId -> - eventDispatcher(HomeContract.Action.ToggleAlarmSelection(alarmId)) - }, - onToggleActive = { alarmId -> - eventDispatcher(HomeContract.Action.ToggleAlarmActivation(alarmId)) - }, - onSwipe = { alarmId -> - eventDispatcher(HomeContract.Action.SwipeToDeleteAlarm(alarmId)) + modifier = Modifier + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + ) { + eventDispatcher(HomeContract.Action.HideToolTip) }, - ) { + ) { + if (state.activeItemMenu != null) { Box( modifier = Modifier .fillMaxSize() - .background(Color(0xFF1F3B64)), + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + ) { + eventDispatcher(HomeContract.Action.HideItemMenu) + } + .zIndex(1f), + ) + } + + Box( + modifier = if (state.activeItemMenu != null) { + Modifier + .background(color = Color(0xFF1F3B64)) + .blur(10.dp) + } else { + Modifier + }, + ) { + AlarmListBottomSheet( + alarms = state.alarms, + menuExpanded = state.dropdownMenuExpanded, + isAllSelected = state.isAllSelected, + isSelectionMode = state.isSelectionMode, + selectedAlarmIds = state.selectedAlarmIds, + halfExpandedHeight = sheetHalfExpandHeight, + listState = listState, + onClickAlarm = { alarmId -> + eventDispatcher(HomeContract.Action.EditAlarm(alarmId)) + }, + onLongPressAlarm = { alarmId, x, y -> + eventDispatcher(HomeContract.Action.ShowItemMenu(alarmId, x, y)) + }, + onClickAdd = { + eventDispatcher(HomeContract.Action.NavigateToAlarmCreation) + }, + onClickMore = { + eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility) + }, + onClickCheckAll = { + eventDispatcher(HomeContract.Action.ToggleAllAlarmSelection) + }, + onClickClose = { + eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode) + }, + onClickEdit = { + eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode) + }, + onDismissRequest = { + eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility) + }, + onToggleSelect = { alarmId -> + eventDispatcher(HomeContract.Action.ToggleAlarmSelection(alarmId)) + }, + onToggleActive = { alarmId -> + eventDispatcher(HomeContract.Action.ToggleAlarmActivation(alarmId)) + }, + onSwipe = { alarmId -> + eventDispatcher(HomeContract.Action.SwipeToDeleteAlarm(alarmId)) + }, ) { - HillWithGradient() + Box( + modifier = Modifier + .fillMaxSize() + .background(Color(0xFF1F3B64)), + ) { + HillWithGradient() - SkyImage() + SkyImage() - val characterY = (screenHeight * 0.28f) - 130.dp + val characterY = (screenHeight * 0.28f) - 130.dp - Column( - modifier = Modifier - .fillMaxWidth() - .layout { measurable, constraints -> - val placeable = measurable.measure(constraints) - sheetHalfExpandHeight = screenHeight - placeable.height.toDp() - layout(placeable.width, placeable.height) { - placeable.placeRelative(0, 0) - } - }, - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer(modifier = Modifier.height(characterY)) + Column( + modifier = Modifier + .fillMaxWidth() + .layout { measurable, constraints -> + val placeable = measurable.measure(constraints) + sheetHalfExpandHeight = screenHeight - placeable.height.toDp() + layout(placeable.width, placeable.height) { + placeable.placeRelative(0, 0) + } + }, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Spacer(modifier = Modifier.height(characterY)) - HomeCharacterAnimation( - fortuneScore = state.lastFortuneScore, - hasActivatedAlarm = state.hasActivatedAlarm, - ) - Spacer(modifier = Modifier.height(8.dp)) - HomeFortuneDescription( - fortuneScore = state.lastFortuneScore, - hasActivatedAlarm = state.hasActivatedAlarm, - name = state.name, - deliveryTime = state.deliveryTime, + HomeCharacterAnimation( + fortuneScore = state.lastFortuneScore, + hasActivatedAlarm = state.hasActivatedAlarm, + ) + Spacer(modifier = Modifier.height(8.dp)) + HomeFortuneDescription( + fortuneScore = state.lastFortuneScore, + hasActivatedAlarm = state.hasActivatedAlarm, + name = state.name, + deliveryTime = state.deliveryTime, + ) + } + + HomeTopBar( + onSettingClick = { eventDispatcher(HomeContract.Action.NavigateToSetting) }, + onMailClick = { eventDispatcher(HomeContract.Action.ShowDailyFortune) }, + hasNewFortune = state.hasNewFortune, + isShowTooltip = state.isToolTipVisible, ) } + } - HomeTopBar( - onSettingClick = { eventDispatcher(HomeContract.Action.NavigateToSetting) }, - onMailClick = { eventDispatcher(HomeContract.Action.ShowDailyFortune) }, - hasNewFortune = state.hasNewFortune, - isShowTooltip = state.isToolTipVisible, + BottomGradient(modifier = Modifier.align(Alignment.BottomCenter)) + + if (state.isSelectionMode && state.selectedAlarmIds.isNotEmpty()) { + DeleteAlarmButton( + modifier = Modifier + .widthIn(min = 130.dp) + .align(Alignment.BottomCenter) + .padding(bottom = 26.dp), + selectedAlarmCount = state.selectedAlarmIds.size, + onClick = { + eventDispatcher(HomeContract.Action.ShowDeleteDialog) + }, ) } } - BottomGradient(modifier = Modifier.align(Alignment.BottomCenter)) - - if (state.isSelectionMode && state.selectedAlarmIds.isNotEmpty()) { - DeleteAlarmButton( - modifier = Modifier - .widthIn(min = 130.dp) - .align(Alignment.BottomCenter) - .padding(bottom = 26.dp), - selectedAlarmCount = state.selectedAlarmIds.size, - onClick = { - eventDispatcher(HomeContract.Action.ShowDeleteDialog) - }, - ) + if (state.activeItemMenu != null) { + state.alarms.find { it.id == state.activeItemMenu }?.let { + AlarmWithMenu( + activeItemMenu = it, + activeItemMenuPosition = state.activeItemMenuPosition, + selectedAlarmIds = state.selectedAlarmIds, + onDelete = { alarmId -> + eventDispatcher(HomeContract.Action.DeleteSingleAlarm(alarmId)) + }, + ) + } } } } @@ -795,6 +845,58 @@ private fun BottomGradient( ) } +@Composable +private fun AlarmWithMenu( + activeItemMenu: Alarm, + activeItemMenuPosition: Pair?, + selectedAlarmIds: Set, + onDelete: (Long) -> Unit = {}, +) { + val density = LocalDensity.current + + Column( + modifier = Modifier.offset( + x = with(density) { (activeItemMenuPosition?.first ?: 0f).toDp() }, + y = with(density) { (activeItemMenuPosition?.second ?: 0f).toDp() }, + ).zIndex(2f), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + AlarmListItem( + modifier = Modifier + .padding(horizontal = 20.dp) + .clip(RoundedCornerShape(24.dp)) + .border( + width = 1.dp, + shape = RoundedCornerShape(24.dp), + color = OrbitTheme.colors.gray_700, + ), + id = activeItemMenu.id, + repeatDays = activeItemMenu.repeatDays, + isHolidayAlarmOff = activeItemMenu.isHolidayAlarmOff, + swipeable = false, + selectable = false, + selected = selectedAlarmIds.contains(activeItemMenu.id), + isAm = activeItemMenu.isAm, + hour = activeItemMenu.hour, + minute = activeItemMenu.minute, + isActive = activeItemMenu.isAlarmActive, + onClick = { }, + onLongPress = { _, _, _ -> }, + onToggleActive = { }, + onToggleSelect = { }, + onSwipe = { }, + ) + + AlarmListItemMenu( + text = stringResource(id = R.string.alarm_delete_dialog_btn_delete), + iconRes = core.designsystem.R.drawable.ic_trash, + ) { + onDelete(activeItemMenu.id) + } + } +} + @Preview( showBackground = true, backgroundColor = 0xFF000000, @@ -803,21 +905,16 @@ private fun BottomGradient( fun HomeScreenPreview() { OrbitTheme { HomeScreen( - stateProvider = { HomeContract.State() }, + stateProvider = { + HomeContract.State().copy( + initialLoading = false, + alarms = listOf( + Alarm(), + ), + activeItemMenu = 1, + ) + }, eventDispatcher = {}, ) } } - -@Preview -@Composable -fun HomeTopBarPreview() { - OrbitTheme { - HomeTopBar( - onSettingClick = {}, - onMailClick = {}, - hasNewFortune = true, - isShowTooltip = true, - ) - } -} diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index 61fbd8a4..5350f1e1 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -63,6 +63,8 @@ class HomeViewModel @Inject constructor( is HomeContract.Action.EditAlarm -> editAlarm(action.alarmId) HomeContract.Action.ShowDailyFortune -> loadDailyFortune() HomeContract.Action.NavigateToSetting -> navigateToSetting() + is HomeContract.Action.ShowItemMenu -> showItemMenu(action.alarmId, action.x, action.y) + HomeContract.Action.HideItemMenu -> hideItemMenu() } } @@ -240,6 +242,10 @@ class HomeViewModel @Inject constructor( } } + if (currentState.activeItemMenu != null) { + hideItemMenu() + } + emitSideEffect( HomeContract.SideEffect.ShowSnackBar( message = resourceProvider.getString(R.string.alarm_deleted), @@ -430,4 +436,22 @@ class HomeViewModel @Inject constructor( ), ) } + + private fun showItemMenu(alarmId: Long, x: Float, y: Float) { + updateState { + copy( + activeItemMenu = alarmId, + activeItemMenuPosition = x to y, + ) + } + } + + private fun hideItemMenu() { + updateState { + copy( + activeItemMenu = null, + activeItemMenuPosition = null, + ) + } + } } From 8f4fbdafbd80fc0bb25b2ab098e89fc4cf3149fa Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 3 Mar 2025 12:01:20 +0900 Subject: [PATCH 091/210] =?UTF-8?q?[FIX/#184]=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EB=AA=A8=EB=93=9C=EC=97=90=EC=84=9C=20LongPress=20=EC=9D=B4?= =?UTF-8?q?=EB=B2=A4=ED=8A=B8=EA=B0=80=20=EB=8F=99=EC=9E=91=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/alarm/component/AlarmListItem.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt index 7f2d2a28..467fdfdd 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt @@ -163,6 +163,8 @@ internal fun AlarmListItem( color = OrbitTheme.colors.gray_800, ), onLongClick = { + if (selectable) return@combinedClickable + val minRequiredSpace = itemSize.height + with(density) { 42.dp.toPx() } val adjustedY = if (itemPosition.second + minRequiredSpace > screenHeightPx) { screenHeightPx - minRequiredSpace From 5e155577bf3950b5fab3a580cc764f2af8781fd0 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Mon, 3 Mar 2025 21:45:28 +0900 Subject: [PATCH 092/210] =?UTF-8?q?[refactor/#185]=20=EC=84=B1=EB=B3=84=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20Corner=20Radius=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt b/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt index f5dc35f7..ee23cd18 100644 --- a/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt +++ b/core/ui/src/main/java/com/yapp/ui/toggle/OrbitGenderToggle.kt @@ -35,6 +35,7 @@ fun OrbitGenderToggle( modifier: Modifier = Modifier, height: Dp = 148.dp, textStyle: TextStyle = OrbitTheme.typography.heading2SemiBold, + shape: RoundedCornerShape = RoundedCornerShape(16.dp), ) { val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() @@ -69,9 +70,9 @@ fun OrbitGenderToggle( .border( width = if (isPressed) 0.dp else 1.dp, color = borderColor, - shape = RoundedCornerShape(16.dp), + shape = shape, ) - .background(backgroundColor, shape = RoundedCornerShape(16.dp)) + .background(backgroundColor, shape = shape) .clickable( interactionSource = interactionSource, indication = null, From 29efc98d6edc9580aadb9937bde8b6070b4214dd Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Mon, 3 Mar 2025 21:46:06 +0900 Subject: [PATCH 093/210] =?UTF-8?q?[refactor/#185]=20=EC=97=B0=EC=9B=94?= =?UTF-8?q?=ED=94=BC=EC=BB=A4=EC=97=90=20=EC=9B=94/=EC=9D=BC=EC=9D=B4=20?= =?UTF-8?q?=EC=A0=9C=EB=8C=80=EB=A1=9C=20=EC=9C=84=EC=B9=98=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../timepicker/OrbitYearMonthPicker.kt | 27 ++++++++++++------- .../com/yapp/setting/EditBirthdayScreen.kt | 22 ++++++++++----- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt index 4bb7f0c8..7d90d39b 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/timepicker/OrbitYearMonthPicker.kt @@ -15,7 +15,6 @@ import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -41,16 +40,24 @@ fun OrbitYearMonthPicker( val lunarState = remember { mutableStateOf(initialLunar) } val yearState = remember { mutableIntStateOf(initialYear.toInt()) } val monthState = remember { mutableIntStateOf(initialMonth.toInt()) } + + val maxDay = getMaxDaysInMonth(yearState.intValue, monthState.intValue) + val dayItems = (1..maxDay).map { it.toString() } + + val startIndexYear = (1900..2024).map { it.toString() }.indexOf(initialYear).takeIf { it >= 0 } ?: 0 + val startIndexMonth = (1..12).map { it.toString() }.indexOf(initialMonth).takeIf { it >= 0 } ?: 0 + val startIndexDay = dayItems.indexOf(initialDay).takeIf { it >= 0 } ?: 0 + val dayState = remember { mutableIntStateOf(initialDay.toInt()) } - val dayItems = remember { mutableStateListOf() } - LaunchedEffect(yearState.intValue, monthState.intValue) { - val maxDay = getMaxDaysInMonth(yearState.intValue, monthState.intValue) - dayItems.clear() - dayItems.addAll((1..maxDay).map { it.toString() }) + val yearPickerState = rememberPickerState(startIndex = startIndexYear) + val monthPickerState = rememberPickerState(startIndex = startIndexMonth) + val dayPickerState = rememberPickerState(startIndex = startIndexDay) - if (dayState.intValue > maxDay) { - dayState.intValue = maxDay + LaunchedEffect(yearState.intValue, monthState.intValue) { + val newMaxDay = getMaxDaysInMonth(yearState.intValue, monthState.intValue) + if (dayState.intValue > newMaxDay) { + dayState.intValue = newMaxDay } } @@ -68,8 +75,6 @@ fun OrbitYearMonthPicker( ) { val lunarItems = listOf("양력", "음력") val yearItems = (1900..2024).map { it.toString() } - val startIndex = yearItems.indexOf(initialYear).takeIf { it >= 0 } ?: 0 - val yearPickerState = rememberPickerState(startIndex = startIndex) val monthItems = (1..12).map { it.toString() } Box( @@ -111,6 +116,7 @@ fun OrbitYearMonthPicker( ) OrbitPickerItem( items = monthItems, + state = monthPickerState, visibleItemsCount = 5, itemSpacing = itemSpacing, textStyle = OrbitTheme.typography.title2SemiBold, @@ -121,6 +127,7 @@ fun OrbitYearMonthPicker( ) OrbitPickerItem( items = dayItems, + state = dayPickerState, visibleItemsCount = 5, itemSpacing = itemSpacing, textStyle = OrbitTheme.typography.title2SemiBold, diff --git a/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt b/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt index ad38bfda..1870ceea 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditBirthdayScreen.kt @@ -9,6 +9,9 @@ import androidx.compose.foundation.layout.navigationBarsPadding 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.tooling.preview.Preview @@ -58,7 +61,10 @@ fun EditBirthdayScreen( onCancelDialog: () -> Unit, onUpdateBirthDate: (String, Int, Int, Int) -> Unit, ) { - val (year, month, day) = state.birthDate.split("-") + var selectedLunar by remember { mutableStateOf(state.birthType) } + var selectedYear by remember { mutableStateOf(state.birthDate.split("-")[0].toInt()) } + var selectedMonth by remember { mutableStateOf(state.birthDate.split("-")[1].toInt()) } + var selectedDay by remember { mutableStateOf(state.birthDate.split("-")[2].toInt()) } Column( modifier = Modifier @@ -74,6 +80,7 @@ fun EditBirthdayScreen( actionTitle = "확인", isActionEnabled = true, onActionClick = { + onUpdateBirthDate(selectedLunar, selectedYear, selectedMonth, selectedDay) onConfirm() }, ) @@ -86,12 +93,15 @@ fun EditBirthdayScreen( Spacer(modifier = Modifier.heightForScreenPercentage(0.16f)) OrbitYearMonthPicker( - initialLunar = state.birthType, - initialYear = year, - initialMonth = month, - initialDay = day, + initialLunar = selectedLunar, + initialYear = selectedYear.toString(), + initialMonth = selectedMonth.toString(), + initialDay = selectedDay.toString(), ) { lunar, year, month, day -> - onUpdateBirthDate(lunar, year, month, day) + selectedLunar = lunar + selectedYear = year + selectedMonth = month + selectedDay = day } } From 7be875c53f467d6e4ceafe164883032fc9e97433 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Mon, 3 Mar 2025 21:46:27 +0900 Subject: [PATCH 094/210] =?UTF-8?q?[add/#185]=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20fetch=20=EB=B6=84=EA=B8=B0=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20state=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../setting/src/main/java/com/yapp/setting/SettingContract.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt index 7be266f5..3faa1584 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt @@ -18,6 +18,7 @@ sealed class SettingContract { val isDialogVisible: Boolean = false, val isNameValid: Boolean = true, val isTimeValid: Boolean = true, + val shouldFetchUserInfo: Boolean = true, ) : UiState { val birthDateFormatted: String get() { @@ -29,7 +30,7 @@ sealed class SettingContract { return "$birthType $year $month $day" } val isActionEnabled: Boolean - get() = isNameValid && isTimeValid && selectedGender != null + get() = isNameValid && (isTimeUnknown || (timeOfBirth.length == 5 && isTimeValid)) && selectedGender != null } sealed class Action { From 1d09328256dcf26efb4161aa79ae4024e13ccba1 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Mon, 3 Mar 2025 21:47:46 +0900 Subject: [PATCH 095/210] =?UTF-8?q?[refactor/#185]=20ViewModel=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20fetch=20=EB=B6=84=EA=B8=B0=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/setting/EditProfileViewModel.kt | 141 ++++++++++-------- .../java/com/yapp/setting/SettingViewModel.kt | 62 ++------ 2 files changed, 92 insertions(+), 111 deletions(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt index ffbfb904..0eadb1e4 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt @@ -20,70 +20,79 @@ class EditProfileViewModel @Inject constructor( ) : BaseViewModel( SettingContract.State(), ) { - - init { - viewModelScope.launch { - userPreferences.userIdFlow.collect { userId -> - if (userId != null) { - fetchUserInfo(userId) + fun onAction(action: SettingContract.Action) = intent { + when (action) { + is SettingContract.Action.UpdateName -> updateName(action.name) + is SettingContract.Action.UpdateBirthDate -> updateBirthDate(action) + is SettingContract.Action.UpdateCalendarType -> updateCalendarType(action.calendarType) + is SettingContract.Action.UpdateGender -> updateGender(action.gender) + is SettingContract.Action.ToggleGender -> toggleGender(action.isMale) + is SettingContract.Action.ToggleTimeUnknown -> toggleTimeUnknown(action.isChecked) + is SettingContract.Action.UpdateTimeOfBirth -> updateTimeOfBirth(action.time) + is SettingContract.Action.ConfirmAndNavigateBack -> emitSideEffect(SettingContract.SideEffect.NavigateBack) + is SettingContract.Action.Reset -> updateState { SettingContract.State() } + SettingContract.Action.ShowDialog -> updateState { copy(isDialogVisible = true) } + SettingContract.Action.HideDialog -> updateState { copy(isDialogVisible = false) } + SettingContract.Action.PreviousStep -> previousStep() + SettingContract.Action.SubmitUserInfo -> submitUserInfo() + is SettingContract.Action.NavigateToEditBirthday -> navigateToEditBirthday() + is SettingContract.Action.RefreshUserInfo -> { + if (currentState.shouldFetchUserInfo) { + refreshUserInfo() } } + else -> {} } } - fun onAction(action: SettingContract.Action) = intent { - when (action) { - is SettingContract.Action.UpdateName -> updateState { - val isValid = SettingContract.FieldType.NAME.validationRegex.matches(action.name) - copy(name = action.name, isNameValid = isValid) - } + private fun updateName(name: String) = updateState { + copy(name = name, isNameValid = validateName(name)) + } - is SettingContract.Action.UpdateBirthDate -> { - val formattedDate = "${action.year}-${action.month.toString().padStart(2, '0')}-${action.day.toString().padStart(2, '0')}" - updateState { state.copy(birthDate = formattedDate) } - } + private fun validateName(name: String): Boolean { + return SettingContract.FieldType.NAME.validationRegex.matches(name) + } - is SettingContract.Action.UpdateCalendarType -> { - Log.d("EditProfileViewModel", "Received new calendarType: ${action.calendarType}") - updateState { state.copy(birthType = action.calendarType) } - } + private fun updateBirthDate(action: SettingContract.Action.UpdateBirthDate) = updateState { + val formattedDate = "${action.year}-${action.month.toString().padStart(2, '0')}-${ + action.day.toString().padStart(2, '0') + }" + copy(birthDate = formattedDate) + } - is SettingContract.Action.UpdateGender -> updateState { copy(selectedGender = action.gender) } - is SettingContract.Action.ToggleGender -> updateState { - copy( - isMaleSelected = action.isMale, - isFemaleSelected = !action.isMale, - selectedGender = if (action.isMale) "남성" else "여성", - ) - } + private fun updateCalendarType(calendarType: String) = updateState { + copy(birthType = calendarType) + } - is SettingContract.Action.ToggleTimeUnknown -> updateState { - copy( - isTimeUnknown = action.isChecked, - timeOfBirth = if (action.isChecked) "시간모름" else "", - ) - } + private fun updateGender(gender: String) = updateState { + copy(selectedGender = gender) + } - is SettingContract.Action.UpdateTimeOfBirth -> updateState { - val isValid = if (action.time.length == 5) { - SettingContract.FieldType.TIME.validationRegex.matches(action.time) - } else { - true - } - copy(timeOfBirth = action.time, isTimeValid = isValid) - } + private fun toggleGender(isMale: Boolean) = updateState { + copy( + isMaleSelected = isMale, + isFemaleSelected = !isMale, + selectedGender = if (isMale) "남성" else "여성", + ) + } - is SettingContract.Action.ConfirmAndNavigateBack -> { - emitSideEffect(SettingContract.SideEffect.NavigateBack) - } + private fun toggleTimeUnknown(isChecked: Boolean) = updateState { + val newState = copy( + isTimeUnknown = isChecked, + timeOfBirth = if (isChecked) "시간모름" else "", + ) + newState.copy(isTimeValid = validateTimeOfBirth(newState.timeOfBirth, isChecked)) + } - is SettingContract.Action.Reset -> updateState { SettingContract.State() } - SettingContract.Action.ShowDialog -> updateState { copy(isDialogVisible = true) } - SettingContract.Action.HideDialog -> updateState { copy(isDialogVisible = false) } - SettingContract.Action.PreviousStep -> emitSideEffect(SettingContract.SideEffect.NavigateBack) - SettingContract.Action.SubmitUserInfo -> submitUserInfo() - SettingContract.Action.NavigateToEditBirthday -> navigateToEditBirthday() - else -> {} + private fun updateTimeOfBirth(time: String) = updateState { + copy(timeOfBirth = time, isTimeValid = validateTimeOfBirth(time, isTimeUnknown)) + } + + private fun validateTimeOfBirth(time: String, isTimeUnknown: Boolean): Boolean { + return if (isTimeUnknown) { + true + } else { + time.length == 5 && SettingContract.FieldType.TIME.validationRegex.matches(time) } } @@ -93,14 +102,10 @@ class EditProfileViewModel @Inject constructor( .onSuccess { user -> val (initialYear, initialMonth, initialDay) = user.birthDate.split("-") - Log.d( - "EditProfileViewModel", - "Fetched user data -> birthDate: ${user.birthDate}", - ) - updateState { copy( name = user.name, + isNameValid = validateName(user.name), initialYear = initialYear, initialMonth = initialMonth, initialDay = initialDay, @@ -109,6 +114,10 @@ class EditProfileViewModel @Inject constructor( selectedGender = user.gender, timeOfBirth = user.birthTime ?: "99:99", isTimeUnknown = user.birthTime == "시간모름", + isTimeValid = validateTimeOfBirth( + user.birthTime ?: "", + user.birthTime == "시간모름", + ), isMaleSelected = user.gender == "남성", isFemaleSelected = user.gender == "여성", ) @@ -120,6 +129,11 @@ class EditProfileViewModel @Inject constructor( } } + private fun previousStep() { + updateState { copy(shouldFetchUserInfo = true) } + emitSideEffect(SettingContract.SideEffect.NavigateBack) + } + private fun submitUserInfo() = viewModelScope.launch { val userId = userPreferences.userIdFlow.firstOrNull() ?: return@launch val state = container.stateFlow.value @@ -135,7 +149,6 @@ class EditProfileViewModel @Inject constructor( val result = userInfoRepository.updateUserInfo(userId, updatedUser) if (result.isSuccess) { - Log.d("EditProfileViewModel", "사용자 정보 수정 성공") userPreferences.saveUserName(state.name) emitSideEffect(SettingContract.SideEffect.UserInfoUpdated) @@ -154,9 +167,19 @@ class EditProfileViewModel @Inject constructor( private fun extractBirthDate(formattedDate: String): String { return formattedDate.replace(Regex("[^0-9-]"), "") } - // YYYY-MM-DD 형식으로 서버에 전송 private fun navigateToEditBirthday() = intent { + updateState { copy(shouldFetchUserInfo = false) } emitSideEffect(SettingContract.SideEffect.Navigate(SettingDestination.EditBirthday.route)) } + + private fun refreshUserInfo() { + viewModelScope.launch { + val userId = userPreferences.userIdFlow.firstOrNull() + if (userId != null) { + fetchUserInfo(userId) + updateState { copy(shouldFetchUserInfo = true) } + } + } + } } diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt index fbbb768e..242f9b3c 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt @@ -19,63 +19,12 @@ class SettingViewModel @Inject constructor( ) : BaseViewModel( SettingContract.State(), ) { - fun refreshUserInfo() { - viewModelScope.launch { - val userId = userPreferences.userIdFlow.firstOrNull() - if (userId != null) { - fetchUserInfo(userId) - } - } - } - -// init { -// viewModelScope.launch { -// container.sideEffectFlow.collect { sideEffect -> -// when (sideEffect) { -// is SettingContract.SideEffect.UserInfoUpdated -> refreshUserInfo() -// else -> {} -// } -// } -// } -// } - fun onAction(action: SettingContract.Action) = intent { when (action) { - is SettingContract.Action.UpdateName -> updateState { - val isValid = SettingContract.FieldType.NAME.validationRegex.matches(action.name) - copy(name = action.name, isNameValid = isValid) - } - is SettingContract.Action.UpdateBirthDate -> { - val formattedDate = "${action.year}-${action.month.toString().padStart(2, '0')}-${action.day.toString().padStart(2, '0')}" - updateState { state.copy(birthDate = formattedDate) } - } - is SettingContract.Action.UpdateGender -> updateState { copy(selectedGender = action.gender) } - is SettingContract.Action.ToggleGender -> updateState { - copy( - isMaleSelected = action.isMale, - isFemaleSelected = !action.isMale, - ) - } - is SettingContract.Action.ToggleTimeUnknown -> updateState { - copy( - isTimeUnknown = action.isChecked, - timeOfBirth = if (action.isChecked) "시간모름" else "", - ) - } - is SettingContract.Action.UpdateTimeOfBirth -> updateState { - val isValid = if (action.time.length == 5) { - SettingContract.FieldType.TIME.validationRegex.matches(action.time) - } else { - true - } - copy(timeOfBirth = action.time, isTimeValid = isValid) - } - is SettingContract.Action.Reset -> updateState { SettingContract.State() } - SettingContract.Action.ShowDialog -> updateState { copy(isDialogVisible = true) } - SettingContract.Action.HideDialog -> updateState { copy(isDialogVisible = false) } SettingContract.Action.PreviousStep -> emitSideEffect(SettingContract.SideEffect.NavigateBack) SettingContract.Action.NavigateToEditProfile -> navigateToEditProfile() is SettingContract.Action.OpenWebView -> openWebView(action.url) + SettingContract.Action.RefreshUserInfo -> refreshUserInfo() else -> {} } } @@ -105,4 +54,13 @@ class SettingViewModel @Inject constructor( private fun openWebView(url: String) { emitSideEffect(SettingContract.SideEffect.OpenWebView(url)) } + + private fun refreshUserInfo() { + viewModelScope.launch { + val userId = userPreferences.userIdFlow.firstOrNull() + if (userId != null) { + fetchUserInfo(userId) + } + } + } } From f1d046ae84fc3beab0d56d29ea02b95464465d8a Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Mon, 3 Mar 2025 21:48:14 +0900 Subject: [PATCH 096/210] =?UTF-8?q?[ADD/#185]=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20Fetch=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/setting/EditProfileScreen.kt | 13 +++++++++---- .../src/main/java/com/yapp/setting/SettingScreen.kt | 5 ++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt index dae4b5f7..4cd76ab6 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt @@ -1,6 +1,5 @@ package com.yapp.setting -import android.util.Log import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable @@ -52,7 +51,11 @@ fun EditProfileRoute( ) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() - Log.d("EditProfileRoute", "State: $state") + LaunchedEffect(state.shouldFetchUserInfo) { + if (state.shouldFetchUserInfo) { + viewModel.onAction(SettingContract.Action.RefreshUserInfo) + } + } EditProfileScreen( state = state, @@ -152,7 +155,7 @@ fun EditProfileScreen( hint = "이름 입력", isValid = state.isNameValid, showWarning = !state.isNameValid, - warningMessage = "올바른 이름을 입력해주세요.", + warningMessage = "입력한 내용을 확인해 주세요.", modifier = Modifier .fillMaxWidth() .padding(horizontal = 18.dp), @@ -193,6 +196,7 @@ fun EditProfileScreen( onToggle = { onToggleGender(true) }, height = 52.dp, textStyle = OrbitTheme.typography.body1Regular, + shape = RoundedCornerShape(12.dp), ) } Box(modifier = Modifier.weight(1f)) { @@ -202,6 +206,7 @@ fun EditProfileScreen( onToggle = { onToggleGender(false) }, height = 52.dp, textStyle = OrbitTheme.typography.body1Regular, + shape = RoundedCornerShape(12.dp), ) } } @@ -226,7 +231,7 @@ fun EditProfileScreen( birthTimeTextFieldValue.value = formattedValue onUpdateTimeOfBirth(formattedValue.text) }, - hint = "시간모름", + hint = "23:59", isValid = state.isTimeValid, showWarning = !state.isTimeValid, enabled = !state.isTimeUnknown, diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt index 6bf9a234..3df1fc2a 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt @@ -32,10 +32,9 @@ fun SettingRoute( ) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() - LaunchedEffect(Unit) { - viewModel.refreshUserInfo() // 이걸 어찌 할까요 + LaunchedEffect(key1 = Unit) { + viewModel.onAction(SettingContract.Action.RefreshUserInfo) } - SettingScreen( state = state, onNavigateToEditProfile = { From 31c84b972cbc8e24d6185c3149a798b2d7fee678 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 3 Mar 2025 23:28:24 +0900 Subject: [PATCH 097/210] =?UTF-8?q?[UI/#188]=20AlarmSortDropDownMenu=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=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 --- .../res/drawable/ic_check_border_lined.xml | 9 ++ .../src/main/res/drawable/ic_filter.xml | 10 ++ .../ui/component/checkbox/OrbitCheckBox.kt | 2 +- .../home/component/AlarmSortDropDownMenu.kt | 140 ++++++++++++++++++ feature/home/src/main/res/values/strings.xml | 4 + 5 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 core/designsystem/src/main/res/drawable/ic_check_border_lined.xml create mode 100644 core/designsystem/src/main/res/drawable/ic_filter.xml create mode 100644 feature/home/src/main/java/com/yapp/home/component/AlarmSortDropDownMenu.kt diff --git a/core/designsystem/src/main/res/drawable/ic_check_border_lined.xml b/core/designsystem/src/main/res/drawable/ic_check_border_lined.xml new file mode 100644 index 00000000..eaa1bbcd --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_check_border_lined.xml @@ -0,0 +1,9 @@ + + + diff --git a/core/designsystem/src/main/res/drawable/ic_filter.xml b/core/designsystem/src/main/res/drawable/ic_filter.xml new file mode 100644 index 00000000..8b727726 --- /dev/null +++ b/core/designsystem/src/main/res/drawable/ic_filter.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/ui/src/main/java/com/yapp/ui/component/checkbox/OrbitCheckBox.kt b/core/ui/src/main/java/com/yapp/ui/component/checkbox/OrbitCheckBox.kt index 3150b69d..dfdb202a 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/checkbox/OrbitCheckBox.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/checkbox/OrbitCheckBox.kt @@ -42,7 +42,7 @@ fun OrbitCheckBox( contentAlignment = Alignment.Center, ) { Icon( - painter = painterResource(core.designsystem.R.drawable.ic_check), + painter = painterResource(core.designsystem.R.drawable.ic_check_border_lined), contentDescription = "IC_CHECK", tint = OrbitTheme.colors.gray_700, ) diff --git a/feature/home/src/main/java/com/yapp/home/component/AlarmSortDropDownMenu.kt b/feature/home/src/main/java/com/yapp/home/component/AlarmSortDropDownMenu.kt new file mode 100644 index 00000000..56c3cad6 --- /dev/null +++ b/feature/home/src/main/java/com/yapp/home/component/AlarmSortDropDownMenu.kt @@ -0,0 +1,140 @@ +package com.yapp.home.component + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ripple.RippleAlpha +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.LocalRippleConfiguration +import androidx.compose.material3.RippleConfiguration +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.ripple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.remember +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.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.home.HomeContract +import feature.home.R + +@Composable +internal fun AlarmSortDropDownMenu( + modifier: Modifier = Modifier, + expanded: Boolean, + sortOrder: HomeContract.AlarmSortOrder, + onDismissRequest: () -> Unit, + onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit, +) { + DropdownMenu( + modifier = modifier.padding(horizontal = 8.dp), + expanded = expanded, + onDismissRequest = onDismissRequest, + containerColor = OrbitTheme.colors.gray_700, + shape = RoundedCornerShape(16.dp), + border = BorderStroke(1.dp, OrbitTheme.colors.gray_600), + ) { + AlarmSortDropDownMenuItem( + text = stringResource(id = R.string.alarm_list_bottom_sheet_menu_sort_default), + checked = sortOrder == HomeContract.AlarmSortOrder.DEFAULT, + onClick = { + onSetSortOrder(HomeContract.AlarmSortOrder.DEFAULT) + }, + ) + AlarmSortDropDownMenuItem( + text = stringResource(id = R.string.alarm_list_bottom_sheet_menu_sort_activation), + checked = sortOrder == HomeContract.AlarmSortOrder.ACTIVATION, + onClick = { + onSetSortOrder(HomeContract.AlarmSortOrder.ACTIVATION) + }, + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun AlarmSortDropDownMenuItem( + text: String, + checked: Boolean, + onClick: () -> Unit, +) { + val interactionSource = remember { MutableInteractionSource() } + + CompositionLocalProvider( + LocalRippleConfiguration provides RippleConfiguration( + rippleAlpha = RippleAlpha( + pressedAlpha = 1f, + focusedAlpha = 1f, + hoveredAlpha = 1f, + draggedAlpha = 1f, + ), + ), + ) { + Surface( + modifier = Modifier + .width(162.dp) + .clip(RoundedCornerShape(12.dp)) + .clickable( + interactionSource = interactionSource, + indication = ripple( + bounded = false, + color = OrbitTheme.colors.gray_600, + ), + onClick = onClick, + ), + color = OrbitTheme.colors.gray_700, + shape = RoundedCornerShape(12.dp), + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Text( + text = text, + style = OrbitTheme.typography.body1SemiBold, + color = OrbitTheme.colors.white, + ) + + if (checked) { + Icon( + modifier = Modifier.size(20.dp), + painter = painterResource(id = core.designsystem.R.drawable.ic_check), + contentDescription = "Icon", + tint = OrbitTheme.colors.white, + ) + } + } + } + } +} + +@Preview +@Composable +fun AlarmSortDropDownMenuPreview() { + OrbitTheme { + AlarmSortDropDownMenu( + expanded = true, + sortOrder = HomeContract.AlarmSortOrder.DEFAULT, + onDismissRequest = {}, + onSetSortOrder = {}, + ) + } +} diff --git a/feature/home/src/main/res/values/strings.xml b/feature/home/src/main/res/values/strings.xml index 07b2869c..cfe4c73c 100644 --- a/feature/home/src/main/res/values/strings.xml +++ b/feature/home/src/main/res/values/strings.xml @@ -55,6 +55,10 @@ 알람 편집 + 정렬 + + 기본 + 켜진 알람 우선 전체 선택 %d개 삭제 From 9609b710b4a7e1463fd05a402055c90971544e04 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 3 Mar 2025 23:28:52 +0900 Subject: [PATCH 098/210] =?UTF-8?q?[FEAT/#188]=20=EC=A0=95=EB=A0=AC=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=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 --- .../main/java/com/yapp/home/HomeContract.kt | 19 +++++++- .../src/main/java/com/yapp/home/HomeScreen.kt | 41 +++++++----------- .../main/java/com/yapp/home/HomeViewModel.kt | 38 ++++++++++++++-- .../home/component/AlarmListDropDownMenu.kt | 10 +++++ .../bottomsheet/AlarmListBottomSheet.kt | 43 ++++++++++++++++--- 5 files changed, 114 insertions(+), 37 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/home/HomeContract.kt b/feature/home/src/main/java/com/yapp/home/HomeContract.kt index d1976d2a..ab55314f 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeContract.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeContract.kt @@ -12,6 +12,7 @@ sealed class HomeContract { val alarms: List = emptyList(), val lastAddedAlarmIndex: Int? = null, val dropdownMenuExpanded: Boolean = false, + val sortDropDownMenuExpanded: Boolean = false, val selectedAlarmIds: Set = emptySet(), val isSelectionMode: Boolean = false, val isDeleteDialogVisible: Boolean = false, @@ -25,17 +26,27 @@ sealed class HomeContract { val name: String = "", val activeItemMenu: Long? = null, val activeItemMenuPosition: Pair? = null, + val sortOrder: AlarmSortOrder = AlarmSortOrder.DEFAULT, ) : UiState { val isAllSelected: Boolean get() = alarms.isNotEmpty() && selectedAlarmIds.size == alarms.size + val hasActivatedAlarm: Boolean get() = alarms.any { it.isAlarmActive } + + val sortedAlarms: List + get() = when (sortOrder) { + AlarmSortOrder.DEFAULT -> alarms + AlarmSortOrder.ACTIVATION -> alarms.sortedByDescending { it.isAlarmActive } + } } sealed class Action { data object NavigateToAlarmCreation : Action() data object ToggleMultiSelectionMode : Action() - data object ToggleDropdownMenuVisibility : Action() + data object ShowDropDownMenu : Action() + data object ShowSortDropDownMenu : Action() + data object HideDropDownMenu : Action() data class ToggleAlarmSelection(val alarmId: Long) : Action() data class ToggleAlarmActivation(val alarmId: Long) : Action() data class SwipeToDeleteAlarm(val id: Long) : Action() @@ -57,6 +68,7 @@ sealed class HomeContract { data object NavigateToSetting : Action() data class ShowItemMenu(val alarmId: Long, val x: Float, val y: Float) : Action() data object HideItemMenu : Action() + data class SetSortOrder(val sortOrder: AlarmSortOrder) : Action() } sealed class SideEffect : com.yapp.ui.base.SideEffect { @@ -76,4 +88,9 @@ sealed class HomeContract { val onAction: () -> Unit, ) : SideEffect() } + + enum class AlarmSortOrder { + DEFAULT, + ACTIVATION, + } } diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt index c356a488..5ed4412f 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt @@ -57,7 +57,6 @@ import androidx.compose.ui.platform.LocalDensity 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 androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp @@ -306,8 +305,10 @@ private fun HomeContent( }, ) { AlarmListBottomSheet( - alarms = state.alarms, + alarms = state.sortedAlarms, menuExpanded = state.dropdownMenuExpanded, + sortDropDownMenuExpanded = state.sortDropDownMenuExpanded, + sortOrder = state.sortOrder, isAllSelected = state.isAllSelected, isSelectionMode = state.isSelectionMode, selectedAlarmIds = state.selectedAlarmIds, @@ -323,7 +324,11 @@ private fun HomeContent( eventDispatcher(HomeContract.Action.NavigateToAlarmCreation) }, onClickMore = { - eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility) + if (state.dropdownMenuExpanded || state.sortDropDownMenuExpanded) { + eventDispatcher(HomeContract.Action.HideDropDownMenu) + } else { + eventDispatcher(HomeContract.Action.ShowDropDownMenu) + } }, onClickCheckAll = { eventDispatcher(HomeContract.Action.ToggleAllAlarmSelection) @@ -334,8 +339,14 @@ private fun HomeContent( onClickEdit = { eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode) }, + onClickSort = { + eventDispatcher(HomeContract.Action.ShowSortDropDownMenu) + }, + onSetSortOrder = { sortOrder -> + eventDispatcher(HomeContract.Action.SetSortOrder(sortOrder)) + }, onDismissRequest = { - eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility) + eventDispatcher(HomeContract.Action.HideDropDownMenu) }, onToggleSelect = { alarmId -> eventDispatcher(HomeContract.Action.ToggleAlarmSelection(alarmId)) @@ -896,25 +907,3 @@ private fun AlarmWithMenu( } } } - -@Preview( - showBackground = true, - backgroundColor = 0xFF000000, -) -@Composable -fun HomeScreenPreview() { - OrbitTheme { - HomeScreen( - stateProvider = { - HomeContract.State().copy( - initialLoading = false, - alarms = listOf( - Alarm(), - ), - activeItemMenu = 1, - ) - }, - eventDispatcher = {}, - ) - } -} diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index 5350f1e1..67d3ee67 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -43,7 +43,9 @@ class HomeViewModel @Inject constructor( when (action) { HomeContract.Action.NavigateToAlarmCreation -> navigateToAlarmCreation() HomeContract.Action.ToggleMultiSelectionMode -> toggleMultiSelectionMode() - HomeContract.Action.ToggleDropdownMenuVisibility -> toggleDropdownMenuVisibility() + HomeContract.Action.ShowDropDownMenu -> showDropDownMenu() + HomeContract.Action.ShowSortDropDownMenu -> showSortDropDownMenu() + HomeContract.Action.HideDropDownMenu -> hideDropDownMenu() is HomeContract.Action.ToggleAlarmSelection -> toggleAlarmSelection(action.alarmId) HomeContract.Action.ToggleAllAlarmSelection -> toggleAllAlarmSelection() is HomeContract.Action.ToggleAlarmActivation -> toggleAlarmActivation(action.alarmId) @@ -65,6 +67,7 @@ class HomeViewModel @Inject constructor( HomeContract.Action.NavigateToSetting -> navigateToSetting() is HomeContract.Action.ShowItemMenu -> showItemMenu(action.alarmId, action.x, action.y) HomeContract.Action.HideItemMenu -> hideItemMenu() + is HomeContract.Action.SetSortOrder -> setSortOrder(action.sortOrder) } } @@ -113,8 +116,26 @@ class HomeViewModel @Inject constructor( } } - private fun toggleDropdownMenuVisibility() { - updateState { copy(dropdownMenuExpanded = !currentState.dropdownMenuExpanded) } + private fun showDropDownMenu() { + updateState { copy(dropdownMenuExpanded = true) } + } + + private fun showSortDropDownMenu() { + updateState { + copy( + dropdownMenuExpanded = false, + sortDropDownMenuExpanded = true, + ) + } + } + + private fun hideDropDownMenu() { + updateState { + copy( + dropdownMenuExpanded = false, + sortDropDownMenuExpanded = false, + ) + } } private fun toggleAlarmSelection(alarmId: Long) { @@ -177,6 +198,12 @@ class HomeViewModel @Inject constructor( private fun confirmDeletion() { deleteAlarms(currentState.selectedAlarmIds) + updateState { + copy( + selectedAlarmIds = emptySet(), + isDeleteDialogVisible = false, + ) + } } private fun showNoActivatedAlarmDialog() { @@ -454,4 +481,9 @@ class HomeViewModel @Inject constructor( ) } } + + private fun setSortOrder(sortOrder: HomeContract.AlarmSortOrder) { + updateState { copy(sortOrder = sortOrder) } + hideDropDownMenu() + } } diff --git a/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt b/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt index 60ae8666..ed262d7c 100644 --- a/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt +++ b/feature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt @@ -46,6 +46,7 @@ internal fun AlarmListDropDownMenu( expanded: Boolean, onDismissRequest: () -> Unit, onClickEdit: () -> Unit, + onClickSort: () -> Unit, ) { DropdownMenu( modifier = modifier.padding(horizontal = 8.dp), @@ -61,6 +62,12 @@ internal fun AlarmListDropDownMenu( ) { onClickEdit() } + AlarmListDropDownMenuItem( + text = stringResource(id = R.string.alarm_list_bottom_sheet_menu_sort), + iconRes = core.designsystem.R.drawable.ic_filter, + ) { + onClickSort() + } } } @@ -143,6 +150,9 @@ private fun AlarmListDropDownMenuPreview() { onClickEdit = { Log.d("AlarmListDropDownMenu", "Edit Clicked") }, + onClickSort = { + Log.d("AlarmListDropDownMenu", "Sort Clicked") + }, ) } } diff --git a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt index a9d1b4c4..5f956a8e 100644 --- a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt +++ b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt @@ -50,7 +50,9 @@ import androidx.compose.ui.unit.dp import com.yapp.alarm.component.AlarmListItem import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.Alarm +import com.yapp.home.HomeContract import com.yapp.home.component.AlarmListDropDownMenu +import com.yapp.home.component.AlarmSortDropDownMenu import com.yapp.ui.component.checkbox.OrbitCheckBox import feature.home.R import kotlinx.coroutines.launch @@ -64,6 +66,8 @@ enum class BottomSheetExpandState { internal fun AlarmListBottomSheet( alarms: List, menuExpanded: Boolean = false, + sortDropDownMenuExpanded: Boolean = false, + sortOrder: HomeContract.AlarmSortOrder, isAllSelected: Boolean, isSelectionMode: Boolean, selectedAlarmIds: Set, @@ -76,6 +80,8 @@ internal fun AlarmListBottomSheet( onClickCheckAll: () -> Unit, onClickClose: () -> Unit, onClickEdit: () -> Unit, + onClickSort: () -> Unit, + onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit, onDismissRequest: () -> Unit, onToggleSelect: (Long) -> Unit, onToggleActive: (Long) -> Unit, @@ -124,7 +130,9 @@ internal fun AlarmListBottomSheet( AlarmBottomSheetContent( modifier = Modifier.nestedScroll(nestedScrollConnection), alarms = alarms, - menuExpanded = menuExpanded, + dropDownMenuExpanded = menuExpanded, + sortDropDownMenuExpanded = sortDropDownMenuExpanded, + sortOrder = sortOrder, isSelectionMode = isSelectionMode, isAllSelected = isAllSelected, selectedAlarmIds = selectedAlarmIds, @@ -136,6 +144,8 @@ internal fun AlarmListBottomSheet( onClickCheckAll = onClickCheckAll, onClickClose = onClickClose, onClickEdit = onClickEdit, + onClickSort = onClickSort, + onSetSortOrder = onSetSortOrder, expandedType = expandedType, onDismissRequest = onDismissRequest, onToggleSelect = onToggleSelect, @@ -161,7 +171,9 @@ internal fun AlarmListBottomSheet( internal fun AlarmBottomSheetContent( modifier: Modifier = Modifier, alarms: List, - menuExpanded: Boolean, + dropDownMenuExpanded: Boolean, + sortDropDownMenuExpanded: Boolean, + sortOrder: HomeContract.AlarmSortOrder, isSelectionMode: Boolean, isAllSelected: Boolean, selectedAlarmIds: Set, @@ -173,6 +185,8 @@ internal fun AlarmBottomSheetContent( onClickCheckAll: () -> Unit, onClickClose: () -> Unit, onClickEdit: () -> Unit, + onClickSort: () -> Unit, + onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit, onDismissRequest: () -> Unit, onToggleSelect: (Long) -> Unit, onToggleActive: (Long) -> Unit, @@ -203,21 +217,22 @@ internal fun AlarmBottomSheetContent( ) } else { AlarmListTopBar( - menuExpanded = menuExpanded, + menuExpanded = dropDownMenuExpanded, + sortDropDownMenuExpanded = sortDropDownMenuExpanded, + sortOrder = sortOrder, onClickAdd = onClickAdd, onClickMore = onClickMore, onDismissRequest = onDismissRequest, onClickEdit = onClickEdit, + onClickSort = onClickSort, + onSetSortOrder = onSetSortOrder, ) } LazyColumn( state = listState, ) { - itemsIndexed( - items = alarms, - key = { _, alarm -> alarm.id }, - ) { index, alarm -> + itemsIndexed(alarms) { index, alarm -> AlarmListItem( id = alarm.id, repeatDays = alarm.repeatDays, @@ -257,10 +272,14 @@ internal fun AlarmBottomSheetContent( private fun AlarmListTopBar( modifier: Modifier = Modifier, menuExpanded: Boolean, + sortDropDownMenuExpanded: Boolean, + sortOrder: HomeContract.AlarmSortOrder, onClickAdd: () -> Unit, onClickMore: () -> Unit, onDismissRequest: () -> Unit, onClickEdit: () -> Unit, + onClickSort: () -> Unit, + onSetSortOrder: (HomeContract.AlarmSortOrder) -> Unit, ) { Row( modifier = modifier @@ -296,6 +315,16 @@ private fun AlarmListTopBar( expanded = menuExpanded, onDismissRequest = onDismissRequest, onClickEdit = onClickEdit, + onClickSort = onClickSort, + ) + } + + if (sortDropDownMenuExpanded) { + AlarmSortDropDownMenu( + expanded = sortDropDownMenuExpanded, + sortOrder = sortOrder, + onDismissRequest = onDismissRequest, + onSetSortOrder = onSetSortOrder, ) } } From a6c3051dc36b895592dc42512ec3847dfe53c021 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 4 Mar 2025 12:09:32 +0900 Subject: [PATCH 099/210] =?UTF-8?q?[FEAT/#188]=20LazyColumn=EC=9D=98=20key?= =?UTF-8?q?=20=EA=B0=92=EC=9D=84=20alarm=EC=9D=98=20id=EB=A1=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/home/component/bottomsheet/AlarmListBottomSheet.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt index 5f956a8e..df1d39b3 100644 --- a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt +++ b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt @@ -232,7 +232,10 @@ internal fun AlarmBottomSheetContent( LazyColumn( state = listState, ) { - itemsIndexed(alarms) { index, alarm -> + itemsIndexed( + items = alarms, + key = { _, alarm -> alarm.id }, + ) { index, alarm -> AlarmListItem( id = alarm.id, repeatDays = alarm.repeatDays, From 451b92ff6048cb9f75278154378c076ff21b3079 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 4 Mar 2025 12:34:16 +0900 Subject: [PATCH 100/210] =?UTF-8?q?[UI/#188]=20AlarmListItem=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC=20=EC=8B=9C=20=EC=95=A0=EB=8B=88=EB=A9=94=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/alarm/component/AlarmListItem.kt | 3 ++- .../component/bottomsheet/AlarmListBottomSheet.kt | 14 +++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt index 467fdfdd..8976a147 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt @@ -116,12 +116,13 @@ internal fun AlarmListItem( ) { SwipeToDismissBox( state = dismissState, + modifier = modifier, enableDismissFromStartToEnd = false, enableDismissFromEndToStart = swipeable, gesturesEnabled = swipeable, backgroundContent = { Box( - modifier = modifier + modifier = Modifier .fillMaxSize() .background(OrbitTheme.colors.gray_500) .onGloballyPositioned { diff --git a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt index df1d39b3..20b00907 100644 --- a/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt +++ b/feature/home/src/main/java/com/yapp/home/component/bottomsheet/AlarmListBottomSheet.kt @@ -1,6 +1,7 @@ package com.yapp.home.component.bottomsheet import androidx.annotation.DrawableRes +import androidx.compose.animation.core.tween import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -237,6 +238,12 @@ internal fun AlarmBottomSheetContent( key = { _, alarm -> alarm.id }, ) { index, alarm -> AlarmListItem( + modifier = Modifier + .animateItem( + fadeInSpec = null, + placementSpec = tween(durationMillis = 300), + fadeOutSpec = null, + ), id = alarm.id, repeatDays = alarm.repeatDays, isHolidayAlarmOff = alarm.isHolidayAlarmOff, @@ -259,7 +266,12 @@ internal fun AlarmBottomSheetContent( .padding(horizontal = 24.dp) .fillMaxWidth() .height(1.dp) - .background(OrbitTheme.colors.gray_800), + .background(OrbitTheme.colors.gray_800) + .animateItem( + fadeInSpec = null, + placementSpec = tween(durationMillis = 300), + fadeOutSpec = null, + ), ) } } From a13de458a4cb8a6ab625cd51204df5a350b59f6f Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 5 Mar 2025 00:18:06 +0900 Subject: [PATCH 101/210] =?UTF-8?q?[UI/#188]=20Hold=20To=20Delete=20?= =?UTF-8?q?=EC=8B=9C=20AlarmListItem=EC=9D=98=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=ED=8C=A8=EB=94=A9=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/alarm/component/AlarmListItem.kt | 2 +- .../src/main/java/com/yapp/home/HomeScreen.kt | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt index 8976a147..a590bd8e 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt @@ -153,7 +153,7 @@ internal fun AlarmListItem( }, ) { Row( - modifier = modifier + modifier = Modifier .fillMaxWidth() .background( if (selected) OrbitTheme.colors.gray_800 else OrbitTheme.colors.gray_900, diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt index 5ed4412f..270922a1 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt @@ -57,6 +57,7 @@ import androidx.compose.ui.platform.LocalDensity 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 androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp @@ -907,3 +908,27 @@ private fun AlarmWithMenu( } } } + +@Preview( + showBackground = true, + backgroundColor = 0xFF000000, +) +@Composable +fun HomeScreenPreview() { + OrbitTheme { + HomeScreen( + stateProvider = { + HomeContract.State() + .copy( + initialLoading = false, + alarms = listOf( + Alarm(), + ), + activeItemMenu = 0L, + activeItemMenuPosition = Pair(0f, 0f), + ) + }, + eventDispatcher = {}, + ) + } +} From f81b3e4a5e0d544d3e9c61e95d6ae9e5495fcff3 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 5 Mar 2025 11:07:17 +0900 Subject: [PATCH 102/210] =?UTF-8?q?[UI/#190]=20ic=5Fcheck=20=EC=97=90?= =?UTF-8?q?=EC=85=8B=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/designsystem/src/main/res/drawable/ic_check.xml | 12 ++++++------ .../src/main/res/drawable/ic_check_border_lined.xml | 9 --------- .../designsystem/src/main/res/drawable/ic_filter.xml | 10 +++++----- .../com/yapp/ui/component/checkbox/OrbitCheckBox.kt | 2 +- .../java/com/yapp/alarm/component/AlarmCheckItem.kt | 1 - 5 files changed, 12 insertions(+), 22 deletions(-) delete mode 100644 core/designsystem/src/main/res/drawable/ic_check_border_lined.xml diff --git a/core/designsystem/src/main/res/drawable/ic_check.xml b/core/designsystem/src/main/res/drawable/ic_check.xml index eaa1bbcd..1412ec7b 100644 --- a/core/designsystem/src/main/res/drawable/ic_check.xml +++ b/core/designsystem/src/main/res/drawable/ic_check.xml @@ -1,9 +1,9 @@ + android:width="21dp" + android:height="20dp" + android:viewportWidth="21" + android:viewportHeight="20"> + android:pathData="M16.503,5.244C16.828,5.57 16.828,6.097 16.503,6.423L8.864,14.061C8.707,14.218 8.495,14.306 8.274,14.306C8.053,14.306 7.841,14.218 7.685,14.061L4.213,10.589C3.887,10.264 3.887,9.736 4.213,9.411C4.538,9.085 5.066,9.085 5.391,9.411L8.274,12.294L15.324,5.244C15.649,4.919 16.177,4.919 16.503,5.244Z" + android:fillColor="#ffffff"/> diff --git a/core/designsystem/src/main/res/drawable/ic_check_border_lined.xml b/core/designsystem/src/main/res/drawable/ic_check_border_lined.xml deleted file mode 100644 index eaa1bbcd..00000000 --- a/core/designsystem/src/main/res/drawable/ic_check_border_lined.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/core/designsystem/src/main/res/drawable/ic_filter.xml b/core/designsystem/src/main/res/drawable/ic_filter.xml index 8b727726..9a284caa 100644 --- a/core/designsystem/src/main/res/drawable/ic_filter.xml +++ b/core/designsystem/src/main/res/drawable/ic_filter.xml @@ -1,10 +1,10 @@ + android:width="20dp" + android:height="20dp" + android:viewportWidth="20" + android:viewportHeight="20"> diff --git a/core/ui/src/main/java/com/yapp/ui/component/checkbox/OrbitCheckBox.kt b/core/ui/src/main/java/com/yapp/ui/component/checkbox/OrbitCheckBox.kt index dfdb202a..3150b69d 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/checkbox/OrbitCheckBox.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/checkbox/OrbitCheckBox.kt @@ -42,7 +42,7 @@ fun OrbitCheckBox( contentAlignment = Alignment.Center, ) { Icon( - painter = painterResource(core.designsystem.R.drawable.ic_check_border_lined), + painter = painterResource(core.designsystem.R.drawable.ic_check), contentDescription = "IC_CHECK", tint = OrbitTheme.colors.gray_700, ) diff --git a/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt b/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt index d3aaa522..900d7e96 100644 --- a/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt +++ b/feature/home/src/main/java/com/yapp/alarm/component/AlarmCheckItem.kt @@ -38,7 +38,6 @@ internal fun AlarmCheckItem( text = label, style = OrbitTheme.typography.label1Medium, color = if (isPressed) OrbitTheme.colors.main else OrbitTheme.colors.gray_400, - modifier = Modifier.padding(start = 4.dp), textAlign = TextAlign.Center, ) } From a5e442aec6e8f6dedfc56eecf34e3c29ff59fa90 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 6 Mar 2025 11:13:24 +0900 Subject: [PATCH 103/210] =?UTF-8?q?[REFACTOR/#191]=20ServiceHandler?= =?UTF-8?q?=EB=A5=BC=20CoroutineScope=EB=A1=9C=20=EB=8C=80=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/alarm/services/AlarmService.kt | 138 ++++++++---------- 1 file changed, 57 insertions(+), 81 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt index 8d620af4..24d5a821 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt @@ -10,12 +10,7 @@ import android.graphics.BitmapFactory import android.media.RingtoneManager import android.net.Uri import android.os.Build -import android.os.Handler -import android.os.HandlerThread import android.os.IBinder -import android.os.Looper -import android.os.Message -import android.os.Process.THREAD_PRIORITY_BACKGROUND import android.os.VibrationEffect import android.os.Vibrator import android.os.VibratorManager @@ -35,9 +30,10 @@ import com.yapp.media.sound.SoundPlayer import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking import java.time.LocalDate import java.time.format.DateTimeFormatter import javax.inject.Inject @@ -45,9 +41,6 @@ import javax.inject.Inject @AndroidEntryPoint class AlarmService : Service() { - private var serviceLooper: Looper? = null - private var serviceHandler: ServiceHandler? = null - @Inject lateinit var alarmUseCase: AlarmUseCase @@ -62,84 +55,17 @@ class AlarmService : Service() { @Inject lateinit var userPreferences: UserPreferences - private inner class ServiceHandler(looper: Looper) : Handler(looper) { - override fun handleMessage(message: Message) { - super.handleMessage(message) - - val bundle = message.data - val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - bundle?.getParcelable(AlarmConstants.EXTRA_ALARM, Alarm::class.java) - } else { - @Suppress("DEPRECATION") - bundle?.getParcelable(AlarmConstants.EXTRA_ALARM) - } - - if (alarm == null) { - Log.e("AlarmService", "Failed to retrieve Alarm object from intent") - return - } - - val notificationId = alarm.id - val isDismiss = bundle.getBoolean(AlarmConstants.EXTRA_IS_DISMISS, false) - val isOneTimeAlarm = alarm.repeatDays == 0 - - Log.d("AlarmService", "AlarmService started for alarm: $alarm") - - // 반복 요일 알람 시, 다음 주 동일 요일 알람 예약 - if (!isOneTimeAlarm && bundle.containsKey(AlarmConstants.EXTRA_ALARM_DAY)) { - bundle.getString(AlarmConstants.EXTRA_ALARM_DAY) - ?.let { AlarmDay.valueOf(it) } - ?.let { alarmDay -> - alarmHelper.scheduleWeeklyAlarm(alarm, alarmDay) - } - } - - // 미션 이동 여부 확인 - val shouldNavigateToMission = runBlocking { - val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() - val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) - fortuneDate != todayDate - } - Log.d("AlarmService", "shouldNavigateToMission: $shouldNavigateToMission") - - // 알람 해제 여부에 따른 처리 - when (isDismiss) { - true -> stopSelf() - false -> { - startForeground( - notificationId.toInt(), - createNotification(alarm, shouldNavigateToMission), - ) - if (alarm.isVibrationEnabled) startVibration() - if (alarm.isSoundEnabled) startSound(alarm.soundUri, alarm.soundVolume) - } - } - - if (isOneTimeAlarm) { - turnOffAlarm(alarmId = notificationId) - } - } - } + private val serviceScope = CoroutineScope(Dispatchers.IO + SupervisorJob()) override fun onCreate() { super.onCreate() - createNotificationChannel() - setupVibrator() - - HandlerThread("AlarmServiceThread", THREAD_PRIORITY_BACKGROUND).apply { - start() - serviceLooper = looper - serviceHandler = ServiceHandler(looper) - } } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - serviceHandler?.obtainMessage()?.also { message -> - message.arg1 = startId - message.data = intent?.extras - serviceHandler?.sendMessage(message) + serviceScope.launch { + handleIntent(intent ?: return@launch) } return START_NOT_STICKY } @@ -149,9 +75,59 @@ class AlarmService : Service() { override fun onDestroy() { stopVibration() stopSound() - // remove notification stopForeground(STOP_FOREGROUND_REMOVE) - stopSelf() + serviceScope.cancel() + super.onDestroy() + } + + private suspend fun handleIntent(intent: Intent) { + val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM, Alarm::class.java) + } else { + @Suppress("DEPRECATION") + intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM) + } + + if (alarm == null) { + Log.e("AlarmService", "Failed to retrieve Alarm object from intent") + return + } + + val notificationId = alarm.id + val isDismiss = intent.getBooleanExtra(AlarmConstants.EXTRA_IS_DISMISS, false) + val isOneTimeAlarm = alarm.repeatDays == 0 + + Log.d("AlarmService", "AlarmService started for alarm: $alarm") + + // 반복 요일 알람 시, 다음 주 동일 요일 알람 예약 + if (!isOneTimeAlarm) { + intent.getStringExtra(AlarmConstants.EXTRA_ALARM_DAY)?.let { + alarmHelper.scheduleWeeklyAlarm(alarm, AlarmDay.valueOf(it)) + } + } + + // 알람 해제 여부에 따른 처리 + when (isDismiss) { + true -> stopSelf() + false -> { + startForeground( + notificationId.toInt(), + createNotification(alarm, shouldNavigateToMission()), + ) + if (alarm.isVibrationEnabled) startVibration() + if (alarm.isSoundEnabled) startSound(alarm.soundUri, alarm.soundVolume) + } + } + + if (isOneTimeAlarm) { + turnOffAlarm(alarmId = notificationId) + } + } + + private suspend fun shouldNavigateToMission(): Boolean { + val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + return fortuneDate != todayDate } private fun createNotification(alarm: Alarm, shouldNavigateToMission: Boolean): Notification { From 083e5a3d438f6c42787b301548d0f9d1e90dc02c Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Fri, 7 Mar 2025 18:31:08 +0900 Subject: [PATCH 104/210] =?UTF-8?q?[REFACTOR/#185]=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=B9=B4=EB=93=9C=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(=EC=83=9D=EB=85=84=EC=9B=94=EC=9D=BC+?= =?UTF-8?q?=ED=83=9C=EC=96=B4=EB=82=9C=20=EC=8B=9C=EA=B0=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/setting/SettingContract.kt | 5 +++++ .../src/main/java/com/yapp/setting/SettingScreen.kt | 3 ++- .../src/main/java/com/yapp/setting/SettingViewModel.kt | 1 + .../main/java/com/yapp/setting/component/UserInfoCard.kt | 8 +++++--- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt index 3faa1584..fb4b0911 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt @@ -29,6 +29,11 @@ sealed class SettingContract { return "$birthType $year $month $day" } + val timeOfBirthFormatted: String + get() = timeOfBirth.takeIf { it.length >= 5 }?.let { + "${it.substring(0, 2)}시 ${it.substring(3, 5)}분" + } ?: " " + val isActionEnabled: Boolean get() = isNameValid && (isTimeUnknown || (timeOfBirth.length == 5 && isTimeValid)) && selectedGender != null } diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt index 3df1fc2a..eef96d63 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt @@ -86,7 +86,8 @@ fun SettingScreen( UserInfoCard( name = state.name, gender = state.selectedGender ?: "", - birth = state.birthDate, + birth = state.birthDateFormatted, + timeOfBirth = state.timeOfBirthFormatted, modifier = Modifier .padding(horizontal = 24.dp) .customClickable( diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt index 242f9b3c..99464654 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt @@ -38,6 +38,7 @@ class SettingViewModel @Inject constructor( name = user.name, birthDate = user.birthDate, selectedGender = user.gender, + timeOfBirth = user.birthTime.toString(), ) } } diff --git a/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt b/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt index 65eb37cc..edf2a83e 100644 --- a/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt +++ b/feature/setting/src/main/java/com/yapp/setting/component/UserInfoCard.kt @@ -26,6 +26,7 @@ fun UserInfoCard( name: String, gender: String, birth: String, + timeOfBirth: String, modifier: Modifier = Modifier, ) { Box( @@ -40,7 +41,7 @@ fun UserInfoCard( Column { UserNameAndGenderText(name = name, gender = gender) Spacer(modifier = Modifier.height(4.dp)) - UserBirthDayText(birth = birth) + UserBirthDayText(birth = birth, timeOfBirth = timeOfBirth) } Icon( painter = painterResource(id = core.designsystem.R.drawable.ic_arrow_right), @@ -78,9 +79,9 @@ fun UserNameAndGenderText(name: String, gender: String) { } @Composable -fun UserBirthDayText(birth: String) { +fun UserBirthDayText(birth: String, timeOfBirth: String) { Text( - text = birth, + text = "$birth $timeOfBirth", style = OrbitTheme.typography.body1Regular, color = OrbitTheme.colors.gray_50, ) @@ -93,5 +94,6 @@ fun UserInfoCardPreview() { name = "강문수", gender = "남", birth = "1999.01.01", + timeOfBirth = "20:00", ) } From bffdc734e26e6f7f10a9547195d09534640b2688 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Fri, 7 Mar 2025 18:31:26 +0900 Subject: [PATCH 105/210] =?UTF-8?q?[REFACTOR/#185]=20TextField=20=ED=85=8C?= =?UTF-8?q?=EB=91=90=EB=A6=AC=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/component/textfield/OrbitTextField.kt | 30 +++++++++++-------- .../com/yapp/setting/EditProfileScreen.kt | 5 ++++ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt index 829da49e..b914f528 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt @@ -143,27 +143,31 @@ private fun TextFieldContainer( textAlign: TextAlign, enabled: Boolean, ) { + val outerBorderColor = when { + isFocused && !isValid -> OrbitTheme.colors.alert.copy(alpha = 0.2f) + isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f) + !isValid -> OrbitTheme.colors.alert.copy(alpha = 0.2f) + else -> Color.Transparent + } + + val innerBorderColor = when { + isFocused && !isValid -> OrbitTheme.colors.alert + isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f) + !isValid -> OrbitTheme.colors.alert + else -> OrbitTheme.colors.gray_700 + } + Box( modifier = Modifier .border( width = 3.dp, - color = when { - isValid -> Color.Transparent - isFocused && showWarning -> OrbitTheme.colors.alert.copy(alpha = 0.2f) - isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f) - else -> Color.Transparent - }, + color = outerBorderColor, shape = RoundedCornerShape(18.dp), ) .padding(2.dp) .border( width = 1.dp, - color = when { - isValid -> OrbitTheme.colors.gray_700 - isFocused && showWarning -> OrbitTheme.colors.alert - isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f) - else -> OrbitTheme.colors.gray_700 - }, + color = innerBorderColor, shape = RoundedCornerShape(16.dp), ) .background(OrbitTheme.colors.gray_800, shape = RoundedCornerShape(16.dp)) @@ -232,7 +236,7 @@ private fun TextFieldContainer( }, ) - if (enabled && text.text.isNotEmpty()) { + if (enabled && text.text.isNotEmpty() && isFocused) { Icon( painter = painterResource(id = core.designsystem.R.drawable.ic_circle_delete), contentDescription = "delete", diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt index 4cd76ab6..6df4257a 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -31,6 +32,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview @@ -238,6 +240,9 @@ fun EditProfileScreen( modifier = Modifier .weight(1f), textAlign = TextAlign.Start, + keyboardOptions = KeyboardOptions.Default.copy( + keyboardType = KeyboardType.Number, + ), keyboardActions = KeyboardActions( onDone = { focusManager.clearFocus() From abc2c183c9feb638aa114416c5f4b2b86c0a09c4 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 6 Mar 2025 13:29:34 +0900 Subject: [PATCH 106/210] =?UTF-8?q?[FEAT/#192]=20=EA=B3=B5=ED=9C=B4?= =?UTF-8?q?=EC=9D=BC=EC=9D=B4=20=EC=95=84=EB=8B=8C=20=EB=8B=A4=EC=9D=8C=20?= =?UTF-8?q?=EC=A3=BC=20=EC=9A=94=EC=9D=BC=EB=A1=9C=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=98=88=EC=95=BD=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 --- .../java/com/yapp/alarm/AlarmConstants.kt | 7 +++++ .../main/java/com/yapp/alarm/AlarmHelper.kt | 30 +++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt index a3cc255c..887e902c 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt @@ -15,4 +15,11 @@ object AlarmConstants { const val EXTRA_IS_DISMISS = "com.yapp.orbit.EXTRA_IS_DISMISS" const val WEEK_INTERVAL_MILLIS: Long = 7 * 24 * 60 * 60 * 1000 + + val HOLIDAYS_2025 = setOf( + "2025-01-01", "2025-01-27", "2025-01-28", "2025-01-29", "2025-01-30", + "2025-03-01", "2025-03-03", "2025-05-05", "2025-05-06", "2025-06-06", + "2025-08-15", "2025-10-03", "2025-10-05", "2025-10-06", "2025-10-07", + "2025-10-08", "2025-10-09", "2025-12-25", + ) } diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt index 66ad1824..98e5cc42 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt @@ -9,8 +9,10 @@ import com.yapp.domain.model.Alarm import com.yapp.domain.model.AlarmDay import com.yapp.domain.model.toAlarmDays import com.yapp.domain.model.toDayOfWeek +import java.time.Instant import java.time.LocalDateTime import java.time.ZoneId +import java.time.format.DateTimeFormatter import javax.inject.Inject class AlarmHelper @Inject constructor( @@ -30,7 +32,9 @@ class AlarmHelper @Inject constructor( } fun scheduleWeeklyAlarm(alarm: Alarm, day: AlarmDay) { - val triggerMillis = getNextAlarmTimeMillis(alarm, day) + AlarmConstants.WEEK_INTERVAL_MILLIS + val initialTriggerMillis = getNextAlarmTimeMillis(alarm, day) + AlarmConstants.WEEK_INTERVAL_MILLIS + val triggerMillis = findNextNonHolidayDate(initialTriggerMillis) + val pendingIntent = createAlarmReceiverPendingIntentForSchedule(app, alarm, day) alarmManager.setExactAndAllowWhileIdle( @@ -38,7 +42,8 @@ class AlarmHelper @Inject constructor( triggerMillis, pendingIntent, ) - Log.d("AlarmHelper", "Scheduled weekly alarm for $day next week at: $triggerMillis") + + Log.d("AlarmHelper", "Scheduled weekly alarm for $day at: $triggerMillis") } fun unScheduleAlarm(alarm: Alarm) { @@ -120,4 +125,25 @@ class AlarmHelper @Inject constructor( return epochMillis } + + private fun findNextNonHolidayDate(initialMillis: Long): Long { + val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + + var adjustedMillis = initialMillis + + while (true) { + val localDate = Instant.ofEpochMilli(adjustedMillis) + .atZone(ZoneId.systemDefault()) + .toLocalDate() + + val dateString = localDate.format(dateFormatter) + + if (!AlarmConstants.HOLIDAYS_2025.contains(dateString)) { + return adjustedMillis // 공휴일이 아니라면 해당 날짜 반환 + } + + // 공휴일이라면 다음 1주 뒤로 이동 + adjustedMillis += AlarmConstants.WEEK_INTERVAL_MILLIS + } + } } From 26d35f76aa091420d30256a0e69b0982ec192a4c Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Fri, 7 Mar 2025 22:40:33 +0900 Subject: [PATCH 107/210] =?UTF-8?q?[REFACTOR/#185]=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=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 --- .../src/main/java/com/yapp/setting/EditProfileViewModel.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt index 0eadb1e4..a5d3adf2 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt @@ -178,7 +178,6 @@ class EditProfileViewModel @Inject constructor( val userId = userPreferences.userIdFlow.firstOrNull() if (userId != null) { fetchUserInfo(userId) - updateState { copy(shouldFetchUserInfo = true) } } } } From 0ffb15b237e39e8f8302da03aea420f345a50319 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Fri, 7 Mar 2025 22:52:30 +0900 Subject: [PATCH 108/210] =?UTF-8?q?[FIX/#192]=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EB=81=8C=20=EC=8B=9C=20=EB=AF=B8=EB=A3=A8=EA=B8=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EC=9D=84=20=ED=86=B5=ED=95=B4=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=ED=96=88=EB=8D=98=20=EC=95=8C=EB=9E=8C=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=ED=95=B4=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/alarm/AlarmConstants.kt | 2 ++ core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt | 9 ++++++++- .../java/com/yapp/alarm/receivers/AlarmReceiver.kt | 10 +++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt index 887e902c..67d359f1 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmConstants.kt @@ -14,6 +14,8 @@ object AlarmConstants { const val EXTRA_IS_SNOOZED = "com.yapp.orbit.EXTRA_IS_SNOOZED" const val EXTRA_IS_DISMISS = "com.yapp.orbit.EXTRA_IS_DISMISS" + const val SNOOZE_ID_OFFSET = 10000 + const val WEEK_INTERVAL_MILLIS: Long = 7 * 24 * 60 * 60 * 1000 val HOLIDAYS_2025 = setOf( diff --git a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt index 98e5cc42..4823278e 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/AlarmHelper.kt @@ -68,12 +68,19 @@ class AlarmHelper @Inject constructor( } } + fun cancelSnoozedAlarm(alarmId: Long) { + val snoozedAlarmId = alarmId + AlarmConstants.SNOOZE_ID_OFFSET + val pendingIntent = createAlarmReceiverPendingIntentForUnSchedule(app, Alarm(id = snoozedAlarmId)) + alarmManager.cancel(pendingIntent) + Log.d("AlarmHelper", "Canceled snoozed alarm with id: $snoozedAlarmId") + } + private fun setRepeatingAlarm(day: AlarmDay, alarm: Alarm) { val alarmReceiverPendingIntent = createAlarmReceiverPendingIntentForSchedule(app, alarm, day) val firstAlarmTriggerMillis = getNextAlarmTimeMillis(alarm, day) - Log.d("AlarmHelper", "Setting repeating alarm at: $firstAlarmTriggerMillis") + Log.d("AlarmHelper", "Setting repeating alarm id: ${alarm.id} at: $firstAlarmTriggerMillis") alarmManager.setExactAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt index 7b59a530..d90d6e32 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt @@ -56,10 +56,12 @@ class AlarmReceiver : BroadcastReceiver() { Log.d("AlarmReceiver", "Alarm Dismissed") val alarmId = intent.getLongExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, -1L) if (alarmId != -1L) { - handleFirstAlarmDismissed(context, alarmId) + handleFirstAlarmDismissed(alarmId) + alarmHelper.cancelSnoozedAlarm(alarmId) } else { Log.e("AlarmReceiver", "알람 ID 수신 실패") } + alarmHelper.cancelSnoozedAlarm(alarmId) context.stopService(alarmServiceIntent) sendBroadCastToCloseAlarmInteractionActivity(context) @@ -94,19 +96,21 @@ class AlarmReceiver : BroadcastReceiver() { hour = if (snoozeDateTime.hour == 0) 12 else if (snoozeDateTime.hour > 12) snoozeDateTime.hour - 12 else snoozeDateTime.hour, minute = snoozeDateTime.minute, second = snoozeDateTime.second, + repeatDays = 0, snoozeCount = newSnoozeCount, + id = alarm.id + AlarmConstants.SNOOZE_ID_OFFSET, ) Log.d( "AlarmReceiver", - "Scheduling snooze alarm: alarmId=${alarm.id}, newTime=${updatedAlarm.hour}:${updatedAlarm.minute}, remaining snoozeCount=$newSnoozeCount", + "Scheduling snooze alarm: alarmId=${updatedAlarm.id}, newTime=${updatedAlarm.hour}:${updatedAlarm.minute}, remaining snoozeCount=$newSnoozeCount", ) context.stopService(Intent(context, AlarmService::class.java)) alarmHelper.scheduleAlarm(updatedAlarm) } - private fun handleFirstAlarmDismissed(context: Context, alarmId: Long) { + private fun handleFirstAlarmDismissed(alarmId: Long) { CoroutineScope(Dispatchers.IO).launch { val existingId = userPreferences.firstDismissedAlarmIdFlow.firstOrNull() if (existingId == null) { From e259b7a524e27b1434a6551aa2613fac4ed890d0 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Fri, 7 Mar 2025 23:00:47 +0900 Subject: [PATCH 109/210] =?UTF-8?q?[FIX/#192]=20=EB=AC=B8=EC=9D=98?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EB=88=84=EB=A5=BC=20?= =?UTF-8?q?=EC=8B=9C=20=EC=B9=B4=EC=B9=B4=EC=98=A4=ED=86=A1=20=ED=94=8C?= =?UTF-8?q?=EB=9F=AC=EC=8A=A4=20=EC=B9=9C=EA=B5=AC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EB=A1=9C=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/setting/SettingScreen.kt | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt index 6bf9a234..17a09f65 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt @@ -1,5 +1,7 @@ package com.yapp.setting +import android.content.Intent +import android.net.Uri import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -13,6 +15,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel @@ -31,6 +34,7 @@ fun SettingRoute( viewModel: SettingViewModel = hiltViewModel(), ) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + val context = LocalContext.current LaunchedEffect(Unit) { viewModel.refreshUserInfo() // 이걸 어찌 할까요 @@ -45,9 +49,18 @@ fun SettingRoute( }, onBackClick = { viewModel.onAction(SettingContract.Action.PreviousStep) }, onInquiryClick = { - viewModel.onAction( - SettingContract.Action.OpenWebView("https://forms.gle/Q6wpKj3YAyS2jxq57"), - ) + val kakaoUrl = "http://pf.kakao.com/_ykqxjn" + val kakaoSchemeUrl = "kakaoplus://plusfriend/home/_ykqxjn" + + val kakaoIntent = Intent(Intent.ACTION_VIEW, Uri.parse(kakaoSchemeUrl)) + + try { + context.startActivity(kakaoIntent) // 카카오톡 앱으로 이동 + } catch (e: Exception) { + viewModel.onAction( + SettingContract.Action.OpenWebView(kakaoUrl), // 앱이 없으면 웹뷰로 열기 + ) + } }, onTermsClick = { viewModel.onAction( From bc3d77df5542a0b1d94bccce6419c5e81efd681e Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Fri, 7 Mar 2025 23:10:21 +0900 Subject: [PATCH 110/210] =?UTF-8?q?[UI/#192]=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=97=90=EC=84=9C=20=EC=B5=9C=EC=B4=88=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EC=A0=95=EB=B3=B4=20=EB=A1=9C=EB=94=A9=20?= =?UTF-8?q?=EC=8B=9C=20=EB=A1=9C=EB=94=A9=20=EC=95=A0=EB=8B=88=EB=A9=94?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/setting/SettingContract.kt | 1 + .../java/com/yapp/setting/SettingScreen.kt | 54 +++++++++++++++++-- .../java/com/yapp/setting/SettingViewModel.kt | 1 + 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt index 7be266f5..9f48dcd6 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt @@ -4,6 +4,7 @@ import com.yapp.ui.base.UiState sealed class SettingContract { data class State( + val initialLoading: Boolean = true, val name: String = "", val initialYear: String = "2000", val initialMonth: String = "01", diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt index 17a09f65..c13877ed 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt @@ -3,6 +3,7 @@ package com.yapp.setting import android.content.Intent import android.net.Uri import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -10,10 +11,12 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview @@ -27,6 +30,7 @@ import com.yapp.setting.component.SettingTopAppBar import com.yapp.setting.component.TableOfContentsText import com.yapp.setting.component.UserInfoCard import com.yapp.setting.component.VersionCodeText +import com.yapp.ui.component.lottie.LottieAnimation import com.yapp.ui.extensions.customClickable @Composable @@ -83,6 +87,33 @@ fun SettingScreen( onInquiryClick: () -> Unit = {}, onTermsClick: () -> Unit = {}, onPrivacyPolicyClick: () -> Unit = {}, +) { + if (state.initialLoading) { + SettingLoadingScreen() + } else { + SettingContent( + name = state.name, + selectedGender = state.selectedGender ?: "", + birthDate = state.birthDateFormatted, + onNavigateToEditProfile = onNavigateToEditProfile, + onBackClick = onBackClick, + onInquiryClick = onInquiryClick, + onTermsClick = onTermsClick, + onPrivacyPolicyClick = onPrivacyPolicyClick, + ) + } +} + +@Composable +private fun SettingContent( + name: String, + selectedGender: String, + birthDate: String, + onNavigateToEditProfile: () -> Unit, + onBackClick: () -> Unit, + onInquiryClick: () -> Unit, + onTermsClick: () -> Unit, + onPrivacyPolicyClick: () -> Unit, ) { Column( modifier = Modifier @@ -98,9 +129,9 @@ fun SettingScreen( ) Spacer(modifier = Modifier.height(12.dp)) UserInfoCard( - name = state.name, - gender = state.selectedGender ?: "", - birth = state.birthDate, + name = name, + gender = selectedGender, + birth = birthDate, modifier = Modifier .padding(horizontal = 24.dp) .customClickable( @@ -156,6 +187,23 @@ fun SettingScreen( } } +@Composable +private fun SettingLoadingScreen() { + Box( + modifier = Modifier + .fillMaxSize() + .background(OrbitTheme.colors.gray_900), + contentAlignment = Alignment.Center, + ) { + LottieAnimation( + modifier = Modifier + .size(70.dp) + .align(Alignment.Center), + resId = core.designsystem.R.raw.star_loading, + ) + } +} + @Composable @Preview fun SettingScreenPreview() { diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt index fbbb768e..f5b3f9d5 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt @@ -86,6 +86,7 @@ class SettingViewModel @Inject constructor( .onSuccess { user -> updateState { copy( + initialLoading = false, name = user.name, birthDate = user.birthDate, selectedGender = user.gender, From cb611cf7d232e3375bccbdfa40fd00413039904a Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Fri, 7 Mar 2025 23:21:30 +0900 Subject: [PATCH 111/210] =?UTF-8?q?[REFACTOR/#185]=20=EC=A0=95=EA=B7=9C?= =?UTF-8?q?=EC=8B=9D=20=ED=86=B5=EC=9D=BC=ED=99=94=20=EB=B0=8F=20=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=ED=95=84=EB=93=9C=EA=B0=80=20=EB=B9=84?= =?UTF-8?q?=EC=96=B4=EC=9E=88=EC=9D=84=20=EB=95=8C=20main=20color=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/ui/component/textfield/OrbitTextField.kt | 2 ++ .../src/main/java/com/yapp/onboarding/OnboardingContract.kt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt index b914f528..a246b5f5 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/textfield/OrbitTextField.kt @@ -144,6 +144,7 @@ private fun TextFieldContainer( enabled: Boolean, ) { val outerBorderColor = when { + isFocused && text.text.isEmpty() -> OrbitTheme.colors.main.copy(alpha = 0.2f) isFocused && !isValid -> OrbitTheme.colors.alert.copy(alpha = 0.2f) isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f) !isValid -> OrbitTheme.colors.alert.copy(alpha = 0.2f) @@ -151,6 +152,7 @@ private fun TextFieldContainer( } val innerBorderColor = when { + isFocused && text.text.isEmpty() -> OrbitTheme.colors.main.copy(alpha = 0.2f) isFocused && !isValid -> OrbitTheme.colors.alert isFocused -> OrbitTheme.colors.main.copy(alpha = 0.2f) !isValid -> OrbitTheme.colors.alert diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt index 8cf14d84..5cb2a890 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt @@ -68,7 +68,7 @@ sealed class OnboardingContract { enum class FieldType(val validationRegex: Regex) { TIME(Regex("^(24:00|([0-1]\\d|2[0-3]):[0-5]\\d)\$")), - NAME(Regex("^(?!.*[0-9@#\$%^&*!\\s])[가-힣a-zA-Z]*$")), + NAME(Regex("^(?=.{1,13}\$)(?=.{1,6}(?:[가-힣]|[a-zA-Z]{2})\$)[가-힣a-zA-Z]*\$")), } sealed class SideEffect : com.yapp.ui.base.SideEffect { From 5380674f4fa4dbaff1bc68cc60088c10830715f3 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 11 Mar 2025 11:09:51 +0900 Subject: [PATCH 112/210] =?UTF-8?q?[FIX/#192]=20=ED=83=9C=EC=96=B4?= =?UTF-8?q?=EB=82=9C=20=EC=8B=9C=EA=B0=84=20=EB=88=84=EB=9D=BD=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../setting/src/main/java/com/yapp/setting/SettingScreen.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt index 245caea2..f5ab6414 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt @@ -94,6 +94,7 @@ fun SettingScreen( name = state.name, selectedGender = state.selectedGender ?: "", birthDate = state.birthDateFormatted, + timeOfBirth = state.timeOfBirthFormatted, onNavigateToEditProfile = onNavigateToEditProfile, onBackClick = onBackClick, onInquiryClick = onInquiryClick, @@ -108,6 +109,7 @@ private fun SettingContent( name: String, selectedGender: String, birthDate: String, + timeOfBirth: String, onNavigateToEditProfile: () -> Unit, onBackClick: () -> Unit, onInquiryClick: () -> Unit, @@ -131,6 +133,7 @@ private fun SettingContent( name = name, gender = selectedGender, birth = birthDate, + timeOfBirth = timeOfBirth, modifier = Modifier .padding(horizontal = 24.dp) .customClickable( From e9c2597ba1a9149eadd15018100c681c4adbc6c4 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Mar 2025 15:29:08 +0900 Subject: [PATCH 113/210] =?UTF-8?q?[CHORE/#196]=20Amplitude=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/libs.versions.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d64d6719..0218a0d0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -79,6 +79,7 @@ lottie = "6.1.0" accompanist = "0.37.0" materialAndroid = "1.7.5" flexible-bottomsheet = "0.1.5" +amplitude = "1.20.3" [libraries] @@ -173,6 +174,8 @@ lottie-compose = { group = "com.airbnb.android", name = "lottie-compose", versio accompanist-permission = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" } androidx-material-android = { group = "androidx.compose.material", name = "material-android", version.ref = "materialAndroid" } +amplitude-analytics = { group = "com.amplitude", name = "analytics-android", version.ref = "amplitude" } + [plugins] ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } From 24b56a0cbd6fa844e5b6a1b72587c7567132bfc9 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Mar 2025 15:45:13 +0900 Subject: [PATCH 114/210] =?UTF-8?q?[FEAT/#196]=20BuildConfigFields?= =?UTF-8?q?=EC=97=90=20Amplitude=20API=20=ED=82=A4=20=EA=B0=92=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-logic/src/main/java/com/yapp/convention/Extension.kt | 3 +++ .../java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt | 2 ++ .../main/java/com/yapp/common/buildconfig/BuildConfigFields.kt | 1 + 3 files changed, 6 insertions(+) diff --git a/build-logic/src/main/java/com/yapp/convention/Extension.kt b/build-logic/src/main/java/com/yapp/convention/Extension.kt index ee6bb060..4f6cf1ff 100644 --- a/build-logic/src/main/java/com/yapp/convention/Extension.kt +++ b/build-logic/src/main/java/com/yapp/convention/Extension.kt @@ -27,14 +27,17 @@ internal val ExtensionContainer.libs: VersionCatalog internal fun CommonExtension<*, *, *, *, *, *>.addBuildConfigFields(project: Project) { val baseUrl = project.getLocalProperty("baseUrl", "https://default.example.com") + val amplitudeApikey = project.getLocalProperty("amplitudeApiKey", "") buildTypes { getByName("debug") { buildConfigField("String", "BASE_URL", "\"$baseUrl\"") + buildConfigField("String", "AMPLITUDE_API_KEY", "\"$amplitudeApikey\"") buildConfigField("boolean", "DEBUG", "true") } getByName("release") { buildConfigField("String", "BASE_URL", "\"$baseUrl\"") + buildConfigField("String", "AMPLITUDE_API_KEY", "\"$amplitudeApikey\"") buildConfigField("boolean", "DEBUG", "false") } } diff --git a/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt b/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt index 1017778a..ae3ddfe4 100644 --- a/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt +++ b/core/buildconfig/src/main/java/com/yapp/buildconfig/BuildConfigFieldsProviderImpl.kt @@ -2,6 +2,7 @@ package com.yapp.buildconfig import com.yapp.common.buildconfig.BuildConfigFieldProvider import com.yapp.common.buildconfig.BuildConfigFields +import core.buildconfig.BuildConfig.AMPLITUDE_API_KEY import core.buildconfig.BuildConfig.BASE_URL import core.buildconfig.BuildConfig.DEBUG import javax.inject.Inject @@ -10,6 +11,7 @@ class BuildConfigFieldsProviderImpl @Inject constructor() : BuildConfigFieldProv override fun get(): BuildConfigFields = BuildConfigFields( baseUrl = BASE_URL, + amplitudeApiKey = AMPLITUDE_API_KEY, isDebug = DEBUG, ) } diff --git a/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt b/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt index 30e0e506..a7edf3e0 100644 --- a/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt +++ b/core/common/src/main/java/com/yapp/common/buildconfig/BuildConfigFields.kt @@ -2,5 +2,6 @@ package com.yapp.common.buildconfig data class BuildConfigFields( val baseUrl: String, + val amplitudeApiKey: String, val isDebug: Boolean, ) From 63fc267be6a29aea76ad797423d92b9e6b390207 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Mar 2025 15:46:38 +0900 Subject: [PATCH 115/210] =?UTF-8?q?[CHORE/#196]=20Analytics=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=EC=B4=88=EA=B8=B0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + core/analytics/.gitignore | 1 + core/analytics/build.gradle.kts | 16 ++++++++++++++++ core/analytics/consumer-rules.pro | 0 core/analytics/proguard-rules.pro | 21 +++++++++++++++++++++ core/analytics/src/main/AndroidManifest.xml | 4 ++++ feature/alarm-interaction/build.gradle.kts | 1 + feature/fortune/build.gradle.kts | 1 + feature/home/build.gradle.kts | 1 + feature/mission/build.gradle.kts | 1 + feature/navigator/build.gradle.kts | 1 + feature/onboarding/build.gradle.kts | 1 + feature/setting/build.gradle.kts | 1 + feature/splash/build.gradle.kts | 1 + feature/webview/build.gradle.kts | 1 + settings.gradle.kts | 1 + 16 files changed, 53 insertions(+) create mode 100644 core/analytics/.gitignore create mode 100644 core/analytics/build.gradle.kts create mode 100644 core/analytics/consumer-rules.pro create mode 100644 core/analytics/proguard-rules.pro create mode 100644 core/analytics/src/main/AndroidManifest.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3bdddf10..c123d210 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + diff --git a/core/analytics/.gitignore b/core/analytics/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/core/analytics/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/analytics/build.gradle.kts b/core/analytics/build.gradle.kts new file mode 100644 index 00000000..2bfdbe5a --- /dev/null +++ b/core/analytics/build.gradle.kts @@ -0,0 +1,16 @@ +import com.yapp.convention.setNamespace + +plugins { + id("orbit.android.library") + id("orbit.android.hilt") + id("orbit.android.compose") +} + +android { + setNamespace("com.yapp.analytics") +} + +dependencies { + implementation(projects.core.common) + implementation(libs.amplitude.analytics) +} diff --git a/core/analytics/consumer-rules.pro b/core/analytics/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/core/analytics/proguard-rules.pro b/core/analytics/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/core/analytics/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/core/analytics/src/main/AndroidManifest.xml b/core/analytics/src/main/AndroidManifest.xml new file mode 100644 index 00000000..e1000761 --- /dev/null +++ b/core/analytics/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/feature/alarm-interaction/build.gradle.kts b/feature/alarm-interaction/build.gradle.kts index 49219a6a..a55bf98d 100644 --- a/feature/alarm-interaction/build.gradle.kts +++ b/feature/alarm-interaction/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.alarm) implementation(projects.core.media) implementation(projects.domain) diff --git a/feature/fortune/build.gradle.kts b/feature/fortune/build.gradle.kts index d82201b5..ac291d36 100644 --- a/feature/fortune/build.gradle.kts +++ b/feature/fortune/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.datastore) implementation(libs.orbit.core) implementation(libs.orbit.compose) diff --git a/feature/home/build.gradle.kts b/feature/home/build.gradle.kts index 61e15919..b8a4b12d 100644 --- a/feature/home/build.gradle.kts +++ b/feature/home/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.alarm) implementation(projects.core.media) implementation(projects.core.datastore) diff --git a/feature/mission/build.gradle.kts b/feature/mission/build.gradle.kts index a9c9e824..95ffd72c 100644 --- a/feature/mission/build.gradle.kts +++ b/feature/mission/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.media) implementation(projects.core.alarm) implementation(projects.domain) diff --git a/feature/navigator/build.gradle.kts b/feature/navigator/build.gradle.kts index 5d85544d..cc268c3d 100644 --- a/feature/navigator/build.gradle.kts +++ b/feature/navigator/build.gradle.kts @@ -10,6 +10,7 @@ android { dependencies { implementation(projects.core.common) + implementation(projects.core.analytics) implementation(libs.orbit.core) implementation(libs.orbit.compose) implementation(libs.orbit.viewmodel) diff --git a/feature/onboarding/build.gradle.kts b/feature/onboarding/build.gradle.kts index 94065df8..6c1d22e0 100644 --- a/feature/onboarding/build.gradle.kts +++ b/feature/onboarding/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.media) implementation(projects.domain) implementation(projects.core.datastore) diff --git a/feature/setting/build.gradle.kts b/feature/setting/build.gradle.kts index 6227faa3..96e74f94 100644 --- a/feature/setting/build.gradle.kts +++ b/feature/setting/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.domain) implementation(projects.core.datastore) implementation(libs.orbit.core) diff --git a/feature/splash/build.gradle.kts b/feature/splash/build.gradle.kts index 30f42a19..0377f847 100644 --- a/feature/splash/build.gradle.kts +++ b/feature/splash/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.core.datastore) implementation(libs.orbit.core) implementation(libs.orbit.compose) diff --git a/feature/webview/build.gradle.kts b/feature/webview/build.gradle.kts index 01c77847..f8830aa7 100644 --- a/feature/webview/build.gradle.kts +++ b/feature/webview/build.gradle.kts @@ -11,6 +11,7 @@ android { dependencies { implementation(projects.core.ui) implementation(projects.core.common) + implementation(projects.core.analytics) implementation(projects.domain) implementation(libs.orbit.core) implementation(libs.orbit.compose) diff --git a/settings.gradle.kts b/settings.gradle.kts index 8fb9d5e2..fe745646 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -46,3 +46,4 @@ include(":feature:alarm-interaction") include(":core:alarm") include(":feature:splash") include(":feature:webview") +include(":core:analytics") From 896e6fc6f93fce0fb2a99fb8f106634ef4227516 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Mar 2025 15:47:37 +0900 Subject: [PATCH 116/210] =?UTF-8?q?[FEAT/#196]=20AnalyticsHelper=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/analytics/AnalyticsHelper.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt new file mode 100644 index 00000000..6e879f72 --- /dev/null +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt @@ -0,0 +1,11 @@ +package com.yapp.analytics + +import androidx.compose.runtime.staticCompositionLocalOf + +abstract class AnalyticsHelper { + abstract fun logEvent(event: String) +} + +val LocalAnalyticsHelper = staticCompositionLocalOf { + DebugAnalyticsHelper() +} From 48454a5b0272930ccc0f6d5318ab2fd08f6c8635 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Mar 2025 15:47:52 +0900 Subject: [PATCH 117/210] =?UTF-8?q?[FEAT/#196]=20Amplitude=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=EC=9D=98=20AnalyticsHelper=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/analytics/AmplitudeAnalyticsHelper.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt diff --git a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt new file mode 100644 index 00000000..a7953ac9 --- /dev/null +++ b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt @@ -0,0 +1,12 @@ +package com.yapp.analytics + +import com.amplitude.android.Amplitude +import javax.inject.Inject + +class AmplitudeAnalyticsHelper @Inject constructor( + private val amplitude: Amplitude, +) : AnalyticsHelper() { + override fun logEvent(event: String) { + amplitude.track(event) + } +} From 3a978e46de98538429750924dab57ce8158a35c8 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Mar 2025 15:48:03 +0900 Subject: [PATCH 118/210] =?UTF-8?q?[FEAT/#196]=20Debug=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=EC=9D=84=20=EC=9C=84=ED=95=9C=20AnalyticsHelper=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 --- .../main/java/com/yapp/analytics/DebugAnalyticsHelper.kt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt diff --git a/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt new file mode 100644 index 00000000..37e25801 --- /dev/null +++ b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt @@ -0,0 +1,9 @@ +package com.yapp.analytics + +import android.util.Log + +class DebugAnalyticsHelper : AnalyticsHelper() { + override fun logEvent(event: String) { + Log.d("DebugAnalyticsHelper", "logEvent: $event") + } +} From f2b4d453fbe668ca32cf6332ed5ee93206dbe1ad Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Mar 2025 15:48:38 +0900 Subject: [PATCH 119/210] =?UTF-8?q?[FEAT/#196]=20AnalyticsModule=EC=97=90?= =?UTF-8?q?=EC=84=9C=20Debug/Release=20=ED=99=98=EA=B2=BD=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20AnalyticsHelper=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/analytics/di/AnalyticsModule.kt | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 core/analytics/src/main/java/com/yapp/analytics/di/AnalyticsModule.kt diff --git a/core/analytics/src/main/java/com/yapp/analytics/di/AnalyticsModule.kt b/core/analytics/src/main/java/com/yapp/analytics/di/AnalyticsModule.kt new file mode 100644 index 00000000..caef0cf5 --- /dev/null +++ b/core/analytics/src/main/java/com/yapp/analytics/di/AnalyticsModule.kt @@ -0,0 +1,59 @@ +package com.yapp.analytics.di + +import android.content.Context +import com.amplitude.android.Amplitude +import com.amplitude.android.Configuration +import com.yapp.analytics.AmplitudeAnalyticsHelper +import com.yapp.analytics.AnalyticsHelper +import com.yapp.analytics.BuildConfig +import com.yapp.analytics.DebugAnalyticsHelper +import com.yapp.common.buildconfig.BuildConfigFieldProvider +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Qualifier +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object AnalyticsModule { + + @Provides + @Singleton + fun providesAmplitude( + @ApplicationContext context: Context, + buildConfigFieldProvider: BuildConfigFieldProvider, + ): Amplitude = Amplitude( + Configuration( + apiKey = buildConfigFieldProvider.get().amplitudeApiKey, + context = context, + ), + ) + + @Provides + @Singleton + @Debug + fun provideDebugAnalyticsHelper(): AnalyticsHelper = DebugAnalyticsHelper() + + @Provides + @Singleton + @Release + fun provideReleaseAnalyticsHelper(amplitude: Amplitude): AnalyticsHelper = AmplitudeAnalyticsHelper(amplitude) + + @Provides + @Singleton + fun provideAnalyticsHelper( + @Debug debugAnalyticsHelper: AnalyticsHelper, + @Release releaseAnalyticsHelper: AnalyticsHelper, + ): AnalyticsHelper = if (BuildConfig.DEBUG) debugAnalyticsHelper else releaseAnalyticsHelper +} + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class Debug + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class Release From ca3f64600b7f924c27bf08364a92369f079501b6 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Mar 2025 15:49:59 +0900 Subject: [PATCH 120/210] =?UTF-8?q?[CHORE/#196]=20Amplitude=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=A1=9C=EA=B9=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/navigator/MainActivity.kt | 16 +++++++++++++--- .../main/java/com/yapp/splash/SplashScreen.kt | 8 ++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt b/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt index 5863eb31..7728e44f 100644 --- a/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt +++ b/feature/navigator/src/main/java/com/yapp/navigator/MainActivity.kt @@ -7,12 +7,20 @@ import androidx.activity.ComponentActivity import androidx.activity.SystemBarStyle import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.compose.runtime.CompositionLocalProvider +import com.yapp.analytics.AnalyticsHelper +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.common.navigation.rememberOrbitNavigator import com.yapp.designsystem.theme.OrbitTheme import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject @AndroidEntryPoint class MainActivity : ComponentActivity() { + + @Inject + lateinit var analyticsHelper: AnalyticsHelper + @SuppressLint("SourceLockedOrientationActivity") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -31,9 +39,11 @@ class MainActivity : ComponentActivity() { val navigator = rememberOrbitNavigator() OrbitTheme { - OrbitNavHost( - navigator = navigator, - ) + CompositionLocalProvider(LocalAnalyticsHelper provides analyticsHelper) { + OrbitNavHost( + navigator = navigator, + ) + } } } } diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt index 152edd15..14bca2d6 100644 --- a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt +++ b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.common.navigation.OrbitNavigator import com.yapp.common.navigation.destination.SplashDestination import com.yapp.designsystem.theme.OrbitTheme @@ -29,9 +30,16 @@ fun SplashRoute( navigator: OrbitNavigator, viewModel: SplashViewModel = hiltViewModel(), ) { + val analyticsHelper = LocalAnalyticsHelper.current + val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() val sideEffect = viewModel.container.sideEffectFlow + LaunchedEffect(Unit) { + // 테스트 로그 + analyticsHelper.logEvent("TEST") + } + LaunchedEffect(sideEffect) { sideEffect.collectLatest { effect -> when (effect) { From 6cca4edf9453ca740c282e13aa6db84b41c817af Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 17 Mar 2025 18:22:24 +0900 Subject: [PATCH 121/210] =?UTF-8?q?[CHORE/#196]=20local.properties=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=EC=97=90=20AMPLITUDE=5FAPI=5FKEY=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/android_cd.yml | 4 +++- .github/workflows/android_ci.yml | 6 +++-- .../analytics/AmplitudeAnalyticsHelper.kt | 12 ++++++++-- .../java/com/yapp/analytics/AnalyticsEvent.kt | 24 +++++++++++++++++++ .../com/yapp/analytics/AnalyticsHelper.kt | 2 +- .../yapp/analytics/DebugAnalyticsHelper.kt | 2 +- .../main/java/com/yapp/splash/SplashScreen.kt | 3 ++- 7 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt diff --git a/.github/workflows/android_cd.yml b/.github/workflows/android_cd.yml index 2c03ce13..60091859 100644 --- a/.github/workflows/android_cd.yml +++ b/.github/workflows/android_cd.yml @@ -55,7 +55,9 @@ jobs: - name: Add Local Properties env: BASE_URL: ${{ secrets.BASE_URL }} - run: echo "baseUrl=$BASE_URL" >> local.properties + AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} + run: | + echo -e "baseUrl=$BASE_URL\namplitudeApiKey=$AMPLITUDE_API_KEY" >> local.properties # 7. Debug Local Properties Check - name: Debug Local Properties diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml index c696fd26..9b337bce 100644 --- a/.github/workflows/android_ci.yml +++ b/.github/workflows/android_ci.yml @@ -55,8 +55,10 @@ jobs: # Add Local Properties - name: Add Local Properties env: - BASE_URL: ${{ secrets.BASE_URL }} - run: echo "baseUrl=$BASE_URL" >> local.properties + BASE_URL: ${{ secrets.BASE_URL }} + AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} + run: | + echo -e "baseUrl=$BASE_URL\namplitudeApiKey=$AMPLITUDE_API_KEY" >> local.properties # Debug Local Properties Check - name: Debug Local Properties diff --git a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt index a7953ac9..734f4c78 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt @@ -1,12 +1,20 @@ package com.yapp.analytics import com.amplitude.android.Amplitude +import com.amplitude.core.events.BaseEvent import javax.inject.Inject class AmplitudeAnalyticsHelper @Inject constructor( private val amplitude: Amplitude, ) : AnalyticsHelper() { - override fun logEvent(event: String) { - amplitude.track(event) + override fun logEvent(event: AnalyticsEvent) { + amplitude.track(event.toAmplitudeEvent()) + } + + private fun AnalyticsEvent.toAmplitudeEvent(): BaseEvent { + return BaseEvent().apply { + this.eventType = type + this.eventProperties = properties + } } } diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt new file mode 100644 index 00000000..02fb294e --- /dev/null +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt @@ -0,0 +1,24 @@ +package com.yapp.analytics + +data class AnalyticsEvent( + val type: String, + val properties: MutableMap? = null, +) { + object OnboardingPropertiesKeys { + const val STEP = "step" + const val GENDER = "gender" + const val PERMISSION = "permission" + } + + object AlarmPropertiesKeys { + const val ALARM_ID = "alarm_id" + const val REPEAT_DAYS = "repeat_days" + const val SNOOZE_TIME = "snooze_time" + const val SNOOZE_OPTION = "snooze_option" + const val DATE = "date" + const val DISMISS_POSITION = "dismiss_position" + const val MISSION_TYPE = "mission_type" + const val PAGE_NUMBER = "page_number" + const val DURATION = "duration" + } +} diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt index 6e879f72..d082d8da 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt @@ -3,7 +3,7 @@ package com.yapp.analytics import androidx.compose.runtime.staticCompositionLocalOf abstract class AnalyticsHelper { - abstract fun logEvent(event: String) + abstract fun logEvent(event: AnalyticsEvent) } val LocalAnalyticsHelper = staticCompositionLocalOf { diff --git a/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt index 37e25801..461c977d 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt @@ -3,7 +3,7 @@ package com.yapp.analytics import android.util.Log class DebugAnalyticsHelper : AnalyticsHelper() { - override fun logEvent(event: String) { + override fun logEvent(event: AnalyticsEvent) { Log.d("DebugAnalyticsHelper", "logEvent: $event") } } diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt index 14bca2d6..57a9690c 100644 --- a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt +++ b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.common.navigation.OrbitNavigator import com.yapp.common.navigation.destination.SplashDestination @@ -37,7 +38,7 @@ fun SplashRoute( LaunchedEffect(Unit) { // 테스트 로그 - analyticsHelper.logEvent("TEST") + analyticsHelper.logEvent(AnalyticsEvent("TEST")) } LaunchedEffect(sideEffect) { From 5350e09c11204cc57d9bf22ec9a7825bc48cd345 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 00:04:16 +0900 Subject: [PATCH 122/210] =?UTF-8?q?[REFACTOR/#196]=20properties=EB=A5=BC?= =?UTF-8?q?=20MutableMap=EC=9D=B4=20=EC=95=84=EB=8B=8C=20Map=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt | 2 +- .../src/main/java/com/yapp/analytics/AnalyticsEvent.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt index 734f4c78..9644b458 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt @@ -14,7 +14,7 @@ class AmplitudeAnalyticsHelper @Inject constructor( private fun AnalyticsEvent.toAmplitudeEvent(): BaseEvent { return BaseEvent().apply { this.eventType = type - this.eventProperties = properties + this.eventProperties = properties?.toMutableMap() } } } diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt index 02fb294e..dc8fc1f9 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt @@ -2,7 +2,7 @@ package com.yapp.analytics data class AnalyticsEvent( val type: String, - val properties: MutableMap? = null, + val properties: Map? = null, ) { object OnboardingPropertiesKeys { const val STEP = "step" From 286a5c6f03d2d2fbe2643be883e5813fad7924b1 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 00:06:41 +0900 Subject: [PATCH 123/210] =?UTF-8?q?[CHORE/#197]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=86=8C=EA=B0=9C=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/OnboardingExplainScreen.kt | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt index b18ba0a5..553e6f19 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt @@ -8,13 +8,14 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier 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 androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.GifImage import com.yapp.ui.utils.heightForScreenPercentage @@ -25,24 +26,45 @@ import feature.onboarding.R fun OnboardingExplainRoute( viewModel: OnboardingViewModel, ) { - val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + val analyticsHelper = LocalAnalyticsHelper.current + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_intro_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "서비스 소개", + ), + ), + ) + } OnboardingExplainScreen( - state = state, onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) }, ) } @Composable fun OnboardingExplainScreen( - state: OnboardingContract.State, onNextClick: () -> Unit, ) { + val analyticsHelper = LocalAnalyticsHelper.current + OnboardingScreen( currentStep = 0, totalSteps = 0, isButtonEnabled = true, - onNextClick = onNextClick, + onNextClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_intro_next_click", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "서비스 소개", + ), + ), + ) + onNextClick() + }, onBackClick = null, showTopAppBar = false, buttonLabel = "다음", @@ -80,7 +102,6 @@ fun OnboardingExplainScreen( fun OnboardingExplainScreenPreview() { OrbitTheme { OnboardingExplainScreen( - state = OnboardingContract.State(), onNextClick = {}, ) } From d2a2b2589bfc9b811848e051cbf9273001a75c6f Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 00:07:45 +0900 Subject: [PATCH 124/210] =?UTF-8?q?[CHORE/#197]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EC=B4=88=EA=B8=B0=20=EC=95=8C=EB=9E=8C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OnboardingAlarmTimeSelectionScreen.kt | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt index b5c4812a..963b03ba 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAlarmTimeSelectionScreen.kt @@ -8,13 +8,14 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier 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 androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.ui.component.timepicker.OrbitPicker import com.yapp.ui.utils.heightForScreenPercentage @@ -24,15 +25,37 @@ import feature.onboarding.R fun OnboardingAlarmTimeSelectionRoute( viewModel: OnboardingViewModel, ) { - val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + val analyticsHelper = LocalAnalyticsHelper.current + BackHandler { - viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리 + viewModel.processAction(OnboardingContract.Action.PreviousStep) + } + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_alarm_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "초기 알람 생성", + ), + ), + ) } + OnboardingAlarmTimeSelectionScreen( - state = state, currentStep = 1, totalSteps = 6, - onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) }, + onNextClick = { + viewModel.processAction(OnboardingContract.Action.NextStep) + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_alarm_create", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "초기 알람 생성", + ), + ), + ) + }, onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) }, setAlarmTime = { isAm, hour, minute -> viewModel.processAction(OnboardingContract.Action.SetAlarmTime(isAm, hour, minute)) @@ -42,7 +65,6 @@ fun OnboardingAlarmTimeSelectionRoute( @Composable fun OnboardingAlarmTimeSelectionScreen( - state: OnboardingContract.State, currentStep: Int, totalSteps: Int, onNextClick: () -> Unit, @@ -90,7 +112,6 @@ fun OnboardingAlarmTimeSelectionScreen( fun OnboardingAlarmTimeSelectionScreenPreview() { OrbitTheme { OnboardingAlarmTimeSelectionScreen( - state = OnboardingContract.State(), currentStep = 0, totalSteps = 0, onNextClick = {}, From c91c62d14802be898f54cabba6a317d44c0ded5e Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 00:08:54 +0900 Subject: [PATCH 125/210] =?UTF-8?q?[CHORE/#197]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EC=83=9D=EB=85=84=EC=9B=94=EC=9D=BC=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/OnboardingBirthdayScreen.kt | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt index 139316df..39868a89 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingBirthdayScreen.kt @@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -30,7 +31,8 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.OnBoardingTopAppBar import com.yapp.ui.component.button.OrbitButton @@ -40,15 +42,37 @@ import feature.onboarding.R @Composable fun OnboardingBirthdayRoute(viewModel: OnboardingViewModel) { - val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + val analyticsHelper = LocalAnalyticsHelper.current + BackHandler { viewModel.processAction(OnboardingContract.Action.PreviousStep) } + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_birthdate_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "생년월일", + ), + ), + ) + } + OnboardingBirthdayScreen( - state = state, currentStep = 2, totalSteps = 6, - onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) }, + onNextClick = { + viewModel.processAction(OnboardingContract.Action.NextStep) + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_birthdate_next", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "생년월일", + ), + ), + ) + }, onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) }, onBirthDateChange = { lunar, year, month, day -> viewModel.processAction(OnboardingContract.Action.UpdateBirthDate(lunar, year, month, day)) @@ -68,7 +92,6 @@ fun OnboardingBirthdayRoute(viewModel: OnboardingViewModel) { @Composable fun OnboardingBirthdayScreen( - state: OnboardingContract.State, currentStep: Int, totalSteps: Int, onNextClick: () -> Unit, @@ -188,7 +211,6 @@ fun AnnotatedTermsText( fun OnboardingBirthdayScreenPreview() { OrbitTheme { OnboardingBirthdayScreen( - state = OnboardingContract.State(), currentStep = 3, totalSteps = 3, onNextClick = {}, From 6fef102debd2e60b721f9acb3687f43fbc786fc2 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 00:11:14 +0900 Subject: [PATCH 126/210] =?UTF-8?q?[CHORE/#197]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=ED=83=9C=EC=96=B4=EB=82=9C=20=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/OnboardingTimeOfBirthScreen.kt | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt index f5d67f0e..ece77336 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingTimeOfBirthScreen.kt @@ -30,6 +30,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.UnknownBirthTimeButton import com.yapp.ui.component.textfield.OrbitTextField @@ -47,9 +49,20 @@ fun OnboardingTimeOfBirthRoute( val keyboardController: SoftwareKeyboardController? = LocalSoftwareKeyboardController.current val focusRequester = remember { FocusRequester() } - LaunchedEffect(key1 = Unit) { + val analyticsHelper = LocalAnalyticsHelper.current + + LaunchedEffect(Unit) { focusRequester.requestFocus() + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_birthtime_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "태어난 시간", + ), + ), + ) } + BackHandler { viewModel.processAction(OnboardingContract.Action.PreviousStep) } @@ -60,6 +73,14 @@ fun OnboardingTimeOfBirthRoute( totalSteps = 6, focusRequester = focusRequester, onNextClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_birthtime_next", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "태어난 시간", + ), + ), + ) viewModel.processAction(OnboardingContract.Action.Reset) viewModel.processAction(OnboardingContract.Action.NextStep) keyboardController?.hide() @@ -83,6 +104,8 @@ fun OnboardingTimeOfBirthScreen( onBackClick: () -> Unit, onTextChange: (String) -> Unit, ) { + val analyticsHelper = LocalAnalyticsHelper.current + val focusManager = LocalFocusManager.current var textFieldValue by remember { mutableStateOf( @@ -150,6 +173,14 @@ fun OnboardingTimeOfBirthScreen( .align(Alignment.CenterHorizontally) .padding(bottom = 20.dp), onClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_birthtime_unknown", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "태어난 시간", + ), + ), + ) textFieldValue = TextFieldValue("시간모름") onTextChange("시간모름") onNextClick() From af3b305438688c0d8c0347c8ec82807cfe642871 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 00:12:01 +0900 Subject: [PATCH 127/210] =?UTF-8?q?[CHORE/#197]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EC=9D=B4=EB=A6=84=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/onboarding/OnboardingNameScreen.kt | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt index a072f067..4c0b0692 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNameScreen.kt @@ -23,6 +23,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.ui.component.textfield.OrbitTextField import com.yapp.ui.extensions.customClickable @@ -37,9 +39,20 @@ fun OnboardingNameRoute( val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() val focusRequester = remember { FocusRequester() } - LaunchedEffect(key1 = Unit) { + val analyticsHelper = LocalAnalyticsHelper.current + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_name_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "이름", + ), + ), + ) focusRequester.requestFocus() } + BackHandler { viewModel.processAction(OnboardingContract.Action.PreviousStep) } @@ -49,7 +62,17 @@ fun OnboardingNameRoute( currentStep = 4, totalSteps = 6, focusRequester = focusRequester, - onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) }, + onNextClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_name_next", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "이름", + ), + ), + ) + viewModel.processAction(OnboardingContract.Action.NextStep) + }, onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) }, onTextChange = { value -> viewModel.processAction( From e36fe82e9515ff7d29affd370710816deb981445 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 00:14:18 +0900 Subject: [PATCH 128/210] =?UTF-8?q?[CHORE/#197]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EC=84=B1=EB=B3=84=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/onboarding/OnboardingGenderScreen.kt | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt index 4fdd2f9c..c9ba857d 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingGenderScreen.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -20,6 +21,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.UserInfoBottomSheet import com.yapp.ui.component.dialog.OrbitDialog @@ -33,9 +36,24 @@ fun OnboardingGenderRoute( viewModel: OnboardingViewModel, ) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + + val analyticsHelper = LocalAnalyticsHelper.current + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_gender_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "성별", + ), + ), + ) + } + BackHandler { viewModel.processAction(OnboardingContract.Action.PreviousStep) } + OnboardingGenderScreen( state = state, currentStep = 5, @@ -43,6 +61,14 @@ fun OnboardingGenderRoute( onNextClick = { viewModel.processAction(OnboardingContract.Action.ToggleBottomSheet) }, onBackClick = { viewModel.processAction(OnboardingContract.Action.PreviousStep) }, onGenderSelect = { gender -> + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_gender_select", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.GENDER to gender, + ), + ), + ) viewModel.processAction(OnboardingContract.Action.UpdateGender(gender)) }, onDismissRequest = { From 48533250565cbe0b7edcb9ec329c25a7db79b66a Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 00:20:08 +0900 Subject: [PATCH 129/210] =?UTF-8?q?[CHORE/#197]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EA=B6=8C=ED=95=9C=20=EC=84=A4=EC=A0=95=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/analytics/AnalyticsEvent.kt | 2 +- .../yapp/onboarding/OnboardingAccessScreen.kt | 27 ++++++++++++++++--- .../com/yapp/onboarding/OnboardingNavGraph.kt | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt index dc8fc1f9..fccacd27 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt @@ -7,7 +7,7 @@ data class AnalyticsEvent( object OnboardingPropertiesKeys { const val STEP = "step" const val GENDER = "gender" - const val PERMISSION = "permission" + const val IS_PERMISSION_GRANTED = "permission" } object AlarmPropertiesKeys { diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt index 7f823f1a..3da968aa 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt @@ -49,7 +49,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionStatus import com.google.accompanist.permissions.shouldShowRationale -import com.yapp.common.navigation.OrbitNavigator +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.OnBoardingTopAppBar import com.yapp.ui.component.button.OrbitButton @@ -61,10 +62,12 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalPermissionsApi::class) @Composable fun OnboardingAccessRoute( - navigator: OrbitNavigator, viewModel: OnboardingViewModel, ) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + + val analyticsHelper = LocalAnalyticsHelper.current + val context = LocalContext.current val coroutineScope = rememberCoroutineScope() @@ -93,6 +96,15 @@ fun OnboardingAccessRoute( val notificationPermissionLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.RequestPermission(), onResult = { granted -> + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_permission_request", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.IS_PERMISSION_GRANTED to granted, + ), + ), + ) + isNotificationPermissionGranted = granted if (!granted) hasRequestedPermission = true }, @@ -115,7 +127,7 @@ fun OnboardingAccessRoute( val observer = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_RESUME) { isAlarmPermissionGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as android.app.AlarmManager + val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager alarmManager.canScheduleExactAlarms() } else { true @@ -127,6 +139,15 @@ fun OnboardingAccessRoute( } LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_access_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "권한 설정1", + ), + ), + ) + delay(1000) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { notificationPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt index 9f14e243..903c1c30 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt @@ -49,7 +49,7 @@ fun NavGraphBuilder.onboardingNavGraph( OnboardingGenderRoute(viewModel) } OnboardingDestination.Access -> { - OnboardingAccessRoute(navigator, viewModel) + OnboardingAccessRoute(viewModel) } OnboardingDestination.Complete1 -> { OnboardingCompleteRoute(viewModel) From 843546d3e5074db9d318ea3888d4faeff810d875 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 00:29:28 +0900 Subject: [PATCH 130/210] =?UTF-8?q?[FEAT/#197]=20AnalyticsHelper=20userId?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=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 --- .../java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt | 4 ++++ .../src/main/java/com/yapp/analytics/AnalyticsHelper.kt | 1 + .../main/java/com/yapp/analytics/DebugAnalyticsHelper.kt | 9 ++++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt index 9644b458..f937d338 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt @@ -11,6 +11,10 @@ class AmplitudeAnalyticsHelper @Inject constructor( amplitude.track(event.toAmplitudeEvent()) } + override fun setUserId(userId: String?) { + amplitude.setUserId(userId) + } + private fun AnalyticsEvent.toAmplitudeEvent(): BaseEvent { return BaseEvent().apply { this.eventType = type diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt index d082d8da..9d00dcac 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.staticCompositionLocalOf abstract class AnalyticsHelper { abstract fun logEvent(event: AnalyticsEvent) + abstract fun setUserId(userId: String?) } val LocalAnalyticsHelper = staticCompositionLocalOf { diff --git a/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt index 461c977d..1509cfa1 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt @@ -3,7 +3,14 @@ package com.yapp.analytics import android.util.Log class DebugAnalyticsHelper : AnalyticsHelper() { + private var userId: String = "" + override fun logEvent(event: AnalyticsEvent) { - Log.d("DebugAnalyticsHelper", "logEvent: $event") + Log.d("DebugAnalyticsHelper", "userId: $userId logEvent: $event") + } + + override fun setUserId(userId: String?) { + this.userId = userId ?: "" + Log.d("DebugAnalyticsHelper", "setUserId: $userId") } } From 7edebd465eaa701e74daf3e936230d16198ed668 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 00:32:10 +0900 Subject: [PATCH 131/210] =?UTF-8?q?[CHORE/#197]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EC=99=84=EB=A3=8C=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onboarding/OnboardingCompleteScreen1.kt | 20 ++++++++++++++++++- .../onboarding/OnboardingCompleteScreen2.kt | 9 ++------- .../yapp/onboarding/OnboardingViewModel.kt | 13 ++++++++++++ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt index c51a632e..fcc8b744 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen1.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.scale @@ -18,6 +19,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.ui.component.lottie.LottieAnimation import com.yapp.ui.utils.heightForScreenPercentage @@ -27,10 +30,25 @@ import feature.onboarding.R fun OnboardingCompleteRoute( viewModel: OnboardingViewModel, ) { + val analyticsHelper = LocalAnalyticsHelper.current + val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + + LaunchedEffect(Unit) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_welcome1_view", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "환영1", + ), + ), + ) + } + BackHandler { - viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리 + viewModel.processAction(OnboardingContract.Action.PreviousStep) } + OnboardingCompleteScreen1( state = state, onNextClick = { viewModel.processAction(OnboardingContract.Action.NextStep) }, diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt index 7a77ad88..f99e8771 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingCompleteScreen2.kt @@ -15,7 +15,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.scale @@ -23,7 +22,6 @@ 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 androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.designsystem.theme.OrbitTheme import com.yapp.onboarding.component.OnBoardingTopAppBar import com.yapp.ui.component.button.OrbitButton @@ -35,12 +33,11 @@ import feature.onboarding.R fun OnboardingCompleteRoute2( viewModel: OnboardingViewModel, ) { - val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() BackHandler { - viewModel.processAction(OnboardingContract.Action.PreviousStep) // ✅ ViewModel에서 처리 + viewModel.processAction(OnboardingContract.Action.PreviousStep) } + OnboardingCompleteScreen2( - state = state, onNextClick = { viewModel.processAction(OnboardingContract.Action.CompleteOnboarding) viewModel.processAction(OnboardingContract.Action.CreateAlarm) @@ -51,7 +48,6 @@ fun OnboardingCompleteRoute2( @Composable fun OnboardingCompleteScreen2( - state: OnboardingContract.State, onNextClick: () -> Unit, onBackClick: () -> Unit, currentStep: Int = 0, @@ -122,7 +118,6 @@ fun OnboardingCompleteScreen2( fun OnboardingCompleteScreen2Preview() { OrbitTheme { OnboardingCompleteScreen2( - state = OnboardingContract.State(), onNextClick = {}, onBackClick = {}, ) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt index 945aaee0..2d2fc6a3 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt @@ -3,6 +3,8 @@ package com.yapp.onboarding import android.util.Log import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.AnalyticsHelper import com.yapp.common.navigation.destination.HomeDestination import com.yapp.common.navigation.destination.OnboardingDestination import com.yapp.datastore.UserPreferences @@ -20,6 +22,7 @@ import javax.inject.Inject @HiltViewModel class OnboardingViewModel @Inject constructor( + private val analyticsHelper: AnalyticsHelper, private val signUpRepository: SignUpRepository, private val userPreferences: UserPreferences, private val alarmUseCase: AlarmUseCase, @@ -72,6 +75,16 @@ class OnboardingViewModel @Inject constructor( userPreferences.saveUserId(userId) userPreferences.saveUserName(userName) + analyticsHelper.setUserId("$userId") + analyticsHelper.logEvent( + AnalyticsEvent( + type = "onboarding_complete", + properties = mapOf( + AnalyticsEvent.OnboardingPropertiesKeys.STEP to "환영2", + ), + ), + ) + updateState { copy(isBottomSheetOpen = false) } moveToNextStep() } else { From 2e1981adc0ba1b2972b56438d3c371649bb8b805 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 12:57:39 +0900 Subject: [PATCH 132/210] =?UTF-8?q?[CHORE/#197]=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/domain/model/AlarmDay.kt | 5 +++++ .../yapp/alarm/addedit/AlarmAddEditViewModel.kt | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt b/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt index f3254c52..beaead69 100644 --- a/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt +++ b/domain/src/main/java/com/yapp/domain/model/AlarmDay.kt @@ -24,3 +24,8 @@ fun Set.toRepeatDays(): Int { fun Int.toAlarmDays(): Set { return AlarmDay.entries.filterTo(mutableSetOf()) { (this and it.bitValue) != 0 } } + +fun Int.toAlarmDayNames(): List { + return AlarmDay.entries.filter { (this and it.bitValue) != 0 } + .map { it.name.replaceFirstChar { char -> char.uppercase() } } +} diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt index e6089abc..60528c21 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt @@ -5,11 +5,14 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.yapp.alarm.AlarmHelper +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.AnalyticsHelper import com.yapp.common.util.ResourceProvider import com.yapp.domain.model.Alarm import com.yapp.domain.model.AlarmDay import com.yapp.domain.model.AlarmSound import com.yapp.domain.model.copyFrom +import com.yapp.domain.model.toAlarmDayNames import com.yapp.domain.model.toAlarmDays import com.yapp.domain.model.toDayOfWeek import com.yapp.domain.usecase.AlarmUseCase @@ -25,6 +28,7 @@ import javax.inject.Inject @HiltViewModel class AlarmAddEditViewModel @Inject constructor( + private val analyticsHelper: AnalyticsHelper, private val alarmUseCase: AlarmUseCase, private val resourceProvider: ResourceProvider, private val hapticFeedbackManager: HapticFeedbackManager, @@ -254,6 +258,16 @@ class AlarmAddEditViewModel @Inject constructor( private suspend fun createNewAlarm(alarm: Alarm) { alarmUseCase.insertAlarm(alarm) .onSuccess { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "alarm_create", + properties = mapOf( + AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to it.id, + AnalyticsEvent.AlarmPropertiesKeys.REPEAT_DAYS to it.repeatDays.toAlarmDayNames(), + AnalyticsEvent.AlarmPropertiesKeys.SNOOZE_OPTION to listOf(it.snoozeInterval, it.snoozeCount), + ), + ), + ) alarmHelper.scheduleAlarm(it) emitSideEffect(AlarmAddEditContract.SideEffect.SaveAlarm(it.id)) } From 485c77417c2536e1729881e01b357d163a4bce2a Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 13:21:50 +0900 Subject: [PATCH 133/210] =?UTF-8?q?[CHORE/#197]=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=ED=95=B4=EC=A0=9C=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/alarm/build.gradle.kts | 1 + .../com/yapp/alarm/receivers/AlarmReceiver.kt | 47 +++++++++++++------ .../java/com/yapp/analytics/AnalyticsEvent.kt | 3 +- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/core/alarm/build.gradle.kts b/core/alarm/build.gradle.kts index 0bce88ba..0747052e 100644 --- a/core/alarm/build.gradle.kts +++ b/core/alarm/build.gradle.kts @@ -10,6 +10,7 @@ android { } dependencies { + implementation(projects.core.analytics) implementation(projects.core.datastore) implementation(projects.core.designsystem) implementation(projects.core.media) diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt index d90d6e32..6508a499 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt @@ -9,11 +9,15 @@ import android.widget.Toast import com.yapp.alarm.AlarmConstants import com.yapp.alarm.AlarmHelper import com.yapp.alarm.services.AlarmService +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.AnalyticsHelper import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm +import com.yapp.domain.usecase.AlarmUseCase import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import java.time.LocalDateTime @@ -22,12 +26,18 @@ import javax.inject.Inject @AndroidEntryPoint class AlarmReceiver : BroadcastReceiver() { + @Inject + lateinit var analyticsHelper: AnalyticsHelper + @Inject lateinit var alarmHelper: AlarmHelper @Inject lateinit var userPreferences: UserPreferences + @Inject + lateinit var alarmUseCase: AlarmUseCase + override fun onReceive(context: Context?, intent: Intent?) { context ?: return intent ?: return @@ -56,7 +66,29 @@ class AlarmReceiver : BroadcastReceiver() { Log.d("AlarmReceiver", "Alarm Dismissed") val alarmId = intent.getLongExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, -1L) if (alarmId != -1L) { - handleFirstAlarmDismissed(alarmId) + CoroutineScope(Dispatchers.IO).launch { + val alarms = alarmUseCase.getAllAlarms().first().sortedBy { it.isAlarmActive } + val isFirstAlarm = alarms.firstOrNull()?.id == alarmId + + analyticsHelper.logEvent( + AnalyticsEvent( + type = "alarm_dismiss", + properties = mapOf( + AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to alarmId, + AnalyticsEvent.AlarmPropertiesKeys.DISMISS_IS_FIRST_ALARM to isFirstAlarm, + ), + ), + ) + val existingId = userPreferences.firstDismissedAlarmIdFlow.firstOrNull() + if (existingId == null) { + // 첫 번째 알람 해제 기록 + userPreferences.saveFirstDismissedAlarmId(alarmId) + } else if (existingId != alarmId) { + // 두 번째 알람 해제 감지 - 기존 기록 삭제 + userPreferences.clearDismissedAlarmId() + } + } + alarmHelper.cancelSnoozedAlarm(alarmId) } else { Log.e("AlarmReceiver", "알람 ID 수신 실패") @@ -110,19 +142,6 @@ class AlarmReceiver : BroadcastReceiver() { alarmHelper.scheduleAlarm(updatedAlarm) } - private fun handleFirstAlarmDismissed(alarmId: Long) { - CoroutineScope(Dispatchers.IO).launch { - val existingId = userPreferences.firstDismissedAlarmIdFlow.firstOrNull() - if (existingId == null) { - // 첫 번째 알람 해제 기록 - userPreferences.saveFirstDismissedAlarmId(alarmId) - } else if (existingId != alarmId) { - // 두 번째 알람 해제 감지 - 기존 기록 삭제 - userPreferences.clearDismissedAlarmId() - } - } - } - private fun sendBroadCastToCloseAlarmInteractionActivity(context: Context) { Log.d("AlarmReceiver", "Send Broadcast to close Alarm Interaction Activity") val alarmAlertActivityCloseIntent = diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt index fccacd27..cf98ccad 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt @@ -15,8 +15,7 @@ data class AnalyticsEvent( const val REPEAT_DAYS = "repeat_days" const val SNOOZE_TIME = "snooze_time" const val SNOOZE_OPTION = "snooze_option" - const val DATE = "date" - const val DISMISS_POSITION = "dismiss_position" + const val DISMISS_IS_FIRST_ALARM = "dismiss_is_first_alarm" const val MISSION_TYPE = "mission_type" const val PAGE_NUMBER = "page_number" const val DURATION = "duration" From c031d2eae9fed5fb595a30c883ac62c963542f7d Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 13:37:30 +0900 Subject: [PATCH 134/210] =?UTF-8?q?[CHORE/#197]=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EC=9A=B8=EB=A6=BC=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/alarm/receivers/AlarmReceiver.kt | 20 +++++++++++++++++++ .../java/com/yapp/analytics/AnalyticsEvent.kt | 1 + .../main/java/com/yapp/domain/model/Alarm.kt | 14 +++++++++++++ 3 files changed, 35 insertions(+) diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt index 6508a499..a9dbdc47 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt @@ -13,6 +13,7 @@ import com.yapp.analytics.AnalyticsEvent import com.yapp.analytics.AnalyticsHelper import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm +import com.yapp.domain.model.toTimeString import com.yapp.domain.usecase.AlarmUseCase import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope @@ -46,11 +47,29 @@ class AlarmReceiver : BroadcastReceiver() { when (intent.action) { AlarmConstants.ACTION_ALARM_TRIGGERED -> { Log.d("AlarmReceiver", "Alarm Triggered") + + val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + alarmServiceIntent.getParcelableExtra(AlarmConstants.EXTRA_ALARM, Alarm::class.java) + } else { + @Suppress("DEPRECATION") + alarmServiceIntent.getParcelableExtra(AlarmConstants.EXTRA_ALARM) + } + analyticsHelper.logEvent( + AnalyticsEvent( + type = "alarm_ring", + properties = mapOf( + AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to alarm?.id, + AnalyticsEvent.AlarmPropertiesKeys.ALARM_TIME to alarm?.toTimeString(), + ), + ), + ) + context.startForegroundService(alarmServiceIntent) } AlarmConstants.ACTION_ALARM_SNOOZED -> { Log.d("AlarmReceiver", "Alarm Snoozed") + val alarm: Alarm? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM, Alarm::class.java) } else { @@ -64,6 +83,7 @@ class AlarmReceiver : BroadcastReceiver() { AlarmConstants.ACTION_ALARM_DISMISSED -> { Log.d("AlarmReceiver", "Alarm Dismissed") + val alarmId = intent.getLongExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, -1L) if (alarmId != -1L) { CoroutineScope(Dispatchers.IO).launch { diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt index cf98ccad..eb7cd142 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt @@ -12,6 +12,7 @@ data class AnalyticsEvent( object AlarmPropertiesKeys { const val ALARM_ID = "alarm_id" + const val ALARM_TIME = "alarm_time" const val REPEAT_DAYS = "repeat_days" const val SNOOZE_TIME = "snooze_time" const val SNOOZE_OPTION = "snooze_option" diff --git a/domain/src/main/java/com/yapp/domain/model/Alarm.kt b/domain/src/main/java/com/yapp/domain/model/Alarm.kt index 119a497a..c3cf50ba 100644 --- a/domain/src/main/java/com/yapp/domain/model/Alarm.kt +++ b/domain/src/main/java/com/yapp/domain/model/Alarm.kt @@ -58,3 +58,17 @@ fun Alarm.copyFrom(source: Alarm): Alarm { isAlarmActive = source.isAlarmActive, ) } + +fun Alarm.toTimeString(): String { + val displayHour = if (isAm && hour == 12) { + 0 // 오전 12시는 0으로 표시 + } else if (!isAm && hour != 12) { + hour + 12 // 오후 1시~11시에는 12를 더함 + } else { + hour // 오전 1시~11시 및 오후 12시는 그대로 사용 + } + val formattedHour = displayHour.toString().padStart(2, '0') + val formattedMinute = minute.toString().padStart(2, '0') + + return "$formattedHour:$formattedMinute" +} From 4238960b541d38550dd6e02474a0646b5c85182a Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 13:48:25 +0900 Subject: [PATCH 135/210] =?UTF-8?q?[CHORE/#197]=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EB=AF=B8=EB=A3=A8=EA=B8=B0=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=A1=9C=EA=B9=85=20=EB=B0=8F=20alarmId=20=EA=B0=92=EC=9D=84?= =?UTF-8?q?=20Long=EC=9D=B4=20=EC=95=84=EB=8B=8C=20String=20=EA=B0=92?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=A0=84=EC=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/alarm/receivers/AlarmReceiver.kt | 12 ++++++++++-- .../com/yapp/alarm/addedit/AlarmAddEditViewModel.kt | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt index a9dbdc47..2e97ee68 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmReceiver.kt @@ -58,7 +58,7 @@ class AlarmReceiver : BroadcastReceiver() { AnalyticsEvent( type = "alarm_ring", properties = mapOf( - AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to alarm?.id, + AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "${alarm?.id}", AnalyticsEvent.AlarmPropertiesKeys.ALARM_TIME to alarm?.toTimeString(), ), ), @@ -76,6 +76,14 @@ class AlarmReceiver : BroadcastReceiver() { @Suppress("DEPRECATION") intent.getParcelableExtra(AlarmConstants.EXTRA_ALARM) } + analyticsHelper.logEvent( + AnalyticsEvent( + type = "alarm_snooze", + properties = mapOf( + AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "${alarm?.id}", + ), + ), + ) alarm?.let { handleSnooze(context, it) } Toast.makeText(context, "알람이 ${alarm?.snoozeInterval}분 후 다시 울려요", Toast.LENGTH_SHORT).show() @@ -94,7 +102,7 @@ class AlarmReceiver : BroadcastReceiver() { AnalyticsEvent( type = "alarm_dismiss", properties = mapOf( - AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to alarmId, + AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "$alarmId", AnalyticsEvent.AlarmPropertiesKeys.DISMISS_IS_FIRST_ALARM to isFirstAlarm, ), ), diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt index 60528c21..08713ebd 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditViewModel.kt @@ -262,7 +262,7 @@ class AlarmAddEditViewModel @Inject constructor( AnalyticsEvent( type = "alarm_create", properties = mapOf( - AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to it.id, + AnalyticsEvent.AlarmPropertiesKeys.ALARM_ID to "${it.id}", AnalyticsEvent.AlarmPropertiesKeys.REPEAT_DAYS to it.repeatDays.toAlarmDayNames(), AnalyticsEvent.AlarmPropertiesKeys.SNOOZE_OPTION to listOf(it.snoozeInterval, it.snoozeCount), ), From d66621f414fb519fd71ac951e74714e0cf904176 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 13:53:21 +0900 Subject: [PATCH 136/210] =?UTF-8?q?[CHORE/#197]=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=EB=B2=84=ED=8A=BC=20=ED=81=B4=EB=A6=AD=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/analytics/AnalyticsEvent.kt | 10 +++++++--- .../java/com/yapp/mission/MissionScreen.kt | 19 +++++++++++++++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt index eb7cd142..6419a06c 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt @@ -14,11 +14,15 @@ data class AnalyticsEvent( const val ALARM_ID = "alarm_id" const val ALARM_TIME = "alarm_time" const val REPEAT_DAYS = "repeat_days" - const val SNOOZE_TIME = "snooze_time" const val SNOOZE_OPTION = "snooze_option" const val DISMISS_IS_FIRST_ALARM = "dismiss_is_first_alarm" + } + + object MissionPropertiesKeys { const val MISSION_TYPE = "mission_type" - const val PAGE_NUMBER = "page_number" - const val DURATION = "duration" + } + + object FortunePropertiesKeys { + const val FORTUNE_PAGE_NUMBER = "fortune_page_number" } } diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt index c974eb47..15df64b2 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt @@ -26,6 +26,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.ui.component.button.OrbitButton import com.yapp.ui.component.dialog.OrbitDialog @@ -38,7 +40,6 @@ fun MissionRoute(viewModel: MissionViewModel = hiltViewModel()) { MissionScreen( stateProvider = { state }, eventDispatcher = viewModel::processAction, - onNext = { viewModel.processAction(MissionContract.Action.NextStep) }, ) } @@ -46,9 +47,10 @@ fun MissionRoute(viewModel: MissionViewModel = hiltViewModel()) { fun MissionScreen( stateProvider: () -> MissionContract.State, eventDispatcher: (MissionContract.Action) -> Unit, - onNext: () -> Unit, ) { val state = stateProvider() + + val analyticsHelper = LocalAnalyticsHelper.current val context = LocalContext.current BackHandler { @@ -106,7 +108,17 @@ fun MissionScreen( .fillMaxWidth() .padding(horizontal = 20.dp), label = "미션 시작", - onClick = onNext, + onClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "mission_ready_start", + properties = mapOf( + "mission_type" to "shake", + ), + ), + ) + eventDispatcher(MissionContract.Action.NextStep) + }, enabled = true, ) Spacer(modifier = Modifier.heightForScreenPercentage(0.027f)) @@ -174,6 +186,5 @@ fun MissionRoutePreview() { MissionScreen( stateProvider = { MissionContract.State() }, eventDispatcher = { }, - onNext = { }, ) } From 3a94fa4ff1a045392a404050811538bac1c99666 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 13:57:59 +0900 Subject: [PATCH 137/210] =?UTF-8?q?[CHORE/#197]=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=ED=81=B4=EB=A6=AD=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/mission/MissionScreen.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt index 15df64b2..29f73ada 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt @@ -127,6 +127,14 @@ fun MissionScreen( style = OrbitTheme.typography.body1SemiBold, clickable = true, onClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "mission_ready_skip", + properties = mapOf( + "mission_type" to "shake", + ), + ), + ) eventDispatcher(MissionContract.Action.ShowExitDialog) }, ) From 7f069707af48f0587fd006168c9ef40089f33de0 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 14:04:25 +0900 Subject: [PATCH 138/210] =?UTF-8?q?[CHORE/#197]=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/mission/MissionViewModel.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index e58934d7..21a0ca13 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -5,6 +5,8 @@ import android.util.Log import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.AnalyticsHelper import com.yapp.common.navigation.destination.FortuneDestination import com.yapp.common.navigation.destination.HomeDestination import com.yapp.common.navigation.destination.MissionDestination @@ -22,6 +24,7 @@ import javax.inject.Inject @HiltViewModel class MissionViewModel @Inject constructor( + private val analyticsHelper: AnalyticsHelper, private val hapticFeedbackManager: HapticFeedbackManager, private val fortuneRepository: FortuneRepository, private val userPreferences: UserPreferences, @@ -69,6 +72,12 @@ class MissionViewModel @Inject constructor( updateState { copy(shakeCount = currentCount + 1) } } else if (currentCount == 9 && !currentState.isFlipped) { hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS) + analyticsHelper.logEvent( + AnalyticsEvent( + type = "mission_success", + properties = mapOf("mission_type" to "shake"), + ), + ) postFortune() updateState { copy( From f1d270fa3228e868c1872442164dc32692d1e70b Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 14:06:50 +0900 Subject: [PATCH 139/210] =?UTF-8?q?[REFACTOR/#197]=20mission=5Ftype=20?= =?UTF-8?q?=ED=82=A4=20=EA=B0=92=EC=9D=84=20=EB=AC=B8=EC=9E=90=EC=97=B4?= =?UTF-8?q?=EC=9D=B4=20=EC=95=84=EB=8B=8C=20=EC=83=81=EC=88=98=EA=B0=92?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/mission/MissionProgressScreen.kt | 3 +++ .../mission/src/main/java/com/yapp/mission/MissionScreen.kt | 4 ++-- .../src/main/java/com/yapp/mission/MissionViewModel.kt | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt index 042328d0..18f0274b 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt @@ -35,6 +35,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.mission.component.FlipCard import com.yapp.mission.component.MissionProgressBar @@ -71,6 +72,8 @@ fun MissionProgressScreen( eventDispatcher: (MissionContract.Action) -> Unit, ) { val state = stateProvider() + + val analyticsHelper = LocalAnalyticsHelper.current val context = LocalContext.current BackHandler { diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt index 29f73ada..dcdc119b 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt @@ -113,7 +113,7 @@ fun MissionScreen( AnalyticsEvent( type = "mission_ready_start", properties = mapOf( - "mission_type" to "shake", + AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to "shake", ), ), ) @@ -131,7 +131,7 @@ fun MissionScreen( AnalyticsEvent( type = "mission_ready_skip", properties = mapOf( - "mission_type" to "shake", + AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to "shake", ), ), ) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index 21a0ca13..4311850c 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -75,7 +75,9 @@ class MissionViewModel @Inject constructor( analyticsHelper.logEvent( AnalyticsEvent( type = "mission_success", - properties = mapOf("mission_type" to "shake"), + properties = mapOf( + AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to "shake", + ), ), ) postFortune() From 51d3f02af4588a9609bb1cf4609386ecef8b295a Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 14:08:12 +0900 Subject: [PATCH 140/210] =?UTF-8?q?[CHORE/#197]=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/mission/MissionProgressScreen.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt index 18f0274b..353a5039 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt @@ -35,6 +35,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.mission.component.FlipCard @@ -205,6 +206,14 @@ fun MissionProgressScreen( confirmText = "나가기", cancelText = "취소", onConfirm = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "mission_fail", + properties = mapOf( + AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to "shake", + ), + ), + ) (context as? androidx.activity.ComponentActivity)?.finish() }, onCancel = { From a12f5f39a92da40d6e634baba27509bb83b2f3ec Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 14:14:35 +0900 Subject: [PATCH 141/210] =?UTF-8?q?[CHORE/#197]=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=EA=B0=81=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A7=84=EC=9E=85=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/fortune/FortuneScreen.kt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt index 7aaf3fa6..98f2ae31 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt @@ -21,6 +21,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.fortune.component.FortuneTopAppBar import com.yapp.fortune.component.SlidingIndicator @@ -31,6 +33,7 @@ import com.yapp.ui.component.lottie.LottieAnimation fun FortuneRoute( viewModel: FortuneViewModel = hiltViewModel(), ) { + val analyticsHelper = LocalAnalyticsHelper.current val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() val pagerState = rememberPagerState( @@ -39,6 +42,25 @@ fun FortuneRoute( ) LaunchedEffect(pagerState.currentPage) { + val eventType = when (pagerState.currentPage) { + 0 -> "fortune_view_today" + 1 -> "fortune_view_category1" + 2 -> "fortune_view_category2" + 3 -> "fortune_view_style" + 4 -> "fortune_view_refer" + 5 -> "fortune_view_end" + else -> "" + } + + analyticsHelper.logEvent( + AnalyticsEvent( + type = eventType, + properties = mapOf( + AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to pagerState.currentPage + 1, + ), + ), + ) + if (state.currentStep != pagerState.currentPage) { viewModel.onAction(FortuneContract.Action.UpdateStep(pagerState.currentPage)) } From fb7ee631556715f3bd2bc8ebed58068f02aa5a6b Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 14:18:39 +0900 Subject: [PATCH 142/210] =?UTF-8?q?[CHORE/#197]=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=ED=83=88=20=EC=9D=B4?= =?UTF-8?q?=EB=B2=A4=ED=8A=B8=20=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/fortune/FortuneNavGraph.kt | 5 +++- .../java/com/yapp/fortune/FortuneScreen.kt | 27 ++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt index d0a0b1d2..86f87fee 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt @@ -52,7 +52,10 @@ fun NavGraphBuilder.fortuneNavGraph( } when (destination) { - FortuneDestination.Fortune -> FortuneRoute(viewModel) + FortuneDestination.Fortune -> FortuneRoute( + viewModel = viewModel, + navigator = navigator, + ) FortuneDestination.Reward -> FortuneRewardRoute(viewModel) else -> {} } diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt index 98f2ae31..9c0ed94f 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt @@ -1,5 +1,6 @@ package com.yapp.fortune +import androidx.activity.compose.BackHandler import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -23,6 +24,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.analytics.AnalyticsEvent import com.yapp.analytics.LocalAnalyticsHelper +import com.yapp.common.navigation.OrbitNavigator import com.yapp.designsystem.theme.OrbitTheme import com.yapp.fortune.component.FortuneTopAppBar import com.yapp.fortune.component.SlidingIndicator @@ -32,6 +34,7 @@ import com.yapp.ui.component.lottie.LottieAnimation @Composable fun FortuneRoute( viewModel: FortuneViewModel = hiltViewModel(), + navigator: OrbitNavigator, ) { val analyticsHelper = LocalAnalyticsHelper.current val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() @@ -41,6 +44,18 @@ fun FortuneRoute( pageCount = { state.fortunePages.size + 2 }, ) + BackHandler { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_exit", + properties = mapOf( + AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to pagerState.currentPage + 1, + ), + ), + ) + navigator.navigateBack() + } + LaunchedEffect(pagerState.currentPage) { val eventType = when (pagerState.currentPage) { 0 -> "fortune_view_today" @@ -71,7 +86,17 @@ fun FortuneRoute( pagerState = pagerState, onNextStep = { viewModel.onAction(FortuneContract.Action.NextStep) }, onNavigateToHome = { viewModel.onAction(FortuneContract.Action.NavigateToHome) }, - onCloseClick = { viewModel.onAction(FortuneContract.Action.NavigateToHome) }, + onCloseClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_exit", + properties = mapOf( + AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to pagerState.currentPage + 1, + ), + ), + ) + viewModel.onAction(FortuneContract.Action.NavigateToHome) + }, ) } From bec1f4edf98915a1bdd8d23a9c68ac3f43be5505 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 14:21:04 +0900 Subject: [PATCH 143/210] =?UTF-8?q?[CHORE/#197]=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B5=9C=EC=A2=85=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/fortune/page/FortuneCompletePage.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt b/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt index 2d6d7a79..6dee0040 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/page/FortuneCompletePage.kt @@ -14,6 +14,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.fortune.component.HillWithGradient import com.yapp.ui.component.button.OrbitButton @@ -29,6 +31,8 @@ fun FortuneCompletePage( onCompleteClick: () -> Unit, onNavigateToHome: () -> Unit, ) { + val analyticsHelper = LocalAnalyticsHelper.current + val message = if (hasReward) { "첫 알람에 잘 일어났네!\n보상으로 행운 부적을 줄게" } else { @@ -82,6 +86,11 @@ fun FortuneCompletePage( label = if (hasReward) "부적 보러가기" else "완료", modifier = Modifier.padding(horizontal = 20.dp, vertical = 12.dp), onClick = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_complete", + ), + ) if (hasReward) { onCompleteClick() } else { From 9df8c0850c0da562068e795892a9dad549c7ec02 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 14:23:21 +0900 Subject: [PATCH 144/210] =?UTF-8?q?[CHORE/#197]=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=EB=B6=80=EC=A0=81=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A7=84?= =?UTF-8?q?=EC=9E=85=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/fortune/FortuneRewardScreen.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt index 990d2e80..dcb02af1 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt @@ -28,6 +28,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.fortune.component.FortuneTopAppBar import com.yapp.ui.component.button.OrbitButton @@ -37,9 +39,16 @@ import com.yapp.ui.utils.heightForScreenPercentage fun FortuneRewardRoute( viewModel: FortuneViewModel = hiltViewModel(), ) { + val analyticsHelper = LocalAnalyticsHelper.current val state = viewModel.container.stateFlow.collectAsStateWithLifecycle() LaunchedEffect(state.value.fortuneImageId) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_talisman_view", + ), + ) + val imageId = state.value.fortuneImageId ?: viewModel.getRandomImage() viewModel.saveFortuneImageIdIfNeeded(imageId) } From 06b97bb5ddaaf280cc5b3faa65a428e20966a096 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 14:24:09 +0900 Subject: [PATCH 145/210] =?UTF-8?q?[CHORE/#197]=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=EB=B6=80=EC=A0=81=20=EC=A0=80=EC=9E=A5=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=ED=81=B4=EB=A6=AD=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/fortune/FortuneRewardScreen.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt index dcb02af1..868464e8 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneRewardScreen.kt @@ -57,7 +57,14 @@ fun FortuneRewardRoute( state = state, onCloseClick = { viewModel.onAction(FortuneContract.Action.NavigateToHome) }, onCompleteClick = { viewModel.onAction(FortuneContract.Action.NavigateToHome) }, - onSaveImage = { viewModel.onAction(FortuneContract.Action.SaveImage(it)) }, + onSaveImage = { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_talisman_save", + ), + ) + viewModel.onAction(FortuneContract.Action.SaveImage(it)) + }, ) } From ab197ee211b568256aa81c56b850584c9ac56b72 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 14:25:40 +0900 Subject: [PATCH 146/210] =?UTF-8?q?[REMOVE/#197]=20=EC=8A=A4=ED=94=8C?= =?UTF-8?q?=EB=9E=98=EC=8B=9C=20=ED=99=94=EB=A9=B4=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=A1=9C=EA=B7=B8=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=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 --- .../splash/src/main/java/com/yapp/splash/SplashScreen.kt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt index 57a9690c..152edd15 100644 --- a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt +++ b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt @@ -19,8 +19,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.yapp.analytics.AnalyticsEvent -import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.common.navigation.OrbitNavigator import com.yapp.common.navigation.destination.SplashDestination import com.yapp.designsystem.theme.OrbitTheme @@ -31,16 +29,9 @@ fun SplashRoute( navigator: OrbitNavigator, viewModel: SplashViewModel = hiltViewModel(), ) { - val analyticsHelper = LocalAnalyticsHelper.current - val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() val sideEffect = viewModel.container.sideEffectFlow - LaunchedEffect(Unit) { - // 테스트 로그 - analyticsHelper.logEvent(AnalyticsEvent("TEST")) - } - LaunchedEffect(sideEffect) { sideEffect.collectLatest { effect -> when (effect) { From cbaf0697497b2ff03ebceab997ddad0bee1ed95e Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 14:59:32 +0900 Subject: [PATCH 147/210] =?UTF-8?q?[REFACTOR/#197]=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EB=AA=85=20=EC=88=98=EC=A0=95=20onboarding=5Fintro=5F?= =?UTF-8?q?next=5Fclick=20->=20onboarding=5Finto=5Fnext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/onboarding/OnboardingExplainScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt index 553e6f19..412d9677 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingExplainScreen.kt @@ -57,7 +57,7 @@ fun OnboardingExplainScreen( onNextClick = { analyticsHelper.logEvent( AnalyticsEvent( - type = "onboarding_intro_next_click", + type = "onboarding_intro_next", properties = mapOf( AnalyticsEvent.OnboardingPropertiesKeys.STEP to "서비스 소개", ), From 3dbb51c0f99daef3ce6b5afa9d3be31012509365 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 16:00:24 +0900 Subject: [PATCH 148/210] =?UTF-8?q?[FIX/#197]=20Amplitude=20userId=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=8B=9C=20Orbit=5F=20=EC=A0=91=EB=91=90?= =?UTF-8?q?=EC=82=AC=20=EB=B6=99=EC=9D=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt | 4 ++-- .../src/main/java/com/yapp/analytics/AnalyticsHelper.kt | 2 +- .../src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt | 4 ++-- .../src/main/java/com/yapp/onboarding/OnboardingViewModel.kt | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt index f937d338..0e7ecc34 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt @@ -11,8 +11,8 @@ class AmplitudeAnalyticsHelper @Inject constructor( amplitude.track(event.toAmplitudeEvent()) } - override fun setUserId(userId: String?) { - amplitude.setUserId(userId) + override fun setUserId(userId: Long?) { + amplitude.setUserId("Orbit_$userId") } private fun AnalyticsEvent.toAmplitudeEvent(): BaseEvent { diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt index 9d00dcac..2026c842 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsHelper.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.staticCompositionLocalOf abstract class AnalyticsHelper { abstract fun logEvent(event: AnalyticsEvent) - abstract fun setUserId(userId: String?) + abstract fun setUserId(userId: Long?) } val LocalAnalyticsHelper = staticCompositionLocalOf { diff --git a/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt index 1509cfa1..6bc113ee 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt @@ -9,8 +9,8 @@ class DebugAnalyticsHelper : AnalyticsHelper() { Log.d("DebugAnalyticsHelper", "userId: $userId logEvent: $event") } - override fun setUserId(userId: String?) { - this.userId = userId ?: "" + override fun setUserId(userId: Long?) { + this.userId = "Orbit_$userId" Log.d("DebugAnalyticsHelper", "setUserId: $userId") } } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt index 2d2fc6a3..72e873a5 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt @@ -75,7 +75,7 @@ class OnboardingViewModel @Inject constructor( userPreferences.saveUserId(userId) userPreferences.saveUserName(userName) - analyticsHelper.setUserId("$userId") + analyticsHelper.setUserId(userId) analyticsHelper.logEvent( AnalyticsEvent( type = "onboarding_complete", From 5d760688769937c87a46498bd5dd28d4e3355950 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 16:01:42 +0900 Subject: [PATCH 149/210] =?UTF-8?q?[REFACTOR/#197]=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EB=AA=85=20=EC=88=98=EC=A0=95=20onboarding=5Faccess?= =?UTF-8?q?=5Fview=20->=20onboarding=5Fpermission=5Fview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt index 3da968aa..abc83d5c 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingAccessScreen.kt @@ -141,7 +141,7 @@ fun OnboardingAccessRoute( LaunchedEffect(Unit) { analyticsHelper.logEvent( AnalyticsEvent( - type = "onboarding_access_view", + type = "onboarding_permission_view", properties = mapOf( AnalyticsEvent.OnboardingPropertiesKeys.STEP to "권한 설정1", ), From d52764e058a276254a6e42aa61591ee1462c0ada Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 17:06:17 +0900 Subject: [PATCH 150/210] =?UTF-8?q?[CHORE/#197]=20=EC=9A=B4=EC=84=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B2=B4=EB=A5=98=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EA=B3=84=EC=82=B0=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/analytics/AnalyticsEvent.kt | 1 + .../java/com/yapp/fortune/FortuneScreen.kt | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt index 6419a06c..3c278d90 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AnalyticsEvent.kt @@ -24,5 +24,6 @@ data class AnalyticsEvent( object FortunePropertiesKeys { const val FORTUNE_PAGE_NUMBER = "fortune_page_number" + const val DURATION = "duration" } } diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt index 9c0ed94f..0b7357bc 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneScreen.kt @@ -13,6 +13,10 @@ import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableLongStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -30,6 +34,8 @@ import com.yapp.fortune.component.FortuneTopAppBar import com.yapp.fortune.component.SlidingIndicator import com.yapp.fortune.page.FortunePager import com.yapp.ui.component.lottie.LottieAnimation +import java.math.BigDecimal +import java.math.RoundingMode @Composable fun FortuneRoute( @@ -44,6 +50,9 @@ fun FortuneRoute( pageCount = { state.fortunePages.size + 2 }, ) + var startTime by remember { mutableLongStateOf(System.currentTimeMillis()) } + var previousPage by remember { mutableIntStateOf(pagerState.currentPage) } + BackHandler { analyticsHelper.logEvent( AnalyticsEvent( @@ -76,6 +85,25 @@ fun FortuneRoute( ), ) + if (pagerState.currentPage != previousPage) { + val endTime = System.currentTimeMillis() + val duration = ((endTime - startTime).toDouble() / 1000) // 초 단위로 변환 + val truncatedDuration = BigDecimal(duration).setScale(2, RoundingMode.DOWN).toDouble() + + analyticsHelper.logEvent( + AnalyticsEvent( + type = "fortune_time_spent", + properties = mapOf( + AnalyticsEvent.FortunePropertiesKeys.FORTUNE_PAGE_NUMBER to previousPage + 1, + AnalyticsEvent.FortunePropertiesKeys.DURATION to truncatedDuration, + ), + ), + ) + + startTime = endTime + previousPage = pagerState.currentPage + } + if (state.currentStep != pagerState.currentPage) { viewModel.onAction(FortuneContract.Action.UpdateStep(pagerState.currentPage)) } From d0881e31d6c75ad3c91e1ba09a33a6e9f8f5b2f1 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 18 Mar 2025 17:27:13 +0900 Subject: [PATCH 151/210] =?UTF-8?q?[FIX/#197]=20userId=20=EC=A0=91?= =?UTF-8?q?=EB=91=90=EC=82=AC=20ORBIT=5F=20=EC=9C=BC=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt | 2 +- .../src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt index 0e7ecc34..a19a3ea9 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/AmplitudeAnalyticsHelper.kt @@ -12,7 +12,7 @@ class AmplitudeAnalyticsHelper @Inject constructor( } override fun setUserId(userId: Long?) { - amplitude.setUserId("Orbit_$userId") + amplitude.setUserId("ORBIT_$userId") } private fun AnalyticsEvent.toAmplitudeEvent(): BaseEvent { diff --git a/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt index 6bc113ee..b4ef3424 100644 --- a/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt +++ b/core/analytics/src/main/java/com/yapp/analytics/DebugAnalyticsHelper.kt @@ -10,7 +10,7 @@ class DebugAnalyticsHelper : AnalyticsHelper() { } override fun setUserId(userId: Long?) { - this.userId = "Orbit_$userId" + this.userId = "ORBIT_$userId" Log.d("DebugAnalyticsHelper", "setUserId: $userId") } } From ff615b9ea078ead913f48937175b92c89ea7d65c Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 19 Mar 2025 21:48:47 +0900 Subject: [PATCH 152/210] =?UTF-8?q?[ADD/#195]=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EB=A6=AC=EC=86=8C=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drawable-xhdpi/ic_mission_main_letter.png | Bin 0 -> 45086 bytes .../drawable-xxhdpi/ic_mission_main_letter.png | Bin 0 -> 71963 bytes .../res/drawable/ic_mission_main_letter.png | Bin 0 -> 20124 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 core/designsystem/src/main/res/drawable-xhdpi/ic_mission_main_letter.png create mode 100644 core/designsystem/src/main/res/drawable-xxhdpi/ic_mission_main_letter.png create mode 100644 core/designsystem/src/main/res/drawable/ic_mission_main_letter.png diff --git a/core/designsystem/src/main/res/drawable-xhdpi/ic_mission_main_letter.png b/core/designsystem/src/main/res/drawable-xhdpi/ic_mission_main_letter.png new file mode 100644 index 0000000000000000000000000000000000000000..ceeac7b70db8c0ca3128a489226391ceabe1c416 GIT binary patch literal 45086 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ℜy#WiXN1n&KWf!bRL}P!D)CrHo*#b1 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 z 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 CA2W&o literal 0 HcmV?d00001 diff --git a/core/designsystem/src/main/res/drawable/ic_mission_main_letter.png b/core/designsystem/src/main/res/drawable/ic_mission_main_letter.png new file mode 100644 index 0000000000000000000000000000000000000000..6c421ae1ccc1c72c99250a37599ec171d3517d86 GIT binary patch literal 20124 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 Date: Wed, 19 Mar 2025 21:51:49 +0900 Subject: [PATCH 153/210] =?UTF-8?q?[ADD/#195]=20=EB=A1=9C=EB=9D=A0=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/designsystem/src/main/res/raw/mission_letter_open.json | 1 + core/designsystem/src/main/res/raw/mission_letter_tap.json | 1 + 2 files changed, 2 insertions(+) create mode 100644 core/designsystem/src/main/res/raw/mission_letter_open.json create mode 100644 core/designsystem/src/main/res/raw/mission_letter_tap.json diff --git a/core/designsystem/src/main/res/raw/mission_letter_open.json b/core/designsystem/src/main/res/raw/mission_letter_open.json new file mode 100644 index 00000000..0e60c6cc --- /dev/null +++ b/core/designsystem/src/main/res/raw/mission_letter_open.json @@ -0,0 +1 @@ +{"assets":[{"id":"el-151-_-Uo","layers":[{"ddd":0,"ind":17,"ty":4,"nm":"Layer 1","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":false,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]},{"id":"el-159-_-Uo","layers":[{"ddd":0,"ind":28,"ty":4,"nm":"Layer 1","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]}],"ddd":0,"fr":30,"h":375,"ip":0,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":16.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.543,187.398],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[187.541,187.403],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[187.535,187.399],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[187.544,187.696],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[187.589,191.314],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[187.605,198.909],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[187.577,204.509],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[187.545,213.621],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":30,"s":[187.546,231.124],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[187.547,248.964],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[187.547,239.201],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[-3],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":1,"k":[{"t":0,"s":[139.605,139.605],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[139.456,139.456],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[141.715,141.715],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[141.395,141.395],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[141.751,141.751],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[185.454,185.454],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"열리는 부분 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"열리는부분_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[141.098,430.387],[137.967,433.165],[160.276,440.363],[179.5,450.912],[198.531,461.681],[214.947,475.284],[237.458,482.263],[253.681,496.078],[274.977,504.386],[295.325,513.719],[313.913,524.961],[332.245,536.472],[350.484,548.103],[371.89,556.284],[390.387,567.625],[407.438,580.542],[428.209,589.43],[446.946,600.516],[467.385,609.758],[485.394,621.636],[507.224,629.364],[525.353,641.122],[548.241,650.271],[574.168,649.805],[599.129,643.257],[617.635,632.722],[636.813,622.909],[655.825,612.925],[673.199,601.139],[690.84,589.656],[712.182,582.204],[730.909,571.895],[746.239,557.889],[767.995,550.889],[784.07,537.695],[805.163,529.974],[824.167,519.97],[841.319,507.957],[863.333,501.226],[878.138,486.647],[900.613,480.425],[918.778,469.501],[935.747,457.276],[955.017,447.554],[976.092,439.804],[969.444,428.987],[946.436,426.321],[923.428,427.735],[900.419,430.125],[877.42,428.393],[854.412,427.495],[831.403,429.581],[808.395,426.095],[785.396,425.954],[762.378,428.188],[739.379,429.729],[716.371,426.159],[693.362,426.66],[670.354,426.936],[647.346,429.736],[624.337,427.516],[601.329,428.294],[578.321,427.057],[555.312,428.669],[532.304,428.513],[509.296,428.273],[486.278,425.423],[463.27,425.558],[440.261,430.436],[417.253,429.015],[394.236,426.738],[371.227,425.564],[348.219,425.063],[325.211,425.126],[302.202,429.694],[279.185,429.213],[256.176,427.375],[233.159,425.678],[210.15,429.093],[187.133,425.635],[163.959,426.116]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,187.819],[132.503,189.032],[153.928,192.173],[172.391,196.777],[190.668,201.476],[206.434,207.412],[228.054,210.458],[243.634,216.487],[264.086,220.112],[283.628,224.185],[301.48,229.091],[319.086,234.115],[336.602,239.19],[357.161,242.76],[374.925,247.709],[391.301,253.347],[411.25,257.225],[429.244,262.063],[448.874,266.096],[466.17,271.28],[487.135,274.652],[504.545,279.783],[526.528,283.776],[551.428,283.572],[575.399,280.715],[593.173,276.118],[611.591,271.835],[629.851,267.478],[646.536,262.335],[663.478,257.324],[683.975,254.072],[701.96,249.573],[716.683,243.461],[737.577,240.406],[753.016,234.648],[773.274,231.279],[791.525,226.913],[807.998,221.671],[829.14,218.733],[843.359,212.371],[864.943,209.656],[882.389,204.888],[898.685,199.553],[917.192,195.311],[937.432,191.929],[931.048,187.208],[908.951,186.045],[886.854,186.662],[864.757,187.705],[842.669,186.949],[820.571,186.557],[798.475,187.467],[776.378,185.946],[754.289,185.885],[732.183,186.86],[710.095,187.532],[687.998,185.974],[665.901,186.193],[643.804,186.313],[621.707,187.535],[599.61,186.566],[577.513,186.906],[555.416,186.366],[533.318,187.069],[511.221,187.001],[489.124,186.897],[467.018,185.653],[444.921,185.712],[422.824,187.841],[400.727,187.221],[378.621,186.227],[356.524,185.715],[334.427,185.496],[312.33,185.524],[290.233,187.517],[268.127,187.307],[246.03,186.505],[223.924,185.764],[201.827,187.255],[179.721,185.746],[157.465,185.955]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,79.805],[132.503,80.321],[153.928,81.655],[172.391,83.611],[190.668,85.608],[206.434,88.13],[228.054,89.424],[243.634,91.986],[264.086,93.527],[283.628,95.257],[301.48,97.342],[319.086,99.476],[336.602,101.633],[357.161,103.15],[374.925,105.253],[391.301,107.648],[411.25,109.296],[429.244,111.352],[448.874,113.065],[466.17,115.268],[487.135,116.701],[504.545,118.881],[526.528,120.578],[551.428,120.491],[575.399,119.277],[593.173,117.324],[611.591,115.504],[629.851,113.653],[646.536,111.467],[663.478,109.338],[683.975,107.956],[701.96,106.045],[716.683,103.448],[737.577,102.15],[753.016,99.703],[773.274,98.272],[791.525,96.416],[807.998,94.189],[829.14,92.941],[843.359,90.237],[864.943,89.084],[882.389,87.058],[898.685,84.791],[917.192,82.988],[937.432,81.552],[931.048,79.546],[908.951,79.051],[886.854,79.314],[864.757,79.757],[842.669,79.436],[820.571,79.269],[798.475,79.656],[776.378,79.009],[754.289,78.983],[732.183,79.398],[710.095,79.683],[687.998,79.021],[665.901,79.114],[643.804,79.165],[621.707,79.685],[599.61,79.273],[577.513,79.417],[555.416,79.188],[533.318,79.487],[511.221,79.458],[489.124,79.413],[467.018,78.885],[444.921,78.91],[422.824,79.814],[400.727,79.551],[378.621,79.129],[356.524,78.911],[334.427,78.818],[312.33,78.83],[290.233,79.677],[268.127,79.588],[246.03,79.247],[223.924,78.932],[201.827,79.565],[179.721,78.924],[157.465,79.013]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,41.767],[132.503,42.037],[153.928,42.735],[172.391,43.759],[190.668,44.804],[206.434,46.124],[228.054,46.801],[243.634,48.142],[264.086,48.948],[283.628,49.854],[301.48,50.945],[319.086,52.062],[336.602,53.191],[357.161,53.985],[374.925,55.085],[391.301,56.339],[411.25,57.201],[429.244,58.277],[448.874,59.174],[466.17,60.327],[487.135,61.077],[504.545,62.218],[526.528,63.106],[551.428,63.06],[575.399,62.425],[593.173,61.403],[611.591,60.45],[629.851,59.481],[646.536,58.338],[663.478,57.223],[683.975,56.5],[701.96,55.5],[716.683,54.14],[737.577,53.461],[753.016,52.181],[773.274,51.431],[791.525,50.461],[807.998,49.295],[829.14,48.642],[843.359,47.227],[864.943,46.623],[882.389,45.563],[898.685,44.376],[917.192,43.433],[937.432,42.681],[931.048,41.631],[908.951,41.372],[886.854,41.51],[864.757,41.742],[842.669,41.573],[820.571,41.486],[798.475,41.689],[776.378,41.35],[754.289,41.337],[732.183,41.554],[710.095,41.703],[687.998,41.357],[665.901,41.405],[643.804,41.432],[621.707,41.704],[599.61,41.488],[577.513,41.564],[555.416,41.444],[533.318,41.6],[511.221,41.585],[489.124,41.562],[467.018,41.285],[444.921,41.298],[422.824,41.772],[400.727,41.634],[378.621,41.413],[356.524,41.299],[334.427,41.25],[312.33,41.256],[290.233,41.7],[268.127,41.653],[246.03,41.475],[223.924,41.31],[201.827,41.641],[179.721,41.306],[157.465,41.353]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,164.924],[132.503,165.989],[153.928,168.747],[172.391,172.789],[190.668,176.916],[206.434,182.128],[228.054,184.803],[243.634,190.097],[264.086,193.28],[283.628,196.857],[301.48,201.165],[319.086,205.576],[336.602,210.033],[357.161,213.167],[374.925,217.513],[391.301,222.463],[411.25,225.869],[429.244,230.117],[448.874,233.659],[466.17,238.21],[487.135,241.172],[504.545,245.677],[526.528,249.183],[551.428,249.005],[575.399,246.496],[593.173,242.459],[611.591,238.698],[629.851,234.872],[646.536,230.356],[663.478,225.956],[683.975,223.1],[701.96,219.15],[716.683,213.782],[737.577,211.1],[753.016,206.044],[773.274,203.086],[791.525,199.252],[807.998,194.649],[829.14,192.069],[843.359,186.482],[864.943,184.098],[882.389,179.912],[898.685,175.228],[917.192,171.502],[937.432,168.533],[931.048,164.387],[908.951,163.366],[886.854,163.908],[864.757,164.824],[842.669,164.16],[820.571,163.816],[798.475,164.615],[776.378,163.279],[754.289,163.225],[732.183,164.081],[710.095,164.672],[687.998,163.304],[665.901,163.496],[643.804,163.602],[621.707,164.675],[599.61,163.824],[577.513,164.122],[555.416,163.648],[533.318,164.265],[511.221,164.206],[489.124,164.114],[467.018,163.022],[444.921,163.073],[422.824,164.943],[400.727,164.398],[378.621,163.526],[356.524,163.076],[334.427,162.884],[312.33,162.908],[290.233,164.658],[268.127,164.474],[246.03,163.77],[223.924,163.119],[201.827,164.428],[179.721,163.103],[157.465,163.287]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[123.934,148.774],[121.185,149.735],[140.78,152.223],[157.665,155.869],[174.381,159.592],[188.801,164.294],[208.573,166.706],[222.823,171.482],[241.528,174.354],[259.401,177.58],[275.728,181.466],[291.83,185.445],[307.85,189.466],[326.653,192.294],[342.899,196.214],[357.877,200.679],[376.121,203.752],[392.578,207.584],[410.532,210.778],[426.35,214.884],[445.524,217.556],[461.448,221.62],[481.552,224.783],[504.325,224.622],[526.249,222.358],[542.504,218.717],[559.35,215.324],[576.049,211.873],[591.31,207.799],[606.804,203.83],[625.55,201.254],[641.999,197.69],[655.464,192.848],[674.574,190.429],[688.694,185.868],[707.221,183.199],[723.913,179.741],[738.979,175.588],[758.315,173.262],[771.32,168.222],[791.06,166.071],[807.016,162.295],[821.92,158.069],[838.846,154.708],[857.358,152.03],[851.519,148.29],[831.309,147.369],[811.1,147.858],[790.89,148.684],[770.689,148.085],[750.479,147.775],[730.27,148.495],[710.06,147.291],[689.858,147.242],[669.641,148.014],[649.439,148.547],[629.23,147.313],[609.02,147.486],[588.811,147.581],[568.601,148.549],[548.392,147.782],[528.182,148.051],[507.973,147.623],[487.763,148.18],[467.553,148.126],[447.344,148.043],[427.126,147.058],[406.917,147.105],[386.707,148.791],[366.497,148.3],[346.28,147.513],[326.07,147.107],[305.861,146.934],[285.651,146.956],[265.442,148.535],[245.224,148.368],[225.014,147.733],[204.797,147.146],[184.587,148.327],[164.369,147.132],[144.014,147.298]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":10.96}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-578.404,-631.493],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[-557.029,-537.667],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-534.968,-234.636],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[-534.968,-99.698],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[-534.968,-52.178],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-534.968,-206.034],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-489.271,-185.858],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"열리는부분_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[141.098,430.387],[137.967,433.165],[160.276,440.363],[179.5,450.912],[198.531,461.681],[214.947,475.284],[237.458,482.263],[253.681,496.078],[274.977,504.386],[295.325,513.719],[313.913,524.961],[332.245,536.472],[350.484,548.103],[371.89,556.284],[390.387,567.625],[407.438,580.542],[428.209,589.43],[446.946,600.516],[467.385,609.758],[485.394,621.636],[507.224,629.364],[525.353,641.122],[548.241,650.271],[574.168,649.805],[599.129,643.257],[617.635,632.722],[636.813,622.909],[655.825,612.925],[673.199,601.139],[690.84,589.656],[712.182,582.204],[730.909,571.895],[746.239,557.889],[767.995,550.889],[784.07,537.695],[805.163,529.974],[824.167,519.97],[841.319,507.957],[863.333,501.226],[878.138,486.647],[900.613,480.425],[918.778,469.501],[935.747,457.276],[955.017,447.554],[976.092,439.804],[969.444,428.987],[946.436,426.321],[923.428,427.735],[900.419,430.125],[877.42,428.393],[854.412,427.495],[831.403,429.581],[808.395,426.095],[785.396,425.954],[762.378,428.188],[739.379,429.729],[716.371,426.159],[693.362,426.66],[670.354,426.936],[647.346,429.736],[624.337,427.516],[601.329,428.294],[578.321,427.057],[555.312,428.669],[532.304,428.513],[509.296,428.273],[486.278,425.423],[463.27,425.558],[440.261,430.436],[417.253,429.015],[394.236,426.738],[371.227,425.564],[348.219,425.063],[325.211,425.126],[302.202,429.694],[279.185,429.213],[256.176,427.375],[233.159,425.678],[210.15,429.093],[187.133,425.635],[163.959,426.116]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,187.819],[132.503,189.032],[153.928,192.173],[172.391,196.777],[190.668,201.476],[206.434,207.412],[228.054,210.458],[243.634,216.487],[264.086,220.112],[283.628,224.185],[301.48,229.091],[319.086,234.115],[336.602,239.19],[357.161,242.76],[374.925,247.709],[391.301,253.347],[411.25,257.225],[429.244,262.063],[448.874,266.096],[466.17,271.28],[487.135,274.652],[504.545,279.783],[526.528,283.776],[551.428,283.572],[575.399,280.715],[593.173,276.118],[611.591,271.835],[629.851,267.478],[646.536,262.335],[663.478,257.324],[683.975,254.072],[701.96,249.573],[716.683,243.461],[737.577,240.406],[753.016,234.648],[773.274,231.279],[791.525,226.913],[807.998,221.671],[829.14,218.733],[843.359,212.371],[864.943,209.656],[882.389,204.888],[898.685,199.553],[917.192,195.311],[937.432,191.929],[931.048,187.208],[908.951,186.045],[886.854,186.662],[864.757,187.705],[842.669,186.949],[820.571,186.557],[798.475,187.467],[776.378,185.946],[754.289,185.885],[732.183,186.86],[710.095,187.532],[687.998,185.974],[665.901,186.193],[643.804,186.313],[621.707,187.535],[599.61,186.566],[577.513,186.906],[555.416,186.366],[533.318,187.069],[511.221,187.001],[489.124,186.897],[467.018,185.653],[444.921,185.712],[422.824,187.841],[400.727,187.221],[378.621,186.227],[356.524,185.715],[334.427,185.496],[312.33,185.524],[290.233,187.517],[268.127,187.307],[246.03,186.505],[223.924,185.764],[201.827,187.255],[179.721,185.746],[157.465,185.955]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,79.805],[132.503,80.321],[153.928,81.655],[172.391,83.611],[190.668,85.608],[206.434,88.13],[228.054,89.424],[243.634,91.986],[264.086,93.527],[283.628,95.257],[301.48,97.342],[319.086,99.476],[336.602,101.633],[357.161,103.15],[374.925,105.253],[391.301,107.648],[411.25,109.296],[429.244,111.352],[448.874,113.065],[466.17,115.268],[487.135,116.701],[504.545,118.881],[526.528,120.578],[551.428,120.491],[575.399,119.277],[593.173,117.324],[611.591,115.504],[629.851,113.653],[646.536,111.467],[663.478,109.338],[683.975,107.956],[701.96,106.045],[716.683,103.448],[737.577,102.15],[753.016,99.703],[773.274,98.272],[791.525,96.416],[807.998,94.189],[829.14,92.941],[843.359,90.237],[864.943,89.084],[882.389,87.058],[898.685,84.791],[917.192,82.988],[937.432,81.552],[931.048,79.546],[908.951,79.051],[886.854,79.314],[864.757,79.757],[842.669,79.436],[820.571,79.269],[798.475,79.656],[776.378,79.009],[754.289,78.983],[732.183,79.398],[710.095,79.683],[687.998,79.021],[665.901,79.114],[643.804,79.165],[621.707,79.685],[599.61,79.273],[577.513,79.417],[555.416,79.188],[533.318,79.487],[511.221,79.458],[489.124,79.413],[467.018,78.885],[444.921,78.91],[422.824,79.814],[400.727,79.551],[378.621,79.129],[356.524,78.911],[334.427,78.818],[312.33,78.83],[290.233,79.677],[268.127,79.588],[246.03,79.247],[223.924,78.932],[201.827,79.565],[179.721,78.924],[157.465,79.013]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,41.767],[132.503,42.037],[153.928,42.735],[172.391,43.759],[190.668,44.804],[206.434,46.124],[228.054,46.801],[243.634,48.142],[264.086,48.948],[283.628,49.854],[301.48,50.945],[319.086,52.062],[336.602,53.191],[357.161,53.985],[374.925,55.085],[391.301,56.339],[411.25,57.201],[429.244,58.277],[448.874,59.174],[466.17,60.327],[487.135,61.077],[504.545,62.218],[526.528,63.106],[551.428,63.06],[575.399,62.425],[593.173,61.403],[611.591,60.45],[629.851,59.481],[646.536,58.338],[663.478,57.223],[683.975,56.5],[701.96,55.5],[716.683,54.14],[737.577,53.461],[753.016,52.181],[773.274,51.431],[791.525,50.461],[807.998,49.295],[829.14,48.642],[843.359,47.227],[864.943,46.623],[882.389,45.563],[898.685,44.376],[917.192,43.433],[937.432,42.681],[931.048,41.631],[908.951,41.372],[886.854,41.51],[864.757,41.742],[842.669,41.573],[820.571,41.486],[798.475,41.689],[776.378,41.35],[754.289,41.337],[732.183,41.554],[710.095,41.703],[687.998,41.357],[665.901,41.405],[643.804,41.432],[621.707,41.704],[599.61,41.488],[577.513,41.564],[555.416,41.444],[533.318,41.6],[511.221,41.585],[489.124,41.562],[467.018,41.285],[444.921,41.298],[422.824,41.772],[400.727,41.634],[378.621,41.413],[356.524,41.299],[334.427,41.25],[312.33,41.256],[290.233,41.7],[268.127,41.653],[246.03,41.475],[223.924,41.31],[201.827,41.641],[179.721,41.306],[157.465,41.353]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[135.509,164.924],[132.503,165.989],[153.928,168.747],[172.391,172.789],[190.668,176.916],[206.434,182.128],[228.054,184.803],[243.634,190.097],[264.086,193.28],[283.628,196.857],[301.48,201.165],[319.086,205.576],[336.602,210.033],[357.161,213.167],[374.925,217.513],[391.301,222.463],[411.25,225.869],[429.244,230.117],[448.874,233.659],[466.17,238.21],[487.135,241.172],[504.545,245.677],[526.528,249.183],[551.428,249.005],[575.399,246.496],[593.173,242.459],[611.591,238.698],[629.851,234.872],[646.536,230.356],[663.478,225.956],[683.975,223.1],[701.96,219.15],[716.683,213.782],[737.577,211.1],[753.016,206.044],[773.274,203.086],[791.525,199.252],[807.998,194.649],[829.14,192.069],[843.359,186.482],[864.943,184.098],[882.389,179.912],[898.685,175.228],[917.192,171.502],[937.432,168.533],[931.048,164.387],[908.951,163.366],[886.854,163.908],[864.757,164.824],[842.669,164.16],[820.571,163.816],[798.475,164.615],[776.378,163.279],[754.289,163.225],[732.183,164.081],[710.095,164.672],[687.998,163.304],[665.901,163.496],[643.804,163.602],[621.707,164.675],[599.61,163.824],[577.513,164.122],[555.416,163.648],[533.318,164.265],[511.221,164.206],[489.124,164.114],[467.018,163.022],[444.921,163.073],[422.824,164.943],[400.727,164.398],[378.621,163.526],[356.524,163.076],[334.427,162.884],[312.33,162.908],[290.233,164.658],[268.127,164.474],[246.03,163.77],[223.924,163.119],[201.827,164.428],[179.721,163.103],[157.465,163.287]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[123.934,148.774],[121.185,149.735],[140.78,152.223],[157.665,155.869],[174.381,159.592],[188.801,164.294],[208.573,166.706],[222.823,171.482],[241.528,174.354],[259.401,177.58],[275.728,181.466],[291.83,185.445],[307.85,189.466],[326.653,192.294],[342.899,196.214],[357.877,200.679],[376.121,203.752],[392.578,207.584],[410.532,210.778],[426.35,214.884],[445.524,217.556],[461.448,221.62],[481.552,224.783],[504.325,224.622],[526.249,222.358],[542.504,218.717],[559.35,215.324],[576.049,211.873],[591.31,207.799],[606.804,203.83],[625.55,201.254],[641.999,197.69],[655.464,192.848],[674.574,190.429],[688.694,185.868],[707.221,183.199],[723.913,179.741],[738.979,175.588],[758.315,173.262],[771.32,168.222],[791.06,166.071],[807.016,162.295],[821.92,158.069],[838.846,154.708],[857.358,152.03],[851.519,148.29],[831.309,147.369],[811.1,147.858],[790.89,148.684],[770.689,148.085],[750.479,147.775],[730.27,148.495],[710.06,147.291],[689.858,147.242],[669.641,148.014],[649.439,148.547],[629.23,147.313],[609.02,147.486],[588.811,147.581],[568.601,148.549],[548.392,147.782],[528.182,148.051],[507.973,147.623],[487.763,148.18],[467.553,148.126],[447.344,148.043],[427.126,147.058],[406.917,147.105],[386.707,148.791],[366.497,148.3],[346.28,147.513],[326.07,147.107],[305.861,146.934],[285.651,146.956],[265.442,148.535],[245.224,148.368],[225.014,147.733],[204.797,147.146],[184.587,148.327],[164.369,147.132],[144.014,147.298]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-578.404,-631.493],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[-557.029,-537.667],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-534.968,-234.636],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[-534.968,-99.698],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[-534.968,-52.178],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-534.968,-206.034],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-489.271,-185.858],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.6,"s":[0,-112.605],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,-49.14],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[0,-20.88],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":23.7,"s":[0,-15.193],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,-43.15],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,-38.925],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[100],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[0.832,-26.592],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[0.797,-29.327],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[-0.179,-57.637],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[0.737,-57.637],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[0.737,-55.475],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[0.737,-57.711],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[0.737,-56.813],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[0.737,-50.611],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[0.674,-45.655],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"센터_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,1101.741],[929.439,1096.691],[907.395,1082.518],[889.392,1063.817],[871.654,1044.831],[857.321,1022.01],[835.011,1008.132],[820.934,985.036],[800.234,969.354],[780.754,952.304],[763.592,932.673],[746.738,912.681],[730.035,892.518],[709.167,877.026],[692.119,857.262],[676.954,835.371],[656.944,818.92],[639.577,799.498],[619.991,782.563],[603.571,762.068],[582.164,747.173],[565.593,726.849],[544.884,711.148],[519.454,711.831],[496.013,723.944],[477.842,743.452],[458.795,761.982],[439.97,780.75],[423.293,801.938],[406.254,822.717],[384.387,838.068],[365.932,857.262],[351.917,881.45],[329.511,896.192],[314.523,919.279],[292.974,934.989],[274.166,953.776],[257.764,975.277],[235.021,989.649],[221.696,1014.616],[198.343,1028.304],[180.623,1048.325],[164.477,1070.12],[145.315,1088.536],[149.295,1109.44],[174.354,1103.877],[199.413,1107.949],[224.464,1105.785],[249.523,1102.14],[274.573,1104.788],[299.624,1106.155],[324.683,1102.975],[349.733,1108.301],[374.793,1108.509],[399.843,1105.101],[424.902,1102.747],[449.962,1108.196],[475.012,1107.427],[500.071,1107],[525.13,1102.738],[550.19,1106.127],[575.24,1104.94],[600.299,1106.82],[625.359,1104.361],[650.418,1104.608],[675.477,1104.969],[700.537,1109.316],[725.587,1109.117],[750.646,1101.665],[775.706,1103.839],[800.765,1107.304],[825.824,1109.098],[850.892,1109.867],[875.951,1109.772],[900.816,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,967.437],[929.439,963.003],[907.395,950.558],[889.392,934.136],[871.654,917.465],[857.321,897.426],[835.011,885.239],[820.934,864.959],[800.234,851.188],[780.754,836.217],[763.592,818.979],[746.738,801.424],[730.035,783.719],[709.167,770.115],[692.119,752.761],[676.954,733.539],[656.944,719.093],[639.577,702.038],[619.991,687.167],[603.571,669.171],[582.164,656.092],[565.593,638.245],[544.884,624.458],[519.454,625.058],[496.013,635.695],[477.842,652.824],[458.795,669.096],[439.97,685.575],[423.293,704.18],[406.254,722.427],[384.387,735.906],[365.932,752.761],[351.917,774],[329.511,786.945],[314.523,807.218],[292.974,821.013],[274.166,837.509],[257.764,856.39],[235.021,869.01],[221.696,890.933],[198.343,902.953],[180.623,920.533],[164.477,939.671],[145.315,955.842],[149.295,974.198],[174.354,969.313],[199.413,972.889],[224.464,970.988],[249.523,967.787],[274.573,970.113],[299.624,971.313],[324.683,968.521],[349.733,973.197],[374.793,973.381],[399.843,970.388],[424.902,968.321],[449.962,973.106],[475.012,972.43],[500.071,972.055],[525.13,968.313],[550.19,971.288],[575.24,970.246],[600.299,971.897],[625.359,969.738],[650.418,969.955],[675.477,970.271],[700.537,974.089],[725.587,973.914],[750.646,967.371],[775.706,969.28],[800.765,972.322],[825.824,973.897],[850.892,974.573],[875.951,974.489],[900.816,968.379]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[846.974,872.704],[850.047,868.704],[829.886,857.477],[813.421,842.664],[797.198,827.625],[784.089,809.549],[763.685,798.555],[750.811,780.26],[731.879,767.838],[714.063,754.333],[698.366,738.783],[682.952,722.947],[667.676,706.976],[648.59,694.704],[632.998,679.049],[619.129,661.709],[600.828,648.678],[584.945,633.293],[567.032,619.879],[552.015,603.644],[532.436,591.846],[517.281,575.747],[498.341,563.31],[475.082,563.851],[453.644,573.446],[437.025,588.899],[419.605,603.577],[402.388,618.442],[387.136,635.226],[371.552,651.686],[351.553,663.845],[334.675,679.049],[321.857,698.208],[301.364,709.886],[287.657,728.173],[267.948,740.618],[250.747,755.499],[235.746,772.53],[214.946,783.915],[202.759,803.691],[181.401,814.534],[165.194,830.392],[150.427,847.657],[132.903,862.245],[136.542,878.802],[159.461,874.396],[182.379,877.622],[205.29,875.907],[228.209,873.02],[251.119,875.118],[274.03,876.201],[296.949,873.682],[319.859,877.9],[342.778,878.065],[365.689,875.366],[388.607,873.501],[411.526,877.818],[434.437,877.208],[457.356,876.87],[480.274,873.494],[503.193,876.178],[526.104,875.238],[549.022,876.727],[571.941,874.78],[594.86,874.975],[617.779,875.261],[640.697,878.705],[663.608,878.547],[686.527,872.644],[709.445,874.366],[732.364,877.111],[755.283,878.532],[778.21,879.141],[801.128,879.066],[823.869,873.554]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":12.46}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-581.009,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-537.377,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-537.377,-799.515],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-491.475,-721.225],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,1101.741],[929.439,1096.691],[907.395,1082.518],[889.392,1063.817],[871.654,1044.831],[857.321,1022.01],[835.011,1008.132],[820.934,985.036],[800.234,969.354],[780.754,952.304],[763.592,932.673],[746.738,912.681],[730.035,892.518],[709.167,877.026],[692.119,857.262],[676.954,835.371],[656.944,818.92],[639.577,799.498],[619.991,782.563],[603.571,762.068],[582.164,747.173],[565.593,726.849],[544.884,711.148],[519.454,711.831],[496.013,723.944],[477.842,743.452],[458.795,761.982],[439.97,780.75],[423.293,801.938],[406.254,822.717],[384.387,838.068],[365.932,857.262],[351.917,881.45],[329.511,896.192],[314.523,919.279],[292.974,934.989],[274.166,953.776],[257.764,975.277],[235.021,989.649],[221.696,1014.616],[198.343,1028.304],[180.623,1048.325],[164.477,1070.12],[145.315,1088.536],[149.295,1109.44],[174.354,1103.877],[199.413,1107.949],[224.464,1105.785],[249.523,1102.14],[274.573,1104.788],[299.624,1106.155],[324.683,1102.975],[349.733,1108.301],[374.793,1108.509],[399.843,1105.101],[424.902,1102.747],[449.962,1108.196],[475.012,1107.427],[500.071,1107],[525.13,1102.738],[550.19,1106.127],[575.24,1104.94],[600.299,1106.82],[625.359,1104.361],[650.418,1104.608],[675.477,1104.969],[700.537,1109.316],[725.587,1109.117],[750.646,1101.665],[775.706,1103.839],[800.765,1107.304],[825.824,1109.098],[850.892,1109.867],[875.951,1109.772],[900.816,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[926.079,967.437],[929.439,963.003],[907.395,950.558],[889.392,934.136],[871.654,917.465],[857.321,897.426],[835.011,885.239],[820.934,864.959],[800.234,851.188],[780.754,836.217],[763.592,818.979],[746.738,801.424],[730.035,783.719],[709.167,770.115],[692.119,752.761],[676.954,733.539],[656.944,719.093],[639.577,702.038],[619.991,687.167],[603.571,669.171],[582.164,656.092],[565.593,638.245],[544.884,624.458],[519.454,625.058],[496.013,635.695],[477.842,652.824],[458.795,669.096],[439.97,685.575],[423.293,704.18],[406.254,722.427],[384.387,735.906],[365.932,752.761],[351.917,774],[329.511,786.945],[314.523,807.218],[292.974,821.013],[274.166,837.509],[257.764,856.39],[235.021,869.01],[221.696,890.933],[198.343,902.953],[180.623,920.533],[164.477,939.671],[145.315,955.842],[149.295,974.198],[174.354,969.313],[199.413,972.889],[224.464,970.988],[249.523,967.787],[274.573,970.113],[299.624,971.313],[324.683,968.521],[349.733,973.197],[374.793,973.381],[399.843,970.388],[424.902,968.321],[449.962,973.106],[475.012,972.43],[500.071,972.055],[525.13,968.313],[550.19,971.288],[575.24,970.246],[600.299,971.897],[625.359,969.738],[650.418,969.955],[675.477,970.271],[700.537,974.089],[725.587,973.914],[750.646,967.371],[775.706,969.28],[800.765,972.322],[825.824,973.897],[850.892,974.573],[875.951,974.489],[900.816,968.379]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[846.974,872.704],[850.047,868.704],[829.886,857.477],[813.421,842.664],[797.198,827.625],[784.089,809.549],[763.685,798.555],[750.811,780.26],[731.879,767.838],[714.063,754.333],[698.366,738.783],[682.952,722.947],[667.676,706.976],[648.59,694.704],[632.998,679.049],[619.129,661.709],[600.828,648.678],[584.945,633.293],[567.032,619.879],[552.015,603.644],[532.436,591.846],[517.281,575.747],[498.341,563.31],[475.082,563.851],[453.644,573.446],[437.025,588.899],[419.605,603.577],[402.388,618.442],[387.136,635.226],[371.552,651.686],[351.553,663.845],[334.675,679.049],[321.857,698.208],[301.364,709.886],[287.657,728.173],[267.948,740.618],[250.747,755.499],[235.746,772.53],[214.946,783.915],[202.759,803.691],[181.401,814.534],[165.194,830.392],[150.427,847.657],[132.903,862.245],[136.542,878.802],[159.461,874.396],[182.379,877.622],[205.29,875.907],[228.209,873.02],[251.119,875.118],[274.03,876.201],[296.949,873.682],[319.859,877.9],[342.778,878.065],[365.689,875.366],[388.607,873.501],[411.526,877.818],[434.437,877.208],[457.356,876.87],[480.274,873.494],[503.193,876.178],[526.104,875.238],[549.022,876.727],[571.941,874.78],[594.86,874.975],[617.779,875.261],[640.697,878.705],[663.608,878.547],[686.527,872.644],[709.445,874.366],[732.364,877.111],[755.283,878.532],[778.21,879.141],[801.128,879.066],[823.869,873.554]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-581.009,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-537.377,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-537.377,-799.515],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-491.475,-721.225],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[1.414,15.889],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[1.355,15.102],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[1.253,15.102],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[1.253,13.261],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[1.146,11.963],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"왼쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,817.411],[477.276,800.219],[451.889,792.264],[431.888,774.902],[408.544,763.368],[387.587,747.667],[365.756,733.494],[344.578,718.173],[325.001,700.041],[303.134,685.944],[279.658,674.648],[259.099,658.244],[234.199,649.444],[214.569,631.408],[194.152,614.738],[171.135,602.645],[149.135,588.747],[128.648,576.814],[128.648,601.154],[125.668,627.953],[123.731,654.751],[127.834,681.549],[129.063,708.357],[131.309,735.155],[127.746,761.954],[128.842,788.762],[126.711,815.56],[126.304,842.368],[128.86,869.166],[126.994,895.964],[126.879,922.763],[130.062,949.57],[125.624,976.378],[127.763,1003.186],[124.775,1029.994],[124.324,1056.802],[124.147,1083.61],[141.708,1094.612],[165.511,1082.594],[185.433,1064.823],[206.195,1048.306],[226.975,1031.798],[248.718,1016.704],[269.577,1000.319],[287.333,979.388],[307.82,962.443],[329.511,947.283],[353.191,935.027],[374.448,919.222],[391.31,896.971],[412.992,881.792],[435.761,868.179],[456.708,851.927],[474.8,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,717.768],[477.276,702.672],[451.889,695.686],[431.888,680.44],[408.544,670.313],[387.587,656.525],[365.756,644.08],[344.578,630.627],[325.001,614.706],[303.134,602.327],[279.658,592.408],[259.099,578.003],[234.199,570.276],[214.569,554.438],[194.152,539.801],[171.135,529.181],[149.135,516.978],[128.648,506.5],[128.648,527.873],[125.668,551.404],[123.731,574.936],[127.834,598.467],[129.063,622.007],[131.309,645.539],[127.746,669.071],[128.842,692.611],[126.711,716.142],[126.304,739.682],[128.86,763.214],[126.994,786.745],[126.879,810.277],[130.062,833.817],[125.624,857.357],[127.763,880.896],[124.775,904.437],[124.324,927.977],[124.147,951.516],[141.708,961.177],[165.511,950.624],[185.433,935.02],[206.195,920.516],[226.975,906.02],[248.718,892.766],[269.577,878.379],[287.333,859.999],[307.82,845.12],[329.511,831.808],[353.191,821.047],[374.448,807.168],[391.31,787.629],[412.992,774.3],[435.761,762.347],[456.708,748.076],[474.8,729.963]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[457.477,647.483],[436.507,633.865],[413.289,627.564],[394.996,613.811],[373.646,604.675],[354.48,592.237],[334.513,581.011],[315.145,568.875],[297.24,554.513],[277.241,543.346],[255.769,534.398],[236.967,521.404],[214.194,514.434],[196.241,500.147],[177.568,486.943],[156.517,477.363],[136.396,466.355],[117.659,456.903],[117.659,476.183],[114.933,497.41],[113.162,518.637],[116.915,539.865],[118.039,561.099],[120.093,582.327],[116.834,603.554],[117.837,624.789],[115.888,646.016],[115.516,667.251],[117.853,688.478],[116.146,709.706],[116.041,730.933],[118.953,752.168],[114.893,773.403],[116.85,794.637],[114.116,815.873],[113.704,837.107],[113.542,858.342],[129.603,867.057],[151.374,857.538],[169.594,843.461],[188.582,830.378],[207.587,817.301],[227.473,805.345],[246.55,792.367],[262.789,775.786],[281.527,762.364],[301.364,750.356],[323.021,740.648],[342.463,728.128],[357.885,710.503],[377.714,698.479],[398.538,687.696],[417.697,674.823],[434.243,658.483]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-337.298,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-311.968,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-311.968,-733.839],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-285.32,-661.98],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,817.411],[477.276,800.219],[451.889,792.264],[431.888,774.902],[408.544,763.368],[387.587,747.667],[365.756,733.494],[344.578,718.173],[325.001,700.041],[303.134,685.944],[279.658,674.648],[259.099,658.244],[234.199,649.444],[214.569,631.408],[194.152,614.738],[171.135,602.645],[149.135,588.747],[128.648,576.814],[128.648,601.154],[125.668,627.953],[123.731,654.751],[127.834,681.549],[129.063,708.357],[131.309,735.155],[127.746,761.954],[128.842,788.762],[126.711,815.56],[126.304,842.368],[128.86,869.166],[126.994,895.964],[126.879,922.763],[130.062,949.57],[125.624,976.378],[127.763,1003.186],[124.775,1029.994],[124.324,1056.802],[124.147,1083.61],[141.708,1094.612],[165.511,1082.594],[185.433,1064.823],[206.195,1048.306],[226.975,1031.798],[248.718,1016.704],[269.577,1000.319],[287.333,979.388],[307.82,962.443],[329.511,947.283],[353.191,935.027],[374.448,919.222],[391.31,896.971],[412.992,881.792],[435.761,868.179],[456.708,851.927],[474.8,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[500.204,717.768],[477.276,702.672],[451.889,695.686],[431.888,680.44],[408.544,670.313],[387.587,656.525],[365.756,644.08],[344.578,630.627],[325.001,614.706],[303.134,602.327],[279.658,592.408],[259.099,578.003],[234.199,570.276],[214.569,554.438],[194.152,539.801],[171.135,529.181],[149.135,516.978],[128.648,506.5],[128.648,527.873],[125.668,551.404],[123.731,574.936],[127.834,598.467],[129.063,622.007],[131.309,645.539],[127.746,669.071],[128.842,692.611],[126.711,716.142],[126.304,739.682],[128.86,763.214],[126.994,786.745],[126.879,810.277],[130.062,833.817],[125.624,857.357],[127.763,880.896],[124.775,904.437],[124.324,927.977],[124.147,951.516],[141.708,961.177],[165.511,950.624],[185.433,935.02],[206.195,920.516],[226.975,906.02],[248.718,892.766],[269.577,878.379],[287.333,859.999],[307.82,845.12],[329.511,831.808],[353.191,821.047],[374.448,807.168],[391.31,787.629],[412.992,774.3],[435.761,762.347],[456.708,748.076],[474.8,729.963]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[457.477,647.483],[436.507,633.865],[413.289,627.564],[394.996,613.811],[373.646,604.675],[354.48,592.237],[334.513,581.011],[315.145,568.875],[297.24,554.513],[277.241,543.346],[255.769,534.398],[236.967,521.404],[214.194,514.434],[196.241,500.147],[177.568,486.943],[156.517,477.363],[136.396,466.355],[117.659,456.903],[117.659,476.183],[114.933,497.41],[113.162,518.637],[116.915,539.865],[118.039,561.099],[120.093,582.327],[116.834,603.554],[117.837,624.789],[115.888,646.016],[115.516,667.251],[117.853,688.478],[116.146,709.706],[116.041,730.933],[118.953,752.168],[114.893,773.403],[116.85,794.637],[114.116,815.873],[113.704,837.107],[113.542,858.342],[129.603,867.057],[151.374,857.538],[169.594,843.461],[188.582,830.378],[207.587,817.301],[227.473,805.345],[246.55,792.367],[262.789,775.786],[281.527,762.364],[301.364,750.356],[323.021,740.648],[342.463,728.128],[357.885,710.503],[377.714,698.479],[398.538,687.696],[417.697,674.823],[434.243,658.483]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-337.298,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-311.968,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-311.968,-733.839],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-285.32,-661.98],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-53.049,-0.955],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-50.813,-0.908],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-46.997,-0.908],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-46.997,-0.797],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-42.983,-0.719],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"오른쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,817.364],[587.275,803.741],[610.3,791.657],[629.506,772.899],[653.84,763.112],[675.247,748.189],[695.594,731.415],[719.477,720.831],[741.273,706.601],[760.408,687.701],[781.374,672.009],[804.222,659.63],[825.47,644.413],[847.859,631.218],[869.125,616.039],[891.708,603.176],[913.381,588.719],[936.928,570.796],[932.543,601.467],[938.883,628.588],[934.117,655.71],[931.402,682.84],[938.334,709.961],[933.851,737.082],[936.575,764.203],[932.286,791.334],[936.044,818.455],[934.771,845.576],[936.946,872.697],[939.059,899.818],[932.419,926.949],[936.522,954.07],[936.159,981.201],[938.069,1008.322],[937.875,1035.452],[937.424,1062.583],[932.136,1089.714],[923.709,1099.121],[904.3,1082.736],[883.759,1068.013],[863.165,1053.365],[841.67,1040.028],[822.093,1023.89],[804.558,1004.753],[784.212,989.744],[765.36,972.543],[745.633,956.624],[723.712,943.922],[705.745,925.411],[685.611,910.099],[664.495,896.211],[644.573,880.567],[625.633,863.48],[605.11,848.728],[587.222,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,717.726],[587.275,705.764],[610.3,695.153],[629.506,678.682],[653.84,670.087],[675.247,656.984],[695.594,642.255],[719.477,632.96],[741.273,620.465],[760.408,603.869],[781.374,590.09],[804.222,579.22],[825.47,565.858],[847.859,554.272],[869.125,540.943],[891.708,529.648],[913.381,516.953],[936.928,501.215],[932.543,528.148],[938.883,551.963],[934.117,575.778],[931.402,599.601],[938.334,623.416],[933.851,647.231],[936.575,671.046],[932.286,694.87],[936.044,718.684],[934.771,742.499],[936.946,766.314],[939.059,790.129],[932.419,813.953],[936.522,837.768],[936.159,861.591],[938.069,885.406],[937.875,909.229],[937.424,933.053],[932.136,956.876],[923.709,965.137],[904.3,950.749],[883.759,937.82],[863.165,924.959],[841.67,913.247],[822.093,899.076],[804.558,882.272],[784.212,869.093],[765.36,853.989],[745.633,840.01],[723.712,828.857],[705.745,812.602],[685.611,799.157],[664.495,786.962],[644.573,773.225],[625.633,758.22],[605.11,745.267],[587.222,728.771]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[515.073,647.445],[537.11,636.654],[558.169,627.082],[575.734,612.224],[597.99,604.471],[617.568,592.651],[636.177,579.364],[658.02,570.98],[677.954,559.708],[695.455,544.737],[714.629,532.307],[735.526,522.502],[754.96,510.449],[775.436,499.997],[794.885,487.973],[815.539,477.784],[835.361,466.332],[856.897,452.135],[852.886,476.431],[858.684,497.914],[854.325,519.397],[851.842,540.887],[858.183,562.37],[854.082,583.853],[856.573,605.336],[852.651,626.827],[856.088,648.31],[854.924,669.793],[856.913,691.276],[858.846,712.759],[852.772,734.249],[856.525,755.732],[856.193,777.223],[857.94,798.706],[857.762,820.196],[857.35,841.687],[852.514,863.177],[844.807,870.629],[827.056,857.65],[808.269,845.988],[789.435,834.385],[769.775,823.82],[751.87,811.037],[735.834,795.878],[717.225,783.99],[699.983,770.365],[681.941,757.755],[661.893,747.694],[645.461,733.031],[627.046,720.902],[607.734,709.901],[589.514,697.509],[572.192,683.974],[553.422,672.289],[537.062,657.408]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-812.106,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-751.119,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-751.119,-733.176],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-686.959,-661.382],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,817.364],[587.275,803.741],[610.3,791.657],[629.506,772.899],[653.84,763.112],[675.247,748.189],[695.594,731.415],[719.477,720.831],[741.273,706.601],[760.408,687.701],[781.374,672.009],[804.222,659.63],[825.47,644.413],[847.859,631.218],[869.125,616.039],[891.708,603.176],[913.381,588.719],[936.928,570.796],[932.543,601.467],[938.883,628.588],[934.117,655.71],[931.402,682.84],[938.334,709.961],[933.851,737.082],[936.575,764.203],[932.286,791.334],[936.044,818.455],[934.771,845.576],[936.946,872.697],[939.059,899.818],[932.419,926.949],[936.522,954.07],[936.159,981.201],[938.069,1008.322],[937.875,1035.452],[937.424,1062.583],[932.136,1089.714],[923.709,1099.121],[904.3,1082.736],[883.759,1068.013],[863.165,1053.365],[841.67,1040.028],[822.093,1023.89],[804.558,1004.753],[784.212,989.744],[765.36,972.543],[745.633,956.624],[723.712,943.922],[705.745,925.411],[685.611,910.099],[664.495,896.211],[644.573,880.567],[625.633,863.48],[605.11,848.728],[587.222,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[563.179,717.726],[587.275,705.764],[610.3,695.153],[629.506,678.682],[653.84,670.087],[675.247,656.984],[695.594,642.255],[719.477,632.96],[741.273,620.465],[760.408,603.869],[781.374,590.09],[804.222,579.22],[825.47,565.858],[847.859,554.272],[869.125,540.943],[891.708,529.648],[913.381,516.953],[936.928,501.215],[932.543,528.148],[938.883,551.963],[934.117,575.778],[931.402,599.601],[938.334,623.416],[933.851,647.231],[936.575,671.046],[932.286,694.87],[936.044,718.684],[934.771,742.499],[936.946,766.314],[939.059,790.129],[932.419,813.953],[936.522,837.768],[936.159,861.591],[938.069,885.406],[937.875,909.229],[937.424,933.053],[932.136,956.876],[923.709,965.137],[904.3,950.749],[883.759,937.82],[863.165,924.959],[841.67,913.247],[822.093,899.076],[804.558,882.272],[784.212,869.093],[765.36,853.989],[745.633,840.01],[723.712,828.857],[705.745,812.602],[685.611,799.157],[664.495,786.962],[644.573,773.225],[625.633,758.22],[605.11,745.267],[587.222,728.771]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[515.073,647.445],[537.11,636.654],[558.169,627.082],[575.734,612.224],[597.99,604.471],[617.568,592.651],[636.177,579.364],[658.02,570.98],[677.954,559.708],[695.455,544.737],[714.629,532.307],[735.526,522.502],[754.96,510.449],[775.436,499.997],[794.885,487.973],[815.539,477.784],[835.361,466.332],[856.897,452.135],[852.886,476.431],[858.684,497.914],[854.325,519.397],[851.842,540.887],[858.183,562.37],[854.082,583.853],[856.573,605.336],[852.651,626.827],[856.088,648.31],[854.924,669.793],[856.913,691.276],[858.846,712.759],[852.772,734.249],[856.525,755.732],[856.193,777.223],[857.94,798.706],[857.762,820.196],[857.35,841.687],[852.514,863.177],[844.807,870.629],[827.056,857.65],[808.269,845.988],[789.435,834.385],[769.775,823.82],[751.87,811.037],[735.834,795.878],[717.225,783.99],[699.983,770.365],[681.941,757.755],[661.893,747.694],[645.461,733.031],[627.046,720.902],[607.734,709.901],[589.514,697.509],[572.192,683.974],[553.422,672.289],[537.062,657.408]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-812.106,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-751.119,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-751.119,-733.176],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-686.959,-661.382],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"종이_half Group","bm":0,"it":[{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,2.725],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,2.59],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,2.002],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,1.806],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-246.071,25.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-235.697,30.119],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-235.697,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-217.997,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-217.997,9.582],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-199.376,8.644],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[53.059,-1.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[50.822,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[47.005,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[47.005,-0.939],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[42.99,-0.847],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":15,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[53.059,-1.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[50.822,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[47.005,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[47.005,-0.939],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[42.99,-0.847],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":16,"ty":4,"nm":"종이_half","parent":15,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,2.725],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,2.59],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,2.002],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,1.806],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-246.071,25.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-235.697,30.119],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-235.697,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-217.997,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-217.997,9.582],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-199.376,8.644],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":20,"ty":0,"nm":"to","parent":16,"hd":false,"sr":1,"ks":{"a":{"a":0,"k":[38.427,28.464]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-33.946,-41.944],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[-32.515,-39.867],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-23.024,-32.813],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[-23.692,-49.423],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-25.624,-61.983],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-18.274,-89.382],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[-18.274,-79.382],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":46.5,"s":[-18.274,-82.382],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"h":56.928199768066406,"refId":"el-151-_-Uo","w":76.85435485839844},{"ddd":0,"ind":21,"ty":4,"nm":"종이_half","parent":15,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,2.725],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,2.59],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,2.28],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,2.002],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,1.806],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-246.071,25.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-235.697,30.119],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-235.697,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-217.997,10.912],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-217.997,9.582],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-199.376,8.644],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"종이_half Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"Path 1","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[178.726,189.879],[178.692,178.952],[178.851,165.753],[176.987,152.554],[177.7,139.355],[178.929,126.156],[179.148,112.957],[179.03,99.759],[177.146,86.3],[192.092,86.928],[206.778,86.688],[221.465,87.427],[236.152,84.589],[250.82,85.678],[264.631,85.678],[280.196,86.23],[294.883,86.23],[309.569,84.7],[324.256,87.981],[338.807,86.709],[337.618,99.761],[339.184,114.46],[339.184,128.074],[338.809,141.349],[339.184,152.559],[338.57,165.758],[338.809,177.732],[338.65,191.157]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[171.192,180.477],[171.159,170.09],[171.311,157.545],[169.526,145],[170.209,132.455],[171.386,119.909],[171.596,107.364],[171.483,94.819],[169.678,82.027],[183.994,82.623],[198.061,82.396],[212.129,83.098],[226.196,80.4],[240.247,81.435],[253.475,81.435],[268.384,81.96],[282.452,81.96],[296.519,80.506],[310.587,83.625],[324.524,82.415],[323.385,94.821],[324.886,108.792],[324.886,121.732],[324.526,134.35],[324.886,145.005],[324.297,157.55],[324.526,168.931],[324.374,181.691]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[139.412,158.907],[139.386,149.762],[139.51,138.716],[138.056,127.67],[138.612,116.624],[139.571,105.579],[139.741,94.533],[139.649,83.487],[138.18,72.223],[149.838,72.749],[161.294,72.548],[172.75,73.166],[184.206,70.791],[195.648,71.702],[206.421,71.702],[218.562,72.164],[230.018,72.164],[241.474,70.884],[252.93,73.63],[264.28,72.565],[263.353,83.489],[264.575,95.79],[264.575,107.184],[264.282,118.293],[264.575,127.675],[264.096,138.72],[264.282,148.741],[264.158,159.976]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[139.412,139.536],[139.386,131.506],[139.51,121.807],[138.056,112.107],[138.612,102.408],[139.571,92.708],[139.741,83.009],[139.649,73.31],[138.18,63.419],[149.838,63.881],[161.294,63.705],[172.75,64.247],[184.206,62.162],[195.648,62.962],[206.421,62.962],[218.562,63.367],[230.018,63.367],[241.474,62.243],[252.93,64.655],[264.28,63.719],[263.353,73.311],[264.575,84.113],[264.575,94.118],[264.282,103.873],[264.575,112.111],[264.096,121.81],[264.282,130.61],[264.158,140.475]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[128.911,173.198],[128.887,165.954],[127.593,109.879],[126.263,101.129],[126.772,92.38],[127.649,83.63],[127.805,74.881],[127.72,66.131],[126.376,57.209],[137.039,57.625],[147.516,57.466],[157.994,57.956],[168.471,56.075],[178.936,56.797],[188.788,56.797],[199.893,57.162],[210.37,57.162],[220.848,56.148],[231.325,58.324],[241.706,57.48],[240.858,66.133],[241.975,75.876],[241.975,84.902],[241.707,93.701],[241.975,101.133],[241.537,109.882],[243.115,165.145],[243.002,174.044]]}],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":46.5,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[128.911,149.493],[128.887,142.248],[127.593,109.879],[126.263,101.129],[126.772,92.38],[127.649,83.63],[127.805,74.881],[127.72,66.131],[126.376,57.209],[137.039,57.625],[147.516,57.466],[157.994,57.956],[168.471,56.075],[178.936,56.797],[188.788,56.797],[199.893,57.162],[210.37,57.162],[220.848,56.148],[231.325,58.324],[241.706,57.48],[240.858,66.133],[241.975,75.876],[241.975,84.902],[241.707,93.701],[241.975,101.133],[241.537,109.882],[243.115,141.44],[243.002,150.339]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0.048,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0.039,33.27],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0.039,29.214],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0.036,26.353],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0.048,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[0.039,33.27],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[0.039,29.214],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[0.036,26.353],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[258.086,137.873],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[247.206,131.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[201.315,115.384],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[201.315,101.318],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[184.119,91.397],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0,-0.082],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[0,-0.573],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[0,8.301],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[0,-27.835],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[0,-60.706],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[0,-50.706],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":46.5,"s":[0,-53.706],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":24,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[53.059,-1.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[50.822,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[47.005,-1.069],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[47.005,-0.939],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[42.99,-0.847],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"뒷면bg Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"뒷면bg","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.974,-56.459],[91.974,56.459],[-91.974,56.459],[-91.974,-56.459]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[88.096,-53.664],[88.096,53.664],[-88.096,53.664],[-88.096,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[81.481,-53.664],[81.481,53.664],[-81.481,53.664],[-81.481,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[81.481,-47.122],[81.481,47.122],[-81.481,47.122],[-81.481,-47.122]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[74.521,-42.508],[74.521,42.508],[-74.521,42.508],[-74.521,-42.508]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-250.023,8.152],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[-239.483,7.748],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[-221.499,-2.252],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[-221.499,-0.196],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[-202.578,6.137],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":26,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":16.8,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0,0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.543,187.398],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[187.541,187.403],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.6,"s":[187.535,187.399],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[187.544,187.696],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":19.5,"s":[187.589,191.314],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[187.605,198.909],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[187.577,204.509],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[187.545,213.621],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":30,"s":[187.546,231.124],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[187.547,248.964],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[187.547,239.201],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":7.8,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[-3],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":26.4,"s":[0],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":33.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":1,"k":[{"t":0,"s":[139.605,139.605],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[139.456,139.456],"i":{"x":0.5,"y":1},"o":{"x":0.12,"y":0.23}},{"t":12.6,"s":[141.715,141.715],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[141.395,141.395],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":19.5,"s":[141.751,141.751],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[185.454,185.454],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":27,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":31,"ty":0,"nm":"to","parent":27,"hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.5,28.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[-34,-89.302]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"h":57,"refId":"el-159-_-Uo","w":77},{"ddd":0,"ind":32,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"종이_전체 Group","bm":0,"it":[{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[339.825,284.126],[324.871,284.404],[310.156,284.126],[295.442,283.591],[280.727,283.203],[266.03,285.436],[251.314,286.009],[237.23,286.009],[221.882,285.325],[207.168,284.255],[192.453,285.105],[178.433,284.237],[177.3,271.686],[178.433,258.47],[179.367,245.255],[177.759,232.039],[177.759,220.928],[177.938,205.608],[178.435,192.393],[179.031,179.177],[179.19,165.962],[177.323,152.746],[178.037,139.531],[179.268,126.315],[179.488,113.1],[179.369,99.884],[177.482,86.409],[192.456,87.037],[207.17,86.798],[221.885,87.537],[236.599,84.696],[251.296,85.786],[265.132,85.786],[280.727,86.338],[295.442,86.338],[310.156,84.807],[324.871,88.092],[339.449,86.818],[338.258,99.887],[339.827,114.604],[339.827,128.236],[339.451,141.527],[339.827,152.751],[339.211,165.967],[339.451,177.956],[339.292,192.398],[339.133,205.613],[339.769,218.829],[338.916,232.044],[338.24,245.26],[339.83,260.004],[339.83,284.131]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[258.565,185.352]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,9.931]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":35,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":36,"ty":4,"nm":"뒷면","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[600.945,736.025],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[543.874,666.125],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[530.625,649.898],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[526.549,644.906],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[526.549,605.871],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[1127.494,1341.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":38.4,"s":[1127.494,1341.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":42.6,"s":[1127.494,1341.896],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[100],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[187.817,139.527],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":7.8,"s":[254.855,223],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[288.103,260.401],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":16.8,"s":[186.079,150.013],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":20.7,"s":[187.968,157.745],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":21.9,"s":[187.251,161.749],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":23.7,"s":[187.493,163.924],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":26.4,"s":[187.856,172.187],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":30,"s":[300.69,326.133],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":33.3,"s":[408.801,476.212],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":38.4,"s":[407.801,465.212],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":42.6,"s":[410.801,468.212],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[0.595],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-2],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":38.4,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":42.6,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":1,"k":[{"t":0,"s":[30.328,30.328],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":7.8,"s":[29.649,29.649],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[30.757,30.757],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":16.8,"s":[30.429,30.429],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":20.7,"s":[31.641,31.641],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[32.156,32.156],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[35.4,35.4],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":33.3,"s":[36.743,36.743],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":38.4,"s":[36.703,36.703],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":42.6,"s":[37.02,37.02],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"sh","hd":false,"nm":"뒷면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1058.32,594.37],[1057.48,622.15],[1057.34,649.5],[1058.3,676.85],[1057.04,704.21],[1059.07,731.56],[1056.29,758.92],[1057.99,786.27],[1057.43,813.63],[1055.89,840.99],[1059.2,868.34],[1057.45,895.69],[1057.22,923.05],[1058.97,950.4],[1056.85,977.76],[1058.41,1005.12],[1056.57,1032.48],[1059.58,1059.84],[1057.82,1087.2],[1058.23,1114.57],[1046.38,1143.91],[1019.81,1158.06],[991.87,1157.56],[963.95,1159.39],[936.02,1158.26],[908.09,1160.52],[880.16,1158.63],[852.23,1160.65],[824.31,1161.22],[796.38,1161.03],[768.44,1158.15],[740.51,1157.24],[712.58,1160.4],[684.65,1158.68],[656.72,1160.43],[628.79,1161.27],[600.86,1157.92],[572.92,1161.33],[544.99,1161.39],[517.06,1160.13],[489.13,1161.39],[461.19,1158.47],[433.26,1161.08],[405.33,1158.52],[377.4,1159.73],[349.46,1160.71],[321.53,1161.44],[293.59,1157.4],[265.66,1161.14],[237.72,1159.04],[209.78,1159.17],[181.84,1160.67],[153.67,1145.14],[142.48,1114.57],[144.38,1087.21],[146,1059.86],[145.06,1032.51],[142.89,1005.15],[142.66,977.8],[146.25,950.44],[142.31,923.09],[142.52,895.73],[145.53,868.37],[142.74,841.02],[143.73,813.67],[145.36,786.31],[144.83,758.96],[142.47,731.6],[145.87,704.24],[142.63,676.88],[146,649.52],[145.79,622.16],[144.5,595],[166.34,578.64],[189.51,563.89],[213.91,551],[235.73,534.22],[258.06,518.2],[281.66,504.11],[304.11,488.29],[326.82,472.84],[350.12,458.29],[373.46,443.82],[395.37,427.17],[417.69,411.13],[441.72,397.68],[464.47,382.29],[487.66,367.58],[511.03,353.12],[534.44,338.72],[556.65,322.51],[585.3,310.61],[616.16,311.53],[644.51,323.23],[668.37,336.94],[691.71,351.43],[713.81,367.79],[737.31,382.03],[760.76,396.36],[783,412.51],[805.26,428.62],[829.47,441.79],[852.31,457.04],[874.08,473.9],[897.34,488.5],[919.09,505.39],[942.45,519.86],[965.45,534.87],[987.69,551.03],[1011.76,564.42],[1034.79,579.38]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":21.9,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[927.301,520.788],[926.565,545.128],[926.442,569.092],[927.284,593.057],[926.179,617.029],[927.958,640.993],[925.522,664.966],[927.012,688.931],[926.521,712.904],[925.172,736.876],[928.072,760.84],[926.539,784.805],[926.337,808.777],[927.87,832.741],[926.013,856.714],[927.38,880.687],[925.768,904.66],[928.405,928.633],[926.863,952.606],[927.222,976.587],[916.839,1002.295],[893.559,1014.693],[869.078,1014.256],[844.614,1015.859],[820.141,1014.868],[795.669,1016.849],[771.197,1015.193],[746.725,1016.963],[722.261,1017.462],[697.789,1017.296],[673.308,1014.772],[648.835,1013.975],[624.363,1016.744],[599.891,1015.237],[575.419,1016.77],[550.946,1017.506],[526.474,1014.571],[501.993,1017.558],[477.521,1017.611],[453.048,1016.507],[428.576,1017.611],[404.095,1015.052],[379.623,1017.339],[355.15,1015.096],[330.678,1016.157],[306.197,1017.015],[281.725,1017.654],[257.244,1014.115],[232.772,1017.392],[208.29,1015.552],[183.809,1015.666],[159.328,1016.98],[134.646,1003.373],[124.841,976.587],[126.506,952.614],[127.925,928.65],[127.102,904.686],[125.2,880.713],[124.999,856.749],[128.144,832.777],[124.692,808.812],[124.876,784.84],[127.513,760.867],[125.069,736.903],[125.936,712.939],[127.365,688.966],[126.9,665.002],[124.832,641.029],[127.811,617.056],[124.973,593.083],[127.925,569.11],[127.741,545.137],[126.611,521.34],[145.747,507.005],[166.049,494.081],[187.428,482.787],[206.547,468.084],[226.112,454.047],[246.791,441.702],[266.462,427.84],[286.36,414.303],[306.775,401.554],[327.226,388.876],[346.424,374.287],[365.98,360.232],[387.035,348.448],[406.969,334.963],[427.288,322.074],[447.765,309.404],[468.277,296.787],[487.737,282.584],[512.84,272.157],[539.88,272.963],[564.72,283.214],[585.626,295.227],[606.077,307.923],[625.441,322.258],[646.032,334.735],[666.579,347.291],[686.065,361.442],[705.569,375.557],[726.782,387.097],[746.795,400.459],[765.87,415.232],[786.25,428.024],[805.308,442.823],[825.776,455.502],[845.928,468.654],[865.415,482.813],[886.505,494.545],[906.684,507.653]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":26.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[927.301,489.266],[926.565,512.133],[926.442,534.647],[927.284,557.16],[926.179,579.682],[927.958,602.196],[925.522,624.718],[927.012,647.232],[926.521,669.753],[925.172,692.275],[928.072,714.789],[926.539,737.302],[926.337,759.824],[927.87,782.338],[926.013,804.86],[927.38,827.382],[925.768,849.903],[928.405,872.425],[926.863,894.947],[927.222,917.477],[916.839,941.629],[893.559,953.277],[869.078,952.865],[844.614,954.372],[820.141,953.441],[795.669,955.302],[771.197,953.746],[746.725,955.409],[722.261,955.878],[697.789,955.722],[673.308,953.351],[648.835,952.602],[624.363,955.203],[599.891,953.787],[575.419,955.228],[550.946,955.919],[526.474,953.162],[501.993,955.968],[477.521,956.018],[453.048,954.98],[428.576,956.018],[404.095,953.614],[379.623,955.762],[355.15,953.655],[330.678,954.652],[306.197,955.458],[281.725,956.059],[257.244,952.734],[232.772,955.812],[208.29,954.083],[183.809,954.19],[159.328,955.425],[134.646,942.641],[124.841,917.477],[126.506,894.955],[127.925,872.441],[127.102,849.928],[125.2,827.406],[124.999,804.892],[128.144,782.371],[124.692,759.857],[124.876,737.335],[127.513,714.814],[125.069,692.3],[125.936,669.786],[127.365,647.265],[126.9,624.751],[124.832,602.229],[127.811,579.707],[124.973,557.185],[127.925,534.663],[127.741,512.141],[126.611,489.784],[145.747,476.317],[166.049,464.176],[187.428,453.565],[206.547,439.752],[226.112,426.565],[246.791,414.967],[266.462,401.944],[286.36,389.226],[306.775,377.249],[327.226,365.338],[346.424,351.632],[365.98,338.429],[387.035,327.357],[406.969,314.688],[427.288,302.58],[447.765,290.677],[468.277,278.823],[487.737,265.48],[512.84,255.684],[539.88,256.441],[564.72,266.072],[585.626,277.358],[606.077,289.285],[625.441,302.752],[646.032,314.474],[666.579,326.27],[686.065,339.565],[705.569,352.826],[726.782,363.667],[746.795,376.22],[765.87,390.099],[786.25,402.117],[805.308,416.02],[825.776,427.931],[845.928,440.287],[865.415,453.59],[886.505,464.612],[906.684,476.926]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}}]},{"ddd":0,"ind":37,"ty":4,"nm":"Screen","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[187.5,187.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":61,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Screen Group","bm":0,"it":[{"ty":"rc","hd":false,"nm":"Screen","d":1,"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[375,375]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0,0,0]},"r":1,"o":{"a":0,"k":0}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}],"meta":{"g":"@phase-software/lottie-exporter 0.7.0"},"nm":"","op":60,"v":"5.6.0","w":375} \ No newline at end of file diff --git a/core/designsystem/src/main/res/raw/mission_letter_tap.json b/core/designsystem/src/main/res/raw/mission_letter_tap.json new file mode 100644 index 00000000..a308b021 --- /dev/null +++ b/core/designsystem/src/main/res/raw/mission_letter_tap.json @@ -0,0 +1 @@ +{"assets":[{"id":"el-151-_-Uo","layers":[{"ddd":0,"ind":17,"ty":4,"nm":"Layer 1","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]},{"id":"el-159-_-Uo","layers":[{"ddd":0,"ind":28,"ty":4,"nm":"Layer 1","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.633,28.203]},"o":{"a":0,"k":100},"p":{"a":0,"k":[38.633,28.203]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"Path 1 (4) Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.485,-0.112],[-0.137,-0.272],[0.121,-0.528],[0.287,-0.128],[0.097,-0.085],[0.364,0.016],[0.151,0.08],[-0.015,0.688],[-0.561,0.304]],"o":[[0.318,-0.192],[0.5,0.096],[0.181,0.384],[-0.107,0.512],[-0.115,0.059],[-0.06,0.064],[-0.364,-0.016],[-0.546,-0.256],[0.015,-0.688],[0,0]],"v":[[50.177,32.693],[51.382,32.573],[52.337,33.125],[52.427,34.493],[51.837,35.453],[51.518,35.669],[50.882,35.741],[50.109,35.597],[49.313,34.181],[50.177,32.693]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.121,0.08],[-0.333,0],[-0.288,-0.08],[-0.257,0],[-0.273,-0.112],[-0.09,-0.128],[-0.303,-0.352],[-0.197,-0.144],[-0.046,-0.384],[-0.075,-0.176],[0.122,-0.23],[0.008,-0.143],[0.091,-0.208],[0.03,-0.352],[0.137,-0.16],[0.455,-0.336],[0.47,-0.096],[0.682,0.176],[0.292,0.02],[0.212,0.16],[0.182,0.091],[0.122,0.12],[0,0.048],[0.257,0.288],[0.11,0.161],[0.091,0.416],[-0.137,0.544],[0,0.208],[-0.045,0.176],[-0.061,0.192],[-0.293,0.117],[-0.091,0.114],[-0.132,0.039],[-0.319,0.304]],"o":[[0.304,-0.288],[0.121,-0.08],[0.333,0],[0.273,0.08],[0.227,0],[0.273,0.112],[0.425,0.544],[0.061,0.096],[0.379,0.272],[0,0.16],[0.093,0.243],[-0.067,0.126],[0,0.112],[-0.243,0.512],[-0.03,0.192],[-0.136,0.144],[-0.606,0.432],[-0.455,0.08],[-0.283,-0.076],[-0.318,-0.016],[-0.166,-0.117],[-0.136,-0.104],[-0.167,-0.176],[0,-0.032],[-0.132,-0.143],[-0.045,-0.112],[-0.091,-0.416],[0.075,-0.336],[0.015,-0.208],[0.06,-0.16],[0.079,-0.305],[0.133,-0.059],[0.091,-0.103],[0.106,-0.016],[0,0]],"v":[[41.76,27.461],[42.397,26.909],[43.079,26.789],[44.011,26.909],[44.807,27.029],[45.557,27.197],[46.102,27.557],[47.194,28.901],[47.58,29.261],[48.217,30.245],[48.33,30.749],[48.285,31.493],[48.171,31.901],[48.035,32.381],[47.625,33.677],[47.375,34.205],[46.489,34.925],[44.875,35.717],[43.17,35.573],[42.306,35.429],[41.511,35.165],[40.988,34.853],[40.601,34.517],[40.351,34.181],[39.965,33.701],[39.601,33.245],[39.396,32.453],[39.465,31.013],[39.578,30.197],[39.669,29.621],[39.851,29.093],[40.442,28.421],[40.783,28.157],[41.124,27.941],[41.761,27.461]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0.454,-0.112],[0.288,-0.224],[0.052,-0.086],[0.016,-0.129],[0.077,-0.144],[0.031,-0.096],[0,-0.272],[-0.485,-0.496],[-0.485,0.112],[-0.167,0],[-0.091,0.048],[-0.227,0],[-0.106,0.336],[-0.091,0.128],[-0.03,0.416],[0.849,0.272],[0.154,0.104],[0.137,0.075]],"o":[[-0.228,-0.112],[-0.455,0.096],[-0.083,0.056],[-0.029,0.127],[-0.03,0.16],[-0.136,0.208],[-0.03,0.096],[0,0.64],[0.485,0.496],[0.273,-0.064],[0.151,-0.016],[0.091,-0.064],[0.425,0],[0.045,-0.16],[0.107,-0.128],[0.091,-1.248],[-0.178,-0.055],[-0.12,-0.1],[0,0]],"v":[[44.217,28.877],[43.194,28.877],[42.08,29.357],[41.875,29.573],[41.807,29.957],[41.647,30.413],[41.397,30.869],[41.352,31.421],[42.08,33.125],[43.535,33.701],[44.194,33.605],[44.558,33.509],[45.035,33.413],[45.831,32.909],[46.035,32.477],[46.24,31.661],[45.103,29.381],[44.603,29.141],[44.217,28.877]]}}},{"ty":"sh","hd":true,"nm":"Path 1 (4)","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-0.348,-0.08],[-0.288,0.048],[-0.227,-0.064],[-0.712,0],[-0.454,0.048],[-0.182,-0.096],[-0.212,0.032],[-0.227,-0.08],[-0.151,0.064],[-0.379,-0.112],[-0.106,-0.224],[0.303,-0.288],[0.652,0.144],[0.194,-0.049],[0.772,0.032],[0.152,-0.112],[0.061,-0.24],[-0.03,-0.192],[0.058,-0.153],[0,-0.224],[0.031,-0.352],[-0.061,-0.768],[0.045,-0.224],[-0.045,-0.286],[0.106,-1.216],[-0.06,-0.48],[0.075,-0.224],[0.287,-0.064],[0.121,0.416],[0.079,0.163],[-0.046,0.16],[0,1.072],[0.076,0.144],[0.005,0.102],[-0.045,0.288],[-0.016,0.432],[-0.015,0.128],[-0.015,0.544],[-0.061,0.56],[0.03,0.208],[0.175,0.102],[0.53,0.032],[0.288,-0.048],[0.197,0.064],[0.545,-0.112],[0.273,0.32],[0.015,0.304],[-0.045,0.144],[-0.289,0.112],[-0.181,-0.08],[-0.318,-0.016],[-0.197,0.048],[-0.182,0.016]],"o":[[0.455,-0.064],[0.288,0.064],[0.288,-0.048],[0.182,0.048],[0.728,0],[0.243,-0.016],[0.197,0.08],[0.212,-0.032],[0.227,0.064],[0.258,-0.112],[0.379,0.112],[0.242,0.512],[-0.303,0.272],[-0.194,-0.049],[-0.197,0.064],[-1.319,-0.08],[-0.09,0.08],[-0.06,0.224],[0.013,0.163],[-0.06,0.192],[0,0.176],[-0.045,0.304],[0.06,0.784],[-0.045,0.286],[0.03,0.384],[-0.06,0.688],[0.06,0.496],[-0.076,0.224],[-0.607,0.176],[-0.056,-0.172],[-0.107,-0.176],[0.06,-0.24],[0.016,-1.088],[-0.054,-0.087],[0,-0.08],[0.06,-0.416],[0.03,-0.624],[0.015,-0.192],[0,-0.4],[0.061,-0.624],[-0.025,-0.201],[-0.107,-0.08],[-0.531,-0.048],[-0.288,0.048],[-0.258,-0.096],[-0.424,0.096],[-0.045,-0.048],[-0.015,-0.32],[0.06,-0.176],[0.288,-0.112],[0.137,0.064],[0.333,0],[0.243,-0.064],[0,0]],"v":[[28.159,20.693],[29.363,20.717],[30.227,20.741],[31,20.765],[32.341,20.837],[34.114,20.765],[34.751,20.885],[35.365,20.957],[36.024,21.029],[36.592,21.029],[37.547,21.029],[38.275,21.533],[38.184,22.733],[36.752,22.925],[36.16,22.925],[34.706,22.973],[32.5,23.021],[32.273,23.501],[32.228,24.125],[32.159,24.605],[32.069,25.229],[32.023,26.021],[32.046,27.629],[32.069,29.141],[32.069,30.005],[31.955,32.405],[31.955,34.157],[31.932,35.237],[31.387,35.669],[30.295,35.309],[30.091,34.805],[30,34.301],[30.09,32.333],[30,30.485],[29.909,30.197],[29.977,29.645],[30.091,28.373],[30.159,27.245],[30.204,26.141],[30.295,24.701],[30.341,23.453],[30.023,22.973],[29.068,22.805],[27.84,22.805],[27.113,22.781],[25.908,22.805],[24.862,22.469],[24.772,21.941],[24.817,21.245],[25.34,20.813],[26.044,20.765],[26.726,20.885],[27.522,20.813],[28.159,20.693]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.239,0.259,0.294]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[-4.091,0.264],[-0.792,1.308],[-0.424,1.179],[-0.952,3.38],[-1.926,-0.633],[-5.175,-3.921],[-1.642,0.295],[-3.385,0.078],[-3.023,-0.025],[0,-2.811],[0.803,-3.235],[1.714,-2.38],[-0.125,-2.702],[-0.096,-1.036],[1.571,-2.667],[2.879,0.554],[5.408,2.839],[1.645,-1.726],[3.323,-2.424],[5.002,0.47],[0,2.701],[-0.282,1.373],[1.978,1.221],[3.056,2.308],[0,1.972],[-1.682,1.258]],"o":[[3.35,-2.506],[1.108,-1.057],[0.638,-1.053],[1.182,-3.281],[0.575,-2.044],[6.016,1.978],[1.291,0.977],[3.325,-0.6],[3.023,-0.07],[2.153,0.018],[0,3.331],[-0.747,3.005],[-1.486,2.063],[0.048,1.03],[0.285,3.075],[-1.763,2.993],[-5.936,-1.143],[-1.794,-0.942],[-2.877,3.022],[-4.26,3.106],[-1.904,-0.18],[0,-1.396],[0.416,-2.02],[-3.242,-2.001],[-1.583,-1.195],[0,-2.147],[0,0]],"v":[[3.407,23.315],[14.353,18.27],[17.51,15.165],[18.782,11.232],[22.424,1.447],[31.175,0.57],[48.305,8.768],[53,12.18],[63.045,10.568],[72.126,10.568],[76.732,12.961],[75.724,22.676],[70.898,30.281],[68.046,37.01],[68.814,40.019],[67.871,50.847],[59.054,53.027],[41.111,47.008],[36.286,45.539],[26.898,53.548],[14.22,56.178],[8.43,53.618],[8.451,49.165],[12.378,37.342],[2.99,30.708],[0.533,27.178],[3.407,23.315]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,0.949,0.49]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}]}],"ddd":0,"fr":30,"h":375,"ip":0,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,-13.874],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.544,167.891],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":3.9,"s":[187.886,167.899],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[187.506,167.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[186.512,167.921],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[187.542,167.896],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":3.9,"s":[1],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-3],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":0,"k":[140.592,140.592]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"열리는 부분 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"열리는부분_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,406.676],[149.567,409.302],[173.751,416.103],[194.591,426.071],[215.222,436.246],[233.018,449.1],[257.422,455.694],[275.009,468.749],[298.095,476.599],[320.153,485.418],[340.305,496.041],[360.177,506.917],[379.95,517.908],[403.156,525.638],[423.208,536.354],[441.693,548.56],[464.21,556.958],[484.522,567.433],[506.68,576.165],[526.203,587.389],[549.868,594.692],[569.521,605.802],[594.334,614.447],[622.44,614.006],[649.499,607.82],[669.561,597.865],[690.352,588.592],[710.963,579.159],[729.797,568.021],[748.921,557.171],[772.057,550.13],[792.358,540.389],[808.977,527.154],[832.562,520.54],[849.989,508.073],[872.856,500.778],[893.457,491.324],[912.052,479.973],[935.916,473.613],[951.966,459.837],[976.33,453.958],[996.022,443.635],[1014.418,432.084],[1035.308,422.897],[1058.155,415.575],[1050.948,405.353],[1026.006,402.835],[1001.063,404.171],[976.12,406.429],[951.187,404.792],[926.245,403.944],[901.302,405.915],[876.359,402.621],[851.427,402.487],[826.474,404.598],[801.541,406.055],[776.598,402.681],[751.656,403.155],[726.713,403.416],[701.77,406.062],[676.827,403.964],[651.885,404.699],[626.942,403.53],[601.999,405.053],[577.056,404.906],[552.114,404.679],[527.161,401.986],[502.218,402.113],[477.276,406.723],[452.333,405.38],[427.38,403.229],[402.437,402.12],[377.495,401.645],[352.552,401.706],[327.609,406.021],[302.656,405.567],[277.714,403.83],[252.761,402.227],[227.818,405.454],[202.866,402.187],[177.743,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[134.343,406.676],[131.362,409.302],[152.603,416.103],[170.907,426.071],[189.027,436.246],[204.657,449.1],[226.091,455.694],[241.537,468.749],[261.813,476.599],[281.187,485.418],[298.886,496.041],[316.339,506.917],[333.705,517.908],[354.087,525.638],[371.698,536.354],[387.934,548.56],[407.71,556.958],[425.55,567.433],[445.011,576.165],[462.158,587.389],[482.942,594.692],[500.203,605.802],[521.996,614.447],[546.682,614.006],[570.447,607.82],[588.067,597.865],[606.328,588.592],[624.43,579.159],[640.972,568.021],[657.768,557.171],[678.088,550.13],[695.919,540.389],[710.515,527.154],[731.229,520.54],[746.535,508.073],[766.619,500.778],[784.712,491.324],[801.044,479.973],[822.004,473.613],[836.1,459.837],[857.499,453.958],[874.794,443.635],[890.951,432.084],[909.298,422.897],[929.364,415.575],[923.035,405.353],[901.128,402.835],[879.221,404.171],[857.314,406.429],[835.416,404.792],[813.509,403.944],[791.603,405.915],[769.696,402.621],[747.797,402.487],[725.882,404.598],[703.984,406.055],[682.077,402.681],[660.17,403.155],[638.263,403.416],[616.356,406.062],[594.449,403.964],[572.542,404.699],[550.635,403.53],[528.729,405.053],[506.822,404.906],[484.915,404.679],[462.999,401.986],[441.092,402.113],[419.185,406.723],[397.278,405.38],[375.363,403.229],[353.456,402.12],[331.549,401.645],[309.642,401.706],[287.735,406.021],[265.819,405.567],[243.913,403.83],[221.997,402.227],[200.09,405.454],[178.174,402.187],[156.11,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":10.96}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-603.861,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-530.363,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-578.404,-631.493],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"열리는부분_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"열리는부분_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,607.943],[149.567,611.868],[173.751,622.035],[194.591,636.937],[215.222,652.147],[233.018,671.363],[257.422,681.221],[275.009,700.736],[298.095,712.471],[320.153,725.655],[340.305,741.535],[360.177,757.794],[379.95,774.223],[403.156,785.779],[423.208,801.799],[441.693,820.046],[464.21,832.6],[484.522,848.26],[506.68,861.314],[526.203,878.092],[549.868,889.009],[569.521,905.618],[594.334,918.541],[622.44,917.882],[649.499,908.634],[669.561,893.753],[690.352,879.89],[710.963,865.788],[729.797,849.139],[748.921,832.919],[772.057,822.393],[792.358,807.831],[808.977,788.046],[832.562,778.159],[849.989,759.522],[872.856,748.616],[893.457,734.484],[912.052,717.515],[935.916,708.007],[951.966,687.413],[976.33,678.624],[996.022,663.194],[1014.418,645.925],[1035.308,632.193],[1058.155,621.246],[1050.948,605.966],[1026.006,602.2],[1001.063,604.198],[976.12,607.574],[951.187,605.127],[926.245,603.858],[901.302,606.805],[876.359,601.881],[851.427,601.681],[826.474,604.837],[801.541,607.014],[776.598,601.971],[751.656,602.68],[726.713,603.069],[701.77,607.024],[676.827,603.888],[651.885,604.987],[626.942,603.239],[601.999,605.516],[577.056,605.297],[552.114,604.957],[527.161,600.932],[502.218,601.122],[477.276,608.013],[452.333,606.006],[427.38,602.79],[402.437,601.132],[377.495,600.423],[352.552,600.513],[327.609,606.964],[302.656,606.285],[277.714,603.689],[252.761,601.292],[227.818,606.115],[202.866,601.232],[177.743,601.911]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[152.96,406.676],[149.567,409.302],[173.751,416.103],[194.591,426.071],[215.222,436.246],[233.018,449.1],[257.422,455.694],[275.009,468.749],[298.095,476.599],[320.153,485.418],[340.305,496.041],[360.177,506.917],[379.95,517.908],[403.156,525.638],[423.208,536.354],[441.693,548.56],[464.21,556.958],[484.522,567.433],[506.68,576.165],[526.203,587.389],[549.868,594.692],[569.521,605.802],[594.334,614.447],[622.44,614.006],[649.499,607.82],[669.561,597.865],[690.352,588.592],[710.963,579.159],[729.797,568.021],[748.921,557.171],[772.057,550.13],[792.358,540.389],[808.977,527.154],[832.562,520.54],[849.989,508.073],[872.856,500.778],[893.457,491.324],[912.052,479.973],[935.916,473.613],[951.966,459.837],[976.33,453.958],[996.022,443.635],[1014.418,432.084],[1035.308,422.897],[1058.155,415.575],[1050.948,405.353],[1026.006,402.835],[1001.063,404.171],[976.12,406.429],[951.187,404.792],[926.245,403.944],[901.302,405.915],[876.359,402.621],[851.427,402.487],[826.474,404.598],[801.541,406.055],[776.598,402.681],[751.656,403.155],[726.713,403.416],[701.77,406.062],[676.827,403.964],[651.885,404.699],[626.942,403.53],[601.999,405.053],[577.056,404.906],[552.114,404.679],[527.161,401.986],[502.218,402.113],[477.276,406.723],[452.333,405.38],[427.38,403.229],[402.437,402.12],[377.495,401.645],[352.552,401.706],[327.609,406.021],[302.656,405.567],[277.714,403.83],[252.761,402.227],[227.818,405.454],[202.866,402.187],[177.743,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[134.343,406.676],[131.362,409.302],[152.603,416.103],[170.907,426.071],[189.027,436.246],[204.657,449.1],[226.091,455.694],[241.537,468.749],[261.813,476.599],[281.187,485.418],[298.886,496.041],[316.339,506.917],[333.705,517.908],[354.087,525.638],[371.698,536.354],[387.934,548.56],[407.71,556.958],[425.55,567.433],[445.011,576.165],[462.158,587.389],[482.942,594.692],[500.203,605.802],[521.996,614.447],[546.682,614.006],[570.447,607.82],[588.067,597.865],[606.328,588.592],[624.43,579.159],[640.972,568.021],[657.768,557.171],[678.088,550.13],[695.919,540.389],[710.515,527.154],[731.229,520.54],[746.535,508.073],[766.619,500.778],[784.712,491.324],[801.044,479.973],[822.004,473.613],[836.1,459.837],[857.499,453.958],[874.794,443.635],[890.951,432.084],[909.298,422.897],[929.364,415.575],[923.035,405.353],[901.128,402.835],[879.221,404.171],[857.314,406.429],[835.416,404.792],[813.509,403.944],[791.603,405.915],[769.696,402.621],[747.797,402.487],[725.882,404.598],[703.984,406.055],[682.077,402.681],[660.17,403.155],[638.263,403.416],[616.356,406.062],[594.449,403.964],[572.542,404.699],[550.635,403.53],[528.729,405.053],[506.822,404.906],[484.915,404.679],[462.999,401.986],[441.092,402.113],[419.185,406.723],[397.278,405.38],[375.363,403.229],[353.456,402.12],[331.549,401.645],[309.642,401.706],[287.735,406.021],[265.819,405.567],[243.913,403.83],[221.997,402.227],[200.09,405.454],[178.174,402.187],[156.11,402.641]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[146.512,505.491],[143.261,508.755],[166.426,517.209],[186.388,529.599],[206.149,542.246],[223.195,558.224],[246.57,566.42],[263.415,582.646],[285.528,592.404],[306.657,603.366],[325.959,616.569],[344.994,630.089],[363.933,643.75],[386.16,653.358],[405.367,666.678],[423.073,681.85],[444.641,692.289],[464.096,705.309],[485.32,716.163],[504.02,730.114],[526.688,739.191],[545.512,753.001],[569.279,763.747],[596.201,763.199],[622.119,755.509],[641.335,743.135],[661.249,731.609],[680.991,719.884],[699.031,706.04],[717.349,692.554],[739.51,683.801],[758.956,671.694],[774.873,655.243],[797.464,647.021],[814.157,631.526],[836.059,622.458],[855.792,610.707],[873.603,596.598],[896.462,588.692],[911.835,571.569],[935.171,564.261],[954.034,551.431],[971.654,537.073],[991.663,525.654],[1013.547,516.552],[1006.644,503.847],[982.753,500.716],[958.862,502.377],[934.97,505.184],[911.089,503.149],[887.198,502.095],[863.306,504.544],[839.415,500.451],[815.533,500.285],[791.633,502.908],[767.751,504.719],[743.86,500.525],[719.969,501.115],[696.077,501.439],[672.186,504.727],[648.295,502.12],[624.404,503.033],[600.512,501.58],[576.621,503.473],[552.73,503.291],[528.839,503.008],[504.938,499.662],[481.047,499.82],[457.155,505.549],[433.264,503.88],[409.363,501.206],[385.472,499.827],[361.581,499.238],[337.69,499.313],[313.798,504.677],[289.898,504.113],[266.006,501.954],[242.106,499.961],[218.214,503.972],[194.313,499.911],[170.25,500.475]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-603.861,-759.482],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-603.861,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-530.363,-508.046],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-578.404,-631.493],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,5.274],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,5.274],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,5.274],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0.832,-25.463],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[0.832,-33.732],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[0.731,-33.732],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[0.797,-28.198],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"센터_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1101.741],[1049.132,1096.691],[1024.249,1082.518],[1003.928,1063.817],[983.905,1044.831],[967.726,1022.01],[942.544,1008.132],[926.654,985.036],[903.288,969.354],[881.3,952.304],[861.927,932.673],[842.903,912.681],[824.048,892.518],[800.493,877.026],[781.249,857.262],[764.132,835.371],[741.545,818.92],[721.942,799.498],[699.834,782.563],[681.299,762.068],[657.135,747.173],[638.43,726.849],[615.054,711.148],[586.349,711.831],[559.889,723.944],[539.378,743.452],[517.879,761.982],[496.629,780.75],[477.805,801.938],[458.571,822.717],[433.888,838.068],[413.057,857.262],[397.237,881.45],[371.945,896.192],[355.027,919.279],[330.703,934.989],[309.474,953.776],[290.959,975.277],[265.287,989.649],[250.246,1014.616],[223.886,1028.304],[203.884,1048.325],[185.658,1070.12],[164.029,1088.536],[168.521,1109.44],[196.807,1103.877],[225.093,1107.949],[253.37,1105.785],[281.656,1102.14],[309.933,1104.788],[338.209,1106.155],[366.495,1102.975],[394.772,1108.301],[423.058,1108.509],[451.335,1105.101],[479.621,1102.747],[507.908,1108.196],[536.184,1107.427],[564.47,1107],[592.757,1102.738],[621.043,1106.127],[649.32,1104.94],[677.606,1106.82],[705.892,1104.361],[734.179,1104.608],[762.465,1104.969],[790.751,1109.316],[819.028,1109.117],[847.314,1101.665],[875.601,1103.839],[903.887,1107.304],[932.174,1109.098],[960.47,1109.867],[988.756,1109.772],[1016.823,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[918.108,1101.741],[921.44,1096.691],[899.585,1082.518],[881.737,1063.817],[864.152,1044.831],[849.942,1022.01],[827.825,1008.132],[813.869,985.036],[793.347,969.354],[774.035,952.304],[757.02,932.673],[740.311,912.681],[723.752,892.518],[703.063,877.026],[686.162,857.262],[671.128,835.371],[651.29,818.92],[634.073,799.498],[614.655,782.563],[598.376,762.068],[577.153,747.173],[560.725,726.849],[540.195,711.148],[514.983,711.831],[491.744,723.944],[473.729,743.452],[454.846,761.982],[436.183,780.75],[419.65,801.938],[402.757,822.717],[381.078,838.068],[362.783,857.262],[348.889,881.45],[326.675,896.192],[311.816,919.279],[290.453,934.989],[271.807,953.776],[255.545,975.277],[232.999,989.649],[219.788,1014.616],[196.636,1028.304],[179.069,1048.325],[163.061,1070.12],[144.065,1088.536],[148.01,1109.44],[172.853,1103.877],[197.697,1107.949],[222.532,1105.785],[247.375,1102.14],[272.21,1104.788],[297.045,1106.155],[321.888,1102.975],[346.723,1108.301],[371.567,1108.509],[396.402,1105.101],[421.245,1102.747],[446.089,1108.196],[470.924,1107.427],[495.767,1107],[520.611,1102.738],[545.455,1106.127],[570.289,1104.94],[595.133,1106.82],[619.977,1104.361],[644.82,1104.608],[669.664,1104.969],[694.507,1109.316],[719.342,1109.117],[744.186,1101.665],[769.029,1103.839],[793.873,1107.304],[818.717,1109.098],[843.569,1109.867],[868.412,1109.772],[893.063,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":12.46}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-606.581,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-532.752,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-581.009,-910.507],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"센터_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"센터_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1159.138],[1049.132,1153.825],[1024.249,1138.913],[1003.928,1119.238],[983.905,1099.264],[967.726,1075.254],[942.544,1060.652],[926.654,1036.353],[903.288,1019.854],[881.3,1001.916],[861.927,981.262],[842.903,960.229],[824.048,939.016],[800.493,922.716],[781.249,901.922],[764.132,878.891],[741.545,861.583],[721.942,841.149],[699.834,823.331],[681.299,801.769],[657.135,786.099],[638.43,764.715],[615.054,748.196],[586.349,748.915],[559.889,761.659],[539.378,782.183],[517.879,801.679],[496.629,821.424],[477.805,843.716],[458.571,865.578],[433.888,881.728],[413.057,901.922],[397.237,927.37],[371.945,942.881],[355.027,967.17],[330.703,983.699],[309.474,1003.464],[290.959,1026.086],[265.287,1041.207],[250.246,1067.474],[223.886,1081.875],[203.884,1102.939],[185.658,1125.87],[164.029,1145.245],[168.521,1167.238],[196.807,1161.385],[225.093,1165.67],[253.37,1163.393],[281.656,1159.557],[309.933,1162.344],[338.209,1163.782],[366.495,1160.436],[394.772,1166.039],[423.058,1166.259],[451.335,1162.673],[479.621,1160.197],[507.908,1165.929],[536.184,1165.12],[564.47,1164.671],[592.757,1160.187],[621.043,1163.752],[649.32,1162.504],[677.606,1164.481],[705.892,1161.894],[734.179,1162.154],[762.465,1162.534],[790.751,1167.108],[819.028,1166.898],[847.314,1159.058],[875.601,1161.345],[903.887,1164.99],[932.174,1166.878],[960.47,1167.687],[988.756,1167.587],[1016.823,1160.266]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1045.339,1101.741],[1049.132,1096.691],[1024.249,1082.518],[1003.928,1063.817],[983.905,1044.831],[967.726,1022.01],[942.544,1008.132],[926.654,985.036],[903.288,969.354],[881.3,952.304],[861.927,932.673],[842.903,912.681],[824.048,892.518],[800.493,877.026],[781.249,857.262],[764.132,835.371],[741.545,818.92],[721.942,799.498],[699.834,782.563],[681.299,762.068],[657.135,747.173],[638.43,726.849],[615.054,711.148],[586.349,711.831],[559.889,723.944],[539.378,743.452],[517.879,761.982],[496.629,780.75],[477.805,801.938],[458.571,822.717],[433.888,838.068],[413.057,857.262],[397.237,881.45],[371.945,896.192],[355.027,919.279],[330.703,934.989],[309.474,953.776],[290.959,975.277],[265.287,989.649],[250.246,1014.616],[223.886,1028.304],[203.884,1048.325],[185.658,1070.12],[164.029,1088.536],[168.521,1109.44],[196.807,1103.877],[225.093,1107.949],[253.37,1105.785],[281.656,1102.14],[309.933,1104.788],[338.209,1106.155],[366.495,1102.975],[394.772,1108.301],[423.058,1108.509],[451.335,1105.101],[479.621,1102.747],[507.908,1108.196],[536.184,1107.427],[564.47,1107],[592.757,1102.738],[621.043,1106.127],[649.32,1104.94],[677.606,1106.82],[705.892,1104.361],[734.179,1104.608],[762.465,1104.969],[790.751,1109.316],[819.028,1109.117],[847.314,1101.665],[875.601,1103.839],[903.887,1107.304],[932.174,1109.098],[960.47,1109.867],[988.756,1109.772],[1016.823,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[918.108,1101.741],[921.44,1096.691],[899.585,1082.518],[881.737,1063.817],[864.152,1044.831],[849.942,1022.01],[827.825,1008.132],[813.869,985.036],[793.347,969.354],[774.035,952.304],[757.02,932.673],[740.311,912.681],[723.752,892.518],[703.063,877.026],[686.162,857.262],[671.128,835.371],[651.29,818.92],[634.073,799.498],[614.655,782.563],[598.376,762.068],[577.153,747.173],[560.725,726.849],[540.195,711.148],[514.983,711.831],[491.744,723.944],[473.729,743.452],[454.846,761.982],[436.183,780.75],[419.65,801.938],[402.757,822.717],[381.078,838.068],[362.783,857.262],[348.889,881.45],[326.675,896.192],[311.816,919.279],[290.453,934.989],[271.807,953.776],[255.545,975.277],[232.999,989.649],[219.788,1014.616],[196.636,1028.304],[179.069,1048.325],[163.061,1070.12],[144.065,1088.536],[148.01,1109.44],[172.853,1103.877],[197.697,1107.949],[222.532,1105.785],[247.375,1102.14],[272.21,1104.788],[297.045,1106.155],[321.888,1102.975],[346.723,1108.301],[371.567,1108.509],[396.402,1105.101],[421.245,1102.747],[446.089,1108.196],[470.924,1107.427],[495.767,1107],[520.611,1102.738],[545.455,1106.127],[570.289,1104.94],[595.133,1106.82],[619.977,1104.361],[644.82,1104.608],[669.664,1104.969],[694.507,1109.316],[719.342,1109.117],[744.186,1101.665],[769.029,1103.839],[793.873,1107.304],[818.717,1109.098],[843.569,1109.867],[868.412,1109.772],[893.063,1102.814]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1001.271,1101.741],[1004.904,1096.691],[981.07,1082.518],[961.606,1063.817],[942.428,1044.831],[926.93,1022.01],[902.81,1008.132],[887.59,985.036],[865.209,969.354],[844.147,952.304],[825.591,932.673],[807.369,912.681],[789.31,892.518],[766.747,877.026],[748.315,857.262],[731.919,835.371],[710.284,818.92],[691.507,799.498],[670.331,782.563],[652.578,762.068],[629.432,747.173],[611.516,726.849],[589.126,711.148],[561.631,711.831],[536.286,723.944],[516.64,743.452],[496.047,761.982],[475.693,780.75],[457.662,801.938],[439.239,822.717],[415.597,838.068],[395.644,857.262],[380.491,881.45],[356.265,896.192],[340.061,919.279],[316.762,934.989],[296.427,953.776],[278.693,975.277],[254.104,989.649],[239.696,1014.616],[214.448,1028.304],[195.289,1048.325],[177.831,1070.12],[157.114,1088.536],[161.416,1109.44],[188.51,1103.877],[215.604,1107.949],[242.689,1105.785],[269.783,1102.14],[296.867,1104.788],[323.951,1106.155],[351.045,1102.975],[378.13,1108.301],[405.224,1108.509],[432.308,1105.101],[459.402,1102.747],[486.496,1108.196],[513.58,1107.427],[540.674,1107],[567.768,1102.738],[594.862,1106.127],[621.947,1104.94],[649.04,1106.82],[676.134,1104.361],[703.229,1104.608],[730.322,1104.969],[757.416,1109.316],[784.501,1109.117],[811.595,1101.665],[838.689,1103.839],[865.783,1107.304],[892.876,1109.098],[919.98,1109.867],[947.074,1109.772],[973.958,1102.814]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-606.581,-957.942],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-606.581,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-532.752,-910.507],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-581.009,-910.507],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,13.331],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,13.331],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,13.331],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,13.331],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[1.414,18.743],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[1.414,17.956],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[1.242,17.956],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[1.355,17.956],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"왼쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,817.411],[538.739,800.219],[510.083,792.264],[487.506,774.902],[461.156,763.368],[437.501,747.667],[412.858,733.494],[388.953,718.173],[366.855,700.041],[342.172,685.944],[315.672,674.648],[292.466,658.244],[264.359,649.444],[242.201,631.408],[219.155,614.738],[193.174,602.645],[168.341,588.747],[145.215,576.814],[145.215,601.154],[141.851,627.953],[139.665,654.751],[144.297,681.549],[145.684,708.357],[148.219,735.155],[144.197,761.954],[145.434,788.762],[143.029,815.56],[142.57,842.368],[145.454,869.166],[143.348,895.964],[143.219,922.763],[146.812,949.57],[141.801,976.378],[144.217,1003.186],[140.843,1029.994],[140.334,1056.802],[140.134,1083.61],[159.957,1094.612],[186.826,1082.594],[209.313,1064.823],[232.749,1048.306],[256.204,1031.798],[280.748,1016.704],[304.293,1000.319],[324.335,979.388],[347.462,962.443],[371.945,947.283],[398.674,935.027],[422.669,919.222],[441.703,896.971],[466.177,881.792],[491.878,868.179],[515.523,851.927],[535.944,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[495.899,817.411],[473.168,800.219],[448,792.264],[428.171,774.902],[405.028,763.368],[384.252,747.667],[362.608,733.494],[341.613,718.173],[322.204,700.041],[300.525,685.944],[277.251,674.648],[256.869,658.244],[232.183,649.444],[212.722,631.408],[192.481,614.738],[169.662,602.645],[147.852,588.747],[127.54,576.814],[127.54,601.154],[124.586,627.953],[122.666,654.751],[126.734,681.549],[127.952,708.357],[130.179,735.155],[126.646,761.954],[127.733,788.762],[125.621,815.56],[125.217,842.368],[127.751,869.166],[125.901,895.964],[125.787,922.763],[128.943,949.57],[124.542,976.378],[126.664,1003.186],[123.701,1029.994],[123.254,1056.802],[123.078,1083.61],[140.488,1094.612],[164.087,1082.594],[183.837,1064.823],[204.421,1048.306],[225.021,1031.798],[246.578,1016.704],[267.257,1000.319],[284.86,979.388],[305.171,962.443],[326.675,947.283],[350.151,935.027],[371.225,919.222],[387.942,896.971],[409.437,881.792],[432.01,868.179],[452.778,851.927],[470.713,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-352.143,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-309.283,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-337.298,-835.713],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"왼쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"왼쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,859.995],[538.739,841.908],[510.083,833.539],[487.506,815.272],[461.156,803.137],[437.501,786.618],[412.858,771.707],[388.953,755.587],[366.855,736.511],[342.172,721.68],[315.672,709.795],[292.466,692.536],[264.359,683.278],[242.201,664.302],[219.155,646.764],[193.174,634.04],[168.341,619.419],[145.215,606.865],[145.215,632.472],[141.851,660.667],[139.665,688.861],[144.297,717.056],[145.684,745.26],[148.219,773.454],[144.197,801.649],[145.434,829.853],[143.029,858.048],[142.57,886.252],[145.454,914.447],[143.348,942.641],[143.219,970.835],[146.812,999.04],[141.801,1027.244],[144.217,1055.449],[140.843,1083.653],[140.334,1111.858],[140.134,1140.062],[159.957,1151.637],[186.826,1138.993],[209.313,1120.297],[232.749,1102.919],[256.204,1085.551],[280.748,1069.671],[304.293,1052.432],[324.335,1030.41],[347.462,1012.583],[371.945,996.633],[398.674,983.739],[422.669,967.11],[441.703,943.7],[466.177,927.73],[491.878,913.408],[515.523,896.309],[535.944,874.607]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[564.62,817.411],[538.739,800.219],[510.083,792.264],[487.506,774.902],[461.156,763.368],[437.501,747.667],[412.858,733.494],[388.953,718.173],[366.855,700.041],[342.172,685.944],[315.672,674.648],[292.466,658.244],[264.359,649.444],[242.201,631.408],[219.155,614.738],[193.174,602.645],[168.341,588.747],[145.215,576.814],[145.215,601.154],[141.851,627.953],[139.665,654.751],[144.297,681.549],[145.684,708.357],[148.219,735.155],[144.197,761.954],[145.434,788.762],[143.029,815.56],[142.57,842.368],[145.454,869.166],[143.348,895.964],[143.219,922.763],[146.812,949.57],[141.801,976.378],[144.217,1003.186],[140.843,1029.994],[140.334,1056.802],[140.134,1083.61],[159.957,1094.612],[186.826,1082.594],[209.313,1064.823],[232.749,1048.306],[256.204,1031.798],[280.748,1016.704],[304.293,1000.319],[324.335,979.388],[347.462,962.443],[371.945,947.283],[398.674,935.027],[422.669,919.222],[441.703,896.971],[466.177,881.792],[491.878,868.179],[515.523,851.927],[535.944,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[495.899,817.411],[473.168,800.219],[448,792.264],[428.171,774.902],[405.028,763.368],[384.252,747.667],[362.608,733.494],[341.613,718.173],[322.204,700.041],[300.525,685.944],[277.251,674.648],[256.869,658.244],[232.183,649.444],[212.722,631.408],[192.481,614.738],[169.662,602.645],[147.852,588.747],[127.54,576.814],[127.54,601.154],[124.586,627.953],[122.666,654.751],[126.734,681.549],[127.952,708.357],[130.179,735.155],[126.646,761.954],[127.733,788.762],[125.621,815.56],[125.217,842.368],[127.751,869.166],[125.901,895.964],[125.787,922.763],[128.943,949.57],[124.542,976.378],[126.664,1003.186],[123.701,1029.994],[123.254,1056.802],[123.078,1083.61],[140.488,1094.612],[164.087,1082.594],[183.837,1064.823],[204.421,1048.306],[225.021,1031.798],[246.578,1016.704],[267.257,1000.319],[284.86,979.388],[305.171,962.443],[326.675,947.283],[350.151,935.027],[371.225,919.222],[387.942,896.971],[409.437,881.792],[432.01,868.179],[452.778,851.927],[470.713,831.299]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[540.818,817.411],[516.028,800.219],[488.58,792.264],[466.955,774.902],[441.715,763.368],[419.057,747.667],[395.453,733.494],[372.556,718.173],[351.39,700.041],[327.747,685.944],[302.364,674.648],[280.136,658.244],[253.215,649.444],[231.991,631.408],[209.916,614.738],[185.03,602.645],[161.244,588.747],[139.093,576.814],[139.093,601.154],[135.871,627.953],[133.778,654.751],[138.214,681.549],[139.542,708.357],[141.971,735.155],[138.118,761.954],[139.303,788.762],[136.999,815.56],[136.56,842.368],[139.323,869.166],[137.305,895.964],[137.181,922.763],[140.623,949.57],[135.823,976.378],[138.137,1003.186],[134.906,1029.994],[134.418,1056.802],[134.227,1083.61],[153.214,1094.612],[178.95,1082.594],[200.489,1064.823],[222.937,1048.306],[245.404,1031.798],[268.913,1016.704],[291.465,1000.319],[310.663,979.388],[332.814,962.443],[356.265,947.283],[381.868,935.027],[404.851,919.222],[423.082,896.971],[446.524,881.792],[471.142,868.179],[493.791,851.927],[513.351,831.299]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-352.143,-879.251],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-352.143,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-309.283,-835.713],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-337.298,-835.713],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,8.281],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,8.281],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,8.281],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,8.281],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-53.049,0.818],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-53.049,0.865],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-46.593,0.865],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-50.813,0.865],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽 Group","bm":0,"it":[{"ty":"gr","hd":false,"nm":"오른쪽_선 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_선","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,817.364],[662.904,803.741],[688.895,791.657],[710.573,772.899],[738.041,763.112],[762.206,748.189],[785.172,731.415],[812.131,720.831],[836.734,706.601],[858.333,687.701],[881.999,672.009],[907.79,659.63],[931.774,644.413],[957.046,631.218],[981.051,616.039],[1006.543,603.176],[1031.006,588.719],[1057.586,570.796],[1052.635,601.467],[1059.792,628.588],[1054.412,655.71],[1051.348,682.84],[1059.173,709.961],[1054.112,737.082],[1057.187,764.203],[1052.346,791.334],[1056.588,818.455],[1055.151,845.576],[1057.606,872.697],[1059.991,899.818],[1052.495,926.949],[1057.127,954.07],[1056.717,981.201],[1058.873,1008.322],[1058.654,1035.452],[1058.145,1062.583],[1052.176,1089.714],[1042.664,1099.121],[1020.756,1082.736],[997.57,1068.013],[974.324,1053.365],[950.06,1040.028],[927.961,1023.89],[908.169,1004.753],[885.203,989.744],[863.923,972.543],[841.655,956.624],[816.912,943.922],[796.63,925.411],[773.903,910.099],[750.069,896.211],[727.581,880.567],[706.202,863.48],[683.036,848.728],[662.844,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[558.332,817.364],[582.22,803.741],[605.048,791.657],[624.088,772.899],[648.213,763.112],[669.436,748.189],[689.607,731.415],[713.285,720.831],[734.893,706.601],[753.864,687.701],[774.648,672.009],[797.301,659.63],[818.366,644.413],[840.562,631.218],[861.645,616.039],[884.034,603.176],[905.52,588.719],[928.865,570.796],[924.517,601.467],[930.802,628.588],[926.077,655.71],[923.386,682.84],[930.258,709.961],[925.814,737.082],[928.514,764.203],[924.262,791.334],[927.988,818.455],[926.726,845.576],[928.882,872.697],[930.977,899.818],[924.394,926.949],[928.461,954.07],[928.102,981.201],[929.995,1008.322],[929.803,1035.452],[929.356,1062.583],[924.113,1089.714],[915.759,1099.121],[896.517,1082.736],[876.153,1068.013],[855.736,1053.365],[834.426,1040.028],[815.017,1023.89],[797.634,1004.753],[777.463,989.744],[758.773,972.543],[739.215,956.624],[717.484,943.922],[699.671,925.411],[679.71,910.099],[658.776,896.211],[639.026,880.567],[620.248,863.48],[599.902,848.728],[582.168,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"st","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"lc":2,"lj":2,"ml":4,"o":{"a":0,"k":100},"w":{"a":0,"k":11.13}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-847.848,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-744.655,-834.959],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-812.106,-834.959],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":false,"nm":"오른쪽_면 Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"오른쪽_면","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,859.945],[662.904,845.613],[688.895,832.899],[710.573,813.164],[738.041,802.867],[762.206,787.167],[785.172,769.519],[812.131,758.383],[836.734,743.412],[858.333,723.527],[881.999,707.018],[907.79,693.995],[931.774,677.985],[957.046,664.102],[981.051,648.133],[1006.543,634.6],[1031.006,619.389],[1057.586,600.533],[1052.635,632.802],[1059.792,661.336],[1054.412,689.87],[1051.348,718.414],[1059.173,746.948],[1054.112,775.482],[1057.187,804.016],[1052.346,832.56],[1056.588,861.094],[1055.151,889.628],[1057.606,918.162],[1059.991,946.696],[1052.495,975.24],[1057.127,1003.774],[1056.717,1032.318],[1058.873,1060.852],[1058.654,1089.396],[1058.145,1117.94],[1052.176,1146.484],[1042.664,1156.381],[1020.756,1139.143],[997.57,1123.653],[974.324,1108.242],[950.06,1094.21],[927.961,1077.231],[908.169,1057.097],[885.203,1041.307],[863.923,1023.209],[841.655,1006.461],[816.912,993.097],[796.63,973.622],[773.903,957.512],[750.069,942.901],[727.581,926.441],[706.202,908.464],[683.036,892.944],[662.844,873.179]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[635.705,817.364],[662.904,803.741],[688.895,791.657],[710.573,772.899],[738.041,763.112],[762.206,748.189],[785.172,731.415],[812.131,720.831],[836.734,706.601],[858.333,687.701],[881.999,672.009],[907.79,659.63],[931.774,644.413],[957.046,631.218],[981.051,616.039],[1006.543,603.176],[1031.006,588.719],[1057.586,570.796],[1052.635,601.467],[1059.792,628.588],[1054.412,655.71],[1051.348,682.84],[1059.173,709.961],[1054.112,737.082],[1057.187,764.203],[1052.346,791.334],[1056.588,818.455],[1055.151,845.576],[1057.606,872.697],[1059.991,899.818],[1052.495,926.949],[1057.127,954.07],[1056.717,981.201],[1058.873,1008.322],[1058.654,1035.452],[1058.145,1062.583],[1052.176,1089.714],[1042.664,1099.121],[1020.756,1082.736],[997.57,1068.013],[974.324,1053.365],[950.06,1040.028],[927.961,1023.89],[908.169,1004.753],[885.203,989.744],[863.923,972.543],[841.655,956.624],[816.912,943.922],[796.63,925.411],[773.903,910.099],[750.069,896.211],[727.581,880.567],[706.202,863.48],[683.036,848.728],[662.844,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[558.332,817.364],[582.22,803.741],[605.048,791.657],[624.088,772.899],[648.213,763.112],[669.436,748.189],[689.607,731.415],[713.285,720.831],[734.893,706.601],[753.864,687.701],[774.648,672.009],[797.301,659.63],[818.366,644.413],[840.562,631.218],[861.645,616.039],[884.034,603.176],[905.52,588.719],[928.865,570.796],[924.517,601.467],[930.802,628.588],[926.077,655.71],[923.386,682.84],[930.258,709.961],[925.814,737.082],[928.514,764.203],[924.262,791.334],[927.988,818.455],[926.726,845.576],[928.882,872.697],[930.977,899.818],[924.394,926.949],[928.461,954.07],[928.102,981.201],[929.995,1008.322],[929.803,1035.452],[929.356,1062.583],[924.113,1089.714],[915.759,1099.121],[896.517,1082.736],[876.153,1068.013],[855.736,1053.365],[834.426,1040.028],[815.017,1023.89],[797.634,1004.753],[777.463,989.744],[758.773,972.543],[739.215,956.624],[717.484,943.922],[699.671,925.411],[679.71,910.099],[658.776,896.211],[639.026,880.567],[620.248,863.48],[599.902,848.728],[582.168,829.942]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[608.906,817.364],[634.958,803.741],[659.853,791.657],[680.618,772.899],[706.928,763.112],[730.074,748.189],[752.072,731.415],[777.894,720.831],[801.461,706.601],[822.149,687.701],[844.817,672.009],[869.521,659.63],[892.494,644.413],[916.701,631.218],[939.693,616.039],[964.11,603.176],[987.543,588.719],[1013.002,570.796],[1008.26,601.467],[1015.115,628.588],[1009.962,655.71],[1007.027,682.84],[1014.522,709.961],[1009.675,737.082],[1012.619,764.203],[1007.983,791.334],[1012.046,818.455],[1010.669,845.576],[1013.021,872.697],[1015.306,899.818],[1008.126,926.949],[1012.562,954.07],[1012.17,981.201],[1014.235,1008.322],[1014.025,1035.452],[1013.537,1062.583],[1007.82,1089.714],[998.709,1099.121],[977.724,1082.736],[955.516,1068.013],[933.25,1053.365],[910.009,1040.028],[888.842,1023.89],[869.884,1004.753],[847.886,989.744],[827.503,972.543],[806.174,956.624],[782.474,943.922],[763.047,925.411],[741.278,910.099],[718.448,896.211],[696.909,880.567],[676.431,863.48],[654.241,848.728],[634.901,829.942]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.737,0.863,0.992]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-847.848,-878.457],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-847.848,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-744.655,-834.958],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-812.106,-834.958],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"gr","hd":true,"nm":"종이_half Group","bm":0,"it":[{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[-17.839,-1.257],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[-17.839,-1.701],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-333.819,-103.625],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-333.819,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-303.869,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-323.445,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.3,"s":[-323.445,-8.67],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[37.148,59.94],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[61.01,11.705],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[61.01,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[54.552,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[58.774,11.761],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":15,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[37.148,59.94],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[61.01,11.705],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[61.01,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[54.552,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[58.774,11.761],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":16,"ty":4,"nm":"종이_half","parent":15,"hd":true,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[-17.839,-1.257],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[-17.839,-1.701],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-333.819,-103.625],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-333.819,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-303.869,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-323.445,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.3,"s":[-323.445,-8.67],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":20,"ty":0,"nm":"to","parent":16,"hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.427,28.464]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-33.946,-41.944],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-33.946,-39.867],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-29.814,-39.867],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-32.515,-39.867],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"h":56.928199768066406,"refId":"el-151-_-Uo","w":76.85435485839844},{"ddd":0,"ind":21,"ty":4,"nm":"종이_half","parent":15,"hd":true,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[-17.839,-1.257],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[-17.839,-1.392],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[-17.839,-1.701],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":12.3,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"p":{"a":1,"k":[{"t":0,"s":[-333.819,-103.625],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-333.819,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-303.869,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-323.445,-99.464],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":12.3,"s":[-323.445,-8.67],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"종이_half Group","bm":0,"it":[{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[178.726,189.879],[178.692,178.952],[178.851,165.753],[176.987,152.554],[177.7,139.355],[178.929,126.156],[179.148,112.957],[179.03,99.759],[177.146,86.3],[192.092,86.928],[206.778,86.688],[221.465,87.427],[236.152,84.589],[250.82,85.678],[264.631,85.678],[280.196,86.23],[294.883,86.23],[309.569,84.7],[324.256,87.981],[338.807,86.709],[337.618,99.761],[339.184,114.46],[339.184,128.074],[338.809,141.349],[339.184,152.559],[338.57,165.758],[338.809,177.732],[338.65,191.157]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[178.726,180.477],[178.692,170.09],[178.851,157.545],[176.987,145],[177.7,132.455],[178.929,119.909],[179.148,107.364],[179.03,94.819],[177.146,82.027],[192.092,82.623],[206.778,82.396],[221.465,83.098],[236.152,80.4],[250.82,81.435],[264.631,81.435],[280.196,81.96],[294.883,81.96],[309.569,80.506],[324.256,83.625],[338.807,82.415],[337.618,94.821],[339.184,108.792],[339.184,121.732],[338.809,134.35],[339.184,145.005],[338.57,157.55],[338.809,168.931],[338.65,181.691]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[156.973,180.477],[156.943,170.09],[157.083,157.545],[155.446,145],[156.072,132.455],[157.151,119.909],[157.344,107.364],[157.24,94.819],[155.585,82.027],[168.712,82.623],[181.611,82.396],[194.51,83.098],[207.409,80.4],[220.293,81.435],[232.422,81.435],[246.093,81.96],[258.992,81.96],[271.891,80.506],[284.79,83.625],[297.57,82.415],[296.526,94.821],[297.901,108.792],[297.901,121.732],[297.572,134.35],[297.901,145.005],[297.362,157.55],[297.572,168.931],[297.432,181.691]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[171.192,180.477],[171.159,170.09],[171.311,157.545],[169.526,145],[170.209,132.455],[171.386,119.909],[171.596,107.364],[171.483,94.819],[169.678,82.027],[183.994,82.623],[198.061,82.396],[212.129,83.098],[226.196,80.4],[240.247,81.435],[253.475,81.435],[268.384,81.96],[282.452,81.96],[296.519,80.506],[310.587,83.625],[324.524,82.415],[323.385,94.821],[324.886,108.792],[324.886,121.732],[324.526,134.35],[324.886,145.005],[324.297,157.55],[324.526,168.931],[324.374,181.691]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0.05,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0.044,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0.048,37.786],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[0.05,39.754],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0.05,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[0.044,37.786],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[0.048,37.786],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":1,"k":[{"t":0,"s":[240.247,129.182],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[240.247,122.354],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[208.835,122.354],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[229.367,122.354],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-17.839,1.227],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[-17.839,0.736],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-17.839,0.736],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-17.839,0.736],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":24,"ty":4,"nm":"오른쪽","parent":1,"hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[37.148,59.94],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[37.148,59.94],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[61.01,11.705],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[61.01,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[54.552,11.761],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[58.774,11.761],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[21.405,21.405]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"뒷면bg Group","bm":0,"it":[{"ty":"sh","hd":false,"nm":"뒷면bg","d":1,"ks":{"a":1,"k":[{"t":0,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.974,-56.459],[91.974,56.459],[-91.974,56.459],[-91.974,-56.459]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[91.974,-53.664],[91.974,53.664],[-91.974,53.664],[-91.974,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[80.779,-53.664],[80.779,53.664],[-80.779,53.664],[-80.779,-53.664]]}],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[88.096,-53.664],[88.096,53.664],[-88.096,53.664],[-88.096,-53.664]]}],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[-250.023,8.152],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[-250.023,7.748],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[-219.592,7.748],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[-239.483,7.748],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":0,"k":0},"s":{"a":0,"k":[491.888,491.888]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":26,"ty":4,"nm":"편지","hd":false,"sr":1,"ks":{"a":{"a":1,"k":[{"t":0,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":5.4,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[0,-13.874],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0,-13.874],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"o":{"a":0,"k":100},"p":{"a":1,"k":[{"t":0,"s":[187.544,167.891],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":3.9,"s":[187.886,167.899],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":5.4,"s":[187.506,167.896],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":9.3,"s":[186.512,167.921],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25},"ti":[0,0],"to":[0,0]},{"t":11.1,"s":[187.542,167.896],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"r":{"a":1,"k":[{"t":0,"s":[0],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":3.9,"s":[1],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":9.3,"s":[-3],"i":{"x":0.75,"y":0.75},"o":{"x":0.25,"y":0.25}},{"t":11.1,"s":[0],"i":{"x":0,"y":0},"o":{"x":1,"y":1}}]},"s":{"a":0,"k":[140.592,140.592]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":27,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":31,"ty":0,"nm":"to","parent":27,"hd":true,"sr":1,"ks":{"a":{"a":0,"k":[38.5,28.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[-34,-89.302]},"r":{"a":0,"k":0},"s":{"a":0,"k":[55.541,55.541]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"h":57,"refId":"el-159-_-Uo","w":77},{"ddd":0,"ind":32,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":true,"nm":"종이_전체 Group","bm":0,"it":[{"ty":"gr","hd":true,"nm":"Path 1 Group","bm":0,"it":[{"ty":"sh","hd":true,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[339.825,284.126],[324.871,284.404],[310.156,284.126],[295.442,283.591],[280.727,283.203],[266.03,285.436],[251.314,286.009],[237.23,286.009],[221.882,285.325],[207.168,284.255],[192.453,285.105],[178.433,284.237],[177.3,271.686],[178.433,258.47],[179.367,245.255],[177.759,232.039],[177.759,220.928],[177.938,205.608],[178.435,192.393],[179.031,179.177],[179.19,165.962],[177.323,152.746],[178.037,139.531],[179.268,126.315],[179.488,113.1],[179.369,99.884],[177.482,86.409],[192.456,87.037],[207.17,86.798],[221.885,87.537],[236.599,84.696],[251.296,85.786],[265.132,85.786],[280.727,86.338],[295.442,86.338],[310.156,84.807],[324.871,88.092],[339.449,86.818],[338.258,99.887],[339.827,114.604],[339.827,128.236],[339.451,141.527],[339.827,152.751],[339.211,165.967],[339.451,177.956],[339.292,192.398],[339.133,205.613],[339.769,218.829],[338.916,232.044],[338.24,245.26],[339.83,260.004],[339.83,284.131]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[258.565,185.352]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,9.931]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]},{"ddd":0,"ind":35,"ty":4,"nm":"종이_전체","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,2.728]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,337.03]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[]},{"ddd":0,"ind":36,"ty":4,"nm":"뒷면","hd":true,"sr":1,"ks":{"a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[35.002,80.037]},"r":{"a":0,"k":0},"s":{"a":0,"k":[25.311,25.311]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"sh","hd":true,"nm":"뒷면","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1058.32,594.37],[1057.48,622.15],[1057.34,649.5],[1058.3,676.85],[1057.04,704.21],[1059.07,731.56],[1056.29,758.92],[1057.99,786.27],[1057.43,813.63],[1055.89,840.99],[1059.2,868.34],[1057.45,895.69],[1057.22,923.05],[1058.97,950.4],[1056.85,977.76],[1058.41,1005.12],[1056.57,1032.48],[1059.58,1059.84],[1057.82,1087.2],[1058.23,1114.57],[1046.38,1143.91],[1019.81,1158.06],[991.87,1157.56],[963.95,1159.39],[936.02,1158.26],[908.09,1160.52],[880.16,1158.63],[852.23,1160.65],[824.31,1161.22],[796.38,1161.03],[768.44,1158.15],[740.51,1157.24],[712.58,1160.4],[684.65,1158.68],[656.72,1160.43],[628.79,1161.27],[600.86,1157.92],[572.92,1161.33],[544.99,1161.39],[517.06,1160.13],[489.13,1161.39],[461.19,1158.47],[433.26,1161.08],[405.33,1158.52],[377.4,1159.73],[349.46,1160.71],[321.53,1161.44],[293.59,1157.4],[265.66,1161.14],[237.72,1159.04],[209.78,1159.17],[181.84,1160.67],[153.67,1145.14],[142.48,1114.57],[144.38,1087.21],[146,1059.86],[145.06,1032.51],[142.89,1005.15],[142.66,977.8],[146.25,950.44],[142.31,923.09],[142.52,895.73],[145.53,868.37],[142.74,841.02],[143.73,813.67],[145.36,786.31],[144.83,758.96],[142.47,731.6],[145.87,704.24],[142.63,676.88],[146,649.52],[145.79,622.16],[144.5,595],[166.34,578.64],[189.51,563.89],[213.91,551],[235.73,534.22],[258.06,518.2],[281.66,504.11],[304.11,488.29],[326.82,472.84],[350.12,458.29],[373.46,443.82],[395.37,427.17],[417.69,411.13],[441.72,397.68],[464.47,382.29],[487.66,367.58],[511.03,353.12],[534.44,338.72],[556.65,322.51],[585.3,310.61],[616.16,311.53],[644.51,323.23],[668.37,336.94],[691.71,351.43],[713.81,367.79],[737.31,382.03],[760.76,396.36],[783,412.51],[805.26,428.62],[829.47,441.79],[852.31,457.04],[874.08,473.9],[897.34,488.5],[919.09,505.39],[942.45,519.86],[965.45,534.87],[987.69,551.03],[1011.76,564.42],[1034.79,579.38]]}}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.537,0.702,0.871]},"r":1,"o":{"a":0,"k":100}}]},{"ddd":0,"ind":37,"ty":4,"nm":"Screen","hd":false,"sr":1,"ks":{"a":{"a":0,"k":[187.5,187.5]},"o":{"a":0,"k":100},"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"ao":0,"ip":0,"op":16,"st":0,"bm":0,"shapes":[{"ty":"gr","hd":false,"nm":"Screen Group","bm":0,"it":[{"ty":"rc","hd":false,"nm":"Screen","d":1,"p":{"a":0,"k":[187.5,187.5]},"r":{"a":0,"k":0},"s":{"a":0,"k":[375,375]}},{"ty":"fl","hd":false,"bm":0,"c":{"a":0,"k":[0.142,0.142,0.142]},"r":1,"o":{"a":0,"k":0}},{"ty":"tr","nm":"Transform","a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}}],"np":0}]}],"meta":{"g":"@phase-software/lottie-exporter 0.7.0"},"nm":"","op":15,"v":"5.6.0","w":375} \ No newline at end of file From b6b64f48d7ad8e218b8fa1cf028135bca447d628 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 19 Mar 2025 21:51:53 +0900 Subject: [PATCH 154/210] =?UTF-8?q?[REFACTOR/#195]=20Lottie=20=EC=A0=84?= =?UTF-8?q?=ED=99=98=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20=EC=9E=AC=EC=83=9D?= =?UTF-8?q?=20=EC=A0=9C=EC=96=B4=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 --- .../ui/component/lottie/LottieAnimation.kt | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt b/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt index f947716f..60c06d43 100644 --- a/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt +++ b/core/ui/src/main/java/com/yapp/ui/component/lottie/LottieAnimation.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer @@ -26,12 +27,17 @@ fun LottieAnimation( contentScale: ContentScale = ContentScale.FillWidth, scaleXAdjustment: Float = 1f, scaleYAdjustment: Float = 1f, + play: Boolean = iterations == 1, + restartOnPlay: Boolean = false, onAnimationEnd: (() -> Unit)? = null, ) { val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(resId)) - val progress by animateLottieCompositionAsState( + val isPlaying = remember { mutableStateOf(iterations == LottieConstants.IterateForever || play) } + val animationState = animateLottieCompositionAsState( composition = composition, iterations = iterations, + isPlaying = isPlaying.value, + restartOnPlay = restartOnPlay, ) val alpha = remember { Animatable(0f) } @@ -44,9 +50,18 @@ fun LottieAnimation( } } - LaunchedEffect(progress) { - if (progress == 1f) { + LaunchedEffect(play) { + if (play) { + isPlaying.value = true + } + } + + LaunchedEffect(animationState.progress) { + if (animationState.progress == 1f) { onAnimationEnd?.invoke() + if (iterations == 1) { + isPlaying.value = false + } } } @@ -62,7 +77,7 @@ fun LottieAnimation( if (composition != null) { com.airbnb.lottie.compose.LottieAnimation( composition = composition, - progress = { progress }, + progress = { animationState.progress }, modifier = Modifier.fillMaxSize(), ) } From 9344f77cd457549b70cb29298eeaad3cc2998f10 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 19 Mar 2025 21:52:19 +0900 Subject: [PATCH 155/210] =?UTF-8?q?[ADD/#195]=20=EB=AF=B8=EC=85=98?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/mission/MissionContract.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt index 70848f1d..56dad24c 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt @@ -3,12 +3,16 @@ package com.yapp.mission sealed class MissionContract { data class State( + val missionType: MissionType = MissionType.Click, val showOverlayText: Boolean = false, val showOverlay: Boolean = true, val missionProgress: Int = 0, val isMissionCompleted: Boolean = false, - val isFlipped: Boolean = false, val shakeCount: Int = 0, + val clickCount: Int = 0, + val playWhenClick: Boolean = false, + val showFinalAnimation: Boolean = false, + val isFlipped: Boolean = false, val rotationY: Float = 0f, val rotationZ: Float = 0f, val showExitDialog: Boolean = false, @@ -26,6 +30,11 @@ sealed class MissionContract { object RetryPostFortune : Action() } + sealed class MissionType { + data object Shake : MissionType() + data object Click : MissionType() + } + sealed class SideEffect : com.yapp.ui.base.SideEffect { data class Navigate( val route: String, From 0153db024cf5a1e1504d7c7649652924a33906a0 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 19 Mar 2025 21:53:50 +0900 Subject: [PATCH 156/210] =?UTF-8?q?[ADD/#195]=20=EB=9E=9C=EB=8D=A4=20?= =?UTF-8?q?=EB=AF=B8=EC=85=98=20=ED=83=80=EC=9E=85=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=ED=81=B4=EB=A6=AD=20=ED=95=B8=EB=93=A4=EB=9F=AC=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/mission/MissionViewModel.kt | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index 4311850c..3e127626 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -21,6 +21,7 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject +import kotlin.random.Random @HiltViewModel class MissionViewModel @Inject constructor( @@ -31,7 +32,9 @@ class MissionViewModel @Inject constructor( private val app: Application, savedStateHandle: SavedStateHandle, ) : BaseViewModel( - MissionContract.State(), + MissionContract.State( + missionType = if (Random.nextBoolean()) MissionContract.MissionType.Shake else MissionContract.MissionType.Click, + ), ) { init { val notificationId = savedStateHandle.get("notificationId")?.toLong() @@ -54,7 +57,8 @@ class MissionViewModel @Inject constructor( is MissionContract.Action.StartOverlayTimer -> startOverlayTimer() - is MissionContract.Action.ShakeCard, is MissionContract.Action.ClickCard -> handleIncreaseCount() + is MissionContract.Action.ShakeCard -> handleShake() + is MissionContract.Action.ClickCard -> handleClick() is MissionContract.Action.ShowExitDialog -> updateState { copy(showExitDialog = true) } is MissionContract.Action.HideExitDialog -> updateState { copy(showExitDialog = false) } @@ -62,9 +66,10 @@ class MissionViewModel @Inject constructor( } } - private fun handleIncreaseCount() = viewModelScope.launch { + private fun handleShake() = viewModelScope.launch { if (currentState.showOverlay) updateState { copy(showOverlay = false) } if (currentState.showOverlayText) updateState { copy(showOverlayText = false) } + if (currentState.missionType !is MissionContract.MissionType.Shake) return@launch val currentCount = currentState.shakeCount if (currentCount < 9) { @@ -92,6 +97,37 @@ class MissionViewModel @Inject constructor( } } + private fun handleClick() = viewModelScope.launch { + if (currentState.missionType !is MissionContract.MissionType.Click) return@launch + + val currentCount = currentState.clickCount + if (currentCount < 9) { + hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS) + analyticsHelper.logEvent( + AnalyticsEvent( + type = "mission_success", + properties = mapOf( + AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to "click", + ), + ), + ) + updateState { copy(clickCount = currentCount + 1, playWhenClick = true) } + + kotlinx.coroutines.delay(500) + updateState { copy(playWhenClick = false) } + } else if (currentCount == 9) { + updateState { + copy( + clickCount = 10, + showFinalAnimation = true, + ) + } + postFortune() + kotlinx.coroutines.delay(500) + updateState { copy(isMissionCompleted = true) } + } + } + private fun postFortune() { viewModelScope.launch { val userId = userPreferences.userIdFlow.firstOrNull() ?: return@launch From 2e2f5ca409df7d4a647c278f68aba908feda4e83 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 19 Mar 2025 21:54:24 +0900 Subject: [PATCH 157/210] =?UTF-8?q?[REFACTOR/#195]=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=9D=BC?= =?UTF-8?q?=EB=B2=A8=20=EB=B0=8F=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/mission/MissionScreen.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt index dcdc119b..dee5420d 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt @@ -83,9 +83,9 @@ fun MissionScreen( Spacer(modifier = Modifier.heightForScreenPercentage(0.110f)) MissionTag(label = "기상미션") Spacer(modifier = Modifier.heightForScreenPercentage(0.0418f)) - MissionLabel(label = "10회를 흔들어", style = OrbitTheme.typography.headline2Medium) + MissionLabel(label = if (state.missionType is MissionContract.MissionType.Shake) "10회를 흔들어" else "10회를 눌러서", style = OrbitTheme.typography.headline2Medium) Spacer(modifier = Modifier.heightForScreenPercentage(0.01f)) - MissionLabel(label = "부적을 뒤집어줘", style = OrbitTheme.typography.title2Bold) + MissionLabel(label = if (state.missionType is MissionContract.MissionType.Shake) "부적을 뒤집어줘" else "편지를 열어줘", style = OrbitTheme.typography.title2Bold) } Column( modifier = Modifier @@ -93,11 +93,17 @@ fun MissionScreen( horizontalAlignment = Alignment.CenterHorizontally, ) { Image( - painter = painterResource(id = core.designsystem.R.drawable.img_mission_main), + painter = painterResource( + if (state.missionType is MissionContract.MissionType.Shake) { + core.designsystem.R.drawable.img_mission_main + } else { + core.designsystem.R.drawable.ic_mission_main_letter + }, + ), contentDescription = "", modifier = Modifier .fillMaxWidth() - .scale(1.1f), + .scale(if (state.missionType is MissionContract.MissionType.Shake) 1.1f else 1.0f), ) } Column( From 4a6116886eb300bc04d3babdc43a0c981a0713d8 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 19 Mar 2025 21:54:55 +0900 Subject: [PATCH 158/210] =?UTF-8?q?[ADD/#195]=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=20=EC=83=81=ED=83=9C=20=EB=B0=8F=20=EC=95=A0=EB=8B=88?= =?UTF-8?q?=EB=A9=94=EC=9D=B4=EC=85=98=20=EC=B2=98=EB=A6=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/mission/MissionProgressScreen.kt | 63 ++++++++++++++++--- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt index 353a5039..61759020 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt @@ -2,16 +2,19 @@ package com.yapp.mission import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.Crossfade import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.scaleIn import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.detectTapGestures 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.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -137,7 +140,10 @@ fun MissionProgressScreen( Spacer(modifier = Modifier.heightForScreenPercentage(0.0246f)) MissionProgressBar( - currentProgress = state.shakeCount, + currentProgress = when (state.missionType) { + is MissionContract.MissionType.Shake -> state.shakeCount + is MissionContract.MissionType.Click -> state.clickCount + }, totalProgress = 10, modifier = Modifier .fillMaxWidth() @@ -147,23 +153,56 @@ fun MissionProgressScreen( ) Spacer(modifier = Modifier.heightForScreenPercentage(0.06f)) Text( - text = "10회를 흔들어야 운세를 받아요", + text = if (state.missionType is MissionContract.MissionType.Shake) "10회를 흔들어야 운세를 받아요" else "10회를 눌러야 운세를 받아요", color = OrbitTheme.colors.white, style = OrbitTheme.typography.heading2SemiBold, modifier = Modifier.alpha(if (state.showOverlay) 0f else 1f), ) Spacer(modifier = Modifier.heightForScreenPercentage(0.005f)) Text( - text = state.shakeCount.toString(), + text = when (state.missionType) { + is MissionContract.MissionType.Shake -> state.shakeCount.toString() + is MissionContract.MissionType.Click -> state.clickCount.toString() + }, color = OrbitTheme.colors.white, style = OrbitTheme.typography.displaySemiBold, modifier = Modifier.alpha(if (state.showOverlay) 0f else 1f), ) - Spacer(modifier = Modifier.heightForScreenPercentage(0.0665f)) - FlipCard( - state = state, - eventDispatcher = eventDispatcher, - ) + + Spacer(modifier = Modifier.heightForScreenPercentage(if (state.missionType is MissionContract.MissionType.Shake) 0.0665f else 0.1f)) + if (state.missionType is MissionContract.MissionType.Shake) { + FlipCard( + state = state, + eventDispatcher = eventDispatcher, + ) + } else if (state.missionType is MissionContract.MissionType.Click) { + Crossfade( + targetState = state.showFinalAnimation, + animationSpec = tween(durationMillis = 500), + ) { showFinal -> + LottieAnimation( + modifier = Modifier + .aspectRatio(12f / 9f) + .pointerInput(Unit) { + detectTapGestures( + onTap = { + if (!state.showFinalAnimation) { + eventDispatcher(MissionContract.Action.ClickCard) + } + }, + ) + }, + resId = if (showFinal) { + core.designsystem.R.raw.mission_letter_open + } else { + core.designsystem.R.raw.mission_letter_tap + }, + play = state.playWhenClick || showFinal, + restartOnPlay = true, + iterations = 1, + ) + } + } } } @@ -191,7 +230,7 @@ fun MissionProgressScreen( ) + fadeIn(animationSpec = tween(durationMillis = 300)), ) { Text( - text = "흔들기 시작!", + text = if (state.missionType is MissionContract.MissionType.Shake) "흔들기 시작!" else "누르기 시작!", color = OrbitTheme.colors.white, style = OrbitTheme.typography.title1Bold, ) @@ -210,7 +249,10 @@ fun MissionProgressScreen( AnalyticsEvent( type = "mission_fail", properties = mapOf( - AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to "shake", + AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to when (state.missionType) { + is MissionContract.MissionType.Shake -> "shake" + is MissionContract.MissionType.Click -> "click" + }, ), ), ) @@ -246,6 +288,7 @@ fun MissionProgressScreen( scaleYAdjustment = 1.3f, resId = core.designsystem.R.raw.mission_success, iterations = 1, + play = true, ) Text( text = "미션 성공!", From 8e797e7dbe8e7ebf8417ba27d655c1f7049e48f1 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 26 Mar 2025 20:05:31 +0900 Subject: [PATCH 159/210] =?UTF-8?q?[ADD/#195]=20firebase-config=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/libs.versions.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0218a0d0..1d5c5386 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -152,6 +152,7 @@ gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } # Google Libraries firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase-bom" } firebase-analytics = { group = "com.google.firebase", name = "firebase-analytics-ktx" } +firebase-config = { group = "com.google.firebase", name = "firebase-config-ktx" } ## Logging timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } From 7bf144974b8da339eccdda2929ecfc832f212b2c Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 26 Mar 2025 20:06:49 +0900 Subject: [PATCH 160/210] =?UTF-8?q?[ADD/#195]=20core:remoteconfig=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 --- core/remoteconfig/.gitignore | 1 + core/remoteconfig/build.gradle.kts | 15 +++++++++++++ core/remoteconfig/consumer-rules.pro | 0 core/remoteconfig/proguard-rules.pro | 21 +++++++++++++++++++ .../remoteconfig/src/main/AndroidManifest.xml | 4 ++++ settings.gradle.kts | 1 + 6 files changed, 42 insertions(+) create mode 100644 core/remoteconfig/.gitignore create mode 100644 core/remoteconfig/build.gradle.kts create mode 100644 core/remoteconfig/consumer-rules.pro create mode 100644 core/remoteconfig/proguard-rules.pro create mode 100644 core/remoteconfig/src/main/AndroidManifest.xml diff --git a/core/remoteconfig/.gitignore b/core/remoteconfig/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/core/remoteconfig/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/remoteconfig/build.gradle.kts b/core/remoteconfig/build.gradle.kts new file mode 100644 index 00000000..61a87620 --- /dev/null +++ b/core/remoteconfig/build.gradle.kts @@ -0,0 +1,15 @@ +import com.yapp.convention.setNamespace + +plugins { + id("orbit.android.library") + id("orbit.android.hilt") +} + +android { + setNamespace("core.remoteconfig") +} + +dependencies { + implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.config) +} diff --git a/core/remoteconfig/consumer-rules.pro b/core/remoteconfig/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/core/remoteconfig/proguard-rules.pro b/core/remoteconfig/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/core/remoteconfig/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/core/remoteconfig/src/main/AndroidManifest.xml b/core/remoteconfig/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8bdb7e14 --- /dev/null +++ b/core/remoteconfig/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/settings.gradle.kts b/settings.gradle.kts index fe745646..c2db5f10 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -47,3 +47,4 @@ include(":core:alarm") include(":feature:splash") include(":feature:webview") include(":core:analytics") +include(":core:remoteconfig") From 9fdef710d6004eaa3920a9ff019ee89ce8d2e518 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 26 Mar 2025 20:07:17 +0900 Subject: [PATCH 161/210] =?UTF-8?q?[ADD/#195]=20core:remoteconfig=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 423f4426..f2c52f14 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { implementation(projects.core.network) implementation(projects.core.datastore) implementation(projects.core.media) + implementation(projects.core.remoteconfig) ksp(libs.androidx.room.compiler) implementation(libs.androidx.room.ktx) From 480ec62c83138752d2a10a610c7ac1d702b65fb2 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 26 Mar 2025 20:07:43 +0900 Subject: [PATCH 162/210] =?UTF-8?q?[FEAT/#195]=20firebase-remoteconfig=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EB=B0=8F=20=EB=A7=A4=EB=8B=88=EC=A0=80=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FirebaseRemoteConfigManager.kt | 26 ++++++++++++++ .../remoteconfig/di/RemoteConfigModule.kt | 35 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 core/remoteconfig/src/main/java/com/yapp/remoteconfig/FirebaseRemoteConfigManager.kt create mode 100644 core/remoteconfig/src/main/java/com/yapp/remoteconfig/di/RemoteConfigModule.kt diff --git a/core/remoteconfig/src/main/java/com/yapp/remoteconfig/FirebaseRemoteConfigManager.kt b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/FirebaseRemoteConfigManager.kt new file mode 100644 index 00000000..7427b54f --- /dev/null +++ b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/FirebaseRemoteConfigManager.kt @@ -0,0 +1,26 @@ +package com.yapp.remoteconfig + +import com.google.firebase.remoteconfig.FirebaseRemoteConfig +import kotlinx.coroutines.tasks.await +import javax.inject.Inject + +class FirebaseRemoteConfigManager @Inject constructor( + private val remoteConfig: FirebaseRemoteConfig, +) { + suspend fun fetchAndActivate(): Boolean { + return try { + remoteConfig.fetchAndActivate().await() + } catch (e: Exception) { + false + } + } + + fun getRawMissionType(): String { + val rawValue = remoteConfig.getString(KEY_MISSION_TYPE) + return rawValue + } + + companion object { + private const val KEY_MISSION_TYPE = "alarm_mission_type" + } +} diff --git a/core/remoteconfig/src/main/java/com/yapp/remoteconfig/di/RemoteConfigModule.kt b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/di/RemoteConfigModule.kt new file mode 100644 index 00000000..0b2928b1 --- /dev/null +++ b/core/remoteconfig/src/main/java/com/yapp/remoteconfig/di/RemoteConfigModule.kt @@ -0,0 +1,35 @@ +package com.yapp.remoteconfig.di + +import com.google.firebase.ktx.Firebase +import com.google.firebase.remoteconfig.FirebaseRemoteConfig +import com.google.firebase.remoteconfig.ktx.remoteConfig +import com.google.firebase.remoteconfig.ktx.remoteConfigSettings +import com.yapp.remoteconfig.FirebaseRemoteConfigManager +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object RemoteConfigModule { + + @Provides + @Singleton + fun provideFirebaseRemoteConfig(): FirebaseRemoteConfig { + return Firebase.remoteConfig.apply { + setConfigSettingsAsync( + remoteConfigSettings { + minimumFetchIntervalInSeconds = 3600L + }, + ) + } + } + + @Provides + @Singleton + fun provideRemoteConfigManager( + remoteConfig: FirebaseRemoteConfig, + ): FirebaseRemoteConfigManager = FirebaseRemoteConfigManager(remoteConfig) +} From efb5b663ca06a0114cf8857032b783956915f853 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 26 Mar 2025 20:08:55 +0900 Subject: [PATCH 163/210] =?UTF-8?q?[FEAT/#195]=20RemoteConfigRepository=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/domain/repository/RemoteConfigRepository.kt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 domain/src/main/java/com/yapp/domain/repository/RemoteConfigRepository.kt diff --git a/domain/src/main/java/com/yapp/domain/repository/RemoteConfigRepository.kt b/domain/src/main/java/com/yapp/domain/repository/RemoteConfigRepository.kt new file mode 100644 index 00000000..56709c6f --- /dev/null +++ b/domain/src/main/java/com/yapp/domain/repository/RemoteConfigRepository.kt @@ -0,0 +1,8 @@ +package com.yapp.domain.repository + +import com.yapp.domain.model.MissionType + +interface RemoteConfigRepository { + suspend fun fetchAndActivate(): Boolean + fun getMissionType(): MissionType +} From 32cbccbb4c0f2447ae58cc649f14029837c13e46 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 26 Mar 2025 20:09:05 +0900 Subject: [PATCH 164/210] =?UTF-8?q?[ADD/#195]=20RemoteConfig=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=20=EA=B0=92=EC=9D=84=20=EA=B8=B0=EB=B0=98=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=AF=B8=EC=85=98=20=ED=83=80=EC=9E=85=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/domain/model/MissionType.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 domain/src/main/java/com/yapp/domain/model/MissionType.kt diff --git a/domain/src/main/java/com/yapp/domain/model/MissionType.kt b/domain/src/main/java/com/yapp/domain/model/MissionType.kt new file mode 100644 index 00000000..45388ee6 --- /dev/null +++ b/domain/src/main/java/com/yapp/domain/model/MissionType.kt @@ -0,0 +1,18 @@ +package com.yapp.domain.model + +sealed class MissionType { + data object Shake : MissionType() + data object Click : MissionType() + + companion object { + fun fromRemoteValue(value: String): MissionType { + return when (value) { + "tap_mission" -> Click + "shake_mission" -> Shake + else -> { + Click + } + } + } + } +} From d686e64a8666e9bfa2633b134e24eb3317089d48 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 26 Mar 2025 20:09:24 +0900 Subject: [PATCH 165/210] =?UTF-8?q?[FEAT/#195]=20RemoteConfig=20=EB=AF=B8?= =?UTF-8?q?=EC=85=98=20=ED=83=80=EC=9E=85=20=EC=A1=B0=ED=9A=8C=20UseCase?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/domain/usecase/GetMissionTypeUseCase.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 domain/src/main/java/com/yapp/domain/usecase/GetMissionTypeUseCase.kt diff --git a/domain/src/main/java/com/yapp/domain/usecase/GetMissionTypeUseCase.kt b/domain/src/main/java/com/yapp/domain/usecase/GetMissionTypeUseCase.kt new file mode 100644 index 00000000..9df0611f --- /dev/null +++ b/domain/src/main/java/com/yapp/domain/usecase/GetMissionTypeUseCase.kt @@ -0,0 +1,14 @@ +package com.yapp.domain.usecase + +import com.yapp.domain.model.MissionType +import com.yapp.domain.repository.RemoteConfigRepository +import javax.inject.Inject + +class GetMissionTypeUseCase @Inject constructor( + private val repository: RemoteConfigRepository, +) { + suspend fun execute(): MissionType { + repository.fetchAndActivate() + return repository.getMissionType() + } +} From e391e8387d58e252a6a3538b8c21b9232cb100e2 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 26 Mar 2025 20:10:22 +0900 Subject: [PATCH 166/210] =?UTF-8?q?[FEAT/#195]=20RemoteConfigRepositoryImp?= =?UTF-8?q?l=20=EA=B5=AC=ED=98=84(Remote-Config=EA=B0=92=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EB=8A=94=20=EC=97=AD=ED=95=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RemoteConfigRepositoryImpl.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 data/src/main/java/com/yapp/data/remote/repositoryimpl/RemoteConfigRepositoryImpl.kt diff --git a/data/src/main/java/com/yapp/data/remote/repositoryimpl/RemoteConfigRepositoryImpl.kt b/data/src/main/java/com/yapp/data/remote/repositoryimpl/RemoteConfigRepositoryImpl.kt new file mode 100644 index 00000000..e45ae5a1 --- /dev/null +++ b/data/src/main/java/com/yapp/data/remote/repositoryimpl/RemoteConfigRepositoryImpl.kt @@ -0,0 +1,17 @@ +package com.yapp.data.remote.repositoryimpl + +import com.yapp.domain.model.MissionType +import com.yapp.domain.repository.RemoteConfigRepository +import com.yapp.remoteconfig.FirebaseRemoteConfigManager +import javax.inject.Inject + +class RemoteConfigRepositoryImpl @Inject constructor( + private val manager: FirebaseRemoteConfigManager, +) : RemoteConfigRepository { + + override suspend fun fetchAndActivate(): Boolean = manager.fetchAndActivate() + + override fun getMissionType(): MissionType { + return MissionType.fromRemoteValue(manager.getRawMissionType()) + } +} From ad075781d00b6257a68305f56c7c9056958fb151 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 26 Mar 2025 20:10:34 +0900 Subject: [PATCH 167/210] =?UTF-8?q?[ADD/#195]=20RemoteConfigRepositoryImpl?= =?UTF-8?q?=20DI=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/data/remote/di/RepositoryModule.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt b/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt index 14027c71..ed92d2db 100644 --- a/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt +++ b/data/src/main/java/com/yapp/data/remote/di/RepositoryModule.kt @@ -2,10 +2,12 @@ package com.yapp.data.remote.di import com.yapp.data.remote.repositoryimpl.DummyRepositoryImpl import com.yapp.data.remote.repositoryimpl.FortuneRepositoryImpl +import com.yapp.data.remote.repositoryimpl.RemoteConfigRepositoryImpl import com.yapp.data.remote.repositoryimpl.SignUpRepositoryImpl import com.yapp.data.remote.repositoryimpl.UserInfoRepositoryImpl import com.yapp.domain.repository.DummyRepository import com.yapp.domain.repository.FortuneRepository +import com.yapp.domain.repository.RemoteConfigRepository import com.yapp.domain.repository.SignUpRepository import com.yapp.domain.repository.UserInfoRepository import dagger.Binds @@ -40,4 +42,10 @@ abstract class RepositoryModule { abstract fun bindsFortuneRepository( fortuneRepository: FortuneRepositoryImpl, ): FortuneRepository + + @Binds + @Singleton + abstract fun bindsRemoteConfigRepository( + remoteConfigRepository: RemoteConfigRepositoryImpl, + ): RemoteConfigRepository } From 12e5b5b005ed8dcfc2b9a75b780cc3535a8e582a Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 26 Mar 2025 20:11:02 +0900 Subject: [PATCH 168/210] =?UTF-8?q?[FEAT/#195]=20MissionViewModel=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=9B=90=EA=B2=A9=20=EB=AF=B8=EC=85=98=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EB=A1=9C=EB=93=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/mission/MissionViewModel.kt | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index 3e127626..21c1d5fa 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -11,7 +11,9 @@ import com.yapp.common.navigation.destination.FortuneDestination import com.yapp.common.navigation.destination.HomeDestination import com.yapp.common.navigation.destination.MissionDestination import com.yapp.datastore.UserPreferences +import com.yapp.domain.model.MissionType import com.yapp.domain.repository.FortuneRepository +import com.yapp.domain.usecase.GetMissionTypeUseCase import com.yapp.media.haptic.HapticFeedbackManager import com.yapp.media.haptic.HapticType import com.yapp.ui.base.BaseViewModel @@ -21,7 +23,6 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject -import kotlin.random.Random @HiltViewModel class MissionViewModel @Inject constructor( @@ -29,18 +30,26 @@ class MissionViewModel @Inject constructor( private val hapticFeedbackManager: HapticFeedbackManager, private val fortuneRepository: FortuneRepository, private val userPreferences: UserPreferences, + private val getMissionTypeUseCase: GetMissionTypeUseCase, private val app: Application, savedStateHandle: SavedStateHandle, ) : BaseViewModel( - MissionContract.State( - missionType = if (Random.nextBoolean()) MissionContract.MissionType.Shake else MissionContract.MissionType.Click, - ), + MissionContract.State(), ) { init { val notificationId = savedStateHandle.get("notificationId")?.toLong() if (notificationId != null) { sendAlarmDismissIntent(notificationId) } + + loadRemoteMissionType() + } + + private fun loadRemoteMissionType() { + viewModelScope.launch { + val missionType = getMissionTypeUseCase.execute() + updateState { copy(missionType = missionType) } + } } fun processAction(action: MissionContract.Action) { @@ -69,7 +78,7 @@ class MissionViewModel @Inject constructor( private fun handleShake() = viewModelScope.launch { if (currentState.showOverlay) updateState { copy(showOverlay = false) } if (currentState.showOverlayText) updateState { copy(showOverlayText = false) } - if (currentState.missionType !is MissionContract.MissionType.Shake) return@launch + if (currentState.missionType !is MissionType.Shake) return@launch val currentCount = currentState.shakeCount if (currentCount < 9) { @@ -98,7 +107,7 @@ class MissionViewModel @Inject constructor( } private fun handleClick() = viewModelScope.launch { - if (currentState.missionType !is MissionContract.MissionType.Click) return@launch + if (currentState.missionType !is MissionType.Click) return@launch val currentCount = currentState.clickCount if (currentCount < 9) { From 8d41b4bef56ba5ab347b263ebbbf2409f7c2e895 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 26 Mar 2025 20:11:09 +0900 Subject: [PATCH 169/210] =?UTF-8?q?REFAC:=20MissionContract=EC=97=90?= =?UTF-8?q?=EC=84=9C=20MissionType=EC=9D=84=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=20=EB=AA=A8=EB=8D=B8=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/mission/MissionContract.kt | 7 ++---- .../com/yapp/mission/MissionProgressScreen.kt | 23 ++++++++++--------- .../java/com/yapp/mission/MissionScreen.kt | 9 ++++---- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt index 56dad24c..720beabd 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt @@ -1,5 +1,7 @@ package com.yapp.mission +import com.yapp.domain.model.MissionType + sealed class MissionContract { data class State( @@ -30,11 +32,6 @@ sealed class MissionContract { object RetryPostFortune : Action() } - sealed class MissionType { - data object Shake : MissionType() - data object Click : MissionType() - } - sealed class SideEffect : com.yapp.ui.base.SideEffect { data class Navigate( val route: String, diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt index 61759020..3248fe52 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt @@ -41,6 +41,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.analytics.AnalyticsEvent import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.domain.model.MissionType import com.yapp.mission.component.FlipCard import com.yapp.mission.component.MissionProgressBar import com.yapp.ui.component.dialog.OrbitDialog @@ -141,8 +142,8 @@ fun MissionProgressScreen( Spacer(modifier = Modifier.heightForScreenPercentage(0.0246f)) MissionProgressBar( currentProgress = when (state.missionType) { - is MissionContract.MissionType.Shake -> state.shakeCount - is MissionContract.MissionType.Click -> state.clickCount + is MissionType.Shake -> state.shakeCount + is MissionType.Click -> state.clickCount }, totalProgress = 10, modifier = Modifier @@ -153,7 +154,7 @@ fun MissionProgressScreen( ) Spacer(modifier = Modifier.heightForScreenPercentage(0.06f)) Text( - text = if (state.missionType is MissionContract.MissionType.Shake) "10회를 흔들어야 운세를 받아요" else "10회를 눌러야 운세를 받아요", + text = if (state.missionType is MissionType.Shake) "10회를 흔들어야 운세를 받아요" else "10회를 눌러야 운세를 받아요", color = OrbitTheme.colors.white, style = OrbitTheme.typography.heading2SemiBold, modifier = Modifier.alpha(if (state.showOverlay) 0f else 1f), @@ -161,21 +162,21 @@ fun MissionProgressScreen( Spacer(modifier = Modifier.heightForScreenPercentage(0.005f)) Text( text = when (state.missionType) { - is MissionContract.MissionType.Shake -> state.shakeCount.toString() - is MissionContract.MissionType.Click -> state.clickCount.toString() + is MissionType.Shake -> state.shakeCount.toString() + is MissionType.Click -> state.clickCount.toString() }, color = OrbitTheme.colors.white, style = OrbitTheme.typography.displaySemiBold, modifier = Modifier.alpha(if (state.showOverlay) 0f else 1f), ) - Spacer(modifier = Modifier.heightForScreenPercentage(if (state.missionType is MissionContract.MissionType.Shake) 0.0665f else 0.1f)) - if (state.missionType is MissionContract.MissionType.Shake) { + Spacer(modifier = Modifier.heightForScreenPercentage(if (state.missionType is MissionType.Shake) 0.0665f else 0.1f)) + if (state.missionType is MissionType.Shake) { FlipCard( state = state, eventDispatcher = eventDispatcher, ) - } else if (state.missionType is MissionContract.MissionType.Click) { + } else if (state.missionType is MissionType.Click) { Crossfade( targetState = state.showFinalAnimation, animationSpec = tween(durationMillis = 500), @@ -230,7 +231,7 @@ fun MissionProgressScreen( ) + fadeIn(animationSpec = tween(durationMillis = 300)), ) { Text( - text = if (state.missionType is MissionContract.MissionType.Shake) "흔들기 시작!" else "누르기 시작!", + text = if (state.missionType is MissionType.Shake) "흔들기 시작!" else "누르기 시작!", color = OrbitTheme.colors.white, style = OrbitTheme.typography.title1Bold, ) @@ -250,8 +251,8 @@ fun MissionProgressScreen( type = "mission_fail", properties = mapOf( AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to when (state.missionType) { - is MissionContract.MissionType.Shake -> "shake" - is MissionContract.MissionType.Click -> "click" + is MissionType.Shake -> "shake" + is MissionType.Click -> "click" }, ), ), diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt index dee5420d..965acbd1 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt @@ -29,6 +29,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.analytics.AnalyticsEvent import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.domain.model.MissionType import com.yapp.ui.component.button.OrbitButton import com.yapp.ui.component.dialog.OrbitDialog import com.yapp.ui.utils.heightForScreenPercentage @@ -83,9 +84,9 @@ fun MissionScreen( Spacer(modifier = Modifier.heightForScreenPercentage(0.110f)) MissionTag(label = "기상미션") Spacer(modifier = Modifier.heightForScreenPercentage(0.0418f)) - MissionLabel(label = if (state.missionType is MissionContract.MissionType.Shake) "10회를 흔들어" else "10회를 눌러서", style = OrbitTheme.typography.headline2Medium) + MissionLabel(label = if (state.missionType is MissionType.Shake) "10회를 흔들어" else "10회를 눌러서", style = OrbitTheme.typography.headline2Medium) Spacer(modifier = Modifier.heightForScreenPercentage(0.01f)) - MissionLabel(label = if (state.missionType is MissionContract.MissionType.Shake) "부적을 뒤집어줘" else "편지를 열어줘", style = OrbitTheme.typography.title2Bold) + MissionLabel(label = if (state.missionType is MissionType.Shake) "부적을 뒤집어줘" else "편지를 열어줘", style = OrbitTheme.typography.title2Bold) } Column( modifier = Modifier @@ -94,7 +95,7 @@ fun MissionScreen( ) { Image( painter = painterResource( - if (state.missionType is MissionContract.MissionType.Shake) { + if (state.missionType is MissionType.Shake) { core.designsystem.R.drawable.img_mission_main } else { core.designsystem.R.drawable.ic_mission_main_letter @@ -103,7 +104,7 @@ fun MissionScreen( contentDescription = "", modifier = Modifier .fillMaxWidth() - .scale(if (state.missionType is MissionContract.MissionType.Shake) 1.1f else 1.0f), + .scale(if (state.missionType is MissionType.Shake) 1.1f else 1.0f), ) } Column( From 1caddfd26f17e4f277b3b7f7405147f8de099d1f Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 27 Mar 2025 00:26:00 +0900 Subject: [PATCH 170/210] =?UTF-8?q?[CHORE/#202]=20Firebase=20Analytics,=20?= =?UTF-8?q?Crashlytics=20=EC=9D=98=EC=A1=B4=EC=84=B1=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 +++ build.gradle.kts | 1 + gradle/libs.versions.toml | 3 +++ 3 files changed, 7 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a724d82f..cb012cde 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,6 +3,7 @@ plugins { id("orbit.android.compose") alias(libs.plugins.google.service) alias(libs.plugins.firebase.app.distribution) + alias(libs.plugins.firebase.crashlytics) } android { @@ -38,4 +39,6 @@ dependencies { implementation(projects.feature.mission) implementation(projects.feature.setting) implementation(projects.feature.navigator) + implementation(libs.firebase.analytics) + implementation(libs.firebase.crashlytics) } diff --git a/build.gradle.kts b/build.gradle.kts index 693d3170..46e42947 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,6 +11,7 @@ plugins { alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.google.service) apply false alias(libs.plugins.firebase.app.distribution) apply false + alias(libs.plugins.firebase.crashlytics) apply false // alias(libs.plugins.sentry) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1d5c5386..cfabc682 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -60,6 +60,7 @@ gson = "2.11.0" google-service = "4.4.2" firebase-bom = "33.1.1" firebase-app-distribution = "5.1.0" +firebase-crashlytics = "3.0.3" ## Test junit = "4.13.2" @@ -152,6 +153,7 @@ gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } # Google Libraries firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase-bom" } firebase-analytics = { group = "com.google.firebase", name = "firebase-analytics-ktx" } +firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics-ktx" } firebase-config = { group = "com.google.firebase", name = "firebase-config-ktx" } ## Logging @@ -190,4 +192,5 @@ android-test = { id = "com.android.test", version.ref = "android-gradle-plugin" compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } google-service = { id = "com.google.gms.google-services", version.ref = "google-service" } firebase-app-distribution = { id = "com.google.firebase.appdistribution", version.ref = "firebase-app-distribution" } +firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase-crashlytics" } #sentry = { id = "io.sentry.android.gradle", version.ref = "sentry" } From d39a43e675ec955a65b3836ae39f518bf013b59c Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 27 Mar 2025 00:53:15 +0900 Subject: [PATCH 171/210] =?UTF-8?q?[REFACTOR/#205]=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9D=84=20=ED=95=98=EB=93=9C=EC=BD=94?= =?UTF-8?q?=EB=94=A9=EB=90=9C=20=EA=B0=92=EC=9D=B4=20=EC=95=84=EB=8B=8C=20?= =?UTF-8?q?=EB=8F=99=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/setting/SettingScreen.kt | 2 +- .../com/yapp/setting/component/VersionCodeText.kt | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt index f5ab6414..ae24e57b 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt @@ -184,7 +184,7 @@ private fun SettingContent( .padding(horizontal = 24.dp), ) Spacer(modifier = Modifier.weight(1f)) - VersionCodeText(versionCode = "v1.0.0") + VersionCodeText() Spacer(modifier = Modifier.height(24.dp)) } } diff --git a/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt b/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt index dc57c7cd..f551bc0e 100644 --- a/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt +++ b/feature/setting/src/main/java/com/yapp/setting/component/VersionCodeText.kt @@ -1,16 +1,25 @@ package com.yapp.setting.component +import android.content.pm.PackageManager import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextAlign import com.yapp.designsystem.theme.OrbitTheme @Composable -fun VersionCodeText(versionCode: String) { +fun VersionCodeText() { + val context = LocalContext.current + val versionName = try { + context.packageManager.getPackageInfo(context.packageName, 0).versionName + } catch (e: PackageManager.NameNotFoundException) { + "1.0.0" + } + Text( - text = versionCode, + text = "v$versionName", modifier = Modifier.fillMaxWidth(), style = OrbitTheme.typography.body1Regular, color = OrbitTheme.colors.gray_300, From 1d706a3a5d76960dcb3a5c6c143a8c2c9e27b1c1 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 27 Mar 2025 01:13:54 +0900 Subject: [PATCH 172/210] [RELEASE] v1.0.1 --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cb012cde..9008396d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -10,8 +10,8 @@ android { namespace = "com.yapp.orbit" defaultConfig { - versionCode = 2 - versionName = "1.0.0" + versionCode = 3 + versionName = "1.0.1" targetSdk = 34 } From 73e9c7c3a42456065729ac0a9d833fa8291a2b53 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 27 Mar 2025 14:51:31 +0900 Subject: [PATCH 173/210] =?UTF-8?q?[DOCS/#208]=20Dependency=20Graph=20?= =?UTF-8?q?=EC=B5=9C=EC=8B=A0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.dot.png | Bin 107224 -> 493346 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/project.dot.png b/project.dot.png index 33a0a59bb396d420a68ede484905f329948ac7e9..51f22f9dcb205d7891662943591fa93e02666906 100644 GIT binary patch literal 493346 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⪙SAi9|%b;s;ttl9ZEQ(%^_M~ce;|`s|&Mxu) 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

-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%0DujJhU{jNSrhCli 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 E1HECaRsaA1 From 36e89dbef63676e2557795ec950aa2f73ce5ab04 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 27 Mar 2025 14:53:36 +0900 Subject: [PATCH 174/210] =?UTF-8?q?[DOCS/#208]=20README.md=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..eb422992 --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +# 아침을 깨우는 새로운 알람! + +![store_graphic](https://github.com/user-attachments/assets/b583be67-47ba-4a02-a255-441757d11f7b) + + + solution + + +## 🚀 핵심 기능 + +### 메인 화면 + +https://github.com/user-attachments/assets/d41dbd9c-5fba-4ca2-aad5-6d6211a36108 + +- **알람 삭제**: 편집 모드로 전환하여 선택한 알람을 삭제하거나, 길게 눌러 개별 알람을 삭제할 수 있습니다. +- **알람 정렬 순서 변경**: 정렬 옵션을 변경하여 활성화된 알람을 우선적으로 표시할 수 있습니다. + +### 알람 설정/수정 + +https://github.com/user-attachments/assets/0f8083f5-3aba-439a-a124-2c6ffc81fde4 + +- **시간 설정**: 원하는 시간에 알람이 울리도록 설정할 수 있습니다. +- **반복 요일 설정**: 특정 요일에 반복되는 알람을 설정할 수 있으며, 공휴일에만 알람이 울리지 않도록 설정할 수도 있습니다. +- **알람 미루기 설정**: 알람 미루기 기능을 활성화하고, 몇 분 간격으로 몇 회까지 미룰 수 있는지 설정할 수 있습니다. +- **사운드 설정**: 진동, 소리 여부 및 음량을 조절할 수 있습니다. + +### 알람 끄기 - 미션 + +https://github.com/user-attachments/assets/3c1596e9-7cdc-4c8e-8327-aefedf48ffd5 + +- **알람 끄기**: 울리는 알람을 끌 수 있습니다. +- **알람 미루기**: 설정한 미루기 옵션에 따라 알람을 일정 시간 뒤로 미룰 수 있습니다. +- **미션 수행**: 당일 첫 알람 해제 시 미션을 수행하여 알람을 끌 수 있습니다. + +### 운세 + +![운세 확인](https://github.com/user-attachments/assets/d5de5237-e716-4a04-aa2f-00f8fbbc4e3c) + +- **행운의 편지**: 사용자에게 오늘의 종합 운세가 담긴 편지를 제공합니다. +- **세부 운세**: 학업/직장운, 재물운, 건강운, 애정운 등의 운세 정보를 제공합니다. +- **부적 제공**: 당일 첫 알람 해제 시 미션을 수행하면, 랜덤한 부적을 받을 수 있습니다. + +
+ +## 👨‍👦‍👦 팀원 + +||| +|:-:|:-:| +|Donghyeon Kim
[@DongChyeon](https://github.com/DongChyeon)|Moonsu Kang
[@MoonsuKang](https://github.com/MoonsuKang)| + +
+ +## 🛠️ 기술 스택 + +| 카테고리 | 스택 | +| --- | --- | +| Language | Kotlin | +| Architecture | Orbit-MVI | +| DI | Hilt | +| Networking | Retrofit, OkHttp, GSON | +| Asynchronous | Coroutine, Flow | +| JetPack | AAC, ViewModel, Navigation, Repository | +| Local DB | DataStore, Room | +| Image | Coil | + +
+ +## 📊 모듈 의존성 그래프 + +![Project Dependency Graph](project.dot.png) From 39cd9c0512f1b24a54fe0b2c8c2c0150cd6cf75e Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 16 Apr 2025 20:20:58 +0900 Subject: [PATCH 175/210] =?UTF-8?q?[ADD/#211]=20isMissionTypeLoading=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mission/src/main/java/com/yapp/mission/MissionContract.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt index 720beabd..777951b0 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt @@ -6,6 +6,7 @@ sealed class MissionContract { data class State( val missionType: MissionType = MissionType.Click, + val isMissionTypeLoading: Boolean = true, val showOverlayText: Boolean = false, val showOverlay: Boolean = true, val missionProgress: Int = 0, From 78a99c5fe17e66cc91a1ad608bef80376455c7ef Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 16 Apr 2025 20:22:32 +0900 Subject: [PATCH 176/210] =?UTF-8?q?[ADD/#211]=20missionType=20fetch=20?= =?UTF-8?q?=ED=9B=84=20=EC=83=81=ED=83=9C=20isMissionTypeLoading=20=3D=20f?= =?UTF-8?q?alse=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 --- .../src/main/java/com/yapp/mission/MissionViewModel.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index 21c1d5fa..7d698e40 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -48,7 +48,10 @@ class MissionViewModel @Inject constructor( private fun loadRemoteMissionType() { viewModelScope.launch { val missionType = getMissionTypeUseCase.execute() - updateState { copy(missionType = missionType) } + updateState { copy( + missionType = missionType, + isMissionTypeLoading = false, + ) } } } From cf797cdca0fb22d85a907c0aaa39ee4c421433e9 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 16 Apr 2025 20:24:27 +0900 Subject: [PATCH 177/210] =?UTF-8?q?[ADD/#211]=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EB=A1=9C=EB=94=A9=20=EC=A4=91=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=A1=9C=EB=94=A9?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/mission/MissionScreen.kt | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt index 965acbd1..523fd779 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -32,6 +33,7 @@ import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.MissionType import com.yapp.ui.component.button.OrbitButton import com.yapp.ui.component.dialog.OrbitDialog +import com.yapp.ui.component.lottie.LottieAnimation import com.yapp.ui.utils.heightForScreenPercentage @Composable @@ -65,6 +67,10 @@ fun MissionScreen( Box( modifier = Modifier.fillMaxSize(), ) { + if(state.isMissionTypeLoading) { + MissionLoadingScreen() + return + } Image( painter = painterResource(id = core.designsystem.R.drawable.img_mission_main_background), contentDescription = null, @@ -196,7 +202,21 @@ fun MissionLabel( } @Composable -@Preview +fun MissionLoadingScreen() { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + LottieAnimation( + modifier = Modifier + .size(70.dp), + resId = core.designsystem.R.raw.star_loading, + ) + } +} + +@Composable +@Preview(showBackground = true) fun MissionRoutePreview() { MissionScreen( stateProvider = { MissionContract.State() }, From c21fa4b7342356399f2821d4f50637cacbacbb72 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 16 Apr 2025 20:39:12 +0900 Subject: [PATCH 178/210] [REFACTOR/#211] Ktlint Formatting --- .../src/main/java/com/yapp/mission/MissionScreen.kt | 2 +- .../src/main/java/com/yapp/mission/MissionViewModel.kt | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt index 523fd779..681df5c7 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt @@ -67,7 +67,7 @@ fun MissionScreen( Box( modifier = Modifier.fillMaxSize(), ) { - if(state.isMissionTypeLoading) { + if (state.isMissionTypeLoading) { MissionLoadingScreen() return } diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index 7d698e40..74ff68bc 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -48,10 +48,12 @@ class MissionViewModel @Inject constructor( private fun loadRemoteMissionType() { viewModelScope.launch { val missionType = getMissionTypeUseCase.execute() - updateState { copy( - missionType = missionType, - isMissionTypeLoading = false, - ) } + updateState { + copy( + missionType = missionType, + isMissionTypeLoading = false, + ) + } } } From 9609fa662bb0950558fd365e1e1bbb73dc10dd93 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sat, 19 Apr 2025 13:55:14 +0900 Subject: [PATCH 179/210] =?UTF-8?q?[CHORE/#210]=20Debug,=20Release=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=95=A0?= =?UTF-8?q?=EB=93=9C=EB=AA=B9=20=ED=99=98=EA=B2=BD=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 19 +++++++++++++++++ app/src/main/AndroidManifest.xml | 4 ++++ feature/alarm-interaction/build.gradle.kts | 24 ++++++++++++++++++++++ gradle/libs.versions.toml | 3 +++ 4 files changed, 50 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9008396d..9ee611c0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,5 @@ +import java.util.Properties + plugins { id("orbit.android.application") id("orbit.android.compose") @@ -16,8 +18,24 @@ android { } buildTypes { + val localProperties = Properties() + localProperties.load( + project.rootProject.file("local.properties").bufferedReader(), + ) + debug { + resValue( + "string", + "admob_app_id", + localProperties["admobAppIdDebug"] as String, + ) + } release { signingConfig = signingConfigs.getByName("debug") + resValue( + "string", + "admob_app_id", + localProperties["admobAppIdRelease"] as String, + ) } } } @@ -41,4 +59,5 @@ dependencies { implementation(projects.feature.navigator) implementation(libs.firebase.analytics) implementation(libs.firebase.crashlytics) + implementation(libs.play.services.ads) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c123d210..51ec3303 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,6 +25,10 @@ android:usesCleartextTraffic="true" tools:targetApi="31"> + + Date: Sat, 19 Apr 2025 13:55:43 +0900 Subject: [PATCH 180/210] =?UTF-8?q?[FEAT/#210]=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=ED=95=B4=EC=A0=9C=20=ED=99=94=EB=A9=B4=20=EC=83=81=EB=8B=A8?= =?UTF-8?q?=EC=97=90=20=EC=95=A0=EB=93=9C=EB=AA=B9=20=EB=B0=B0=EB=84=88=20?= =?UTF-8?q?=EA=B4=91=EA=B3=A0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/orbit/OrbitApplication.kt | 2 + .../src/main/AndroidManifest.xml | 4 +- .../interaction/action/AlarmActionScreen.kt | 125 +++++++++++------- 3 files changed, 82 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/yapp/orbit/OrbitApplication.kt b/app/src/main/java/com/yapp/orbit/OrbitApplication.kt index c27eadba..7391cf6e 100644 --- a/app/src/main/java/com/yapp/orbit/OrbitApplication.kt +++ b/app/src/main/java/com/yapp/orbit/OrbitApplication.kt @@ -1,11 +1,13 @@ package com.yapp.orbit import android.app.Application +import com.google.android.gms.ads.MobileAds import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp class OrbitApplication : Application() { override fun onCreate() { super.onCreate() + MobileAds.initialize(this) } } diff --git a/feature/alarm-interaction/src/main/AndroidManifest.xml b/feature/alarm-interaction/src/main/AndroidManifest.xml index e1000761..19d2638e 100644 --- a/feature/alarm-interaction/src/main/AndroidManifest.xml +++ b/feature/alarm-interaction/src/main/AndroidManifest.xml @@ -1,4 +1,4 @@ - - + + diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt index f77da04c..10189f25 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt @@ -7,9 +7,11 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.Icon @@ -26,8 +28,12 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.google.android.gms.ads.AdRequest +import com.google.android.gms.ads.AdSize +import com.google.android.gms.ads.AdView import com.yapp.common.navigation.OrbitNavigator import com.yapp.designsystem.theme.OrbitTheme import com.yapp.ui.component.button.OrbitButton @@ -121,61 +127,65 @@ private fun AlarmActionContent( onSnoozeClick: () -> Unit, onDismissClick: () -> Unit, ) { - Column( - modifier = Modifier - .fillMaxSize() - .background( - color = Color(0xFF496381), - ), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer( - modifier = Modifier.heightForScreenPercentage( - 0.17f, - ), - ) + Box(modifier = Modifier.statusBarsPadding()) { + Column( + modifier = Modifier + .fillMaxSize() + .background( + color = Color(0xFF496381), + ), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Spacer( + modifier = Modifier.heightForScreenPercentage( + 0.17f, + ), + ) - AlarmTime( - isAm = isAm, - hour = hour, - minute = minute, - todayDate = todayDate, - ) + AlarmTime( + isAm = isAm, + hour = hour, + minute = minute, + todayDate = todayDate, + ) - Spacer(modifier = Modifier.height(102.dp)) + Spacer(modifier = Modifier.height(102.dp)) - Icon( - painter = painterResource(id = core.designsystem.R.drawable.ic_alarm_action_character), - tint = Color(0xFF07203E), - contentDescription = "Alarm Action Character", - ) + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_alarm_action_character), + tint = Color(0xFF07203E), + contentDescription = "Alarm Action Character", + ) + + Spacer(modifier = Modifier.height(56.dp)) - Spacer(modifier = Modifier.height(56.dp)) + if (snoozeEnabled && snoozeCount != 0) { + AlarmSnoozeButton( + snoozeInterval = snoozeInterval, + snoozeCount = snoozeCount, + onSnoozeClick = onSnoozeClick, + ) + } else { + Spacer(modifier = Modifier.height(54.dp)) + } + + Spacer(modifier = Modifier.weight(1f)) - if (snoozeEnabled && snoozeCount != 0) { - AlarmSnoozeButton( - snoozeInterval = snoozeInterval, - snoozeCount = snoozeCount, - onSnoozeClick = onSnoozeClick, + OrbitButton( + label = stringResource(id = R.string.alarm_off_btn), + enabled = true, + modifier = Modifier + .padding( + start = 40.dp, + end = 40.dp, + bottom = 48.dp, + ) + .height(62.dp), + onClick = onDismissClick, ) - } else { - Spacer(modifier = Modifier.height(54.dp)) } - Spacer(modifier = Modifier.weight(1f)) - - OrbitButton( - label = stringResource(id = R.string.alarm_off_btn), - enabled = true, - modifier = Modifier - .padding( - start = 40.dp, - end = 40.dp, - bottom = 48.dp, - ) - .height(62.dp), - onClick = onDismissClick, - ) + BannersAds() } } @@ -281,6 +291,27 @@ private fun AlarmSnoozeButton( } } +@Composable +private fun BannersAds( + modifier: Modifier = Modifier, +) { + val adUnitId = stringResource(id = R.string.admob_ad_unit_id) + + AndroidView( + modifier = modifier.fillMaxWidth(), + factory = { context -> + AdView(context).apply { + setAdSize(AdSize.BANNER) + this.adUnitId = adUnitId + loadAd(AdRequest.Builder().build()) + } + }, + update = { adView -> + adView.loadAd(AdRequest.Builder().build()) + }, + ) +} + @Preview @Composable internal fun AlarmActionScreenPreview() { From 1e33cc5beb9ef001e16b0f48cd5cd2cc8273859f Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sat, 19 Apr 2025 15:35:52 +0900 Subject: [PATCH 181/210] =?UTF-8?q?[CHORE/#210]=20CI/CD=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A6=BD=ED=8A=B8=EC=97=90=20=EC=95=A0=EB=93=9C?= =?UTF-8?q?=EB=AA=B9=20=EA=B4=80=EB=A0=A8=20=ED=82=A4=20=EC=84=A4=EC=A0=95?= =?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 --- .github/workflows/android_cd.yml | 11 ++++++++++- .github/workflows/android_ci.yml | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.github/workflows/android_cd.yml b/.github/workflows/android_cd.yml index 60091859..27bc1a2b 100644 --- a/.github/workflows/android_cd.yml +++ b/.github/workflows/android_cd.yml @@ -56,8 +56,17 @@ jobs: env: BASE_URL: ${{ secrets.BASE_URL }} AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} + ADMOB_APP_ID_DEBUG: ${{ secrets.ADMOB_APP_ID_DEBUG }} + ADMOB_APP_ID_RELEASE: ${{ secrets.ADMOB_APP_ID_RELEASE }} + ADMOB_AD_UNIT_ID_DEBUG: ${{ secrets.ADMOB_AD_UNIT_ID_DEBUG }} + ADMOB_AD_UNIT_ID_RELEASE: ${{ secrets.ADMOB_AD_UNIT_ID_RELEASE }} run: | - echo -e "baseUrl=$BASE_URL\namplitudeApiKey=$AMPLITUDE_API_KEY" >> local.properties + echo -e "baseUrl=$BASE_URL" > local.properties + echo -e "amplitudeApiKey=$AMPLITUDE_API_KEY" >> local.properties + echo -e "admobAppIdDebug=$ADMOB_APP_ID_DEBUG" >> local.properties + echo -e "admobAppIdRelease=$ADMOB_APP_ID_RELEASE" >> local.properties + echo -e "admobAdUnitIdDebug=$ADMOB_AD_UNIT_ID_DEBUG" >> local.properties + echo -e "admobAdUnitIdRelease=$ADMOB_AD_UNIT_ID_RELEASE" >> local.properties # 7. Debug Local Properties Check - name: Debug Local Properties diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml index 9b337bce..f7237422 100644 --- a/.github/workflows/android_ci.yml +++ b/.github/workflows/android_ci.yml @@ -57,8 +57,17 @@ jobs: env: BASE_URL: ${{ secrets.BASE_URL }} AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} + ADMOB_APP_ID_DEBUG: ${{ secrets.ADMOB_APP_ID_DEBUG }} + ADMOB_APP_ID_RELEASE: ${{ secrets.ADMOB_APP_ID_RELEASE }} + ADMOB_AD_UNIT_ID_DEBUG: ${{ secrets.ADMOB_AD_UNIT_ID_DEBUG }} + ADMOB_AD_UNIT_ID_RELEASE: ${{ secrets.ADMOB_AD_UNIT_ID_RELEASE }} run: | - echo -e "baseUrl=$BASE_URL\namplitudeApiKey=$AMPLITUDE_API_KEY" >> local.properties + echo -e "baseUrl=$BASE_URL" > local.properties + echo -e "amplitudeApiKey=$AMPLITUDE_API_KEY" >> local.properties + echo -e "admobAppIdDebug=$ADMOB_APP_ID_DEBUG" >> local.properties + echo -e "admobAppIdRelease=$ADMOB_APP_ID_RELEASE" >> local.properties + echo -e "admobAdUnitIdDebug=$ADMOB_AD_UNIT_ID_DEBUG" >> local.properties + echo -e "admobAdUnitIdRelease=$ADMOB_AD_UNIT_ID_RELEASE" >> local.properties # Debug Local Properties Check - name: Debug Local Properties From 4553b2b12d77304eee882760ecfd68748769997b Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sat, 19 Apr 2025 16:05:50 +0900 Subject: [PATCH 182/210] =?UTF-8?q?[REFACTOR/#210]=20=EA=B4=91=EA=B3=A0=20?= =?UTF-8?q?=EB=B0=B0=EB=84=88=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20cor?= =?UTF-8?q?e:ui=20=EB=AA=A8=EB=93=88=EB=A1=9C=20=EC=9D=B4=EC=A0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/ui/build.gradle.kts | 24 +++++++++++++ core/ui/src/main/AndroidManifest.xml | 3 +- .../com/yapp/ui/component/banner/AdsBanner.kt | 34 +++++++++++++++++++ feature/alarm-interaction/build.gradle.kts | 23 ------------- .../src/main/AndroidManifest.xml | 3 +- .../interaction/action/AlarmActionScreen.kt | 29 ++-------------- 6 files changed, 62 insertions(+), 54 deletions(-) create mode 100644 core/ui/src/main/java/com/yapp/ui/component/banner/AdsBanner.kt diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index 8944d6aa..0e3a711b 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -1,4 +1,5 @@ import com.yapp.convention.setNamespace +import java.util.Properties plugins { id("orbit.android.library") @@ -7,6 +8,28 @@ plugins { android { setNamespace("core.ui") + + buildTypes { + val localProperties = Properties() + localProperties.load( + project.rootProject.file("local.properties").bufferedReader(), + ) + + debug { + resValue( + "string", + "admob_ad_unit_id", + localProperties["admobAdUnitIdDebug"] as String, + ) + } + release { + resValue( + "string", + "admob_ad_unit_id", + localProperties["admobAdUnitIdRelease"] as String, + ) + } + } } dependencies { @@ -17,4 +40,5 @@ dependencies { implementation(libs.orbit.compose) implementation(libs.orbit.viewmodel) implementation(libs.lottie.compose) + implementation(libs.play.services.ads) } diff --git a/core/ui/src/main/AndroidManifest.xml b/core/ui/src/main/AndroidManifest.xml index 8bdb7e14..76073216 100644 --- a/core/ui/src/main/AndroidManifest.xml +++ b/core/ui/src/main/AndroidManifest.xml @@ -1,4 +1,3 @@ - - + diff --git a/core/ui/src/main/java/com/yapp/ui/component/banner/AdsBanner.kt b/core/ui/src/main/java/com/yapp/ui/component/banner/AdsBanner.kt new file mode 100644 index 00000000..bd3a8e8b --- /dev/null +++ b/core/ui/src/main/java/com/yapp/ui/component/banner/AdsBanner.kt @@ -0,0 +1,34 @@ +package com.yapp.ui.component.banner + +import android.annotation.SuppressLint +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.viewinterop.AndroidView +import com.google.android.gms.ads.AdRequest +import com.google.android.gms.ads.AdSize +import com.google.android.gms.ads.AdView +import core.ui.R + +@SuppressLint("MissingPermission") +@Composable +fun AdsBanner( + modifier: Modifier = Modifier, +) { + val adUnitId = stringResource(id = R.string.admob_ad_unit_id) + + AndroidView( + modifier = modifier.fillMaxWidth(), + factory = { context -> + AdView(context).apply { + setAdSize(AdSize.BANNER) + this.adUnitId = adUnitId + loadAd(AdRequest.Builder().build()) + } + }, + update = { adView -> + adView.loadAd(AdRequest.Builder().build()) + }, + ) +} diff --git a/feature/alarm-interaction/build.gradle.kts b/feature/alarm-interaction/build.gradle.kts index 9b2cb281..50a1074e 100644 --- a/feature/alarm-interaction/build.gradle.kts +++ b/feature/alarm-interaction/build.gradle.kts @@ -1,5 +1,4 @@ import com.yapp.convention.setNamespace -import java.util.Properties plugins { id("orbit.android.feature") @@ -7,28 +6,6 @@ plugins { android { setNamespace("feature.alarm.interaction") - - buildTypes { - val localProperties = Properties() - localProperties.load( - project.rootProject.file("local.properties").bufferedReader(), - ) - - debug { - resValue( - "string", - "admob_ad_unit_id", - localProperties["admobAdUnitIdDebug"] as String, - ) - } - release { - resValue( - "string", - "admob_ad_unit_id", - localProperties["admobAdUnitIdRelease"] as String, - ) - } - } } dependencies { diff --git a/feature/alarm-interaction/src/main/AndroidManifest.xml b/feature/alarm-interaction/src/main/AndroidManifest.xml index 19d2638e..76073216 100644 --- a/feature/alarm-interaction/src/main/AndroidManifest.xml +++ b/feature/alarm-interaction/src/main/AndroidManifest.xml @@ -1,4 +1,3 @@ - - + diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt index 10189f25..de4d1f16 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -28,14 +27,11 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.compose.ui.viewinterop.AndroidView import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.google.android.gms.ads.AdRequest -import com.google.android.gms.ads.AdSize -import com.google.android.gms.ads.AdView import com.yapp.common.navigation.OrbitNavigator import com.yapp.designsystem.theme.OrbitTheme +import com.yapp.ui.component.banner.AdsBanner import com.yapp.ui.component.button.OrbitButton import com.yapp.ui.component.lottie.LottieAnimation import com.yapp.ui.utils.heightForScreenPercentage @@ -185,7 +181,7 @@ private fun AlarmActionContent( ) } - BannersAds() + AdsBanner() } } @@ -291,27 +287,6 @@ private fun AlarmSnoozeButton( } } -@Composable -private fun BannersAds( - modifier: Modifier = Modifier, -) { - val adUnitId = stringResource(id = R.string.admob_ad_unit_id) - - AndroidView( - modifier = modifier.fillMaxWidth(), - factory = { context -> - AdView(context).apply { - setAdSize(AdSize.BANNER) - this.adUnitId = adUnitId - loadAd(AdRequest.Builder().build()) - } - }, - update = { adView -> - adView.loadAd(AdRequest.Builder().build()) - }, - ) -} - @Preview @Composable internal fun AlarmActionScreenPreview() { From 66757a858977ec32a0d14205291db62a5ee85f81 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sat, 19 Apr 2025 16:16:00 +0900 Subject: [PATCH 183/210] =?UTF-8?q?[CHORE/#210]=20Convention=20plugin?= =?UTF-8?q?=EC=9D=84=20=ED=86=B5=ED=95=B4=20resValue=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 | 18 --------------- .../java/com/yapp/convention/Extension.kt | 18 +++++++++++++++ .../java/com/yapp/convention/KotlinAndroid.kt | 1 + core/ui/build.gradle.kts | 23 ------------------- 4 files changed, 19 insertions(+), 41 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9ee611c0..0a1be78b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,5 +1,3 @@ -import java.util.Properties - plugins { id("orbit.android.application") id("orbit.android.compose") @@ -18,24 +16,8 @@ android { } buildTypes { - val localProperties = Properties() - localProperties.load( - project.rootProject.file("local.properties").bufferedReader(), - ) - debug { - resValue( - "string", - "admob_app_id", - localProperties["admobAppIdDebug"] as String, - ) - } release { signingConfig = signingConfigs.getByName("debug") - resValue( - "string", - "admob_app_id", - localProperties["admobAppIdRelease"] as String, - ) } } } diff --git a/build-logic/src/main/java/com/yapp/convention/Extension.kt b/build-logic/src/main/java/com/yapp/convention/Extension.kt index 4f6cf1ff..3ebad57f 100644 --- a/build-logic/src/main/java/com/yapp/convention/Extension.kt +++ b/build-logic/src/main/java/com/yapp/convention/Extension.kt @@ -43,6 +43,24 @@ internal fun CommonExtension<*, *, *, *, *, *>.addBuildConfigFields(project: Pro } } +internal fun CommonExtension<*, *, *, *, *, *>.addResValues(project: Project) { + val admobAppIdDebug = project.getLocalProperty("admobAppIdDebug", "") + val admobAppIdRelease = project.getLocalProperty("admobAppIdRelease", "") + val admobAdUnitIdDebug = project.getLocalProperty("admobAdUnitIdDebug", "") + val admobAdUnitIdRelease = project.getLocalProperty("admobAdUnitIdRelease", "") + + buildTypes { + getByName("debug") { + resValue("string", "admob_app_id", admobAppIdDebug) + resValue("string", "admob_ad_unit_id", admobAdUnitIdDebug) + } + getByName("release") { + resValue("string", "admob_app_id", admobAppIdRelease) + resValue("string", "admob_ad_unit_id", admobAdUnitIdRelease) + } + } +} + internal fun Project.getLocalProperty(key: String, defaultValue: String? = null): String { val propertiesFile = rootProject.file("local.properties") if (propertiesFile.exists()) { diff --git a/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt b/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt index 8a658a2d..b842ac37 100644 --- a/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt +++ b/build-logic/src/main/java/com/yapp/convention/KotlinAndroid.kt @@ -41,6 +41,7 @@ internal fun Project.configureKotlinAndroid() { } addBuildConfigFields(project) + addResValues(project) } configureKotlin() diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index 0e3a711b..b4250dc6 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -1,5 +1,4 @@ import com.yapp.convention.setNamespace -import java.util.Properties plugins { id("orbit.android.library") @@ -8,28 +7,6 @@ plugins { android { setNamespace("core.ui") - - buildTypes { - val localProperties = Properties() - localProperties.load( - project.rootProject.file("local.properties").bufferedReader(), - ) - - debug { - resValue( - "string", - "admob_ad_unit_id", - localProperties["admobAdUnitIdDebug"] as String, - ) - } - release { - resValue( - "string", - "admob_ad_unit_id", - localProperties["admobAdUnitIdRelease"] as String, - ) - } - } } dependencies { From bde505489e3f357d61c1cc85155a4277811befea Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sun, 20 Apr 2025 02:50:52 +0900 Subject: [PATCH 184/210] [RELEASE] v1.0.2 --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0a1be78b..6f7a1ea4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -10,8 +10,8 @@ android { namespace = "com.yapp.orbit" defaultConfig { - versionCode = 3 - versionName = "1.0.1" + versionCode = 4 + versionName = "1.0.2" targetSdk = 34 } From fcae5c935b215f40973361c0837f7c279afd26d8 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 24 Apr 2025 14:41:16 +0900 Subject: [PATCH 185/210] =?UTF-8?q?[CHORE/#217]=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=9D=BC=20applicationI?= =?UTF-8?q?d=20=EB=B0=8F=20=EC=95=B1=20=EC=9D=B4=EB=A6=84=20=EB=B6=84?= =?UTF-8?q?=EA=B8=B0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 5 +++++ app/src/debug/res/values/strings.xml | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 app/src/debug/res/values/strings.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0a1be78b..8d3d577c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,6 +16,11 @@ android { } buildTypes { + debug { + applicationIdSuffix = ".dev" + isDebuggable = true + } + release { signingConfig = signingConfigs.getByName("debug") } diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml new file mode 100644 index 00000000..1ccceb99 --- /dev/null +++ b/app/src/debug/res/values/strings.xml @@ -0,0 +1,3 @@ + + 오르비 알람 DEV + From 66de8d473d4e17e9675fc89d97e163efe5e0a9bc Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 24 Apr 2025 14:42:51 +0900 Subject: [PATCH 186/210] =?UTF-8?q?[REFACTOR/#217]=20Uri.parse=EA=B0=80=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20toUri()=20=ED=99=95=EC=9E=A5=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/receivers/AlarmInteractionActivityReceiver.kt | 8 ++------ .../src/main/java/com/yapp/alarm/services/AlarmService.kt | 3 ++- .../src/main/java/com/yapp/setting/SettingScreen.kt | 4 ++-- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt index 88f7d9fd..24af89cf 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt @@ -3,9 +3,8 @@ package com.yapp.alarm.receivers import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.net.Uri -import android.util.Log import androidx.activity.ComponentActivity +import androidx.core.net.toUri import com.yapp.alarm.AlarmConstants import com.yapp.datastore.UserPreferences import dagger.hilt.android.AndroidEntryPoint @@ -24,7 +23,6 @@ class AlarmInteractionActivityReceiver(private val activity: ComponentActivity) lateinit var userPreferences: UserPreferences override fun onReceive(context: Context?, intent: Intent?) { - Log.d("AlarmInteractionActivityReceiver", "알람 수신, AlarmAlertActivity 종료") val isSnoozed = intent?.getBooleanExtra(AlarmConstants.EXTRA_IS_SNOOZED, false) ?: false if (intent?.action == AlarmConstants.ACTION_ALARM_INTERACTION_ACTIVITY_CLOSE) { @@ -35,12 +33,10 @@ class AlarmInteractionActivityReceiver(private val activity: ComponentActivity) val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) - Log.d("AlarmReceiver", "fortuneDate: $fortuneDate, todayDate: $todayDate") - if (fortuneDate != todayDate) { context?.let { val missionIntent = - Intent(Intent.ACTION_VIEW, Uri.parse("orbitapp://mission")).apply { + Intent(Intent.ACTION_VIEW, "orbitapp://mission".toUri()).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } it.startActivity(missionIntent) diff --git a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt index 24d5a821..c982fe7e 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/services/AlarmService.kt @@ -16,6 +16,7 @@ import android.os.Vibrator import android.os.VibratorManager import android.util.Log import androidx.core.app.NotificationCompat +import androidx.core.net.toUri import com.yapp.alarm.AlarmConstants import com.yapp.alarm.AlarmHelper import com.yapp.alarm.pendingIntent.interaction.createAlarmAlertPendingIntent @@ -221,7 +222,7 @@ class AlarmService : Service() { private fun startSound(soundUri: String, volume: Int) { val uri: Uri = if (soundUri.isNotEmpty()) { - Uri.parse(soundUri) + soundUri.toUri() } else { RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM) } diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt index ae24e57b..621d7904 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt @@ -1,7 +1,6 @@ package com.yapp.setting import android.content.Intent -import android.net.Uri import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -21,6 +20,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.designsystem.theme.OrbitTheme @@ -55,7 +55,7 @@ fun SettingRoute( val kakaoUrl = "http://pf.kakao.com/_ykqxjn" val kakaoSchemeUrl = "kakaoplus://plusfriend/home/_ykqxjn" - val kakaoIntent = Intent(Intent.ACTION_VIEW, Uri.parse(kakaoSchemeUrl)) + val kakaoIntent = Intent(Intent.ACTION_VIEW, kakaoSchemeUrl.toUri()) try { context.startActivity(kakaoIntent) // 카카오톡 앱으로 이동 From b508d69dc13f00481a034c51ea6301f17590705e Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 24 Apr 2025 14:51:01 +0900 Subject: [PATCH 187/210] =?UTF-8?q?[FIX/#217]=20=EB=94=A5=EB=A7=81?= =?UTF-8?q?=ED=81=AC=20=EC=8B=A4=ED=96=89=20=EC=8B=9C=20=EC=95=B1=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD(dev/release)=20=EB=AA=85=ED=99=95=ED=9E=88?= =?UTF-8?q?=20=EA=B5=AC=EB=B6=84=EB=90=98=EB=8F=84=EB=A1=9D=20setPackage?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pendingIntent/interaction/AlarmAlertPendingIntent.kt | 3 +++ .../interaction/AlarmDismissPendingIntent.kt | 8 +++++--- .../alarm/receivers/AlarmInteractionActivityReceiver.kt | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt index 0511f673..cdb80e2c 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmAlertPendingIntent.kt @@ -12,6 +12,7 @@ fun createAlarmAlertPendingIntent( alarm: Alarm, ): PendingIntent { val alarmAlertIntent = createAlarmAlertIntent( + context, alarm.id, alarm, ) @@ -24,6 +25,7 @@ fun createAlarmAlertPendingIntent( } private fun createAlarmAlertIntent( + context: Context, notificationId: Long, alarm: Alarm, ): Intent { @@ -31,5 +33,6 @@ private fun createAlarmAlertIntent( putExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, notificationId) putExtra(AlarmConstants.EXTRA_ALARM, alarm) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) + setPackage(context.packageName) } } diff --git a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt index 1fe42370..3bd687df 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/pendingIntent/interaction/AlarmDismissPendingIntent.kt @@ -5,7 +5,7 @@ import android.app.PendingIntent.FLAG_IMMUTABLE import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.content.Context import android.content.Intent -import android.net.Uri +import androidx.core.net.toUri import com.yapp.alarm.AlarmConstants import com.yapp.alarm.receivers.AlarmReceiver @@ -36,7 +36,7 @@ fun createNavigateToMissionPendingIntent( applicationContext: Context, notificationId: Long, ): PendingIntent { - val navigateToMissionIntent = createNavigateToMissionIntent(notificationId) + val navigateToMissionIntent = createNavigateToMissionIntent(applicationContext, notificationId) return PendingIntent.getActivity( applicationContext, notificationId.toInt(), @@ -46,9 +46,11 @@ fun createNavigateToMissionPendingIntent( } fun createNavigateToMissionIntent( + context: Context, notificationId: Long, ): Intent { - return Intent(Intent.ACTION_VIEW, Uri.parse("orbitapp://mission?notificationId=$notificationId")).apply { + return Intent(Intent.ACTION_VIEW, "orbitapp://mission?notificationId=$notificationId".toUri()).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + setPackage(context.packageName) } } diff --git a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt index 24af89cf..4b703bf9 100644 --- a/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt +++ b/core/alarm/src/main/java/com/yapp/alarm/receivers/AlarmInteractionActivityReceiver.kt @@ -38,6 +38,7 @@ class AlarmInteractionActivityReceiver(private val activity: ComponentActivity) val missionIntent = Intent(Intent.ACTION_VIEW, "orbitapp://mission".toUri()).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + setPackage(context.packageName) } it.startActivity(missionIntent) } From ca480f55c0d01088f96709e10b9c54fd77f71706 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 24 Apr 2025 15:00:47 +0900 Subject: [PATCH 188/210] =?UTF-8?q?[CHORE/#217]=20debug/release=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=ED=95=98=EC=97=AC=20google-services.json=20?= =?UTF-8?q?=EB=94=94=EC=BD=94=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/android_cd.yml | 40 ++++++++++++++++++-------------- .github/workflows/android_ci.yml | 12 +++++++--- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/.github/workflows/android_cd.yml b/.github/workflows/android_cd.yml index 27bc1a2b..f947cd17 100644 --- a/.github/workflows/android_cd.yml +++ b/.github/workflows/android_cd.yml @@ -45,13 +45,19 @@ jobs: - name: Install Firebase CLI run: curl -sL https://firebase.tools | bash - # 6. Decode google-services.json - - name: Decode google-services.json + # 6. Decode google-services.json for debug + - name: Decode google-services.json (debug) env: - FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET }} + FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_DEBUG }} + run: echo $FIREBASE_SECRET | base64 --decode > app/src/dev/google-services.json + + # 7. Decode google-services.json for release + - name: Decode google-services.json (release) + env: + FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_RELEASE }} run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json - # Add Local Properties + # 8. Add Local Properties - name: Add Local Properties env: BASE_URL: ${{ secrets.BASE_URL }} @@ -68,41 +74,41 @@ jobs: echo -e "admobAdUnitIdDebug=$ADMOB_AD_UNIT_ID_DEBUG" >> local.properties echo -e "admobAdUnitIdRelease=$ADMOB_AD_UNIT_ID_RELEASE" >> local.properties - # 7. Debug Local Properties Check - - name: Debug Local Properties - run: cat local.properties + # 9. Debug Local Properties Check + - name: Debug Local Properties + run: cat local.properties - # 8. Ktlint + # 10. Ktlint - name: Run Ktlint Check run: ./gradlew ktlintCheck --stacktrace - # 9. Debug APK Build + # 11. Debug APK Build - name: Build Debug APK run: ./gradlew assembleDebug --stacktrace - # 10. Release AAB Build + # 12. Release AAB Build - name: Build Release AAB run: ./gradlew bundleRelease --stacktrace - # 11. Release APK Build + # 13. Release APK Build - name: Build Release APK run: ./gradlew assembleRelease --stacktrace - # 12. AAB Artifact Upload + # 14. AAB Artifact Upload - name: Upload Release AAB uses: actions/upload-artifact@v4 with: name: release-aab path: app/build/outputs/bundle/release/app-release.aab - # 13. APK Artifact Upload + # 15. APK Artifact Upload - name: Upload Release APK uses: actions/upload-artifact@v4 with: name: release-apk path: app/build/outputs/apk/release/app-release.apk - # 14. Set up Firebase Service Account Credentials + # 16. Set up Firebase Service Account Credentials - name: Set up Firebase Service Account Credentials env: GOOGLE_APPLICATION_CREDENTIALS_JSON: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS_JSON }} @@ -113,7 +119,7 @@ jobs: export GOOGLE_APPLICATION_CREDENTIALS=$HOME/firebase-credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_APPLICATION_CREDENTIALS" - # 15. Firebase CLI 인증 확인 + # 17. Firebase CLI 인증 확인 - name: Check Firebase CLI Authentication run: | export GOOGLE_APPLICATION_CREDENTIALS=$HOME/firebase-credentials.json @@ -125,7 +131,7 @@ jobs: echo "📌 현재 Firebase 프로젝트 목록 확인:" firebase projects:list || (echo "❌ Firebase 인증 실패!"; exit 1) - # 16. Firebase App Distribution Upload + # 18. Firebase App Distribution Upload - name: Upload APK to Firebase App Distribution env: GOOGLE_APPLICATION_CREDENTIALS: $HOME/firebase-credentials.json @@ -148,7 +154,7 @@ jobs: --release-notes "🚀 새로운 데모 버전이 배포되었습니다!" \ --groups "orbit-tester-group" - # 17. Notify Discord + # 19. Notify Discord - name: Notify Discord env: DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml index f7237422..9bfe9b44 100644 --- a/.github/workflows/android_ci.yml +++ b/.github/workflows/android_ci.yml @@ -42,10 +42,16 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - # Decode google-services.json - - name: Decode google-services.json + # Decode google-services.json for debug + - name: Decode google-services.json (debug) env: - FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET }} + FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_DEBUG }} + run: echo $FIREBASE_SECRET | base64 --decode > app/src/dev/google-services.json + + # Decode google-services.json for release + - name: Decode google-services.json (release) + env: + FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_RELEASE }} run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json # Debug google-services.json From fab32b87d7dda66601461e21016b5ea759134aba Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Thu, 24 Apr 2025 15:14:09 +0900 Subject: [PATCH 189/210] =?UTF-8?q?[CHORE/#217]=20app/src/dev=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=EA=B0=80=20=EC=A1=B4=EC=9E=AC=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EC=9C=BC=EB=A9=B4=20=EB=A7=8C=EB=93=A4=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20CI/CD=20=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/android_cd.yml | 4 +++- .github/workflows/android_ci.yml | 8 +++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/android_cd.yml b/.github/workflows/android_cd.yml index f947cd17..c00a6bba 100644 --- a/.github/workflows/android_cd.yml +++ b/.github/workflows/android_cd.yml @@ -49,7 +49,9 @@ jobs: - name: Decode google-services.json (debug) env: FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_DEBUG }} - run: echo $FIREBASE_SECRET | base64 --decode > app/src/dev/google-services.json + run: | + mkdir -p app/src/dev + echo $FIREBASE_SECRET | base64 --decode > app/src/dev/google-services.json # 7. Decode google-services.json for release - name: Decode google-services.json (release) diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml index 9bfe9b44..b8974a0d 100644 --- a/.github/workflows/android_ci.yml +++ b/.github/workflows/android_ci.yml @@ -46,7 +46,9 @@ jobs: - name: Decode google-services.json (debug) env: FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_DEBUG }} - run: echo $FIREBASE_SECRET | base64 --decode > app/src/dev/google-services.json + run: | + mkdir -p app/src/dev + echo $FIREBASE_SECRET | base64 --decode > app/src/dev/google-services.json # Decode google-services.json for release - name: Decode google-services.json (release) @@ -54,10 +56,6 @@ jobs: FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET_RELEASE }} run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json - # Debug google-services.json - - name: Debug google-services.json - run: cat app/google-services.json - # Add Local Properties - name: Add Local Properties env: From a737c44e1821bca150d0f81ce42978c67bb2ed12 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 23 Apr 2025 20:14:13 +0900 Subject: [PATCH 190/210] =?UTF-8?q?[MOD/#215]=20=EC=95=8C=EB=9E=8C?= =?UTF-8?q?=EB=81=84=EA=B8=B0=20->=20=EB=AF=B8=EC=85=98=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=EC=9C=BC=EB=A1=9C=20UX=20Writing=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt | 2 +- .../com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt | 2 +- feature/alarm-interaction/src/main/res/values/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt index de4d1f16..0a0701cb 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt @@ -168,7 +168,7 @@ private fun AlarmActionContent( Spacer(modifier = Modifier.weight(1f)) OrbitButton( - label = stringResource(id = R.string.alarm_off_btn), + label = stringResource(id = R.string.alarm_off_mission_start_btn), enabled = true, modifier = Modifier .padding( diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt index a607dd85..832bfdc6 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt @@ -291,7 +291,7 @@ private fun AlarmOffButton( ), ) { Text( - text = stringResource(id = R.string.alarm_off_btn), + text = stringResource(id = R.string.alarm_off_mission_start_btn), style = OrbitTheme.typography.headline2SemiBold, ) } diff --git a/feature/alarm-interaction/src/main/res/values/strings.xml b/feature/alarm-interaction/src/main/res/values/strings.xml index f7e9dc83..c782d97a 100644 --- a/feature/alarm-interaction/src/main/res/values/strings.xml +++ b/feature/alarm-interaction/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ %d분 미루기 - 알람끄기 + 미션 시작 알람 미루기 남은 시간 From ad6f58fcd69485cea895f05be6edd4abe3b5fe82 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 23 Apr 2025 20:15:41 +0900 Subject: [PATCH 191/210] =?UTF-8?q?[DEL/#215]=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B6=95=EC=86=8C=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B8=ED=95=9C=20=EB=AA=A9=EC=A0=81=EC=A7=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/common/navigation/destination/MissionDestination.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt index fd742d70..3366da3d 100644 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt +++ b/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt @@ -5,9 +5,4 @@ import com.yapp.common.navigation.Routes sealed class MissionDestination(val route: String) { data object Route : MissionDestination(Routes.Mission.ROUTE) data object Mission : MissionDestination(Routes.Mission.MISSION) - data object Progress : MissionDestination(Routes.Mission.PROGRESS) - - companion object { - val routes = listOf(Mission, Progress) - } } From ff43e9e36b21414b350896e12d236b285d16e2b4 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 23 Apr 2025 20:16:14 +0900 Subject: [PATCH 192/210] =?UTF-8?q?[REFACTOR/#215]=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=95=A1=EC=85=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/mission/MissionContract.kt | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt index 777951b0..505ae265 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt @@ -7,9 +7,6 @@ sealed class MissionContract { data class State( val missionType: MissionType = MissionType.Click, val isMissionTypeLoading: Boolean = true, - val showOverlayText: Boolean = false, - val showOverlay: Boolean = true, - val missionProgress: Int = 0, val isMissionCompleted: Boolean = false, val shakeCount: Int = 0, val clickCount: Int = 0, @@ -23,14 +20,11 @@ sealed class MissionContract { ) : com.yapp.ui.base.UiState sealed class Action { - data object NextStep : Action() - data object PreviousStep : Action() - object StartOverlayTimer : Action() - object ShakeCard : Action() - object ClickCard : Action() - object ShowExitDialog : Action() - object HideExitDialog : Action() - object RetryPostFortune : Action() + data object ShakeCard : Action() + data object ClickCard : Action() + data object ShowExitDialog : Action() + data object HideExitDialog : Action() + data object RetryPostFortune : Action() } sealed class SideEffect : com.yapp.ui.base.SideEffect { From 68c2e58041df624a04d7d3aef0181ff1fcb960bc Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 23 Apr 2025 20:17:22 +0900 Subject: [PATCH 193/210] =?UTF-8?q?[DEL/#215]=20missionNavGraph=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=82=AC=EC=9A=A9=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20Composable=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yapp/mission/MissionNavGraph.kt | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt index 80dcbac3..076a59a6 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt @@ -34,18 +34,6 @@ fun NavGraphBuilder.missionNavGraph( MissionRoute(viewModel) } - - composable(MissionDestination.Progress.route) { backStackEntry -> - val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) - - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> - handleMissionSideEffect(sideEffect, navigator, viewModel) - } - } - - MissionProgressRoute(viewModel) - } } } @@ -62,6 +50,5 @@ private fun handleMissionSideEffect( ) MissionContract.SideEffect.NavigateBack -> navigator.navigateBack() -// MissionContract.SideEffect.MissionCompleted -> onFinishMission() } } From f8d1ce333e2e450f1c7a6e413f7b18bb3c86d66e Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 23 Apr 2025 20:18:09 +0900 Subject: [PATCH 194/210] =?UTF-8?q?[REFACTOR/#215]=20MissionViewModel?= =?UTF-8?q?=EC=9D=98=20=EC=A4=91=EB=B3=B5=20=EC=BD=94=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20=ED=95=A8=EC=88=98=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yapp/mission/MissionViewModel.kt | 121 ++++++++---------- 1 file changed, 55 insertions(+), 66 deletions(-) diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index 74ff68bc..94512478 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -19,6 +19,7 @@ import com.yapp.media.haptic.HapticType import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -37,11 +38,9 @@ class MissionViewModel @Inject constructor( MissionContract.State(), ) { init { - val notificationId = savedStateHandle.get("notificationId")?.toLong() - if (notificationId != null) { - sendAlarmDismissIntent(notificationId) + savedStateHandle.get("notificationId")?.toLong()?.let { + sendAlarmDismissIntent(it) } - loadRemoteMissionType() } @@ -59,47 +58,31 @@ class MissionViewModel @Inject constructor( fun processAction(action: MissionContract.Action) { when (action) { - is MissionContract.Action.NextStep -> { - emitSideEffect( - MissionContract.SideEffect.Navigate(route = MissionDestination.Progress.route), - ) - } - - is MissionContract.Action.PreviousStep -> { - emitSideEffect(MissionContract.SideEffect.NavigateBack) - } - - is MissionContract.Action.StartOverlayTimer -> startOverlayTimer() - is MissionContract.Action.ShakeCard -> handleShake() is MissionContract.Action.ClickCard -> handleClick() - - is MissionContract.Action.ShowExitDialog -> updateState { copy(showExitDialog = true) } - is MissionContract.Action.HideExitDialog -> updateState { copy(showExitDialog = false) } + is MissionContract.Action.ShowExitDialog -> showExitDialog() + is MissionContract.Action.HideExitDialog -> hideExitDialog() is MissionContract.Action.RetryPostFortune -> retryPostFortune() } } + private fun showExitDialog() { + updateState { copy(showExitDialog = true) } + } + + private fun hideExitDialog() { + updateState { copy(showExitDialog = false) } + } + private fun handleShake() = viewModelScope.launch { - if (currentState.showOverlay) updateState { copy(showOverlay = false) } - if (currentState.showOverlayText) updateState { copy(showOverlayText = false) } if (currentState.missionType !is MissionType.Shake) return@launch val currentCount = currentState.shakeCount if (currentCount < 9) { - hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS) + performHapticSuccess() updateState { copy(shakeCount = currentCount + 1) } - } else if (currentCount == 9 && !currentState.isFlipped) { - hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS) - analyticsHelper.logEvent( - AnalyticsEvent( - type = "mission_success", - properties = mapOf( - AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to "shake", - ), - ), - ) - postFortune() + } else if (!currentState.isFlipped) { + completeMission(type = "shake") updateState { copy( isMissionCompleted = true, @@ -107,7 +90,7 @@ class MissionViewModel @Inject constructor( isFlipped = true, ) } - kotlinx.coroutines.delay(500) + delay(500) } } @@ -116,20 +99,12 @@ class MissionViewModel @Inject constructor( val currentCount = currentState.clickCount if (currentCount < 9) { - hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS) - analyticsHelper.logEvent( - AnalyticsEvent( - type = "mission_success", - properties = mapOf( - AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to "click", - ), - ), - ) + performHapticSuccess() + logMissionSuccess("click") updateState { copy(clickCount = currentCount + 1, playWhenClick = true) } - - kotlinx.coroutines.delay(500) + delay(500) updateState { copy(playWhenClick = false) } - } else if (currentCount == 9) { + } else { updateState { copy( clickCount = 10, @@ -137,7 +112,7 @@ class MissionViewModel @Inject constructor( ) } postFortune() - kotlinx.coroutines.delay(500) + delay(500) updateState { copy(isMissionCompleted = true) } } } @@ -145,15 +120,16 @@ class MissionViewModel @Inject constructor( private fun postFortune() { viewModelScope.launch { val userId = userPreferences.userIdFlow.firstOrNull() ?: return@launch - val fortuneResult = runCatching { + val result = runCatching { withContext(Dispatchers.IO) { fortuneRepository.postFortune(userId) } } - fortuneResult.onSuccess { fortune -> - val fortuneData = fortune.getOrThrow() - userPreferences.saveFortuneId(fortuneData.id) - userPreferences.saveFortuneScore(fortuneData.avgFortuneScore) + + result.onSuccess { + val data = it.getOrThrow() + userPreferences.saveFortuneId(data.id) + userPreferences.saveFortuneScore(data.avgFortuneScore) emitSideEffect( MissionContract.SideEffect.Navigate( @@ -172,16 +148,16 @@ class MissionViewModel @Inject constructor( private fun retryPostFortune() { viewModelScope.launch { val userId = userPreferences.userIdFlow.firstOrNull() ?: return@launch - val fortuneResult = runCatching { + val result = runCatching { withContext(Dispatchers.IO) { fortuneRepository.postFortune(userId) } } - fortuneResult.onSuccess { fortune -> - val fortuneData = fortune.getOrThrow() - userPreferences.saveFortuneId(fortuneData.id) - userPreferences.saveFortuneScore(fortuneData.avgFortuneScore) + result.onSuccess { + val data = it.getOrThrow() + userPreferences.saveFortuneId(data.id) + userPreferences.saveFortuneScore(data.avgFortuneScore) emitSideEffect( MissionContract.SideEffect.Navigate( @@ -191,12 +167,33 @@ class MissionViewModel @Inject constructor( ), ) }.onFailure { - Log.e("MissionViewModel", "운세 데이터 재요청 실패: ${it.message}") + Log.e("MissionViewModel", "운세 재요청 실패: ${it.message}") navigateToHome() } } } + private fun completeMission(type: String) { + performHapticSuccess() + logMissionSuccess(type) + postFortune() + } + + private fun performHapticSuccess() { + hapticFeedbackManager.performHapticFeedback(HapticType.SUCCESS) + } + + private fun logMissionSuccess(type: String) { + analyticsHelper.logEvent( + AnalyticsEvent( + type = "mission_success", + properties = mapOf( + AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to type, + ), + ), + ) + } + private fun navigateToHome() { emitSideEffect( MissionContract.SideEffect.Navigate( @@ -207,14 +204,6 @@ class MissionViewModel @Inject constructor( ) } - private fun startOverlayTimer() = viewModelScope.launch { - updateState { copy(showOverlay = true) } - kotlinx.coroutines.delay(1000) - updateState { copy(showOverlayText = true) } - kotlinx.coroutines.delay(2000) - updateState { copy(showOverlay = false, showOverlayText = false) } - } - private fun sendAlarmDismissIntent(id: Long) { val alarmDismissIntent = createAlarmDismissIntent( context = app, From 3f8be1ac1a8a96058bc11f297db4454e9ecc4c36 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Wed, 23 Apr 2025 20:19:36 +0900 Subject: [PATCH 195/210] =?UTF-8?q?[REFACTOR/#215]=20MissionScreen?= =?UTF-8?q?=EA=B3=BC=20MissionProgressScreen=20=EB=B3=91=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가독성 향상을 위한 함수 분리 - 각 컴포저블 함수에 간단한 Kdoc주석 추가 --- .../com/yapp/mission/MissionProgressScreen.kt | 326 ------------- .../java/com/yapp/mission/MissionScreen.kt | 441 +++++++++++++----- 2 files changed, 316 insertions(+), 451 deletions(-) delete mode 100644 feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt deleted file mode 100644 index 3248fe52..00000000 --- a/feature/mission/src/main/java/com/yapp/mission/MissionProgressScreen.kt +++ /dev/null @@ -1,326 +0,0 @@ -package com.yapp.mission - -import androidx.activity.compose.BackHandler -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.Crossfade -import androidx.compose.animation.core.FastOutSlowInEasing -import androidx.compose.animation.core.tween -import androidx.compose.animation.fadeIn -import androidx.compose.animation.scaleIn -import androidx.compose.foundation.Image -import androidx.compose.foundation.background -import androidx.compose.foundation.gestures.detectTapGestures -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.aspectRatio -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha -import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.yapp.analytics.AnalyticsEvent -import com.yapp.analytics.LocalAnalyticsHelper -import com.yapp.designsystem.theme.OrbitTheme -import com.yapp.domain.model.MissionType -import com.yapp.mission.component.FlipCard -import com.yapp.mission.component.MissionProgressBar -import com.yapp.ui.component.dialog.OrbitDialog -import com.yapp.ui.component.lottie.LottieAnimation -import com.yapp.ui.extensions.customClickable -import com.yapp.ui.utils.heightForScreenPercentage -import com.yapp.ui.utils.paddingForScreenPercentage - -@Composable -fun MissionProgressRoute(viewModel: MissionViewModel = hiltViewModel()) { - val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() - val context = LocalContext.current - val shakeDetector = remember { ShakeDetector(context) { viewModel.processAction(MissionContract.Action.ShakeCard) } } - - LaunchedEffect(Unit) { - shakeDetector.start() - viewModel.processAction(MissionContract.Action.StartOverlayTimer) - } - - DisposableEffect(Unit) { - onDispose { shakeDetector.stop() } - } - - MissionProgressScreen( - stateProvider = { state }, - eventDispatcher = viewModel::processAction, - ) -} - -@Composable -fun MissionProgressScreen( - stateProvider: () -> MissionContract.State, - eventDispatcher: (MissionContract.Action) -> Unit, -) { - val state = stateProvider() - - val analyticsHelper = LocalAnalyticsHelper.current - val context = LocalContext.current - - BackHandler { - if (state.showExitDialog) { - eventDispatcher(MissionContract.Action.HideExitDialog) - } else { - eventDispatcher(MissionContract.Action.ShowExitDialog) - } - } - - Box( - modifier = Modifier.fillMaxSize(), - ) { - Image( - painter = painterResource(id = core.designsystem.R.drawable.img_mission_progress_background), - contentDescription = null, - contentScale = ContentScale.Crop, - modifier = Modifier.matchParentSize(), - ) - - Column( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer(modifier = Modifier.heightForScreenPercentage(0.066f)) - Box( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp), - contentAlignment = Alignment.TopEnd, - ) { - Row( - modifier = Modifier - .customClickable( - rippleEnabled = false, - fadeOnPress = true, - pressedAlpha = 0.5f, - onClick = { eventDispatcher(MissionContract.Action.ShowExitDialog) }, - ), - ) { - Icon( - painter = painterResource(id = core.designsystem.R.drawable.ic_cancel), - contentDescription = null, - tint = OrbitTheme.colors.white, - modifier = Modifier.size(24.dp), - ) - Text( - text = "나가기", - color = OrbitTheme.colors.white, - style = OrbitTheme.typography.body1SemiBold, - modifier = Modifier - .padding(start = 4.dp) - .align(Alignment.CenterVertically), - ) - } - } - - Spacer(modifier = Modifier.heightForScreenPercentage(0.0246f)) - MissionProgressBar( - currentProgress = when (state.missionType) { - is MissionType.Shake -> state.shakeCount - is MissionType.Click -> state.clickCount - }, - totalProgress = 10, - modifier = Modifier - .fillMaxWidth() - .height(5.dp) - .padding(horizontal = 20.dp) - .alpha(if (state.showOverlay) 0f else 1f), - ) - Spacer(modifier = Modifier.heightForScreenPercentage(0.06f)) - Text( - text = if (state.missionType is MissionType.Shake) "10회를 흔들어야 운세를 받아요" else "10회를 눌러야 운세를 받아요", - color = OrbitTheme.colors.white, - style = OrbitTheme.typography.heading2SemiBold, - modifier = Modifier.alpha(if (state.showOverlay) 0f else 1f), - ) - Spacer(modifier = Modifier.heightForScreenPercentage(0.005f)) - Text( - text = when (state.missionType) { - is MissionType.Shake -> state.shakeCount.toString() - is MissionType.Click -> state.clickCount.toString() - }, - color = OrbitTheme.colors.white, - style = OrbitTheme.typography.displaySemiBold, - modifier = Modifier.alpha(if (state.showOverlay) 0f else 1f), - ) - - Spacer(modifier = Modifier.heightForScreenPercentage(if (state.missionType is MissionType.Shake) 0.0665f else 0.1f)) - if (state.missionType is MissionType.Shake) { - FlipCard( - state = state, - eventDispatcher = eventDispatcher, - ) - } else if (state.missionType is MissionType.Click) { - Crossfade( - targetState = state.showFinalAnimation, - animationSpec = tween(durationMillis = 500), - ) { showFinal -> - LottieAnimation( - modifier = Modifier - .aspectRatio(12f / 9f) - .pointerInput(Unit) { - detectTapGestures( - onTap = { - if (!state.showFinalAnimation) { - eventDispatcher(MissionContract.Action.ClickCard) - } - }, - ) - }, - resId = if (showFinal) { - core.designsystem.R.raw.mission_letter_open - } else { - core.designsystem.R.raw.mission_letter_tap - }, - play = state.playWhenClick || showFinal, - restartOnPlay = true, - iterations = 1, - ) - } - } - } - } - - if (state.showOverlay) { - Column( - modifier = Modifier - .fillMaxSize() - .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f)) - .pointerInput(Unit) { - awaitPointerEventScope { - while (true) { - awaitPointerEvent() - } - } - }, - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer(modifier = Modifier.heightForScreenPercentage(0.226f)) - - AnimatedVisibility( - visible = state.showOverlayText, - enter = scaleIn( - initialScale = 0.8f, - animationSpec = tween(durationMillis = 300, easing = FastOutSlowInEasing), - ) + fadeIn(animationSpec = tween(durationMillis = 300)), - ) { - Text( - text = if (state.missionType is MissionType.Shake) "흔들기 시작!" else "누르기 시작!", - color = OrbitTheme.colors.white, - style = OrbitTheme.typography.title1Bold, - ) - } - } - } - - if (state.showExitDialog) { - OrbitDialog( - title = "나가면 운세를 받을 수 없어요", - message = "미션을 수행하지 않고 나가시겠어요?", - confirmText = "나가기", - cancelText = "취소", - onConfirm = { - analyticsHelper.logEvent( - AnalyticsEvent( - type = "mission_fail", - properties = mapOf( - AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to when (state.missionType) { - is MissionType.Shake -> "shake" - is MissionType.Click -> "click" - }, - ), - ), - ) - (context as? androidx.activity.ComponentActivity)?.finish() - }, - onCancel = { - eventDispatcher(MissionContract.Action.HideExitDialog) - }, - ) - } - - if (state.isMissionCompleted) { - Box( - modifier = Modifier - .fillMaxSize() - .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f)) - .pointerInput(Unit) { - awaitPointerEventScope { - while (true) { - awaitPointerEvent() - } - } - }, - contentAlignment = Alignment.Center, - ) { - Box( - modifier = Modifier.fillMaxSize(), - ) { - LottieAnimation( - modifier = Modifier - .matchParentSize(), - scaleXAdjustment = 1.3f, - scaleYAdjustment = 1.3f, - resId = core.designsystem.R.raw.mission_success, - iterations = 1, - play = true, - ) - Text( - text = "미션 성공!", - color = OrbitTheme.colors.white, - style = OrbitTheme.typography.title1Bold, - modifier = Modifier - .align(Alignment.TopCenter) - .paddingForScreenPercentage(topPercentage = 0.564f), - ) - } - } - } - - if (state.errorMessage != null) { - OrbitDialog( - title = "오류", - message = state.errorMessage, - confirmText = "확인", - onConfirm = { - eventDispatcher(MissionContract.Action.RetryPostFortune) - }, - ) - } - } -} - -@Composable -@Preview -fun MissionProgressRoutePreview() { - MissionProgressScreen( - stateProvider = { MissionContract.State() }, - eventDispatcher = {}, - ) -} diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt index 681df5c7..cd42cdd1 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionScreen.kt @@ -1,206 +1,386 @@ package com.yapp.mission +import androidx.activity.ComponentActivity import androidx.activity.compose.BackHandler +import androidx.compose.animation.Crossfade +import androidx.compose.animation.core.tween import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.gestures.detectTapGestures 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.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -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.DisposableEffect +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.scale +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.yapp.analytics.AnalyticsEvent +import com.yapp.analytics.AnalyticsHelper import com.yapp.analytics.LocalAnalyticsHelper import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.MissionType -import com.yapp.ui.component.button.OrbitButton +import com.yapp.mission.component.FlipCard +import com.yapp.mission.component.MissionProgressBar import com.yapp.ui.component.dialog.OrbitDialog import com.yapp.ui.component.lottie.LottieAnimation +import com.yapp.ui.extensions.customClickable import com.yapp.ui.utils.heightForScreenPercentage +import com.yapp.ui.utils.paddingForScreenPercentage @Composable fun MissionRoute(viewModel: MissionViewModel = hiltViewModel()) { val state by viewModel.container.stateFlow.collectAsStateWithLifecycle() + val context = LocalContext.current + + val shakeDetector = remember { + ShakeDetector(context) { + viewModel.processAction(MissionContract.Action.ShakeCard) + } + } + + LaunchedEffect(Unit) { + shakeDetector.start() + } + + DisposableEffect(Unit) { + onDispose { shakeDetector.stop() } + } MissionScreen( stateProvider = { state }, eventDispatcher = viewModel::processAction, + onFinish = { + (context as? ComponentActivity)?.finish() + }, ) } +/** + * Mission 상태에 따라 적절한 화면을 구성하는 메인 컨테이너. + * 로딩, 콘텐츠, 성공 오버레이, 다이얼로그 등 분기 처리 포함. + */ @Composable fun MissionScreen( stateProvider: () -> MissionContract.State, eventDispatcher: (MissionContract.Action) -> Unit, + onFinish: () -> Unit, ) { val state = stateProvider() - - val analyticsHelper = LocalAnalyticsHelper.current - val context = LocalContext.current + val analytics = LocalAnalyticsHelper.current BackHandler { - if (state.showExitDialog) { - eventDispatcher(MissionContract.Action.HideExitDialog) - } else { - eventDispatcher(MissionContract.Action.ShowExitDialog) - } + eventDispatcher( + if (state.showExitDialog) { + MissionContract.Action.HideExitDialog + } else { + MissionContract.Action.ShowExitDialog + }, + ) } - Box( - modifier = Modifier.fillMaxSize(), - ) { + Box(modifier = Modifier.fillMaxSize()) { if (state.isMissionTypeLoading) { MissionLoadingScreen() return } + Image( - painter = painterResource(id = core.designsystem.R.drawable.img_mission_main_background), + painter = painterResource(id = core.designsystem.R.drawable.img_mission_progress_background), contentDescription = null, contentScale = ContentScale.Crop, modifier = Modifier.matchParentSize(), ) - Column( - modifier = Modifier - .fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.SpaceBetween, - ) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Spacer(modifier = Modifier.heightForScreenPercentage(0.110f)) - MissionTag(label = "기상미션") - Spacer(modifier = Modifier.heightForScreenPercentage(0.0418f)) - MissionLabel(label = if (state.missionType is MissionType.Shake) "10회를 흔들어" else "10회를 눌러서", style = OrbitTheme.typography.headline2Medium) - Spacer(modifier = Modifier.heightForScreenPercentage(0.01f)) - MissionLabel(label = if (state.missionType is MissionType.Shake) "부적을 뒤집어줘" else "편지를 열어줘", style = OrbitTheme.typography.title2Bold) + MissionContent(state, eventDispatcher) + + if (state.showExitDialog) { + ExitDialog(state, eventDispatcher, onFinish, analytics) + } + + if (state.isMissionCompleted) { + MissionSuccessOverlay() + } + + state.errorMessage?.let { + ErrorDialog(message = it) { + eventDispatcher(MissionContract.Action.RetryPostFortune) } - Column( - modifier = Modifier - .fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Image( - painter = painterResource( - if (state.missionType is MissionType.Shake) { - core.designsystem.R.drawable.img_mission_main - } else { - core.designsystem.R.drawable.ic_mission_main_letter - }, - ), - contentDescription = "", - modifier = Modifier - .fillMaxWidth() - .scale(if (state.missionType is MissionType.Shake) 1.1f else 1.0f), - ) + } + } +} + +/** + * 미션 콘텐츠 본문. TopBar, 진행 바, 상태별 게임 포함. + */ +@Composable +fun MissionContent( + state: MissionContract.State, + eventDispatcher: (MissionContract.Action) -> Unit, +) { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + MissionTopAppBar(onExit = { eventDispatcher(MissionContract.Action.ShowExitDialog) }) + MissionProgressBarSection(state) + MissionLabel(state) + Spacer(modifier = Modifier.heightForScreenPercentage(0.0665f)) + + when (state.missionType) { + is MissionType.Shake -> { + if (state.shakeCount == 0) { + MissionShakeInitialImage() + } else { + FlipCard(state = state, eventDispatcher = eventDispatcher) + } } - Column( - horizontalAlignment = Alignment.CenterHorizontally, - ) { - OrbitButton( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp), - label = "미션 시작", - onClick = { - analyticsHelper.logEvent( - AnalyticsEvent( - type = "mission_ready_start", - properties = mapOf( - AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to "shake", - ), - ), - ) - eventDispatcher(MissionContract.Action.NextStep) - }, - enabled = true, - ) - Spacer(modifier = Modifier.heightForScreenPercentage(0.027f)) - MissionLabel( - label = "미션하지 않기", - style = OrbitTheme.typography.body1SemiBold, - clickable = true, - onClick = { - analyticsHelper.logEvent( - AnalyticsEvent( - type = "mission_ready_skip", - properties = mapOf( - AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to "shake", - ), - ), - ) - eventDispatcher(MissionContract.Action.ShowExitDialog) - }, - ) - Spacer(modifier = Modifier.heightForScreenPercentage(0.0714f)) + + is MissionType.Click -> { + MissionClickCard(state, eventDispatcher) } } } +} - if (state.showExitDialog) { - OrbitDialog( - title = "나가면 운세를 받을 수 없어요", - message = "미션을 수행하지 않고 나가시겠어요?", - confirmText = "나가기", - cancelText = "취소", - onConfirm = { (context as? androidx.activity.ComponentActivity)?.finish() }, - onCancel = { eventDispatcher(MissionContract.Action.HideExitDialog) }, +/** + * '나가기' 버튼이 포함된 미션 상단 앱바 영역. + */ +@Composable +fun MissionTopAppBar(onExit: () -> Unit) { + Spacer(modifier = Modifier.heightForScreenPercentage(0.066f)) + Box( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + contentAlignment = Alignment.TopEnd, + ) { + Row( + modifier = Modifier.customClickable( + rippleEnabled = false, + fadeOnPress = true, + pressedAlpha = 0.5f, + onClick = onExit, + ), + ) { + Icon( + painter = painterResource(id = core.designsystem.R.drawable.ic_cancel), + contentDescription = null, + tint = OrbitTheme.colors.white, + modifier = Modifier.size(24.dp), + ) + Text( + text = "나가기", + color = OrbitTheme.colors.white, + style = OrbitTheme.typography.body1SemiBold, + modifier = Modifier + .padding(start = 4.dp) + .align(Alignment.CenterVertically), + ) + } + } +} + +/** + * 미션 진행도 ProgressBar 섹션. + */ +@Composable +fun MissionProgressBarSection(state: MissionContract.State) { + Spacer(modifier = Modifier.heightForScreenPercentage(0.0246f)) + MissionProgressBar( + currentProgress = when (state.missionType) { + is MissionType.Shake -> state.shakeCount + is MissionType.Click -> state.clickCount + }, + totalProgress = 10, + modifier = Modifier + .fillMaxWidth() + .height(5.dp) + .padding(horizontal = 20.dp), + ) + Spacer(modifier = Modifier.heightForScreenPercentage(0.06f)) +} + +/** + * 미션 안내 문구 및 현재 카운트. + */ +@Composable +fun MissionLabel(state: MissionContract.State) { + val instruction = + if (state.missionType is MissionType.Shake) "10회를 흔들어 부적을 뒤집어줘" else "10회를 눌러 편지를 열어줘" + val count = if (state.missionType is MissionType.Shake) state.shakeCount else state.clickCount + + Text( + text = instruction, + color = OrbitTheme.colors.white, + style = OrbitTheme.typography.heading2SemiBold, + ) + Spacer(modifier = Modifier.heightForScreenPercentage(0.005f)) + Text( + text = count.toString(), + color = OrbitTheme.colors.white, + style = OrbitTheme.typography.displaySemiBold, + ) +} + +/** + * 흔들기 미션 초기 이미지. + */ +@Composable +fun MissionShakeInitialImage() { + Image( + painter = painterResource(id = core.designsystem.R.drawable.img_mission_main), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .scale(1.1f), + ) +} + +/** + * 클릭 미션 카드. 클릭 시 애니메이션 및 상태 변화. + */ +@Composable +fun MissionClickCard( + state: MissionContract.State, + eventDispatcher: (MissionContract.Action) -> Unit, +) { + if (state.clickCount == 0) { + Image( + painter = painterResource(id = core.designsystem.R.drawable.ic_mission_main_letter), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .scale(1.0f) + .pointerInput(Unit) { + detectTapGestures { eventDispatcher(MissionContract.Action.ClickCard) } + }, ) + } else { + Crossfade(targetState = state.showFinalAnimation, animationSpec = tween(500)) { showFinal -> + LottieAnimation( + modifier = Modifier + .aspectRatio(12f / 9f) + .pointerInput(Unit) { + detectTapGestures { + if (!showFinal) eventDispatcher(MissionContract.Action.ClickCard) + } + }, + resId = if (showFinal) core.designsystem.R.raw.mission_letter_open else core.designsystem.R.raw.mission_letter_tap, + play = state.playWhenClick || showFinal, + restartOnPlay = true, + iterations = 1, + ) + } } } +/** + * 미션 종료 시 나가기 다이얼로그. + */ +@Composable +fun ExitDialog( + state: MissionContract.State, + eventDispatcher: (MissionContract.Action) -> Unit, + onFinish: () -> Unit, + analytics: AnalyticsHelper, +) { + OrbitDialog( + title = "나가면 운세를 받을 수 없어요", + message = "미션을 수행하지 않고 나가시겠어요?", + confirmText = "나가기", + cancelText = "취소", + onConfirm = { + analytics.logEvent( + AnalyticsEvent( + type = "mission_fail", + properties = mapOf( + AnalyticsEvent.MissionPropertiesKeys.MISSION_TYPE to when (state.missionType) { + is MissionType.Shake -> "shake" + is MissionType.Click -> "click" + }, + ), + ), + ) + onFinish() + }, + onCancel = { eventDispatcher(MissionContract.Action.HideExitDialog) }, + ) +} + +/** + * 미션 성공 시 오버레이 화면. + */ @Composable -fun MissionTag(label: String) { +fun MissionSuccessOverlay() { Box( modifier = Modifier - .background( - color = OrbitTheme.colors.main.copy(alpha = 0.1f), - shape = RoundedCornerShape(30.dp), - ) - .padding(vertical = 4.dp, horizontal = 12.dp), + .fillMaxSize() + .background(OrbitTheme.colors.gray_900.copy(alpha = 0.7f)) + .pointerInput(Unit) { + awaitPointerEventScope { + while (true) awaitPointerEvent() + } + }, + contentAlignment = Alignment.Center, ) { - Text( - text = label, - color = OrbitTheme.colors.main, - style = OrbitTheme.typography.body2Medium, - ) + Box(modifier = Modifier.fillMaxSize()) { + LottieAnimation( + modifier = Modifier.matchParentSize(), + scaleXAdjustment = 1.3f, + scaleYAdjustment = 1.3f, + resId = core.designsystem.R.raw.mission_success, + iterations = 1, + play = true, + ) + Text( + text = "미션 성공!", + color = OrbitTheme.colors.white, + style = OrbitTheme.typography.title1Bold, + modifier = Modifier + .align(Alignment.TopCenter) + .paddingForScreenPercentage(topPercentage = 0.564f), + ) + } } } +/** + * 오류 발생 시 다이얼로그. + */ @Composable -fun MissionLabel( - label: String, - style: TextStyle, - clickable: Boolean = false, - onClick: () -> Unit = { }, -) { - Text( - text = label, - color = OrbitTheme.colors.white, - style = style, - modifier = if (clickable) { Modifier.clickable { onClick() } } else Modifier, +fun ErrorDialog(message: String, onConfirm: () -> Unit) { + OrbitDialog( + title = "오류", + message = message, + confirmText = "확인", + onConfirm = onConfirm, ) } +/** + * 로딩 화면. 미션 타입 로딩 중에 표시. + */ @Composable fun MissionLoadingScreen() { Box( @@ -208,18 +388,29 @@ fun MissionLoadingScreen() { contentAlignment = Alignment.Center, ) { LottieAnimation( - modifier = Modifier - .size(70.dp), + modifier = Modifier.size(70.dp), resId = core.designsystem.R.raw.star_loading, ) } } @Composable -@Preview(showBackground = true) -fun MissionRoutePreview() { +@Preview +private fun MissionRoutePreview() { MissionScreen( - stateProvider = { MissionContract.State() }, - eventDispatcher = { }, + stateProvider = { + MissionContract.State( + isMissionTypeLoading = false, + missionType = MissionType.Shake, + shakeCount = 0, + clickCount = 0, + showFinalAnimation = false, + playWhenClick = false, + showExitDialog = false, + isMissionCompleted = false, + ) + }, + eventDispatcher = {}, + onFinish = {}, ) } From 31da26df6683bab96175e6c52e50a7f721583623 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Fri, 2 May 2025 16:30:33 +0900 Subject: [PATCH 196/210] =?UTF-8?q?[ADD/#215]=20isFirstMission=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/alarm/interaction/action/AlarmActionContract.kt | 1 + .../yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt index 0deed3a3..cbc6d959 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt @@ -13,6 +13,7 @@ class AlarmActionContract { val snoozeEnabled: Boolean = true, val snoozeInterval: Int = 5, val snoozeCount: Int = 5, + val isFirstMission: Boolean? = null, ) : UiState sealed class Action { diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt index ba6e652e..f7adfee9 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt @@ -9,6 +9,7 @@ class AlarmSnoozeTimerContract { val alarmTimeStamp: Long = 0L, val remainingSeconds: Int = 1, val totalSeconds: Int = 300, + val isFirstMission: Boolean? = null, ) : UiState sealed class Action { From 2b5214ed9d575aeb5a04b922e1d726cd75a0da9a Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Fri, 2 May 2025 16:30:59 +0900 Subject: [PATCH 197/210] =?UTF-8?q?[ADD/#215]=20ViewModel=EC=97=90=20isFir?= =?UTF-8?q?stMission=20=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interaction/action/AlarmActionViewModel.kt | 18 ++++++++++++++++++ .../snooze/AlarmSnoozeTimerViewModel.kt | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt index 548c79b0..b6fa6e74 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt @@ -6,17 +6,22 @@ import androidx.lifecycle.viewModelScope import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent import com.yapp.alarm.pendingIntent.interaction.createAlarmSnoozeIntent import com.yapp.common.navigation.Routes +import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.isActive import kotlinx.coroutines.launch +import java.time.LocalDate +import java.time.format.DateTimeFormatter import javax.inject.Inject @HiltViewModel class AlarmActionViewModel @Inject constructor( private val app: Application, + private val userPreferences: UserPreferences, savedStateHandle: SavedStateHandle, ) : BaseViewModel( AlarmActionContract.State(), @@ -25,6 +30,7 @@ class AlarmActionViewModel @Inject constructor( private val alarm: Alarm? = alarmJson?.let { Alarm.fromJson(it) } init { + fetchIsFirstMission() updateState { copy( snoozeEnabled = alarm?.isSnoozeEnabled ?: false, @@ -36,6 +42,18 @@ class AlarmActionViewModel @Inject constructor( startClock() } + private fun fetchIsFirstMission() { + viewModelScope.launch { + val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + val isFirstMission = fortuneDate != todayDate + + updateState { + copy(isFirstMission = isFirstMission) + } + } + } + private fun startClock() { viewModelScope.launch { while (isActive) { diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt index 5ec0c4cd..6076cf8c 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerViewModel.kt @@ -4,14 +4,18 @@ import android.app.Application import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent +import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.isActive import kotlinx.coroutines.launch +import java.time.LocalDate import java.time.LocalDateTime import java.time.ZoneId +import java.time.format.DateTimeFormatter import javax.inject.Inject import kotlin.math.max @@ -19,6 +23,7 @@ import kotlin.math.max class AlarmSnoozeTimerViewModel @Inject constructor( private val app: Application, savedStateHandle: SavedStateHandle, + private val userPreferences: UserPreferences, ) : BaseViewModel( AlarmSnoozeTimerContract.State(), ) { @@ -26,9 +31,22 @@ class AlarmSnoozeTimerViewModel @Inject constructor( private val alarm: Alarm? = alarmJson?.let { Alarm.fromJson(it) } init { + fetchIsFirstMission() startClock() } + private fun fetchIsFirstMission() { + viewModelScope.launch { + val fortuneDate = userPreferences.fortuneDateFlow.firstOrNull() + val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE) + val isFirstMission = fortuneDate != todayDate + + updateState { + copy(isFirstMission = isFirstMission) + } + } + } + private fun startClock() { viewModelScope.launch { val nowMillis = System.currentTimeMillis() From 7a7cbb2463739824058d5b0743baa60258039e92 Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Fri, 2 May 2025 16:32:15 +0900 Subject: [PATCH 198/210] =?UTF-8?q?[ADD/#215]=20Screen=EC=97=90=20isFirstM?= =?UTF-8?q?ission=20=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interaction/action/AlarmActionScreen.kt | 34 ++++++++++++------- .../snooze/AlarmSnoozeTimerScreen.kt | 20 ++++++++--- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt index 0a0701cb..c44edb40 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt @@ -85,6 +85,7 @@ internal fun AlarmActionScreen( snoozeEnabled = state.snoozeEnabled, snoozeInterval = state.snoozeInterval, snoozeCount = state.snoozeCount, + isFirstMission = state.isFirstMission, onSnoozeClick = { eventDispatcher(AlarmActionContract.Action.Snooze) }, onDismissClick = { eventDispatcher(AlarmActionContract.Action.Dismiss) @@ -120,6 +121,7 @@ private fun AlarmActionContent( snoozeEnabled: Boolean, snoozeInterval: Int, snoozeCount: Int, + isFirstMission: Boolean?, onSnoozeClick: () -> Unit, onDismissClick: () -> Unit, ) { @@ -167,18 +169,26 @@ private fun AlarmActionContent( Spacer(modifier = Modifier.weight(1f)) - OrbitButton( - label = stringResource(id = R.string.alarm_off_mission_start_btn), - enabled = true, - modifier = Modifier - .padding( - start = 40.dp, - end = 40.dp, - bottom = 48.dp, - ) - .height(62.dp), - onClick = onDismissClick, - ) + if (isFirstMission != null) { + OrbitButton( + label = if (isFirstMission) { + stringResource(id = R.string.alarm_off_mission_start_btn) + } else { + stringResource(id = R.string.alarm_off_btn) + }, + enabled = true, + modifier = Modifier + .padding( + start = 40.dp, + end = 40.dp, + bottom = 48.dp, + ) + .height(62.dp), + onClick = onDismissClick, + ) + } else { + Spacer(modifier = Modifier.height(62.dp)) + } } AdsBanner() diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt index 832bfdc6..d770b69f 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt @@ -90,6 +90,7 @@ internal fun AlarmSnoozeTimerScreen( AlarmSnoozeContent( remainingSeconds = state.remainingSeconds, totalSeconds = state.totalSeconds, + isFirstMission = state.isFirstMission, onDismissClick = { eventDispatcher(AlarmSnoozeTimerContract.Action.Dismiss) (context as? ComponentActivity)?.finish() @@ -119,6 +120,7 @@ private fun AlarmSnoozeLoadingScreen() { private fun AlarmSnoozeContent( remainingSeconds: Int, totalSeconds: Int, + isFirstMission: Boolean?, onDismissClick: () -> Unit, ) { Column( @@ -147,9 +149,14 @@ private fun AlarmSnoozeContent( ) } - AlarmOffButton( - onClick = onDismissClick, - ) + if (isFirstMission != null) { + AlarmOffButton( + onClick = onDismissClick, + isFirstMission = isFirstMission, + ) + } else { + Spacer(modifier = Modifier.height(58.dp)) + } Spacer(modifier = Modifier.height(48.dp)) } @@ -273,6 +280,7 @@ private fun formatSecondsToTime(seconds: Int): String { private fun AlarmOffButton( modifier: Modifier = Modifier, onClick: () -> Unit, + isFirstMission: Boolean, height: Dp = 58.dp, containerColor: Color = OrbitTheme.colors.white.copy(alpha = 0.2f), contentColor: Color = OrbitTheme.colors.white, @@ -291,7 +299,11 @@ private fun AlarmOffButton( ), ) { Text( - text = stringResource(id = R.string.alarm_off_mission_start_btn), + text = if (isFirstMission) { + stringResource(id = R.string.alarm_off_mission_start_btn) + } else { + stringResource(id = R.string.alarm_off_btn) + }, style = OrbitTheme.typography.headline2SemiBold, ) } From 45efedfec74e34ae2724208e0b66601f6a3d360b Mon Sep 17 00:00:00 2001 From: MoonsuKang Date: Fri, 2 May 2025 16:32:21 +0900 Subject: [PATCH 199/210] =?UTF-8?q?[ADD/#215]=20=EC=95=8C=EB=9E=8C=20?= =?UTF-8?q?=EB=81=84=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EC=97=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/alarm-interaction/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/alarm-interaction/src/main/res/values/strings.xml b/feature/alarm-interaction/src/main/res/values/strings.xml index c782d97a..0c4fd8b9 100644 --- a/feature/alarm-interaction/src/main/res/values/strings.xml +++ b/feature/alarm-interaction/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ %d분 미루기 + 알람끄기 미션 시작 알람 미루기 From 361518ebf0e6e9d6fb5ccdb36a25fdfeac3c35da Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 28 May 2025 11:04:28 +0900 Subject: [PATCH 200/210] [RELEASE] v1.0.3 --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 946518e1..4acc31ae 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -10,8 +10,8 @@ android { namespace = "com.yapp.orbit" defaultConfig { - versionCode = 4 - versionName = "1.0.2" + versionCode = 5 + versionName = "1.0.3" targetSdk = 34 } From 9d55152ff5416a8afe4bdbf1857f32ef0f1bb0fd Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Mon, 2 Jun 2025 15:11:32 +0900 Subject: [PATCH 201/210] =?UTF-8?q?[REMOVE/#212]=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20TopDestination,=20?= =?UTF-8?q?=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98=20=EB=B0=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 --- core/common/build.gradle.kts | 1 + .../yapp/common/navigation/OrbitNavigator.kt | 35 --------- .../destination/TopLevelDestination.kt | 28 ------- .../navigator/OrbitBottomNavigationBar.kt | 78 ------------------- .../java/com/yapp/navigator/OrbitNavHost.kt | 12 +-- .../java/com/yapp/splash/SplashViewModel.kt | 4 +- 6 files changed, 4 insertions(+), 154 deletions(-) delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/destination/TopLevelDestination.kt delete mode 100644 feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index c856674a..172673ac 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -14,4 +14,5 @@ dependencies { implementation(projects.core.designsystem) implementation(libs.compose.navigation) implementation(libs.hilt.navigation.compose) + implementation(libs.kotlinx.serialization.json) } diff --git a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt index e465ab6f..295d3ce2 100644 --- a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt +++ b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt @@ -2,29 +2,15 @@ package com.yapp.common.navigation import androidx.compose.runtime.Composable import androidx.compose.runtime.remember -import androidx.navigation.NavDestination import androidx.navigation.NavHostController -import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController -import androidx.navigation.navOptions -import com.yapp.common.navigation.destination.HomeDestination import com.yapp.common.navigation.destination.SplashDestination -import com.yapp.common.navigation.destination.TopLevelDestination class OrbitNavigator( val navController: NavHostController, ) { val startDestination = SplashDestination.Route.route - private val currentDestination: NavDestination? - @Composable get() = navController - .currentBackStackEntryAsState().value?.destination - - val currentTab: TopLevelDestination? - @Composable get() = currentDestination - ?.route - ?.let(TopLevelDestination.Companion::find) - fun navigateTo(route: String, popUpTo: String? = null, inclusive: Boolean = false) { navController.navigate(route) { popUpTo?.let { @@ -38,27 +24,6 @@ class OrbitNavigator( fun navigateBack() { navController.popBackStack() } - - fun navigateToTopLevelDestination(tab: TopLevelDestination) { - val navOptions = navOptions { - popUpTo(Routes.Home.ROUTE) { - saveState = true - } - launchSingleTop = true - restoreState = true - } - - when (tab) { - TopLevelDestination.HOME -> navController.navigate(Routes.Home.ROUTE, navOptions) - TopLevelDestination.MYPAGE -> navController.navigate(Routes.MyPage.ROUTE, navOptions) - } - } - - @Composable - fun shouldHaveNavigationBarsPadding(): Boolean { - val currentRoute = currentDestination?.route ?: return false - return currentRoute !in HomeDestination.Home.route - } } @Composable diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/TopLevelDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/TopLevelDestination.kt deleted file mode 100644 index 3a9fcc52..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/TopLevelDestination.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.yapp.common.navigation.destination - -import androidx.annotation.DrawableRes -import androidx.annotation.StringRes -import com.yapp.common.navigation.Routes - -enum class TopLevelDestination( - @DrawableRes val iconId: Int, - @StringRes val titleId: Int, - val route: String, -) { - HOME( - iconId = core.designsystem.R.drawable.ic_launcher_foreground, - titleId = core.designsystem.R.string.app_name, - route = Routes.Home.ROUTE, - ), - MYPAGE( - iconId = core.designsystem.R.drawable.ic_launcher_foreground, - titleId = core.designsystem.R.string.app_name, - route = Routes.MyPage.MYPAGE, - ), - ; - - companion object { - operator fun contains(route: String): Boolean = entries.any { it.route == route } - fun find(route: String): TopLevelDestination? = entries.find { it.route == route } - } -} diff --git a/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt b/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt deleted file mode 100644 index 60d481ba..00000000 --- a/feature/navigator/src/main/java/com/yapp/navigator/OrbitBottomNavigationBar.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.yapp.navigator - -import androidx.annotation.DrawableRes -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.height -import androidx.compose.material3.HorizontalDivider -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.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp -import com.yapp.common.navigation.destination.TopLevelDestination -import kotlinx.collections.immutable.ImmutableList - -@Composable -internal fun OrbitBottomNavigationBar( - modifier: Modifier = Modifier, - visible: Boolean, - currentTab: TopLevelDestination?, - entries: ImmutableList, - onClickItem: (TopLevelDestination) -> Unit, -) { - AnimatedVisibility(visible = visible) { - Column { - HorizontalDivider(color = Color.Black, thickness = 1.dp) - Row( - modifier = Modifier - .height(56.dp) - .background(color = Color.White), - ) { - entries.forEach { tab -> - NavItem( - selected = tab == currentTab, - label = stringResource(id = tab.titleId), - iconId = tab.iconId, - onClick = { onClickItem(tab) }, - ) - } - } - } - } -} - -@Composable -fun RowScope.NavItem( - modifier: Modifier = Modifier, - selected: Boolean, - label: String, - @DrawableRes iconId: Int, - onClick: () -> Unit, -) { - Column( - modifier = modifier - .weight(1f) - .fillMaxHeight() - .clickable(onClick = onClick), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - ) { - Icon( - painter = painterResource(id = iconId), - contentDescription = label, - tint = if (selected) Color.Blue else Color.Gray, - ) - Text(text = label, color = if (selected) Color.Blue else Color.Black) - } -} diff --git a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt index 6fe6b82a..40be6215 100644 --- a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt +++ b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt @@ -19,7 +19,6 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import com.yapp.common.navigation.OrbitNavigator import com.yapp.common.navigation.destination.SplashDestination -import com.yapp.common.navigation.destination.TopLevelDestination import com.yapp.common.navigation.rememberOrbitNavigator import com.yapp.designsystem.theme.OrbitTheme import com.yapp.fortune.fortuneNavGraph @@ -31,7 +30,6 @@ import com.yapp.splash.SplashRoute import com.yapp.ui.component.snackbar.CustomSnackBarVisuals import com.yapp.ui.component.snackbar.OrbitSnackBar import com.yapp.webview.webViewNavGraph -import kotlinx.collections.immutable.toImmutableList @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable @@ -43,14 +41,6 @@ internal fun OrbitNavHost( Scaffold( modifier = modifier, - bottomBar = { - OrbitBottomNavigationBar( - visible = false, - currentTab = navigator.currentTab, - entries = TopLevelDestination.entries.toImmutableList(), - onClickItem = navigator::navigateToTopLevelDestination, - ) - }, snackbarHost = { OrbitSnackBarHost(snackBarHostState = snackBarHostState) }, @@ -66,7 +56,7 @@ internal fun OrbitNavHost( } onboardingNavGraph( navigator = navigator, - onFinishOnboarding = { navigator.navigateToTopLevelDestination(TopLevelDestination.HOME) }, + onFinishOnboarding = { }, ) homeNavGraph( navigator = navigator, diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt b/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt index 93649d48..201acd55 100644 --- a/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt +++ b/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt @@ -1,8 +1,8 @@ package com.yapp.splash import androidx.lifecycle.viewModelScope +import com.yapp.common.navigation.destination.HomeDestination import com.yapp.common.navigation.destination.OnboardingDestination -import com.yapp.common.navigation.destination.TopLevelDestination import com.yapp.datastore.UserPreferences import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel @@ -41,7 +41,7 @@ class SplashViewModel @Inject constructor( Pair(userId, onboardingCompleted) }.collect { (userId, onboardingCompleted) -> val destination = if (userId != null && onboardingCompleted) { - TopLevelDestination.HOME.route + HomeDestination.Home.route } else { OnboardingDestination.Route.route } From a964be04f0998df6fe023be12840b07c5999c9cf Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 3 Jun 2025 19:58:54 +0900 Subject: [PATCH 202/210] =?UTF-8?q?[REFACTOR/#212]=20KClass=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EB=9D=BC=EC=9A=B0=ED=8A=B8?= =?UTF-8?q?=EB=A5=BC=20@Serializable=20=EA=B8=B0=EB=B0=98=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/common/navigation/JsonNavType.kt | 18 ------ .../java/com/yapp/common/navigation/Routes.kt | 62 ------------------- .../AlarmInteractionDestination.kt | 9 --- .../destination/FortuneDestination.kt | 13 ---- .../navigation/destination/HomeDestination.kt | 9 --- .../destination/MissionDestination.kt | 8 --- .../destination/MyPageDestination.kt | 8 --- .../destination/OnboardingDestination.kt | 24 ------- .../destination/SettingDestination.kt | 14 ----- .../destination/SplashDestination.kt | 7 --- .../destination/WebViewDestination.kt | 8 --- .../navigation/route/AlarmInteractionRoute.kt | 18 ++++++ .../common/navigation/route/FortuneRoute.kt | 14 +++++ .../yapp/common/navigation/route/HomeRoute.kt | 14 +++++ .../common/navigation/route/MissionRoute.kt | 6 ++ .../navigation/route/OnboardingRoute.kt | 55 ++++++++++++++++ .../common/navigation/route/SettingRoute.kt | 18 ++++++ .../common/navigation/route/SplashRoute.kt | 6 ++ .../common/navigation/route/WebViewRoute.kt | 6 ++ .../java/com/yapp/webview/WebViewNavGraph.kt | 27 -------- 20 files changed, 137 insertions(+), 207 deletions(-) delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/JsonNavType.kt delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/Routes.kt delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/destination/AlarmInteractionDestination.kt delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/destination/FortuneDestination.kt delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/destination/HomeDestination.kt delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/destination/MyPageDestination.kt delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/destination/OnboardingDestination.kt delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/destination/SettingDestination.kt delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/destination/SplashDestination.kt delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/destination/WebViewDestination.kt create mode 100644 core/common/src/main/java/com/yapp/common/navigation/route/AlarmInteractionRoute.kt create mode 100644 core/common/src/main/java/com/yapp/common/navigation/route/FortuneRoute.kt create mode 100644 core/common/src/main/java/com/yapp/common/navigation/route/HomeRoute.kt create mode 100644 core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt create mode 100644 core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt create mode 100644 core/common/src/main/java/com/yapp/common/navigation/route/SettingRoute.kt create mode 100644 core/common/src/main/java/com/yapp/common/navigation/route/SplashRoute.kt create mode 100644 core/common/src/main/java/com/yapp/common/navigation/route/WebViewRoute.kt delete mode 100644 feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt diff --git a/core/common/src/main/java/com/yapp/common/navigation/JsonNavType.kt b/core/common/src/main/java/com/yapp/common/navigation/JsonNavType.kt deleted file mode 100644 index 4cc9ac3f..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/JsonNavType.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.yapp.common.navigation - -import android.os.Bundle -import androidx.navigation.NavType - -abstract class JsonNavType : NavType(isNullableAllowed = false) { - abstract fun fromJsonParse(value: String): T - abstract fun T.getJsonParse(): String - - override fun get(bundle: Bundle, key: String): T? = - bundle.getString(key)?.let { parseValue(it) } - - override fun parseValue(value: String): T = fromJsonParse(value) - - override fun put(bundle: Bundle, key: String, value: T) { - bundle.putString(key, value.getJsonParse()) - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/Routes.kt b/core/common/src/main/java/com/yapp/common/navigation/Routes.kt deleted file mode 100644 index d8fcb620..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/Routes.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.yapp.common.navigation - -object Routes { - object Onboarding { - const val ROUTE = "onboarding_route" - const val EXPLAIN = "onboarding_explain" - const val ALARM_TIME_SELECTION = "onboarding_alarm_time_selection" - const val BIRTHDAY = "onboarding_birthday" - const val TIME_OF_BIRTH = "onboarding_time_of_birth" - const val NAME = "onboarding_name" - const val GENDER = "onboarding_gender" - const val ACCESS = "onboarding_access" - const val COMPLETE_FIRST = "onboarding_complete_first" - const val COMPLETE_SECOND = "onboarding_complete_second" - } - - object Home { - const val ROUTE = "home_route" - const val HOME = "home" - const val ALARM_ADD_EDIT = "alarm_add_edit" - } - - object AlarmInteraction { - const val ROUTE = "alarm_interaction_route" - const val ALARM_ACTION = "alarm_action" - const val ALARM_SNOOZE_TIMER = "alarm_snooze_timer" - } - - object MyPage { - const val ROUTE = "mypage_route" - const val MYPAGE = "mypage" - } - - object Mission { - const val ROUTE = "mission_route" - const val MISSION = "mission_main" - const val PROGRESS = "mission_progress" - } - - object Fortune { - const val ROUTE = "fortune_route" - const val FORTUNE = "fortune_main" - const val REWARD = "fortune_reward" - } - - object Setting { - const val ROUTE = "setting_route" - const val SETTING = "setting_main" - const val EDIT_PROFILE = "setting_edit_profile" - const val EDIT_BIRTHDAY = "setting_edit_birthday" - } - - object Splash { - const val ROUTE = "splash_route" - const val SPLASH = "splash" - } - - object WebView { - const val ROUTE = "webview_route" - const val WEBVIEW = "webview" - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/AlarmInteractionDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/AlarmInteractionDestination.kt deleted file mode 100644 index 47b8d731..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/AlarmInteractionDestination.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class AlarmInteractionDestination(val route: String) { - data object Route : AlarmInteractionDestination(Routes.AlarmInteraction.ROUTE) - data object AlarmAction : HomeDestination(Routes.AlarmInteraction.ALARM_ACTION) - data object AlarmSnoozeTimer : HomeDestination(Routes.AlarmInteraction.ALARM_SNOOZE_TIMER) -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/FortuneDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/FortuneDestination.kt deleted file mode 100644 index 808c3f62..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/FortuneDestination.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class FortuneDestination(val route: String) { - data object Route : FortuneDestination(Routes.Fortune.ROUTE) - data object Fortune : FortuneDestination(Routes.Fortune.FORTUNE) - data object Reward : FortuneDestination(Routes.Fortune.REWARD) - - companion object { - val routes = listOf(Fortune, Reward) - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/HomeDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/HomeDestination.kt deleted file mode 100644 index 81a71aed..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/HomeDestination.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class HomeDestination(val route: String) { - data object Route : HomeDestination(Routes.Home.ROUTE) - data object Home : HomeDestination(Routes.Home.HOME) - data object AlarmAddEdit : HomeDestination(Routes.Home.ALARM_ADD_EDIT) -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt deleted file mode 100644 index 3366da3d..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/MissionDestination.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class MissionDestination(val route: String) { - data object Route : MissionDestination(Routes.Mission.ROUTE) - data object Mission : MissionDestination(Routes.Mission.MISSION) -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/MyPageDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/MyPageDestination.kt deleted file mode 100644 index 9ccb7d9c..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/MyPageDestination.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class MyPageDestination(val route: String) { - data object Route : MyPageDestination(Routes.MyPage.ROUTE) - data object MyPage : MyPageDestination(Routes.MyPage.MYPAGE) -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/OnboardingDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/OnboardingDestination.kt deleted file mode 100644 index 89c4afe8..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/OnboardingDestination.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class OnboardingDestination(val route: String) { - data object Route : OnboardingDestination(Routes.Onboarding.ROUTE) - data object Explain : OnboardingDestination(Routes.Onboarding.EXPLAIN) - data object AlarmTimeSelection : OnboardingDestination(Routes.Onboarding.ALARM_TIME_SELECTION) - data object Birthday : OnboardingDestination(Routes.Onboarding.BIRTHDAY) - data object TimeOfBirth : OnboardingDestination(Routes.Onboarding.TIME_OF_BIRTH) - data object Name : OnboardingDestination(Routes.Onboarding.NAME) - data object Gender : OnboardingDestination(Routes.Onboarding.GENDER) - data object Access : OnboardingDestination(Routes.Onboarding.ACCESS) - data object Complete1 : OnboardingDestination(Routes.Onboarding.COMPLETE_FIRST) - data object Complete2 : OnboardingDestination(Routes.Onboarding.COMPLETE_SECOND) - - companion object { - val routes = listOf(Explain, AlarmTimeSelection, Birthday, TimeOfBirth, Name, Gender, Access, Complete1, Complete2) - - fun nextRoute(currentStep: Int): String? { - return routes.getOrNull(currentStep)?.route - } - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/SettingDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/SettingDestination.kt deleted file mode 100644 index 0b1f8e8f..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/SettingDestination.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class SettingDestination(val route: String) { - data object Route : SettingDestination(Routes.Setting.ROUTE) - data object Setting : SettingDestination(Routes.Setting.SETTING) - data object EditProfile : SettingDestination(Routes.Setting.EDIT_PROFILE) - data object EditBirthday : SettingDestination(Routes.Setting.EDIT_BIRTHDAY) - - companion object { - val routes = listOf(Setting, EditProfile, EditBirthday) - } -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/SplashDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/SplashDestination.kt deleted file mode 100644 index 9ea3934f..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/SplashDestination.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class SplashDestination(val route: String) { - data object Route : SplashDestination(Routes.Splash.ROUTE) -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/destination/WebViewDestination.kt b/core/common/src/main/java/com/yapp/common/navigation/destination/WebViewDestination.kt deleted file mode 100644 index 9533099b..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/destination/WebViewDestination.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.yapp.common.navigation.destination - -import com.yapp.common.navigation.Routes - -sealed class WebViewDestination(val route: String) { - object Route : WebViewDestination(Routes.WebView.ROUTE) - object WebView : WebViewDestination(Routes.WebView.WEBVIEW) -} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/AlarmInteractionRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/AlarmInteractionRoute.kt new file mode 100644 index 00000000..21310ba9 --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/AlarmInteractionRoute.kt @@ -0,0 +1,18 @@ +package com.yapp.common.navigation.route + +import com.yapp.domain.model.Alarm +import kotlinx.serialization.Serializable + +@Serializable +data object AlarmInteractionBaseRoute + +sealed interface AlarmInteractionDestination { + @Serializable + data object Route : AlarmInteractionDestination + + @Serializable + data class AlarmAction(val alarm: Alarm) : AlarmInteractionDestination + + @Serializable + data class AlarmSnoozeTimer(val alarm: Alarm) : AlarmInteractionDestination +} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/FortuneRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/FortuneRoute.kt new file mode 100644 index 00000000..c581c8ed --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/FortuneRoute.kt @@ -0,0 +1,14 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data object FortuneBaseRoute + +sealed interface FortuneDestination { + @Serializable + data object Fortune : FortuneDestination + + @Serializable + data object Reward : FortuneDestination +} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/HomeRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/HomeRoute.kt new file mode 100644 index 00000000..04b8b4da --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/HomeRoute.kt @@ -0,0 +1,14 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data object HomeBaseRoute + +sealed interface HomeDestination { + @Serializable + data object Route : HomeDestination + + @Serializable + data class AlarmAddEdit(val alarmId: Long? = null) : HomeDestination +} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt new file mode 100644 index 00000000..d5a04949 --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/MissionRoute.kt @@ -0,0 +1,6 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data object MissionRoute diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt new file mode 100644 index 00000000..52f0bb5b --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt @@ -0,0 +1,55 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable +import kotlin.reflect.KClass + +@Serializable +data object OnboardingBaseRoute + +sealed interface OnboardingDestination { + @Serializable + data object Explain : OnboardingDestination + + @Serializable + data object AlarmTimeSelection : OnboardingDestination + + @Serializable + data object Birthday : OnboardingDestination + + @Serializable + data object TimeOfBirth : OnboardingDestination + + @Serializable + data object Name : OnboardingDestination + + @Serializable + data object Gender : OnboardingDestination + + @Serializable + data object Access : OnboardingDestination + + @Serializable + data object Complete1 : OnboardingDestination + + @Serializable + data object Complete2 : OnboardingDestination + + companion object { + val routes: List> = listOf( + Explain::class, + AlarmTimeSelection::class, + Birthday::class, + TimeOfBirth::class, + Name::class, + Gender::class, + Access::class, + Complete1::class, + Complete2::class, + ) + + fun nextRoute(currentStep: Int): KClass? { + val nextRoute = routes.getOrNull(currentStep) + return nextRoute + } + } +} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/SettingRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/SettingRoute.kt new file mode 100644 index 00000000..9246eed0 --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/SettingRoute.kt @@ -0,0 +1,18 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data object SettingBaseRoute + +@Serializable +sealed interface SettingDestination { + @Serializable + data object Setting : SettingDestination + + @Serializable + data object EditProfile : SettingDestination + + @Serializable + data object EditBirthday : SettingDestination +} diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/SplashRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/SplashRoute.kt new file mode 100644 index 00000000..81724c65 --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/SplashRoute.kt @@ -0,0 +1,6 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data object SplashRoute diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/WebViewRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/WebViewRoute.kt new file mode 100644 index 00000000..9ced251c --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/route/WebViewRoute.kt @@ -0,0 +1,6 @@ +package com.yapp.common.navigation.route + +import kotlinx.serialization.Serializable + +@Serializable +data class WebViewRoute(val url: String) diff --git a/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt b/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt deleted file mode 100644 index 039cbcd8..00000000 --- a/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.yapp.webview - -import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavType -import androidx.navigation.compose.composable -import androidx.navigation.navArgument -import androidx.navigation.navigation -import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.WebViewDestination - -fun NavGraphBuilder.webViewNavGraph(navigator: OrbitNavigator) { - navigation( - route = WebViewDestination.Route.route, - startDestination = WebViewDestination.WebView.route, - ) { - composable( - route = "${WebViewDestination.WebView.route}/{url}", - arguments = listOf(navArgument("url") { type = NavType.StringType }), - ) { backStackEntry -> - val url = backStackEntry.arguments?.getString("url") ?: "" - WebViewRoute( - url = url, - navController = navigator.navController, - ) - } - } -} From 5fa74fdafae63e37e4a2603c26898d8d00219fe8 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 3 Jun 2025 20:06:43 +0900 Subject: [PATCH 203/210] =?UTF-8?q?[REFACTOR/#212]=20KClass=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20=EB=9D=BC=EC=9A=B0=ED=8C=85=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/common/build.gradle.kts | 1 + .../yapp/common/navigation/OrbitNavigator.kt | 82 ++++++-- domain/build.gradle.kts | 1 + .../main/java/com/yapp/domain/model/Alarm.kt | 2 + .../interaction/AlarmInteractionNavGraph.kt | 73 +++++--- .../java/com/yapp/fortune/FortuneNavGraph.kt | 105 ++++++----- .../main/java/com/yapp/home/HomeNavGraph.kt | 22 +-- .../java/com/yapp/mission/MissionNavGraph.kt | 60 +++--- .../java/com/yapp/navigator/OrbitNavHost.kt | 21 +-- .../com/yapp/onboarding/OnboardingNavGraph.kt | 152 ++++++++++----- .../java/com/yapp/setting/SettingNavGraph.kt | 177 +++++++++--------- .../java/com/yapp/splash/SettingNavGraph.kt | 14 ++ .../java/com/yapp/webview/WebViewNavGraph.kt | 19 ++ 13 files changed, 440 insertions(+), 289 deletions(-) create mode 100644 feature/splash/src/main/java/com/yapp/splash/SettingNavGraph.kt create mode 100644 feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index 172673ac..a01d2fa2 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -12,6 +12,7 @@ android { dependencies { implementation(projects.core.designsystem) + implementation(projects.domain) implementation(libs.compose.navigation) implementation(libs.hilt.navigation.compose) implementation(libs.kotlinx.serialization.json) diff --git a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt index 295d3ce2..92e20cb5 100644 --- a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt +++ b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt @@ -3,22 +3,82 @@ package com.yapp.common.navigation import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.navigation.NavHostController +import androidx.navigation.NavOptions import androidx.navigation.compose.rememberNavController -import com.yapp.common.navigation.destination.SplashDestination +import com.yapp.common.navigation.extensions.toRoute +import com.yapp.common.navigation.route.AlarmInteractionDestination +import com.yapp.common.navigation.route.FortuneBaseRoute +import com.yapp.common.navigation.route.FortuneDestination +import com.yapp.common.navigation.route.HomeBaseRoute +import com.yapp.common.navigation.route.HomeDestination +import com.yapp.common.navigation.route.OnboardingBaseRoute +import com.yapp.common.navigation.route.OnboardingDestination +import com.yapp.common.navigation.route.SettingBaseRoute +import com.yapp.common.navigation.route.SettingDestination +import com.yapp.common.navigation.route.SplashRoute +import com.yapp.common.navigation.route.WebViewRoute +import com.yapp.domain.model.Alarm class OrbitNavigator( val navController: NavHostController, ) { - val startDestination = SplashDestination.Route.route - - fun navigateTo(route: String, popUpTo: String? = null, inclusive: Boolean = false) { - navController.navigate(route) { - popUpTo?.let { - popUpTo(it) { this.inclusive = inclusive } - } - launchSingleTop = true - restoreState = true - } + val startDestination = SplashRoute + + fun navigateToOnboarding(navOptions: NavOptions? = null) { + navController.navigate(OnboardingBaseRoute, navOptions) + } + + fun navigateToOnboardingNextStep(navOptions: NavOptions? = null) { + val currentRoute = navController.currentBackStackEntry?.destination?.route ?: return + + val currentIndex = OnboardingDestination.routes.indexOfFirst { it.toRoute() == currentRoute } + val nextRouteClass = OnboardingDestination.nextRoute(currentIndex + 1) ?: return + + navController.navigate(nextRouteClass, navOptions) + } + + fun navigateToAddAlarm(navOptions: NavOptions? = null) { + navController.navigate(HomeDestination.AlarmAddEdit(-1), navOptions) + } + + fun navigateToEditAlarm(alarmId: Long, navOptions: NavOptions? = null) { + navController.navigate(HomeDestination.AlarmAddEdit(alarmId), navOptions) + } + + fun navigateToHome(navOptions: NavOptions? = null) { + navController.navigate(HomeBaseRoute, navOptions) + } + + fun navigateToAlarmAction(alarm: Alarm, navOptions: NavOptions? = null) { + navController.navigate(AlarmInteractionDestination.AlarmAction(alarm), navOptions) + } + + fun navigateToAlarmSnoozeTimer(alarm: Alarm, navOptions: NavOptions? = null) { + navController.navigate(AlarmInteractionDestination.AlarmSnoozeTimer(alarm), navOptions) + } + + fun navigateToFortune(navOptions: NavOptions? = null) { + navController.navigate(FortuneBaseRoute, navOptions) + } + + fun navigateToFortuneReward(navOptions: NavOptions? = null) { + navController.navigate(FortuneDestination.Reward, navOptions) + } + + fun navigateToSetting(navOptions: NavOptions? = null) { + navController.navigate(SettingBaseRoute, navOptions) + } + + fun navigateToEditProfile(navOptions: NavOptions? = null) { + navController.navigate(SettingDestination.EditProfile, navOptions) + } + + fun navigateToEditBirthDay(navOptions: NavOptions? = null) { + navController.navigate(SettingDestination.EditBirthday, navOptions) + } + + fun navigateToWebView(url: String, navOptions: NavOptions? = null) { + navController.navigate(WebViewRoute(url), navOptions) } fun navigateBack() { diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index de2c4bb0..a9c80e75 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -11,4 +11,5 @@ android { dependencies { implementation(libs.gson) + implementation(libs.kotlinx.serialization.json) } diff --git a/domain/src/main/java/com/yapp/domain/model/Alarm.kt b/domain/src/main/java/com/yapp/domain/model/Alarm.kt index c3cf50ba..9e05ffca 100644 --- a/domain/src/main/java/com/yapp/domain/model/Alarm.kt +++ b/domain/src/main/java/com/yapp/domain/model/Alarm.kt @@ -5,8 +5,10 @@ import android.os.Parcelable import com.google.gson.Gson import com.google.gson.reflect.TypeToken import kotlinx.parcelize.Parcelize +import kotlinx.serialization.Serializable @Parcelize +@Serializable data class Alarm( val id: Long = 0, diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt index d87492e6..312ce293 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt @@ -1,56 +1,75 @@ package com.yapp.alarm.interaction +import android.os.Bundle +import androidx.compose.runtime.LaunchedEffect import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavType import androidx.navigation.compose.composable -import androidx.navigation.navArgument +import androidx.navigation.navOptions import androidx.navigation.navigation import com.google.gson.Gson import com.yapp.alarm.interaction.action.AlarmActionRoute import com.yapp.alarm.interaction.snooze.AlarmSnoozeTimerRoute -import com.yapp.common.navigation.JsonNavType import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.AlarmInteractionDestination +import com.yapp.common.navigation.route.AlarmInteractionBaseRoute +import com.yapp.common.navigation.route.AlarmInteractionDestination import com.yapp.domain.model.Alarm +import kotlin.reflect.typeOf -class AlarmArgType : JsonNavType() { - override fun fromJsonParse(value: String): Alarm { - return Gson().fromJson(value, Alarm::class.java) +val AlarmArgType = object : NavType(isNullableAllowed = false) { + override fun get(bundle: Bundle, key: String): Alarm? { + return bundle.getString(key)?.let { Alarm.fromJson(it) } } - override fun Alarm.getJsonParse(): String { - return Gson().toJson(this) + override fun parseValue(value: String): Alarm { + return Alarm.fromJson(value) + } + + override fun put(bundle: Bundle, key: String, value: Alarm) { + bundle.putString(key, Gson().toJson(value)) } } fun NavGraphBuilder.alarmInteractionNavGraph( navigator: OrbitNavigator, + alarm: Alarm?, ) { - navigation( - route = AlarmInteractionDestination.Route.route, - startDestination = "${AlarmInteractionDestination.AlarmAction.route}/{alarm}", + navigation( + startDestination = AlarmInteractionDestination.Route, ) { - composable( - route = "${AlarmInteractionDestination.AlarmAction.route}/{alarm}", - arguments = listOf( - navArgument("alarm") { - type = AlarmArgType() - defaultValue = Alarm() - }, - ), + composable { + LaunchedEffect(Unit) { + alarm?.let { + navigator.navigateToAlarmAction( + it, + navOptions { + popUpTo(AlarmInteractionBaseRoute) { + inclusive = true + } + }, + ) + } ?: run { + navigator.navigateToHome( + navOptions { + popUpTo(AlarmInteractionBaseRoute) { + inclusive = true + } + }, + ) + } + } + } + + composable( + typeMap = mapOf(typeOf() to AlarmArgType), ) { AlarmActionRoute( navigator = navigator, ) } - composable( - route = "${AlarmInteractionDestination.AlarmSnoozeTimer.route}/{alarm}", - arguments = listOf( - navArgument("alarm") { - type = AlarmArgType() - defaultValue = Alarm() - }, - ), + composable( + typeMap = mapOf(typeOf() to AlarmArgType), ) { AlarmSnoozeTimerRoute( navigator = navigator, diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt index 86f87fee..5f1b5133 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneNavGraph.kt @@ -1,77 +1,94 @@ package com.yapp.fortune import androidx.compose.material3.SnackbarHostState -import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.rememberCoroutineScope import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import androidx.navigation.navOptions import androidx.navigation.navigation import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.FortuneDestination import com.yapp.common.navigation.extensions.sharedHiltViewModel +import com.yapp.common.navigation.route.FortuneBaseRoute +import com.yapp.common.navigation.route.FortuneDestination import com.yapp.ui.component.snackbar.showCustomSnackBar +import kotlinx.coroutines.CoroutineScope fun NavGraphBuilder.fortuneNavGraph( navigator: OrbitNavigator, snackBarHostState: SnackbarHostState, ) { - navigation( - route = FortuneDestination.Route.route, - startDestination = FortuneDestination.Fortune.route, - ) { - FortuneDestination.routes.forEach { destination -> - composable(destination.route) { backStackEntry -> - val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) - val coroutineScope = rememberCoroutineScope() + navigation(startDestination = FortuneDestination.Fortune) { + composable { backStackEntry -> + val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) + val coroutineScope = rememberCoroutineScope() - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> - when (sideEffect) { - is FortuneContract.SideEffect.Navigate -> navigator.navigateTo( - route = sideEffect.route, - popUpTo = sideEffect.popUpTo, - inclusive = sideEffect.inclusive, - ) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collect { sideEffect -> + handleSideEffect(sideEffect, navigator, snackBarHostState, coroutineScope) + } + } - FortuneContract.SideEffect.NavigateBack -> navigator.navigateBack() + FortuneRoute( + viewModel = viewModel, + navigator = navigator, + ) + } - is FortuneContract.SideEffect.ShowSnackBar -> showCustomSnackBar( - scope = coroutineScope, - snackBarHostState = snackBarHostState, - message = sideEffect.message, - actionLabel = sideEffect.label, - iconRes = sideEffect.iconRes, - bottomPadding = sideEffect.bottomPadding, - durationMillis = sideEffect.durationMillis, - onDismiss = sideEffect.onDismiss, - onAction = sideEffect.onAction, - ) - } - } - } + composable { backStackEntry -> + val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) + val coroutineScope = rememberCoroutineScope() - when (destination) { - FortuneDestination.Fortune -> FortuneRoute( - viewModel = viewModel, - navigator = navigator, - ) - FortuneDestination.Reward -> FortuneRewardRoute(viewModel) - else -> {} + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collect { sideEffect -> + handleSideEffect(sideEffect, navigator, snackBarHostState, coroutineScope) } } + + FortuneRewardRoute( + viewModel = viewModel, + ) } } } -@Composable -private fun handleFortuneSideEffect( +private suspend fun handleSideEffect( sideEffect: FortuneContract.SideEffect, navigator: OrbitNavigator, snackBarHostState: SnackbarHostState, + coroutineScope: CoroutineScope, ) { - val coroutineScope = rememberCoroutineScope() + when (sideEffect) { + FortuneContract.SideEffect.NavigateToFortuneReward -> { + navigator.navigateToFortuneReward( + navOptions = navOptions { + popUpTo(FortuneDestination.Fortune) { + inclusive = true + } + }, + ) + } + + FortuneContract.SideEffect.NavigateToHome -> navigator.navigateToHome( + navOptions = navOptions { + popUpTo(FortuneBaseRoute) { + inclusive = true + } + }, + ) + + FortuneContract.SideEffect.NavigateBack -> navigator.navigateBack() - LaunchedEffect(sideEffect) { + is FortuneContract.SideEffect.ShowSnackBar -> showCustomSnackBar( + scope = coroutineScope, + snackBarHostState = snackBarHostState, + message = sideEffect.message, + actionLabel = sideEffect.label, + iconRes = sideEffect.iconRes, + bottomPadding = sideEffect.bottomPadding, + durationMillis = sideEffect.durationMillis, + onDismiss = sideEffect.onDismiss, + onAction = sideEffect.onAction, + ) } } diff --git a/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt b/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt index ec43adbe..b044e9de 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeNavGraph.kt @@ -2,13 +2,12 @@ package com.yapp.home import androidx.compose.material3.SnackbarHostState import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavType import androidx.navigation.compose.composable import androidx.navigation.compose.navigation -import androidx.navigation.navArgument import com.yapp.alarm.addedit.AlarmAddEditRoute import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.HomeDestination +import com.yapp.common.navigation.route.HomeBaseRoute +import com.yapp.common.navigation.route.HomeDestination const val ADD_ALARM_RESULT_KEY = "addAlarmResult" const val UPDATE_ALARM_RESULT_KEY = "updateAlarmResult" @@ -18,26 +17,17 @@ fun NavGraphBuilder.homeNavGraph( navigator: OrbitNavigator, snackBarHostState: SnackbarHostState, ) { - navigation( - route = HomeDestination.Route.route, - startDestination = HomeDestination.Home.route, + navigation( + startDestination = HomeDestination.Route, ) { - composable(route = HomeDestination.Home.route) { + composable { HomeRoute( navigator = navigator, snackBarHostState = snackBarHostState, ) } - composable( - route = "${HomeDestination.AlarmAddEdit.route}?id={alarmId}", - arguments = listOf( - navArgument("alarmId") { - type = NavType.LongType - defaultValue = -1 - }, - ), - ) { + composable { AlarmAddEditRoute( navigator = navigator, snackBarHostState = snackBarHostState, diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt index 076a59a6..a24f0545 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionNavGraph.kt @@ -4,51 +4,41 @@ import androidx.compose.runtime.LaunchedEffect import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import androidx.navigation.navDeepLink -import androidx.navigation.navigation +import androidx.navigation.navOptions import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.MissionDestination import com.yapp.common.navigation.extensions.sharedHiltViewModel +import com.yapp.common.navigation.route.MissionRoute -fun NavGraphBuilder.missionNavGraph( +fun NavGraphBuilder.missionScreen( navigator: OrbitNavigator, ) { - navigation( - route = MissionDestination.Route.route, - startDestination = MissionDestination.Mission.route, + composable( + deepLinks = listOf( + navDeepLink { + uriPattern = "orbitapp://mission?notificationId={notificationId}" + }, + ), ) { - composable( - route = MissionDestination.Mission.route, - deepLinks = listOf( - navDeepLink { - uriPattern = "orbitapp://mission?notificationId={notificationId}" - }, - ), - ) { backStackEntry -> - val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) + val viewModel = it.sharedHiltViewModel(navigator.navController) - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> - handleMissionSideEffect(sideEffect, navigator, viewModel) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collect { sideEffect -> + when (sideEffect) { + MissionContract.SideEffect.NavigateToFortune -> { + navigator.navigateToFortune( + navOptions = navOptions { + popUpTo(MissionRoute) { + inclusive = true + } + }, + ) + } + + MissionContract.SideEffect.NavigateBack -> navigator.navigateBack() } } - - MissionRoute(viewModel) } - } -} - -private fun handleMissionSideEffect( - sideEffect: MissionContract.SideEffect, - navigator: OrbitNavigator, - viewModel: MissionViewModel, -) { - when (sideEffect) { - is MissionContract.SideEffect.Navigate -> navigator.navigateTo( - route = sideEffect.route, - popUpTo = sideEffect.popUpTo, - inclusive = sideEffect.inclusive, - ) - MissionContract.SideEffect.NavigateBack -> navigator.navigateBack() + MissionRoute(viewModel) } } diff --git a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt index 40be6215..082c2ca5 100644 --- a/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt +++ b/feature/navigator/src/main/java/com/yapp/navigator/OrbitNavHost.kt @@ -16,20 +16,18 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.SplashDestination import com.yapp.common.navigation.rememberOrbitNavigator import com.yapp.designsystem.theme.OrbitTheme import com.yapp.fortune.fortuneNavGraph import com.yapp.home.homeNavGraph -import com.yapp.mission.missionNavGraph +import com.yapp.mission.missionScreen import com.yapp.onboarding.onboardingNavGraph import com.yapp.setting.settingNavGraph -import com.yapp.splash.SplashRoute +import com.yapp.splash.splashScreen import com.yapp.ui.component.snackbar.CustomSnackBarVisuals import com.yapp.ui.component.snackbar.OrbitSnackBar -import com.yapp.webview.webViewNavGraph +import com.yapp.webview.webViewScreen @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable @@ -51,24 +49,19 @@ internal fun OrbitNavHost( startDestination = navigator.startDestination, modifier = Modifier.navigationBarsPadding(), ) { - composable(SplashDestination.Route.route) { - SplashRoute(navigator) - } - onboardingNavGraph( - navigator = navigator, - onFinishOnboarding = { }, - ) + splashScreen(navigator = navigator) + onboardingNavGraph(navigator = navigator) homeNavGraph( navigator = navigator, snackBarHostState = snackBarHostState, ) - missionNavGraph(navigator = navigator) + missionScreen(navigator = navigator) fortuneNavGraph( navigator = navigator, snackBarHostState = snackBarHostState, ) settingNavGraph(navigator = navigator) - webViewNavGraph(navigator = navigator) + webViewScreen(navigator = navigator) } } } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt index 903c1c30..fd669d65 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt @@ -4,61 +4,106 @@ import android.net.Uri import androidx.compose.runtime.LaunchedEffect import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import androidx.navigation.navOptions import androidx.navigation.navigation import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.OnboardingDestination -import com.yapp.common.navigation.destination.WebViewDestination import com.yapp.common.navigation.extensions.sharedHiltViewModel +import com.yapp.common.navigation.route.OnboardingBaseRoute +import com.yapp.common.navigation.route.OnboardingDestination import kotlinx.coroutines.flow.collectLatest fun NavGraphBuilder.onboardingNavGraph( navigator: OrbitNavigator, - onFinishOnboarding: () -> Unit, ) { - navigation( - route = OnboardingDestination.Route.route, - startDestination = OnboardingDestination.Explain.route, - ) { - OnboardingDestination.routes.forEach { destination -> - composable(destination.route) { backStackEntry -> - val viewModel = backStackEntry.sharedHiltViewModel(navigator.navController) + navigation(startDestination = OnboardingDestination.Explain) { + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingExplainRoute(viewModel) + } - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collectLatest { sideEffect -> - handleSideEffect(sideEffect, navigator, viewModel, onFinishOnboarding) - } + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) } + } + OnboardingAlarmTimeSelectionRoute(viewModel) + } - when (destination) { - OnboardingDestination.Route, OnboardingDestination.Explain -> { - OnboardingExplainRoute(viewModel) - } - OnboardingDestination.AlarmTimeSelection -> { - OnboardingAlarmTimeSelectionRoute(viewModel) - } - OnboardingDestination.Birthday -> { - OnboardingBirthdayRoute(viewModel) - } - OnboardingDestination.TimeOfBirth -> { - OnboardingTimeOfBirthRoute(viewModel) - } - OnboardingDestination.Name -> { - OnboardingNameRoute(viewModel) - } - OnboardingDestination.Gender -> { - OnboardingGenderRoute(viewModel) - } - OnboardingDestination.Access -> { - OnboardingAccessRoute(viewModel) - } - OnboardingDestination.Complete1 -> { - OnboardingCompleteRoute(viewModel) - } - OnboardingDestination.Complete2 -> { - OnboardingCompleteRoute2(viewModel) - } + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingBirthdayRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingTimeOfBirthRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingNameRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingGenderRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingAccessRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) + } + } + OnboardingCompleteRoute(viewModel) + } + + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator, viewModel) } } + OnboardingCompleteRoute2(viewModel) } } } @@ -67,22 +112,29 @@ private fun handleSideEffect( sideEffect: OnboardingContract.SideEffect, navigator: OrbitNavigator, viewModel: OnboardingViewModel, - onFinishOnboarding: () -> Unit, ) { when (sideEffect) { - is OnboardingContract.SideEffect.Navigate -> navigator.navigateTo( - route = sideEffect.route, - popUpTo = sideEffect.popUpTo, - inclusive = sideEffect.inclusive, - ) + OnboardingContract.SideEffect.NavigateToNextStep -> { + navigator.navigateToOnboardingNextStep() + } + OnboardingContract.SideEffect.NavigateBack -> { viewModel.processAction(OnboardingContract.Action.Reset) navigator.navigateBack() } - OnboardingContract.SideEffect.OnboardingCompleted -> onFinishOnboarding() + + OnboardingContract.SideEffect.OnboardingCompleted -> { + navigator.navigateToHome( + navOptions = navOptions { + popUpTo(OnboardingBaseRoute) { + inclusive = true + } + }, + ) + } is OnboardingContract.SideEffect.OpenWebView -> { - navigator.navigateTo("${WebViewDestination.WebView.route}/${Uri.encode(sideEffect.url)}") + navigator.navigateToWebView(Uri.encode(sideEffect.url)) } } } diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt b/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt index dfaf89ea..054c523b 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingNavGraph.kt @@ -8,129 +8,122 @@ import androidx.compose.animation.slideOutVertically import androidx.compose.runtime.LaunchedEffect import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import androidx.navigation.navOptions import androidx.navigation.navigation import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.SettingDestination -import com.yapp.common.navigation.destination.WebViewDestination import com.yapp.common.navigation.extensions.sharedHiltViewModel -import com.yapp.ui.base.BaseViewModel +import com.yapp.common.navigation.route.SettingBaseRoute +import com.yapp.common.navigation.route.SettingDestination import kotlinx.coroutines.flow.collectLatest fun NavGraphBuilder.settingNavGraph( navigator: OrbitNavigator, ) { - navigation( - route = SettingDestination.Route.route, - startDestination = SettingDestination.Setting.route, + navigation( + startDestination = SettingDestination.Setting, ) { - SettingDestination.routes.forEach { destination -> - when (destination) { - SettingDestination.Setting -> { - composable(route = destination.route) { backStackEntry -> - val viewModel = - backStackEntry.sharedHiltViewModel(navigator.navController) + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collectLatest { sideEffect -> - handleSettingSideEffect(sideEffect, navigator, viewModel) - } - } - - SettingRoute(viewModel) - } + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator) } + } - SettingDestination.EditProfile -> { - composable(route = destination.route) { backStackEntry -> - val viewModel = - backStackEntry.sharedHiltViewModel(navigator.navController) + SettingRoute(viewModel) + } - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collect { sideEffect -> - handleSettingSideEffect(sideEffect, navigator, viewModel) - } - } + composable { + val viewModel = it.sharedHiltViewModel(navigator.navController) - EditProfileRoute(viewModel) - } + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator) } + } - SettingDestination.EditBirthday -> { - composable( - route = destination.route, - enterTransition = { - slideInVertically( - initialOffsetY = { it }, - animationSpec = tween( - durationMillis = 350, - easing = FastOutSlowInEasing, - ), - ) - }, - exitTransition = { - slideOutVertically( - targetOffsetY = { -it }, - animationSpec = tween( - durationMillis = 250, - easing = FastOutSlowInEasing, - ), - ) - }, - popEnterTransition = { - slideInVertically( - initialOffsetY = { -it }, - animationSpec = tween( - durationMillis = 300, - easing = FastOutSlowInEasing, - ), - ) - }, - popExitTransition = { - slideOutVertically( - targetOffsetY = { it }, - animationSpec = tween( - durationMillis = 300, - easing = FastOutSlowInEasing, - ), - ) - }, - ) { backStackEntry -> - val viewModel = - backStackEntry.sharedHiltViewModel(navigator.navController) + EditProfileRoute(viewModel) + } - LaunchedEffect(viewModel) { - viewModel.container.sideEffectFlow.collectLatest { sideEffect -> - handleSettingSideEffect(sideEffect, navigator, viewModel) - } - } + composable( + enterTransition = { + slideInVertically( + initialOffsetY = { it }, + animationSpec = tween( + durationMillis = 350, + easing = FastOutSlowInEasing, + ), + ) + }, + exitTransition = { + slideOutVertically( + targetOffsetY = { -it }, + animationSpec = tween( + durationMillis = 250, + easing = FastOutSlowInEasing, + ), + ) + }, + popEnterTransition = { + slideInVertically( + initialOffsetY = { -it }, + animationSpec = tween( + durationMillis = 300, + easing = FastOutSlowInEasing, + ), + ) + }, + popExitTransition = { + slideOutVertically( + targetOffsetY = { it }, + animationSpec = tween( + durationMillis = 300, + easing = FastOutSlowInEasing, + ), + ) + }, + ) { + val viewModel = it.sharedHiltViewModel(navigator.navController) - EditBirthdayRoute(viewModel) - } + LaunchedEffect(viewModel) { + viewModel.container.sideEffectFlow.collectLatest { sideEffect -> + handleSideEffect(sideEffect, navigator) } - - else -> {} } + + EditBirthdayRoute(viewModel) } } } -private fun handleSettingSideEffect( +private fun handleSideEffect( sideEffect: SettingContract.SideEffect, navigator: OrbitNavigator, - viewModel: BaseViewModel<*, *>, ) { when (sideEffect) { - is SettingContract.SideEffect.Navigate -> navigator.navigateTo( - route = sideEffect.route, - popUpTo = sideEffect.popUpTo, - inclusive = sideEffect.inclusive, - ) - SettingContract.SideEffect.NavigateBack -> navigator.navigateBack() + SettingContract.SideEffect.NavigateToSettingRoute -> { + navigator.navigateToSetting( + navOptions = navOptions { + popUpTo(SettingBaseRoute) { + inclusive = true + } + }, + ) + } + + SettingContract.SideEffect.NavigateToEditProfile -> { + navigator.navigateToEditProfile() + } + + SettingContract.SideEffect.NavigateToEditBirthday -> { + navigator.navigateToEditBirthDay() + } + is SettingContract.SideEffect.OpenWebView -> { - navigator.navigateTo("${WebViewDestination.WebView.route}/${Uri.encode(sideEffect.url)}") + navigator.navigateToWebView(Uri.encode(sideEffect.url)) } - else -> {} } } diff --git a/feature/splash/src/main/java/com/yapp/splash/SettingNavGraph.kt b/feature/splash/src/main/java/com/yapp/splash/SettingNavGraph.kt new file mode 100644 index 00000000..5a8e0e33 --- /dev/null +++ b/feature/splash/src/main/java/com/yapp/splash/SettingNavGraph.kt @@ -0,0 +1,14 @@ +package com.yapp.splash + +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable +import com.yapp.common.navigation.OrbitNavigator +import com.yapp.common.navigation.route.SplashRoute + +fun NavGraphBuilder.splashScreen( + navigator: OrbitNavigator, +) { + composable { + SplashRoute(navigator) + } +} diff --git a/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt b/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt new file mode 100644 index 00000000..1e8c6458 --- /dev/null +++ b/feature/webview/src/main/java/com/yapp/webview/WebViewNavGraph.kt @@ -0,0 +1,19 @@ +package com.yapp.webview + +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable +import androidx.navigation.toRoute +import com.yapp.common.navigation.OrbitNavigator +import com.yapp.common.navigation.route.WebViewRoute + +fun NavGraphBuilder.webViewScreen( + navigator: OrbitNavigator, +) { + composable { entry -> + val route = entry.toRoute() + WebViewRoute( + url = route.url, + navController = navigator.navController, + ) + } +} From 34fd208c1def1db23480ee5d86d8f14be318c935 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 3 Jun 2025 20:08:58 +0900 Subject: [PATCH 204/210] =?UTF-8?q?[REFACTOR/#212]=20=EA=B3=B5=ED=86=B5=20?= =?UTF-8?q?navigateTo=20=ED=95=A8=EC=88=98=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B0=81=20Route=20=EB=B3=84=20=EB=AA=85=EC=8B=9C?= =?UTF-8?q?=EC=A0=81=20=EB=9D=BC=EC=9A=B0=ED=8C=85=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 --- .../navigation/extensions/RouteExtension.kt | 5 ++++ .../interaction/AlarmInteractionActivity.kt | 15 +++-------- .../interaction/action/AlarmActionContract.kt | 8 +++--- .../interaction/action/AlarmActionScreen.kt | 8 ++---- .../action/AlarmActionViewModel.kt | 20 +++++++------- .../snooze/AlarmSnoozeTimerContract.kt | 8 +----- .../snooze/AlarmSnoozeTimerScreen.kt | 12 +-------- .../java/com/yapp/fortune/FortuneContract.kt | 8 +++--- .../java/com/yapp/fortune/FortuneViewModel.kt | 18 ++----------- .../alarm/addedit/AlarmAddEditContract.kt | 6 ----- .../yapp/alarm/addedit/AlarmAddEditScreen.kt | 7 ----- .../main/java/com/yapp/home/HomeContract.kt | 13 +++++---- .../src/main/java/com/yapp/home/HomeScreen.kt | 21 ++++++++++----- .../main/java/com/yapp/home/HomeViewModel.kt | 17 +++--------- .../java/com/yapp/mission/MissionContract.kt | 6 +---- .../java/com/yapp/mission/MissionViewModel.kt | 27 +++---------------- .../com/yapp/onboarding/OnboardingContract.kt | 8 +++--- .../yapp/onboarding/OnboardingViewModel.kt | 20 +++++--------- .../com/yapp/setting/EditProfileViewModel.kt | 15 +++-------- .../java/com/yapp/setting/SettingContract.kt | 14 +++++----- .../java/com/yapp/setting/SettingScreen.kt | 4 +-- .../java/com/yapp/setting/SettingViewModel.kt | 5 ++-- .../java/com/yapp/splash/SplashContract.kt | 4 ++- .../main/java/com/yapp/splash/SplashScreen.kt | 25 ++++++++++++----- .../java/com/yapp/splash/SplashViewModel.kt | 9 +++---- 25 files changed, 109 insertions(+), 194 deletions(-) create mode 100644 core/common/src/main/java/com/yapp/common/navigation/extensions/RouteExtension.kt diff --git a/core/common/src/main/java/com/yapp/common/navigation/extensions/RouteExtension.kt b/core/common/src/main/java/com/yapp/common/navigation/extensions/RouteExtension.kt new file mode 100644 index 00000000..965bf67b --- /dev/null +++ b/core/common/src/main/java/com/yapp/common/navigation/extensions/RouteExtension.kt @@ -0,0 +1,5 @@ +package com.yapp.common.navigation.extensions + +import kotlin.reflect.KClass + +fun KClass.toRoute(): String = this.simpleName ?: error("Route name missing") diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt index 443027a5..5860eb6d 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionActivity.kt @@ -16,14 +16,13 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.material3.Surface import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.core.util.Consumer import androidx.navigation.compose.NavHost import com.yapp.alarm.AlarmConstants import com.yapp.alarm.receivers.AlarmInteractionActivityReceiver -import com.yapp.common.navigation.destination.AlarmInteractionDestination import com.yapp.common.navigation.rememberOrbitNavigator +import com.yapp.common.navigation.route.AlarmInteractionBaseRoute import com.yapp.designsystem.theme.OrbitTheme import com.yapp.domain.model.Alarm import dagger.hilt.android.AndroidEntryPoint @@ -70,11 +69,12 @@ class AlarmInteractionActivity : ComponentActivity() { ) { NavHost( navController = navigator.navController, - startDestination = AlarmInteractionDestination.Route.route, + startDestination = AlarmInteractionBaseRoute, modifier = Modifier.navigationBarsPadding(), ) { alarmInteractionNavGraph( navigator = navigator, + alarm = alarm, ) } } @@ -89,7 +89,7 @@ class AlarmInteractionActivity : ComponentActivity() { } Log.d("AlarmInteractionActivity", "New Intent: $newIntent") newAlarm?.let { alarm -> - navigator.navController.navigate("${AlarmInteractionDestination.AlarmAction.route}/$alarm") + navigator.navigateToAlarmAction(alarm = alarm) } } @@ -99,13 +99,6 @@ class AlarmInteractionActivity : ComponentActivity() { this@AlarmInteractionActivity.removeOnNewIntentListener(onNewIntentConsumer) } } - - LaunchedEffect(Unit) { - val route = "${AlarmInteractionDestination.AlarmAction.route}/$alarm" - navigator.navController.navigate(route) { - popUpTo(AlarmInteractionDestination.Route.route) { inclusive = true } - } - } } } diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt index cbc6d959..470f89c3 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionContract.kt @@ -1,5 +1,7 @@ package com.yapp.alarm.interaction.action +import com.yapp.domain.model.Alarm +import com.yapp.ui.base.SideEffect import com.yapp.ui.base.UiState class AlarmActionContract { @@ -22,10 +24,6 @@ class AlarmActionContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() + data class NavigateToAlarmSnooze(val alarm: Alarm) : SideEffect() } } diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt index c44edb40..4db7ed7b 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionScreen.kt @@ -49,12 +49,8 @@ internal fun AlarmActionRoute( LaunchedEffect(sideEffect) { sideEffect.collect { action -> when (action) { - is AlarmActionContract.SideEffect.Navigate -> { - navigator.navigateTo( - route = action.route, - popUpTo = action.popUpTo, - inclusive = action.inclusive, - ) + is AlarmActionContract.SideEffect.NavigateToAlarmSnooze -> { + navigator.navigateToAlarmSnoozeTimer(action.alarm) } } } diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt index b6fa6e74..57e6cd8c 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/action/AlarmActionViewModel.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent import com.yapp.alarm.pendingIntent.interaction.createAlarmSnoozeIntent -import com.yapp.common.navigation.Routes import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm import com.yapp.ui.base.BaseViewModel @@ -15,7 +14,10 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import java.time.LocalDate +import java.time.LocalTime import java.time.format.DateTimeFormatter +import java.time.format.TextStyle +import java.util.Locale import javax.inject.Inject @HiltViewModel @@ -57,9 +59,9 @@ class AlarmActionViewModel @Inject constructor( private fun startClock() { viewModelScope.launch { while (isActive) { - val now = java.time.LocalTime.now() - val today = java.time.LocalDate.now() - val dayOfWeek = today.dayOfWeek.getDisplayName(java.time.format.TextStyle.FULL, java.util.Locale.KOREAN) + val now = LocalTime.now() + val today = LocalDate.now() + val dayOfWeek = today.dayOfWeek.getDisplayName(TextStyle.FULL, Locale.KOREAN) updateState { copy( @@ -94,13 +96,9 @@ class AlarmActionViewModel @Inject constructor( }, ) } - emitSideEffect( - AlarmActionContract.SideEffect.Navigate( - route = "${Routes.AlarmInteraction.ALARM_SNOOZE_TIMER}/$alarm", - popUpTo = Routes.AlarmInteraction.ALARM_ACTION, - inclusive = true, - ), - ) + alarm?.let { + emitSideEffect(AlarmActionContract.SideEffect.NavigateToAlarmSnooze(it)) + } } private fun dismiss() { diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt index f7adfee9..dcca8639 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerContract.kt @@ -16,11 +16,5 @@ class AlarmSnoozeTimerContract { data object Dismiss : Action() } - sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() - } + sealed class SideEffect : com.yapp.ui.base.SideEffect } diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt index d770b69f..e914f506 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/snooze/AlarmSnoozeTimerScreen.kt @@ -57,17 +57,7 @@ internal fun AlarmSnoozeTimerRoute( val sideEffect = viewModel.container.sideEffectFlow LaunchedEffect(sideEffect) { - sideEffect.collect { action -> - when (action) { - is AlarmSnoozeTimerContract.SideEffect.Navigate -> { - navigator.navigateTo( - route = action.route, - popUpTo = action.popUpTo, - inclusive = action.inclusive, - ) - } - } - } + sideEffect.collect { } } AlarmSnoozeTimerScreen( diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt index 0083828d..6c7528e0 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneContract.kt @@ -25,11 +25,9 @@ sealed class FortuneContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() + data object NavigateToFortuneReward : SideEffect() + + data object NavigateToHome : SideEffect() data object NavigateBack : SideEffect() diff --git a/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt b/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt index cfd930f5..b4890bfb 100644 --- a/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt +++ b/feature/fortune/src/main/java/com/yapp/fortune/FortuneViewModel.kt @@ -4,8 +4,6 @@ import android.app.Application import android.util.Log import androidx.annotation.DrawableRes import androidx.lifecycle.viewModelScope -import com.yapp.common.navigation.destination.FortuneDestination -import com.yapp.common.navigation.destination.HomeDestination import com.yapp.datastore.UserPreferences import com.yapp.domain.repository.FortuneRepository import com.yapp.domain.repository.ImageRepository @@ -78,13 +76,7 @@ class FortuneViewModel @Inject constructor( when (action) { is FortuneContract.Action.NextStep -> { if (state.hasReward) { - postSideEffect( - FortuneContract.SideEffect.Navigate( - route = FortuneDestination.Reward.route, - popUpTo = FortuneDestination.Fortune.route, - inclusive = true, - ), - ) + postSideEffect(FortuneContract.SideEffect.NavigateToFortuneReward) } else { reduce { state.copy(currentStep = (state.currentStep + 1).coerceAtMost(5)) } } @@ -102,13 +94,7 @@ class FortuneViewModel @Inject constructor( } private fun navigateToHome() { - emitSideEffect( - FortuneContract.SideEffect.Navigate( - route = HomeDestination.Route.route, - popUpTo = FortuneDestination.Route.route, - inclusive = true, - ), - ) + emitSideEffect(FortuneContract.SideEffect.NavigateToHome) } private fun saveImage(@DrawableRes resId: Int) = viewModelScope.launch { diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt index 2f9c710f..de6da472 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditContract.kt @@ -95,12 +95,6 @@ sealed class AlarmAddEditContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() - data object NavigateBack : SideEffect() data class SaveAlarm(val id: Long) : SideEffect() diff --git a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt index 5b7ba527..d479e3f6 100644 --- a/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt +++ b/feature/home/src/main/java/com/yapp/alarm/addedit/AlarmAddEditScreen.kt @@ -88,13 +88,6 @@ fun AlarmAddEditRoute( is AlarmAddEditContract.SideEffect.NavigateBack -> { navigator.navigateBack() } - is AlarmAddEditContract.SideEffect.Navigate -> { - navigator.navigateTo( - route = effect.route, - popUpTo = effect.popUpTo, - inclusive = effect.inclusive, - ) - } is AlarmAddEditContract.SideEffect.SaveAlarm -> { navigator.navController.previousBackStackEntry ?.savedStateHandle diff --git a/feature/home/src/main/java/com/yapp/home/HomeContract.kt b/feature/home/src/main/java/com/yapp/home/HomeContract.kt index ab55314f..ee3f5dd1 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeContract.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeContract.kt @@ -3,6 +3,7 @@ package com.yapp.home import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.yapp.domain.model.Alarm +import com.yapp.ui.base.SideEffect import com.yapp.ui.base.UiState sealed class HomeContract { @@ -72,11 +73,13 @@ sealed class HomeContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() + data object NavigateToAddAlarm : SideEffect() + + data class NavigateToEditAlarm(val alarmId: Long) : SideEffect() + + data object NavigateToFortune : SideEffect() + + data object NavigateToSetting : SideEffect() data class ShowSnackBar( val message: String, diff --git a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt index 270922a1..b8a4dc46 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeScreen.kt @@ -123,13 +123,22 @@ fun HomeRoute( LaunchedEffect(sideEffect) { sideEffect.collectLatest { effect -> when (effect) { - is HomeContract.SideEffect.Navigate -> { - navigator.navigateTo( - route = effect.route, - popUpTo = effect.popUpTo, - inclusive = effect.inclusive, - ) + is HomeContract.SideEffect.NavigateToAddAlarm -> { + navigator.navigateToAddAlarm() + } + + is HomeContract.SideEffect.NavigateToEditAlarm -> { + navigator.navigateToEditAlarm(effect.alarmId) + } + + is HomeContract.SideEffect.NavigateToFortune -> { + navigator.navigateToFortune() + } + + is HomeContract.SideEffect.NavigateToSetting -> { + navigator.navigateToSetting() } + is HomeContract.SideEffect.ShowSnackBar -> { val result = showCustomSnackBar( scope = coroutineScope, diff --git a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt index 67d3ee67..9c5dccc6 100644 --- a/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/yapp/home/HomeViewModel.kt @@ -3,9 +3,6 @@ package com.yapp.home import android.util.Log import androidx.lifecycle.viewModelScope import com.yapp.alarm.AlarmHelper -import com.yapp.common.navigation.destination.FortuneDestination -import com.yapp.common.navigation.destination.HomeDestination -import com.yapp.common.navigation.destination.SettingDestination import com.yapp.common.util.ResourceProvider import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm @@ -103,7 +100,7 @@ class HomeViewModel @Inject constructor( } private fun navigateToAlarmCreation() { - emitSideEffect(HomeContract.SideEffect.Navigate(HomeDestination.AlarmAddEdit.route)) + emitSideEffect(HomeContract.SideEffect.NavigateToAddAlarm) } private fun toggleMultiSelectionMode() { @@ -316,7 +313,7 @@ class HomeViewModel @Inject constructor( } private fun editAlarm(alarmId: Long) { - emitSideEffect(HomeContract.SideEffect.Navigate("${HomeDestination.AlarmAddEdit.route}?id=$alarmId")) + emitSideEffect(HomeContract.SideEffect.NavigateToEditAlarm(alarmId)) } private fun updateDeliveryTime(alarms: List) { @@ -404,9 +401,7 @@ class HomeViewModel @Inject constructor( processAction(HomeContract.Action.ShowNoDailyFortuneDialog) } else { userPreferences.markFortuneAsChecked() - emitSideEffect( - HomeContract.SideEffect.Navigate(FortuneDestination.Fortune.route), - ) + emitSideEffect(HomeContract.SideEffect.NavigateToFortune) } } } @@ -457,11 +452,7 @@ class HomeViewModel @Inject constructor( } private fun navigateToSetting() { - emitSideEffect( - HomeContract.SideEffect.Navigate( - route = SettingDestination.Route.route, - ), - ) + emitSideEffect(HomeContract.SideEffect.NavigateToSetting) } private fun showItemMenu(alarmId: Long, x: Float, y: Float) { diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt index 505ae265..f1812c49 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionContract.kt @@ -28,11 +28,7 @@ sealed class MissionContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() + data object NavigateToFortune : SideEffect() data object NavigateBack : SideEffect() } diff --git a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt index 94512478..38512436 100644 --- a/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt +++ b/feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt @@ -7,9 +7,6 @@ import androidx.lifecycle.viewModelScope import com.yapp.alarm.pendingIntent.interaction.createAlarmDismissIntent import com.yapp.analytics.AnalyticsEvent import com.yapp.analytics.AnalyticsHelper -import com.yapp.common.navigation.destination.FortuneDestination -import com.yapp.common.navigation.destination.HomeDestination -import com.yapp.common.navigation.destination.MissionDestination import com.yapp.datastore.UserPreferences import com.yapp.domain.model.MissionType import com.yapp.domain.repository.FortuneRepository @@ -131,13 +128,7 @@ class MissionViewModel @Inject constructor( userPreferences.saveFortuneId(data.id) userPreferences.saveFortuneScore(data.avgFortuneScore) - emitSideEffect( - MissionContract.SideEffect.Navigate( - route = FortuneDestination.Route.route, - popUpTo = MissionDestination.Route.route, - inclusive = true, - ), - ) + emitSideEffect(MissionContract.SideEffect.NavigateToFortune) }.onFailure { error -> Log.e("MissionViewModel", "운세 데이터 요청 실패: ${error.message}") updateState { copy(errorMessage = error.message) } @@ -159,13 +150,7 @@ class MissionViewModel @Inject constructor( userPreferences.saveFortuneId(data.id) userPreferences.saveFortuneScore(data.avgFortuneScore) - emitSideEffect( - MissionContract.SideEffect.Navigate( - route = FortuneDestination.Route.route, - popUpTo = MissionDestination.Route.route, - inclusive = true, - ), - ) + emitSideEffect(MissionContract.SideEffect.NavigateToFortune) }.onFailure { Log.e("MissionViewModel", "운세 재요청 실패: ${it.message}") navigateToHome() @@ -195,13 +180,7 @@ class MissionViewModel @Inject constructor( } private fun navigateToHome() { - emitSideEffect( - MissionContract.SideEffect.Navigate( - route = HomeDestination.Route.route, - popUpTo = MissionDestination.Route.route, - inclusive = true, - ), - ) + emitSideEffect(MissionContract.SideEffect.NavigateToFortune) } private fun sendAlarmDismissIntent(id: Long) { diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt index 5cb2a890..0b5a339b 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt @@ -72,14 +72,12 @@ sealed class OnboardingContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() + data object NavigateToNextStep : SideEffect() data object NavigateBack : SideEffect() + data object OnboardingCompleted : SideEffect() + data class OpenWebView(val url: String) : SideEffect() } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt index 72e873a5..4628684f 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt @@ -5,8 +5,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.yapp.analytics.AnalyticsEvent import com.yapp.analytics.AnalyticsHelper -import com.yapp.common.navigation.destination.HomeDestination -import com.yapp.common.navigation.destination.OnboardingDestination +import com.yapp.common.navigation.route.OnboardingDestination import com.yapp.datastore.UserPreferences import com.yapp.domain.model.Alarm import com.yapp.domain.model.AlarmDay @@ -19,6 +18,7 @@ import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject +import kotlin.reflect.KClass @HiltViewModel class OnboardingViewModel @Inject constructor( @@ -35,8 +35,8 @@ class OnboardingViewModel @Inject constructor( birthType = savedStateHandle["birthType"] ?: "양력", ), ) { - private val currentRoute: String? - get() = OnboardingDestination.routes.getOrNull(currentState.currentStep - 1)?.route + private val currentRoute: KClass? + get() = OnboardingDestination.routes.getOrNull(currentState.currentStep - 1) fun processAction(action: OnboardingContract.Action) { when (action) { @@ -104,7 +104,7 @@ class OnboardingViewModel @Inject constructor( if (nextRoute != null) { savedStateHandle["currentStep"] = nextStep updateState { copy(currentStep = nextStep) } - emitSideEffect(OnboardingContract.SideEffect.Navigate(nextRoute)) + emitSideEffect(OnboardingContract.SideEffect.NavigateToNextStep) } else { emitSideEffect(OnboardingContract.SideEffect.OnboardingCompleted) } @@ -201,7 +201,7 @@ class OnboardingViewModel @Inject constructor( } private fun updateBirthDate(lunar: String, year: Int, month: Int, day: Int) { - if (currentRoute != OnboardingDestination.Birthday.route) return + if (currentRoute != OnboardingDestination.Birthday::class) return val formattedDate = "$year-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}" @@ -241,13 +241,7 @@ class OnboardingViewModel @Inject constructor( private fun completeOnboarding() { viewModelScope.launch { userPreferences.setOnboardingCompleted() - emitSideEffect( - OnboardingContract.SideEffect.Navigate( - route = HomeDestination.Route.route, - popUpTo = OnboardingDestination.Route.route, - inclusive = true, - ), - ) + emitSideEffect(OnboardingContract.SideEffect.OnboardingCompleted) } } diff --git a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt index a5d3adf2..166388b3 100644 --- a/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/EditProfileViewModel.kt @@ -2,7 +2,6 @@ package com.yapp.setting import android.util.Log import androidx.lifecycle.viewModelScope -import com.yapp.common.navigation.destination.SettingDestination import com.yapp.datastore.UserPreferences import com.yapp.domain.model.EditUser import com.yapp.domain.repository.UserInfoRepository @@ -150,15 +149,7 @@ class EditProfileViewModel @Inject constructor( if (result.isSuccess) { userPreferences.saveUserName(state.name) - emitSideEffect(SettingContract.SideEffect.UserInfoUpdated) - - emitSideEffect( - SettingContract.SideEffect.Navigate( - route = SettingDestination.Setting.route, - popUpTo = SettingDestination.Setting.route, - inclusive = true, - ), - ) + emitSideEffect(SettingContract.SideEffect.NavigateToSettingRoute) } else { Log.e("EditProfileViewModel", "사용자 정보 수정 실패") } @@ -168,9 +159,9 @@ class EditProfileViewModel @Inject constructor( return formattedDate.replace(Regex("[^0-9-]"), "") } - private fun navigateToEditBirthday() = intent { + private fun navigateToEditBirthday() { updateState { copy(shouldFetchUserInfo = false) } - emitSideEffect(SettingContract.SideEffect.Navigate(SettingDestination.EditBirthday.route)) + emitSideEffect(SettingContract.SideEffect.NavigateToEditBirthday) } private fun refreshUserInfo() { diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt index b6b65a66..6f957cc3 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingContract.kt @@ -65,14 +65,14 @@ sealed class SettingContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate( - val route: String, - val popUpTo: String? = null, - val inclusive: Boolean = false, - ) : SideEffect() - data object NavigateBack : SideEffect() + + data object NavigateToSettingRoute : SideEffect() + + data object NavigateToEditProfile : SideEffect() + + data object NavigateToEditBirthday : SideEffect() + data class OpenWebView(val url: String) : SideEffect() - data object UserInfoUpdated : SideEffect() } } diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt index 621d7904..03f79fd0 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingScreen.kt @@ -46,9 +46,7 @@ fun SettingRoute( SettingScreen( state = state, onNavigateToEditProfile = { - viewModel.onAction( - SettingContract.Action.NavigateToEditProfile, - ) + viewModel.onAction(SettingContract.Action.NavigateToEditProfile) }, onBackClick = { viewModel.onAction(SettingContract.Action.PreviousStep) }, onInquiryClick = { diff --git a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt index 1dcbd1d7..2e0773c0 100644 --- a/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt +++ b/feature/setting/src/main/java/com/yapp/setting/SettingViewModel.kt @@ -2,7 +2,6 @@ package com.yapp.setting import android.util.Log import androidx.lifecycle.viewModelScope -import com.yapp.common.navigation.destination.SettingDestination import com.yapp.datastore.UserPreferences import com.yapp.domain.repository.UserInfoRepository import com.yapp.ui.base.BaseViewModel @@ -49,8 +48,8 @@ class SettingViewModel @Inject constructor( } } - private fun navigateToEditProfile() = intent { - emitSideEffect(SettingContract.SideEffect.Navigate(SettingDestination.EditProfile.route)) + private fun navigateToEditProfile() { + emitSideEffect(SettingContract.SideEffect.NavigateToEditProfile) } private fun openWebView(url: String) { diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt b/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt index 5cebff65..d83dff65 100644 --- a/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt +++ b/feature/splash/src/main/java/com/yapp/splash/SplashContract.kt @@ -9,6 +9,8 @@ sealed class SplashContract { ) : UiState sealed class SideEffect : com.yapp.ui.base.SideEffect { - data class Navigate(val route: String) : SideEffect() + data object NavigateToHome : SideEffect() + + data object NavigateToOnboarding : SideEffect() } } diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt index 152edd15..272dea8a 100644 --- a/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt +++ b/feature/splash/src/main/java/com/yapp/splash/SplashScreen.kt @@ -19,8 +19,9 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.navOptions import com.yapp.common.navigation.OrbitNavigator -import com.yapp.common.navigation.destination.SplashDestination +import com.yapp.common.navigation.route.SplashRoute import com.yapp.designsystem.theme.OrbitTheme import kotlinx.coroutines.flow.collectLatest @@ -35,11 +36,23 @@ fun SplashRoute( LaunchedEffect(sideEffect) { sideEffect.collectLatest { effect -> when (effect) { - is SplashContract.SideEffect.Navigate -> { - navigator.navigateTo( - route = effect.route, - popUpTo = SplashDestination.Route.route, - inclusive = true, + is SplashContract.SideEffect.NavigateToOnboarding -> { + navigator.navigateToOnboarding( + navOptions = navOptions { + popUpTo(SplashRoute) { + inclusive = true + } + }, + ) + } + + is SplashContract.SideEffect.NavigateToHome -> { + navigator.navigateToHome( + navOptions = navOptions { + popUpTo(SplashRoute) { + inclusive = true + } + }, ) } } diff --git a/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt b/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt index 201acd55..db697f4b 100644 --- a/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt +++ b/feature/splash/src/main/java/com/yapp/splash/SplashViewModel.kt @@ -1,8 +1,6 @@ package com.yapp.splash import androidx.lifecycle.viewModelScope -import com.yapp.common.navigation.destination.HomeDestination -import com.yapp.common.navigation.destination.OnboardingDestination import com.yapp.datastore.UserPreferences import com.yapp.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel @@ -40,12 +38,11 @@ class SplashViewModel @Inject constructor( ) { userId, onboardingCompleted -> Pair(userId, onboardingCompleted) }.collect { (userId, onboardingCompleted) -> - val destination = if (userId != null && onboardingCompleted) { - HomeDestination.Home.route + if (userId != null && onboardingCompleted) { + emitSideEffect(SplashContract.SideEffect.NavigateToHome) } else { - OnboardingDestination.Route.route + emitSideEffect(SplashContract.SideEffect.NavigateToOnboarding) } - emitSideEffect(SplashContract.SideEffect.Navigate(destination)) } } } From cd72e2911d7c04fb4c65392733605b68aad1e44e Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 3 Jun 2025 20:54:44 +0900 Subject: [PATCH 205/210] =?UTF-8?q?[REFACTOR/#212]=20Onboarding=20?= =?UTF-8?q?=EB=8B=A8=EA=B3=84=20=EC=9D=B4=EB=8F=99=20=EC=8B=9C=20currentRo?= =?UTF-8?q?ute=20=ED=8C=8C=EC=8B=B1=20=EB=8C=80=EC=8B=A0=20=EB=AA=85?= =?UTF-8?q?=EC=8B=9C=EC=A0=81=20currentStep=20=EC=9D=B8=EC=9E=90=EB=A1=9C?= =?UTF-8?q?=20=EB=8C=80=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yapp/common/navigation/OrbitNavigator.kt | 11 +++++----- .../navigation/route/OnboardingRoute.kt | 20 +++++++++---------- feature/navigator/build.gradle.kts | 1 + .../com/yapp/onboarding/OnboardingContract.kt | 2 +- .../com/yapp/onboarding/OnboardingNavGraph.kt | 4 ++-- .../yapp/onboarding/OnboardingViewModel.kt | 2 +- gradle/libs.versions.toml | 2 ++ 7 files changed, 22 insertions(+), 20 deletions(-) diff --git a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt index 92e20cb5..cedf91f6 100644 --- a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt +++ b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt @@ -5,7 +5,6 @@ import androidx.compose.runtime.remember import androidx.navigation.NavHostController import androidx.navigation.NavOptions import androidx.navigation.compose.rememberNavController -import com.yapp.common.navigation.extensions.toRoute import com.yapp.common.navigation.route.AlarmInteractionDestination import com.yapp.common.navigation.route.FortuneBaseRoute import com.yapp.common.navigation.route.FortuneDestination @@ -28,13 +27,13 @@ class OrbitNavigator( navController.navigate(OnboardingBaseRoute, navOptions) } - fun navigateToOnboardingNextStep(navOptions: NavOptions? = null) { - val currentRoute = navController.currentBackStackEntry?.destination?.route ?: return + fun navigateToOnboardingNextStep(currentStep: Int, navOptions: NavOptions? = null) { + val nextRouteClass = OnboardingDestination.nextRoute(currentStep + 1) ?: return - val currentIndex = OnboardingDestination.routes.indexOfFirst { it.toRoute() == currentRoute } - val nextRouteClass = OnboardingDestination.nextRoute(currentIndex + 1) ?: return + val nextRouteInstance = nextRouteClass.objectInstance + ?: error("Cannot get object instance of route class: $nextRouteClass") - navController.navigate(nextRouteClass, navOptions) + navController.navigate(nextRouteInstance, navOptions) } fun navigateToAddAlarm(navOptions: NavOptions? = null) { diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt index 52f0bb5b..1f1346b2 100644 --- a/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt +++ b/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt @@ -6,33 +6,33 @@ import kotlin.reflect.KClass @Serializable data object OnboardingBaseRoute -sealed interface OnboardingDestination { +sealed class OnboardingDestination { @Serializable - data object Explain : OnboardingDestination + data object Explain : OnboardingDestination() @Serializable - data object AlarmTimeSelection : OnboardingDestination + data object AlarmTimeSelection : OnboardingDestination() @Serializable - data object Birthday : OnboardingDestination + data object Birthday : OnboardingDestination() @Serializable - data object TimeOfBirth : OnboardingDestination + data object TimeOfBirth : OnboardingDestination() @Serializable - data object Name : OnboardingDestination + data object Name : OnboardingDestination() @Serializable - data object Gender : OnboardingDestination + data object Gender : OnboardingDestination() @Serializable - data object Access : OnboardingDestination + data object Access : OnboardingDestination() @Serializable - data object Complete1 : OnboardingDestination + data object Complete1 : OnboardingDestination() @Serializable - data object Complete2 : OnboardingDestination + data object Complete2 : OnboardingDestination() companion object { val routes: List> = listOf( diff --git a/feature/navigator/build.gradle.kts b/feature/navigator/build.gradle.kts index cc268c3d..a8db6273 100644 --- a/feature/navigator/build.gradle.kts +++ b/feature/navigator/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { implementation(libs.orbit.core) implementation(libs.orbit.compose) implementation(libs.orbit.viewmodel) + implementation(libs.kotlin.reflect) implementation(projects.feature.home) implementation(projects.feature.alarmInteraction) implementation(projects.feature.onboarding) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt index 0b5a339b..5e8b83c2 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingContract.kt @@ -72,7 +72,7 @@ sealed class OnboardingContract { } sealed class SideEffect : com.yapp.ui.base.SideEffect { - data object NavigateToNextStep : SideEffect() + data class NavigateToNextStep(val currentStep: Int) : SideEffect() data object NavigateBack : SideEffect() diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt index fd669d65..ee57af2e 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingNavGraph.kt @@ -114,8 +114,8 @@ private fun handleSideEffect( viewModel: OnboardingViewModel, ) { when (sideEffect) { - OnboardingContract.SideEffect.NavigateToNextStep -> { - navigator.navigateToOnboardingNextStep() + is OnboardingContract.SideEffect.NavigateToNextStep -> { + navigator.navigateToOnboardingNextStep(sideEffect.currentStep) } OnboardingContract.SideEffect.NavigateBack -> { diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt index 4628684f..e6eff571 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt @@ -104,7 +104,7 @@ class OnboardingViewModel @Inject constructor( if (nextRoute != null) { savedStateHandle["currentStep"] = nextStep updateState { copy(currentStep = nextStep) } - emitSideEffect(OnboardingContract.SideEffect.NavigateToNextStep) + emitSideEffect(OnboardingContract.SideEffect.NavigateToNextStep(currentStep)) } else { emitSideEffect(OnboardingContract.SideEffect.OnboardingCompleted) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 73a719e9..f7234675 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -182,6 +182,8 @@ amplitude-analytics = { group = "com.amplitude", name = "analytics-android", ver play-services-ads = { group = "com.google.android.gms", name = "play-services-ads", version.ref = "playServicesAd" } +kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } + [plugins] ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } From 525b14b45423cae190eeb6107fd097edcb461cc0 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Tue, 3 Jun 2025 21:06:50 +0900 Subject: [PATCH 206/210] =?UTF-8?q?[FIX/#212]=20updateBirthDate=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yapp/onboarding/OnboardingViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt index e6eff571..1ab0758c 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt @@ -36,7 +36,7 @@ class OnboardingViewModel @Inject constructor( ), ) { private val currentRoute: KClass? - get() = OnboardingDestination.routes.getOrNull(currentState.currentStep - 1) + get() = OnboardingDestination.routes.getOrNull(currentState.currentStep) fun processAction(action: OnboardingContract.Action) { when (action) { From ee90f2ce6b0429039bee5d5bd23182567f51b219 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Wed, 4 Jun 2025 01:26:13 +0900 Subject: [PATCH 207/210] =?UTF-8?q?[REFACTOR/#212]=20=EC=98=A8=EB=B3=B4?= =?UTF-8?q?=EB=94=A9=20=EB=8B=A8=EA=B3=84=20=EC=9D=B4=EB=8F=99=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EA=B0=9C=EC=84=A0=20?= =?UTF-8?q?=EB=B0=8F=20null=20=EC=95=88=EC=A0=84=20=EC=B2=98=EB=A6=AC=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/yapp/common/navigation/OrbitNavigator.kt | 13 +++++++------ .../yapp/common/navigation/route/OnboardingRoute.kt | 4 ++-- .../java/com/yapp/onboarding/OnboardingViewModel.kt | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt index cedf91f6..34ceed6f 100644 --- a/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt +++ b/core/common/src/main/java/com/yapp/common/navigation/OrbitNavigator.kt @@ -1,5 +1,6 @@ package com.yapp.common.navigation +import android.util.Log import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.navigation.NavHostController @@ -28,12 +29,12 @@ class OrbitNavigator( } fun navigateToOnboardingNextStep(currentStep: Int, navOptions: NavOptions? = null) { - val nextRouteClass = OnboardingDestination.nextRoute(currentStep + 1) ?: return - - val nextRouteInstance = nextRouteClass.objectInstance - ?: error("Cannot get object instance of route class: $nextRouteClass") - - navController.navigate(nextRouteInstance, navOptions) + val instance = OnboardingDestination.getNextRouteForStep(currentStep)?.objectInstance + if (instance != null) { + navController.navigate(instance, navOptions) + } else { + Log.e("Navigator", "Invalid route at step: $currentStep") + } } fun navigateToAddAlarm(navOptions: NavOptions? = null) { diff --git a/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt b/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt index 1f1346b2..ff4faea4 100644 --- a/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt +++ b/core/common/src/main/java/com/yapp/common/navigation/route/OnboardingRoute.kt @@ -47,8 +47,8 @@ sealed class OnboardingDestination { Complete2::class, ) - fun nextRoute(currentStep: Int): KClass? { - val nextRoute = routes.getOrNull(currentStep) + fun getNextRouteForStep(currentStep: Int): KClass? { + val nextRoute = routes.getOrNull(currentStep + 1) return nextRoute } } diff --git a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt index 1ab0758c..ec145349 100644 --- a/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt +++ b/feature/onboarding/src/main/java/com/yapp/onboarding/OnboardingViewModel.kt @@ -96,7 +96,7 @@ class OnboardingViewModel @Inject constructor( private fun moveToNextStep() { val currentStep = container.stateFlow.value.currentStep val nextStep = currentStep + 1 - val nextRoute = OnboardingDestination.nextRoute(currentStep) + val nextRoute = OnboardingDestination.getNextRouteForStep(currentStep) savedStateHandle["birthDate"] = currentState.birthDate savedStateHandle["birthType"] = currentState.birthType From 868fb8d04121f032b0022b6b49f9a81c90876415 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sun, 8 Jun 2025 13:27:25 +0900 Subject: [PATCH 208/210] =?UTF-8?q?[RENAME/#212]=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/splash/{SettingNavGraph.kt => SplashNavGraph.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename feature/splash/src/main/java/com/yapp/splash/{SettingNavGraph.kt => SplashNavGraph.kt} (100%) diff --git a/feature/splash/src/main/java/com/yapp/splash/SettingNavGraph.kt b/feature/splash/src/main/java/com/yapp/splash/SplashNavGraph.kt similarity index 100% rename from feature/splash/src/main/java/com/yapp/splash/SettingNavGraph.kt rename to feature/splash/src/main/java/com/yapp/splash/SplashNavGraph.kt From 4cd446c1f01699e12f59d30597eb089dc71e0fdf Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sun, 8 Jun 2025 13:41:47 +0900 Subject: [PATCH 209/210] =?UTF-8?q?[REMOVE/#212]=20=EC=95=88=20=EC=93=B0?= =?UTF-8?q?=EB=8A=94=20=ED=95=A8=EC=88=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yapp/common/navigation/extensions/RouteExtension.kt | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 core/common/src/main/java/com/yapp/common/navigation/extensions/RouteExtension.kt diff --git a/core/common/src/main/java/com/yapp/common/navigation/extensions/RouteExtension.kt b/core/common/src/main/java/com/yapp/common/navigation/extensions/RouteExtension.kt deleted file mode 100644 index 965bf67b..00000000 --- a/core/common/src/main/java/com/yapp/common/navigation/extensions/RouteExtension.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.yapp.common.navigation.extensions - -import kotlin.reflect.KClass - -fun KClass.toRoute(): String = this.simpleName ?: error("Route name missing") From 8a297e73051e3353000325d8d259992a7b0fdcd2 Mon Sep 17 00:00:00 2001 From: dongchyeon Date: Sun, 8 Jun 2025 13:57:12 +0900 Subject: [PATCH 210/210] =?UTF-8?q?[REFACTOR/#212]=20GSON=20->=20kotlinx.s?= =?UTF-8?q?erialization=20=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- domain/build.gradle.kts | 1 - domain/src/main/java/com/yapp/domain/model/Alarm.kt | 8 ++++---- feature/alarm-interaction/build.gradle.kts | 2 +- .../yapp/alarm/interaction/AlarmInteractionNavGraph.kt | 4 ++-- gradle/libs.versions.toml | 1 - 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index a9c80e75..e5567cb0 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -10,6 +10,5 @@ android { } dependencies { - implementation(libs.gson) implementation(libs.kotlinx.serialization.json) } diff --git a/domain/src/main/java/com/yapp/domain/model/Alarm.kt b/domain/src/main/java/com/yapp/domain/model/Alarm.kt index 9e05ffca..f04d4148 100644 --- a/domain/src/main/java/com/yapp/domain/model/Alarm.kt +++ b/domain/src/main/java/com/yapp/domain/model/Alarm.kt @@ -2,10 +2,10 @@ package com.yapp.domain.model import android.net.Uri import android.os.Parcelable -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken import kotlinx.parcelize.Parcelize import kotlinx.serialization.Serializable +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json @Parcelize @Serializable @@ -39,11 +39,11 @@ data class Alarm( companion object { fun fromJson(json: String): Alarm { - return Gson().fromJson(json, object : TypeToken() {}.type) + return Json.decodeFromString(json) } } - override fun toString(): String = Uri.encode(Gson().toJson(this)) + override fun toString(): String = Uri.encode(Json.encodeToString(this)) } fun Alarm.copyFrom(source: Alarm): Alarm { diff --git a/feature/alarm-interaction/build.gradle.kts b/feature/alarm-interaction/build.gradle.kts index 50a1074e..efc6eeec 100644 --- a/feature/alarm-interaction/build.gradle.kts +++ b/feature/alarm-interaction/build.gradle.kts @@ -21,6 +21,6 @@ dependencies { implementation(libs.orbit.viewmodel) implementation(libs.androidx.material.android) implementation(libs.androidx.annotation) - implementation(libs.gson) implementation(libs.play.services.ads) + implementation(libs.kotlinx.serialization.json) } diff --git a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt index 312ce293..bc8d0035 100644 --- a/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt +++ b/feature/alarm-interaction/src/main/java/com/yapp/alarm/interaction/AlarmInteractionNavGraph.kt @@ -7,13 +7,13 @@ import androidx.navigation.NavType import androidx.navigation.compose.composable import androidx.navigation.navOptions import androidx.navigation.navigation -import com.google.gson.Gson import com.yapp.alarm.interaction.action.AlarmActionRoute import com.yapp.alarm.interaction.snooze.AlarmSnoozeTimerRoute import com.yapp.common.navigation.OrbitNavigator import com.yapp.common.navigation.route.AlarmInteractionBaseRoute import com.yapp.common.navigation.route.AlarmInteractionDestination import com.yapp.domain.model.Alarm +import kotlinx.serialization.json.Json import kotlin.reflect.typeOf val AlarmArgType = object : NavType(isNullableAllowed = false) { @@ -26,7 +26,7 @@ val AlarmArgType = object : NavType(isNullableAllowed = false) { } override fun put(bundle: Bundle, key: String, value: Alarm) { - bundle.putString(key, Gson().toJson(value)) + bundle.putString(key, Json.encodeToString(Alarm.serializer(), value)) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f7234675..51c70bb2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -149,7 +149,6 @@ okhttp-logging = { group = "com.squareup.okhttp3", name = "logging-interceptor", flexible-bottomsheet = { group = "com.github.skydoves", name = "flexible-bottomsheet-material3", version.ref = "flexible-bottomsheet" } #sentry-android = { group = "io.sentry", name = "sentry-android", version.ref = "sentry-android" } #sentry-compose = { group = "io.sentry", name = "sentry-compose", version.ref = "sentry-compose" } -gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } # Google Libraries firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase-bom" }