Skip to content

Commit

Permalink
bug fix, refactor files
Browse files Browse the repository at this point in the history
  • Loading branch information
cnrture committed Aug 30, 2024
1 parent a70f056 commit 541c37f
Show file tree
Hide file tree
Showing 15 changed files with 392 additions and 32 deletions.
Empty file.
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
package org.canerture.quickprojectwizard

import com.github.cnrture.quickprojectwizard.*
package com.github.cnrture.quickprojectwizard

fun getDependencies(
isCompose: Boolean,
Expand All @@ -16,7 +14,10 @@ fun getDependencies(
) = StringBuilder().apply {
append("[versions]\n")
addDefaultVersions()
if (isHiltEnable || isRoomEnable) addLibsVersion("ksp", "2.0.20-1.0.24")
if (isHiltEnable || isRoomEnable || selectedImageLibrary == ImageLibrary.Glide) addLibsVersion(
"ksp",
"2.0.20-1.0.24"
)
if (isCompose) {
addLibsVersion("lifecycle-runtime-ktx", "2.8.4")
addLibsVersion("activity-compose", "1.9.1")
Expand All @@ -30,7 +31,7 @@ fun getDependencies(
addNetworkLibraryVersions(selectedNetworkLibrary)
if (isHiltEnable) {
addLibsVersion("hilt", "2.52")
addLibsVersion("hiltNavigationCompose", "1.2.0")
if (isCompose) addLibsVersion("hiltNavigationCompose", "1.2.0")
}
addNavigationVersions(isCompose, isNavigationEnable)
if (isKtLintEnable) addLibsVersion("ktlint", "11.3.2")
Expand Down Expand Up @@ -63,7 +64,7 @@ fun getDependencies(
if (isHiltEnable) {
addLibsDependency("hilt-compiler", "com.google.dagger", "hilt-compiler", "hilt")
addLibsDependency("hilt-android", "com.google.dagger", "hilt-android", "hilt")
addLibsDependency(
if (isCompose) addLibsDependency(
"hilt-navigation-compose",
"androidx.hilt",
"hilt-navigation-compose",
Expand All @@ -88,7 +89,7 @@ fun getDependencies(
if (isCompose) {
addLibsPlugin("compose-compiler", "org.jetbrains.kotlin.plugin.compose", "kotlin")
}
if (isHiltEnable || isRoomEnable) {
if (isHiltEnable || isRoomEnable || selectedImageLibrary == ImageLibrary.Glide) {
addLibsPlugin("ksp", "com.google.devtools.ksp", "ksp")
}
if (isHiltEnable) {
Expand Down Expand Up @@ -186,6 +187,7 @@ private fun StringBuilder.addNetworkLibraryDependencies(selectedNetworkLibrary:
addLibsDependency("ktor-client-content-negotiation", "io.ktor", "ktor-client-content-negotiation", "ktor")
addLibsDependency("ktor-serialization-kotlinx-json", "io.ktor", "ktor-serialization-kotlinx-json", "ktor")
}

else -> Unit
}
}
Expand All @@ -195,6 +197,7 @@ private fun StringBuilder.addNavigationLibrary(isCompose: Boolean, isNavigationE
isCompose && isNavigationEnable -> {
addLibsDependency("navigation-compose", "androidx.navigation", "navigation-compose", "navigationCompose")
}

!isCompose && isNavigationEnable -> {
addLibsDependency("navigation-fragment", "androidx.navigation", "navigation-fragment-ktx", "navigation")
addLibsDependency("navigation-ui", "androidx.navigation", "navigation-ui-ktx", "navigation")
Expand All @@ -205,14 +208,17 @@ private fun StringBuilder.addNavigationLibrary(isCompose: Boolean, isNavigationE
private fun StringBuilder.addImageLibraryDependencies(isCompose: Boolean, selectedImageLibrary: ImageLibrary) {
when {
isCompose && selectedImageLibrary == ImageLibrary.Coil -> {
addLibsDependency("coil-compose", "io.coil-kt", "coil-compose", "coilVersion")
addLibsDependency("coil", "io.coil-kt", "coil-compose", "coilVersion")
}

isCompose && selectedImageLibrary == ImageLibrary.Glide -> {
addLibsDependency("glide", "com.github.bumptech.glide", "compose", "glideVersion")
}

!isCompose && selectedImageLibrary == ImageLibrary.Coil -> {
addLibsDependency("coil", "io.coil-kt", "coil", "coilVersion")
}

!isCompose && selectedImageLibrary == ImageLibrary.Glide -> {
addLibsDependency("glide", "com.github.bumptech.glide", "glide", "glideVersion")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ fun getGradleKts(
addGradlePlugin("android.application")
addGradlePlugin("jetbrains.kotlin.android")
if (isCompose) addGradlePlugin("compose.compiler")
if (isHiltEnable || isRoomEnable) addGradlePlugin("ksp")
if (isHiltEnable || isRoomEnable || selectedImageLibrary == ImageLibrary.Glide) addGradlePlugin("ksp")
if (isHiltEnable) addGradlePlugin("hilt.plugin")
if (isKtLintEnable) addGradlePlugin("ktlint")
if (isDetektEnable) addGradlePlugin("detekt")
Expand Down Expand Up @@ -109,8 +109,8 @@ private fun StringBuilder.addNavigationLibrary(isCompose: Boolean, isNavigationE

private fun StringBuilder.addImageLibrary(isCompose: Boolean, selectedImageLibrary: ImageLibrary) {
when {
isCompose && selectedImageLibrary == ImageLibrary.Coil -> addGradleImplementation("coil.compose")
isCompose && selectedImageLibrary == ImageLibrary.Glide -> addGradleImplementation("glide.compose")
isCompose && selectedImageLibrary == ImageLibrary.Coil -> addGradleImplementation("coil")
isCompose && selectedImageLibrary == ImageLibrary.Glide -> addGradleImplementation("glide")
!isCompose && selectedImageLibrary == ImageLibrary.Coil -> addGradleImplementation("coil")
!isCompose && selectedImageLibrary == ImageLibrary.Glide -> addGradleImplementation("glide")
else -> Unit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@ fun getProjectGradleKts(
isKtLintEnable: Boolean,
isDetektEnable: Boolean,
isFirebaseEnable: Boolean,
selectedImageLibrary: ImageLibrary,
) = StringBuilder().apply {
append("// Top-level build file where you can add configuration options common to all sub-projects/modules.\n")
append("plugins {\n")
addGradlePlugin("android.application", true)
addGradlePlugin("jetbrains.kotlin.android", true)
if (isCompose) addGradlePlugin("compose.compiler", true)
if (isHiltEnable || isRoomEnable) addGradlePlugin("ksp", true)
if (isHiltEnable || isRoomEnable || selectedImageLibrary == ImageLibrary.Glide) addGradlePlugin("ksp", true)
if (isHiltEnable) addGradlePlugin("hilt.plugin", true)
if (isKtLintEnable) addGradlePlugin("ktlint", true)
if (isDetektEnable) addGradlePlugin("detekt", true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import com.android.tools.idea.wizard.template.ModuleTemplateData
import com.android.tools.idea.wizard.template.PackageName
import com.android.tools.idea.wizard.template.RecipeExecutor
import com.android.tools.idea.wizard.template.escapeKotlinIdentifier
import org.canerture.quickprojectwizard.*
import com.github.cnrture.quickprojectwizard.arch.app.emptyMainApplication
import com.github.cnrture.quickprojectwizard.arch.app.emptyManifestXml
import com.github.cnrture.quickprojectwizard.arch.common.emptyCollectExtension
Expand All @@ -14,6 +13,7 @@ import com.github.cnrture.quickprojectwizard.arch.data.model.emptyMainEntityMode
import com.github.cnrture.quickprojectwizard.arch.data.repository.emptyMainRepositoryImpl
import com.github.cnrture.quickprojectwizard.arch.data.source.local.emptyMainDao
import com.github.cnrture.quickprojectwizard.arch.data.source.local.emptyMainRoomDB
import com.github.cnrture.quickprojectwizard.arch.data.source.remote.emptyKtorApi
import com.github.cnrture.quickprojectwizard.arch.data.source.remote.emptyMainService
import com.github.cnrture.quickprojectwizard.arch.detekt.emptyDetektConfig
import com.github.cnrture.quickprojectwizard.arch.di.emptyLocalModule
Expand All @@ -29,6 +29,9 @@ import com.github.cnrture.quickprojectwizard.arch.ui.compose.main.emptyMainScree
import com.github.cnrture.quickprojectwizard.arch.ui.compose.main.emptyMainScreenPreviewProvider
import com.github.cnrture.quickprojectwizard.arch.ui.compose.main.emptyMainViewModel
import com.github.cnrture.quickprojectwizard.arch.ui.compose.navigation.emptyNavigationGraph
import com.github.cnrture.quickprojectwizard.arch.ui.compose.theme.emptyColor
import com.github.cnrture.quickprojectwizard.arch.ui.compose.theme.emptyTheme
import com.github.cnrture.quickprojectwizard.arch.ui.compose.theme.emptyType
import com.github.cnrture.quickprojectwizard.arch.ui.xml.*
import java.io.File

Expand All @@ -48,6 +51,7 @@ fun RecipeExecutor.projectRecipe(
screens: String,
minApi: Int,
javaJvmVersion: String,
projectName: String,
) {
val packagePath = escapeKotlinIdentifier(packageName)

Expand All @@ -63,13 +67,19 @@ fun RecipeExecutor.projectRecipe(

addExtensions(moduleData, packagePath, isCompose)

addActivity(moduleData, packagePath, isCompose, isHiltEnable, screenList)
if (isCompose) {
addSrcFile(emptyColor(packagePath), moduleData, "ui/theme/Color.kt")
addSrcFile(emptyTheme(packagePath, projectName), moduleData, "ui/theme/Theme.kt")
addSrcFile(emptyType(packagePath), moduleData, "ui/theme/Type.kt")
}

addActivity(moduleData, packagePath, isCompose, isHiltEnable, screenList, projectName)

if (isHiltEnable) {
addSrcFile(emptyMainApplication(packagePath), moduleData, "MainApplication.kt")
}

addNavigation(moduleData, packagePath, isCompose, isNavigationEnable, screenList)
addNavigation(moduleData, packagePath, isCompose, isNavigationEnable, screenList, isHiltEnable)

addScreens(moduleData, packagePath, isCompose, isHiltEnable, screenList)

Expand Down Expand Up @@ -98,11 +108,19 @@ fun RecipeExecutor.projectRecipe(
}

if (selectedNetworkLibrary != NetworkLibrary.None) {
addSrcFile(emptyMainService(packagePath), moduleData, "data/source/remote/MainService.kt")
addSrcFile(
emptyMainService(packagePath, selectedNetworkLibrary),
moduleData,
"data/source/remote/MainService.kt"
)

if (isHiltEnable) {
addSrcFile(emptyNetworkModule(packagePath, selectedNetworkLibrary), moduleData, "di/NetworkModule.kt")
}

if (selectedNetworkLibrary == NetworkLibrary.Ktor) {
addSrcFile(emptyKtorApi(packagePath), moduleData, "data/source/remote/KtorApi.kt")
}
}

if (isRoomEnable) {
Expand Down Expand Up @@ -161,9 +179,14 @@ private fun RecipeExecutor.addActivity(
isCompose: Boolean,
isHiltEnable: Boolean,
screenList: List<String>,
projectName: String,
) {
if (isCompose) {
addSrcFile(emptyActivity(packagePath, screenList[0]), moduleData, "ui/MainActivity.kt")
addSrcFile(
emptyActivity(packagePath, projectName, screenList[0], isHiltEnable),
moduleData,
"ui/MainActivity.kt"
)
} else {
addSrcFile(emptyActivityXML(packagePath, isHiltEnable), moduleData, "ui/MainActivity.kt")
addRootFile(
Expand All @@ -180,13 +203,15 @@ private fun RecipeExecutor.addNavigation(
isCompose: Boolean,
isNavigationEnable: Boolean,
screenList: List<String>,
isHiltEnable: Boolean,
) {
when {
isCompose && isNavigationEnable -> {
val screenListString = StringBuilder().apply {
screenList.forEach {
append(" composable(\"$it\") {\n")
append(" val viewModel: ${it}ViewModel = hiltViewModel()\n")
if (isHiltEnable) append(" val viewModel: ${it}ViewModel = hiltViewModel()\n")
else append(" val viewModel = viewModel<${it}ViewModel>(it)\n")
append(" val uiState by viewModel.uiState.collectAsStateWithLifecycle()\n")
append(" val uiEffect = viewModel.uiEffect\n")
append(" ${it}Screen(\n")
Expand All @@ -204,7 +229,7 @@ private fun RecipeExecutor.addNavigation(
}
}.toString()
addSrcFile(
emptyNavigationGraph(packagePath, screenListString, screensImportsString),
emptyNavigationGraph(packagePath, screenListString, screensImportsString, isHiltEnable),
moduleData,
"ui/navigation/NavigationGraph.kt"
)
Expand Down Expand Up @@ -239,7 +264,11 @@ private fun RecipeExecutor.addScreens(
if (isCompose) {
screenList.forEach {
addSrcFile(emptyMainScreen(packagePath, it), moduleData, "ui/${it.lowercase()}/${it}Screen.kt")
addSrcFile(emptyMainViewModel(packagePath, it), moduleData, "ui/${it.lowercase()}/${it}ViewModel.kt")
addSrcFile(
emptyMainViewModel(packagePath, it, isHiltEnable),
moduleData,
"ui/${it.lowercase()}/${it}ViewModel.kt"
)
addSrcFile(emptyMainContract(packagePath, it), moduleData, "ui/${it.lowercase()}/${it}Contract.kt")
addSrcFile(
emptyMainScreenPreviewProvider(packagePath, it),
Expand Down Expand Up @@ -311,7 +340,15 @@ private fun addDependenciesAndGradle(
)

val projectGradleKts =
getProjectGradleKts(isCompose, isHiltEnable, isRoomEnable, isKtLintEnable, isDetektEnable, isFirebaseEnable)
getProjectGradleKts(
isCompose,
isHiltEnable,
isRoomEnable,
isKtLintEnable,
isDetektEnable,
isFirebaseEnable,
selectedImageLibrary,
)

val libsVersionFile = File(moduleData.rootDir.parentFile, "gradle/libs.versions.toml")
val buildGradleFile = File(moduleData.rootDir.parentFile, "app/build.gradle.kts")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.github.cnrture.quickprojectwizard
import com.android.tools.idea.wizard.template.*
import com.android.tools.idea.wizard.template.impl.defaultPackageNameParameter
import java.net.URL
import java.util.*

enum class ImageLibrary { None, Coil, Glide }
enum class NetworkLibrary { None, Retrofit, Ktor }
Expand All @@ -19,6 +20,8 @@ val projectTemplate
screens = listOf(WizardUiContext.NewProject, WizardUiContext.NewProjectExtraDetail)

val packageName = defaultPackageNameParameter
val projectName = packageName.value.split(".").last()
.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }

val selectedUISystem = enumParameter<UISystem> {
name = "UI System"
Expand Down Expand Up @@ -123,6 +126,7 @@ val projectTemplate
screens = screens.value,
minApi = minApi,
javaJvmVersion = javaJvmVersion.value,
projectName = projectName
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.github.cnrture.quickprojectwizard.arch.data.source.remote

fun emptyKtorApi(packageName: String) = """
package $packageName.data.remote
import io.ktor.client.HttpClient
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.plugins.defaultRequest
import io.ktor.client.request.accept
import io.ktor.http.ContentType
import io.ktor.http.contentType
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.json.Json
abstract class KtorApi {
val client = HttpClient {
defaultRequest {
contentType(ContentType.Application.Json)
accept(ContentType.Application.Json)
}
install(ContentNegotiation) {
json(
Json {
prettyPrint = true
ignoreUnknownKeys = true
}
)
}
}
}
""".trimIndent()
Original file line number Diff line number Diff line change
@@ -1,7 +1,26 @@
package com.github.cnrture.quickprojectwizard.arch.data.source.remote

fun emptyMainService(packageName: String) = """
import com.github.cnrture.quickprojectwizard.NetworkLibrary

fun emptyMainService(packageName: String, selectedNetworkLibrary: NetworkLibrary): String {
return when (selectedNetworkLibrary) {
NetworkLibrary.Retrofit -> retrofit(packageName)
NetworkLibrary.Ktor -> ktor(packageName)
else -> ""
}
}

fun retrofit(packageName: String) = """
package $packageName.data.source.remote
interface MainService
"""

fun ktor(packageName: String) = """
package $packageName.data.source.remote
import $packageName.data.remote.KtorApi
class MainService : KtorApi()
"""

Loading

0 comments on commit 541c37f

Please sign in to comment.