Skip to content

Commit a2604fa

Browse files
authored
Implemented hot-reload to new project template. (#48)
1 parent 8550cc9 commit a2604fa

File tree

4 files changed

+75
-20
lines changed

4 files changed

+75
-20
lines changed

plugin/src/main/kotlin/com/mitteloupe/cag/cleanarchitecturegenerator/projectwizard/CleanArchitectureWizardTemplateProvider.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import com.android.tools.idea.wizard.template.WizardUiContext
1515
import com.android.tools.idea.wizard.template.booleanParameter
1616
import com.android.tools.idea.wizard.template.enumParameter
1717
import com.android.tools.idea.wizard.template.impl.activities.common.MIN_API
18-
import com.android.tools.idea.wizard.template.template
1918
import com.intellij.openapi.application.ApplicationInfo
2019
import com.mitteloupe.cag.cleanarchitecturegenerator.CleanArchitectureGeneratorBundle
2120
import com.mitteloupe.cag.cleanarchitecturegenerator.IdeBridge
@@ -39,7 +38,7 @@ class CleanArchitectureWizardTemplateProvider : WizardTemplateProvider() {
3938
override fun getTemplates(): List<Template> = listOf(cleanArchitectureTemplate)
4039

4140
private val cleanArchitectureTemplate =
42-
template {
41+
ReloadableTemplate {
4342
name = CleanArchitectureGeneratorBundle.message("wizard.template.name")
4443
description = CleanArchitectureGeneratorBundle.message("wizard.template.description")
4544
category = Category.Application
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.mitteloupe.cag.cleanarchitecturegenerator.projectwizard
2+
3+
import com.android.tools.idea.wizard.template.Category
4+
import com.android.tools.idea.wizard.template.FormFactor
5+
import com.android.tools.idea.wizard.template.Recipe
6+
import com.android.tools.idea.wizard.template.Template
7+
import com.android.tools.idea.wizard.template.TemplateBuilder
8+
import com.android.tools.idea.wizard.template.TemplateConstraint
9+
import com.android.tools.idea.wizard.template.Thumb
10+
import com.android.tools.idea.wizard.template.Widget
11+
import com.android.tools.idea.wizard.template.WizardUiContext
12+
import com.android.tools.idea.wizard.template.template
13+
import com.mitteloupe.cag.cleanarchitecturegenerator.settings.AppSettingsService
14+
15+
class ReloadableTemplate(
16+
private val factory: TemplateBuilder.() -> Unit
17+
) : Template {
18+
private val appSettingsService = AppSettingsService.getInstance()
19+
20+
private var lastDefaultDependencyInjection: String? = null
21+
22+
private var cachedTemplate: Template = template(factory).also { updateConfigurationIfChanged() }
23+
24+
private val upToDateTemplate: Template
25+
get() {
26+
if (updateConfigurationIfChanged()) {
27+
cachedTemplate = template(factory)
28+
}
29+
return cachedTemplate
30+
}
31+
32+
override val name: String
33+
get() = upToDateTemplate.name
34+
override val description: String
35+
get() = upToDateTemplate.description
36+
override val documentationUrl: String?
37+
get() = upToDateTemplate.documentationUrl
38+
override val widgets: Collection<Widget<*>>
39+
get() = upToDateTemplate.widgets
40+
override val recipe: Recipe
41+
get() = upToDateTemplate.recipe
42+
override val uiContexts: Collection<WizardUiContext>
43+
get() = upToDateTemplate.uiContexts
44+
override val minSdk: Int
45+
get() = upToDateTemplate.minSdk
46+
override val category: Category
47+
get() = upToDateTemplate.category
48+
override val formFactor: FormFactor
49+
get() = upToDateTemplate.formFactor
50+
override val constraints: Collection<TemplateConstraint>
51+
get() = upToDateTemplate.constraints
52+
override val useGenericInstrumentedTests: Boolean
53+
get() = upToDateTemplate.useGenericInstrumentedTests
54+
override val useGenericLocalTests: Boolean
55+
get() = upToDateTemplate.useGenericLocalTests
56+
57+
override fun thumb(): Thumb = upToDateTemplate.thumb()
58+
59+
private fun updateConfigurationIfChanged(): Boolean {
60+
val defaultDependencyInjection = appSettingsService.defaultDependencyInjection
61+
return if (defaultDependencyInjection != lastDefaultDependencyInjection) {
62+
lastDefaultDependencyInjection = defaultDependencyInjection
63+
true
64+
} else {
65+
false
66+
}
67+
}
68+
}

plugin/src/main/kotlin/com/mitteloupe/cag/cleanarchitecturegenerator/settings/versioncatalog/RootConfigurableProvider.kt

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import com.intellij.ui.dsl.builder.bindItem
99
import com.intellij.ui.dsl.builder.bindSelected
1010
import com.intellij.ui.dsl.builder.bindText
1111
import com.intellij.ui.dsl.builder.panel
12-
import com.intellij.ui.dsl.builder.whenItemSelectedFromUi
1312
import com.jetbrains.rd.generator.nova.GenerationSpec.Companion.nullIfEmpty
1413
import com.mitteloupe.cag.cleanarchitecturegenerator.CleanArchitectureGeneratorBundle
1514
import com.mitteloupe.cag.cleanarchitecturegenerator.model.DependencyInjection
@@ -51,15 +50,13 @@ private class RootConfigurable :
5150
override fun createPanel() =
5251
panel {
5352
var gitWarningLabel: JLabel? = null
54-
var dependencyInjectionWarningLabel: JLabel? = null
5553

5654
fun isGitAvailableForState(pathText: String): Boolean =
5755
Git(gitBinaryPath = pathText.nullIfEmpty()).isAvailable(File(System.getProperty("user.home")))
5856

5957
fun updateWarnings(currentPath: String) {
6058
val showGitWarning = !isGitAvailableForState(currentPath.trim())
6159
gitWarningLabel?.isVisible = showGitWarning
62-
dependencyInjectionWarningLabel?.isVisible = defaultDependencyInjectionChanged
6360
}
6461

6562
row {
@@ -110,25 +107,17 @@ private class RootConfigurable :
110107
}
111108

112109
row(CleanArchitectureGeneratorBundle.message("settings.dependency.injection.label")) {
113-
@Suppress("UnstableApiUsage")
114110
comboBox(DependencyInjection.entries)
115-
.whenItemSelectedFromUi {
116-
defaultDependencyInjection = it
117-
updateWarnings(gitPath)
118-
}.bindItem(
111+
.bindItem(
119112
{ defaultDependencyInjection },
120-
{ _ -> }
113+
{ newValue ->
114+
if (newValue != null) {
115+
defaultDependencyInjection = newValue
116+
}
117+
}
121118
)
122119
}
123120

124-
row {
125-
label(CleanArchitectureGeneratorBundle.message("settings.dependency.injection.warning")).applyToComponent {
126-
icon = AllIcons.General.Warning
127-
dependencyInjectionWarningLabel = this
128-
isVisible = false
129-
}
130-
}
131-
132121
onApply {
133122
updateWarnings(gitPath)
134123
}

plugin/src/main/resources/messages/CleanArchitectureGeneratorBundle.properties

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ settings.git.path.label=Git executable path (optional)
8989
settings.git.path.tooltip=Absolute path to git executable, e.g., /usr/bin/git. Leave empty to use PATH.
9090
settings.git.not.found.warning=Git not found. Set a valid path.
9191
settings.dependency.injection.label=Default dependency injection library
92-
settings.dependency.injection.warning=Changes to the default value may only take effect after restarting Android Studio.
9392

9493
inspection.clean.architecture.group.name=Clean Architecture checks
9594
inspection.viewmodel.function.name.starts.with.on.display.name=Public ViewModel function name starts with 'on'

0 commit comments

Comments
 (0)