From 1d8c45643f9c9f1f3ff5f8a5ada1e509efbc33ea Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 11 Nov 2016 22:40:12 +0100 Subject: [PATCH] move a couple helper function to extensions --- .../simplemobiletools/filemanager/Utils.kt | 41 ++----------------- .../filemanager/asynctasks/CopyTask.kt | 25 ++++++----- .../filemanager/fragments/ItemsFragment.java | 2 +- .../filemanager/activities/MainActivity.kt | 12 +++--- .../filemanager/dialogs/CopyDialog.kt | 14 +++---- .../dialogs/CreateNewItemDialog.kt | 17 ++++---- .../filemanager/dialogs/RenameItemDialog.kt | 18 ++++---- .../filemanager/extensions/context.kt | 21 ---------- .../filemanager/extensions/string.kt | 9 ++++ 9 files changed, 59 insertions(+), 100 deletions(-) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/context.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/string.kt diff --git a/app/src/main/java/com/simplemobiletools/filemanager/Utils.kt b/app/src/main/java/com/simplemobiletools/filemanager/Utils.kt index 71bfee12..84f83848 100644 --- a/app/src/main/java/com/simplemobiletools/filemanager/Utils.kt +++ b/app/src/main/java/com/simplemobiletools/filemanager/Utils.kt @@ -1,16 +1,9 @@ package com.simplemobiletools.filemanager -import android.Manifest import android.content.Context -import android.content.pm.PackageManager -import android.net.Uri -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.getFileDocument +import com.simplemobiletools.filepicker.extensions.needsStupidWritePermissions import com.simplemobiletools.filepicker.extensions.toast -import java.util.regex.Pattern class Utils { companion object { @@ -26,34 +19,8 @@ class Utils { context.toast(resId) } - fun hasStoragePermission(cxt: Context): Boolean { - return ContextCompat.checkSelfPermission(cxt, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED - } + fun needsStupidWritePermissions(context: Context, path: String) = context.needsStupidWritePermissions(path) - fun isNameValid(name: String): Boolean { - 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 - } + fun getFileDocument(context: Context, path: String, treeUri: String) = context.getFileDocument(path, treeUri) } } diff --git a/app/src/main/java/com/simplemobiletools/filemanager/asynctasks/CopyTask.kt b/app/src/main/java/com/simplemobiletools/filemanager/asynctasks/CopyTask.kt index 706b0a0e..cf45a42d 100644 --- a/app/src/main/java/com/simplemobiletools/filemanager/asynctasks/CopyTask.kt +++ b/app/src/main/java/com/simplemobiletools/filemanager/asynctasks/CopyTask.kt @@ -4,9 +4,11 @@ import android.content.Context import android.os.AsyncTask import android.support.v4.util.Pair import android.util.Log -import com.simplemobiletools.filemanager.Utils -import com.simplemobiletools.filemanager.extensions.rescanItem +import com.simplemobiletools.filemanager.Config 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.lang.ref.WeakReference 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 var mListener: WeakReference? = null private var mMovedFiles: ArrayList + private var mConfig: Config init { mListener = WeakReference(listener) mMovedFiles = arrayListOf() + mConfig = Config.newInstance(context) } override fun doInBackground(vararg params: Pair, File>): Boolean? { @@ -39,8 +43,8 @@ class CopyTask(listener: CopyTask.CopyListener, val context: Context, val delete if (deleteAfterCopy) { for (file in mMovedFiles) { - if (Utils.needsStupidWritePermissions(context, file.absolutePath)) { - Utils.getFileDocument(context, file.absolutePath).delete() + if (context.needsStupidWritePermissions(file.absolutePath)) { + context.getFileDocument(file.absolutePath, mConfig.treeUri) } else { file.delete() } @@ -60,8 +64,8 @@ class CopyTask(listener: CopyTask.CopyListener, val context: Context, val delete private fun copyDirectory(source: File, destination: File) { if (!destination.exists()) { - if (Utils.needsStupidWritePermissions(context, destination.absolutePath)) { - val document = Utils.getFileDocument(context, destination.absolutePath) + if (context.needsStupidWritePermissions(destination.absolutePath)) { + val document = context.getFileDocument(destination.absolutePath, mConfig.treeUri) document.createDirectory(destination.name) } else if (!destination.mkdirs()) { 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() for (child in children) { val newFile = File(source, child) - if (Utils.needsStupidWritePermissions(context, destination.absolutePath)) { + if (context.needsStupidWritePermissions(destination.absolutePath)) { if (newFile.isDirectory) { copyDirectory(newFile, File(destination, child)) } else { - var document = Utils.getFileDocument(context, destination.absolutePath) + var document = context.getFileDocument(destination.absolutePath, mConfig.treeUri) document = document.createFile("", child) val inputStream = FileInputStream(newFile) @@ -98,9 +102,10 @@ class CopyTask(listener: CopyTask.CopyListener, val context: Context, val delete val inputStream = FileInputStream(source) val out: OutputStream? - if (Utils.needsStupidWritePermissions(context, destination.absolutePath)) { - var document = Utils.getFileDocument(context, destination.absolutePath) + if (context.needsStupidWritePermissions(destination.absolutePath)) { + var document = context.getFileDocument(destination.absolutePath, mConfig.treeUri) document = document.createFile("", destination.name) + out = context.contentResolver.openOutputStream(document.uri) } else { out = FileOutputStream(destination) diff --git a/app/src/main/java/com/simplemobiletools/filemanager/fragments/ItemsFragment.java b/app/src/main/java/com/simplemobiletools/filemanager/fragments/ItemsFragment.java index 651138e6..d9a90a03 100644 --- a/app/src/main/java/com/simplemobiletools/filemanager/fragments/ItemsFragment.java +++ b/app/src/main/java/com/simplemobiletools/filemanager/fragments/ItemsFragment.java @@ -472,7 +472,7 @@ public class ItemsFragment extends android.support.v4.app.Fragment } 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(); } else { item.delete(); diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/MainActivity.kt index de11df4c..3fd9661e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/MainActivity.kt @@ -13,12 +13,10 @@ import android.view.Menu import android.view.MenuItem import com.simplemobiletools.filemanager.Constants import com.simplemobiletools.filemanager.R -import com.simplemobiletools.filemanager.Utils import com.simplemobiletools.filemanager.dialogs.WritePermissionDialog import com.simplemobiletools.filemanager.fragments.ItemsFragment import com.simplemobiletools.filepicker.dialogs.StoragePickerDialog -import com.simplemobiletools.filepicker.extensions.getInternalStoragePath -import com.simplemobiletools.filepicker.extensions.getSDCardPath +import com.simplemobiletools.filepicker.extensions.* import com.simplemobiletools.filepicker.models.FileDirItem import com.simplemobiletools.filepicker.views.Breadcrumbs import kotlinx.android.synthetic.main.activity_main.* @@ -39,7 +37,7 @@ class MainActivity : SimpleActivity(), ItemsFragment.ItemInteractionListener, Br } private fun tryInitFileManager() { - if (Utils.hasStoragePermission(applicationContext)) { + if (hasStoragePermission(applicationContext)) { initRootFileManager() } else { 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 (!mWasBackJustPressed) { mWasBackJustPressed = true - Utils.showToast(applicationContext, R.string.press_back_again) + toast(R.string.press_back_again) Handler().postDelayed({ mWasBackJustPressed = false }, BACK_PRESS_TIMEOUT.toLong()) } else { finish() @@ -103,7 +101,7 @@ class MainActivity : SimpleActivity(), ItemsFragment.ItemInteractionListener, Br if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { initRootFileManager() } else { - Utils.showToast(applicationContext, R.string.no_permissions) + toast(R.string.no_permissions) finish() } } @@ -134,7 +132,7 @@ class MainActivity : SimpleActivity(), ItemsFragment.ItemInteractionListener, Br } 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 { override fun onConfirmed() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CopyDialog.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CopyDialog.kt index cf94734d..81f9e292 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CopyDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CopyDialog.kt @@ -8,14 +8,10 @@ import android.view.LayoutInflater import android.view.WindowManager import com.simplemobiletools.filemanager.Config import com.simplemobiletools.filemanager.R -import com.simplemobiletools.filemanager.Utils import com.simplemobiletools.filemanager.activities.MainActivity 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.extensions.humanizePath +import com.simplemobiletools.filepicker.extensions.* import kotlinx.android.synthetic.main.copy_item.view.* import java.io.File @@ -28,8 +24,8 @@ class CopyDialog(val activity: Activity, val files: List, val copyListener var destinationPath = "" view.source.text = "${context.humanizePath(sourcePath)}/" + val config = Config.newInstance(context) view.destination.setOnClickListener { - val config = Config.newInstance(context) FilePickerDialog(activity, destinationPath, false, config.showHidden, object : FilePickerDialog.OnFilePickerListener { override fun onFail(error: FilePickerDialog.FilePickerResult) { } @@ -74,7 +70,7 @@ class CopyDialog(val activity: Activity, val files: List, val copyListener } } - if (Utils.needsStupidWritePermissions(context, destinationPath) && Config.newInstance(context).treeUri.isEmpty()) { + if (context.needsStupidWritePermissions(destinationPath) && config.treeUri.isEmpty()) { WritePermissionDialog(activity, object : WritePermissionDialog.OnWritePermissionListener { override fun onConfirmed() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) @@ -96,8 +92,8 @@ class CopyDialog(val activity: Activity, val files: List, val copyListener CopyTask(copyListener, context, true).execute(pair) dismiss() } else { - for (f in files) { - val destination = File(destinationDir, f.name) + for (file in files) { + val destination = File(destinationDir, file.name) context.rescanItem(destination) } diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CreateNewItemDialog.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CreateNewItemDialog.kt index e063fd29..26d07ebe 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CreateNewItemDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/CreateNewItemDialog.kt @@ -5,10 +5,13 @@ import android.support.v7.app.AlertDialog import android.view.LayoutInflater import android.view.View import android.view.WindowManager +import com.simplemobiletools.filemanager.Config import com.simplemobiletools.filemanager.R -import com.simplemobiletools.filemanager.Utils -import com.simplemobiletools.filemanager.extensions.toast +import com.simplemobiletools.filemanager.extensions.isValidFilename 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 java.io.File import java.io.IOException @@ -29,7 +32,7 @@ class CreateNewItemDialog(val context: Context, val path: String, val listener: val name = view.item_name.value if (name.isEmpty()) { context.toast(R.string.empty_name) - } else if (Utils.isNameValid(name)) { + } else if (name.isValidFilename()) { val file = File(path, name) if (file.exists()) { 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 { - return if (Utils.needsStupidWritePermissions(context, path)) { - val documentFile = Utils.getFileDocument(context, file.absolutePath) + return if (context.needsStupidWritePermissions(path)) { + val documentFile = context.getFileDocument(file.absolutePath, Config.newInstance(context).treeUri) documentFile.createDirectory(file.name) success(alertDialog) true @@ -71,8 +74,8 @@ class CreateNewItemDialog(val context: Context, val path: String, val listener: private fun createFile(file: File, alertDialog: AlertDialog): Boolean { try { - if (Utils.needsStupidWritePermissions(context, path)) { - val documentFile = Utils.getFileDocument(context, file.absolutePath) + if (context.needsStupidWritePermissions(path)) { + val documentFile = context.getFileDocument(file.absolutePath, Config.newInstance(context).treeUri) documentFile.createFile("", file.name) success(alertDialog) return true diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/RenameItemDialog.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/RenameItemDialog.kt index e1864bed..eec655e5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/RenameItemDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/dialogs/RenameItemDialog.kt @@ -1,15 +1,17 @@ package com.simplemobiletools.filemanager.dialogs import android.content.Context -import android.media.MediaScannerConnection import android.support.v7.app.AlertDialog import android.view.LayoutInflater import android.view.WindowManager +import com.simplemobiletools.filemanager.Config import com.simplemobiletools.filemanager.R -import com.simplemobiletools.filemanager.Utils -import com.simplemobiletools.filemanager.extensions.rescanItem -import com.simplemobiletools.filemanager.extensions.toast +import com.simplemobiletools.filemanager.extensions.isValidFilename 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 kotlinx.android.synthetic.main.rename_item.view.* import java.io.File @@ -30,7 +32,7 @@ class RenameItemDialog(val context: Context, val path: String, val item: FileDir show() getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener({ val newName = view.item_name.value - if (Utils.isNameValid(newName)) { + if (newName.isValidFilename()) { val currFile = File(path, item.name) val newFile = File(path, newName) @@ -39,8 +41,8 @@ class RenameItemDialog(val context: Context, val path: String, val item: FileDir return@setOnClickListener } - if (Utils.needsStupidWritePermissions(context, path)) { - val document = Utils.getFileDocument(context, currFile.absolutePath) + if (context.needsStupidWritePermissions(path)) { + val document = context.getFileDocument(currFile.absolutePath, Config.newInstance(context).treeUri) if (document.canWrite()) document.renameTo(newName) 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) { + context.rescanItem(currFile) context.rescanItem(newFile) - MediaScannerConnection.scanFile(context, arrayOf(currFile.absolutePath, newFile.absolutePath), null, null) listener.onSuccess() } diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/context.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/context.kt deleted file mode 100644 index dc257a1a..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/context.kt +++ /dev/null @@ -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()) diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/string.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/string.kt new file mode 100644 index 00000000..9e95e1d9 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/extensions/string.kt @@ -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() +}