From f486e0bfe31de897ae8f8aec186bb50c89f4cf98 Mon Sep 17 00:00:00 2001 From: arinming Date: Thu, 1 May 2025 11:40:44 +0900 Subject: [PATCH 01/35] =?UTF-8?q?[ADD/#380]=20Intern=20=EB=94=A5=EB=A7=81?= =?UTF-8?q?=ED=81=AC=20=EA=B2=BD=EB=A1=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/core/designsystem/util/KakaoUtil.kt | 1 - .../com/terning/feature/intern/InternViewSideEffect.kt | 7 ------- .../feature/intern/navigation/InternNavigation.kt | 10 +++++++++- 3 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 feature/intern/src/main/java/com/terning/feature/intern/InternViewSideEffect.kt diff --git a/core/designsystem/src/main/java/com/terning/core/designsystem/util/KakaoUtil.kt b/core/designsystem/src/main/java/com/terning/core/designsystem/util/KakaoUtil.kt index 267575616..cabf68afb 100644 --- a/core/designsystem/src/main/java/com/terning/core/designsystem/util/KakaoUtil.kt +++ b/core/designsystem/src/main/java/com/terning/core/designsystem/util/KakaoUtil.kt @@ -37,7 +37,6 @@ class KakaoUtil @Inject constructor( } catch (e: Exception) { Timber.e("웹 공유 실패: ${e.message}") } - } } } diff --git a/feature/intern/src/main/java/com/terning/feature/intern/InternViewSideEffect.kt b/feature/intern/src/main/java/com/terning/feature/intern/InternViewSideEffect.kt deleted file mode 100644 index 9954265af..000000000 --- a/feature/intern/src/main/java/com/terning/feature/intern/InternViewSideEffect.kt +++ /dev/null @@ -1,7 +0,0 @@ - -import androidx.annotation.StringRes - -sealed class InternViewSideEffect { - data class Toast(@StringRes val message: Int) : - InternViewSideEffect() -} \ No newline at end of file diff --git a/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt b/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt index 7bc5c14c3..6c03ab85d 100644 --- a/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt +++ b/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt @@ -7,11 +7,14 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.NavOptions import androidx.navigation.compose.composable +import androidx.navigation.navDeepLink import androidx.navigation.toRoute import com.terning.core.navigation.Route import com.terning.feature.intern.InternRoute import kotlinx.serialization.Serializable +private const val INTERN_PATH: String = "terning://intern" + fun NavController.navigateIntern( announcementId: Long = 0, navOptions: NavOptions? = null, @@ -37,7 +40,12 @@ fun NavGraphBuilder.internNavGraph( }, popExitTransition = { ExitTransition.None - } + }, + deepLinks = listOf( + navDeepLink( + basePath = INTERN_PATH + ) + ) ) { val args = it.toRoute() InternRoute( From 834d5807a5e1824ef924df4367cbb63484ab4e88 Mon Sep 17 00:00:00 2001 From: arinming Date: Sat, 3 May 2025 17:04:12 +0900 Subject: [PATCH 02/35] =?UTF-8?q?[FEAT/#380]=20Intern=20=EB=94=A5=EB=A7=81?= =?UTF-8?q?=ED=81=AC=20=EC=8A=A4=ED=94=8C=EB=9E=98=EC=8B=9C=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 --- .../designsystem/type/NotificationRedirect.kt | 3 ++- feature/main/src/main/AndroidManifest.xml | 1 + .../com/terning/feature/main/MainActivity.kt | 10 ++++---- .../com/terning/feature/main/MainNavigator.kt | 3 ++- .../com/terning/feature/main/MainScreen.kt | 10 +++++++- .../com/terning/feature/splash/SplashRoute.kt | 23 +++++++++++-------- .../splash/navigation/SplashNavigation.kt | 11 ++++++--- 7 files changed, 41 insertions(+), 20 deletions(-) diff --git a/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt b/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt index 9b85a3d8b..6a94f7da7 100644 --- a/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt +++ b/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt @@ -3,7 +3,8 @@ package com.terning.core.designsystem.type enum class NotificationRedirect(val path: String) { CALENDAR("calendar"), HOME("home"), - SEARCH("search"); + SEARCH("search"), + INTERN("intern"); companion object { fun from(type: String?): NotificationRedirect? = diff --git a/feature/main/src/main/AndroidManifest.xml b/feature/main/src/main/AndroidManifest.xml index acad7f973..bdac0a681 100644 --- a/feature/main/src/main/AndroidManifest.xml +++ b/feature/main/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + { + private fun handleDeeplink(intent: Intent?): Triple { val uri = intent?.data val uriString = uri?.toString() - if (uriString.isNullOrEmpty()) return null to null + if (uriString.isNullOrEmpty()) return Triple(null, null, null) val host = uri.host val redirect = uri.getQueryParameter(REDIRECT) + val internId = uri.getQueryParameter("internId") if (!intent.getBooleanExtra(ALREADY_TRACKED, false) && intent.getBooleanExtra(FROM_NOTIFICATION, false) @@ -64,7 +66,7 @@ class MainActivity : ComponentActivity() { intent.putExtra(ALREADY_TRACKED, true) - return host to redirect + return Triple(host, redirect, internId) } companion object { diff --git a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt index 9fd4f965f..47dff938a 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt @@ -26,11 +26,12 @@ class MainNavigator( @Composable get() = navController .currentBackStackEntryAsState().value?.destination - fun getStartDestination(redirect: String?, host: String?) = + fun getStartDestination(redirect: String?, host: String?, internId: String?) = when (NotificationRedirect.from(host)) { NotificationRedirect.SEARCH -> Search NotificationRedirect.HOME -> Home NotificationRedirect.CALENDAR -> Calendar + NotificationRedirect.INTERN -> Splash(internId = internId) else -> Splash(redirect) } diff --git a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt index 2dbbb7f53..1bd90c0c3 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt @@ -65,6 +65,7 @@ import kotlinx.coroutines.launch fun MainScreen( host: String?, redirect: String?, + internId: String?, navigator: MainNavigator = rememberMainNavigator(), ) { val context = LocalContext.current @@ -145,7 +146,11 @@ fun MainScreen( ExitTransition.None }, navController = navigator.navController, - startDestination = navigator.getStartDestination(redirect = redirect, host = host) + startDestination = navigator.getStartDestination( + redirect = redirect, + host = host, + internId = internId + ) ) { splashNavGraph( navigateHome = { @@ -159,6 +164,9 @@ fun MainScreen( }, navigateSearch = { navigator.navController.navigateSearch(navOptions = splashNavOptions) + }, + navigateToInternDetail = { + navigator.navController.navigateIntern(navOptions = splashNavOptions) } ) homeNavGraph( diff --git a/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt b/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt index 49a5fbbc0..ce0770f9c 100644 --- a/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt +++ b/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt @@ -37,10 +37,12 @@ import kotlinx.coroutines.launch @Composable internal fun SplashRoute( redirect: String?, + internId: String?, navigateToHome: () -> Unit, navigateToSignIn: () -> Unit, navigateToCalendar: () -> Unit, navigateToSearch: () -> Unit, + navigateToInternDetail: (internId: String) -> Unit, viewModel: SplashViewModel = hiltViewModel(), ) { val lifecycleOwner = LocalLifecycleOwner.current @@ -73,27 +75,27 @@ internal fun SplashRoute( } } } + lifecycleOwner.lifecycle.addObserver(observer) onDispose { lifecycleOwner.lifecycle.removeObserver(observer) } } - LaunchedEffect(viewModel.sideEffects, lifecycleOwner) { viewModel.sideEffects.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) .collect { sideEffect -> when (sideEffect) { is SplashSideEffect.HasAccessToken -> { if (sideEffect.hasAccessToken) { - if (redirect.isNullOrBlank()) { - navigateToHome() - } else { - when (NotificationRedirect.from(redirect)) { - NotificationRedirect.CALENDAR -> navigateToCalendar() - NotificationRedirect.HOME -> navigateToHome() - NotificationRedirect.SEARCH -> navigateToSearch() - else -> navigateToHome() - } + when (NotificationRedirect.from(redirect)) { + NotificationRedirect.CALENDAR -> navigateToCalendar() + NotificationRedirect.HOME -> navigateToHome() + NotificationRedirect.SEARCH -> navigateToSearch() + NotificationRedirect.INTERN -> navigateToInternDetail( + internId ?: "" + ) + + else -> navigateToHome() } } else { navigateToSignIn() @@ -103,6 +105,7 @@ internal fun SplashRoute( } } + SplashScreen( updateState = updateState, onUpdateButtonClick = context::launchPlayStore, diff --git a/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt b/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt index 301103528..fb8bdfd49 100644 --- a/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt +++ b/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt @@ -14,7 +14,8 @@ fun NavGraphBuilder.splashNavGraph( navigateHome: () -> Unit, navigateSignIn: () -> Unit, navigateSearch: () -> Unit, - navigateCalendar: () -> Unit + navigateCalendar: () -> Unit, + navigateToInternDetail: (internId: String) -> Unit, ) { composable( deepLinks = listOf( @@ -26,10 +27,12 @@ fun NavGraphBuilder.splashNavGraph( val args = it.toRoute() SplashRoute( redirect = args.redirect, + internId = args.internId, navigateToHome = navigateHome, navigateToSignIn = navigateSignIn, navigateToSearch = navigateSearch, - navigateToCalendar = navigateCalendar + navigateToCalendar = navigateCalendar, + navigateToInternDetail = navigateToInternDetail, ) } } @@ -37,5 +40,7 @@ fun NavGraphBuilder.splashNavGraph( @Serializable data class Splash( @SerialName("redirect") - val redirect: String? + val redirect: String? = null, + @SerialName("internId") + val internId: String? = null ) : Route \ No newline at end of file From 83b4e812f4e3213fe633160864e17fb50b59ecd1 Mon Sep 17 00:00:00 2001 From: arinming Date: Sun, 4 May 2025 18:16:10 +0900 Subject: [PATCH 03/35] =?UTF-8?q?[FEAT/#380]=20Intern=20=EB=94=A5=EB=A7=81?= =?UTF-8?q?=ED=81=AC=20=EC=83=81=EC=84=B8=20=EC=95=84=EC=9D=B4=EB=94=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designsystem/util/DeeplinkDefaults.kt | 16 ++++++++++++-- .../intern/navigation/InternNavigation.kt | 5 ++--- .../com/terning/feature/main/MainActivity.kt | 21 +++++++++++-------- .../com/terning/feature/main/MainScreen.kt | 2 ++ 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt b/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt index 211113ff9..b0422d06d 100644 --- a/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt +++ b/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt @@ -1,7 +1,19 @@ package com.terning.core.designsystem.util +import android.net.Uri + object DeeplinkDefaults { const val REDIRECT: String = "redirect" + const val INTERN_ID: String = "internId" + + fun build(base: String, redirect: String? = null, internId: String? = null): String { + val uriBuilder = Uri.Builder() + .scheme("terning") + .authority(base) + + redirect?.let { uriBuilder.appendQueryParameter(REDIRECT, it) } + internId?.let { uriBuilder.appendQueryParameter(INTERN_ID, it) } - fun build(base: String) = "terning://${base}" -} \ No newline at end of file + return uriBuilder.build().toString() + } +} diff --git a/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt b/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt index 6c03ab85d..ae325968b 100644 --- a/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt +++ b/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt @@ -9,12 +9,11 @@ import androidx.navigation.NavOptions import androidx.navigation.compose.composable import androidx.navigation.navDeepLink import androidx.navigation.toRoute +import com.terning.core.designsystem.util.DeeplinkDefaults import com.terning.core.navigation.Route import com.terning.feature.intern.InternRoute import kotlinx.serialization.Serializable -private const val INTERN_PATH: String = "terning://intern" - fun NavController.navigateIntern( announcementId: Long = 0, navOptions: NavOptions? = null, @@ -43,7 +42,7 @@ fun NavGraphBuilder.internNavGraph( }, deepLinks = listOf( navDeepLink( - basePath = INTERN_PATH + basePath = DeeplinkDefaults.build("intern") ) ) ) { diff --git a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt index 6e2409e74..a15cf1dd7 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt @@ -2,6 +2,7 @@ package com.terning.feature.main import android.content.Context import android.content.Intent +import android.net.Uri import android.os.Build import android.os.Bundle import androidx.activity.ComponentActivity @@ -13,6 +14,7 @@ import com.terning.core.analytics.AmplitudeTracker import com.terning.core.analytics.EventType import com.terning.core.analytics.LocalTracker import com.terning.core.designsystem.theme.TerningPointTheme +import com.terning.core.designsystem.util.DeeplinkDefaults.INTERN_ID import com.terning.core.designsystem.util.DeeplinkDefaults.REDIRECT import com.terning.core.firebase.messageservice.TerningMessagingService.Companion.FROM_NOTIFICATION import dagger.hilt.android.AndroidEntryPoint @@ -28,6 +30,7 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() + setContent { val navigator: MainNavigator = rememberMainNavigator() val (host, redirect, internId) = handleDeeplink(intent) @@ -46,14 +49,14 @@ class MainActivity : ComponentActivity() { } private fun handleDeeplink(intent: Intent?): Triple { - val uri = intent?.data - val uriString = uri?.toString() - - if (uriString.isNullOrEmpty()) return Triple(null, null, null) + val uri: Uri? = intent?.data + if (uri == null || uri.toString().isEmpty()) { + return Triple(null, null, null) + } val host = uri.host val redirect = uri.getQueryParameter(REDIRECT) - val internId = uri.getQueryParameter("internId") + val internId = uri.getQueryParameter(INTERN_ID) if (!intent.getBooleanExtra(ALREADY_TRACKED, false) && intent.getBooleanExtra(FROM_NOTIFICATION, false) @@ -72,8 +75,8 @@ class MainActivity : ComponentActivity() { companion object { private const val ALREADY_TRACKED: String = "alreadyTracked" - fun getIntent( - context: Context, - ) = Intent(context, MainActivity::class.java) + fun getIntent(context: Context): Intent { + return Intent(context, MainActivity::class.java) + } } -} \ No newline at end of file +} diff --git a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt index 1bd90c0c3..20773caeb 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt @@ -131,6 +131,8 @@ fun MainScreen( ) { paddingValues -> Column( modifier = Modifier.fillMaxSize() + + ) { NavHost( enterTransition = { From ff82fa28ab1f890c1fd097d0578ce5a1c8a41694 Mon Sep 17 00:00:00 2001 From: arinming Date: Wed, 7 May 2025 21:50:52 +0900 Subject: [PATCH 04/35] =?UTF-8?q?[FEAT/#380]=20internId=20=EB=84=98?= =?UTF-8?q?=EA=B8=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/terning/feature/main/MainScreen.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt index 20773caeb..5b26b595b 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt @@ -168,7 +168,10 @@ fun MainScreen( navigator.navController.navigateSearch(navOptions = splashNavOptions) }, navigateToInternDetail = { - navigator.navController.navigateIntern(navOptions = splashNavOptions) + navigator.navController.navigateIntern( + announcementId = it.toLong(), + navOptions = splashNavOptions + ) } ) homeNavGraph( From 8685b71eb9af12d8fad168b8e87a7f66792c5ca0 Mon Sep 17 00:00:00 2001 From: arinming Date: Thu, 8 May 2025 00:17:46 +0900 Subject: [PATCH 05/35] =?UTF-8?q?[FEAT/#380]=20=EC=8A=A4=ED=82=A4=EB=A7=88?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/intern/InternRoute.kt | 3 +- .../terning/feature/intern/InternViewModel.kt | 10 ++-- feature/main/src/main/AndroidManifest.xml | 8 +++ .../com/terning/feature/main/MainActivity.kt | 53 +++++++++++++++---- .../com/terning/feature/main/MainNavigator.kt | 4 +- 5 files changed, 62 insertions(+), 16 deletions(-) diff --git a/feature/intern/src/main/java/com/terning/feature/intern/InternRoute.kt b/feature/intern/src/main/java/com/terning/feature/intern/InternRoute.kt index 7f52a79cf..af2bd8564 100644 --- a/feature/intern/src/main/java/com/terning/feature/intern/InternRoute.kt +++ b/feature/intern/src/main/java/com/terning/feature/intern/InternRoute.kt @@ -85,7 +85,8 @@ fun InternRoute( navController = navController, onClickShareButton = { viewModel.onKakaoShareClicked( - (internState.loadState as UiState.Success).data + (internState.loadState as UiState.Success).data, + announcementId.toString() ) }, onDismissCancelDialog = { diff --git a/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt b/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt index 05dbd5df8..0c03a33c1 100644 --- a/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt +++ b/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt @@ -19,7 +19,7 @@ import javax.inject.Inject @HiltViewModel class InternViewModel @Inject constructor( private val internRepository: InternRepository, - private val kakaoUtil: KakaoUtil + private val kakaoUtil: KakaoUtil, ) : ViewModel() { private val _internUiState = MutableStateFlow(InternUiState()) @@ -68,7 +68,8 @@ class InternViewModel @Inject constructor( } fun onKakaoShareClicked( - internInfo: InternInfo + internInfo: InternInfo, + announcementId: String, ) { val templateArgs = mapOf( "COMPANY_IMG" to internInfo.companyImage, @@ -76,7 +77,10 @@ class InternViewModel @Inject constructor( "DEADLINE" to internInfo.deadline, "START_DATE" to internInfo.startYearMonth, "PERIOD" to internInfo.workingPeriod, - "REGI_WEB_DOMAIN" to internInfo.url + "A_E" to "kakaolint", + "A_E_D" to "intern", + "redirect" to "intern", + "internId" to announcementId, ) kakaoUtil.shareToKakaoTalk(templateArgs) } diff --git a/feature/main/src/main/AndroidManifest.xml b/feature/main/src/main/AndroidManifest.xml index bdac0a681..c2003e701 100644 --- a/feature/main/src/main/AndroidManifest.xml +++ b/feature/main/src/main/AndroidManifest.xml @@ -23,7 +23,15 @@ + + + + + + { + if (!intent.getBooleanExtra(ALREADY_TRACKED, false) + && intent.getBooleanExtra(FROM_NOTIFICATION, false) + ) { + tracker.track( + type = EventType.PUSH_NOTIFICATION, + name = "opened" + ) + } + intent.putExtra(ALREADY_TRACKED, true) - intent.putExtra(ALREADY_TRACKED, true) + return Triple(host, redirect, internId) + } - return Triple(host, redirect, internId) + "kakaolint" -> { + if (!intent.getBooleanExtra(ALREADY_TRACKED, false) + && intent.getBooleanExtra(FROM_NOTIFICATION, false) + ) { + tracker.track( + type = EventType.PUSH_NOTIFICATION, + name = "opened" + ) + } + + intent.putExtra(ALREADY_TRACKED, true) + + return Triple(host, redirect, internId) + } + } + + return Triple(null, null, null) } + companion object { private const val ALREADY_TRACKED: String = "alreadyTracked" @@ -79,4 +101,15 @@ class MainActivity : ComponentActivity() { return Intent(context, MainActivity::class.java) } } + + private fun sendKakaoLinkIntent(redirect: String?, internId: String?) { + val kakaoLinkUrl = "kakaolint://splash?redirect=$redirect&internId=$internId" + val uri = Uri.parse(kakaoLinkUrl) + + val intent = Intent(Intent.ACTION_VIEW, uri).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + + startActivity(intent) + } } diff --git a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt index 47dff938a..c88671bb5 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt @@ -31,8 +31,8 @@ class MainNavigator( NotificationRedirect.SEARCH -> Search NotificationRedirect.HOME -> Home NotificationRedirect.CALENDAR -> Calendar - NotificationRedirect.INTERN -> Splash(internId = internId) - else -> Splash(redirect) + NotificationRedirect.INTERN -> Splash(redirect = redirect, internId = internId) + else -> Splash(redirect = redirect) } val currentTab: MainTab? From 59a6c8d682ea03cc79d87b9bf65ed86c93028cff Mon Sep 17 00:00:00 2001 From: arinming Date: Thu, 8 May 2025 22:10:27 +0900 Subject: [PATCH 06/35] =?UTF-8?q?[FIX/#380]=20lint=20->=20link=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/terning/feature/intern/InternViewModel.kt | 2 +- feature/main/src/main/AndroidManifest.xml | 2 +- .../src/main/java/com/terning/feature/main/MainActivity.kt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt b/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt index 0c03a33c1..da4319e2a 100644 --- a/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt +++ b/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt @@ -77,7 +77,7 @@ class InternViewModel @Inject constructor( "DEADLINE" to internInfo.deadline, "START_DATE" to internInfo.startYearMonth, "PERIOD" to internInfo.workingPeriod, - "A_E" to "kakaolint", + "A_E" to "kakaolink", "A_E_D" to "intern", "redirect" to "intern", "internId" to announcementId, diff --git a/feature/main/src/main/AndroidManifest.xml b/feature/main/src/main/AndroidManifest.xml index c2003e701..8c9f08877 100644 --- a/feature/main/src/main/AndroidManifest.xml +++ b/feature/main/src/main/AndroidManifest.xml @@ -30,7 +30,7 @@ diff --git a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt index 0200cc27c..ffc9dd9e5 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt @@ -74,7 +74,7 @@ class MainActivity : ComponentActivity() { return Triple(host, redirect, internId) } - "kakaolint" -> { + "kakaolink" -> { if (!intent.getBooleanExtra(ALREADY_TRACKED, false) && intent.getBooleanExtra(FROM_NOTIFICATION, false) ) { @@ -103,7 +103,7 @@ class MainActivity : ComponentActivity() { } private fun sendKakaoLinkIntent(redirect: String?, internId: String?) { - val kakaoLinkUrl = "kakaolint://splash?redirect=$redirect&internId=$internId" + val kakaoLinkUrl = "kakaolink://splash?redirect=$redirect&internId=$internId" val uri = Uri.parse(kakaoLinkUrl) val intent = Intent(Intent.ACTION_VIEW, uri).apply { From c89ce65fc1915b24ea2b8c3187fd9ab1964047e3 Mon Sep 17 00:00:00 2001 From: arinming Date: Sat, 10 May 2025 13:43:41 +0900 Subject: [PATCH 07/35] =?UTF-8?q?[FIX/#380]=20=EB=A7=A4=EB=8B=88=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 12 ------------ feature/main/build.gradle.kts | 17 +++++++++++++++++ feature/main/src/main/AndroidManifest.xml | 4 ++-- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9a85b9266..526328c6c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,18 +28,6 @@ android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity" android:exported="true" android:windowSoftInputMode="adjustResize"> - - - - - - - - - - diff --git a/feature/main/build.gradle.kts b/feature/main/build.gradle.kts index 79698c6ef..cd074e5cb 100644 --- a/feature/main/build.gradle.kts +++ b/feature/main/build.gradle.kts @@ -1,11 +1,28 @@ import com.terning.build_logic.extension.setNamespace +import java.util.Properties plugins { alias(libs.plugins.terning.feature) } +val properties = Properties().apply { + load(rootProject.file("local.properties").inputStream()) +} + android { + buildFeatures { + buildConfig = true + } + setNamespace("feature.main") + + defaultConfig { + buildConfigField( + "String", + "NATIVE_APP_KEY", + properties.getProperty("native.app.key"), + ) + } } dependencies { diff --git a/feature/main/src/main/AndroidManifest.xml b/feature/main/src/main/AndroidManifest.xml index 8c9f08877..77e91054d 100644 --- a/feature/main/src/main/AndroidManifest.xml +++ b/feature/main/src/main/AndroidManifest.xml @@ -30,8 +30,8 @@ + android:scheme="kakao${NATIVE_APP_KEY}" + android:host="kakaolink" /> Date: Sat, 10 May 2025 17:43:24 +0900 Subject: [PATCH 08/35] =?UTF-8?q?[FEAT/#380]=20=EB=A9=94=EB=8B=88=ED=8E=98?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 11 +++++++++++ feature/main/src/main/AndroidManifest.xml | 8 ++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 526328c6c..9a8d3586c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,17 @@ android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity" android:exported="true" android:windowSoftInputMode="adjustResize"> + + + + + + + + + diff --git a/feature/main/src/main/AndroidManifest.xml b/feature/main/src/main/AndroidManifest.xml index 77e91054d..d17241268 100644 --- a/feature/main/src/main/AndroidManifest.xml +++ b/feature/main/src/main/AndroidManifest.xml @@ -25,14 +25,18 @@ + - - + + + + + Date: Sat, 10 May 2025 22:03:39 +0900 Subject: [PATCH 09/35] =?UTF-8?q?[FEAT/#380]=20=EB=A9=94=EB=8B=88=ED=8E=98?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B9=88=20=EC=A4=84=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/main/src/main/AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/feature/main/src/main/AndroidManifest.xml b/feature/main/src/main/AndroidManifest.xml index d17241268..7088005cb 100644 --- a/feature/main/src/main/AndroidManifest.xml +++ b/feature/main/src/main/AndroidManifest.xml @@ -25,7 +25,6 @@ - From 0ae0aba6e61e13e29f24452bfe961241525d3576 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:04:03 +0900 Subject: [PATCH 10/35] =?UTF-8?q?[FEAT/#380]=20NotificationRedirect=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/core/designsystem/type/NotificationRedirect.kt | 5 +++-- .../core/firebase/messageservice/TerningMessagingService.kt | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt b/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt index 6a94f7da7..c7f48179c 100644 --- a/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt +++ b/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt @@ -1,13 +1,14 @@ package com.terning.core.designsystem.type -enum class NotificationRedirect(val path: String) { +enum class DeeplinkHost(val path: String) { CALENDAR("calendar"), HOME("home"), SEARCH("search"), + KAKAOLINK("kakaolink"), INTERN("intern"); companion object { - fun from(type: String?): NotificationRedirect? = + fun from(type: String?): DeeplinkHost? = entries.firstOrNull { it.path.equals(type, ignoreCase = true) } } } diff --git a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt index 5996f7fc7..0b500a2d2 100644 --- a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt +++ b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt @@ -16,7 +16,7 @@ import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.RemoteMessage import com.terning.core.analytics.AmplitudeTracker import com.terning.core.analytics.EventType -import com.terning.core.designsystem.type.NotificationRedirect +import com.terning.core.designsystem.type.DeeplinkHost import com.terning.core.designsystem.util.DeeplinkDefaults import com.terning.core.designsystem.util.DeeplinkDefaults.REDIRECT import com.terning.core.firebase.R @@ -162,7 +162,7 @@ class TerningMessagingService : FirebaseMessagingService() { } private fun buildDeeplink(type: String, isForeground: Boolean): String { - val base = NotificationRedirect.from(type) ?: return "" + val base = DeeplinkHost.from(type) ?: return "" return if (isForeground) DeeplinkDefaults.build(base.path) else DeeplinkDefaults.build("splash?$REDIRECT=${base.path}") From 0dbb8e8c2ca6fcf32cead6e26ab2961105f5fd85 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:04:57 +0900 Subject: [PATCH 11/35] =?UTF-8?q?[FEAT/#380]=20MainActivity=20handleDeepli?= =?UTF-8?q?nk=20=ED=95=A8=EC=88=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/main/MainActivity.kt | 56 ++++--------------- 1 file changed, 12 insertions(+), 44 deletions(-) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt index ffc9dd9e5..8f2ae766b 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt @@ -50,50 +50,29 @@ class MainActivity : ComponentActivity() { private fun handleDeeplink(intent: Intent?): Triple { val uri: Uri? = intent?.data - if (uri == null || uri.toString().isEmpty()) { + val uriString = uri?.toString() + + if (uriString.isNullOrEmpty()) { return Triple(null, null, null) } - val scheme = uri.scheme val host = uri.host val redirect = uri.getQueryParameter(REDIRECT) val internId = uri.getQueryParameter(INTERN_ID) - when (scheme) { - "terning" -> { - if (!intent.getBooleanExtra(ALREADY_TRACKED, false) - && intent.getBooleanExtra(FROM_NOTIFICATION, false) - ) { - tracker.track( - type = EventType.PUSH_NOTIFICATION, - name = "opened" - ) - } - intent.putExtra(ALREADY_TRACKED, true) - - return Triple(host, redirect, internId) - } - - "kakaolink" -> { - if (!intent.getBooleanExtra(ALREADY_TRACKED, false) - && intent.getBooleanExtra(FROM_NOTIFICATION, false) - ) { - tracker.track( - type = EventType.PUSH_NOTIFICATION, - name = "opened" - ) - } - - intent.putExtra(ALREADY_TRACKED, true) - - return Triple(host, redirect, internId) - } + if (!intent.getBooleanExtra(ALREADY_TRACKED, false) + && intent.getBooleanExtra(FROM_NOTIFICATION, false) + ) { + tracker.track( + type = EventType.PUSH_NOTIFICATION, + name = "opened" + ) } + intent.putExtra(ALREADY_TRACKED, true) - return Triple(null, null, null) + return Triple(host, redirect, internId) } - companion object { private const val ALREADY_TRACKED: String = "alreadyTracked" @@ -101,15 +80,4 @@ class MainActivity : ComponentActivity() { return Intent(context, MainActivity::class.java) } } - - private fun sendKakaoLinkIntent(redirect: String?, internId: String?) { - val kakaoLinkUrl = "kakaolink://splash?redirect=$redirect&internId=$internId" - val uri = Uri.parse(kakaoLinkUrl) - - val intent = Intent(Intent.ACTION_VIEW, uri).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - } - - startActivity(intent) - } } From e964bee54ab4ded70f7ae61145bc2eaeec59c66c Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:05:52 +0900 Subject: [PATCH 12/35] =?UTF-8?q?[FEAT/#380]=20HomeNavigation=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=AA=85=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20?= =?UTF-8?q?=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98=20=EB=A3=A8?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20internId=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{HometNavigation.kt => HomeNavigation.kt} | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) rename feature/home/src/main/java/com/terning/feature/home/navigation/{HometNavigation.kt => HomeNavigation.kt} (75%) diff --git a/feature/home/src/main/java/com/terning/feature/home/navigation/HometNavigation.kt b/feature/home/src/main/java/com/terning/feature/home/navigation/HomeNavigation.kt similarity index 75% rename from feature/home/src/main/java/com/terning/feature/home/navigation/HometNavigation.kt rename to feature/home/src/main/java/com/terning/feature/home/navigation/HomeNavigation.kt index 3108a889e..27f9705b2 100644 --- a/feature/home/src/main/java/com/terning/feature/home/navigation/HometNavigation.kt +++ b/feature/home/src/main/java/com/terning/feature/home/navigation/HomeNavigation.kt @@ -8,14 +8,19 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable import androidx.navigation.navDeepLink +import androidx.navigation.toRoute import com.terning.core.designsystem.util.DeeplinkDefaults import com.terning.core.navigation.MainTabRoute import com.terning.feature.home.HomeRoute +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -fun NavController.navigateHome(navOptions: NavOptions? = null) { +fun NavController.navigateHome( + internId: String?, + navOptions: NavOptions? = null +) { navigate( - route = Home, + route = Home(internId), navOptions = navOptions ) } @@ -33,7 +38,9 @@ fun NavGraphBuilder.homeNavGraph( ) ) ) { + val args = it.toRoute() HomeRoute( + internId = args.internId, paddingValues = paddingValues, navigateToCalendar = navigateToCalendar, navigateToIntern = navigateToIntern @@ -42,4 +49,7 @@ fun NavGraphBuilder.homeNavGraph( } @Serializable -data object Home : MainTabRoute \ No newline at end of file +data class Home( + @SerialName("internId") + val internId: String? = null +) : MainTabRoute \ No newline at end of file From 63b0cc18366649344a4b562e2cb23a49a2bb7546 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:06:09 +0900 Subject: [PATCH 13/35] =?UTF-8?q?[FEAT/#380]=20=EA=B3=B5=EA=B3=A0=EC=83=81?= =?UTF-8?q?=EC=84=B8=ED=8E=98=EC=9D=B4=EC=A7=80=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=ED=95=98=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 --- .../main/java/com/terning/feature/home/HomeRoute.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt b/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt index e1a3c0fb5..dbdc4a0a6 100644 --- a/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt +++ b/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt @@ -22,6 +22,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment @@ -81,6 +82,7 @@ private const val ZERO_TOTAL_COUNT = 0 @OptIn(ExperimentalPermissionsApi::class) @Composable fun HomeRoute( + internId: String?, paddingValues: PaddingValues, viewModel: HomeViewModel = hiltViewModel(), navigateToCalendar: () -> Unit, @@ -103,6 +105,15 @@ fun HomeRoute( } } + val hasNavigatedToIntern = rememberSaveable { mutableStateOf(false) } + + LaunchedEffect(internId, hasNavigatedToIntern.value) { + if (internId != null && !hasNavigatedToIntern.value) { + navigateToIntern(internId.toLong()) + hasNavigatedToIntern.value = true + } + } + LaunchedEffect(key1 = true) { viewModel.getProfile() viewModel.getFilteringInfo() From ed50dc5b88012a88fecbcfbc99e34e8a63b201ea Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:06:18 +0900 Subject: [PATCH 14/35] =?UTF-8?q?[FEAT/#380]=20=EC=9D=B8=ED=84=B4=20?= =?UTF-8?q?=EB=94=A5=EB=A7=81=ED=81=AC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/intern/navigation/InternNavigation.kt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt b/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt index ae325968b..7bc5c14c3 100644 --- a/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt +++ b/feature/intern/src/main/java/com/terning/feature/intern/navigation/InternNavigation.kt @@ -7,9 +7,7 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.NavOptions import androidx.navigation.compose.composable -import androidx.navigation.navDeepLink import androidx.navigation.toRoute -import com.terning.core.designsystem.util.DeeplinkDefaults import com.terning.core.navigation.Route import com.terning.feature.intern.InternRoute import kotlinx.serialization.Serializable @@ -39,12 +37,7 @@ fun NavGraphBuilder.internNavGraph( }, popExitTransition = { ExitTransition.None - }, - deepLinks = listOf( - navDeepLink( - basePath = DeeplinkDefaults.build("intern") - ) - ) + } ) { val args = it.toRoute() InternRoute( From 45189ba88fc9362396b584d2719df04ae3417512 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:06:31 +0900 Subject: [PATCH 15/35] =?UTF-8?q?[FEAT/#380]=20Home=20=EB=9D=BC=EC=9A=B0?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EB=84=A4=EB=B9=84?= =?UTF-8?q?=EA=B2=8C=EC=9D=B4=ED=84=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/main/MainNavigator.kt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt index c88671bb5..bd09a9639 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt @@ -8,7 +8,7 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions -import com.terning.core.designsystem.type.NotificationRedirect +import com.terning.core.designsystem.type.DeeplinkHost import com.terning.feature.calendar.calendar.navigation.Calendar import com.terning.feature.calendar.calendar.navigation.navigateCalendar import com.terning.feature.home.navigation.Home @@ -26,15 +26,17 @@ class MainNavigator( @Composable get() = navController .currentBackStackEntryAsState().value?.destination - fun getStartDestination(redirect: String?, host: String?, internId: String?) = - when (NotificationRedirect.from(host)) { - NotificationRedirect.SEARCH -> Search - NotificationRedirect.HOME -> Home - NotificationRedirect.CALENDAR -> Calendar - NotificationRedirect.INTERN -> Splash(redirect = redirect, internId = internId) + fun getStartDestination(host: String?, redirect: String?, internId: String?) = + when (DeeplinkHost.from(host)) { + DeeplinkHost.SEARCH -> Search + DeeplinkHost.HOME -> Home(internId = null) + DeeplinkHost.CALENDAR -> Calendar + DeeplinkHost.KAKAOLINK -> Splash(redirect = redirect, internId = internId) + else -> Splash(redirect = redirect) } + val currentTab: MainTab? @Composable get() = MainTab.find { tab -> currentDestination?.hasRoute(tab::class) == true @@ -53,7 +55,7 @@ class MainNavigator( } when (tab) { - MainTab.HOME -> navController.navigateHome(navOptions) + MainTab.HOME -> navController.navigateHome(navOptions = navOptions, internId = null) MainTab.CALENDAR -> navController.navigateCalendar(navOptions) MainTab.SEARCH -> navController.navigateSearch(navOptions) MainTab.MY_PAGE -> navController.navigateMyPage(navOptions) From e69d0c1e6512a683b87b06a7113462b6f302367c Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:06:47 +0900 Subject: [PATCH 16/35] =?UTF-8?q?[FEAT/#380]=20Home=20=EB=9D=BC=EC=9A=B0?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20=EB=A7=9E=EA=B2=8C=20MainScreen=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 --- .../com/terning/feature/main/MainScreen.kt | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt index 5b26b595b..45074d91f 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt @@ -91,7 +91,7 @@ fun MainScreen( val amplitudeTracker = LocalTracker.current val splashNavOptions = NavOptions.Builder().setPopUpTo( - route = Splash(redirect), + route = Splash(redirect = redirect, internId = internId), inclusive = true ).build() @@ -131,8 +131,6 @@ fun MainScreen( ) { paddingValues -> Column( modifier = Modifier.fillMaxSize() - - ) { NavHost( enterTransition = { @@ -149,14 +147,17 @@ fun MainScreen( }, navController = navigator.navController, startDestination = navigator.getStartDestination( - redirect = redirect, host = host, + redirect = redirect, internId = internId ) ) { splashNavGraph( - navigateHome = { - navigator.navController.navigateHome(navOptions = splashNavOptions) + navigateHome = { internId -> + navigator.navController.navigateHome( + navOptions = splashNavOptions, + internId = internId + ) }, navigateSignIn = { navigator.navController.navigateSignIn(navOptions = splashNavOptions) @@ -166,12 +167,6 @@ fun MainScreen( }, navigateSearch = { navigator.navController.navigateSearch(navOptions = splashNavOptions) - }, - navigateToInternDetail = { - navigator.navController.navigateIntern( - announcementId = it.toLong(), - navOptions = splashNavOptions - ) } ) homeNavGraph( @@ -201,7 +196,10 @@ fun MainScreen( inclusive = true } } - navigator.navController.navigateHome(navOptions) + navigator.navController.navigateHome( + navOptions = navOptions, + internId = null + ) }, navigateSignUp = { authId -> val navOptions = navOptions { @@ -238,7 +236,10 @@ fun MainScreen( inclusive = true } } - navigator.navController.navigateHome(navOptions) + navigator.navController.navigateHome( + navOptions = navOptions, + internId = null + ) } ) startHomeNavGraph( @@ -248,7 +249,10 @@ fun MainScreen( inclusive = true } } - navigator.navController.navigateHome(navOptions) + navigator.navController.navigateHome( + navOptions = navOptions, + internId = null + ) } ) filteringOneNavGraph(navHostController = navigator.navController) From 30d2945b75fca707d38aa74d9d88657b1c393845 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:07:01 +0900 Subject: [PATCH 17/35] =?UTF-8?q?[FEAT/#380]=20Home=20=EB=9D=BC=EC=9A=B0?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20=EB=A7=9E=EA=B2=8C=20MainTab=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 --- feature/main/src/main/java/com/terning/feature/main/MainTab.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainTab.kt b/feature/main/src/main/java/com/terning/feature/main/MainTab.kt index 5d0868749..44048defd 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainTab.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainTab.kt @@ -18,7 +18,7 @@ enum class MainTab( HOME( icon = R.drawable.ic_nav_home, contentDescription = R.string.bottom_nav_home, - route = Home + route = Home(null) ), CALENDAR( icon = R.drawable.ic_nav_calendar, From 8e4fe397e3cce58c3b14f7c79493bbafde946136 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:07:18 +0900 Subject: [PATCH 18/35] =?UTF-8?q?[FEAT/#380]=20Splash=20=EB=B6=84=EA=B8=B0?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/splash/SplashRoute.kt | 21 ++++++++----------- .../splash/navigation/SplashNavigation.kt | 6 ++---- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt b/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt index ce0770f9c..c0d4aa5d4 100644 --- a/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt +++ b/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt @@ -28,7 +28,7 @@ import com.terning.core.designsystem.extension.launchPlayStore import com.terning.core.designsystem.theme.TerningMain import com.terning.core.designsystem.theme.TerningPointTheme import com.terning.core.designsystem.theme.White -import com.terning.core.designsystem.type.NotificationRedirect +import com.terning.core.designsystem.type.DeeplinkHost import com.terning.domain.update.entity.UpdateState import com.terning.feature.splash.component.TerningMajorUpdateDialog import com.terning.feature.splash.component.TerningPatchUpdateDialog @@ -38,11 +38,10 @@ import kotlinx.coroutines.launch internal fun SplashRoute( redirect: String?, internId: String?, - navigateToHome: () -> Unit, + navigateToHome: (internId: String?) -> Unit, navigateToSignIn: () -> Unit, navigateToCalendar: () -> Unit, navigateToSearch: () -> Unit, - navigateToInternDetail: (internId: String) -> Unit, viewModel: SplashViewModel = hiltViewModel(), ) { val lifecycleOwner = LocalLifecycleOwner.current @@ -81,21 +80,20 @@ internal fun SplashRoute( lifecycleOwner.lifecycle.removeObserver(observer) } } + LaunchedEffect(viewModel.sideEffects, lifecycleOwner) { viewModel.sideEffects.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle) .collect { sideEffect -> when (sideEffect) { is SplashSideEffect.HasAccessToken -> { if (sideEffect.hasAccessToken) { - when (NotificationRedirect.from(redirect)) { - NotificationRedirect.CALENDAR -> navigateToCalendar() - NotificationRedirect.HOME -> navigateToHome() - NotificationRedirect.SEARCH -> navigateToSearch() - NotificationRedirect.INTERN -> navigateToInternDetail( - internId ?: "" - ) + when (DeeplinkHost.from(redirect)) { + DeeplinkHost.CALENDAR -> navigateToCalendar() + DeeplinkHost.HOME -> navigateToHome(null) + DeeplinkHost.SEARCH -> navigateToSearch() + DeeplinkHost.INTERN -> navigateToHome(internId.orEmpty()) - else -> navigateToHome() + else -> navigateToHome(null) } } else { navigateToSignIn() @@ -105,7 +103,6 @@ internal fun SplashRoute( } } - SplashScreen( updateState = updateState, onUpdateButtonClick = context::launchPlayStore, diff --git a/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt b/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt index fb8bdfd49..333372891 100644 --- a/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt +++ b/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt @@ -11,11 +11,10 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable fun NavGraphBuilder.splashNavGraph( - navigateHome: () -> Unit, + navigateHome: (internId: String?) -> Unit, navigateSignIn: () -> Unit, navigateSearch: () -> Unit, navigateCalendar: () -> Unit, - navigateToInternDetail: (internId: String) -> Unit, ) { composable( deepLinks = listOf( @@ -31,8 +30,7 @@ fun NavGraphBuilder.splashNavGraph( navigateToHome = navigateHome, navigateToSignIn = navigateSignIn, navigateToSearch = navigateSearch, - navigateToCalendar = navigateCalendar, - navigateToInternDetail = navigateToInternDetail, + navigateToCalendar = navigateCalendar ) } } From c2c11ef9d07ac6ad774030b6986c9e7c2be28c42 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:09:11 +0900 Subject: [PATCH 19/35] =?UTF-8?q?[FEAT/#380]=20EOF=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/terning/feature/home/navigation/HomeNavigation.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/home/src/main/java/com/terning/feature/home/navigation/HomeNavigation.kt b/feature/home/src/main/java/com/terning/feature/home/navigation/HomeNavigation.kt index 27f9705b2..fb47438c0 100644 --- a/feature/home/src/main/java/com/terning/feature/home/navigation/HomeNavigation.kt +++ b/feature/home/src/main/java/com/terning/feature/home/navigation/HomeNavigation.kt @@ -52,4 +52,4 @@ fun NavGraphBuilder.homeNavGraph( data class Home( @SerialName("internId") val internId: String? = null -) : MainTabRoute \ No newline at end of file +) : MainTabRoute From bcfc49f6c38743bf8acb858f1eb6bc11008fdf82 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:12:22 +0900 Subject: [PATCH 20/35] =?UTF-8?q?[FEAT/#380]=20EOF=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/splash/navigation/SplashNavigation.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt b/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt index 333372891..1f683533b 100644 --- a/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt +++ b/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt @@ -41,4 +41,4 @@ data class Splash( val redirect: String? = null, @SerialName("internId") val internId: String? = null -) : Route \ No newline at end of file +) : Route From 20e0631064f7cb560311722ee043b564ebbcc4ae Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:12:43 +0900 Subject: [PATCH 21/35] =?UTF-8?q?[FEAT/#380]=20MainActivity=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=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/terning/feature/main/MainActivity.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt index 8f2ae766b..bbe50d4d4 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt @@ -50,7 +50,7 @@ class MainActivity : ComponentActivity() { private fun handleDeeplink(intent: Intent?): Triple { val uri: Uri? = intent?.data - val uriString = uri?.toString() + val uriString: String? = uri?.toString() if (uriString.isNullOrEmpty()) { return Triple(null, null, null) @@ -76,8 +76,8 @@ class MainActivity : ComponentActivity() { companion object { private const val ALREADY_TRACKED: String = "alreadyTracked" - fun getIntent(context: Context): Intent { - return Intent(context, MainActivity::class.java) - } + fun getIntent( + context: Context, + ) = Intent(context, MainActivity::class.java) } } From ddfdb0986982c86329880254e876b710efb7e08e Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sat, 10 May 2025 22:23:43 +0900 Subject: [PATCH 22/35] =?UTF-8?q?[FEAT/#380]=20=EC=A4=84=EB=B0=94=EA=BF=88?= =?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 --- .../main/src/main/java/com/terning/feature/main/MainActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt index bbe50d4d4..7ae54e262 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt @@ -68,6 +68,7 @@ class MainActivity : ComponentActivity() { name = "opened" ) } + intent.putExtra(ALREADY_TRACKED, true) return Triple(host, redirect, internId) From e93ef5dfc26d8118d4f6a6b531b0b488af84b359 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 11 May 2025 01:53:03 +0900 Subject: [PATCH 23/35] =?UTF-8?q?[FEAT/#380]=20MainActivity=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=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/terning/feature/main/MainActivity.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt index 7ae54e262..d7ccd88e4 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt @@ -2,7 +2,6 @@ package com.terning.feature.main import android.content.Context import android.content.Intent -import android.net.Uri import android.os.Build import android.os.Bundle import androidx.activity.ComponentActivity @@ -49,12 +48,10 @@ class MainActivity : ComponentActivity() { } private fun handleDeeplink(intent: Intent?): Triple { - val uri: Uri? = intent?.data - val uriString: String? = uri?.toString() + val uri = intent?.data + val uriString = uri?.toString() - if (uriString.isNullOrEmpty()) { - return Triple(null, null, null) - } + if (uriString.isNullOrEmpty()) return Triple(null, null, null) val host = uri.host val redirect = uri.getQueryParameter(REDIRECT) From 3e57f05b3099fe84e781ba4ab6f1c089573e348e Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 11 May 2025 02:35:48 +0900 Subject: [PATCH 24/35] =?UTF-8?q?[FEAT/#380]=20by=20=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/terning/feature/home/HomeRoute.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt b/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt index dbdc4a0a6..b6cfff2de 100644 --- a/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt +++ b/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt @@ -105,12 +105,12 @@ fun HomeRoute( } } - val hasNavigatedToIntern = rememberSaveable { mutableStateOf(false) } + var hasNavigatedToIntern by rememberSaveable { mutableStateOf(false) } - LaunchedEffect(internId, hasNavigatedToIntern.value) { - if (internId != null && !hasNavigatedToIntern.value) { + LaunchedEffect(internId, hasNavigatedToIntern) { + if (internId != null && !hasNavigatedToIntern) { navigateToIntern(internId.toLong()) - hasNavigatedToIntern.value = true + hasNavigatedToIntern = true } } From da949770c0d8d0ee7ea892b20c004db82921486d Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 11 May 2025 03:03:16 +0900 Subject: [PATCH 25/35] =?UTF-8?q?[FEAT/#380]=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EB=94=A5=EB=A7=81=ED=81=AC=20=EC=98=A4=EB=A5=98=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 --- .../core/firebase/messageservice/TerningMessagingService.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt index 0b500a2d2..dc62385a6 100644 --- a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt +++ b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt @@ -18,7 +18,6 @@ import com.terning.core.analytics.AmplitudeTracker import com.terning.core.analytics.EventType import com.terning.core.designsystem.type.DeeplinkHost import com.terning.core.designsystem.util.DeeplinkDefaults -import com.terning.core.designsystem.util.DeeplinkDefaults.REDIRECT import com.terning.core.firebase.R import com.terning.domain.user.repository.UserRepository import com.terning.navigator.NavigatorProvider @@ -165,7 +164,7 @@ class TerningMessagingService : FirebaseMessagingService() { val base = DeeplinkHost.from(type) ?: return "" return if (isForeground) DeeplinkDefaults.build(base.path) - else DeeplinkDefaults.build("splash?$REDIRECT=${base.path}") + else DeeplinkDefaults.build(host = BACKGROUND_HOST, redirect = base.path) } companion object { @@ -174,6 +173,7 @@ class TerningMessagingService : FirebaseMessagingService() { private const val BODY: String = "body" private const val TYPE: String = "type" private const val IMAGE_URL: String = "imageUrl" + private const val BACKGROUND_HOST: String = "splash" const val FROM_NOTIFICATION: String = "fromNotification" } } From ffa033723b0202b6e511ad0f0f526061011fc22e Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 11 May 2025 03:04:16 +0900 Subject: [PATCH 26/35] =?UTF-8?q?[FEAT/#380]=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EB=94=A5=EB=A7=81=ED=81=AC=20=EC=98=A4=EB=A5=98=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 --- .../core/firebase/messageservice/TerningMessagingService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt index dc62385a6..b85faa2d6 100644 --- a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt +++ b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt @@ -163,7 +163,7 @@ class TerningMessagingService : FirebaseMessagingService() { private fun buildDeeplink(type: String, isForeground: Boolean): String { val base = DeeplinkHost.from(type) ?: return "" - return if (isForeground) DeeplinkDefaults.build(base.path) + return if (isForeground) DeeplinkDefaults.build(host = base.path) else DeeplinkDefaults.build(host = BACKGROUND_HOST, redirect = base.path) } From b3f828a85ce2185f5a9ac6dc514ad9f118345203 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 11 May 2025 03:05:40 +0900 Subject: [PATCH 27/35] =?UTF-8?q?[FEAT/#380]=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=20base=20->=20host=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../terning/core/designsystem/util/DeeplinkDefaults.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt b/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt index b0422d06d..c663303d6 100644 --- a/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt +++ b/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt @@ -6,10 +6,14 @@ object DeeplinkDefaults { const val REDIRECT: String = "redirect" const val INTERN_ID: String = "internId" - fun build(base: String, redirect: String? = null, internId: String? = null): String { + fun build( + host: String, + redirect: String? = null, + internId: String? = null + ): String { val uriBuilder = Uri.Builder() .scheme("terning") - .authority(base) + .authority(host) redirect?.let { uriBuilder.appendQueryParameter(REDIRECT, it) } internId?.let { uriBuilder.appendQueryParameter(INTERN_ID, it) } From eca85d39a08f79280c22bb8bba7e1e50e111b2e2 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 11 May 2025 03:08:21 +0900 Subject: [PATCH 28/35] =?UTF-8?q?[FEAT/#380]=20=EC=A4=84=EB=B0=94=EA=BF=88?= =?UTF-8?q?=20=EB=84=A3=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/feature/main/MainNavigator.kt | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt index bd09a9639..687afd1a8 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt @@ -26,16 +26,18 @@ class MainNavigator( @Composable get() = navController .currentBackStackEntryAsState().value?.destination - fun getStartDestination(host: String?, redirect: String?, internId: String?) = - when (DeeplinkHost.from(host)) { - DeeplinkHost.SEARCH -> Search - DeeplinkHost.HOME -> Home(internId = null) - DeeplinkHost.CALENDAR -> Calendar - DeeplinkHost.KAKAOLINK -> Splash(redirect = redirect, internId = internId) - - else -> Splash(redirect = redirect) - } + fun getStartDestination( + host: String?, + redirect: String?, + internId: String? + ) = when (DeeplinkHost.from(host)) { + DeeplinkHost.SEARCH -> Search + DeeplinkHost.HOME -> Home(internId = null) + DeeplinkHost.CALENDAR -> Calendar + DeeplinkHost.KAKAOLINK -> Splash(redirect = redirect, internId = internId) + else -> Splash(redirect = redirect) + } val currentTab: MainTab? @Composable get() = MainTab.find { tab -> From 6aa0f73e1aac5253cb6f55177a250340ba527612 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 11 May 2025 03:14:08 +0900 Subject: [PATCH 29/35] =?UTF-8?q?[FEAT/#380]=20scheme=20=EC=83=81=EC=88=98?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/terning/core/designsystem/util/DeeplinkDefaults.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt b/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt index c663303d6..fd105e119 100644 --- a/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt +++ b/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt @@ -3,6 +3,7 @@ package com.terning.core.designsystem.util import android.net.Uri object DeeplinkDefaults { + private const val SCHEME: String = "terning" const val REDIRECT: String = "redirect" const val INTERN_ID: String = "internId" @@ -12,7 +13,7 @@ object DeeplinkDefaults { internId: String? = null ): String { val uriBuilder = Uri.Builder() - .scheme("terning") + .scheme(SCHEME) .authority(host) redirect?.let { uriBuilder.appendQueryParameter(REDIRECT, it) } From 104793d80bc956ba1127e4d5c7c2c36ad837d96a Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 11 May 2025 03:16:31 +0900 Subject: [PATCH 30/35] =?UTF-8?q?[FEAT/#380]=20hasHandledInternDeeplink=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=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/terning/feature/home/HomeRoute.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt b/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt index b6cfff2de..0e9afed13 100644 --- a/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt +++ b/feature/home/src/main/java/com/terning/feature/home/HomeRoute.kt @@ -105,12 +105,12 @@ fun HomeRoute( } } - var hasNavigatedToIntern by rememberSaveable { mutableStateOf(false) } + var hasHandledInternDeeplink by rememberSaveable { mutableStateOf(false) } - LaunchedEffect(internId, hasNavigatedToIntern) { - if (internId != null && !hasNavigatedToIntern) { + LaunchedEffect(internId, hasHandledInternDeeplink) { + if (internId != null && !hasHandledInternDeeplink) { navigateToIntern(internId.toLong()) - hasNavigatedToIntern = true + hasHandledInternDeeplink = true } } From 54cc9991e9bfbfde70f0b331ae5ccd4f1b22f84a Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 11 May 2025 03:50:50 +0900 Subject: [PATCH 31/35] =?UTF-8?q?[FEAT/#380]=20DeeplinkType=20=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/designsystem/type/NotificationRedirect.kt | 4 ++-- .../messageservice/TerningMessagingService.kt | 4 ++-- .../java/com/terning/feature/main/MainNavigator.kt | 12 ++++++------ .../java/com/terning/feature/splash/SplashRoute.kt | 12 ++++++------ 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt b/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt index c7f48179c..221aa43c0 100644 --- a/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt +++ b/core/designsystem/src/main/java/com/terning/core/designsystem/type/NotificationRedirect.kt @@ -1,6 +1,6 @@ package com.terning.core.designsystem.type -enum class DeeplinkHost(val path: String) { +enum class DeeplinkType(val path: String) { CALENDAR("calendar"), HOME("home"), SEARCH("search"), @@ -8,7 +8,7 @@ enum class DeeplinkHost(val path: String) { INTERN("intern"); companion object { - fun from(type: String?): DeeplinkHost? = + fun from(type: String?): DeeplinkType? = entries.firstOrNull { it.path.equals(type, ignoreCase = true) } } } diff --git a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt index b85faa2d6..8c9a7493c 100644 --- a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt +++ b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt @@ -16,7 +16,7 @@ import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.RemoteMessage import com.terning.core.analytics.AmplitudeTracker import com.terning.core.analytics.EventType -import com.terning.core.designsystem.type.DeeplinkHost +import com.terning.core.designsystem.type.DeeplinkType import com.terning.core.designsystem.util.DeeplinkDefaults import com.terning.core.firebase.R import com.terning.domain.user.repository.UserRepository @@ -161,7 +161,7 @@ class TerningMessagingService : FirebaseMessagingService() { } private fun buildDeeplink(type: String, isForeground: Boolean): String { - val base = DeeplinkHost.from(type) ?: return "" + val base = DeeplinkType.from(type) ?: return "" return if (isForeground) DeeplinkDefaults.build(host = base.path) else DeeplinkDefaults.build(host = BACKGROUND_HOST, redirect = base.path) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt index 687afd1a8..ded0c4e9e 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt @@ -8,7 +8,7 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions -import com.terning.core.designsystem.type.DeeplinkHost +import com.terning.core.designsystem.type.DeeplinkType import com.terning.feature.calendar.calendar.navigation.Calendar import com.terning.feature.calendar.calendar.navigation.navigateCalendar import com.terning.feature.home.navigation.Home @@ -30,11 +30,11 @@ class MainNavigator( host: String?, redirect: String?, internId: String? - ) = when (DeeplinkHost.from(host)) { - DeeplinkHost.SEARCH -> Search - DeeplinkHost.HOME -> Home(internId = null) - DeeplinkHost.CALENDAR -> Calendar - DeeplinkHost.KAKAOLINK -> Splash(redirect = redirect, internId = internId) + ) = when (DeeplinkType.from(host)) { + DeeplinkType.SEARCH -> Search + DeeplinkType.HOME -> Home(internId = null) + DeeplinkType.CALENDAR -> Calendar + DeeplinkType.KAKAOLINK -> Splash(redirect = redirect, internId = internId) else -> Splash(redirect = redirect) } diff --git a/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt b/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt index c0d4aa5d4..ba4458e4f 100644 --- a/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt +++ b/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt @@ -28,7 +28,7 @@ import com.terning.core.designsystem.extension.launchPlayStore import com.terning.core.designsystem.theme.TerningMain import com.terning.core.designsystem.theme.TerningPointTheme import com.terning.core.designsystem.theme.White -import com.terning.core.designsystem.type.DeeplinkHost +import com.terning.core.designsystem.type.DeeplinkType import com.terning.domain.update.entity.UpdateState import com.terning.feature.splash.component.TerningMajorUpdateDialog import com.terning.feature.splash.component.TerningPatchUpdateDialog @@ -87,11 +87,11 @@ internal fun SplashRoute( when (sideEffect) { is SplashSideEffect.HasAccessToken -> { if (sideEffect.hasAccessToken) { - when (DeeplinkHost.from(redirect)) { - DeeplinkHost.CALENDAR -> navigateToCalendar() - DeeplinkHost.HOME -> navigateToHome(null) - DeeplinkHost.SEARCH -> navigateToSearch() - DeeplinkHost.INTERN -> navigateToHome(internId.orEmpty()) + when (DeeplinkType.from(redirect)) { + DeeplinkType.CALENDAR -> navigateToCalendar() + DeeplinkType.HOME -> navigateToHome(null) + DeeplinkType.SEARCH -> navigateToSearch() + DeeplinkType.INTERN -> navigateToHome(internId.orEmpty()) else -> navigateToHome(null) } From 301fd2a91e64aa9c80eb36159aef7d6c82af9eb7 Mon Sep 17 00:00:00 2001 From: arinming Date: Sun, 11 May 2025 14:20:50 +0900 Subject: [PATCH 32/35] =?UTF-8?q?[FIX/#380]=20iOS=20=EB=B6=84=EA=B8=B0?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/terning/feature/intern/InternViewModel.kt | 6 +++++- .../src/main/java/com/terning/feature/main/MainActivity.kt | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt b/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt index da4319e2a..cfd954b3e 100644 --- a/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt +++ b/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt @@ -79,9 +79,13 @@ class InternViewModel @Inject constructor( "PERIOD" to internInfo.workingPeriod, "A_E" to "kakaolink", "A_E_D" to "intern", + "I_E" to "kakaolink", + "I_E_D" to "jobDetail", "redirect" to "intern", "internId" to announcementId, - ) + "action" to "jobDetail", + "JOB_ID" to announcementId + ) kakaoUtil.shareToKakaoTalk(templateArgs) } } diff --git a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt index d7ccd88e4..2959b49d4 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt @@ -54,8 +54,9 @@ class MainActivity : ComponentActivity() { if (uriString.isNullOrEmpty()) return Triple(null, null, null) val host = uri.host - val redirect = uri.getQueryParameter(REDIRECT) - val internId = uri.getQueryParameter(INTERN_ID) + val redirect = uri.getQueryParameter("redirect") ?: uri.getQueryParameter("action") + val id = uri.getQueryParameter("internId") ?: uri.getQueryParameter("id") + if (!intent.getBooleanExtra(ALREADY_TRACKED, false) && intent.getBooleanExtra(FROM_NOTIFICATION, false) @@ -68,7 +69,7 @@ class MainActivity : ComponentActivity() { intent.putExtra(ALREADY_TRACKED, true) - return Triple(host, redirect, internId) + return Triple(host, redirect, id) } companion object { From f1fa9ce66150cceaec3ead27277f661d2c7cd935 Mon Sep 17 00:00:00 2001 From: arinming Date: Sun, 11 May 2025 16:51:01 +0900 Subject: [PATCH 33/35] =?UTF-8?q?[FEAT/#380]=20iOS=20=ED=98=95=EC=8B=9D=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/designsystem/util/DeeplinkDefaults.kt | 12 ++++++------ .../messageservice/TerningMessagingService.kt | 2 +- .../com/terning/feature/intern/InternViewModel.kt | 4 +--- .../java/com/terning/feature/main/MainActivity.kt | 14 ++++++-------- .../java/com/terning/feature/main/MainNavigator.kt | 8 ++++---- .../java/com/terning/feature/main/MainScreen.kt | 10 +++++----- .../java/com/terning/feature/splash/SplashRoute.kt | 8 ++++---- .../feature/splash/navigation/SplashNavigation.kt | 12 ++++++------ 8 files changed, 33 insertions(+), 37 deletions(-) diff --git a/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt b/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt index fd105e119..914a8205b 100644 --- a/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt +++ b/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt @@ -4,20 +4,20 @@ import android.net.Uri object DeeplinkDefaults { private const val SCHEME: String = "terning" - const val REDIRECT: String = "redirect" - const val INTERN_ID: String = "internId" + const val ACTION: String = "action" + const val ID: String = "id" fun build( host: String, - redirect: String? = null, - internId: String? = null + action: String? = null, + id: String? = null ): String { val uriBuilder = Uri.Builder() .scheme(SCHEME) .authority(host) - redirect?.let { uriBuilder.appendQueryParameter(REDIRECT, it) } - internId?.let { uriBuilder.appendQueryParameter(INTERN_ID, it) } + action?.let { uriBuilder.appendQueryParameter(ACTION, it) } + id?.let { uriBuilder.appendQueryParameter(ID, it) } return uriBuilder.build().toString() } diff --git a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt index 8c9a7493c..f8ebcef04 100644 --- a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt +++ b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt @@ -164,7 +164,7 @@ class TerningMessagingService : FirebaseMessagingService() { val base = DeeplinkType.from(type) ?: return "" return if (isForeground) DeeplinkDefaults.build(host = base.path) - else DeeplinkDefaults.build(host = BACKGROUND_HOST, redirect = base.path) + else DeeplinkDefaults.build(host = BACKGROUND_HOST, action = base.path) } companion object { diff --git a/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt b/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt index cfd954b3e..00d383045 100644 --- a/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt +++ b/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt @@ -78,11 +78,9 @@ class InternViewModel @Inject constructor( "START_DATE" to internInfo.startYearMonth, "PERIOD" to internInfo.workingPeriod, "A_E" to "kakaolink", - "A_E_D" to "intern", + "A_E_D" to "jobDetail", "I_E" to "kakaolink", "I_E_D" to "jobDetail", - "redirect" to "intern", - "internId" to announcementId, "action" to "jobDetail", "JOB_ID" to announcementId ) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt index 2959b49d4..6d0e51a1d 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt @@ -13,8 +13,6 @@ import com.terning.core.analytics.AmplitudeTracker import com.terning.core.analytics.EventType import com.terning.core.analytics.LocalTracker import com.terning.core.designsystem.theme.TerningPointTheme -import com.terning.core.designsystem.util.DeeplinkDefaults.INTERN_ID -import com.terning.core.designsystem.util.DeeplinkDefaults.REDIRECT import com.terning.core.firebase.messageservice.TerningMessagingService.Companion.FROM_NOTIFICATION import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -32,14 +30,14 @@ class MainActivity : ComponentActivity() { setContent { val navigator: MainNavigator = rememberMainNavigator() - val (host, redirect, internId) = handleDeeplink(intent) + val (host, action, id) = handleDeeplink(intent) TerningPointTheme { CompositionLocalProvider(LocalTracker provides tracker) { MainScreen( host = host, - redirect = redirect, - internId = internId, + action = action, + id = id, navigator = navigator ) } @@ -54,8 +52,8 @@ class MainActivity : ComponentActivity() { if (uriString.isNullOrEmpty()) return Triple(null, null, null) val host = uri.host - val redirect = uri.getQueryParameter("redirect") ?: uri.getQueryParameter("action") - val id = uri.getQueryParameter("internId") ?: uri.getQueryParameter("id") + val action = uri.getQueryParameter("action") + val id = uri.getQueryParameter("id") if (!intent.getBooleanExtra(ALREADY_TRACKED, false) @@ -69,7 +67,7 @@ class MainActivity : ComponentActivity() { intent.putExtra(ALREADY_TRACKED, true) - return Triple(host, redirect, id) + return Triple(host, action, id) } companion object { diff --git a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt index ded0c4e9e..abd3eae6d 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt @@ -28,15 +28,15 @@ class MainNavigator( fun getStartDestination( host: String?, - redirect: String?, - internId: String? + action: String?, + id: String? ) = when (DeeplinkType.from(host)) { DeeplinkType.SEARCH -> Search DeeplinkType.HOME -> Home(internId = null) DeeplinkType.CALENDAR -> Calendar - DeeplinkType.KAKAOLINK -> Splash(redirect = redirect, internId = internId) + DeeplinkType.KAKAOLINK -> Splash(action = action, id = id) - else -> Splash(redirect = redirect) + else -> Splash(action = action) } val currentTab: MainTab? diff --git a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt index 45074d91f..110676e1f 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt @@ -64,8 +64,8 @@ import kotlinx.coroutines.launch @Composable fun MainScreen( host: String?, - redirect: String?, - internId: String?, + action: String?, + id: String?, navigator: MainNavigator = rememberMainNavigator(), ) { val context = LocalContext.current @@ -91,7 +91,7 @@ fun MainScreen( val amplitudeTracker = LocalTracker.current val splashNavOptions = NavOptions.Builder().setPopUpTo( - route = Splash(redirect = redirect, internId = internId), + route = Splash(action = action, id = id), inclusive = true ).build() @@ -148,8 +148,8 @@ fun MainScreen( navController = navigator.navController, startDestination = navigator.getStartDestination( host = host, - redirect = redirect, - internId = internId + action = action, + id = id ) ) { splashNavGraph( diff --git a/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt b/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt index ba4458e4f..017f6a0c8 100644 --- a/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt +++ b/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt @@ -36,8 +36,8 @@ import kotlinx.coroutines.launch @Composable internal fun SplashRoute( - redirect: String?, - internId: String?, + action: String?, + id: String?, navigateToHome: (internId: String?) -> Unit, navigateToSignIn: () -> Unit, navigateToCalendar: () -> Unit, @@ -87,11 +87,11 @@ internal fun SplashRoute( when (sideEffect) { is SplashSideEffect.HasAccessToken -> { if (sideEffect.hasAccessToken) { - when (DeeplinkType.from(redirect)) { + when (DeeplinkType.from(action)) { DeeplinkType.CALENDAR -> navigateToCalendar() DeeplinkType.HOME -> navigateToHome(null) DeeplinkType.SEARCH -> navigateToSearch() - DeeplinkType.INTERN -> navigateToHome(internId.orEmpty()) + DeeplinkType.INTERN -> navigateToHome(id.orEmpty()) else -> navigateToHome(null) } diff --git a/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt b/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt index 1f683533b..196e826b9 100644 --- a/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt +++ b/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt @@ -25,8 +25,8 @@ fun NavGraphBuilder.splashNavGraph( ) { val args = it.toRoute() SplashRoute( - redirect = args.redirect, - internId = args.internId, + action = args.action, + id = args.id, navigateToHome = navigateHome, navigateToSignIn = navigateSignIn, navigateToSearch = navigateSearch, @@ -37,8 +37,8 @@ fun NavGraphBuilder.splashNavGraph( @Serializable data class Splash( - @SerialName("redirect") - val redirect: String? = null, - @SerialName("internId") - val internId: String? = null + @SerialName("action") + val action: String? = null, + @SerialName("id") + val id: String? = null ) : Route From de4d51534d7a543f662f4049b20997675fa7efbd Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 11 May 2025 17:22:52 +0900 Subject: [PATCH 34/35] =?UTF-8?q?[FEAT/#380]=20action=20->=20redirect,=20i?= =?UTF-8?q?d=20->=20internId=20=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/designsystem/util/DeeplinkDefaults.kt | 12 ++++++------ .../messageservice/TerningMessagingService.kt | 2 +- .../terning/feature/intern/InternViewModel.kt | 4 +++- .../com/terning/feature/main/MainActivity.kt | 17 ++++++++++------- .../com/terning/feature/main/MainNavigator.kt | 8 ++++---- .../java/com/terning/feature/main/MainScreen.kt | 10 +++++----- .../com/terning/feature/splash/SplashRoute.kt | 8 ++++---- .../splash/navigation/SplashNavigation.kt | 12 ++++++------ 8 files changed, 39 insertions(+), 34 deletions(-) diff --git a/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt b/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt index 914a8205b..fd105e119 100644 --- a/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt +++ b/core/designsystem/src/main/java/com/terning/core/designsystem/util/DeeplinkDefaults.kt @@ -4,20 +4,20 @@ import android.net.Uri object DeeplinkDefaults { private const val SCHEME: String = "terning" - const val ACTION: String = "action" - const val ID: String = "id" + const val REDIRECT: String = "redirect" + const val INTERN_ID: String = "internId" fun build( host: String, - action: String? = null, - id: String? = null + redirect: String? = null, + internId: String? = null ): String { val uriBuilder = Uri.Builder() .scheme(SCHEME) .authority(host) - action?.let { uriBuilder.appendQueryParameter(ACTION, it) } - id?.let { uriBuilder.appendQueryParameter(ID, it) } + redirect?.let { uriBuilder.appendQueryParameter(REDIRECT, it) } + internId?.let { uriBuilder.appendQueryParameter(INTERN_ID, it) } return uriBuilder.build().toString() } diff --git a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt index f8ebcef04..8c9a7493c 100644 --- a/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt +++ b/core/firebase/src/main/java/com/terning/core/firebase/messageservice/TerningMessagingService.kt @@ -164,7 +164,7 @@ class TerningMessagingService : FirebaseMessagingService() { val base = DeeplinkType.from(type) ?: return "" return if (isForeground) DeeplinkDefaults.build(host = base.path) - else DeeplinkDefaults.build(host = BACKGROUND_HOST, action = base.path) + else DeeplinkDefaults.build(host = BACKGROUND_HOST, redirect = base.path) } companion object { diff --git a/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt b/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt index 00d383045..cfd954b3e 100644 --- a/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt +++ b/feature/intern/src/main/java/com/terning/feature/intern/InternViewModel.kt @@ -78,9 +78,11 @@ class InternViewModel @Inject constructor( "START_DATE" to internInfo.startYearMonth, "PERIOD" to internInfo.workingPeriod, "A_E" to "kakaolink", - "A_E_D" to "jobDetail", + "A_E_D" to "intern", "I_E" to "kakaolink", "I_E_D" to "jobDetail", + "redirect" to "intern", + "internId" to announcementId, "action" to "jobDetail", "JOB_ID" to announcementId ) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt index 6d0e51a1d..c04a03a28 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt @@ -13,8 +13,11 @@ import com.terning.core.analytics.AmplitudeTracker import com.terning.core.analytics.EventType import com.terning.core.analytics.LocalTracker import com.terning.core.designsystem.theme.TerningPointTheme +import com.terning.core.designsystem.util.DeeplinkDefaults.INTERN_ID +import com.terning.core.designsystem.util.DeeplinkDefaults.REDIRECT import com.terning.core.firebase.messageservice.TerningMessagingService.Companion.FROM_NOTIFICATION import dagger.hilt.android.AndroidEntryPoint +import timber.log.Timber import javax.inject.Inject @AndroidEntryPoint @@ -30,14 +33,14 @@ class MainActivity : ComponentActivity() { setContent { val navigator: MainNavigator = rememberMainNavigator() - val (host, action, id) = handleDeeplink(intent) + val (host, redirect, internId) = handleDeeplink(intent) TerningPointTheme { CompositionLocalProvider(LocalTracker provides tracker) { MainScreen( host = host, - action = action, - id = id, + redirect = redirect, + internId = internId, navigator = navigator ) } @@ -51,10 +54,10 @@ class MainActivity : ComponentActivity() { if (uriString.isNullOrEmpty()) return Triple(null, null, null) + Timber.tag("LYB").d("uri = $uri") val host = uri.host - val action = uri.getQueryParameter("action") - val id = uri.getQueryParameter("id") - + val redirect = uri.getQueryParameter(REDIRECT) + val internId = uri.getQueryParameter(INTERN_ID) if (!intent.getBooleanExtra(ALREADY_TRACKED, false) && intent.getBooleanExtra(FROM_NOTIFICATION, false) @@ -67,7 +70,7 @@ class MainActivity : ComponentActivity() { intent.putExtra(ALREADY_TRACKED, true) - return Triple(host, action, id) + return Triple(host, redirect, internId) } companion object { diff --git a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt index abd3eae6d..ded0c4e9e 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainNavigator.kt @@ -28,15 +28,15 @@ class MainNavigator( fun getStartDestination( host: String?, - action: String?, - id: String? + redirect: String?, + internId: String? ) = when (DeeplinkType.from(host)) { DeeplinkType.SEARCH -> Search DeeplinkType.HOME -> Home(internId = null) DeeplinkType.CALENDAR -> Calendar - DeeplinkType.KAKAOLINK -> Splash(action = action, id = id) + DeeplinkType.KAKAOLINK -> Splash(redirect = redirect, internId = internId) - else -> Splash(action = action) + else -> Splash(redirect = redirect) } val currentTab: MainTab? diff --git a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt index 110676e1f..45074d91f 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainScreen.kt @@ -64,8 +64,8 @@ import kotlinx.coroutines.launch @Composable fun MainScreen( host: String?, - action: String?, - id: String?, + redirect: String?, + internId: String?, navigator: MainNavigator = rememberMainNavigator(), ) { val context = LocalContext.current @@ -91,7 +91,7 @@ fun MainScreen( val amplitudeTracker = LocalTracker.current val splashNavOptions = NavOptions.Builder().setPopUpTo( - route = Splash(action = action, id = id), + route = Splash(redirect = redirect, internId = internId), inclusive = true ).build() @@ -148,8 +148,8 @@ fun MainScreen( navController = navigator.navController, startDestination = navigator.getStartDestination( host = host, - action = action, - id = id + redirect = redirect, + internId = internId ) ) { splashNavGraph( diff --git a/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt b/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt index 017f6a0c8..ba4458e4f 100644 --- a/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt +++ b/feature/splash/src/main/java/com/terning/feature/splash/SplashRoute.kt @@ -36,8 +36,8 @@ import kotlinx.coroutines.launch @Composable internal fun SplashRoute( - action: String?, - id: String?, + redirect: String?, + internId: String?, navigateToHome: (internId: String?) -> Unit, navigateToSignIn: () -> Unit, navigateToCalendar: () -> Unit, @@ -87,11 +87,11 @@ internal fun SplashRoute( when (sideEffect) { is SplashSideEffect.HasAccessToken -> { if (sideEffect.hasAccessToken) { - when (DeeplinkType.from(action)) { + when (DeeplinkType.from(redirect)) { DeeplinkType.CALENDAR -> navigateToCalendar() DeeplinkType.HOME -> navigateToHome(null) DeeplinkType.SEARCH -> navigateToSearch() - DeeplinkType.INTERN -> navigateToHome(id.orEmpty()) + DeeplinkType.INTERN -> navigateToHome(internId.orEmpty()) else -> navigateToHome(null) } diff --git a/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt b/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt index 196e826b9..1f683533b 100644 --- a/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt +++ b/feature/splash/src/main/java/com/terning/feature/splash/navigation/SplashNavigation.kt @@ -25,8 +25,8 @@ fun NavGraphBuilder.splashNavGraph( ) { val args = it.toRoute() SplashRoute( - action = args.action, - id = args.id, + redirect = args.redirect, + internId = args.internId, navigateToHome = navigateHome, navigateToSignIn = navigateSignIn, navigateToSearch = navigateSearch, @@ -37,8 +37,8 @@ fun NavGraphBuilder.splashNavGraph( @Serializable data class Splash( - @SerialName("action") - val action: String? = null, - @SerialName("id") - val id: String? = null + @SerialName("redirect") + val redirect: String? = null, + @SerialName("internId") + val internId: String? = null ) : Route From 9c8f5c3c8fe52688a17e7409091556c6ae8b6143 Mon Sep 17 00:00:00 2001 From: LEE YOU BIN Date: Sun, 11 May 2025 17:48:38 +0900 Subject: [PATCH 35/35] =?UTF-8?q?[FEAT/#380]=20Timber=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/src/main/java/com/terning/feature/main/MainActivity.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt index c04a03a28..d7ccd88e4 100644 --- a/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/terning/feature/main/MainActivity.kt @@ -17,7 +17,6 @@ import com.terning.core.designsystem.util.DeeplinkDefaults.INTERN_ID import com.terning.core.designsystem.util.DeeplinkDefaults.REDIRECT import com.terning.core.firebase.messageservice.TerningMessagingService.Companion.FROM_NOTIFICATION import dagger.hilt.android.AndroidEntryPoint -import timber.log.Timber import javax.inject.Inject @AndroidEntryPoint @@ -54,7 +53,6 @@ class MainActivity : ComponentActivity() { if (uriString.isNullOrEmpty()) return Triple(null, null, null) - Timber.tag("LYB").d("uri = $uri") val host = uri.host val redirect = uri.getQueryParameter(REDIRECT) val internId = uri.getQueryParameter(INTERN_ID)