move a couple helper function to extensions

This commit is contained in:
tibbi 2016-11-11 22:40:12 +01:00
parent 0770c95791
commit 1d8c45643f
9 changed files with 59 additions and 100 deletions

View File

@ -1,16 +1,9 @@
package com.simplemobiletools.filemanager package com.simplemobiletools.filemanager
import android.Manifest
import android.content.Context import android.content.Context
import android.content.pm.PackageManager import com.simplemobiletools.filepicker.extensions.getFileDocument
import android.net.Uri import com.simplemobiletools.filepicker.extensions.needsStupidWritePermissions
import android.os.Build
import android.support.v4.content.ContextCompat
import android.support.v4.provider.DocumentFile
import com.simplemobiletools.filemanager.extensions.isPathOnSD
import com.simplemobiletools.filepicker.extensions.getSDCardPath
import com.simplemobiletools.filepicker.extensions.toast import com.simplemobiletools.filepicker.extensions.toast
import java.util.regex.Pattern
class Utils { class Utils {
companion object { companion object {
@ -26,34 +19,8 @@ class Utils {
context.toast(resId) context.toast(resId)
} }
fun hasStoragePermission(cxt: Context): Boolean { fun needsStupidWritePermissions(context: Context, path: String) = context.needsStupidWritePermissions(path)
return ContextCompat.checkSelfPermission(cxt, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
}
fun isNameValid(name: String): Boolean { fun getFileDocument(context: Context, path: String, treeUri: String) = context.getFileDocument(path, treeUri)
val pattern = Pattern.compile("^[-_.A-Za-z0-9()#& ]+$")
val matcher = pattern.matcher(name)
return matcher.matches()
}
fun needsStupidWritePermissions(context: Context, path: String) = isPathOnSD(context, path) && isKitkat() && !context.getSDCardPath().isEmpty()
fun isPathOnSD(context: Context, path: String): Boolean {
return context.isPathOnSD(path)
}
fun isKitkat() = Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT
fun getFileDocument(context: Context, path: String): DocumentFile {
val relativePath = path.substring(context.getSDCardPath().length + 1)
var document = DocumentFile.fromTreeUri(context, Uri.parse(Config.newInstance(context).treeUri))
val parts = relativePath.split("/")
for (part in parts) {
val currDocument = document.findFile(part)
if (currDocument != null)
document = currDocument
}
return document
}
} }
} }

View File

@ -4,9 +4,11 @@ import android.content.Context
import android.os.AsyncTask import android.os.AsyncTask
import android.support.v4.util.Pair import android.support.v4.util.Pair
import android.util.Log import android.util.Log
import com.simplemobiletools.filemanager.Utils import com.simplemobiletools.filemanager.Config
import com.simplemobiletools.filemanager.extensions.rescanItem
import com.simplemobiletools.filemanager.fragments.ItemsFragment import com.simplemobiletools.filemanager.fragments.ItemsFragment
import com.simplemobiletools.filepicker.extensions.getFileDocument
import com.simplemobiletools.filepicker.extensions.needsStupidWritePermissions
import com.simplemobiletools.filepicker.extensions.rescanItem
import java.io.* import java.io.*
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.* import java.util.*
@ -15,10 +17,12 @@ class CopyTask(listener: CopyTask.CopyListener, val context: Context, val delete
private val TAG = CopyTask::class.java.simpleName private val TAG = CopyTask::class.java.simpleName
private var mListener: WeakReference<CopyListener>? = null private var mListener: WeakReference<CopyListener>? = null
private var mMovedFiles: ArrayList<File> private var mMovedFiles: ArrayList<File>
private var mConfig: Config
init { init {
mListener = WeakReference(listener) mListener = WeakReference(listener)
mMovedFiles = arrayListOf() mMovedFiles = arrayListOf()
mConfig = Config.newInstance(context)
} }
override fun doInBackground(vararg params: Pair<List<File>, File>): Boolean? { override fun doInBackground(vararg params: Pair<List<File>, File>): Boolean? {
@ -39,8 +43,8 @@ class CopyTask(listener: CopyTask.CopyListener, val context: Context, val delete
if (deleteAfterCopy) { if (deleteAfterCopy) {
for (file in mMovedFiles) { for (file in mMovedFiles) {
if (Utils.needsStupidWritePermissions(context, file.absolutePath)) { if (context.needsStupidWritePermissions(file.absolutePath)) {
Utils.getFileDocument(context, file.absolutePath).delete() context.getFileDocument(file.absolutePath, mConfig.treeUri)
} else { } else {
file.delete() file.delete()
} }
@ -60,8 +64,8 @@ class CopyTask(listener: CopyTask.CopyListener, val context: Context, val delete
private fun copyDirectory(source: File, destination: File) { private fun copyDirectory(source: File, destination: File) {
if (!destination.exists()) { if (!destination.exists()) {
if (Utils.needsStupidWritePermissions(context, destination.absolutePath)) { if (context.needsStupidWritePermissions(destination.absolutePath)) {
val document = Utils.getFileDocument(context, destination.absolutePath) val document = context.getFileDocument(destination.absolutePath, mConfig.treeUri)
document.createDirectory(destination.name) document.createDirectory(destination.name)
} else if (!destination.mkdirs()) { } else if (!destination.mkdirs()) {
throw IOException("Could not create dir ${destination.absolutePath}") throw IOException("Could not create dir ${destination.absolutePath}")
@ -71,11 +75,11 @@ class CopyTask(listener: CopyTask.CopyListener, val context: Context, val delete
val children = source.list() val children = source.list()
for (child in children) { for (child in children) {
val newFile = File(source, child) val newFile = File(source, child)
if (Utils.needsStupidWritePermissions(context, destination.absolutePath)) { if (context.needsStupidWritePermissions(destination.absolutePath)) {
if (newFile.isDirectory) { if (newFile.isDirectory) {
copyDirectory(newFile, File(destination, child)) copyDirectory(newFile, File(destination, child))
} else { } else {
var document = Utils.getFileDocument(context, destination.absolutePath) var document = context.getFileDocument(destination.absolutePath, mConfig.treeUri)
document = document.createFile("", child) document = document.createFile("", child)
val inputStream = FileInputStream(newFile) val inputStream = FileInputStream(newFile)
@ -98,9 +102,10 @@ class CopyTask(listener: CopyTask.CopyListener, val context: Context, val delete
val inputStream = FileInputStream(source) val inputStream = FileInputStream(source)
val out: OutputStream? val out: OutputStream?
if (Utils.needsStupidWritePermissions(context, destination.absolutePath)) { if (context.needsStupidWritePermissions(destination.absolutePath)) {
var document = Utils.getFileDocument(context, destination.absolutePath) var document = context.getFileDocument(destination.absolutePath, mConfig.treeUri)
document = document.createFile("", destination.name) document = document.createFile("", destination.name)
out = context.contentResolver.openOutputStream(document.uri) out = context.contentResolver.openOutputStream(document.uri)
} else { } else {
out = FileOutputStream(destination) out = FileOutputStream(destination)

View File

@ -472,7 +472,7 @@ public class ItemsFragment extends android.support.v4.app.Fragment
} }
if (Utils.Companion.needsStupidWritePermissions(getContext(), item.getAbsolutePath())) { if (Utils.Companion.needsStupidWritePermissions(getContext(), item.getAbsolutePath())) {
final DocumentFile document = Utils.Companion.getFileDocument(getContext(), item.getAbsolutePath()); final DocumentFile document = Utils.Companion.getFileDocument(getContext(), item.getAbsolutePath(), mConfig.getTreeUri());
document.delete(); document.delete();
} else { } else {
item.delete(); item.delete();

View File

@ -13,12 +13,10 @@ import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import com.simplemobiletools.filemanager.Constants import com.simplemobiletools.filemanager.Constants
import com.simplemobiletools.filemanager.R import com.simplemobiletools.filemanager.R
import com.simplemobiletools.filemanager.Utils
import com.simplemobiletools.filemanager.dialogs.WritePermissionDialog import com.simplemobiletools.filemanager.dialogs.WritePermissionDialog
import com.simplemobiletools.filemanager.fragments.ItemsFragment import com.simplemobiletools.filemanager.fragments.ItemsFragment
import com.simplemobiletools.filepicker.dialogs.StoragePickerDialog import com.simplemobiletools.filepicker.dialogs.StoragePickerDialog
import com.simplemobiletools.filepicker.extensions.getInternalStoragePath import com.simplemobiletools.filepicker.extensions.*
import com.simplemobiletools.filepicker.extensions.getSDCardPath
import com.simplemobiletools.filepicker.models.FileDirItem import com.simplemobiletools.filepicker.models.FileDirItem
import com.simplemobiletools.filepicker.views.Breadcrumbs import com.simplemobiletools.filepicker.views.Breadcrumbs
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.*
@ -39,7 +37,7 @@ class MainActivity : SimpleActivity(), ItemsFragment.ItemInteractionListener, Br
} }
private fun tryInitFileManager() { private fun tryInitFileManager() {
if (Utils.hasStoragePermission(applicationContext)) { if (hasStoragePermission(applicationContext)) {
initRootFileManager() initRootFileManager()
} else { } else {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), STORAGE_PERMISSION) ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), STORAGE_PERMISSION)
@ -84,7 +82,7 @@ class MainActivity : SimpleActivity(), ItemsFragment.ItemInteractionListener, Br
if (breadcrumbs.childCount <= 1) { if (breadcrumbs.childCount <= 1) {
if (!mWasBackJustPressed) { if (!mWasBackJustPressed) {
mWasBackJustPressed = true mWasBackJustPressed = true
Utils.showToast(applicationContext, R.string.press_back_again) toast(R.string.press_back_again)
Handler().postDelayed({ mWasBackJustPressed = false }, BACK_PRESS_TIMEOUT.toLong()) Handler().postDelayed({ mWasBackJustPressed = false }, BACK_PRESS_TIMEOUT.toLong())
} else { } else {
finish() finish()
@ -103,7 +101,7 @@ class MainActivity : SimpleActivity(), ItemsFragment.ItemInteractionListener, Br
if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initRootFileManager() initRootFileManager()
} else { } else {
Utils.showToast(applicationContext, R.string.no_permissions) toast(R.string.no_permissions)
finish() finish()
} }
} }
@ -134,7 +132,7 @@ class MainActivity : SimpleActivity(), ItemsFragment.ItemInteractionListener, Br
} }
fun checkStupidAndroidFiveSDCardWritePermission(pickedPath: String): Boolean { fun checkStupidAndroidFiveSDCardWritePermission(pickedPath: String): Boolean {
return if (Utils.needsStupidWritePermissions(applicationContext, pickedPath) && mConfig.treeUri.isEmpty()) { return if (applicationContext.needsStupidWritePermissions(pickedPath) && mConfig.treeUri.isEmpty()) {
WritePermissionDialog(this, object : WritePermissionDialog.OnWritePermissionListener { WritePermissionDialog(this, object : WritePermissionDialog.OnWritePermissionListener {
override fun onConfirmed() { override fun onConfirmed() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)

View File

@ -8,14 +8,10 @@ import android.view.LayoutInflater
import android.view.WindowManager import android.view.WindowManager
import com.simplemobiletools.filemanager.Config import com.simplemobiletools.filemanager.Config
import com.simplemobiletools.filemanager.R import com.simplemobiletools.filemanager.R
import com.simplemobiletools.filemanager.Utils
import com.simplemobiletools.filemanager.activities.MainActivity import com.simplemobiletools.filemanager.activities.MainActivity
import com.simplemobiletools.filemanager.asynctasks.CopyTask import com.simplemobiletools.filemanager.asynctasks.CopyTask
import com.simplemobiletools.filemanager.extensions.isPathOnSD
import com.simplemobiletools.filemanager.extensions.rescanItem
import com.simplemobiletools.filemanager.extensions.toast
import com.simplemobiletools.filepicker.dialogs.FilePickerDialog import com.simplemobiletools.filepicker.dialogs.FilePickerDialog
import com.simplemobiletools.filepicker.extensions.humanizePath import com.simplemobiletools.filepicker.extensions.*
import kotlinx.android.synthetic.main.copy_item.view.* import kotlinx.android.synthetic.main.copy_item.view.*
import java.io.File import java.io.File
@ -28,8 +24,8 @@ class CopyDialog(val activity: Activity, val files: List<File>, val copyListener
var destinationPath = "" var destinationPath = ""
view.source.text = "${context.humanizePath(sourcePath)}/" view.source.text = "${context.humanizePath(sourcePath)}/"
val config = Config.newInstance(context)
view.destination.setOnClickListener { view.destination.setOnClickListener {
val config = Config.newInstance(context)
FilePickerDialog(activity, destinationPath, false, config.showHidden, object : FilePickerDialog.OnFilePickerListener { FilePickerDialog(activity, destinationPath, false, config.showHidden, object : FilePickerDialog.OnFilePickerListener {
override fun onFail(error: FilePickerDialog.FilePickerResult) { override fun onFail(error: FilePickerDialog.FilePickerResult) {
} }
@ -74,7 +70,7 @@ class CopyDialog(val activity: Activity, val files: List<File>, val copyListener
} }
} }
if (Utils.needsStupidWritePermissions(context, destinationPath) && Config.newInstance(context).treeUri.isEmpty()) { if (context.needsStupidWritePermissions(destinationPath) && config.treeUri.isEmpty()) {
WritePermissionDialog(activity, object : WritePermissionDialog.OnWritePermissionListener { WritePermissionDialog(activity, object : WritePermissionDialog.OnWritePermissionListener {
override fun onConfirmed() { override fun onConfirmed() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
@ -96,8 +92,8 @@ class CopyDialog(val activity: Activity, val files: List<File>, val copyListener
CopyTask(copyListener, context, true).execute(pair) CopyTask(copyListener, context, true).execute(pair)
dismiss() dismiss()
} else { } else {
for (f in files) { for (file in files) {
val destination = File(destinationDir, f.name) val destination = File(destinationDir, file.name)
context.rescanItem(destination) context.rescanItem(destination)
} }

View File

@ -5,10 +5,13 @@ import android.support.v7.app.AlertDialog
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.WindowManager import android.view.WindowManager
import com.simplemobiletools.filemanager.Config
import com.simplemobiletools.filemanager.R import com.simplemobiletools.filemanager.R
import com.simplemobiletools.filemanager.Utils import com.simplemobiletools.filemanager.extensions.isValidFilename
import com.simplemobiletools.filemanager.extensions.toast
import com.simplemobiletools.filemanager.extensions.value import com.simplemobiletools.filemanager.extensions.value
import com.simplemobiletools.filepicker.extensions.getFileDocument
import com.simplemobiletools.filepicker.extensions.needsStupidWritePermissions
import com.simplemobiletools.filepicker.extensions.toast
import kotlinx.android.synthetic.main.create_new.view.* import kotlinx.android.synthetic.main.create_new.view.*
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
@ -29,7 +32,7 @@ class CreateNewItemDialog(val context: Context, val path: String, val listener:
val name = view.item_name.value val name = view.item_name.value
if (name.isEmpty()) { if (name.isEmpty()) {
context.toast(R.string.empty_name) context.toast(R.string.empty_name)
} else if (Utils.isNameValid(name)) { } else if (name.isValidFilename()) {
val file = File(path, name) val file = File(path, name)
if (file.exists()) { if (file.exists()) {
context.toast(R.string.name_taken) context.toast(R.string.name_taken)
@ -53,8 +56,8 @@ class CreateNewItemDialog(val context: Context, val path: String, val listener:
} }
private fun createDirectory(file: File, alertDialog: AlertDialog): Boolean { private fun createDirectory(file: File, alertDialog: AlertDialog): Boolean {
return if (Utils.needsStupidWritePermissions(context, path)) { return if (context.needsStupidWritePermissions(path)) {
val documentFile = Utils.getFileDocument(context, file.absolutePath) val documentFile = context.getFileDocument(file.absolutePath, Config.newInstance(context).treeUri)
documentFile.createDirectory(file.name) documentFile.createDirectory(file.name)
success(alertDialog) success(alertDialog)
true true
@ -71,8 +74,8 @@ class CreateNewItemDialog(val context: Context, val path: String, val listener:
private fun createFile(file: File, alertDialog: AlertDialog): Boolean { private fun createFile(file: File, alertDialog: AlertDialog): Boolean {
try { try {
if (Utils.needsStupidWritePermissions(context, path)) { if (context.needsStupidWritePermissions(path)) {
val documentFile = Utils.getFileDocument(context, file.absolutePath) val documentFile = context.getFileDocument(file.absolutePath, Config.newInstance(context).treeUri)
documentFile.createFile("", file.name) documentFile.createFile("", file.name)
success(alertDialog) success(alertDialog)
return true return true

View File

@ -1,15 +1,17 @@
package com.simplemobiletools.filemanager.dialogs package com.simplemobiletools.filemanager.dialogs
import android.content.Context import android.content.Context
import android.media.MediaScannerConnection
import android.support.v7.app.AlertDialog import android.support.v7.app.AlertDialog
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.WindowManager import android.view.WindowManager
import com.simplemobiletools.filemanager.Config
import com.simplemobiletools.filemanager.R import com.simplemobiletools.filemanager.R
import com.simplemobiletools.filemanager.Utils import com.simplemobiletools.filemanager.extensions.isValidFilename
import com.simplemobiletools.filemanager.extensions.rescanItem
import com.simplemobiletools.filemanager.extensions.toast
import com.simplemobiletools.filemanager.extensions.value import com.simplemobiletools.filemanager.extensions.value
import com.simplemobiletools.filepicker.extensions.getFileDocument
import com.simplemobiletools.filepicker.extensions.needsStupidWritePermissions
import com.simplemobiletools.filepicker.extensions.rescanItem
import com.simplemobiletools.filepicker.extensions.toast
import com.simplemobiletools.filepicker.models.FileDirItem import com.simplemobiletools.filepicker.models.FileDirItem
import kotlinx.android.synthetic.main.rename_item.view.* import kotlinx.android.synthetic.main.rename_item.view.*
import java.io.File import java.io.File
@ -30,7 +32,7 @@ class RenameItemDialog(val context: Context, val path: String, val item: FileDir
show() show()
getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener({ getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener({
val newName = view.item_name.value val newName = view.item_name.value
if (Utils.isNameValid(newName)) { if (newName.isValidFilename()) {
val currFile = File(path, item.name) val currFile = File(path, item.name)
val newFile = File(path, newName) val newFile = File(path, newName)
@ -39,8 +41,8 @@ class RenameItemDialog(val context: Context, val path: String, val item: FileDir
return@setOnClickListener return@setOnClickListener
} }
if (Utils.needsStupidWritePermissions(context, path)) { if (context.needsStupidWritePermissions(path)) {
val document = Utils.getFileDocument(context, currFile.absolutePath) val document = context.getFileDocument(currFile.absolutePath, Config.newInstance(context).treeUri)
if (document.canWrite()) if (document.canWrite())
document.renameTo(newName) document.renameTo(newName)
sendSuccess(currFile, newFile) sendSuccess(currFile, newFile)
@ -61,8 +63,8 @@ class RenameItemDialog(val context: Context, val path: String, val item: FileDir
} }
private fun sendSuccess(currFile: File, newFile: File) { private fun sendSuccess(currFile: File, newFile: File) {
context.rescanItem(currFile)
context.rescanItem(newFile) context.rescanItem(newFile)
MediaScannerConnection.scanFile(context, arrayOf(currFile.absolutePath, newFile.absolutePath), null, null)
listener.onSuccess() listener.onSuccess()
} }

View File

@ -1,21 +0,0 @@
package com.simplemobiletools.filemanager.extensions
import android.content.Context
import android.media.MediaScannerConnection
import android.widget.Toast
import com.simplemobiletools.filepicker.extensions.getSDCardPath
import java.io.File
fun Context.toast(id: Int) = Toast.makeText(this, resources.getString(id), Toast.LENGTH_SHORT).show()
fun Context.rescanItem(item: File) {
if (item.isDirectory) {
for (child in item.listFiles()) {
rescanItem(child)
}
}
MediaScannerConnection.scanFile(this, arrayOf(item.absolutePath), null, null)
}
fun Context.isPathOnSD(path: String) = path.startsWith(getSDCardPath())

View File

@ -0,0 +1,9 @@
package com.simplemobiletools.filemanager.extensions
import java.util.regex.Pattern
fun String.isValidFilename(): Boolean {
val pattern = Pattern.compile("^[-_.A-Za-z0-9()#& ]+$")
val matcher = pattern.matcher(this)
return matcher.matches()
}