mirror of
https://github.com/SimpleMobileTools/Simple-File-Manager.git
synced 2025-06-05 22:09:15 +02:00
rewrite root folders handling, do not use "awk" command
This commit is contained in:
@ -42,7 +42,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.simplemobiletools:commons:3.8.7'
|
implementation 'com.simplemobiletools:commons:3.8.8'
|
||||||
|
|
||||||
implementation files('../libs/RootTools.jar')
|
implementation files('../libs/RootTools.jar')
|
||||||
|
|
||||||
|
@ -284,7 +284,7 @@ class MainActivity : SimpleActivity() {
|
|||||||
Thread {
|
Thread {
|
||||||
config.isRootAvailable = RootTools.isRootAvailable()
|
config.isRootAvailable = RootTools.isRootAvailable()
|
||||||
if (config.isRootAvailable && config.enableRootAccess) {
|
if (config.isRootAvailable && config.enableRootAccess) {
|
||||||
RootHelpers().askRootIFNeeded(this) {
|
RootHelpers().askRootIfNeeded(this) {
|
||||||
config.enableRootAccess = it
|
config.enableRootAccess = it
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,7 @@ class SettingsActivity : SimpleActivity() {
|
|||||||
settings_enable_root_access.isChecked = config.enableRootAccess
|
settings_enable_root_access.isChecked = config.enableRootAccess
|
||||||
settings_enable_root_access_holder.setOnClickListener {
|
settings_enable_root_access_holder.setOnClickListener {
|
||||||
if (!config.enableRootAccess) {
|
if (!config.enableRootAccess) {
|
||||||
RootHelpers().askRootIFNeeded(this) {
|
RootHelpers().askRootIfNeeded(this) {
|
||||||
toggleRootAccess(it)
|
toggleRootAccess(it)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -122,15 +122,15 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb
|
|||||||
scrollStates[currentPath] = getScrollState()
|
scrollStates[currentPath] = getScrollState()
|
||||||
currentPath = realPath
|
currentPath = realPath
|
||||||
showHidden = context!!.config.shouldShowHidden
|
showHidden = context!!.config.shouldShowHidden
|
||||||
getItems(currentPath) {
|
getItems(currentPath) { originalPath, fileDirItems ->
|
||||||
if (!isAdded) {
|
if (currentPath != originalPath || !isAdded) {
|
||||||
return@getItems
|
return@getItems
|
||||||
}
|
}
|
||||||
|
|
||||||
FileDirItem.sorting = context!!.config.getFolderSorting(currentPath)
|
FileDirItem.sorting = context!!.config.getFolderSorting(currentPath)
|
||||||
it.sort()
|
fileDirItems.sort()
|
||||||
activity!!.runOnUiThread {
|
activity!!.runOnUiThread {
|
||||||
addItems(it)
|
addItems(fileDirItems)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -170,7 +170,7 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb
|
|||||||
|
|
||||||
private fun getRecyclerLayoutManager() = (mView.items_list.layoutManager as LinearLayoutManager)
|
private fun getRecyclerLayoutManager() = (mView.items_list.layoutManager as LinearLayoutManager)
|
||||||
|
|
||||||
private fun getItems(path: String, callback: (items: ArrayList<FileDirItem>) -> Unit) {
|
private fun getItems(path: String, callback: (originalPath: String, items: ArrayList<FileDirItem>) -> Unit) {
|
||||||
skipItemUpdating = false
|
skipItemUpdating = false
|
||||||
Thread {
|
Thread {
|
||||||
if (activity?.isActivityDestroyed() == false) {
|
if (activity?.isActivityDestroyed() == false) {
|
||||||
@ -183,7 +183,7 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb
|
|||||||
}.start()
|
}.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getRegularItemsOf(path: String, callback: (items: ArrayList<FileDirItem>) -> Unit) {
|
private fun getRegularItemsOf(path: String, callback: (originalPath: String, items: ArrayList<FileDirItem>) -> Unit) {
|
||||||
val items = ArrayList<FileDirItem>()
|
val items = ArrayList<FileDirItem>()
|
||||||
val files = File(path).listFiles()?.filterNotNull()
|
val files = File(path).listFiles()?.filterNotNull()
|
||||||
if (files != null) {
|
if (files != null) {
|
||||||
@ -200,7 +200,7 @@ class ItemsFragment : Fragment(), ItemOperationsListener, Breadcrumbs.Breadcrumb
|
|||||||
items.add(fileDirItem)
|
items.add(fileDirItem)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
callback(items)
|
callback(path, items)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getChildrenCount(file: File): Int {
|
private fun getChildrenCount(file: File): Int {
|
||||||
|
@ -75,8 +75,4 @@ class Config(context: Context) : BaseConfig(context) {
|
|||||||
var enableRootAccess: Boolean
|
var enableRootAccess: Boolean
|
||||||
get() = prefs.getBoolean(ENABLE_ROOT_ACCESS, false)
|
get() = prefs.getBoolean(ENABLE_ROOT_ACCESS, false)
|
||||||
set(enableRootAccess) = prefs.edit().putBoolean(ENABLE_ROOT_ACCESS, enableRootAccess).apply()
|
set(enableRootAccess) = prefs.edit().putBoolean(ENABLE_ROOT_ACCESS, enableRootAccess).apply()
|
||||||
|
|
||||||
var lsHasHardLinksColumn: Boolean
|
|
||||||
get() = prefs.getBoolean(LS_HAS_HARD_LINKS_COLUMN, false)
|
|
||||||
set(lsHasHardLinksColumn) = prefs.edit().putBoolean(LS_HAS_HARD_LINKS_COLUMN, lsHasHardLinksColumn).apply()
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package com.simplemobiletools.filemanager.helpers
|
package com.simplemobiletools.filemanager.helpers
|
||||||
|
|
||||||
import android.text.TextUtils
|
|
||||||
import com.simplemobiletools.commons.extensions.areDigitsOnly
|
import com.simplemobiletools.commons.extensions.areDigitsOnly
|
||||||
import com.simplemobiletools.commons.extensions.showErrorToast
|
import com.simplemobiletools.commons.extensions.showErrorToast
|
||||||
import com.simplemobiletools.commons.models.FileDirItem
|
import com.simplemobiletools.commons.models.FileDirItem
|
||||||
@ -8,13 +7,13 @@ import com.simplemobiletools.filemanager.activities.SimpleActivity
|
|||||||
import com.simplemobiletools.filemanager.extensions.config
|
import com.simplemobiletools.filemanager.extensions.config
|
||||||
import com.stericson.RootShell.execution.Command
|
import com.stericson.RootShell.execution.Command
|
||||||
import com.stericson.RootTools.RootTools
|
import com.stericson.RootTools.RootTools
|
||||||
|
import java.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class RootHelpers {
|
class RootHelpers {
|
||||||
fun askRootIFNeeded(activity: SimpleActivity, callback: (success: Boolean) -> Unit) {
|
fun askRootIfNeeded(activity: SimpleActivity, callback: (success: Boolean) -> Unit) {
|
||||||
val command = object : Command(0, "ls -la | awk '{ print $2 }'") {
|
val command = object : Command(0, "ls -lA") {
|
||||||
override fun commandOutput(id: Int, line: String) {
|
override fun commandOutput(id: Int, line: String) {
|
||||||
activity.config.lsHasHardLinksColumn = line.areDigitsOnly()
|
|
||||||
callback(true)
|
callback(true)
|
||||||
super.commandOutput(id, line)
|
super.commandOutput(id, line)
|
||||||
}
|
}
|
||||||
@ -28,43 +27,96 @@ class RootHelpers {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getFiles(activity: SimpleActivity, path: String, callback: (fileDirItems: ArrayList<FileDirItem>) -> Unit) {
|
fun getFiles(activity: SimpleActivity, path: String, callback: (originalPath: String, fileDirItems: ArrayList<FileDirItem>) -> Unit) {
|
||||||
val files = ArrayList<FileDirItem>()
|
val files = ArrayList<FileDirItem>()
|
||||||
val showHidden = activity.config.shouldShowHidden
|
val hiddenArgument = if (activity.config.shouldShowHidden) "-A " else ""
|
||||||
val sizeColumnIndex = if (activity.config.lsHasHardLinksColumn) 5 else 4
|
val cmd = "ls $hiddenArgument$path"
|
||||||
|
|
||||||
val cmd = "ls -la $path | awk '{ system(\"echo \"\$1\" \"\$$sizeColumnIndex\" `find ${path.trimEnd('/')}/\"\$NF\" -mindepth 1 -maxdepth 1 | wc -l` \"\$NF\" \")}'"
|
|
||||||
val command = object : Command(0, cmd) {
|
val command = object : Command(0, cmd) {
|
||||||
override fun commandOutput(id: Int, line: String) {
|
override fun commandOutput(id: Int, line: String) {
|
||||||
val parts = line.split(" ")
|
val file = File(path, line)
|
||||||
if (parts.size >= 4) {
|
val isDirectory = file.isDirectory
|
||||||
val permissions = parts[0].trim()
|
val fileDirItem = FileDirItem(file.absolutePath, line, isDirectory, 0, 0)
|
||||||
val isDirectory = permissions.startsWith("d")
|
|
||||||
val isFile = permissions.startsWith("-")
|
|
||||||
val size = if (isFile) parts[1].trim() else "0"
|
|
||||||
val childrenCnt = if (isFile) "0" else parts[2].trim()
|
|
||||||
val filename = TextUtils.join(" ", parts.subList(3, parts.size)).trimStart('/')
|
|
||||||
|
|
||||||
if ((!showHidden && filename.startsWith(".")) || (!isDirectory && !isFile) || !size.areDigitsOnly() || !childrenCnt.areDigitsOnly()) {
|
|
||||||
super.commandOutput(id, line)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val fileSize = size.toLong()
|
|
||||||
val filePath = "${path.trimEnd('/')}/$filename"
|
|
||||||
val fileDirItem = FileDirItem(filePath, filename, isDirectory, childrenCnt.toInt(), fileSize)
|
|
||||||
files.add(fileDirItem)
|
files.add(fileDirItem)
|
||||||
}
|
|
||||||
|
|
||||||
super.commandOutput(id, line)
|
super.commandOutput(id, line)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun commandCompleted(id: Int, exitcode: Int) {
|
override fun commandCompleted(id: Int, exitcode: Int) {
|
||||||
callback(files)
|
getChildrenCount(activity, files, path, callback)
|
||||||
super.commandCompleted(id, exitcode)
|
super.commandCompleted(id, exitcode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
runCommand(activity, command)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getChildrenCount(activity: SimpleActivity, files: ArrayList<FileDirItem>, path: String, callback: (originalPath: String, fileDirItems: ArrayList<FileDirItem>) -> Unit) {
|
||||||
|
val hiddenArgument = if (activity.config.shouldShowHidden) "-A " else ""
|
||||||
|
var cmd = ""
|
||||||
|
files.forEach {
|
||||||
|
cmd += if (it.isDirectory) {
|
||||||
|
"ls $hiddenArgument${it.path} |wc -l;"
|
||||||
|
} else {
|
||||||
|
"echo 0;"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cmd = cmd.trimEnd(';') + " | cat"
|
||||||
|
|
||||||
|
val lines = ArrayList<String>()
|
||||||
|
val command = object : Command(0, cmd) {
|
||||||
|
override fun commandOutput(id: Int, line: String) {
|
||||||
|
lines.add(line)
|
||||||
|
super.commandOutput(id, line)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun commandCompleted(id: Int, exitcode: Int) {
|
||||||
|
files.forEachIndexed { index, fileDirItem ->
|
||||||
|
val childrenCount = lines[index]
|
||||||
|
if (childrenCount.areDigitsOnly()) {
|
||||||
|
fileDirItem.children = childrenCount.toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getFileSizes(activity, files, path, callback)
|
||||||
|
super.commandCompleted(id, exitcode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
runCommand(activity, command)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getFileSizes(activity: SimpleActivity, files: ArrayList<FileDirItem>, path: String, callback: (originalPath: String, fileDirItems: ArrayList<FileDirItem>) -> Unit) {
|
||||||
|
var cmd = ""
|
||||||
|
files.forEach {
|
||||||
|
cmd += if (it.isDirectory) {
|
||||||
|
"echo 0;"
|
||||||
|
} else {
|
||||||
|
"stat -c %s ${it.path};"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val lines = ArrayList<String>()
|
||||||
|
val command = object : Command(0, cmd) {
|
||||||
|
override fun commandOutput(id: Int, line: String) {
|
||||||
|
lines.add(line)
|
||||||
|
super.commandOutput(id, line)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun commandCompleted(id: Int, exitcode: Int) {
|
||||||
|
files.forEachIndexed { index, fileDirItem ->
|
||||||
|
val childrenCount = lines[index]
|
||||||
|
if (childrenCount.areDigitsOnly()) {
|
||||||
|
fileDirItem.size = childrenCount.toLong()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
callback(path, files)
|
||||||
|
super.commandCompleted(id, exitcode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
runCommand(activity, command)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun runCommand(activity: SimpleActivity, command: Command) {
|
||||||
try {
|
try {
|
||||||
RootTools.getShell(true).add(command)
|
RootTools.getShell(true).add(command)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
Reference in New Issue
Block a user