fix: template recipe result not set to ProjectTemplate

This commit is contained in:
Akash Yadav
2023-05-22 23:40:04 +05:30
parent 4c9b6b6088
commit 676e336310
22 changed files with 101 additions and 75 deletions
@@ -252,7 +252,7 @@ class MainActivity : IDEActivity() {
builder.show()
}
private fun openProject(root: File) {
internal fun openProject(root: File) {
projectPath = root.absolutePath
startActivity(Intent(this, EditorActivityKt::class.java))
}
@@ -20,5 +20,4 @@ package com.itsaky.androidide.activities.editor
/**
* @author Akash Yadav
*/
class EditorActivityKt : EditorHandlerActivity() {
}
class EditorActivityKt : EditorHandlerActivity()
@@ -9,9 +9,9 @@ import android.widget.TextView
import androidx.fragment.app.viewModels
import com.blankj.utilcode.util.ThreadUtils
import com.google.android.material.progressindicator.LinearProgressIndicator
import com.itsaky.androidide.activities.MainActivity
import com.itsaky.androidide.activities.PreferencesActivity
import com.itsaky.androidide.activities.TerminalActivity
import com.itsaky.androidide.activities.editor.EditorActivityKt
import com.itsaky.androidide.adapters.MainActionsListAdapter
import com.itsaky.androidide.app.BaseApplication
import com.itsaky.androidide.common.databinding.LayoutDialogProgressBinding
@@ -19,7 +19,6 @@ import com.itsaky.androidide.databinding.FragmentMainBinding
import com.itsaky.androidide.fragments.WizardFragment.OnProjectCreatedListener
import com.itsaky.androidide.models.MainScreenAction
import com.itsaky.androidide.preferences.databinding.LayoutDialogTextInputBinding
import com.itsaky.androidide.projects.ProjectManager.projectPath
import com.itsaky.androidide.resources.R
import com.itsaky.androidide.resources.R.string
import com.itsaky.androidide.tasks.executeAsyncProvideError
@@ -88,8 +87,7 @@ class MainFragment : BaseFragment(), OnProjectCreatedListener {
}
override fun openProject(root: File) {
projectPath = root.absolutePath
startActivity(Intent(requireActivity(), EditorActivityKt::class.java))
(requireActivity() as MainActivity).openProject(root)
}
private fun cloneGitRepo() {
@@ -25,12 +25,15 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.transition.TransitionManager
import com.itsaky.androidide.R
import com.itsaky.androidide.R.string
import com.itsaky.androidide.activities.MainActivity
import com.itsaky.androidide.adapters.TemplateWidgetsListAdapter
import com.itsaky.androidide.databinding.FragmentTemplateDetailsBinding
import com.itsaky.androidide.tasks.executeAsyncProvideError
import com.itsaky.androidide.templates.ProjectTemplateRecipeResult
import com.itsaky.androidide.templates.StringParameter
import com.itsaky.androidide.templates.Template
import com.itsaky.androidide.templates.impl.ConstraintVerifier
import com.itsaky.androidide.utils.ILogger
import com.itsaky.androidide.utils.TemplateRecipeExecutor
import com.itsaky.androidide.utils.flashError
import com.itsaky.androidide.utils.flashSuccess
@@ -45,6 +48,7 @@ class TemplateDetailsFragment :
FragmentWithBinding<FragmentTemplateDetailsBinding>(
R.layout.fragment_template_details, FragmentTemplateDetailsBinding::bind) {
private val log = ILogger.newInstance("TemplateDetailsFragment")
private val viewModel by viewModels<MainViewModel>(
ownerProducer = { requireActivity() })
@@ -88,18 +92,24 @@ class TemplateDetailsFragment :
viewModel.creatingProject.value = true
executeAsyncProvideError({
template.recipe.execute(TemplateRecipeExecutor())
true
}) { result, err ->
viewModel.creatingProject.value = false
if (result == false || err != null) {
if (result == null || err != null || result !is ProjectTemplateRecipeResult) {
err?.printStackTrace()
log.error(
"Failed to create project. result=$result, err=${err?.message}")
flashError(string.project_creation_failed)
return@executeAsyncProvideError
}
viewModel.setScreen(MainViewModel.SCREEN_MAIN)
flashSuccess(string.project_created_successfully)
viewModel.postTransition(viewLifecycleOwner) {
// open the project
(requireActivity() as MainActivity).openProject(result.data.projectDir)
}
}
}
@@ -28,6 +28,7 @@ import com.itsaky.androidide.R
import com.itsaky.androidide.adapters.TemplateListAdapter
import com.itsaky.androidide.databinding.FragmentTemplateListBinding
import com.itsaky.androidide.templates.ITemplateProvider
import com.itsaky.androidide.templates.ProjectTemplate
import com.itsaky.androidide.viewmodel.MainViewModel
import kotlin.math.ceil
@@ -48,7 +49,11 @@ class TemplateListFragment : FragmentWithBinding<FragmentTemplateListBinding>(
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val templates = ITemplateProvider.getInstance().getTemplates()
// Show only project templates
val templates = ITemplateProvider.getInstance()
.getTemplates()
.filterIsInstance<ProjectTemplate>()
layoutManager =
FlexboxLayoutManager(requireContext(), FlexDirection.ROW).apply {
justifyContent = JustifyContent.SPACE_EVENLY
@@ -19,7 +19,6 @@ package com.itsaky.androidide.templates.base
import com.itsaky.androidide.templates.EMPTY_RECIPE
import com.itsaky.androidide.templates.RecipeExecutor
import com.itsaky.androidide.templates.Template
import com.itsaky.androidide.templates.TemplateBuilder
import com.itsaky.androidide.templates.TemplateData
import com.itsaky.androidide.templates.TemplateRecipe
@@ -27,18 +26,27 @@ import com.itsaky.androidide.templates.TemplateRecipeConfigurator
import com.itsaky.androidide.templates.TemplateRecipeFinalizer
import com.itsaky.androidide.templates.TemplateRecipeResult
sealed class PrePostRecipeTemplateBuilder<R : TemplateRecipeResult> : TemplateBuilder<R>() {
sealed class PrePostRecipeTemplateBuilder<R : TemplateRecipeResult> :
TemplateBuilder<R>() {
internal var preRecipe: TemplateRecipeConfigurator = {}
internal var postRecipe: TemplateRecipeFinalizer = {}
override var recipe: TemplateRecipe<R>? = null
private var _recipe: TemplateRecipe<R>? = null
val isRecipeSet: Boolean
get() = _recipe != null
override var recipe: TemplateRecipe<R>?
get() = TemplateRecipe {
preRecipe(it)
val result = (field ?: EMPTY_RECIPE).execute(it)
val result = (_recipe ?: EMPTY_RECIPE).execute(it)
postRecipe(it)
result
}
set(value) {
_recipe = value
}
}
/**
@@ -17,7 +17,11 @@
package com.itsaky.androidide.templates.impl
import com.itsaky.androidide.templates.ProjectTemplate
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
import com.itsaky.androidide.templates.base.ProjectTemplateBuilder
import com.itsaky.androidide.templates.base.baseProject
import com.itsaky.androidide.templates.impl.base.createRecipe
/**
* Indents the given string for the given [indentation level][level].
@@ -32,7 +36,19 @@ fun String.indent(level: Int): String {
}.toString()
}
internal fun AndroidModuleTemplateBuilder.templateAsset(name: String, path: String
@Suppress("UnusedReceiverParameter")
internal fun AndroidModuleTemplateBuilder.templateAsset(name: String,
path: String
): String {
return "templates/${name}/${path}"
}
internal fun baseProjectImpl(block: ProjectTemplateBuilder.() -> Unit
): ProjectTemplate = baseProject {
block()
// make sure we return a proper result
if (!isRecipeSet) {
recipe = createRecipe {}
}
}
@@ -17,8 +17,7 @@
package com.itsaky.androidide.templates.impl.base
internal fun baseLayoutContentMain() =
"""
internal fun baseLayoutContentMain() = """
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
@@ -17,10 +17,14 @@
package com.itsaky.androidide.templates.impl.base
import com.itsaky.androidide.templates.ModuleTemplateRecipeResult
import com.itsaky.androidide.templates.ProjectTemplateRecipeResult
import com.itsaky.androidide.templates.RecipeExecutor
import com.itsaky.androidide.templates.TemplateRecipe
import com.itsaky.androidide.templates.TemplateRecipeResult
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
import com.itsaky.androidide.templates.base.ExecutorDataTemplateBuilder
import com.itsaky.androidide.templates.base.ProjectTemplateBuilder
internal fun <R : TemplateRecipeResult> ExecutorDataTemplateBuilder<*, *>.createRecipe(
action: RecipeExecutor.() -> R
@@ -28,4 +32,22 @@ internal fun <R : TemplateRecipeResult> ExecutorDataTemplateBuilder<*, *>.create
return TemplateRecipe {
return@TemplateRecipe executor.run(action)
}
}
internal fun AndroidModuleTemplateBuilder.createRecipe(
action: RecipeExecutor.() -> Unit
): TemplateRecipe<ModuleTemplateRecipeResult> {
return TemplateRecipe {
executor.run(action)
recipeResult()
}
}
internal fun ProjectTemplateBuilder.createRecipe(
action: RecipeExecutor.() -> Unit
): TemplateRecipe<ProjectTemplateRecipeResult> {
return TemplateRecipe {
executor.run(action)
recipeResult()
}
}
@@ -19,18 +19,17 @@ package com.itsaky.androidide.templates.impl.basicActivity
import com.itsaky.androidide.templates.ProjectTemplate
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
import com.itsaky.androidide.templates.base.baseProject
import com.itsaky.androidide.templates.base.modules.android.defaultAppModule
import com.itsaky.androidide.templates.base.util.AndroidModuleResManager.ResourceType.LAYOUT
import com.itsaky.androidide.templates.base.util.SourceWriter
import com.itsaky.androidide.templates.impl.R
import com.itsaky.androidide.templates.impl.base.createRecipe
import com.itsaky.androidide.templates.impl.base.emptyThemesAndColors
import com.itsaky.androidide.templates.impl.base.recipeResult
import com.itsaky.androidide.templates.impl.base.writeMainActivity
import com.itsaky.androidide.templates.impl.baseProjectImpl
fun basicActivityProject(): ProjectTemplate {
return baseProject {
return baseProjectImpl {
templateName = R.string.template_basic
thumb = R.drawable.template_basic_activity
defaultAppModule {
@@ -43,8 +42,6 @@ fun basicActivityProject(): ProjectTemplate {
writeBasicActivityLayout()
emptyThemesAndColors()
}
recipeResult()
}
}
}
@@ -19,18 +19,17 @@ package com.itsaky.androidide.templates.impl.bottomNavActivity
import com.itsaky.androidide.templates.Language.Kotlin
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
import com.itsaky.androidide.templates.base.baseProject
import com.itsaky.androidide.templates.base.models.Dependency
import com.itsaky.androidide.templates.base.modules.android.defaultAppModule
import com.itsaky.androidide.templates.base.util.AndroidModuleResManager.ResourceType.NAVIGATION
import com.itsaky.androidide.templates.impl.R
import com.itsaky.androidide.templates.impl.base.createRecipe
import com.itsaky.androidide.templates.impl.base.emptyThemesAndColors
import com.itsaky.androidide.templates.impl.base.recipeResult
import com.itsaky.androidide.templates.impl.base.writeMainActivity
import com.itsaky.androidide.templates.impl.baseProjectImpl
import com.itsaky.androidide.templates.impl.templateAsset
fun bottomNavActivityProject() = baseProject {
fun bottomNavActivityProject() = baseProjectImpl {
templateName = R.string.template_navigation_tabs
thumb = R.drawable.template_bottom_navigation_activity
defaultAppModule {
@@ -58,8 +57,6 @@ fun bottomNavActivityProject() = baseProject {
} else {
bottomNavActivityProjectJava()
}
recipeResult()
}
}
}
@@ -19,8 +19,7 @@ package com.itsaky.androidide.templates.impl.bottomNavActivity
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
internal fun AndroidModuleTemplateBuilder.bottomNavActivitySrcKt()
= """
internal fun AndroidModuleTemplateBuilder.bottomNavActivitySrcKt() = """
package ${data.packageName}
import android.os.Bundle
@@ -59,8 +58,7 @@ class MainActivity : AppCompatActivity() {
}
""".trim()
internal fun AndroidModuleTemplateBuilder. bottomNavActivitySrcJava()
= """
internal fun AndroidModuleTemplateBuilder.bottomNavActivitySrcJava() = """
package ${data.packageName};
import android.os.Bundle;
@@ -19,8 +19,7 @@ package com.itsaky.androidide.templates.impl.bottomNavActivity
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
internal fun AndroidModuleTemplateBuilder.bottomNavFragmentDashSrcKt()
= """
internal fun AndroidModuleTemplateBuilder.bottomNavFragmentDashSrcKt() = """
package ${data.packageName}.ui.dashboard
import android.os.Bundle
@@ -65,8 +64,7 @@ class DashboardFragment : Fragment() {
}
""".trim()
internal fun AndroidModuleTemplateBuilder.bottomNavFragmentDashSrcJava()
= """
internal fun AndroidModuleTemplateBuilder.bottomNavFragmentDashSrcJava() = """
package ${data.packageName}.ui.dashboard;
import android.os.Bundle;
@@ -19,8 +19,7 @@ package com.itsaky.androidide.templates.impl.bottomNavActivity
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
internal fun AndroidModuleTemplateBuilder.bottomNavModelDashSrcKt()
= """
internal fun AndroidModuleTemplateBuilder.bottomNavModelDashSrcKt() = """
package ${data.packageName}.ui.dashboard
import androidx.lifecycle.LiveData
@@ -36,8 +35,7 @@ class DashboardViewModel : ViewModel() {
}
""".trim()
internal fun AndroidModuleTemplateBuilder.bottomNavModelDashSrcJava()
= """
internal fun AndroidModuleTemplateBuilder.bottomNavModelDashSrcJava() = """
package ${data.packageName}.ui.dashboard;
import androidx.lifecycle.LiveData;
@@ -19,8 +19,7 @@ package com.itsaky.androidide.templates.impl.bottomNavActivity
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
internal fun AndroidModuleTemplateBuilder.bottomNavModelHomeSrcKt()
= """
internal fun AndroidModuleTemplateBuilder.bottomNavModelHomeSrcKt() = """
package ${data.packageName}.ui.home
import androidx.lifecycle.LiveData
@@ -36,8 +35,7 @@ class HomeViewModel : ViewModel() {
}
""".trim()
internal fun AndroidModuleTemplateBuilder.bottomNavModelHomeSrcJava()
= """
internal fun AndroidModuleTemplateBuilder.bottomNavModelHomeSrcJava() = """
package ${data.packageName}.ui.home;
import androidx.lifecycle.LiveData;
@@ -19,17 +19,16 @@ package com.itsaky.androidide.templates.impl.emptyActivity
import com.itsaky.androidide.templates.ProjectTemplate
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
import com.itsaky.androidide.templates.base.baseProject
import com.itsaky.androidide.templates.base.modules.android.defaultAppModule
import com.itsaky.androidide.templates.base.util.AndroidModuleResManager.ResourceType.LAYOUT
import com.itsaky.androidide.templates.base.util.SourceWriter
import com.itsaky.androidide.templates.impl.R
import com.itsaky.androidide.templates.impl.base.createRecipe
import com.itsaky.androidide.templates.impl.base.emptyThemesAndColors
import com.itsaky.androidide.templates.impl.base.recipeResult
import com.itsaky.androidide.templates.impl.base.writeMainActivity
import com.itsaky.androidide.templates.impl.baseProjectImpl
fun emptyActivityProject(): ProjectTemplate = baseProject {
fun emptyActivityProject(): ProjectTemplate = baseProjectImpl {
templateName = R.string.template_empty
thumb = R.drawable.template_empty_activity
defaultAppModule {
@@ -41,8 +40,6 @@ fun emptyActivityProject(): ProjectTemplate = baseProject {
res {
writeEmptyActivity()
}
recipeResult()
}
}
}
@@ -19,18 +19,17 @@ package com.itsaky.androidide.templates.impl.navDrawerActivity
import com.itsaky.androidide.templates.Language.Kotlin
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
import com.itsaky.androidide.templates.base.baseProject
import com.itsaky.androidide.templates.base.models.Dependency
import com.itsaky.androidide.templates.base.modules.android.defaultAppModule
import com.itsaky.androidide.templates.base.util.AndroidModuleResManager.ResourceType.NAVIGATION
import com.itsaky.androidide.templates.impl.R
import com.itsaky.androidide.templates.impl.base.createRecipe
import com.itsaky.androidide.templates.impl.base.emptyThemesAndColors
import com.itsaky.androidide.templates.impl.base.recipeResult
import com.itsaky.androidide.templates.impl.base.writeMainActivity
import com.itsaky.androidide.templates.impl.baseProjectImpl
import com.itsaky.androidide.templates.impl.templateAsset
fun navDrawerActivityProject() = baseProject {
fun navDrawerActivityProject() = baseProjectImpl {
templateName = R.string.template_navigation_drawer
thumb = R.drawable.template_blank_activity_drawer
defaultAppModule {
@@ -64,8 +63,6 @@ fun navDrawerActivityProject() = baseProject {
} else {
navDrawerActivityProjectJava()
}
recipeResult()
}
}
}
@@ -17,14 +17,13 @@
package com.itsaky.androidide.templates.impl.noActivity
import com.itsaky.androidide.templates.base.baseProject
import com.itsaky.androidide.templates.base.modules.android.defaultAppModule
import com.itsaky.androidide.templates.impl.R
import com.itsaky.androidide.templates.impl.base.createRecipe
import com.itsaky.androidide.templates.impl.base.emptyThemesAndColors
import com.itsaky.androidide.templates.impl.base.recipeResult
import com.itsaky.androidide.templates.impl.baseProjectImpl
fun noActivityProjectTemplate() = baseProject {
fun noActivityProjectTemplate() = baseProjectImpl {
templateName = R.string.template_no_activity
thumb = R.drawable.template_no_activity
defaultAppModule {
@@ -32,8 +31,6 @@ fun noActivityProjectTemplate() = baseProject {
res {
emptyThemesAndColors(actionBar = true)
}
recipeResult()
}
}
}
@@ -19,8 +19,7 @@ package com.itsaky.androidide.templates.impl.tabbedActivity
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
internal fun AndroidModuleTemplateBuilder.tabbedPageViewModelSrcKt()
= """
internal fun AndroidModuleTemplateBuilder.tabbedPageViewModelSrcKt() = """
package ${data.packageName}.ui.main
import androidx.lifecycle.LiveData
@@ -42,8 +41,7 @@ class PageViewModel : ViewModel() {
}
""".trim()
internal fun AndroidModuleTemplateBuilder.tabbedPageViewModelSrcJava()
= """
internal fun AndroidModuleTemplateBuilder.tabbedPageViewModelSrcJava() = """
package ${data.packageName}.ui.main;
import androidx.arch.core.util.Function;
@@ -19,8 +19,7 @@ package com.itsaky.androidide.templates.impl.tabbedActivity
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
internal fun AndroidModuleTemplateBuilder.tabbedPagerAdapterSrcKt()
= """
internal fun AndroidModuleTemplateBuilder.tabbedPagerAdapterSrcKt() = """
package ${data.packageName}.ui.main
import android.content.Context
@@ -59,8 +58,7 @@ class SectionsPagerAdapter(private val context: Context, fm: FragmentManager) :
}
""".trim()
internal fun AndroidModuleTemplateBuilder.tabbedPagerAdapterSrcJava()
= """
internal fun AndroidModuleTemplateBuilder.tabbedPagerAdapterSrcJava() = """
package ${data.packageName}.ui.main;
import android.content.Context;
@@ -19,8 +19,7 @@ package com.itsaky.androidide.templates.impl.tabbedActivity
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
internal fun AndroidModuleTemplateBuilder.tabbedPlaceholderFragmentSrcKt()
= """
internal fun AndroidModuleTemplateBuilder.tabbedPlaceholderFragmentSrcKt() = """
package ${data.packageName}.ui.main
import android.os.Bundle
@@ -96,8 +95,8 @@ class PlaceholderFragment : Fragment() {
}
""".trim()
internal fun AndroidModuleTemplateBuilder.tabbedPlaceholderFragmentSrcJava()
= """
internal fun AndroidModuleTemplateBuilder.tabbedPlaceholderFragmentSrcJava() =
"""
package ${data.packageName}.ui.main;
import android.os.Bundle;
@@ -19,17 +19,16 @@ package com.itsaky.androidide.templates.impl.tabbedActivity
import com.itsaky.androidide.templates.Language
import com.itsaky.androidide.templates.base.AndroidModuleTemplateBuilder
import com.itsaky.androidide.templates.base.baseProject
import com.itsaky.androidide.templates.base.models.Dependency
import com.itsaky.androidide.templates.base.modules.android.defaultAppModule
import com.itsaky.androidide.templates.impl.R
import com.itsaky.androidide.templates.impl.base.createRecipe
import com.itsaky.androidide.templates.impl.base.emptyThemesAndColors
import com.itsaky.androidide.templates.impl.base.recipeResult
import com.itsaky.androidide.templates.impl.base.writeMainActivity
import com.itsaky.androidide.templates.impl.baseProjectImpl
import com.itsaky.androidide.templates.impl.templateAsset
fun tabbedActivityProject() = baseProject {
fun tabbedActivityProject() = baseProjectImpl {
templateName = R.string.template_tabs
thumb = R.drawable.template_blank_activity_tabs
defaultAppModule {
@@ -54,8 +53,6 @@ fun tabbedActivityProject() = baseProject {
} else {
tabbedActivityProjectJava()
}
recipeResult()
}
}
}