diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7bfec101..8f6ca12a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,28 +1,13 @@ import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties plugins { - id("com.android.application") - kotlin("android") - kotlin("kapt") - id("kotlin-parcelize") - id("dagger.hilt.android.plugin") + id("kr.genti.androidApplication") id("com.google.gms.google-services") id("com.google.firebase.crashlytics") } android { - namespace = Constants.packageName - compileSdk = Constants.compileSdk - defaultConfig { - applicationId = Constants.packageName - minSdk = Constants.minSdk - targetSdk = Constants.targetSdk - versionCode = Constants.versionCode - versionName = Constants.versionName - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - buildConfigField( "String", "NATIVE_APP_KEY", @@ -57,72 +42,17 @@ android { "AMPLITUDE_KEY", gradleLocalProperties(rootDir).getProperty("amplitude.api.key"), ) - - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) } } - - compileOptions { - sourceCompatibility = Versions.javaVersion - targetCompatibility = Versions.javaVersion - } - - kotlinOptions { - jvmTarget = Versions.jvmVersion - } - - buildFeatures { - buildConfig = true - dataBinding = true - viewBinding = true - } } dependencies { - implementation(project(":core")) - implementation(project(":data")) - implementation(project(":domain")) - implementation(project(":presentation")) - - KotlinDependencies.run { - implementation(kotlin) - implementation(coroutines) - implementation(jsonSerialization) - } - - AndroidXDependencies.run { - implementation(coreKtx) - implementation(appCompat) - implementation(hilt) - } - - KaptDependencies.run { - kapt(hiltCompiler) - } - - TestDependencies.run { - testImplementation(jUnit) - androidTestImplementation(androidTest) - androidTestImplementation(espresso) - } - - RetrofitDependencies.run { - implementation(platform(okHttpBom)) - implementation(okHttp) - implementation(okHttpLoggingInterceptor) - implementation(retrofit) - implementation(retrofitJsonConverter) - } - - ThirdPartyDependencies.run { - implementation(timber) - } - - KakaoDependencies.run { - implementation(user) - } + implementation(projects.core) + implementation(projects.data) + implementation(projects.domain) + implementation(projects.presentation) + + implementation(platform(libs.okhttp.bom)) + implementation(libs.bundles.networking) + implementation(libs.kakao) } diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts new file mode 100644 index 00000000..f38db1c9 --- /dev/null +++ b/build-logic/convention/build.gradle.kts @@ -0,0 +1,47 @@ +plugins { + `kotlin-dsl` +} + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +dependencies { + implementation(libs.android.gradlePlugin) + implementation(libs.kotlin.gradlePlugin) +} + +gradlePlugin { + plugins { + register("AndroidApplicationPlugin") { + id = "kr.genti.androidApplication" + implementationClass = "kr.genti.convention.plugin.AndroidApplicationPlugin" + } + register("AndroidLibraryPlugin") { + id = "kr.genti.androidLibrary" + implementationClass = "kr.genti.convention.plugin.AndroidLibraryPlugin" + } + register("JavaLibraryPlugin") { + id = "kr.genti.javaLibrary" + implementationClass = "kr.genti.convention.plugin.JavaLibraryPlugin" + } + + register("KotlinPlugin") { + id = "kr.genti.kotlin" + implementationClass = "kr.genti.convention.plugin.KotlinPlugin" + } + register("HiltPlugin") { + id = "kr.genti.hilt" + implementationClass = "kr.genti.convention.plugin.HiltPlugin" + } + register("TestPlugin") { + id = "kr.genti.test" + implementationClass = "kr.genti.convention.plugin.TestPlugin" + } + register("versionPlugin") { + id = "kr.genti.version" + implementationClass = "kr.genti.convention.plugin.VersionPlugin" + } + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Constants.kt b/build-logic/convention/src/main/java/kr/genti/convention/Constants.kt similarity index 60% rename from buildSrc/src/main/kotlin/Constants.kt rename to build-logic/convention/src/main/java/kr/genti/convention/Constants.kt index 9576f7de..33766c2e 100644 --- a/buildSrc/src/main/kotlin/Constants.kt +++ b/build-logic/convention/src/main/java/kr/genti/convention/Constants.kt @@ -1,8 +1,17 @@ +package kr.genti.convention + +import org.gradle.api.JavaVersion + object Constants { const val packageName = "kr.genti.android" + const val compileSdk = 34 const val minSdk = 28 const val targetSdk = 34 + const val versionCode = 18 const val versionName = "2.0.2" + + const val jvmVersion = "17" + val JAVA_VERSION = JavaVersion.VERSION_17 } diff --git a/build-logic/convention/src/main/java/kr/genti/convention/config/CommonPluginConfig.kt b/build-logic/convention/src/main/java/kr/genti/convention/config/CommonPluginConfig.kt new file mode 100644 index 00000000..448685b5 --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/config/CommonPluginConfig.kt @@ -0,0 +1,28 @@ +package kr.genti.convention.config + +import kr.genti.convention.extension.getLibrary +import kr.genti.convention.extension.implementation +import kr.genti.convention.plugin.HiltPlugin +import kr.genti.convention.plugin.KotlinPlugin +import kr.genti.convention.plugin.TestPlugin +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.getByType + +fun Project.configureAndroidCommonPlugin() { + apply() + apply() + apply() + with(plugins) { + apply("kotlin-parcelize") + apply("org.jetbrains.kotlin.plugin.serialization") + } + + val libs = extensions.getByType().named("libs") + dependencies { + implementation(libs.getLibrary("material-design")) + implementation(libs.getLibrary("timber")) + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/java/kr/genti/convention/extension/CommonExt.kt b/build-logic/convention/src/main/java/kr/genti/convention/extension/CommonExt.kt new file mode 100644 index 00000000..89880084 --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/extension/CommonExt.kt @@ -0,0 +1,9 @@ +package kr.genti.convention.extension + +import com.android.build.api.dsl.CommonExtension +import org.gradle.api.plugins.ExtensionAware +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions + +fun CommonExtension<*, *, *, *, *>.kotlinOptions(block: KotlinJvmOptions.() -> Unit) { + (this as ExtensionAware).extensions.configure("kotlinOptions", block) +} \ No newline at end of file diff --git a/build-logic/convention/src/main/java/kr/genti/convention/extension/DependencyHandlerScopeExt.kt b/build-logic/convention/src/main/java/kr/genti/convention/extension/DependencyHandlerScopeExt.kt new file mode 100644 index 00000000..ec5fb735 --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/extension/DependencyHandlerScopeExt.kt @@ -0,0 +1,47 @@ +package kr.genti.convention.extension + +import org.gradle.api.Project +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.ConfigurableFileTree +import org.gradle.api.provider.Provider +import org.gradle.kotlin.dsl.DependencyHandlerScope + +fun DependencyHandlerScope.implementation(project: Project) { + "implementation"(project) +} + +fun DependencyHandlerScope.implementation(provider: Provider<*>) { + "implementation"(provider) +} + +fun DependencyHandlerScope.implementation(fileTree: ConfigurableFileTree) { + "implementation"(fileTree) +} + +fun DependencyHandlerScope.implementation(fileCollection: ConfigurableFileCollection) { + "implementation"(fileCollection) +} + +fun DependencyHandlerScope.debugImplementation(provider: Provider<*>) { + "debugImplementation"(provider) +} + +fun DependencyHandlerScope.releaseImplementation(provider: Provider<*>) { + "releaseImplementation"(provider) +} + +fun DependencyHandlerScope.kapt(provider: Provider<*>) { + "kapt"(provider) +} + +fun DependencyHandlerScope.coreLibraryDesugaring(provider: Provider<*>) { + "coreLibraryDesugaring"(provider) +} + +fun DependencyHandlerScope.androidTestImplementation(provider: Provider<*>) { + "androidTestImplementation"(provider) +} + +fun DependencyHandlerScope.testImplementation(provider: Provider<*>) { + "testImplementation"(provider) +} \ No newline at end of file diff --git a/build-logic/convention/src/main/java/kr/genti/convention/extension/ProjectExt.kt b/build-logic/convention/src/main/java/kr/genti/convention/extension/ProjectExt.kt new file mode 100644 index 00000000..47746cd5 --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/extension/ProjectExt.kt @@ -0,0 +1,9 @@ +package kr.genti.convention.extension + +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.kotlin.dsl.getByType + +val Project.libs: VersionCatalog + get() = extensions.getByType().named("libs") \ No newline at end of file diff --git a/build-logic/convention/src/main/java/kr/genti/convention/extension/VersionCatalogExt.kt b/build-logic/convention/src/main/java/kr/genti/convention/extension/VersionCatalogExt.kt new file mode 100644 index 00000000..c8f9686b --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/extension/VersionCatalogExt.kt @@ -0,0 +1,16 @@ +package kr.genti.convention.extension + +import org.gradle.api.artifacts.ExternalModuleDependencyBundle +import org.gradle.api.artifacts.MinimalExternalModuleDependency +import org.gradle.api.artifacts.VersionCatalog +import org.gradle.api.provider.Provider + +fun VersionCatalog.getBundle(bundleName: String): Provider = + findBundle(bundleName).orElseThrow { + NoSuchElementException("Bundle with name $bundleName not found in the catalog") + } + +fun VersionCatalog.getLibrary(libraryName: String): Provider = + findLibrary(libraryName).orElseThrow { + NoSuchElementException("Library with name $libraryName not found in the catalog") + } \ No newline at end of file diff --git a/build-logic/convention/src/main/java/kr/genti/convention/plugin/AndroidApplicationPlugin.kt b/build-logic/convention/src/main/java/kr/genti/convention/plugin/AndroidApplicationPlugin.kt new file mode 100644 index 00000000..b70907ce --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/plugin/AndroidApplicationPlugin.kt @@ -0,0 +1,60 @@ +package kr.genti.convention.plugin + +import com.android.build.api.dsl.ApplicationExtension +import kr.genti.convention.Constants +import kr.genti.convention.config.configureAndroidCommonPlugin +import kr.genti.convention.extension.kotlinOptions +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +class AndroidApplicationPlugin : Plugin { + override fun apply(target: Project) = + with(target) { + with(pluginManager) { + apply("com.android.application") + } + + extensions.configure { + configureAndroidCommonPlugin() + + namespace = Constants.packageName + compileSdk = Constants.compileSdk + + defaultConfig { + applicationId = Constants.packageName + targetSdk = Constants.targetSdk + minSdk = Constants.minSdk + versionCode = Constants.versionCode + versionName = Constants.versionName + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + compileOptions { + sourceCompatibility = Constants.JAVA_VERSION + targetCompatibility = Constants.JAVA_VERSION + } + + kotlinOptions { + jvmTarget = Constants.jvmVersion + } + + buildFeatures { + buildConfig = true + viewBinding = true + dataBinding = true + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro", + ) + } + } + } + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/java/kr/genti/convention/plugin/AndroidLibraryPlugin.kt b/build-logic/convention/src/main/java/kr/genti/convention/plugin/AndroidLibraryPlugin.kt new file mode 100644 index 00000000..bec5c5d6 --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/plugin/AndroidLibraryPlugin.kt @@ -0,0 +1,47 @@ +package kr.genti.convention.plugin + +import com.android.build.gradle.LibraryExtension +import kr.genti.convention.Constants +import kr.genti.convention.config.configureAndroidCommonPlugin +import kr.genti.convention.extension.kotlinOptions +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure + +class AndroidLibraryPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("com.android.library") + } + + extensions.configure { + configureAndroidCommonPlugin() + + compileSdk = Constants.compileSdk + + defaultConfig { + minSdk = Constants.minSdk + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + compileOptions { + sourceCompatibility = Constants.JAVA_VERSION + targetCompatibility = Constants.JAVA_VERSION + } + + kotlinOptions { + jvmTarget = Constants.jvmVersion + } + + buildFeatures { + buildConfig = true + dataBinding = true + viewBinding = true + } + } + } + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/java/kr/genti/convention/plugin/HiltPlugin.kt b/build-logic/convention/src/main/java/kr/genti/convention/plugin/HiltPlugin.kt new file mode 100644 index 00000000..630cba21 --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/plugin/HiltPlugin.kt @@ -0,0 +1,23 @@ +package kr.genti.convention.plugin + +import kr.genti.convention.extension.getLibrary +import kr.genti.convention.extension.implementation +import kr.genti.convention.extension.kapt +import kr.genti.convention.extension.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +class HiltPlugin : Plugin { + override fun apply(target: Project) = with(target) { + with(pluginManager) { + apply("org.jetbrains.kotlin.kapt") + apply("dagger.hilt.android.plugin") + } + + dependencies { + implementation(libs.getLibrary("hilt")) + kapt(libs.getLibrary("hilt-compiler")) + } + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/java/kr/genti/convention/plugin/JavaLibraryPlugin.kt b/build-logic/convention/src/main/java/kr/genti/convention/plugin/JavaLibraryPlugin.kt new file mode 100644 index 00000000..4866aa5b --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/plugin/JavaLibraryPlugin.kt @@ -0,0 +1,31 @@ +package kr.genti.convention.plugin + +import kr.genti.convention.Constants +import kr.genti.convention.extension.getBundle +import kr.genti.convention.extension.implementation +import kr.genti.convention.extension.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies + +class JavaLibraryPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + with(pluginManager) { + apply("org.jetbrains.kotlin.jvm") + apply("java-library") + } + + extensions.configure { + sourceCompatibility = Constants.JAVA_VERSION + targetCompatibility = Constants.JAVA_VERSION + } + + dependencies { + implementation(libs.getBundle("kotlin")) + } + } + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/java/kr/genti/convention/plugin/KotlinPlugin.kt b/build-logic/convention/src/main/java/kr/genti/convention/plugin/KotlinPlugin.kt new file mode 100644 index 00000000..98042b25 --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/plugin/KotlinPlugin.kt @@ -0,0 +1,20 @@ +package kr.genti.convention.plugin + +import kr.genti.convention.extension.getBundle +import kr.genti.convention.extension.implementation +import kr.genti.convention.extension.libs +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +class KotlinPlugin : Plugin { + override fun apply(target: Project) = with(target) { + with(pluginManager) { + apply("kotlin-android") + } + + dependencies { + implementation(libs.getBundle("kotlin")) + } + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/java/kr/genti/convention/plugin/TestPlugin.kt b/build-logic/convention/src/main/java/kr/genti/convention/plugin/TestPlugin.kt new file mode 100644 index 00000000..07f27941 --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/plugin/TestPlugin.kt @@ -0,0 +1,20 @@ +package kr.genti.convention.plugin + +import kr.genti.convention.extension.androidTestImplementation +import kr.genti.convention.extension.getLibrary +import kr.genti.convention.extension.libs +import kr.genti.convention.extension.testImplementation +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies + +class TestPlugin : Plugin { + override fun apply(target: Project) = with(target) { + + dependencies { + testImplementation(libs.getLibrary("j-unit")) + androidTestImplementation(libs.getLibrary("j-unit-androidx-test")) + androidTestImplementation(libs.getLibrary("espresso-core")) + } + } +} \ No newline at end of file diff --git a/build-logic/convention/src/main/java/kr/genti/convention/plugin/VersionPlugin.kt b/build-logic/convention/src/main/java/kr/genti/convention/plugin/VersionPlugin.kt new file mode 100644 index 00000000..eea141d9 --- /dev/null +++ b/build-logic/convention/src/main/java/kr/genti/convention/plugin/VersionPlugin.kt @@ -0,0 +1,14 @@ +package kr.genti.convention.plugin + +import kr.genti.convention.Constants +import org.gradle.api.Plugin +import org.gradle.api.Project + +class VersionPlugin : Plugin { + override fun apply(target: Project) = with(target) { + with(extensions) { + extraProperties["versionName"] = Constants.versionName + extraProperties["versionCode"] = Constants.versionCode + } + } +} \ No newline at end of file diff --git a/build-logic/gradle.properties b/build-logic/gradle.properties new file mode 100644 index 00000000..6977b719 --- /dev/null +++ b/build-logic/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configureondemand=true \ No newline at end of file diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts new file mode 100644 index 00000000..fd968aff --- /dev/null +++ b/build-logic/settings.gradle.kts @@ -0,0 +1,16 @@ +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + } + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} + +rootProject.name = "build-logic" +include(":convention") \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index ed5abd78..5e93e036 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,18 +3,13 @@ buildscript { google() mavenCentral() } - - dependencies { - ClassPathPlugins.run { - classpath(gradle) - classpath(kotlinGradlePlugin) - classpath(hiltGradlePlugin) - classpath(googleServices) - classpath(crashlyticsGradle) - } - } } -tasks.register("clean", Delete::class) { - delete(rootProject.buildDir) -} +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.kotlin.serialization) apply false + alias(libs.plugins.hilt) apply false + alias(libs.plugins.google.services) apply false + alias(libs.plugins.google.crashlytics) apply false +} \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index b22ed732..00000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - `kotlin-dsl` -} - -repositories { - mavenCentral() -} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt deleted file mode 100644 index 966a53a4..00000000 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ /dev/null @@ -1,96 +0,0 @@ -object KotlinDependencies { - const val kotlin = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlinVersion}" - const val coroutines = - "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.coroutinesAndroidVersion}" - const val jsonSerialization = - "org.jetbrains.kotlinx:kotlinx-serialization-json:${Versions.kotlinSerializationJsonVersion}" - const val dateTime = "org.jetbrains.kotlinx:kotlinx-datetime:${Versions.kotlinDateTimeVersion}" -} - -object AndroidXDependencies { - const val coreKtx = "androidx.core:core-ktx:${Versions.coreKtxVersion}" - const val splashScreen = "androidx.core:core-splashscreen:${Versions.splashVersion}" - - const val appCompat = "androidx.appcompat:appcompat:${Versions.appCompatVersion}" - const val constraintLayout = - "androidx.constraintlayout:constraintlayout:${Versions.constraintLayoutVersion}" - const val startup = "androidx.startup:startup-runtime:${Versions.appStartUpVersion}" - const val fragment = "androidx.fragment:fragment-ktx:${Versions.fragmentKtxVersion}" - const val legacy = "androidx.legacy:legacy-support-v4:${Versions.legacySupportVersion}" - const val security = "androidx.security:security-crypto:${Versions.securityVersion}" - - const val navigationFragment = - "androidx.navigation:navigation-fragment-ktx:${Versions.navigationVersion}" - const val navigationUi = "androidx.navigation:navigation-ui-ktx:${Versions.navigationVersion}" - - const val lifeCycleKtx = "androidx.lifecycle:lifecycle-runtime-ktx:${Versions.lifecycleVersion}" - const val lifecycleJava8 = - "androidx.lifecycle:lifecycle-common-java8:${Versions.lifecycleVersion}" - - const val hilt = "com.google.dagger:hilt-android:${Versions.hiltVersion}" - const val appUpdate = "com.google.android.play:app-update-ktx:${Versions.appUpdateVersion}" -} - -object TestDependencies { - const val jUnit = "junit:junit:${Versions.junitVersion}" - const val androidTest = "androidx.test.ext:junit:${Versions.androidTestVersion}" - const val espresso = "androidx.test.espresso:espresso-core:${Versions.espressoVersion}" -} - -object MaterialDesignDependencies { - const val materialDesign = - "com.google.android.material:material:${Versions.materialDesignVersion}" -} - -object KaptDependencies { - const val hiltCompiler = "com.google.dagger:hilt-compiler:${Versions.hiltVersion}" -} - -object RetrofitDependencies { - const val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofitVersion}" - const val retrofitJsonConverter = - "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:${Versions.jsonConverterVersion}" - - const val okHttpBom = "com.squareup.okhttp3:okhttp-bom:${Versions.okHttpVersion}" - const val okHttp = "com.squareup.okhttp3:okhttp" - const val okHttpLoggingInterceptor = "com.squareup.okhttp3:logging-interceptor" -} - -object ThirdPartyDependencies { - const val coil = "io.coil-kt:coil:${Versions.coilVersion}" - const val glide = "com.github.bumptech.glide:glide:${Versions.glideVersion}" - const val glideTransformations = - "jp.wasabeef:glide-transformations:${Versions.glideTransformationsVersion}" - const val amplitude = "com.amplitude:analytics-android:${Versions.amplitudeVersion}" - const val timber = "com.jakewharton.timber:timber:${Versions.timberVersion}" - const val progressView = "com.github.skydoves:progressview:${Versions.progressViewVersion}" - const val balloon = "com.github.skydoves:balloon:${Versions.balloonVersion}" - const val lottie = "com.airbnb.android:lottie:${Versions.lottieVersion}" - const val circularProgressBar = - "com.mikhaellopez:circularprogressbar:${Versions.circularProgressBar}" - const val circleIndicator = "me.relex:circleindicator:${Versions.circleIndicatorVersion}" - const val shimmer = "com.facebook.shimmer:shimmer:${Versions.shimmerVersion}" -} - -object ClassPathPlugins { - const val gradle = "com.android.tools.build:gradle:${Versions.gradleVersion}" - const val kotlinGradlePlugin = - "org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlinVersion}" - const val hiltGradlePlugin = - "com.google.dagger:hilt-android-gradle-plugin:${Versions.hiltVersion}" - - const val googleServices = "com.google.gms:google-services:${Versions.googleServicesVersion}" - const val crashlyticsGradle = - "com.google.firebase:firebase-crashlytics-gradle:${Versions.crashlyticsVersion}" -} - -object FirebaseDependencies { - const val firebaseBom = "com.google.firebase:firebase-bom:${Versions.firebaseBomVersion}" - const val messaging = "com.google.firebase:firebase-messaging-ktx" - const val crashlytics = "com.google.firebase:firebase-crashlytics-ktx" - const val analytics = "com.google.firebase:firebase-analytics-ktx" -} - -object KakaoDependencies { - const val user = "com.kakao.sdk:v2-user:${Versions.kakaoVersion}" -} diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt deleted file mode 100644 index 97c2f4c7..00000000 --- a/buildSrc/src/main/kotlin/Versions.kt +++ /dev/null @@ -1,47 +0,0 @@ -import org.gradle.api.JavaVersion - -object Versions { - const val gradleVersion = "8.0.2" - const val kotlinVersion = "1.8.20" - - val javaVersion = JavaVersion.VERSION_17 - const val jvmVersion = "17" - - const val coroutinesAndroidVersion = "1.7.1" - const val kotlinSerializationJsonVersion = "1.5.1" - const val kotlinDateTimeVersion = "0.4.0" - const val coreKtxVersion = "1.10.1" - const val appCompatVersion = "1.6.1" - const val materialDesignVersion = "1.9.0" - const val constraintLayoutVersion = "2.1.4" - const val appStartUpVersion = "1.1.1" - const val legacySupportVersion = "1.0.0" - const val securityVersion = "1.1.0-alpha06" - const val hiltVersion = "2.46.1" - const val fragmentKtxVersion = "1.5.7" - const val navigationVersion = "2.7.7" - const val lifecycleVersion = "2.6.1" - const val splashVersion = "1.0.1" - const val coilVersion = "2.4.0" - const val glideVersion = "4.12.0" - const val glideTransformationsVersion = "4.3.0" - const val retrofitVersion = "2.9.0" - const val jsonConverterVersion = "1.0.0" - const val okHttpVersion = "4.11.0" - const val amplitudeVersion = "1.17.3" - const val timberVersion = "5.0.1" - const val progressViewVersion = "1.1.3" - const val balloonVersion = "1.4.5" - const val lottieVersion = "6.0.0" - const val circularProgressBar = "3.1.0" - const val kakaoVersion = "2.20.3" - const val circleIndicatorVersion = "2.1.6" - const val shimmerVersion = "0.5.0" - const val junitVersion = "4.13.2" - const val espressoVersion = "3.3.0" - const val androidTestVersion = "1.1.2" - const val firebaseBomVersion = "33.1.2" - const val googleServicesVersion = "4.4.2" - const val crashlyticsVersion = "2.9.9" - const val appUpdateVersion = "2.1.0" -} diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 15e47907..041fe5a5 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,50 +1,7 @@ plugins { - id("com.android.library") - kotlin("android") - kotlin("kapt") - id("dagger.hilt.android.plugin") + id("kr.genti.androidLibrary") } android { namespace = "kr.genti.core" - compileSdk = Constants.compileSdk - - defaultConfig { - minSdk = Constants.minSdk - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - compileOptions { - sourceCompatibility = Versions.javaVersion - targetCompatibility = Versions.javaVersion - } - kotlinOptions { - jvmTarget = Versions.jvmVersion - } - - buildFeatures { - dataBinding = true - viewBinding = true - } -} - -dependencies { - // Kotlin - implementation(KotlinDependencies.kotlin) - - // Lifecycle Ktx - implementation(AndroidXDependencies.lifeCycleKtx) - - // Material Design - implementation(MaterialDesignDependencies.materialDesign) - - // Hilt - implementation(AndroidXDependencies.hilt) - kapt(KaptDependencies.hiltCompiler) - - // Test Dependency - testImplementation(TestDependencies.jUnit) - androidTestImplementation(TestDependencies.androidTest) - androidTestImplementation(TestDependencies.espresso) } diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 56c5dcb2..61889a67 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -1,66 +1,14 @@ plugins { - id("com.android.library") - kotlin("android") - kotlin("kapt") - kotlin("plugin.serialization") version Versions.kotlinVersion + id("kr.genti.androidLibrary") } android { namespace = "kr.genti.data" - compileSdk = Constants.compileSdk - - defaultConfig { - minSdk = Constants.minSdk - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - compileOptions { - sourceCompatibility = Versions.javaVersion - targetCompatibility = Versions.javaVersion - } - - kotlinOptions { - jvmTarget = Versions.jvmVersion - } - - buildFeatures { - buildConfig = true - } } dependencies { - implementation(project(":domain")) - - AndroidXDependencies.run { - implementation(hilt) - implementation(security) - implementation(coreKtx) - } - - KotlinDependencies.run { - implementation(kotlin) - implementation(jsonSerialization) - implementation(coroutines) - implementation(dateTime) - } - - RetrofitDependencies.run { - implementation(platform(okHttpBom)) - implementation(okHttp) - implementation(okHttpLoggingInterceptor) - implementation(retrofit) - implementation(retrofitJsonConverter) - } - - ThirdPartyDependencies.run { - implementation(timber) - } + implementation(projects.domain) - TestDependencies.run { - testImplementation(jUnit) - androidTestImplementation(androidTest) - androidTestImplementation(espresso) - } + implementation(platform(libs.okhttp.bom)) + implementation(libs.bundles.networking) } diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 649449cf..5b9bf4c5 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -1,18 +1,3 @@ plugins { - id("java-library") - kotlin("jvm") - kotlin("kapt") -} - -java { - sourceCompatibility = Versions.javaVersion - targetCompatibility = Versions.javaVersion -} - -dependencies { - KotlinDependencies.run { - implementation(kotlin) - implementation(coroutines) - implementation(dateTime) - } + id("kr.genti.javaLibrary") } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 54596282..d09d4de3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,24 +1,189 @@ [versions] -agp = "8.3.0" -kotlin = "1.9.0" -coreKtx = "1.13.0" +# Build Tools +agp = "8.1.2" + +# Kotlin +kotlin = "1.8.20" + +# AndroidX +androidx-core-ktx = "1.13.1" +androidx-core-splashscreen = "1.0.1" +androidx-appcompat = "1.7.0" +androidx-activity-ktx = "1.9.0" +androidx-lifecycle-runtime-ktx = "2.8.7" +androidx-navigation-ktx = "2.7.7" +androidx-fragment-ktx = "1.5.7" +androidx-legacy-support = "1.0.0" +androidx-constraint-layout = "2.1.4" + +# Google +material-design = "1.9.0" +app-update = "2.1.0" +google-services = "4.4.2" + +# Hilt +hilt = "2.46.1" + +# Networking +retrofit = "2.9.0" +okhttp = "4.11.0" +retrofit-serialization-converter = "1.0.0" + +# Kotlin Extensions +kotlin-serialization = "1.5.1" +kotlin-datetime = "0.4.0" +kotlin-coroutines = "1.7.1" + +# UI Libraries +coil = "2.4.0" +glide = "4.12.0" +glide-transformations = "4.3.0" +lottie = "6.0.0" +shimmer = "0.5.0" +circular-progress-bar = "3.1.0" +progress-view = "1.1.3" +balloon = "1.4.5" +circle-indicator = "2.1.6" + +# Amplitude +amplitude = "1.17.3" + +# Firebase +firebase-bom = "33.1.2" +crashlytics = "2.9.9" + +# Kakao +kakao = "2.20.3" + +# Testing junit = "4.13.2" -junitVersion = "1.1.5" -espressoCore = "3.5.1" -appcompat = "1.6.1" -material = "1.11.0" -navigationFragmentKtx = "2.7.7" -navigationUiKtx = "2.7.7" +espresso = "3.5.1" +androidx-test = "1.1.5" + +# Timber +timber = "5.0.1" [libraries] -androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } -junit = { group = "junit", name = "junit", version.ref = "junit" } -androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } -androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } -androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } -material = { group = "com.google.android.material", name = "material", version.ref = "material" } +# Gradle Plugin +android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" } +kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } -[plugins] -androidApplication = { id = "com.android.application", version.ref = "agp" } -jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +# Kotlin +kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib", version.ref = "kotlin" } +kotlin-serialization = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlin-serialization" } +kotlin-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlin-datetime" } +kotlin-coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlin-coroutines" } + +# AndroidX +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidx-core-ktx" } +androidx-core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "androidx-core-splashscreen" } +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "androidx-appcompat" } +androidx-activity-ktx = { group = "androidx.activity", name = "activity-ktx", version.ref = "androidx-activity-ktx" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "androidx-lifecycle-runtime-ktx" } +androidx-navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "androidx-navigation-ktx" } +androidx-navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "androidx-navigation-ktx" } +androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "androidx-fragment-ktx" } +androidx-legacy-support = { group = "androidx.legacy", name = "legacy-support-v4", version.ref = "androidx-legacy-support" } +androidx-constraint-layout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "androidx-constraint-layout" } + +# MaterialDesign +material-design = { group = "com.google.android.material", name = "material", version.ref = "material-design" } +# Hilt +hilt = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } +hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" } + +# Networking +retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" } +retrofit-serialization-converter = { group = "com.jakewharton.retrofit", name = "retrofit2-kotlinx-serialization-converter", version.ref = "retrofit-serialization-converter" } +okhttp-bom = { group = "com.squareup.okhttp3", name = "okhttp-bom", version.ref = "okhttp" } +okhttp = { group = "com.squareup.okhttp3", name = "okhttp" } +okhttp-logging-interceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor" } + +# UI Libraries +coil = { group = "io.coil-kt", name = "coil", version.ref = "coil" } +glide = { group = "com.github.bumptech.glide", name = "glide", version.ref = "glide" } +glide-transformations = { group = "jp.wasabeef", name = "glide-transformations", version.ref = "glide-transformations" } +lottie = { group = "com.airbnb.android", name = "lottie", version.ref = "lottie" } +shimmer = { group = "com.facebook.shimmer", name = "shimmer", version.ref = "shimmer" } +circular-progress-bar = { group = "com.mikhaellopez", name = "circularprogressbar", version.ref = "circular-progress-bar" } +progress-view = { group = "com.github.skydoves", name = "progressview", version.ref = "progress-view" } +balloon = { group = "com.github.skydoves", name = "balloon", version.ref = "balloon" } +circle-indicator = { group = "me.relex", name = "circleindicator", version.ref = "circle-indicator" } + +# Analytics +amplitude = { group = "com.amplitude", name = "analytics-android", version.ref = "amplitude" } + +# Firebase +firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase-bom" } +firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics-ktx" } +firebase-analytics = { group = "com.google.firebase", name = "firebase-analytics-ktx" } +firebase-messaging = { group = "com.google.firebase", name = "firebase-messaging-ktx" } + +# Kakao +kakao = { group = "com.kakao.sdk", name = "v2-user", version.ref = "kakao" } + +# Testing +j-unit = { group = "junit", name = "junit", version.ref = "junit" } +j-unit-androidx-test = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test" } +espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso" } + +# App Update +app-update = { group = "com.google.android.play", name = "app-update-ktx", version.ref = "app-update" } + +# Timber +timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } + +[bundles] +kotlin = [ + "kotlin-stdlib", + "kotlin-serialization", + "kotlin-datetime", + "kotlin-coroutines", +] + +androidx = [ + "androidx-core-ktx", + "androidx-core-splashscreen", + "androidx-appcompat", + "androidx-activity-ktx", + "androidx-lifecycle-runtime-ktx", + "androidx-navigation-fragment-ktx", + "androidx-navigation-ui-ktx", + "androidx-fragment-ktx", + "androidx-legacy-support", + "androidx-constraint-layout" +] + +networking = [ + "retrofit", + "retrofit-serialization-converter", + "okhttp", + "okhttp-logging-interceptor" +] + +ui = [ + "coil", + "glide", + "glide-transformations", + "lottie", + "shimmer", + "circular-progress-bar", + "progress-view", + "balloon", + "circle-indicator" +] + +firebase = [ + "firebase-crashlytics", + "firebase-analytics", + "firebase-messaging" +] + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } +google-services = { id = "com.google.gms.google-services", version.ref = "google-services" } +google-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "crashlytics" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d7c014f1..43368ec1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Wed May 01 02:58:14 KST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/presentation/build.gradle.kts b/presentation/build.gradle.kts index 4dc4cd5e..29284339 100644 --- a/presentation/build.gradle.kts +++ b/presentation/build.gradle.kts @@ -1,104 +1,30 @@ plugins { - id("com.android.library") - kotlin("android") - kotlin("kapt") - id("kotlin-parcelize") - id("dagger.hilt.android.plugin") + id("kr.genti.androidLibrary") + id("kr.genti.version") } android { namespace = "kr.genti.presentation" - compileSdk = Constants.compileSdk defaultConfig { - minSdk = Constants.minSdk - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - - buildConfigField("String", "VERSION_NAME", "\"${Constants.versionName}\"") - buildConfigField("String", "VERSION_CODE", "\"${Constants.versionCode}\"") - } - - compileOptions { - sourceCompatibility = Versions.javaVersion - targetCompatibility = Versions.javaVersion - } - - kotlinOptions { - jvmTarget = Versions.jvmVersion - } - - buildFeatures { - buildConfig = true - dataBinding = true - viewBinding = true + buildConfigField("String", "VERSION_NAME", "\"${extra["versionName"]}\"") + buildConfigField("String", "VERSION_CODE", "\"${extra["versionCode"]}\"") } } dependencies { - implementation(project(":core")) - implementation(project(":domain")) + implementation(projects.core) + implementation(projects.domain) - KotlinDependencies.run { - implementation(kotlin) - implementation(coroutines) - implementation(jsonSerialization) - implementation(dateTime) - } + implementation(platform(libs.okhttp.bom)) + implementation(libs.bundles.networking) - AndroidXDependencies.run { - implementation(coreKtx) - implementation(appCompat) - implementation(constraintLayout) - implementation(fragment) - implementation(navigationFragment) - implementation(navigationUi) - implementation(startup) - implementation(legacy) - implementation(security) - implementation(lifeCycleKtx) - implementation(lifecycleJava8) - implementation(splashScreen) - implementation(hilt) - implementation(appUpdate) - } + implementation(platform(libs.firebase.bom)) + implementation(libs.bundles.firebase) - KaptDependencies.run { - kapt(hiltCompiler) - } - - MaterialDesignDependencies.run { - implementation(materialDesign) - } - - TestDependencies.run { - testImplementation(jUnit) - androidTestImplementation(androidTest) - androidTestImplementation(espresso) - } - - ThirdPartyDependencies.run { - implementation(coil) - implementation(glide) - implementation(glideTransformations) - implementation(timber) - implementation(amplitude) - implementation(progressView) - implementation(balloon) - implementation(lottie) - implementation(circularProgressBar) - implementation(circleIndicator) - } - - FirebaseDependencies.run { - implementation(platform(firebaseBom)) - implementation(messaging) - implementation(crashlytics) - implementation(analytics) - } - - KakaoDependencies.run { - implementation(user) - } + implementation(libs.bundles.androidx) + implementation(libs.bundles.ui) + implementation(libs.kakao) + implementation(libs.app.update) + implementation(libs.amplitude) } diff --git a/presentation/src/main/java/kr/genti/presentation/generate/verify/VerifyActivity.kt b/presentation/src/main/java/kr/genti/presentation/generate/verify/VerifyActivity.kt index abf634a6..79b6826a 100644 --- a/presentation/src/main/java/kr/genti/presentation/generate/verify/VerifyActivity.kt +++ b/presentation/src/main/java/kr/genti/presentation/generate/verify/VerifyActivity.kt @@ -215,7 +215,7 @@ class VerifyActivity : BaseActivity(R.layout.activity_ver ) } }.onSuccess { - cameraLauncher.launch(photoUri) + photoUri?.let { cameraLauncher.launch(it) } } } else { toast(stringOf(R.string.error_msg)) diff --git a/settings.gradle.kts b/settings.gradle.kts index 4f982844..9af2d230 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,9 @@ +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + pluginManagement { + + includeBuild("build-logic") + repositories { google() mavenCentral()