MISC: enhance code step 3
This commit is contained in:
@ -13,48 +13,34 @@ import java.io.File
|
|||||||
* @author kiva
|
* @author kiva
|
||||||
*/
|
*/
|
||||||
class UserScriptComponent : NeoComponent {
|
class UserScriptComponent : NeoComponent {
|
||||||
lateinit var userScripts: MutableList<UserScript>
|
private var userScripts = listOf<UserScript>()
|
||||||
|
private val scriptDir = File(NeoTermPath.USER_SCRIPT_PATH)
|
||||||
|
|
||||||
override fun onServiceInit() {
|
override fun onServiceInit() = checkForFiles()
|
||||||
checkForFiles()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onServiceDestroy() {
|
override fun onServiceDestroy() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onServiceObtained() {
|
override fun onServiceObtained() = checkForFiles()
|
||||||
checkForFiles()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun extractDefaultScript(context: Context): Boolean {
|
private fun extractDefaultScript(context: Context) = kotlin.runCatching {
|
||||||
try {
|
context.extractAssetsDir("scripts", NeoTermPath.USER_SCRIPT_PATH)
|
||||||
context.extractAssetsDir( "scripts", NeoTermPath.USER_SCRIPT_PATH)
|
scriptDir.listFiles().forEach {
|
||||||
File(NeoTermPath.USER_SCRIPT_PATH)
|
|
||||||
.listFiles().forEach {
|
|
||||||
Os.chmod(it.absolutePath, 448 /*Dec of 0700*/)
|
Os.chmod(it.absolutePath, 448 /*Dec of 0700*/)
|
||||||
}
|
}
|
||||||
return true
|
}.onFailure {
|
||||||
} catch (e: Exception) {
|
NLog.e("UserScript", "Failed to extract default user scripts: ${it.localizedMessage}")
|
||||||
NLog.e("UserScript", "Failed to extract default user scripts: ${e.localizedMessage}")
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkForFiles() {
|
private fun checkForFiles() {
|
||||||
File(NeoTermPath.USER_SCRIPT_PATH).mkdirs()
|
|
||||||
userScripts = mutableListOf()
|
|
||||||
|
|
||||||
extractDefaultScript(App.get())
|
extractDefaultScript(App.get())
|
||||||
reloadScripts()
|
reloadScripts()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun reloadScripts() {
|
private fun reloadScripts() {
|
||||||
val userScriptDir = File(NeoTermPath.USER_SCRIPT_PATH)
|
userScripts = scriptDir.listFiles()
|
||||||
userScriptDir.mkdirs()
|
|
||||||
|
|
||||||
userScripts.clear()
|
|
||||||
userScriptDir.listFiles()
|
|
||||||
.takeWhile { it.canExecute() }
|
.takeWhile { it.canExecute() }
|
||||||
.mapTo(userScripts, { UserScript(it) })
|
.map { UserScript(it) }
|
||||||
|
.toList()
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -30,7 +30,7 @@ import java.util.*
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListener, SortedListAdapter.Callback {
|
class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListener, SortedListAdapter.Callback {
|
||||||
private val COMPARATOR = SortedListAdapter.ComparatorBuilder<PackageModel>()
|
private val comparator = SortedListAdapter.ComparatorBuilder<PackageModel>()
|
||||||
.setOrderForModel<PackageModel>(PackageModel::class.java) { a, b ->
|
.setOrderForModel<PackageModel>(PackageModel::class.java) { a, b ->
|
||||||
a.packageInfo.packageName!!.compareTo(b.packageInfo.packageName!!)
|
a.packageInfo.packageName!!.compareTo(b.packageInfo.packageName!!)
|
||||||
}
|
}
|
||||||
@ -38,7 +38,7 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
|
|||||||
|
|
||||||
lateinit var recyclerView: androidx.recyclerview.widget.RecyclerView
|
lateinit var recyclerView: androidx.recyclerview.widget.RecyclerView
|
||||||
lateinit var adapter: PackageAdapter
|
lateinit var adapter: PackageAdapter
|
||||||
lateinit var models: ArrayList<PackageModel>
|
var models = listOf<PackageModel>()
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@ -49,7 +49,7 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
|
|||||||
|
|
||||||
recyclerView = findViewById(R.id.pm_package_list)
|
recyclerView = findViewById(R.id.pm_package_list)
|
||||||
recyclerView.setHasFixedSize(true)
|
recyclerView.setHasFixedSize(true)
|
||||||
adapter = PackageAdapter(this, COMPARATOR, object : PackageAdapter.Listener {
|
adapter = PackageAdapter(this, comparator, object : PackageAdapter.Listener {
|
||||||
override fun onModelClicked(model: PackageModel) {
|
override fun onModelClicked(model: PackageModel) {
|
||||||
AlertDialog.Builder(this@PackageManagerActivity)
|
AlertDialog.Builder(this@PackageManagerActivity)
|
||||||
.setTitle(model.packageInfo.packageName)
|
.setTitle(model.packageInfo.packageName)
|
||||||
@ -60,14 +60,11 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
|
|||||||
.setNegativeButton(android.R.string.no, null)
|
.setNegativeButton(android.R.string.no, null)
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
adapter.addCallback(this)
|
adapter.addCallback(this)
|
||||||
|
|
||||||
recyclerView.layoutManager = LinearLayoutManager(this)
|
recyclerView.layoutManager = LinearLayoutManager(this)
|
||||||
recyclerView.adapter = adapter
|
recyclerView.adapter = adapter
|
||||||
|
|
||||||
models = ArrayList()
|
|
||||||
refreshPackageList()
|
refreshPackageList()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,21 +171,17 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun refreshPackageList() = Thread {
|
private fun refreshPackageList() = Thread {
|
||||||
models.clear()
|
|
||||||
val pm = ComponentManager.getComponent<PackageComponent>()
|
val pm = ComponentManager.getComponent<PackageComponent>()
|
||||||
val sourceFiles = SourceHelper.detectSourceFiles()
|
val sourceFiles = SourceHelper.detectSourceFiles()
|
||||||
|
|
||||||
pm.clearPackages()
|
pm.clearPackages()
|
||||||
sourceFiles.forEach { pm.reloadPackages(it, false) }
|
sourceFiles.forEach { pm.reloadPackages(it, false) }
|
||||||
pm.packages.values.mapTo(models, { PackageModel(it) })
|
models = pm.packages.values.map { PackageModel(it) }.toList()
|
||||||
|
|
||||||
this@PackageManagerActivity.runOnUiThread {
|
this@PackageManagerActivity.runOnUiThread {
|
||||||
adapter.edit()
|
adapter.edit().replaceAll(models).commit()
|
||||||
.replaceAll(models)
|
|
||||||
.commit()
|
|
||||||
if (models.isEmpty()) {
|
if (models.isEmpty()) {
|
||||||
Toast.makeText(this@PackageManagerActivity, R.string.package_list_empty, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@PackageManagerActivity, R.string.package_list_empty, Toast.LENGTH_SHORT).show()
|
||||||
changeSource()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.start()
|
}.start()
|
||||||
@ -199,25 +192,22 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen
|
|||||||
): List<Pair<PackageModel, Int>> {
|
): List<Pair<PackageModel, Int>> {
|
||||||
return models
|
return models
|
||||||
.map {
|
.map {
|
||||||
Pair(
|
it to StringDistance.distance(mapper(it.packageInfo).toLowerCase(Locale.ROOT), query.toLowerCase(Locale.ROOT))
|
||||||
it,
|
|
||||||
StringDistance.distance(mapper(it.packageInfo).toLowerCase(Locale.ROOT), query.toLowerCase(Locale.ROOT))
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
.sortedWith(Comparator { l, r -> r.second.compareTo(l.second) })
|
.sortedWith { l, r -> r.second.compareTo(l.second) }
|
||||||
.toList()
|
.toList()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun filter(models: List<PackageModel>, query: String): List<PackageModel> {
|
private fun filter(models: List<PackageModel>, query: String): List<PackageModel> {
|
||||||
val filteredModelList = mutableListOf<PackageModel>()
|
|
||||||
val prepared = models.filter {
|
val prepared = models.filter {
|
||||||
it.packageInfo.packageName!!.contains(query, true)
|
it.packageInfo.packageName!!.contains(query, true)
|
||||||
|| it.packageInfo.description!!.contains(query, true)
|
|| it.packageInfo.description!!.contains(query, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
sortDistance(prepared, query, { it.packageName!! }).mapTo(filteredModelList, { it.first })
|
return sortDistance(prepared, query) { it.packageName!! }
|
||||||
sortDistance(prepared, query, { it.description!! }).mapTo(filteredModelList, { it.first })
|
.plus(sortDistance(prepared, query) { it.description!! })
|
||||||
return filteredModelList
|
.map { it.first }
|
||||||
|
.toList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onQueryTextSubmit(text: String?) = false
|
override fun onQueryTextSubmit(text: String?) = false
|
||||||
|
@ -31,9 +31,7 @@ class GeneralSettingsActivity : BasePreferenceActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun postChangeShell(shellName: String) {
|
private fun postChangeShell(shellName: String) = NeoPreference.setLoginShellName(shellName)
|
||||||
NeoPreference.setLoginShellName(shellName)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun requestInstallShell(shellName: String, currentShell: String) {
|
private fun requestInstallShell(shellName: String, currentShell: String) {
|
||||||
AlertDialog.Builder(this)
|
AlertDialog.Builder(this)
|
||||||
|
@ -98,8 +98,7 @@ class SetupActivity : AppCompatActivity(), View.OnClickListener, ResultListener
|
|||||||
when (id) {
|
when (id) {
|
||||||
R.id.setup_method_backup,
|
R.id.setup_method_backup,
|
||||||
R.id.setup_method_local -> {
|
R.id.setup_method_local -> {
|
||||||
SetupHelper.makeErrorDialog(this, R.string.setup_error_parameter_null)
|
SetupHelper.makeErrorDialog(this, R.string.setup_error_parameter_null).show()
|
||||||
.show()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,8 @@ import android.provider.MediaStore
|
|||||||
import io.neoterm.R
|
import io.neoterm.R
|
||||||
import io.neoterm.frontend.config.NeoTermPath
|
import io.neoterm.frontend.config.NeoTermPath
|
||||||
import io.neoterm.frontend.floating.TerminalDialog
|
import io.neoterm.frontend.floating.TerminalDialog
|
||||||
import java.io.File
|
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
|
import java.nio.file.Paths
|
||||||
import java.text.DecimalFormat
|
import java.text.DecimalFormat
|
||||||
|
|
||||||
class RangedInt(private val number: Int, private val range: IntRange) {
|
class RangedInt(private val number: Int, private val range: IntRange) {
|
||||||
@ -36,14 +36,16 @@ fun Long.formatSizeInKB(): String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.extractAssetsDir(dirName: String, extractDir: String) {
|
fun Context.extractAssetsDir(assetDir: String, extractDir: String) = kotlin.runCatching {
|
||||||
|
val targetDir = Paths.get(extractDir)
|
||||||
|
Files.createDirectories(targetDir)
|
||||||
val assets = this.assets
|
val assets = this.assets
|
||||||
assets.list(dirName)?.let {
|
assets.list(assetDir)?.let {
|
||||||
it.map { File(extractDir, it) }
|
it.map { targetDir.resolve(it) }
|
||||||
.takeWhile { !it.exists() }
|
.takeWhile { !Files.exists(it) }
|
||||||
.forEach { file ->
|
.forEach { targetPath ->
|
||||||
assets.open("$dirName/${file.name}").use {
|
assets.open("$assetDir/${targetPath.fileName}").use {
|
||||||
kotlin.runCatching { Files.copy(it, file.toPath()) }
|
Files.copy(it, targetPath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@
|
|||||||
<string name="package_details">Package: %s\nVersion: %s\nDepends: %s\nInstalled Size: %s\nDescription: %s\nHome
|
<string name="package_details">Package: %s\nVersion: %s\nDepends: %s\nInstalled Size: %s\nDescription: %s\nHome
|
||||||
Page: %s
|
Page: %s
|
||||||
</string>
|
</string>
|
||||||
<string name="package_list_empty">Package list is empty, please check out your source.</string>
|
<string name="package_list_empty">Package list is empty, please check your source.</string>
|
||||||
<string name="menu_refresh_list">Refresh</string>
|
<string name="menu_refresh_list">Refresh</string>
|
||||||
<string name="menu_update">Update and Refresh</string>
|
<string name="menu_update">Update and Refresh</string>
|
||||||
<string name="install_font">Install Font</string>
|
<string name="install_font">Install Font</string>
|
||||||
|
Reference in New Issue
Block a user