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) { }