diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index cfc417c..16e6dc6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -140,10 +140,6 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/App.kt b/app/src/main/java/io/neoterm/App.kt
index 83a3ef9..9829493 100644
--- a/app/src/main/java/io/neoterm/App.kt
+++ b/app/src/main/java/io/neoterm/App.kt
@@ -5,8 +5,7 @@ import android.app.Application
import android.content.Context
import android.content.Intent
import android.net.Uri
-import android.view.WindowManager
-import io.neoterm.customize.NeoInitializer
+import io.neoterm.component.NeoInitializer
import io.neoterm.frontend.preference.NeoPreference
import io.neoterm.utils.CrashHandler
diff --git a/app/src/main/java/io/neoterm/component/NeoInitializer.kt b/app/src/main/java/io/neoterm/component/NeoInitializer.kt
new file mode 100644
index 0000000..e6a0fb1
--- /dev/null
+++ b/app/src/main/java/io/neoterm/component/NeoInitializer.kt
@@ -0,0 +1,28 @@
+package io.neoterm.component
+
+import android.content.Context
+import io.neoterm.component.color.ColorSchemeComponent
+import io.neoterm.component.completion.CompletionComponent
+import io.neoterm.component.config.ConfigureComponent
+import io.neoterm.component.eks.ExtraKeysComponent
+import io.neoterm.component.font.FontComponent
+import io.neoterm.component.pm.NeoPackageComponent
+import io.neoterm.component.script.UserScriptComponent
+import io.neoterm.frontend.logging.NLog
+import io.neoterm.frontend.component.ComponentManager
+
+/**
+ * @author kiva
+ */
+object NeoInitializer {
+ fun initialize(context: Context) {
+ NLog.init(context)
+ ComponentManager.registerComponent(ConfigureComponent::class.java)
+ ComponentManager.registerComponent(ColorSchemeComponent::class.java)
+ ComponentManager.registerComponent(FontComponent::class.java)
+ ComponentManager.registerComponent(UserScriptComponent::class.java)
+ ComponentManager.registerComponent(ExtraKeysComponent::class.java)
+ ComponentManager.registerComponent(CompletionComponent::class.java)
+ ComponentManager.registerComponent(NeoPackageComponent::class.java)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/component/color/ColorSchemeComponent.kt b/app/src/main/java/io/neoterm/component/color/ColorSchemeComponent.kt
new file mode 100644
index 0000000..332e6e4
--- /dev/null
+++ b/app/src/main/java/io/neoterm/component/color/ColorSchemeComponent.kt
@@ -0,0 +1,117 @@
+package io.neoterm.component.color
+
+import android.content.Context
+import io.neoterm.App
+import io.neoterm.R
+import io.neoterm.frontend.preference.NeoPreference
+import io.neoterm.frontend.preference.NeoTermPath
+import io.neoterm.frontend.component.NeoComponent
+import io.neoterm.utils.AssetsUtils
+import io.neoterm.view.TerminalView
+import io.neoterm.view.eks.ExtraKeysView
+import java.io.File
+
+/**
+ * @author kiva
+ */
+class ColorSchemeComponent : NeoComponent {
+ override fun onServiceObtained() {
+ checkForFiles()
+ }
+
+ override fun onServiceInit() {
+ checkForFiles()
+ }
+
+ override fun onServiceDestroy() {
+ }
+
+ private lateinit var DEFAULT_COLOR: NeoColorScheme
+ private lateinit var colors: MutableMap
+
+ private fun extractDefaultColor(context: Context): Boolean {
+ try {
+ AssetsUtils.extractAssetsDir(context, "colors", NeoTermPath.COLORS_PATH)
+ return true
+ } catch (e: Exception) {
+ return false
+ }
+ }
+
+ fun refreshColorList(): Boolean {
+ colors.clear()
+ val colorDir = File(NeoTermPath.COLORS_PATH)
+ for (file in colorDir.listFiles({ pathname ->
+ pathname.name.endsWith(".color") || pathname.name.endsWith(".nl")
+ })) {
+ val color = NeoColorScheme()
+
+ if (color.loadConfigure(file)) {
+ colors.put(color.colorName, color)
+ }
+ }
+ if (colors.containsKey(DefaultColorScheme.colorName)) {
+ DEFAULT_COLOR = colors[DefaultColorScheme.colorName]!!
+ return true
+ }
+ return false
+ }
+
+ fun applyColorScheme(view: TerminalView?, extraKeysView: ExtraKeysView?, colorScheme: NeoColorScheme?) {
+ if (view != null && colorScheme != null) {
+ colorScheme.applyColors(view, extraKeysView)
+ }
+ }
+
+ private fun checkForFiles() {
+ File(NeoTermPath.COLORS_PATH).mkdirs()
+ colors = mutableMapOf()
+
+ val defaultColorFile = colorFile(DefaultColorScheme.colorName)
+ if (!defaultColorFile.exists()) {
+ if (!extractDefaultColor(App.get())) {
+ DEFAULT_COLOR = DefaultColorScheme
+ colors[DEFAULT_COLOR.colorName] = DEFAULT_COLOR
+ return
+ }
+ }
+
+ if (!refreshColorList()) {
+ DEFAULT_COLOR = DefaultColorScheme
+ colors[DEFAULT_COLOR.colorName] = DEFAULT_COLOR
+ }
+ }
+
+ fun getCurrentColorScheme(): NeoColorScheme {
+ return colors[getCurrentColorName()]!!
+ }
+
+ fun getCurrentColorName(): String {
+ var currentColorName = NeoPreference.loadString(R.string.key_customization_color_scheme, DefaultColorScheme.colorName)
+ if (!colors.containsKey(currentColorName)) {
+ currentColorName = DefaultColorScheme.colorName
+ NeoPreference.store(R.string.key_customization_color_scheme, DefaultColorScheme.colorName)
+ }
+ return currentColorName
+ }
+
+ fun getColor(colorName: String): NeoColorScheme {
+ return if (colors.containsKey(colorName)) colors[colorName]!! else getCurrentColorScheme()
+ }
+
+ fun getColorNames(): List {
+ val list = ArrayList()
+ list += colors.keys
+ return list
+ }
+
+ fun setCurrentColor(colorName: String) {
+ NeoPreference.store(R.string.key_customization_color_scheme, colorName)
+ }
+
+ companion object {
+ fun colorFile(colorName: String): File {
+ return File("${NeoTermPath.COLORS_PATH}/$colorName.nl")
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/customize/color/DefaultColorScheme.kt b/app/src/main/java/io/neoterm/component/color/DefaultColorScheme.kt
similarity index 89%
rename from app/src/main/java/io/neoterm/customize/color/DefaultColorScheme.kt
rename to app/src/main/java/io/neoterm/component/color/DefaultColorScheme.kt
index bdca255..dc20e9b 100644
--- a/app/src/main/java/io/neoterm/customize/color/DefaultColorScheme.kt
+++ b/app/src/main/java/io/neoterm/component/color/DefaultColorScheme.kt
@@ -1,4 +1,4 @@
-package io.neoterm.customize.color
+package io.neoterm.component.color
/**
* @author kiva
diff --git a/app/src/main/java/io/neoterm/customize/color/NeoColorScheme.kt b/app/src/main/java/io/neoterm/component/color/NeoColorScheme.kt
similarity index 95%
rename from app/src/main/java/io/neoterm/customize/color/NeoColorScheme.kt
rename to app/src/main/java/io/neoterm/component/color/NeoColorScheme.kt
index 8139190..626efd0 100644
--- a/app/src/main/java/io/neoterm/customize/color/NeoColorScheme.kt
+++ b/app/src/main/java/io/neoterm/component/color/NeoColorScheme.kt
@@ -1,12 +1,12 @@
-package io.neoterm.customize.color
+package io.neoterm.component.color
import io.neoterm.backend.TerminalColorScheme
import io.neoterm.backend.TerminalColors
-import io.neoterm.customize.config.ConfigureService
+import io.neoterm.component.config.ConfigureComponent
import io.neolang.visitor.ConfigVisitor
import io.neoterm.frontend.config.NeoConfigureFile
import io.neoterm.frontend.logging.NLog
-import io.neoterm.frontend.service.ServiceManager
+import io.neoterm.frontend.component.ComponentManager
import io.neoterm.view.TerminalView
import io.neoterm.view.eks.ExtraKeysView
import java.io.File
@@ -78,7 +78,7 @@ open class NeoColorScheme {
fun loadConfigure(file: File): Boolean {
// TODO: Refactor with NeoExtraKey#loadConfigure
- val loaderService = ServiceManager.getService()
+ val loaderService = ComponentManager.getService()
val configure: NeoConfigureFile?
try {
diff --git a/app/src/main/java/io/neoterm/component/completion/CompletionComponent.kt b/app/src/main/java/io/neoterm/component/completion/CompletionComponent.kt
new file mode 100644
index 0000000..5762dfe
--- /dev/null
+++ b/app/src/main/java/io/neoterm/component/completion/CompletionComponent.kt
@@ -0,0 +1,22 @@
+package io.neoterm.component.completion
+
+import io.neoterm.component.completion.provider.FileCompletionProvider
+import io.neoterm.component.completion.provider.ProgramCompletionProvider
+import io.neoterm.frontend.completion.CompletionManager
+import io.neoterm.frontend.component.NeoComponent
+
+/**
+ * @author kiva
+ */
+class CompletionComponent : NeoComponent {
+ override fun onServiceInit() {
+ CompletionManager.registerProvider(FileCompletionProvider())
+ CompletionManager.registerProvider(ProgramCompletionProvider())
+ }
+
+ override fun onServiceDestroy() {
+ }
+
+ override fun onServiceObtained() {
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/customize/completion/provider/FileCompletionProvider.kt b/app/src/main/java/io/neoterm/component/completion/provider/FileCompletionProvider.kt
similarity index 97%
rename from app/src/main/java/io/neoterm/customize/completion/provider/FileCompletionProvider.kt
rename to app/src/main/java/io/neoterm/component/completion/provider/FileCompletionProvider.kt
index 158befa..ae406f2 100644
--- a/app/src/main/java/io/neoterm/customize/completion/provider/FileCompletionProvider.kt
+++ b/app/src/main/java/io/neoterm/component/completion/provider/FileCompletionProvider.kt
@@ -1,4 +1,4 @@
-package io.neoterm.customize.completion.provider
+package io.neoterm.component.completion.provider
import io.neoterm.frontend.completion.model.CompletionCandidate
import io.neoterm.frontend.completion.provider.ICandidateProvider
diff --git a/app/src/main/java/io/neoterm/customize/completion/provider/ProgramCompletionProvider.kt b/app/src/main/java/io/neoterm/component/completion/provider/ProgramCompletionProvider.kt
similarity index 87%
rename from app/src/main/java/io/neoterm/customize/completion/provider/ProgramCompletionProvider.kt
rename to app/src/main/java/io/neoterm/component/completion/provider/ProgramCompletionProvider.kt
index 7809cfc..bc3e6af 100644
--- a/app/src/main/java/io/neoterm/customize/completion/provider/ProgramCompletionProvider.kt
+++ b/app/src/main/java/io/neoterm/component/completion/provider/ProgramCompletionProvider.kt
@@ -1,4 +1,4 @@
-package io.neoterm.customize.completion.provider
+package io.neoterm.component.completion.provider
import java.io.File
diff --git a/app/src/main/java/io/neoterm/component/config/ConfigureComponent.kt b/app/src/main/java/io/neoterm/component/config/ConfigureComponent.kt
new file mode 100644
index 0000000..059e2ca
--- /dev/null
+++ b/app/src/main/java/io/neoterm/component/config/ConfigureComponent.kt
@@ -0,0 +1,27 @@
+package io.neoterm.component.config
+
+import io.neoterm.component.config.loader.NeoLangConfigureLoader
+import io.neoterm.component.config.loader.OldConfigureLoader
+import io.neoterm.frontend.component.NeoComponent
+import java.io.File
+
+/**
+ * @author kiva
+ */
+class ConfigureComponent : NeoComponent {
+ override fun onServiceInit() {
+ }
+
+ override fun onServiceDestroy() {
+ }
+
+ override fun onServiceObtained() {
+ }
+
+ fun newLoader(configFile: File): IConfigureFileLoader {
+ return when (configFile.extension) {
+ "nl" -> NeoLangConfigureLoader(configFile)
+ else -> OldConfigureLoader(configFile)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/customize/config/IConfigureFileLoader.kt b/app/src/main/java/io/neoterm/component/config/IConfigureFileLoader.kt
similarity index 73%
rename from app/src/main/java/io/neoterm/customize/config/IConfigureFileLoader.kt
rename to app/src/main/java/io/neoterm/component/config/IConfigureFileLoader.kt
index 2569129..d62c0c5 100644
--- a/app/src/main/java/io/neoterm/customize/config/IConfigureFileLoader.kt
+++ b/app/src/main/java/io/neoterm/component/config/IConfigureFileLoader.kt
@@ -1,7 +1,6 @@
-package io.neoterm.customize.config
+package io.neoterm.component.config
import io.neoterm.frontend.config.NeoConfigureFile
-import java.io.File
/**
* @author kiva
diff --git a/app/src/main/java/io/neoterm/customize/config/loader/NeoLangConfigureLoader.kt b/app/src/main/java/io/neoterm/component/config/loader/NeoLangConfigureLoader.kt
similarity index 78%
rename from app/src/main/java/io/neoterm/customize/config/loader/NeoLangConfigureLoader.kt
rename to app/src/main/java/io/neoterm/component/config/loader/NeoLangConfigureLoader.kt
index 1303a98..f1e967c 100644
--- a/app/src/main/java/io/neoterm/customize/config/loader/NeoLangConfigureLoader.kt
+++ b/app/src/main/java/io/neoterm/component/config/loader/NeoLangConfigureLoader.kt
@@ -1,6 +1,6 @@
-package io.neoterm.customize.config.loader
+package io.neoterm.component.config.loader
-import io.neoterm.customize.config.IConfigureFileLoader
+import io.neoterm.component.config.IConfigureFileLoader
import io.neoterm.frontend.config.NeoConfigureFile
import java.io.File
diff --git a/app/src/main/java/io/neoterm/customize/config/loader/OldColorSchemeConfigureFile.kt b/app/src/main/java/io/neoterm/component/config/loader/OldColorSchemeConfigureFile.kt
similarity index 94%
rename from app/src/main/java/io/neoterm/customize/config/loader/OldColorSchemeConfigureFile.kt
rename to app/src/main/java/io/neoterm/component/config/loader/OldColorSchemeConfigureFile.kt
index d82c680..0a60149 100644
--- a/app/src/main/java/io/neoterm/customize/config/loader/OldColorSchemeConfigureFile.kt
+++ b/app/src/main/java/io/neoterm/component/config/loader/OldColorSchemeConfigureFile.kt
@@ -1,7 +1,7 @@
-package io.neoterm.customize.config.loader
+package io.neoterm.component.config.loader
import io.neolang.runtime.type.NeoLangValue
-import io.neoterm.customize.color.NeoColorScheme
+import io.neoterm.component.color.NeoColorScheme
import io.neolang.visitor.ConfigVisitor
import io.neoterm.frontend.config.NeoConfigureFile
import io.neoterm.frontend.logging.NLog
diff --git a/app/src/main/java/io/neoterm/customize/config/loader/OldConfigureLoader.kt b/app/src/main/java/io/neoterm/component/config/loader/OldConfigureLoader.kt
similarity index 86%
rename from app/src/main/java/io/neoterm/customize/config/loader/OldConfigureLoader.kt
rename to app/src/main/java/io/neoterm/component/config/loader/OldConfigureLoader.kt
index 4d167ea..99e3f76 100644
--- a/app/src/main/java/io/neoterm/customize/config/loader/OldConfigureLoader.kt
+++ b/app/src/main/java/io/neoterm/component/config/loader/OldConfigureLoader.kt
@@ -1,6 +1,6 @@
-package io.neoterm.customize.config.loader
+package io.neoterm.component.config.loader
-import io.neoterm.customize.config.IConfigureFileLoader
+import io.neoterm.component.config.IConfigureFileLoader
import io.neoterm.frontend.config.NeoConfigureFile
import java.io.File
diff --git a/app/src/main/java/io/neoterm/customize/config/loader/OldExtraKeysConfigureFile.kt b/app/src/main/java/io/neoterm/component/config/loader/OldExtraKeysConfigureFile.kt
similarity index 98%
rename from app/src/main/java/io/neoterm/customize/config/loader/OldExtraKeysConfigureFile.kt
rename to app/src/main/java/io/neoterm/component/config/loader/OldExtraKeysConfigureFile.kt
index 60b1619..2211ac9 100644
--- a/app/src/main/java/io/neoterm/customize/config/loader/OldExtraKeysConfigureFile.kt
+++ b/app/src/main/java/io/neoterm/component/config/loader/OldExtraKeysConfigureFile.kt
@@ -1,8 +1,8 @@
-package io.neoterm.customize.config.loader
+package io.neoterm.component.config.loader
import io.neolang.runtime.type.NeoLangValue
import io.neolang.visitor.ConfigVisitor
-import io.neoterm.customize.eks.NeoExtraKey
+import io.neoterm.component.eks.NeoExtraKey
import io.neoterm.frontend.config.NeoConfigureFile
import io.neoterm.view.eks.button.TextButton
import java.io.BufferedReader
diff --git a/app/src/main/java/io/neoterm/component/eks/ExtraKeysComponent.kt b/app/src/main/java/io/neoterm/component/eks/ExtraKeysComponent.kt
new file mode 100644
index 0000000..fe35972
--- /dev/null
+++ b/app/src/main/java/io/neoterm/component/eks/ExtraKeysComponent.kt
@@ -0,0 +1,85 @@
+package io.neoterm.component.eks
+
+import android.content.Context
+import io.neoterm.App
+import io.neoterm.frontend.logging.NLog
+import io.neoterm.frontend.preference.NeoTermPath
+import io.neoterm.frontend.component.NeoComponent
+import io.neoterm.utils.AssetsUtils
+import io.neoterm.view.eks.ExtraKeysView
+import java.io.File
+import java.io.FileFilter
+
+/**
+ * @author kiva
+ */
+class ExtraKeysComponent : NeoComponent {
+ companion object {
+ private val FILTER = FileFilter {
+ it.extension == "nl"
+ }
+ }
+ override fun onServiceInit() {
+ checkForFiles()
+ }
+
+ override fun onServiceDestroy() {
+ }
+
+ override fun onServiceObtained() {
+ checkForFiles()
+ }
+
+ val extraKeys: MutableMap = mutableMapOf()
+
+ fun showShortcutKeys(program: String, extraKeysView: ExtraKeysView?) {
+ if (extraKeysView == null) {
+ return
+ }
+
+ val extraKey = extraKeys[program]
+ if (extraKey != null) {
+ extraKey.applyExtraKeys(extraKeysView)
+ return
+ }
+
+ extraKeysView.loadDefaultUserKeys()
+ }
+
+ fun registerShortcutKeys(extraKey: NeoExtraKey) {
+ extraKey.programNames.forEach {
+ extraKeys[it] = extraKey
+ }
+ }
+
+ 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)
+ } catch (e: Exception) {
+ NLog.e("ExtraKey", "Failed to extract configure: ${e.localizedMessage}")
+ }
+ }
+
+ private fun loadConfigure() {
+ val configDir = File(NeoTermPath.EKS_PATH)
+
+ configDir.listFiles(FILTER).forEach {
+ if (it.absolutePath != NeoTermPath.EKS_DEFAULT_FILE) {
+ val extraKey = NeoExtraKey()
+ if (extraKey.loadConfigure(it)) {
+ registerShortcutKeys(extraKey)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/customize/eks/NeoExtraKey.kt b/app/src/main/java/io/neoterm/component/eks/NeoExtraKey.kt
similarity index 94%
rename from app/src/main/java/io/neoterm/customize/eks/NeoExtraKey.kt
rename to app/src/main/java/io/neoterm/component/eks/NeoExtraKey.kt
index d74e254..66b14c1 100644
--- a/app/src/main/java/io/neoterm/customize/eks/NeoExtraKey.kt
+++ b/app/src/main/java/io/neoterm/component/eks/NeoExtraKey.kt
@@ -1,10 +1,10 @@
-package io.neoterm.customize.eks
+package io.neoterm.component.eks
import io.neolang.visitor.ConfigVisitor
-import io.neoterm.customize.config.ConfigureService
+import io.neoterm.component.config.ConfigureComponent
import io.neoterm.frontend.config.NeoConfigureFile
import io.neoterm.frontend.logging.NLog
-import io.neoterm.frontend.service.ServiceManager
+import io.neoterm.frontend.component.ComponentManager
import io.neoterm.view.eks.ExtraKeysView
import io.neoterm.view.eks.button.IExtraButton
import io.neoterm.view.eks.button.TextButton
@@ -44,7 +44,7 @@ class NeoExtraKey {
fun loadConfigure(file: File): Boolean {
// TODO: Refactor with NeoColorScheme#loadConfigure
- val loaderService = ServiceManager.getService()
+ val loaderService = ComponentManager.getService()
val configure: NeoConfigureFile?
try {
diff --git a/app/src/main/java/io/neoterm/component/font/FontComponent.kt b/app/src/main/java/io/neoterm/component/font/FontComponent.kt
new file mode 100644
index 0000000..09501d8
--- /dev/null
+++ b/app/src/main/java/io/neoterm/component/font/FontComponent.kt
@@ -0,0 +1,122 @@
+package io.neoterm.component.font
+
+import android.content.Context
+import android.graphics.Typeface
+import io.neoterm.App
+import io.neoterm.R
+import io.neoterm.frontend.preference.NeoPreference
+import io.neoterm.frontend.preference.NeoTermPath
+import io.neoterm.frontend.component.NeoComponent
+import io.neoterm.utils.AssetsUtils
+import java.io.File
+
+/**
+ * @author kiva
+ */
+class FontComponent : NeoComponent {
+ override fun onServiceInit() {
+ checkForFiles()
+ }
+
+ override fun onServiceDestroy() {
+ }
+
+ override fun onServiceObtained() {
+ checkForFiles()
+ }
+
+ private val DEFAULT_FONT_NAME = "SourceCodePro"
+
+ private lateinit var DEFAULT_FONT: NeoFont
+ private lateinit var fonts: MutableMap
+
+ fun getDefaultFont(): NeoFont {
+ return DEFAULT_FONT
+ }
+
+ fun getCurrentFont(): NeoFont {
+ return fonts[getCurrentFontName()]!!
+ }
+
+ fun setCurrentFont(fontName: String) {
+ NeoPreference.store(R.string.key_customization_font, fontName)
+ }
+
+ fun getCurrentFontName(): String {
+ var currentFontName = NeoPreference.loadString(R.string.key_customization_font, DEFAULT_FONT_NAME)
+ if (!fonts.containsKey(currentFontName)) {
+ currentFontName = DEFAULT_FONT_NAME
+ NeoPreference.store(R.string.key_customization_font, DEFAULT_FONT_NAME)
+ }
+ return currentFontName
+ }
+
+ fun getFont(fontName: String): NeoFont {
+ return if (fonts.containsKey(fontName)) fonts[fontName]!! else getCurrentFont()
+ }
+
+ fun getFontNames(): List {
+ val list = ArrayList()
+ list += fonts.keys
+ return list
+ }
+
+ fun refreshFontList(): Boolean {
+ fonts.clear()
+ fonts.put("Android Monospace", NeoFont(Typeface.MONOSPACE))
+ fonts.put("Android Sans Serif", NeoFont(Typeface.SANS_SERIF))
+ fonts.put("Android Serif", NeoFont(Typeface.SERIF))
+ val fontDir = File(NeoTermPath.FONT_PATH)
+ for (file in fontDir.listFiles({ pathname -> pathname.name.endsWith(".ttf") })) {
+ val fontName = fontName(file)
+ val font = NeoFont(file)
+ fonts.put(fontName, font)
+ }
+ if (fonts.containsKey(DEFAULT_FONT_NAME)) {
+ DEFAULT_FONT = fonts[DEFAULT_FONT_NAME]!!
+ return true
+ }
+ return false
+ }
+
+ private fun loadDefaultFontFromAsset(context: Context): NeoFont {
+ return NeoFont(Typeface.createFromAsset(context.assets, "fonts/$DEFAULT_FONT_NAME.ttf"))
+ }
+
+ private fun extractDefaultFont(context: Context): Boolean {
+ try {
+ AssetsUtils.extractAssetsDir(context, "fonts", NeoTermPath.FONT_PATH)
+ return true
+ } catch (e: Exception) {
+ return false
+ }
+ }
+
+ private fun fontFile(fontName: String): File {
+ return File("${NeoTermPath.FONT_PATH}/$fontName.ttf")
+ }
+
+ private fun fontName(fontFile: File): String {
+ return fontFile.nameWithoutExtension
+ }
+
+ private fun checkForFiles() {
+ File(NeoTermPath.FONT_PATH).mkdirs()
+ fonts = mutableMapOf()
+
+ val context = App.get()
+ val defaultFontFile = fontFile(DEFAULT_FONT_NAME)
+ if (!defaultFontFile.exists()) {
+ if (!extractDefaultFont(context)) {
+ DEFAULT_FONT = loadDefaultFontFromAsset(context)
+ fonts.put(DEFAULT_FONT_NAME, DEFAULT_FONT)
+ return
+ }
+ }
+
+ if (!refreshFontList()) {
+ DEFAULT_FONT = loadDefaultFontFromAsset(context)
+ fonts.put(DEFAULT_FONT_NAME, DEFAULT_FONT)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/customize/font/NeoFont.kt b/app/src/main/java/io/neoterm/component/font/NeoFont.kt
similarity index 94%
rename from app/src/main/java/io/neoterm/customize/font/NeoFont.kt
rename to app/src/main/java/io/neoterm/component/font/NeoFont.kt
index 0665fa8..f354321 100644
--- a/app/src/main/java/io/neoterm/customize/font/NeoFont.kt
+++ b/app/src/main/java/io/neoterm/component/font/NeoFont.kt
@@ -1,4 +1,4 @@
-package io.neoterm.customize.font
+package io.neoterm.component.font
import android.graphics.Typeface
import java.io.File
diff --git a/app/src/main/java/io/neoterm/customize/pm/NeoPackageArchitecture.kt b/app/src/main/java/io/neoterm/component/pm/NeoPackageArchitecture.kt
similarity index 93%
rename from app/src/main/java/io/neoterm/customize/pm/NeoPackageArchitecture.kt
rename to app/src/main/java/io/neoterm/component/pm/NeoPackageArchitecture.kt
index e3df447..3a32d5d 100644
--- a/app/src/main/java/io/neoterm/customize/pm/NeoPackageArchitecture.kt
+++ b/app/src/main/java/io/neoterm/component/pm/NeoPackageArchitecture.kt
@@ -1,4 +1,4 @@
-package io.neoterm.customize.pm
+package io.neoterm.component.pm
/**
* @author kiva
diff --git a/app/src/main/java/io/neoterm/component/pm/NeoPackageComponent.java b/app/src/main/java/io/neoterm/component/pm/NeoPackageComponent.java
new file mode 100644
index 0000000..a9dec7f
--- /dev/null
+++ b/app/src/main/java/io/neoterm/component/pm/NeoPackageComponent.java
@@ -0,0 +1,116 @@
+package io.neoterm.component.pm;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.HashMap;
+
+import io.neoterm.frontend.component.NeoComponent;
+
+/**
+ * @author kiva
+ */
+
+public class NeoPackageComponent implements NeoComponent {
+ private final Object lock = new Object();
+ private boolean isRefreshing = false;
+ private boolean queryEnabled = true;
+ private HashMap neoPackages;
+
+ private NeoPackageInfo getPackageInfo(String packageName) {
+ return queryEnabled ? neoPackages.get(packageName) : null;
+ }
+
+ public HashMap getPackages() {
+ return queryEnabled ? neoPackages : new HashMap();
+ }
+
+ public int getPackageCount() {
+ return queryEnabled ? neoPackages.size() : -1;
+ }
+
+ public void refreshPackageList(File packageListFile, boolean clearPrevious) throws IOException {
+ synchronized (lock) {
+ if (isRefreshing) {
+ return;
+ }
+ isRefreshing = true;
+ }
+ tryParsePackages(packageListFile, clearPrevious);
+ synchronized (lock) {
+ isRefreshing = false;
+ }
+ }
+
+ public void clearPackages() {
+ if (isRefreshing) {
+ return;
+ }
+ neoPackages.clear();
+ }
+
+ private void tryParsePackages(File packageListFile, final boolean clearPrevious) throws IOException {
+ NeoPackageParser packageParser = new NeoPackageParser(new FileInputStream(packageListFile));
+ packageParser.setStateListener(new NeoPackageParser.ParseStateListener() {
+ @Override
+ public void onStartState() {
+ queryEnabled = false;
+ if (clearPrevious) {
+ neoPackages.clear();
+ }
+ }
+
+ @Override
+ public void onEndState() {
+ queryEnabled = true;
+ for (NeoPackageInfo info : neoPackages.values()) {
+ resolveDepends(info);
+ }
+ }
+
+ @Override
+ public NeoPackageInfo onCreatePackageInfo() {
+ return new NeoPackageInfo();
+ }
+
+ @Override
+ public void onStartParsePackage(String name, NeoPackageInfo packageInfo) {
+ }
+
+ @Override
+ public void onEndParsePackage(NeoPackageInfo packageInfo) {
+ neoPackages.put(packageInfo.getPackageName(), packageInfo);
+ }
+ });
+ packageParser.parse();
+ }
+
+ private void resolveDepends(NeoPackageInfo info) {
+ String dep = info.getDependenciesString();
+ if (dep == null) {
+ return;
+ }
+
+ String[] splits = dep.split(",");
+ NeoPackageInfo[] depends = new NeoPackageInfo[splits.length];
+ info.setDependencies(depends);
+
+ for (int i = 0; i < splits.length; ++i) {
+ String item = splits[i].trim();
+ depends[i] = getPackageInfo(item);
+ }
+ }
+
+ @Override
+ public void onServiceInit() {
+ neoPackages = new HashMap<>();
+ }
+
+ @Override
+ public void onServiceDestroy() {
+ }
+
+ @Override
+ public void onServiceObtained() {
+ }
+}
diff --git a/app/src/main/java/io/neoterm/customize/pm/NeoPackageInfo.kt b/app/src/main/java/io/neoterm/component/pm/NeoPackageInfo.kt
similarity index 95%
rename from app/src/main/java/io/neoterm/customize/pm/NeoPackageInfo.kt
rename to app/src/main/java/io/neoterm/component/pm/NeoPackageInfo.kt
index a708dd1..cc1fb70 100644
--- a/app/src/main/java/io/neoterm/customize/pm/NeoPackageInfo.kt
+++ b/app/src/main/java/io/neoterm/component/pm/NeoPackageInfo.kt
@@ -1,4 +1,4 @@
-package io.neoterm.customize.pm
+package io.neoterm.component.pm
/**
* @author kiva
diff --git a/app/src/main/java/io/neoterm/customize/pm/NeoPackageManagerUtils.kt b/app/src/main/java/io/neoterm/component/pm/NeoPackageManagerUtils.kt
similarity index 97%
rename from app/src/main/java/io/neoterm/customize/pm/NeoPackageManagerUtils.kt
rename to app/src/main/java/io/neoterm/component/pm/NeoPackageManagerUtils.kt
index 03a9be9..6c081ca 100644
--- a/app/src/main/java/io/neoterm/customize/pm/NeoPackageManagerUtils.kt
+++ b/app/src/main/java/io/neoterm/component/pm/NeoPackageManagerUtils.kt
@@ -1,4 +1,4 @@
-package io.neoterm.customize.pm
+package io.neoterm.component.pm
import io.neoterm.R
import io.neoterm.frontend.preference.NeoPreference
diff --git a/app/src/main/java/io/neoterm/customize/pm/NeoPackageParser.java b/app/src/main/java/io/neoterm/component/pm/NeoPackageParser.java
similarity index 99%
rename from app/src/main/java/io/neoterm/customize/pm/NeoPackageParser.java
rename to app/src/main/java/io/neoterm/component/pm/NeoPackageParser.java
index edcad7e..b2da37d 100644
--- a/app/src/main/java/io/neoterm/customize/pm/NeoPackageParser.java
+++ b/app/src/main/java/io/neoterm/component/pm/NeoPackageParser.java
@@ -1,4 +1,4 @@
-package io.neoterm.customize.pm;
+package io.neoterm.component.pm;
import java.io.BufferedReader;
import java.io.IOException;
diff --git a/app/src/main/java/io/neoterm/customize/script/UserScript.kt b/app/src/main/java/io/neoterm/component/script/UserScript.kt
similarity index 70%
rename from app/src/main/java/io/neoterm/customize/script/UserScript.kt
rename to app/src/main/java/io/neoterm/component/script/UserScript.kt
index 9dab835..9a71bf0 100644
--- a/app/src/main/java/io/neoterm/customize/script/UserScript.kt
+++ b/app/src/main/java/io/neoterm/component/script/UserScript.kt
@@ -1,4 +1,4 @@
-package io.neoterm.customize.script
+package io.neoterm.component.script
import java.io.File
diff --git a/app/src/main/java/io/neoterm/component/script/UserScriptComponent.kt b/app/src/main/java/io/neoterm/component/script/UserScriptComponent.kt
new file mode 100644
index 0000000..1a0b894
--- /dev/null
+++ b/app/src/main/java/io/neoterm/component/script/UserScriptComponent.kt
@@ -0,0 +1,35 @@
+package io.neoterm.component.script
+
+import io.neoterm.frontend.component.NeoComponent
+import io.neoterm.frontend.preference.NeoTermPath
+import java.io.File
+
+/**
+ * @author kiva
+ */
+class UserScriptComponent : NeoComponent {
+ override fun onServiceInit() {
+ userScripts = mutableListOf()
+ reloadScripts()
+ }
+
+ override fun onServiceDestroy() {
+ }
+
+ override fun onServiceObtained() {
+ reloadScripts()
+ }
+
+ lateinit var userScripts: MutableList
+ private set
+
+ fun reloadScripts() {
+ val userScriptDir = File(NeoTermPath.USER_SCRIPT_PATH)
+ userScriptDir.mkdirs()
+
+ userScripts.clear()
+ userScriptDir.listFiles()
+ .takeWhile { it.canExecute() }
+ .mapTo(userScripts, { UserScript(it) })
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/customize/setup/BaseFileInstaller.java b/app/src/main/java/io/neoterm/component/setup/BaseFileInstaller.java
similarity index 99%
rename from app/src/main/java/io/neoterm/customize/setup/BaseFileInstaller.java
rename to app/src/main/java/io/neoterm/component/setup/BaseFileInstaller.java
index 0eddd4c..1500ab9 100644
--- a/app/src/main/java/io/neoterm/customize/setup/BaseFileInstaller.java
+++ b/app/src/main/java/io/neoterm/component/setup/BaseFileInstaller.java
@@ -1,4 +1,4 @@
-package io.neoterm.customize.setup;
+package io.neoterm.component.setup;
import android.app.Activity;
import android.app.ProgressDialog;
diff --git a/app/src/main/java/io/neoterm/customize/NeoInitializer.kt b/app/src/main/java/io/neoterm/customize/NeoInitializer.kt
deleted file mode 100644
index 9b9abd5..0000000
--- a/app/src/main/java/io/neoterm/customize/NeoInitializer.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package io.neoterm.customize
-
-import android.content.Context
-import io.neoterm.customize.color.ColorSchemeService
-import io.neoterm.customize.completion.CompletionService
-import io.neoterm.customize.config.ConfigureService
-import io.neoterm.customize.eks.ExtraKeysService
-import io.neoterm.customize.font.FontService
-import io.neoterm.customize.pm.NeoPackageService
-import io.neoterm.customize.script.UserScriptService
-import io.neoterm.frontend.logging.NLog
-import io.neoterm.frontend.service.ServiceManager
-
-/**
- * @author kiva
- */
-object NeoInitializer {
- fun initialize(context: Context) {
- NLog.init(context)
- ServiceManager.registerService(ConfigureService::class.java)
- ServiceManager.registerService(ColorSchemeService::class.java)
- ServiceManager.registerService(FontService::class.java)
- ServiceManager.registerService(UserScriptService::class.java)
- ServiceManager.registerService(ExtraKeysService::class.java)
- ServiceManager.registerService(CompletionService::class.java)
- ServiceManager.registerService(NeoPackageService::class.java)
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/frontend/client/TermViewClient.kt b/app/src/main/java/io/neoterm/frontend/client/TermViewClient.kt
index 471bdbb..070e66d 100644
--- a/app/src/main/java/io/neoterm/frontend/client/TermViewClient.kt
+++ b/app/src/main/java/io/neoterm/frontend/client/TermViewClient.kt
@@ -9,9 +9,9 @@ import android.view.inputmethod.InputMethodManager
import io.neoterm.R
import io.neoterm.backend.KeyHandler
import io.neoterm.backend.TerminalSession
-import io.neoterm.customize.eks.ExtraKeysService
+import io.neoterm.component.eks.ExtraKeysComponent
import io.neoterm.frontend.preference.NeoPreference
-import io.neoterm.frontend.service.ServiceManager
+import io.neoterm.frontend.component.ComponentManager
import io.neoterm.view.TerminalViewClient
@@ -203,7 +203,7 @@ class TermViewClient(val context: Context) : TerminalViewClient {
if (lastTitle != title || force) {
removeSuggestions()
- ServiceManager.getService().showShortcutKeys(title, extraKeysView)
+ ComponentManager.getService().showShortcutKeys(title, extraKeysView)
extraKeysView.updateButtons()
lastTitle = title
}
diff --git a/app/src/main/java/io/neoterm/frontend/completion/widget/CandidatePopupWindow.kt b/app/src/main/java/io/neoterm/frontend/completion/widget/CandidatePopupWindow.kt
index 885733e..519ad76 100644
--- a/app/src/main/java/io/neoterm/frontend/completion/widget/CandidatePopupWindow.kt
+++ b/app/src/main/java/io/neoterm/frontend/completion/widget/CandidatePopupWindow.kt
@@ -11,10 +11,10 @@ import android.widget.PopupWindow
import android.widget.TextView
import io.neoterm.R
import io.neoterm.backend.TerminalColors
-import io.neoterm.customize.color.ColorSchemeService
+import io.neoterm.component.color.ColorSchemeComponent
import io.neoterm.frontend.completion.listener.OnCandidateSelectedListener
import io.neoterm.frontend.completion.model.CompletionCandidate
-import io.neoterm.frontend.service.ServiceManager
+import io.neoterm.frontend.component.ComponentManager
import io.neoterm.view.MaxHeightView
import io.neoterm.view.TerminalView
@@ -136,7 +136,7 @@ class CandidatePopupWindow(val context: Context) {
val splitView: View = rootView.findViewById(R.id.complete_split)
init {
- val colorScheme = ServiceManager.getService().getCurrentColorScheme()
+ val colorScheme = ComponentManager.getService().getCurrentColorScheme()
val textColor = TerminalColors.parse(colorScheme.foregroundColor)
display.setTextColor(textColor)
description.setTextColor(textColor)
diff --git a/app/src/main/java/io/neoterm/frontend/component/ComponentDuplicateException.kt b/app/src/main/java/io/neoterm/frontend/component/ComponentDuplicateException.kt
new file mode 100644
index 0000000..a47c5ab
--- /dev/null
+++ b/app/src/main/java/io/neoterm/frontend/component/ComponentDuplicateException.kt
@@ -0,0 +1,6 @@
+package io.neoterm.frontend.component
+
+/**
+ * @author kiva
+ */
+class ComponentDuplicateException(serviceName: String) : RuntimeException("Service $serviceName duplicate")
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/frontend/component/ComponentManager.kt b/app/src/main/java/io/neoterm/frontend/component/ComponentManager.kt
new file mode 100644
index 0000000..ad5bfa4
--- /dev/null
+++ b/app/src/main/java/io/neoterm/frontend/component/ComponentManager.kt
@@ -0,0 +1,43 @@
+package io.neoterm.frontend.component
+
+import java.util.concurrent.ConcurrentHashMap
+
+/**
+ * @author kiva
+ */
+object ComponentManager {
+ val THROW_WHEN_SERVICE_NOT_FOUND = true
+ val SERVICE_CACHE = ConcurrentHashMap, NeoComponent>()
+
+ fun registerComponent(serviceClass: Class) {
+ if (SERVICE_CACHE.containsKey(serviceClass)) {
+ throw ComponentDuplicateException(serviceClass.simpleName)
+ }
+ val service = createServiceInstance(serviceClass)
+ SERVICE_CACHE.put(serviceClass, service)
+ service.onServiceInit()
+ }
+
+ fun unregisterComponent(serviceInterface: Class) {
+ val service = SERVICE_CACHE[serviceInterface]
+ if (service != null) {
+ service.onServiceDestroy()
+ SERVICE_CACHE.remove(serviceInterface)
+ }
+ }
+
+ inline fun getService(): T {
+ val serviceInterface = T::class.java
+ val service: NeoComponent? = SERVICE_CACHE[serviceInterface]
+
+ if (service == null && THROW_WHEN_SERVICE_NOT_FOUND) {
+ throw ComponentNotFoundException(serviceInterface.simpleName)
+ }
+ service?.onServiceObtained()
+ return service as T
+ }
+
+ private fun createServiceInstance(serviceInterface: Class): NeoComponent {
+ return serviceInterface.newInstance()
+ }
+}
diff --git a/app/src/main/java/io/neoterm/frontend/component/ComponentNotFoundException.kt b/app/src/main/java/io/neoterm/frontend/component/ComponentNotFoundException.kt
new file mode 100644
index 0000000..b54e3c6
--- /dev/null
+++ b/app/src/main/java/io/neoterm/frontend/component/ComponentNotFoundException.kt
@@ -0,0 +1,7 @@
+package io.neoterm.frontend.component
+
+/**
+ * @author kiva
+ */
+class ComponentNotFoundException(serviceName: String) : RuntimeException("Service `$serviceName' not found") {
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/frontend/component/NeoComponent.kt b/app/src/main/java/io/neoterm/frontend/component/NeoComponent.kt
new file mode 100644
index 0000000..6a0347a
--- /dev/null
+++ b/app/src/main/java/io/neoterm/frontend/component/NeoComponent.kt
@@ -0,0 +1,10 @@
+package io.neoterm.frontend.component
+
+/**
+ * @author kiva
+ */
+interface NeoComponent {
+ fun onServiceInit()
+ fun onServiceDestroy()
+ fun onServiceObtained()
+}
diff --git a/app/src/main/java/io/neoterm/frontend/service/ServiceDuplicateException.kt b/app/src/main/java/io/neoterm/frontend/service/ServiceDuplicateException.kt
deleted file mode 100644
index e449ef2..0000000
--- a/app/src/main/java/io/neoterm/frontend/service/ServiceDuplicateException.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package io.neoterm.frontend.service
-
-/**
- * @author kiva
- */
-class ServiceDuplicateException(serviceName: String) : RuntimeException("Service $serviceName duplicate")
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/frontend/service/ServiceNotFoundException.kt b/app/src/main/java/io/neoterm/frontend/service/ServiceNotFoundException.kt
deleted file mode 100644
index c9c3231..0000000
--- a/app/src/main/java/io/neoterm/frontend/service/ServiceNotFoundException.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.neoterm.frontend.service
-
-/**
- * @author kiva
- */
-class ServiceNotFoundException(serviceName: String) : RuntimeException("Service `$serviceName' not found") {
-}
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/services/NeoTermService.kt b/app/src/main/java/io/neoterm/services/NeoTermService.kt
index c9bc8e3..346186e 100644
--- a/app/src/main/java/io/neoterm/services/NeoTermService.kt
+++ b/app/src/main/java/io/neoterm/services/NeoTermService.kt
@@ -94,9 +94,8 @@ class NeoTermService : Service() {
}
private fun updateNotification() {
- if (sessions.isNotEmpty()) {
- (getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).notify(NOTIFICATION_ID, createNotification())
- }
+ val service = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
+ service.notify(NOTIFICATION_ID, createNotification())
}
private fun createNotification(): Notification {
diff --git a/app/src/main/java/io/neoterm/ui/customize/BaseCustomizeActivity.kt b/app/src/main/java/io/neoterm/ui/customize/BaseCustomizeActivity.kt
new file mode 100644
index 0000000..d5ad9dd
--- /dev/null
+++ b/app/src/main/java/io/neoterm/ui/customize/BaseCustomizeActivity.kt
@@ -0,0 +1,58 @@
+package io.neoterm.ui.customize
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.support.v7.app.AppCompatActivity
+import android.support.v7.widget.Toolbar
+import android.view.MenuItem
+import io.neoterm.R
+import io.neoterm.backend.TerminalSession
+import io.neoterm.frontend.preference.NeoTermPath
+import io.neoterm.frontend.shell.ShellParameter
+import io.neoterm.frontend.tinyclient.BasicSessionCallback
+import io.neoterm.frontend.tinyclient.BasicViewClient
+import io.neoterm.utils.TerminalUtils
+import io.neoterm.view.TerminalView
+import io.neoterm.view.eks.ExtraKeysView
+
+/**
+ * @author kiva
+ */
+@SuppressLint("Registered")
+open class BaseCustomizeActivity : AppCompatActivity() {
+ lateinit var terminalView: TerminalView
+ lateinit var viewClient: BasicViewClient
+ lateinit var sessionCallback: BasicSessionCallback
+ lateinit var session: TerminalSession
+ lateinit var extraKeysView: ExtraKeysView
+
+ fun initCustomizationComponent(layoutId: Int) {
+ setContentView(layoutId)
+
+ val toolbar = findViewById(R.id.custom_toolbar)
+ setSupportActionBar(toolbar)
+ supportActionBar?.setDisplayHomeAsUpEnabled(true)
+
+ terminalView = findViewById(R.id.terminal_view)
+ extraKeysView = findViewById(R.id.custom_extra_keys)
+ viewClient = BasicViewClient(terminalView)
+ sessionCallback = BasicSessionCallback(terminalView)
+ TerminalUtils.setupTerminalView(terminalView, viewClient)
+
+ val parameter = ShellParameter()
+ .executablePath("${NeoTermPath.USR_PATH}/bin/applets/echo")
+ .arguments(arrayOf("echo", "Hello NeoTerm."))
+ .callback(sessionCallback)
+ .systemShell(false)
+
+ session = TerminalUtils.createShellSession(this, parameter)
+ terminalView.attachSession(session)
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem?): Boolean {
+ when (item?.itemId) {
+ android.R.id.home -> finish()
+ }
+ return super.onOptionsItemSelected(item)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/ui/customize/ColorSchemeActivity.kt b/app/src/main/java/io/neoterm/ui/customize/ColorSchemeActivity.kt
index 72e37f5..bded69a 100644
--- a/app/src/main/java/io/neoterm/ui/customize/ColorSchemeActivity.kt
+++ b/app/src/main/java/io/neoterm/ui/customize/ColorSchemeActivity.kt
@@ -1,20 +1,16 @@
package io.neoterm.ui.customize
import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
-import android.support.v7.widget.Toolbar
import android.view.MenuItem
import io.neoterm.R
/**
* @author kiva
*/
-class ColorSchemeActivity : AppCompatActivity() {
+class ColorSchemeActivity : BaseCustomizeActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.ui_color_scheme)
- setSupportActionBar(findViewById(R.id.color_scheme_toolbar))
- supportActionBar?.setDisplayHomeAsUpEnabled(true)
+ initCustomizationComponent(R.layout.ui_color_scheme)
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
diff --git a/app/src/main/java/io/neoterm/ui/customize/CustomizeActivity.kt b/app/src/main/java/io/neoterm/ui/customize/CustomizeActivity.kt
index 6765a56..704101a 100644
--- a/app/src/main/java/io/neoterm/ui/customize/CustomizeActivity.kt
+++ b/app/src/main/java/io/neoterm/ui/customize/CustomizeActivity.kt
@@ -1,65 +1,35 @@
package io.neoterm.ui.customize
import android.app.Activity
+import android.app.AlertDialog
import android.content.Intent
import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
-import android.support.v7.widget.Toolbar
import android.view.MenuItem
import android.view.View
-import android.widget.*
+import android.widget.AdapterView
+import android.widget.ArrayAdapter
+import android.widget.Spinner
+import android.widget.Toast
import io.neoterm.R
-import io.neoterm.backend.TerminalSession
-import io.neoterm.customize.color.ColorSchemeService
+import io.neoterm.component.color.ColorSchemeComponent
+import io.neoterm.component.font.FontComponent
import io.neoterm.frontend.preference.NeoTermPath
-import io.neoterm.customize.font.FontService
-import io.neoterm.frontend.shell.ShellParameter
-import io.neoterm.frontend.service.ServiceManager
+import io.neoterm.frontend.component.ComponentManager
import io.neoterm.utils.FileUtils
import io.neoterm.utils.MediaUtils
-import io.neoterm.utils.TerminalUtils
-import io.neoterm.frontend.tinyclient.BasicSessionCallback
-import io.neoterm.frontend.tinyclient.BasicViewClient
-import io.neoterm.view.eks.ExtraKeysView
-import io.neoterm.view.TerminalView
import java.io.File
import java.io.FileInputStream
/**
* @author kiva
*/
-class CustomizeActivity : AppCompatActivity() {
- lateinit var terminalView: TerminalView
- lateinit var viewClient: BasicViewClient
- lateinit var sessionCallback: BasicSessionCallback
- lateinit var session: TerminalSession
- lateinit var extraKeysView: ExtraKeysView
-
+class CustomizeActivity : BaseCustomizeActivity() {
val REQUEST_SELECT_FONT = 22222
val REQUEST_SELECT_COLOR = 22223
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.ui_customize)
-
- val toolbar = findViewById(R.id.custom_toolbar)
- setSupportActionBar(toolbar)
- supportActionBar?.setDisplayHomeAsUpEnabled(true)
-
- terminalView = findViewById(R.id.terminal_view)
- extraKeysView = findViewById(R.id.custom_extra_keys)
- viewClient = BasicViewClient(terminalView)
- sessionCallback = BasicSessionCallback(terminalView)
- TerminalUtils.setupTerminalView(terminalView, viewClient)
-
- val parameter = ShellParameter()
- .executablePath("${NeoTermPath.USR_PATH}/bin/applets/echo")
- .arguments(arrayOf("echo", "Hello NeoTerm."))
- .callback(sessionCallback)
- .systemShell(false)
-
- session = TerminalUtils.createShellSession(this, parameter)
- terminalView.attachSession(session)
+ initCustomizationComponent(R.layout.ui_customize)
findViewById(R.id.custom_install_font_button).setOnClickListener {
val intent = Intent()
@@ -69,16 +39,25 @@ class CustomizeActivity : AppCompatActivity() {
}
findViewById(R.id.custom_install_color_button).setOnClickListener {
- val intent = Intent()
- intent.action = Intent.ACTION_GET_CONTENT
- intent.type = "*/*"
- startActivityForResult(Intent.createChooser(intent, getString(R.string.install_color)), REQUEST_SELECT_COLOR)
+ AlertDialog.Builder(this)
+ .setMessage(R.string.pref_customization_font)
+ .setNeutralButton(android.R.string.no, null)
+ .setPositiveButton(R.string.install_font, { _, _ ->
+ val intent = Intent()
+ intent.action = Intent.ACTION_GET_CONTENT
+ intent.type = "*/*"
+ startActivityForResult(Intent.createChooser(intent, getString(R.string.install_color)), REQUEST_SELECT_COLOR)
+ })
+ .setNegativeButton(R.string.new_color_scheme, { _, _ ->
+ startActivity(Intent(this, ColorSchemeActivity::class.java))
+ })
+ .show()
}
}
private fun setupSpinners() {
- val fontManager = ServiceManager.getService()
- val colorSchemeManager = ServiceManager.getService()
+ val fontManager = ComponentManager.getService()
+ val colorSchemeManager = ComponentManager.getService()
setupSpinner(R.id.custom_font_spinner, fontManager.getFontNames(),
fontManager.getCurrentFontName(), object : AdapterView.OnItemSelectedListener {
diff --git a/app/src/main/java/io/neoterm/ui/pm/PackageManagerActivity.kt b/app/src/main/java/io/neoterm/ui/pm/PackageManagerActivity.kt
index ad44793..8f75260 100644
--- a/app/src/main/java/io/neoterm/ui/pm/PackageManagerActivity.kt
+++ b/app/src/main/java/io/neoterm/ui/pm/PackageManagerActivity.kt
@@ -23,12 +23,12 @@ import com.github.wrdlbrnft.sortedlistadapter.SortedListAdapter
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import io.neoterm.R
import io.neoterm.backend.TerminalSession
-import io.neoterm.customize.pm.NeoPackageManagerUtils
-import io.neoterm.customize.pm.NeoPackageService
+import io.neoterm.component.pm.NeoPackageManagerUtils
+import io.neoterm.component.pm.NeoPackageComponent
import io.neoterm.frontend.floating.TerminalDialog
import io.neoterm.frontend.preference.NeoPreference
import io.neoterm.frontend.preference.NeoTermPath
-import io.neoterm.frontend.service.ServiceManager
+import io.neoterm.frontend.component.ComponentManager
import io.neoterm.ui.pm.adapter.PackageAdapter
import io.neoterm.ui.pm.model.PackageModel
import io.neoterm.utils.PackageUtils
@@ -213,7 +213,7 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
progressBar.visibility = View.VISIBLE
progressBar.alpha = 0.0f
Thread {
- val pm = ServiceManager.getService()
+ val pm = ComponentManager.getService()
val sourceFiles = NeoPackageManagerUtils.detectSourceFiles()
pm.clearPackages()
diff --git a/app/src/main/java/io/neoterm/ui/pm/model/PackageModel.kt b/app/src/main/java/io/neoterm/ui/pm/model/PackageModel.kt
index a1ec3ee..1fd1c3c 100644
--- a/app/src/main/java/io/neoterm/ui/pm/model/PackageModel.kt
+++ b/app/src/main/java/io/neoterm/ui/pm/model/PackageModel.kt
@@ -4,7 +4,7 @@ import android.content.Context
import com.github.wrdlbrnft.sortedlistadapter.SortedListAdapter
import io.neoterm.R
-import io.neoterm.customize.pm.NeoPackageInfo
+import io.neoterm.component.pm.NeoPackageInfo
import io.neoterm.utils.FileUtils
/**
diff --git a/app/src/main/java/io/neoterm/ui/setup/SetupActivity.kt b/app/src/main/java/io/neoterm/ui/setup/SetupActivity.kt
index 786ae37..714aa92 100644
--- a/app/src/main/java/io/neoterm/ui/setup/SetupActivity.kt
+++ b/app/src/main/java/io/neoterm/ui/setup/SetupActivity.kt
@@ -4,11 +4,9 @@ import android.app.Activity
import android.os.Bundle
import android.support.v7.app.AlertDialog
import android.support.v7.app.AppCompatActivity
-import android.widget.Button
-import android.widget.Toast
import io.neoterm.App
import io.neoterm.R
-import io.neoterm.customize.setup.BaseFileInstaller
+import io.neoterm.component.setup.BaseFileInstaller
import io.neoterm.utils.PackageUtils
diff --git a/app/src/main/java/io/neoterm/ui/term/NeoTermActivity.kt b/app/src/main/java/io/neoterm/ui/term/NeoTermActivity.kt
index 1cfe1c0..6d20ff8 100644
--- a/app/src/main/java/io/neoterm/ui/term/NeoTermActivity.kt
+++ b/app/src/main/java/io/neoterm/ui/term/NeoTermActivity.kt
@@ -24,7 +24,7 @@ import android.widget.Toast
import de.mrapp.android.tabswitcher.*
import io.neoterm.R
import io.neoterm.backend.TerminalSession
-import io.neoterm.customize.setup.BaseFileInstaller
+import io.neoterm.component.setup.BaseFileInstaller
import io.neoterm.frontend.client.TermSessionCallback
import io.neoterm.frontend.client.TermViewClient
import io.neoterm.frontend.preference.NeoPermission
diff --git a/app/src/main/java/io/neoterm/ui/term/NeoTermRemoteInterface.kt b/app/src/main/java/io/neoterm/ui/term/NeoTermRemoteInterface.kt
index dc89dd7..4ebca6b 100644
--- a/app/src/main/java/io/neoterm/ui/term/NeoTermRemoteInterface.kt
+++ b/app/src/main/java/io/neoterm/ui/term/NeoTermRemoteInterface.kt
@@ -1,6 +1,5 @@
package io.neoterm.ui.term
-import android.app.Activity
import android.content.ComponentName
import android.content.Intent
import android.content.ServiceConnection
@@ -10,24 +9,18 @@ import android.os.IBinder
import android.support.v7.app.AlertDialog
import android.support.v7.app.AppCompatActivity
import android.widget.ArrayAdapter
-import android.widget.EditText
import android.widget.ListView
-import android.widget.Toast
+import io.neoterm.App
import io.neoterm.R
-import io.neoterm.customize.script.UserScript
-import io.neoterm.customize.script.UserScriptService
-import io.neoterm.frontend.shell.ShellParameter
+import io.neoterm.component.script.UserScript
+import io.neoterm.component.script.UserScriptComponent
import io.neoterm.frontend.client.TermSessionCallback
import io.neoterm.frontend.preference.NeoPreference
+import io.neoterm.frontend.component.ComponentManager
+import io.neoterm.frontend.shell.ShellParameter
import io.neoterm.services.NeoTermService
import io.neoterm.utils.TerminalUtils
import java.io.File
-import android.content.Intent.ShortcutIconResource
-import android.util.Log
-import android.view.View
-import io.neoterm.App
-import io.neoterm.frontend.logging.NLog
-import io.neoterm.frontend.service.ServiceManager
/**
@@ -47,8 +40,13 @@ class NeoTermRemoteInterface : AppCompatActivity(), ServiceConnection {
override fun onDestroy() {
super.onDestroy()
- termService = null
- unbindService(this)
+ if (termService != null) {
+ if (termService!!.sessions.isEmpty()) {
+ termService!!.stopSelf()
+ }
+ termService = null
+ unbindService(this)
+ }
}
override fun onServiceDisconnected(name: ComponentName?) {
@@ -107,7 +105,7 @@ class NeoTermRemoteInterface : AppCompatActivity(), ServiceConnection {
private fun handleUserScript() {
val filesToHandle = mutableListOf()
- val userScriptService = ServiceManager.getService()
+ val userScriptService = ComponentManager.getService()
val userScripts = userScriptService.userScripts
if (userScripts.isEmpty()) {
App.get().errorDialog(this, R.string.no_user_script_found, { finish() })
diff --git a/app/src/main/java/io/neoterm/ui/term/tab/TermTab.kt b/app/src/main/java/io/neoterm/ui/term/tab/TermTab.kt
index 2cca162..5774417 100644
--- a/app/src/main/java/io/neoterm/ui/term/tab/TermTab.kt
+++ b/app/src/main/java/io/neoterm/ui/term/tab/TermTab.kt
@@ -4,10 +4,10 @@ import android.content.Context
import android.support.v7.widget.Toolbar
import android.view.inputmethod.InputMethodManager
import de.mrapp.android.tabswitcher.Tab
-import io.neoterm.customize.color.ColorSchemeService
+import io.neoterm.component.color.ColorSchemeComponent
import io.neoterm.frontend.client.TermDataHolder
import io.neoterm.frontend.client.TermUiPresenter
-import io.neoterm.frontend.service.ServiceManager
+import io.neoterm.frontend.component.ComponentManager
import io.neoterm.ui.term.event.TabCloseEvent
import io.neoterm.ui.term.event.TitleChangedEvent
import io.neoterm.ui.term.event.ToggleFullScreenEvent
@@ -22,7 +22,7 @@ class TermTab(title: CharSequence) : Tab(title), TermUiPresenter {
var toolbar: Toolbar? = null
fun updateColorScheme() {
- val colorSchemeManager = ServiceManager.getService()
+ val colorSchemeManager = ComponentManager.getService()
colorSchemeManager.applyColorScheme(termData.termView, termData.extraKeysView,
colorSchemeManager.getCurrentColorScheme())
}
diff --git a/app/src/main/java/io/neoterm/ui/term/tab/TermTabDecorator.kt b/app/src/main/java/io/neoterm/ui/term/tab/TermTabDecorator.kt
index ccf219f..ae38f67 100644
--- a/app/src/main/java/io/neoterm/ui/term/tab/TermTabDecorator.kt
+++ b/app/src/main/java/io/neoterm/ui/term/tab/TermTabDecorator.kt
@@ -9,14 +9,14 @@ import de.mrapp.android.tabswitcher.Tab
import de.mrapp.android.tabswitcher.TabSwitcher
import de.mrapp.android.tabswitcher.TabSwitcherDecorator
import io.neoterm.R
-import io.neoterm.customize.color.ColorSchemeService
+import io.neoterm.component.color.ColorSchemeComponent
import io.neoterm.frontend.preference.NeoPreference
import io.neoterm.frontend.client.TermCompleteListener
import io.neoterm.ui.term.NeoTermActivity
import io.neoterm.utils.TerminalUtils
import io.neoterm.view.eks.ExtraKeysView
import io.neoterm.frontend.completion.listener.OnAutoCompleteListener
-import io.neoterm.frontend.service.ServiceManager
+import io.neoterm.frontend.component.ComponentManager
import io.neoterm.view.TerminalView
/**
@@ -51,7 +51,7 @@ class TermTabDecorator(val context: NeoTermActivity) : TabSwitcherDecorator() {
TerminalUtils.setupTerminalView(view)
TerminalUtils.setupExtraKeysView(extraKeysView)
- val colorSchemeManager = ServiceManager.getService()
+ val colorSchemeManager = ComponentManager.getService()
colorSchemeManager.applyColorScheme(view, extraKeysView, colorSchemeManager.getCurrentColorScheme())
if (tab is TermTab) {
diff --git a/app/src/main/java/io/neoterm/utils/TerminalUtils.kt b/app/src/main/java/io/neoterm/utils/TerminalUtils.kt
index 8ccd051..0df6948 100644
--- a/app/src/main/java/io/neoterm/utils/TerminalUtils.kt
+++ b/app/src/main/java/io/neoterm/utils/TerminalUtils.kt
@@ -3,10 +3,10 @@ package io.neoterm.utils
import android.content.Context
import io.neoterm.R
import io.neoterm.backend.TerminalSession
-import io.neoterm.customize.font.FontService
+import io.neoterm.component.font.FontComponent
import io.neoterm.frontend.shell.ShellParameter
import io.neoterm.frontend.shell.ShellTermSession
-import io.neoterm.frontend.service.ServiceManager
+import io.neoterm.frontend.component.ComponentManager
import io.neoterm.frontend.preference.NeoPreference
import io.neoterm.view.eks.ExtraKeysView
import io.neoterm.view.TerminalView
@@ -18,14 +18,14 @@ import io.neoterm.view.TerminalViewClient
object TerminalUtils {
fun setupTerminalView(terminalView: TerminalView?, terminalViewClient: TerminalViewClient? = null) {
terminalView?.textSize = NeoPreference.loadInt(NeoPreference.KEY_FONT_SIZE, 30)
- terminalView?.setTypeface(ServiceManager.getService().getCurrentFont().getTypeFace())
+ terminalView?.setTypeface(ComponentManager.getService().getCurrentFont().getTypeFace())
if (terminalViewClient != null) {
terminalView?.setTerminalViewClient(terminalViewClient)
}
}
fun setupExtraKeysView(extraKeysView: ExtraKeysView?) {
- extraKeysView?.setTypeface(ServiceManager.getService().getCurrentFont().getTypeFace())
+ extraKeysView?.setTypeface(ComponentManager.getService().getCurrentFont().getTypeFace())
}
fun setupTerminalSession(session: TerminalSession?) {
diff --git a/app/src/main/java/io/neoterm/view/eks/ExtraKeysView.kt b/app/src/main/java/io/neoterm/view/eks/ExtraKeysView.kt
index a6bde1c..c1d0e0f 100755
--- a/app/src/main/java/io/neoterm/view/eks/ExtraKeysView.kt
+++ b/app/src/main/java/io/neoterm/view/eks/ExtraKeysView.kt
@@ -7,7 +7,7 @@ import android.view.*
import android.widget.GridLayout
import android.widget.LinearLayout
import io.neoterm.R
-import io.neoterm.customize.eks.NeoExtraKey
+import io.neoterm.component.eks.NeoExtraKey
import io.neoterm.frontend.preference.NeoPreference
import io.neoterm.frontend.preference.NeoTermPath
import io.neoterm.ui.term.event.ToggleImeEvent
diff --git a/app/src/main/res/layout/ui_color_scheme.xml b/app/src/main/res/layout/ui_color_scheme.xml
index 3373850..9b9fb02 100644
--- a/app/src/main/res/layout/ui_color_scheme.xml
+++ b/app/src/main/res/layout/ui_color_scheme.xml
@@ -6,7 +6,7 @@
android:orientation="vertical">
这个app是我在课余时间制作的,一个人不仅要维护app,还要维护各种软件包和服务器,如果能得到你的支持,我将更有动力继续将app完善下去
QQ
支付宝
+ 新建配色方案
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 76d2fc1..7fcbfab 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -2,7 +2,7 @@
#607D8B
#455A64
- #FF5252
+ #42a5f5
#ff14181c
#fefefe
#ced7db
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e55bea9..2cba780 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -117,6 +117,7 @@
Kiva for Maintaining\nCrixec for Icon Design
Acknowledgements
nullptr for accompanying me\nCoolApk User @NimaQu for providing server\nQQ User @My for providing free network
+ New Color Scheme
- sh
diff --git a/app/src/main/res/xml-v25/shortcuts.xml b/app/src/main/res/xml-v25/shortcuts.xml
deleted file mode 100644
index 3126e5e..0000000
--- a/app/src/main/res/xml-v25/shortcuts.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
diff --git a/app/src/test/java/io/neoterm/ConfigureFileTest.kt b/app/src/test/java/io/neoterm/ConfigureFileTest.kt
index f2059f7..1e7f893 100644
--- a/app/src/test/java/io/neoterm/ConfigureFileTest.kt
+++ b/app/src/test/java/io/neoterm/ConfigureFileTest.kt
@@ -1,12 +1,11 @@
package io.neoterm
-import io.neolang.main.Main
import io.neolang.visitor.ConfigVisitor
-import io.neoterm.customize.color.NeoColorScheme
-import io.neoterm.customize.config.ConfigureService
-import io.neoterm.customize.eks.NeoExtraKey
+import io.neoterm.component.color.NeoColorScheme
+import io.neoterm.component.config.ConfigureComponent
+import io.neoterm.component.eks.NeoExtraKey
import io.neoterm.frontend.config.NeoConfigureFile
-import io.neoterm.frontend.service.ServiceManager
+import io.neoterm.frontend.component.ComponentManager
import org.junit.Test
import java.io.File
@@ -26,7 +25,7 @@ class ConfigureFileTest {
@Test
fun colorConfigureTest() {
try {
- ServiceManager.registerService(ConfigureService::class.java)
+ ComponentManager.registerComponent(ConfigureComponent::class.java)
} catch (ignore: Throwable) {
}
@@ -44,7 +43,7 @@ class ConfigureFileTest {
@Test
fun extraKeyConfigureTest() {
try {
- ServiceManager.registerService(ConfigureService::class.java)
+ ComponentManager.registerComponent(ConfigureComponent::class.java)
} catch (ignore: Throwable) {
}