diff --git a/app/src/main/java/io/neoterm/component/userscript/UserScriptComponent.kt b/app/src/main/java/io/neoterm/component/userscript/UserScriptComponent.kt index a15eaa0..5cf90ba 100644 --- a/app/src/main/java/io/neoterm/component/userscript/UserScriptComponent.kt +++ b/app/src/main/java/io/neoterm/component/userscript/UserScriptComponent.kt @@ -13,48 +13,34 @@ import java.io.File * @author kiva */ class UserScriptComponent : NeoComponent { - lateinit var userScripts: MutableList + private var userScripts = listOf() + private val scriptDir = File(NeoTermPath.USER_SCRIPT_PATH) - override fun onServiceInit() { - checkForFiles() - } + override fun onServiceInit() = checkForFiles() override fun onServiceDestroy() { } - override fun onServiceObtained() { - checkForFiles() - } + override fun onServiceObtained() = checkForFiles() - private fun extractDefaultScript(context: Context): Boolean { - try { - context.extractAssetsDir( "scripts", NeoTermPath.USER_SCRIPT_PATH) - File(NeoTermPath.USER_SCRIPT_PATH) - .listFiles().forEach { - Os.chmod(it.absolutePath, 448 /*Dec of 0700*/) - } - return true - } catch (e: Exception) { - NLog.e("UserScript", "Failed to extract default user scripts: ${e.localizedMessage}") - return false + private fun extractDefaultScript(context: Context) = kotlin.runCatching { + context.extractAssetsDir("scripts", NeoTermPath.USER_SCRIPT_PATH) + scriptDir.listFiles().forEach { + Os.chmod(it.absolutePath, 448 /*Dec of 0700*/) } + }.onFailure { + NLog.e("UserScript", "Failed to extract default user scripts: ${it.localizedMessage}") } private fun checkForFiles() { - File(NeoTermPath.USER_SCRIPT_PATH).mkdirs() - userScripts = mutableListOf() - extractDefaultScript(App.get()) reloadScripts() } - fun reloadScripts() { - val userScriptDir = File(NeoTermPath.USER_SCRIPT_PATH) - userScriptDir.mkdirs() - - userScripts.clear() - userScriptDir.listFiles() + private fun reloadScripts() { + userScripts = scriptDir.listFiles() .takeWhile { it.canExecute() } - .mapTo(userScripts, { UserScript(it) }) + .map { UserScript(it) } + .toList() } -} \ No newline at end of file +} 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 aef7095..d8e7895 100644 --- a/app/src/main/java/io/neoterm/ui/pm/PackageManagerActivity.kt +++ b/app/src/main/java/io/neoterm/ui/pm/PackageManagerActivity.kt @@ -30,7 +30,7 @@ import java.util.* */ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListener, SortedListAdapter.Callback { - private val COMPARATOR = SortedListAdapter.ComparatorBuilder() + private val comparator = SortedListAdapter.ComparatorBuilder() .setOrderForModel(PackageModel::class.java) { a, b -> 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 adapter: PackageAdapter - lateinit var models: ArrayList + var models = listOf() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -49,7 +49,7 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen recyclerView = findViewById(R.id.pm_package_list) recyclerView.setHasFixedSize(true) - adapter = PackageAdapter(this, COMPARATOR, object : PackageAdapter.Listener { + adapter = PackageAdapter(this, comparator, object : PackageAdapter.Listener { override fun onModelClicked(model: PackageModel) { AlertDialog.Builder(this@PackageManagerActivity) .setTitle(model.packageInfo.packageName) @@ -60,14 +60,11 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen .setNegativeButton(android.R.string.no, null) .show() } - }) adapter.addCallback(this) recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.adapter = adapter - - models = ArrayList() refreshPackageList() } @@ -174,21 +171,17 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen } private fun refreshPackageList() = Thread { - models.clear() val pm = ComponentManager.getComponent() val sourceFiles = SourceHelper.detectSourceFiles() pm.clearPackages() sourceFiles.forEach { pm.reloadPackages(it, false) } - pm.packages.values.mapTo(models, { PackageModel(it) }) + models = pm.packages.values.map { PackageModel(it) }.toList() this@PackageManagerActivity.runOnUiThread { - adapter.edit() - .replaceAll(models) - .commit() + adapter.edit().replaceAll(models).commit() if (models.isEmpty()) { Toast.makeText(this@PackageManagerActivity, R.string.package_list_empty, Toast.LENGTH_SHORT).show() - changeSource() } } }.start() @@ -199,25 +192,22 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen ): List> { return models .map { - Pair( - it, - StringDistance.distance(mapper(it.packageInfo).toLowerCase(Locale.ROOT), query.toLowerCase(Locale.ROOT)) - ) + it to 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() } private fun filter(models: List, query: String): List { - val filteredModelList = mutableListOf() val prepared = models.filter { it.packageInfo.packageName!!.contains(query, true) || it.packageInfo.description!!.contains(query, true) } - sortDistance(prepared, query, { it.packageName!! }).mapTo(filteredModelList, { it.first }) - sortDistance(prepared, query, { it.description!! }).mapTo(filteredModelList, { it.first }) - return filteredModelList + return sortDistance(prepared, query) { it.packageName!! } + .plus(sortDistance(prepared, query) { it.description!! }) + .map { it.first } + .toList() } override fun onQueryTextSubmit(text: String?) = false @@ -235,4 +225,4 @@ class PackageManagerActivity : AppCompatActivity(), SearchView.OnQueryTextListen recyclerView.scrollToPosition(0) recyclerView.animate().alpha(1.0f) } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/neoterm/ui/settings/GeneralSettingsActivity.kt b/app/src/main/java/io/neoterm/ui/settings/GeneralSettingsActivity.kt index 5a33efa..37c1082 100644 --- a/app/src/main/java/io/neoterm/ui/settings/GeneralSettingsActivity.kt +++ b/app/src/main/java/io/neoterm/ui/settings/GeneralSettingsActivity.kt @@ -31,9 +31,7 @@ class GeneralSettingsActivity : BasePreferenceActivity() { } } - private fun postChangeShell(shellName: String) { - NeoPreference.setLoginShellName(shellName) - } + private fun postChangeShell(shellName: String) = NeoPreference.setLoginShellName(shellName) private fun requestInstallShell(shellName: String, currentShell: String) { AlertDialog.Builder(this) 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 fec5832..46babdc 100644 --- a/app/src/main/java/io/neoterm/ui/setup/SetupActivity.kt +++ b/app/src/main/java/io/neoterm/ui/setup/SetupActivity.kt @@ -98,8 +98,7 @@ class SetupActivity : AppCompatActivity(), View.OnClickListener, ResultListener when (id) { R.id.setup_method_backup, R.id.setup_method_local -> { - SetupHelper.makeErrorDialog(this, R.string.setup_error_parameter_null) - .show() + SetupHelper.makeErrorDialog(this, R.string.setup_error_parameter_null).show() return } } diff --git a/app/src/main/java/io/neoterm/utils/utils.kt b/app/src/main/java/io/neoterm/utils/utils.kt index 5fbc81b..68f762c 100644 --- a/app/src/main/java/io/neoterm/utils/utils.kt +++ b/app/src/main/java/io/neoterm/utils/utils.kt @@ -9,8 +9,8 @@ import android.provider.MediaStore import io.neoterm.R import io.neoterm.frontend.config.NeoTermPath import io.neoterm.frontend.floating.TerminalDialog -import java.io.File import java.nio.file.Files +import java.nio.file.Paths import java.text.DecimalFormat 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 - assets.list(dirName)?.let { - it.map { File(extractDir, it) } - .takeWhile { !it.exists() } - .forEach { file -> - assets.open("$dirName/${file.name}").use { - kotlin.runCatching { Files.copy(it, file.toPath()) } + assets.list(assetDir)?.let { + it.map { targetDir.resolve(it) } + .takeWhile { !Files.exists(it) } + .forEach { targetPath -> + assets.open("$assetDir/${targetPath.fileName}").use { + Files.copy(it, targetPath) } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 83a55ee..949f08c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -63,7 +63,7 @@ Package: %s\nVersion: %s\nDepends: %s\nInstalled Size: %s\nDescription: %s\nHome Page: %s - Package list is empty, please check out your source. + Package list is empty, please check your source. Refresh Update and Refresh Install Font