Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true">
android:supportsRtl="true"
android:theme="@style/Theme.Twix">

<activity
android:name=".main.MainActivity"
android:exported="true">

<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
10 changes: 4 additions & 6 deletions app/src/main/java/com/yapp/twix/TwixApplication.kt
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package com.yapp.twix

import android.app.Application
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
import com.yapp.twix.di.initKoin

class TwixApplication : Application() {
override fun onCreate() {
super.onCreate()

startKoin {
androidContext(this@TwixApplication)
modules()
}
initKoin(
context = this
)
}
}
8 changes: 8 additions & 0 deletions app/src/main/java/com/yapp/twix/di/FeatureModules.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.yapp.twix.di

import com.twix.login.di.loginModule
import org.koin.core.module.Module

val featureModules: List<Module> = listOf(
loginModule
)
22 changes: 22 additions & 0 deletions app/src/main/java/com/yapp/twix/di/InitKoin.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.yapp.twix.di

import android.content.Context
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
import org.koin.core.module.Module

fun initKoin(
context: Context? = null,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Context가 nullable 이유가 혹시 있을까 ?

지금은 TwixApplication에서만 호출되서 nullable이지 않아도 괜찮을 것 같은데 어떤 확장성을 고려한걸까 ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CMP로 데스크탑까지 확장하게 되면 Jvm 환경에서는 context가 없어서 일단 nullable로 뒀습니다!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오호 대박 그건 몰랐네 👍

extraModules: List<Module> = emptyList()
) {
startKoin {
context?.let { androidContext(it) }

modules(
buildList {
addAll(extraModules)
addAll(featureModules)
}
)
}
}
27 changes: 27 additions & 0 deletions app/src/main/java/com/yapp/twix/main/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.yapp.twix.main

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.safeContentPadding
import androidx.compose.ui.Modifier
import com.twix.navigation.AppNavHost

class MainActivity: ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContent {
// TODO: 디자인 시스템이 결정되면 테마 구현 및 적용
Box(
modifier = Modifier
.safeContentPadding()
.fillMaxSize()
) {
AppNavHost()
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,21 @@ import com.twix.convention.extension.configureAndroid
import com.twix.convention.extension.implementation
import com.twix.convention.extension.library
import com.twix.convention.extension.libs
import com.twix.convention.extension.version
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.dependencies

class AndroidApplicationConventionPlugin : BuildLogicConventionPlugin({
applyPlugins("com.android.application", "org.jetbrains.kotlin.android")
apply<AndroidComposeConventionPlugin>()

extensions.configure<ApplicationExtension> {
configureAndroid(this)

defaultConfig {
targetSdk = libs.version("targetSdk").requiredVersion.toInt()
}
}

dependencies {
Expand Down
12 changes: 0 additions & 12 deletions feature/login/src/main/AndroidManifest.xml

This file was deleted.

10 changes: 0 additions & 10 deletions feature/login/src/main/java/com/twix/login/LoginActivity.kt

This file was deleted.

23 changes: 23 additions & 0 deletions feature/login/src/main/java/com/twix/login/LoginScreen.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.twix.login

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier

@Composable
fun LoginScreen() {
LoginContent()
}

@Composable
private fun LoginContent() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text("임시 화면입니다.")
}
}
11 changes: 11 additions & 0 deletions feature/login/src/main/java/com/twix/login/di/LoginModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.twix.login.di

import com.twix.login.navigation.LoginNavGraph
import com.twix.navigation.NavRoutes
import com.twix.navigation.base.NavGraphContributor
import org.koin.core.qualifier.named
import org.koin.dsl.module

val loginModule = module {
single<NavGraphContributor>(named(NavRoutes.LoginGraph.route)) { LoginNavGraph }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.twix.login.navigation

import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
import androidx.navigation.navigation
import com.twix.login.LoginScreen
import com.twix.navigation.NavRoutes
import com.twix.navigation.base.NavGraphContributor

object LoginNavGraph: NavGraphContributor {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요건 단순히 궁금증인데 object로 선언한 이유가 궁금해 ! 😃

내가 생각하기에 어차피 KoinSingleton으로 등록하기 때문에
일반 class든 object든 크게 상관 없을거라고 생각하긴 하는데 현수의 생각도 궁금해서 !

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지금 NavGraph는 내부 상태 없이 순수하게 정해진 그래프만 등록하는 역할이에요. 그래서 여러 인스턴스를 만들 필요도 없고 여러 인스턴스를 생성하는 게 가능할 필요도 없다고 생각해요.

class로 구현하는 게 불가능한 건 아니지만 class로 구현하면 모듈에 등록하는 과정에서 누군가는 인스턴스 생성을 책임져야 해요. 그리고 이론상 여러곳에서 인스턴스를 생성하는 게 가능해지기 때문에 종합적으로 고려했을 때 class보다는 object로 구현하는 게 맞다고 판단했습니다!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그렇구나 그런 이유라면 너무 좋은 것 같아 ! 😄

override val graphRoute: NavRoutes
get() = NavRoutes.LoginGraph
override val startDestination: String
get() = NavRoutes.Login.route

override fun NavGraphBuilder.registerGraph(navController: NavHostController) {
navigation(
route = graphRoute.route,
startDestination = startDestination
) {
composable(NavRoutes.Login.route) {
LoginScreen()
}
}
}
}