diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index ec68e77a8..e027f9230 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -131,4 +131,4 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/java/com/itsaky/androidide/activities/MainActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/MainActivity.kt
index 5621e16e9..19fb5d8d2 100755
--- a/app/src/main/java/com/itsaky/androidide/activities/MainActivity.kt
+++ b/app/src/main/java/com/itsaky/androidide/activities/MainActivity.kt
@@ -42,6 +42,7 @@ import com.itsaky.androidide.preferences.internal.confirmProjectOpen
import com.itsaky.androidide.preferences.internal.lastOpenedProject
import com.itsaky.androidide.projects.ProjectManager.projectPath
import com.itsaky.androidide.resources.R.string
+import com.itsaky.androidide.templates.ITemplateProvider
import com.itsaky.androidide.utils.DialogUtils
import com.itsaky.androidide.utils.Environment
import com.itsaky.androidide.utils.flashError
@@ -114,6 +115,18 @@ class MainActivity : IDEActivity() {
this, /* onBackPressedCallback = */ onBackPressedCallback)
}
+ override fun onStart() {
+ super.onStart()
+ ITemplateProvider.getInstance(reload = true)
+ }
+
+ override fun onStop() {
+ super.onStop()
+ if (ITemplateProvider.isLoaded()) {
+ ITemplateProvider.getInstance().clear()
+ }
+ }
+
private fun onScreenChanged(screen: Int?) {
val previous = viewModel.previousScreen
if (previous != -1) {
diff --git a/templates-api/src/main/java/com/itsaky/androidide/templates/ITemplateProvider.kt b/templates-api/src/main/java/com/itsaky/androidide/templates/ITemplateProvider.kt
index f493ead7b..6ed159c58 100644
--- a/templates-api/src/main/java/com/itsaky/androidide/templates/ITemplateProvider.kt
+++ b/templates-api/src/main/java/com/itsaky/androidide/templates/ITemplateProvider.kt
@@ -48,6 +48,12 @@ interface ITemplateProvider {
.findFirstOrThrow()
.also { provider = it }
}
+
+ /**
+ * @return Whether the [ITemplateProvider] has been loaded or not.
+ */
+ @JvmStatic
+ fun isLoaded() = provider != null
}
/**
@@ -63,7 +69,7 @@ interface ITemplateProvider {
* @param templateId The ID for the template.
* @return The [Template] with the given [templateId] if any, or `null`.
*/
- fun getTemplate(templateId: String) : Template<*>?
+ fun getTemplate(templateId: String): Template<*>?
/**
* Clear all the templates stored in the provider.
diff --git a/templates-api/src/main/java/com/itsaky/androidide/templates/parameters.kt b/templates-api/src/main/java/com/itsaky/androidide/templates/parameters.kt
index caefc7d32..c70cf7cb4 100644
--- a/templates-api/src/main/java/com/itsaky/androidide/templates/parameters.kt
+++ b/templates-api/src/main/java/com/itsaky/androidide/templates/parameters.kt
@@ -132,6 +132,12 @@ abstract class Parameter(@StringRes val name: Int,
}
}
+ fun release() {
+ lock.withLock {
+ observers.clear()
+ }
+ }
+
private fun notifyObservers() {
lock.withLock {
observers.forEach {
diff --git a/templates-api/src/main/java/com/itsaky/androidide/templates/template.kt b/templates-api/src/main/java/com/itsaky/androidide/templates/template.kt
index d12dd83ae..3ebebbac7 100644
--- a/templates-api/src/main/java/com/itsaky/androidide/templates/template.kt
+++ b/templates-api/src/main/java/com/itsaky/androidide/templates/template.kt
@@ -253,6 +253,10 @@ open class Template(
open val parameters: Collection>
get() = widgets.filterIsInstance>().map { it.parameter }
+ open fun release() {
+ widgets.forEach { it.release() }
+ }
+
companion object {
@JvmStatic
@@ -260,11 +264,14 @@ open class Template(
}
}
-open class ProjectTemplate(
- val moduleTemplates: List>, @StringRes templateName: Int,
- @DrawableRes thumb: Int, @StringRes description: Int?,
- widgets: List>, recipe: TemplateRecipe
-) : Template(templateName, thumb, description, widgets, recipe) {
+open class ProjectTemplate(val moduleTemplates: List>,
+ @StringRes templateName: Int,
+ @DrawableRes thumb: Int,
+ @StringRes description: Int?,
+ widgets: List>,
+ recipe: TemplateRecipe
+) : Template(templateName, thumb, description,
+ widgets, recipe) {
override val parameters: Collection>
get() = if (moduleTemplates.isEmpty()) super.parameters else super.parameters.toMutableList()
@@ -286,6 +293,11 @@ open class ProjectTemplate(
result
}
}
+
+ override fun release() {
+ super.release()
+ moduleTemplates.forEach { it.release() }
+ }
}
/**
@@ -293,24 +305,22 @@ open class ProjectTemplate(
*
* @property name The mdoule name (gradle format, e.g. ':app').
*/
-open class ModuleTemplate(val name: String,
- @StringRes
- templateName: Int,
- @DrawableRes
- thumb: Int, @StringRes
- description: Int?,
- widgets: List>,
- recipe: TemplateRecipe
-) : Template(templateName, thumb, description, widgets, recipe)
+open class ModuleTemplate(val name: String, @StringRes templateName: Int,
+ @DrawableRes thumb: Int, @StringRes description: Int?,
+ widgets: List>,
+ recipe: TemplateRecipe
+) : Template(templateName, thumb, description,
+ widgets, recipe)
/**
* Template for creating a file.
*/
open class FileTemplate(@StringRes name: Int,
- @DrawableRes thumb: Int,
- @StringRes description: Int?,
- widgets: List>,
- recipe: TemplateRecipe
+ @DrawableRes thumb: Int,
+ @StringRes
+ description: Int?,
+ widgets: List>,
+ recipe: TemplateRecipe
) : Template(name, thumb, description, widgets, recipe)
/**
diff --git a/templates-api/src/main/java/com/itsaky/androidide/templates/widget.kt b/templates-api/src/main/java/com/itsaky/androidide/templates/widget.kt
index f75dfe695..126904f3c 100644
--- a/templates-api/src/main/java/com/itsaky/androidide/templates/widget.kt
+++ b/templates-api/src/main/java/com/itsaky/androidide/templates/widget.kt
@@ -22,12 +22,20 @@ package com.itsaky.androidide.templates
*
* Each template has a collection of widgets which is rendered when user selects a template.
*/
-interface Widget
+interface Widget {
+
+ fun release()
+}
/**
* Widget for the given [parameter].
*/
-sealed class ParameterWidget(val parameter: Parameter) : Widget
+sealed class ParameterWidget(val parameter: Parameter) : Widget {
+
+ override fun release() {
+ parameter.release()
+ }
+}
/**
* Widget for a [StringParameter]. Creates a text field for the parameter.
diff --git a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/TemplateProviderImpl.kt b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/TemplateProviderImpl.kt
index e089614b8..b7fc68da0 100644
--- a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/TemplateProviderImpl.kt
+++ b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/TemplateProviderImpl.kt
@@ -66,6 +66,7 @@ class TemplateProviderImpl : ITemplateProvider {
}
override fun clear() {
+ templates.forEach { it.value.release() }
templates.clear()
}
}
\ No newline at end of file