diff --git a/app/src/main/java/io/neoterm/component/NeoInitializer.kt b/app/src/main/java/io/neoterm/component/NeoInitializer.kt index df0cffe..088fa86 100644 --- a/app/src/main/java/io/neoterm/component/NeoInitializer.kt +++ b/app/src/main/java/io/neoterm/component/NeoInitializer.kt @@ -5,7 +5,7 @@ import io.neoterm.component.codegen.CodeGenComponent import io.neoterm.component.colorscheme.ColorSchemeComponent import io.neoterm.component.completion.CompletionComponent import io.neoterm.component.config.ConfigureComponent -import io.neoterm.component.extrakey.ExtraKeysComponent +import io.neoterm.component.extrakey.ExtraKeyComponent import io.neoterm.component.font.FontComponent import io.neoterm.component.pm.PackageComponent import io.neoterm.component.profile.ProfileComponent @@ -30,7 +30,7 @@ object NeoInitializer { ComponentManager.registerComponent(ColorSchemeComponent::class.java) ComponentManager.registerComponent(FontComponent::class.java) ComponentManager.registerComponent(UserScriptComponent::class.java) - ComponentManager.registerComponent(ExtraKeysComponent::class.java) + ComponentManager.registerComponent(ExtraKeyComponent::class.java) ComponentManager.registerComponent(CompletionComponent::class.java) ComponentManager.registerComponent(PackageComponent::class.java) ComponentManager.registerComponent(SessionComponent::class.java) diff --git a/app/src/main/java/io/neoterm/component/colorscheme/NeoColorScheme.kt b/app/src/main/java/io/neoterm/component/colorscheme/NeoColorScheme.kt index 69d2d5f..2e7a39a 100644 --- a/app/src/main/java/io/neoterm/component/colorscheme/NeoColorScheme.kt +++ b/app/src/main/java/io/neoterm/component/colorscheme/NeoColorScheme.kt @@ -175,7 +175,7 @@ open class NeoColorScheme : CodeGenObject, ConfigFileBasedObject { } @TestOnly - fun loadConfigure(file: File): Boolean { + fun testLoadConfigure(file: File): Boolean { val loaderService = ComponentManager.getComponent() val configure: NeoConfigureFile? diff --git a/app/src/main/java/io/neoterm/component/extrakey/ExtraKeysComponent.kt b/app/src/main/java/io/neoterm/component/extrakey/ExtraKeyComponent.kt similarity index 78% rename from app/src/main/java/io/neoterm/component/extrakey/ExtraKeysComponent.kt rename to app/src/main/java/io/neoterm/component/extrakey/ExtraKeyComponent.kt index 1e51905..9699674 100644 --- a/app/src/main/java/io/neoterm/component/extrakey/ExtraKeysComponent.kt +++ b/app/src/main/java/io/neoterm/component/extrakey/ExtraKeyComponent.kt @@ -2,36 +2,42 @@ package io.neoterm.component.extrakey import android.content.Context import io.neoterm.App -import io.neoterm.frontend.logging.NLog +import io.neoterm.frontend.component.helper.ConfigFileBasedComponent import io.neoterm.frontend.config.NeoTermPath -import io.neoterm.frontend.component.NeoComponent -import io.neoterm.utils.AssetsUtils +import io.neoterm.frontend.logging.NLog import io.neoterm.frontend.terminal.extrakey.ExtraKeysView +import io.neoterm.utils.AssetsUtils import java.io.File import java.io.FileFilter /** * @author kiva */ -class ExtraKeysComponent : NeoComponent { +class ExtraKeyComponent : ConfigFileBasedComponent() { companion object { private val FILTER = FileFilter { it.extension == "nl" } } - override fun onServiceInit() { - checkForFiles() - } - override fun onServiceDestroy() { - } - - override fun onServiceObtained() { - checkForFiles() - } + override val checkComponentFileWhenObtained = true private val extraKeys: MutableMap = mutableMapOf() + override fun onCheckComponentFiles() { + File(NeoTermPath.EKS_PATH).mkdirs() + + val defaultFile = File(NeoTermPath.EKS_DEFAULT_FILE) + if (!defaultFile.exists()) { + extractDefaultConfig(App.get()) + } + reloadExtraKeyConfig() + } + + override fun onCreateComponentObject(): NeoExtraKey { + return NeoExtraKey() + } + fun showShortcutKeys(program: String, extraKeysView: ExtraKeysView?) { if (extraKeysView == null) { return @@ -52,16 +58,6 @@ class ExtraKeysComponent : NeoComponent { } } - private fun checkForFiles() { - File(NeoTermPath.EKS_PATH).mkdirs() - - val defaultFile = File(NeoTermPath.EKS_DEFAULT_FILE) - if (!defaultFile.exists()) { - extractDefaultConfig(App.get()) - } - loadConfigure() - } - private fun extractDefaultConfig(context: Context) { try { AssetsUtils.extractAssetsDir(context, "eks", NeoTermPath.EKS_PATH) @@ -70,13 +66,13 @@ class ExtraKeysComponent : NeoComponent { } } - private fun loadConfigure() { + private fun reloadExtraKeyConfig() { val configDir = File(NeoTermPath.EKS_PATH) configDir.listFiles(FILTER).forEach { if (it.absolutePath != NeoTermPath.EKS_DEFAULT_FILE) { - val extraKey = NeoExtraKey() - if (extraKey.loadConfigure(it)) { + val extraKey = this.loadConfigure(it) + if (extraKey != null) { registerShortcutKeys(extraKey) } } diff --git a/app/src/main/java/io/neoterm/component/extrakey/NeoExtraKey.kt b/app/src/main/java/io/neoterm/component/extrakey/NeoExtraKey.kt index 1351e2b..8077873 100644 --- a/app/src/main/java/io/neoterm/component/extrakey/NeoExtraKey.kt +++ b/app/src/main/java/io/neoterm/component/extrakey/NeoExtraKey.kt @@ -2,18 +2,20 @@ package io.neoterm.component.extrakey import io.neolang.visitor.ConfigVisitor import io.neoterm.component.config.ConfigureComponent +import io.neoterm.frontend.component.ComponentManager +import io.neoterm.frontend.component.helper.ConfigFileBasedObject import io.neoterm.frontend.config.NeoConfigureFile import io.neoterm.frontend.logging.NLog -import io.neoterm.frontend.component.ComponentManager import io.neoterm.frontend.terminal.extrakey.ExtraKeysView import io.neoterm.frontend.terminal.extrakey.button.IExtraButton import io.neoterm.frontend.terminal.extrakey.button.TextButton +import org.jetbrains.annotations.TestOnly import java.io.File /** * @author kiva */ -class NeoExtraKey { +class NeoExtraKey : ConfigFileBasedObject { companion object { const val EKS_META_CONTEXT_NAME = "extra-key" @@ -42,28 +44,11 @@ class NeoExtraKey { } } - fun loadConfigure(file: File): Boolean { - // TODO: Refactor with NeoColorScheme#onConfigLoaded - val loaderService = ComponentManager.getComponent() - - val configure: NeoConfigureFile? - try { - configure = loaderService.newLoader(file).loadConfigure() - if (configure == null) { - throw RuntimeException("Parse configuration failed.") - } - } catch (e: Exception) { - NLog.e("ExtraKey", "Failed to load extra key config: ${file.absolutePath}: ${e.localizedMessage}") - return false - } - - val visitor = configure.getVisitor() - + override fun onConfigLoaded(configVisitor: ConfigVisitor) { // program - val programArray = visitor.getArray(EKS_META_CONTEXT_PATH, EKS_META_PROGRAM) + val programArray = configVisitor.getArray(EKS_META_CONTEXT_PATH, EKS_META_PROGRAM) if (programArray.isEmpty()) { - NLog.e("ExtraKey", "Failed to load extra key config: ${file.absolutePath}: Extra Key must have programs attribute") - return false + throw RuntimeException("Extra Key must have programs attribute") } programArray.forEach { @@ -73,14 +58,13 @@ class NeoExtraKey { } // key - val keyArray = visitor.getArray(EKS_META_CONTEXT_PATH, EKS_META_KEY) + val keyArray = configVisitor.getArray(EKS_META_CONTEXT_PATH, EKS_META_KEY) keyArray.takeWhile { it.isBlock() } .forEach { val display = it.eval(EKS_META_DISPLAY) val code = it.eval(EKS_META_CODE) if (!code.isValid()) { - NLog.e("ExtraKey", "Failed to load extra key config: ${file.absolutePath}: Key must have a code") - return false + throw RuntimeException("Key must have a code") } val codeText = code.asString() @@ -95,12 +79,31 @@ class NeoExtraKey { // We must cal toDouble() before toInt() // Because in NeoLang, numbers are default to Double - version = getMetaByVisitor(visitor, EKS_META_VERSION)?.toDouble()?.toInt() ?: 0 - withDefaultKeys = "true" == getMetaByVisitor(visitor, EKS_META_WITH_DEFAULT) - return true + version = getMetaByVisitor(configVisitor, EKS_META_VERSION)?.toDouble()?.toInt() ?: 0 + withDefaultKeys = "true" == getMetaByVisitor(configVisitor, EKS_META_WITH_DEFAULT) } private fun getMetaByVisitor(visitor: ConfigVisitor, metaName: String): String? { return visitor.getStringValue(EKS_META_CONTEXT_PATH, metaName) } + + @TestOnly + fun testLoadConfigure(file: File): Boolean { + val loaderService = ComponentManager.getComponent() + + val configure: NeoConfigureFile? + try { + configure = loaderService.newLoader(file).loadConfigure() + if (configure == null) { + throw RuntimeException("Parse configuration failed.") + } + } catch (e: Exception) { + NLog.e("ExtraKey", "Failed to load extra key config: ${file.absolutePath}: ${e.localizedMessage}") + return false + } + + val visitor = configure.getVisitor() + onConfigLoaded(visitor) + return true + } } \ No newline at end of file diff --git a/app/src/main/java/io/neoterm/frontend/session/shell/client/TermViewClient.kt b/app/src/main/java/io/neoterm/frontend/session/shell/client/TermViewClient.kt index 5eec632..d4647ca 100644 --- a/app/src/main/java/io/neoterm/frontend/session/shell/client/TermViewClient.kt +++ b/app/src/main/java/io/neoterm/frontend/session/shell/client/TermViewClient.kt @@ -9,7 +9,7 @@ import android.view.View import android.view.inputmethod.InputMethodManager import io.neoterm.backend.KeyHandler import io.neoterm.backend.TerminalSession -import io.neoterm.component.extrakey.ExtraKeysComponent +import io.neoterm.component.extrakey.ExtraKeyComponent import io.neoterm.frontend.component.ComponentManager import io.neoterm.frontend.config.NeoPreference import io.neoterm.frontend.session.shell.ShellTermSession @@ -222,7 +222,7 @@ class TermViewClient(val context: Context) : TerminalViewClient { if ((lastTitle != title || force) && updateExtraKeysVisibility()) { removeExtraKeys() - ComponentManager.getComponent().showShortcutKeys(title, extraKeysView) + ComponentManager.getComponent().showShortcutKeys(title, extraKeysView) extraKeysView.updateButtons() lastTitle = title } diff --git a/app/src/main/java/io/neoterm/frontend/terminal/extrakey/ExtraKeysView.kt b/app/src/main/java/io/neoterm/frontend/terminal/extrakey/ExtraKeysView.kt index 8fa68fd..2fcf3c3 100755 --- a/app/src/main/java/io/neoterm/frontend/terminal/extrakey/ExtraKeysView.kt +++ b/app/src/main/java/io/neoterm/frontend/terminal/extrakey/ExtraKeysView.kt @@ -7,7 +7,8 @@ import android.view.* import android.widget.GridLayout import android.widget.LinearLayout import io.neoterm.R -import io.neoterm.component.extrakey.NeoExtraKey +import io.neoterm.component.extrakey.ExtraKeyComponent +import io.neoterm.frontend.component.ComponentManager import io.neoterm.frontend.config.NeoPreference import io.neoterm.frontend.config.NeoTermPath import io.neoterm.frontend.session.shell.client.event.ToggleImeEvent @@ -62,11 +63,14 @@ class ExtraKeysView(context: Context, attrs: AttributeSet) : LinearLayout(contex } } + private val extraKeyComponent: ExtraKeyComponent + init { alpha = DEFAULT_ALPHA gravity = Gravity.TOP orientation = LinearLayout.VERTICAL typeface = Typeface.createFromAsset(context.assets, "eks_font.ttf") + extraKeyComponent = ComponentManager.getComponent() initBuiltinKeys() loadDefaultUserKeys() @@ -117,20 +121,18 @@ class ExtraKeysView(context: Context, attrs: AttributeSet) : LinearLayout(contex fun loadDefaultUserKeys() { clearUserKeys() - val defaultConfig = NeoExtraKey() - if (defaultConfig.loadConfigure(File(NeoTermPath.EKS_DEFAULT_FILE))) { + val defaultConfig = extraKeyComponent.loadConfigure(File(NeoTermPath.EKS_DEFAULT_FILE)) + if (defaultConfig != null) { userKeys.addAll(defaultConfig.shortcutKeys) } } fun updateButtons() { - for (bar in buttonBars) { - bar.removeAllViews() - } + buttonBars.forEach { it.removeAllViews() } var targetButtonBarIndex = 0 - for ((index, value) in builtinKeys.plus(userKeys).withIndex()) { - addKeyButton(getButtonBarOrNew(targetButtonBarIndex), value) + builtinKeys.plus(userKeys).forEachIndexed { index, button -> + addKeyButton(getButtonBarOrNew(targetButtonBarIndex), button) targetButtonBarIndex = (index + 1) / MAX_BUTTONS_PER_LINE } updateButtonBars() diff --git a/app/src/test/java/io/neoterm/ConfigureFileTest.kt b/app/src/test/java/io/neoterm/ConfigureFileTest.kt index 8171d45..720052c 100644 --- a/app/src/test/java/io/neoterm/ConfigureFileTest.kt +++ b/app/src/test/java/io/neoterm/ConfigureFileTest.kt @@ -20,7 +20,7 @@ class ConfigureFileTest { } val color = NeoColorScheme() - if (color.loadConfigure(File("NeoLang/example/color-scheme.nl"))) { + if (color.testLoadConfigure(File("NeoLang/example/color-scheme.nl"))) { println("colorName: ${color.colorName}") println("colorVersion: ${color.colorVersion}") println("background: ${color.backgroundColor}") @@ -38,7 +38,7 @@ class ConfigureFileTest { } val extraKey = NeoExtraKey() - if (extraKey.loadConfigure(File("app/src/main/assets/eks/vim.nl"))) { + if (extraKey.testLoadConfigure(File("app/src/main/assets/eks/vim.nl"))) { println("programs: ${extraKey.programNames}") println("version: ${extraKey.version}") println("with-default: ${extraKey.withDefaultKeys}")