Improve: Package source dialog

This commit is contained in:
zt515 2017-08-14 14:28:03 +08:00
parent 62a388634a
commit e7e19d0f25
18 changed files with 79 additions and 58 deletions

View File

@ -58,7 +58,7 @@ open class NeoColorScheme {
fun loadConfigure(file: File): Boolean { fun loadConfigure(file: File): Boolean {
// TODO: Refactor with NeoExtraKey#loadConfigure // TODO: Refactor with NeoExtraKey#loadConfigure
val loaderService = ComponentManager.getService<ConfigureComponent>() val loaderService = ComponentManager.getComponent<ConfigureComponent>()
val configure: NeoConfigureFile? val configure: NeoConfigureFile?
try { try {

View File

@ -44,7 +44,7 @@ class NeoExtraKey {
fun loadConfigure(file: File): Boolean { fun loadConfigure(file: File): Boolean {
// TODO: Refactor with NeoColorScheme#loadConfigure // TODO: Refactor with NeoColorScheme#loadConfigure
val loaderService = ComponentManager.getService<ConfigureComponent>() val loaderService = ComponentManager.getComponent<ConfigureComponent>()
val configure: NeoConfigureFile? val configure: NeoConfigureFile?
try { try {

View File

@ -29,7 +29,11 @@ public class NeoPackageComponent implements NeoComponent {
return queryEnabled ? neoPackages.size() : -1; return queryEnabled ? neoPackages.size() : -1;
} }
public void refreshPackageList(File packageListFile, boolean clearPrevious) throws IOException { public SourceManager getSourceManager() {
return new SourceManager();
}
public void reloadPackages(File packageListFile, boolean clearPrevious) throws IOException {
synchronized (lock) { synchronized (lock) {
if (isRefreshing) { if (isRefreshing) {
return; return;

View File

@ -0,0 +1,27 @@
package io.neoterm.component.pm
import io.neoterm.App
import io.neoterm.R
import io.neoterm.frontend.preference.NeoPreference
/**
* @author kiva
*/
class SourceManager internal constructor() {
val sources = mutableSetOf<String>()
init {
NeoPreference.loadStrings(NeoPreference.KEY_SOURCES).mapTo(sources, { it })
if (sources.isEmpty()) {
sources.addAll(App.get().resources.getStringArray(R.array.pref_package_source_values))
}
}
fun addSource(sourceUrl: String) {
sources.add(sourceUrl)
}
fun applyChanges() {
NeoPreference.storeStrings(NeoPreference.KEY_SOURCES, sources)
}
}

View File

@ -203,7 +203,7 @@ class TermViewClient(val context: Context) : TerminalViewClient {
if (lastTitle != title || force) { if (lastTitle != title || force) {
removeSuggestions() removeSuggestions()
ComponentManager.getService<ExtraKeysComponent>().showShortcutKeys(title, extraKeysView) ComponentManager.getComponent<ExtraKeysComponent>().showShortcutKeys(title, extraKeysView)
extraKeysView.updateButtons() extraKeysView.updateButtons()
lastTitle = title lastTitle = title
} }

View File

@ -135,7 +135,7 @@ class CandidatePopupWindow(val context: Context) {
val splitView: View = rootView.findViewById(R.id.complete_split) val splitView: View = rootView.findViewById(R.id.complete_split)
init { init {
val colorScheme = ComponentManager.getService<ColorSchemeComponent>().getCurrentColorScheme() val colorScheme = ComponentManager.getComponent<ColorSchemeComponent>().getCurrentColorScheme()
val textColor = TerminalColors.parse(colorScheme.foregroundColor) val textColor = TerminalColors.parse(colorScheme.foregroundColor)
display.setTextColor(textColor) display.setTextColor(textColor)
description.setTextColor(textColor) description.setTextColor(textColor)

View File

@ -25,7 +25,7 @@ object ComponentManager {
} }
} }
inline fun <reified T : NeoComponent> getService(): T { inline fun <reified T : NeoComponent> getComponent(): T {
val serviceInterface = T::class.java val serviceInterface = T::class.java
val service: NeoComponent = COMPONENTS[serviceInterface] ?: val service: NeoComponent = COMPONENTS[serviceInterface] ?:
throw ComponentNotFoundException(serviceInterface.simpleName) throw ComponentNotFoundException(serviceInterface.simpleName)

View File

@ -4,9 +4,9 @@ import android.app.AlertDialog
import android.content.Context import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
import io.neoterm.backend.TerminalSession import io.neoterm.backend.TerminalSession
import io.neoterm.frontend.shell.ShellParameter
import io.neoterm.frontend.client.BasicSessionCallback import io.neoterm.frontend.client.BasicSessionCallback
import io.neoterm.frontend.client.BasicViewClient import io.neoterm.frontend.client.BasicViewClient
import io.neoterm.frontend.shell.ShellParameter
import io.neoterm.utils.TerminalUtils import io.neoterm.utils.TerminalUtils
/** /**
@ -76,7 +76,6 @@ class TerminalDialog(val context: Context) {
fun show(title: String?) { fun show(title: String?) {
dialog?.setTitle(title) dialog?.setTitle(title)
dialog?.setCancelable(false)
dialog?.setCanceledOnTouchOutside(false) dialog?.setCanceledOnTouchOutside(false)
dialog?.show() dialog?.show()
} }

View File

@ -23,6 +23,7 @@ object NeoPreference {
const val KEY_FONT_SIZE = "neoterm_general_font_size" const val KEY_FONT_SIZE = "neoterm_general_font_size"
const val KEY_CURRENT_SESSION = "neoterm_service_current_session" const val KEY_CURRENT_SESSION = "neoterm_service_current_session"
const val KEY_SYSTEM_SHELL = "neoterm_core_system_shell" const val KEY_SYSTEM_SHELL = "neoterm_core_system_shell"
const val KEY_SOURCES = "neoterm_source_source_list"
// const val KEY_FLOATING_WINDOW_X = "neoterm_floating_window_x" // const val KEY_FLOATING_WINDOW_X = "neoterm_floating_window_x"
// const val KEY_FLOATING_WINDOW_Y = "neoterm_floating_window_y" // const val KEY_FLOATING_WINDOW_Y = "neoterm_floating_window_y"
// const val KEY_FLOATING_WIDTH = "neoterm_floating_window_width" // const val KEY_FLOATING_WIDTH = "neoterm_floating_window_width"
@ -61,6 +62,14 @@ object NeoPreference {
} }
} }
fun storeStrings(key: String, value: Set<String>) {
preference!!.edit().putStringSet(key, value).apply()
}
fun loadStrings(key: String) : Set<String> {
return preference!!.getStringSet(key, setOf())
}
fun store(key: Int, value: Any) { fun store(key: Int, value: Any) {
store(App.get().getString(key), value) store(App.get().getString(key), value)
} }

View File

@ -56,8 +56,8 @@ class CustomizeActivity : BaseCustomizeActivity() {
} }
private fun setupSpinners() { private fun setupSpinners() {
val fontComponent = ComponentManager.getService<FontComponent>() val fontComponent = ComponentManager.getComponent<FontComponent>()
val colorSchemeComponent = ComponentManager.getService<ColorSchemeComponent>() val colorSchemeComponent = ComponentManager.getComponent<ColorSchemeComponent>()
setupSpinner(R.id.custom_font_spinner, fontComponent.getFontNames(), setupSpinner(R.id.custom_font_spinner, fontComponent.getFontNames(),
fontComponent.getCurrentFontName(), object : AdapterView.OnItemSelectedListener { fontComponent.getCurrentFontName(), object : AdapterView.OnItemSelectedListener {

View File

@ -3,7 +3,6 @@ package io.neoterm.ui.pm
import android.animation.Animator import android.animation.Animator
import android.animation.AnimatorListenerAdapter import android.animation.AnimatorListenerAdapter
import android.animation.ObjectAnimator import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
import android.support.v4.view.MenuItemCompat import android.support.v4.view.MenuItemCompat
import android.support.v7.app.AlertDialog import android.support.v7.app.AlertDialog
@ -23,12 +22,13 @@ import com.github.wrdlbrnft.sortedlistadapter.SortedListAdapter
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import io.neoterm.R import io.neoterm.R
import io.neoterm.backend.TerminalSession import io.neoterm.backend.TerminalSession
import io.neoterm.component.pm.SourceUtils
import io.neoterm.component.pm.NeoPackageComponent import io.neoterm.component.pm.NeoPackageComponent
import io.neoterm.component.pm.SourceManager
import io.neoterm.component.pm.SourceUtils
import io.neoterm.frontend.component.ComponentManager
import io.neoterm.frontend.floating.TerminalDialog import io.neoterm.frontend.floating.TerminalDialog
import io.neoterm.frontend.preference.NeoPreference import io.neoterm.frontend.preference.NeoPreference
import io.neoterm.frontend.preference.NeoTermPath import io.neoterm.frontend.preference.NeoTermPath
import io.neoterm.frontend.component.ComponentManager
import io.neoterm.ui.pm.adapter.PackageAdapter import io.neoterm.ui.pm.adapter.PackageAdapter
import io.neoterm.ui.pm.model.PackageModel import io.neoterm.ui.pm.model.PackageModel
import io.neoterm.utils.PackageUtils import io.neoterm.utils.PackageUtils
@ -121,57 +121,49 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
} }
private fun changeSource() { private fun changeSource() {
val sourceList = resources.getStringArray(R.array.pref_package_source_values) val sourceManager = ComponentManager.getComponent<NeoPackageComponent>().sourceManager
val sourceList = sourceManager.sources
val currentSource = NeoPreference.loadString(R.string.key_package_source, NeoTermPath.DEFAULT_SOURCE) val currentSource = NeoPreference.loadString(R.string.key_package_source, NeoTermPath.DEFAULT_SOURCE)
var checkedItem = sourceList.indexOf(currentSource) var checkedItem = sourceList.indexOf(currentSource)
if (checkedItem == -1) { if (checkedItem == -1) {
checkedItem = sourceList.size - 1 // Users may edit source.list on his own
checkedItem = sourceList.size
sourceManager.addSource(currentSource)
} }
@SuppressLint("ShowToast")
var toast = Toast.makeText(this, "", Toast.LENGTH_SHORT)
var selectedIndex = 0 var selectedIndex = 0
AlertDialog.Builder(this) AlertDialog.Builder(this)
.setTitle(R.string.pref_package_source) .setTitle(R.string.pref_package_source)
.setSingleChoiceItems(R.array.pref_package_source_entries, checkedItem, { dialog, which -> .setSingleChoiceItems(sourceList.toTypedArray(), checkedItem, { _, which ->
if (which == sourceList.size - 1) { selectedIndex = which
changeSourceToUserInput()
dialog.dismiss()
} else {
selectedIndex = which
toast.cancel()
toast = Toast.makeText(this@PackageManagerActivity, sourceList[which], Toast.LENGTH_SHORT)
toast.show()
}
}) })
.setPositiveButton(android.R.string.yes, { _, _ -> .setPositiveButton(android.R.string.yes, { _, _ ->
if (selectedIndex != sourceList.size - 1) { changeSourceInternal(sourceManager, sourceList.elementAt(selectedIndex))
changeSourceInternal(sourceList[selectedIndex]) })
} .setNeutralButton(R.string.new_source, { _, _ ->
changeSourceToUserInput(sourceManager)
}) })
.setNegativeButton(android.R.string.no, null) .setNegativeButton(android.R.string.no, null)
.show() .show()
} }
private fun changeSourceToUserInput() { private fun changeSourceToUserInput(sourceManager: SourceManager) {
val editText = EditText(this) val editText = EditText(this)
val currentSource = NeoPreference.loadString(R.string.key_package_source, NeoTermPath.DEFAULT_SOURCE)
editText.setText(currentSource)
editText.requestFocus()
editText.setSelection(0, currentSource.length)
AlertDialog.Builder(this) AlertDialog.Builder(this)
.setTitle(R.string.pref_package_source) .setTitle(R.string.pref_package_source)
.setView(editText) .setView(editText)
.setNegativeButton(android.R.string.no, null) .setNegativeButton(android.R.string.no, null)
.setPositiveButton(android.R.string.yes, { _, _ -> .setPositiveButton(android.R.string.yes, { _, _ ->
val source = editText.text.toString() val source = editText.text.toString()
changeSourceInternal(source) changeSourceInternal(sourceManager, source)
}) })
.show() .show()
} }
private fun changeSourceInternal(source: String) { private fun changeSourceInternal(sourceManager: SourceManager, source: String) {
sourceManager.addSource(source)
sourceManager.applyChanges()
NeoPreference.store(R.string.key_package_source, source) NeoPreference.store(R.string.key_package_source, source)
PackageUtils.syncSource() PackageUtils.syncSource()
executeAptUpdate() executeAptUpdate()
@ -213,12 +205,12 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
progressBar.visibility = View.VISIBLE progressBar.visibility = View.VISIBLE
progressBar.alpha = 0.0f progressBar.alpha = 0.0f
Thread { Thread {
val pm = ComponentManager.getService<NeoPackageComponent>() val pm = ComponentManager.getComponent<NeoPackageComponent>()
val sourceFiles = SourceUtils.detectSourceFiles() val sourceFiles = SourceUtils.detectSourceFiles()
pm.clearPackages() pm.clearPackages()
for (index in sourceFiles.indices) { for (index in sourceFiles.indices) {
pm.refreshPackageList(sourceFiles[index], false) pm.reloadPackages(sourceFiles[index], false)
} }
val packages = pm.packages val packages = pm.packages

View File

@ -105,7 +105,7 @@ class NeoTermRemoteInterface : AppCompatActivity(), ServiceConnection {
private fun handleUserScript() { private fun handleUserScript() {
val filesToHandle = mutableListOf<String>() val filesToHandle = mutableListOf<String>()
val userScriptService = ComponentManager.getService<UserScriptComponent>() val userScriptService = ComponentManager.getComponent<UserScriptComponent>()
val userScripts = userScriptService.userScripts val userScripts = userScriptService.userScripts
if (userScripts.isEmpty()) { if (userScripts.isEmpty()) {
App.get().errorDialog(this, R.string.no_user_script_found, { finish() }) App.get().errorDialog(this, R.string.no_user_script_found, { finish() })

View File

@ -22,7 +22,7 @@ class TermTab(title: CharSequence) : Tab(title), TermUiPresenter {
var toolbar: Toolbar? = null var toolbar: Toolbar? = null
fun updateColorScheme() { fun updateColorScheme() {
val colorSchemeManager = ComponentManager.getService<ColorSchemeComponent>() val colorSchemeManager = ComponentManager.getComponent<ColorSchemeComponent>()
colorSchemeManager.applyColorScheme(termData.termView, termData.extraKeysView, colorSchemeManager.applyColorScheme(termData.termView, termData.extraKeysView,
colorSchemeManager.getCurrentColorScheme()) colorSchemeManager.getCurrentColorScheme())
} }

View File

@ -51,7 +51,7 @@ class TermTabDecorator(val context: NeoTermActivity) : TabSwitcherDecorator() {
TerminalUtils.setupTerminalView(view) TerminalUtils.setupTerminalView(view)
TerminalUtils.setupExtraKeysView(extraKeysView) TerminalUtils.setupExtraKeysView(extraKeysView)
val colorSchemeManager = ComponentManager.getService<ColorSchemeComponent>() val colorSchemeManager = ComponentManager.getComponent<ColorSchemeComponent>()
colorSchemeManager.applyColorScheme(view, extraKeysView, colorSchemeManager.getCurrentColorScheme()) colorSchemeManager.applyColorScheme(view, extraKeysView, colorSchemeManager.getCurrentColorScheme())
if (tab is TermTab) { if (tab is TermTab) {

View File

@ -19,7 +19,7 @@ object TerminalUtils {
fun setupTerminalView(terminalView: TerminalView?, terminalViewClient: TerminalViewClient? = null) { fun setupTerminalView(terminalView: TerminalView?, terminalViewClient: TerminalViewClient? = null) {
terminalView?.textSize = NeoPreference.loadInt(NeoPreference.KEY_FONT_SIZE, 30) terminalView?.textSize = NeoPreference.loadInt(NeoPreference.KEY_FONT_SIZE, 30)
val fontComponent = ComponentManager.getService<FontComponent>() val fontComponent = ComponentManager.getComponent<FontComponent>()
fontComponent.applyFont(terminalView, null, fontComponent.getCurrentFont()) fontComponent.applyFont(terminalView, null, fontComponent.getCurrentFont())
if (terminalViewClient != null) { if (terminalViewClient != null) {
@ -28,7 +28,7 @@ object TerminalUtils {
} }
fun setupExtraKeysView(extraKeysView: ExtraKeysView?) { fun setupExtraKeysView(extraKeysView: ExtraKeysView?) {
val fontComponent = ComponentManager.getService<FontComponent>() val fontComponent = ComponentManager.getComponent<FontComponent>()
val font = fontComponent.getCurrentFont() val font = fontComponent.getCurrentFont()
fontComponent.applyFont(null, extraKeysView, font) fontComponent.applyFont(null, extraKeysView, font)
} }

View File

@ -62,11 +62,6 @@
<string name="done">完成</string> <string name="done">完成</string>
<string name="install">安装</string> <string name="install">安装</string>
<string-array name="pref_package_source_entries">
<item>mirrors.geekpie.org</item>
<item>neoterm.studio</item>
<item>输入…</item>
</string-array>
<string name="pref_customization_eks">拓展键盘</string> <string name="pref_customization_eks">拓展键盘</string>
<string name="general_settings_desc">响铃振动Shell初始命令</string> <string name="general_settings_desc">响铃振动Shell初始命令</string>
<string name="ui_settings_desc">全屏,标题栏,切换动画</string> <string name="ui_settings_desc">全屏,标题栏,切换动画</string>
@ -124,4 +119,5 @@
<string name="support_donate_alipay">支付宝</string> <string name="support_donate_alipay">支付宝</string>
<string name="new_color_scheme">新建配色方案</string> <string name="new_color_scheme">新建配色方案</string>
<string name="faq">常见问题</string> <string name="faq">常见问题</string>
<string name="new_source">新建</string>
</resources> </resources>

View File

@ -62,11 +62,6 @@
<string name="done">完成</string> <string name="done">完成</string>
<string name="install">安裝</string> <string name="install">安裝</string>
<string-array name="pref_package_source_entries">
<item>mirrors.geekpie.org</item>
<item>neoterm.studio</item>
<item>手動輸入…</item>
</string-array>
<string name="pref_customization_eks">擴充鍵盤</string> <string name="pref_customization_eks">擴充鍵盤</string>
<string name="general_settings_desc">響鈴震動Shell初始化指令</string> <string name="general_settings_desc">響鈴震動Shell初始化指令</string>
<string name="ui_settings_desc">全螢幕,標題欄,切換動畫</string> <string name="ui_settings_desc">全螢幕,標題欄,切換動畫</string>

View File

@ -119,6 +119,7 @@
<string name="about_credits">nullptr for accompanying me\nCoolApk User @NimaQu for providing server\nQQ User @My for providing free network</string> <string name="about_credits">nullptr for accompanying me\nCoolApk User @NimaQu for providing server\nQQ User @My for providing free network</string>
<string name="new_color_scheme">New Color Scheme</string> <string name="new_color_scheme">New Color Scheme</string>
<string name="faq">FAQ</string> <string name="faq">FAQ</string>
<string name="new_source">New</string>
<string-array name="pref_general_shell_entries" translatable="false"> <string-array name="pref_general_shell_entries" translatable="false">
<item>sh</item> <item>sh</item>
@ -141,16 +142,14 @@
<item>System First</item> <item>System First</item>
</string-array> </string-array>
<string-array name="pref_package_source_entries"> <string-array name="pref_package_source_entries" translatable="false">
<item>mirrors.geekpie.org</item> <item>mirrors.geekpie.org</item>
<item>neoterm.studio</item> <item>neoterm.studio</item>
<item>Input…</item>
</string-array> </string-array>
<string-array name="pref_package_source_values" translatable="false"> <string-array name="pref_package_source_values" translatable="false">
<item>https://mirrors.geekpie.org/neoterm</item> <item>https://mirrors.geekpie.org/neoterm</item>
<item>http://neoterm.studio</item> <item>http://neoterm.studio</item>
<item>User-Input</item>
</string-array> </string-array>
</resources> </resources>