Skip to content

Commit 888ff3d

Browse files
committed
Phase 1: EntryBuilder 패턴 적용 (#713)
* feat: EntryBuilder pattern 적용 * docs: add CLAUDE.md * feat: NoticeWeb쪽과 Club쪽 피쳐에 EntryBuilder 패턴 추가
1 parent 3d96e05 commit 888ff3d

34 files changed

Lines changed: 561 additions & 371 deletions

File tree

CLAUDE.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# CLAUDE.md
2+
3+
## Code Style Rules
4+
5+
### No Inline Imports (FQCN 직접 사용 금지)
6+
- 클래스를 사용할 때 반드시 상단에 `import` 문을 선언하고, 코드 본문에서는 단순 클래스명만 사용할 것
7+
- `android.app.Activity`처럼 FQCN(Fully Qualified Class Name)을 코드 본문에 직접 작성하지 않을 것
8+
- Bad: `(context as? android.app.Activity)?.finish()`
9+
- Good: `import android.app.Activity``(context as? Activity)?.finish()`

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ dependencies {
8181
implementation(projects.core.firebaseCrashlytics)
8282
implementation(projects.core.firebaseMessaging)
8383
implementation(projects.core.composeLocals)
84+
implementation(projects.core.designsystem)
8485
implementation(projects.core.work)
8586
implementation(projects.data.domain)
8687
implementation(projects.data.club)

app/src/main/java/com/ku_stacks/ku_ring/HostActivity.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import androidx.activity.enableEdgeToEdge
66
import androidx.navigation3.runtime.entryProvider
77
import androidx.navigation3.runtime.rememberNavBackStack
88
import androidx.navigation3.ui.NavDisplay
9+
import com.ku_stacks.ku_ring.compose.locals.KuringCompositionLocalProvider
10+
import com.ku_stacks.ku_ring.designsystem.kuringtheme.KuringTheme
911
import com.ku_stacks.ku_ring.navigation.EntryBuilderProvider
1012
import com.ku_stacks.ku_ring.navigation.keys.SplashKey
1113
import dagger.hilt.android.AndroidEntryPoint
@@ -21,14 +23,20 @@ class HostActivity : ComponentActivity() {
2123
super.onCreate(savedInstanceState)
2224
enableEdgeToEdge()
2325
setContent {
24-
val backStack = rememberNavBackStack(SplashKey)
25-
NavDisplay(
26-
backStack = backStack,
27-
onBack = { if (backStack.removeLastOrNull() == null) finish() },
28-
entryProvider = entryProvider {
29-
entryBuilders.forEach { builder -> with(builder) { provide() } }
26+
KuringCompositionLocalProvider {
27+
KuringTheme {
28+
val backStack = rememberNavBackStack(SplashKey)
29+
NavDisplay(
30+
backStack = backStack,
31+
onBack = { if (backStack.removeLastOrNull() == null) finish() },
32+
entryProvider = entryProvider {
33+
entryBuilders.forEach { builder ->
34+
with(builder) { provide() }
35+
}
36+
}
37+
)
3038
}
31-
)
39+
}
3240
}
3341
}
3442
}

feature/club/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ android {
1212
}
1313

1414
dependencies {
15+
implementation(projects.core.navigation)
1516
implementation(projects.core.designsystem)
1617
implementation(projects.core.preferences)
1718
implementation(projects.core.ui)

feature/club/src/main/java/com/ku_stacks/ku_ring/club/detail/ClubDetailActivity.kt

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,16 @@ import android.content.Context
44
import android.content.Intent
55
import android.os.Bundle
66
import androidx.activity.ComponentActivity
7-
import androidx.activity.compose.setContent
8-
import androidx.activity.enableEdgeToEdge
9-
import androidx.compose.foundation.background
10-
import androidx.compose.foundation.layout.fillMaxSize
11-
import androidx.compose.foundation.layout.safeDrawingPadding
12-
import androidx.compose.ui.Modifier
13-
import androidx.compose.ui.platform.LocalContext
14-
import com.ku_stacks.ku_ring.designsystem.kuringtheme.KuringTheme
15-
import com.ku_stacks.ku_ring.util.navigateToExternalBrowser
167
import dagger.hilt.android.AndroidEntryPoint
178

189
@AndroidEntryPoint
1910
class ClubDetailActivity : ComponentActivity() {
2011

2112
override fun onCreate(savedInstanceState: Bundle?) {
2213
super.onCreate(savedInstanceState)
23-
enableEdgeToEdge()
24-
25-
setContent {
26-
KuringTheme {
27-
val context = LocalContext.current
28-
29-
ClubDetailScreen(
30-
onBack = ::finish,
31-
onMoveToRecruitmentLink = context::navigateToExternalBrowser,
32-
modifier = Modifier
33-
.background(KuringTheme.colors.background)
34-
.safeDrawingPadding()
35-
.fillMaxSize(),
36-
)
37-
}
38-
}
14+
val intent = Intent().setClassName(this, "com.ku_stacks.ku_ring.HostActivity")
15+
startActivity(intent)
16+
finish()
3917
}
4018

4119
companion object {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.ku_stacks.ku_ring.club.detail
2+
3+
import android.app.Activity
4+
import androidx.compose.foundation.background
5+
import androidx.compose.foundation.layout.fillMaxSize
6+
import androidx.compose.foundation.layout.safeDrawingPadding
7+
import androidx.compose.ui.Modifier
8+
import androidx.compose.ui.platform.LocalContext
9+
import androidx.navigation3.runtime.EntryProviderScope
10+
import androidx.navigation3.runtime.NavKey
11+
import com.ku_stacks.ku_ring.designsystem.kuringtheme.KuringTheme
12+
import com.ku_stacks.ku_ring.navigation.EntryBuilderProvider
13+
import com.ku_stacks.ku_ring.navigation.keys.ClubDetailKey
14+
import com.ku_stacks.ku_ring.util.navigateToExternalBrowser
15+
import dagger.Module
16+
import dagger.Provides
17+
import dagger.hilt.InstallIn
18+
import dagger.hilt.components.SingletonComponent
19+
import dagger.multibindings.IntoSet
20+
21+
class ClubDetailEntryBuilder : EntryBuilderProvider {
22+
override fun EntryProviderScope<NavKey>.provide() {
23+
entry<ClubDetailKey> { key ->
24+
val context = LocalContext.current
25+
ClubDetailScreen(
26+
onBack = { (context as? Activity)?.finish() },
27+
onMoveToRecruitmentLink = context::navigateToExternalBrowser,
28+
modifier = Modifier
29+
.background(KuringTheme.colors.background)
30+
.safeDrawingPadding()
31+
.fillMaxSize(),
32+
)
33+
}
34+
}
35+
}
36+
37+
@Module
38+
@InstallIn(SingletonComponent::class)
39+
object ClubDetailEntryBuilderModule {
40+
@Provides
41+
@IntoSet
42+
fun provideClubDetailEntryBuilder(): EntryBuilderProvider = ClubDetailEntryBuilder()
43+
}

feature/club/src/main/java/com/ku_stacks/ku_ring/club/onboarding/ClubOnboardingActivity.kt

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,15 @@ import android.content.Context
44
import android.content.Intent
55
import android.os.Bundle
66
import androidx.activity.ComponentActivity
7-
import androidx.activity.compose.setContent
8-
import androidx.activity.enableEdgeToEdge
9-
import androidx.compose.foundation.layout.fillMaxSize
10-
import androidx.compose.ui.Modifier
11-
import com.ku_stacks.ku_ring.designsystem.kuringtheme.KuringTheme
127
import dagger.hilt.android.AndroidEntryPoint
138

149
@AndroidEntryPoint
1510
class ClubOnboardingActivity : ComponentActivity() {
1611
override fun onCreate(savedInstanceState: Bundle?) {
1712
super.onCreate(savedInstanceState)
18-
enableEdgeToEdge()
19-
setContent {
20-
KuringTheme {
21-
ClubOnboardingScreen(onClose = ::finish, modifier = Modifier.fillMaxSize())
22-
}
23-
}
13+
val intent = Intent().setClassName(this, "com.ku_stacks.ku_ring.HostActivity")
14+
startActivity(intent)
15+
finish()
2416
}
2517

2618
companion object {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.ku_stacks.ku_ring.club.onboarding
2+
3+
import android.app.Activity
4+
import androidx.compose.foundation.layout.fillMaxSize
5+
import androidx.compose.ui.Modifier
6+
import androidx.compose.ui.platform.LocalContext
7+
import androidx.navigation3.runtime.EntryProviderScope
8+
import androidx.navigation3.runtime.NavKey
9+
import com.ku_stacks.ku_ring.navigation.EntryBuilderProvider
10+
import com.ku_stacks.ku_ring.navigation.keys.ClubOnboardingKey
11+
import dagger.Module
12+
import dagger.Provides
13+
import dagger.hilt.InstallIn
14+
import dagger.hilt.components.SingletonComponent
15+
import dagger.multibindings.IntoSet
16+
17+
class ClubOnboardingEntryBuilder : EntryBuilderProvider {
18+
override fun EntryProviderScope<NavKey>.provide() {
19+
entry<ClubOnboardingKey> {
20+
val context = LocalContext.current
21+
ClubOnboardingScreen(
22+
onClose = { (context as? Activity)?.finish() },
23+
modifier = Modifier.fillMaxSize(),
24+
)
25+
}
26+
}
27+
}
28+
29+
@Module
30+
@InstallIn(SingletonComponent::class)
31+
object ClubOnboardingEntryBuilderModule {
32+
@Provides
33+
@IntoSet
34+
fun provideClubOnboardingEntryBuilder(): EntryBuilderProvider = ClubOnboardingEntryBuilder()
35+
}

feature/club/src/main/java/com/ku_stacks/ku_ring/club/subscription/ClubSubscriptionActivity.kt

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,15 @@ import android.content.Context
44
import android.content.Intent
55
import android.os.Bundle
66
import androidx.activity.ComponentActivity
7-
import androidx.activity.compose.setContent
8-
import androidx.activity.enableEdgeToEdge
9-
import com.ku_stacks.ku_ring.designsystem.kuringtheme.KuringTheme
107
import dagger.hilt.android.AndroidEntryPoint
118

129
@AndroidEntryPoint
1310
class ClubSubscriptionActivity : ComponentActivity() {
1411
override fun onCreate(savedInstanceState: Bundle?) {
1512
super.onCreate(savedInstanceState)
16-
enableEdgeToEdge()
17-
setContent {
18-
KuringTheme {
19-
ClubSubscriptionScreen(
20-
onNavigateUp = ::finish,
21-
onNavigateToClubDetail = { clubId ->
22-
// TODO: 동아리 상세 화면으로 이동하는 로직 구현
23-
},
24-
)
25-
}
26-
}
13+
val intent = Intent().setClassName(this, "com.ku_stacks.ku_ring.HostActivity")
14+
startActivity(intent)
15+
finish()
2716
}
2817

2918
companion object {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.ku_stacks.ku_ring.club.subscription
2+
3+
import android.app.Activity
4+
import androidx.compose.ui.platform.LocalContext
5+
import androidx.navigation3.runtime.EntryProviderScope
6+
import androidx.navigation3.runtime.NavKey
7+
import com.ku_stacks.ku_ring.navigation.EntryBuilderProvider
8+
import com.ku_stacks.ku_ring.navigation.keys.ClubSubscriptionKey
9+
import dagger.Module
10+
import dagger.Provides
11+
import dagger.hilt.InstallIn
12+
import dagger.hilt.components.SingletonComponent
13+
import dagger.multibindings.IntoSet
14+
15+
class ClubSubscriptionEntryBuilder : EntryBuilderProvider {
16+
override fun EntryProviderScope<NavKey>.provide() {
17+
entry<ClubSubscriptionKey> {
18+
val context = LocalContext.current
19+
ClubSubscriptionScreen(
20+
onNavigateUp = { (context as? Activity)?.finish() },
21+
onNavigateToClubDetail = { },
22+
)
23+
}
24+
}
25+
}
26+
27+
@Module
28+
@InstallIn(SingletonComponent::class)
29+
object ClubSubscriptionEntryBuilderModule {
30+
@Provides
31+
@IntoSet
32+
fun provideClubSubscriptionEntryBuilder(): EntryBuilderProvider = ClubSubscriptionEntryBuilder()
33+
}

0 commit comments

Comments
 (0)