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