diff --git a/app/src/main/java/com/simplemobiletools/filemanager/Config.java b/app/src/main/java/com/simplemobiletools/filemanager/Config.java index 2d54aefc..927a535b 100644 --- a/app/src/main/java/com/simplemobiletools/filemanager/Config.java +++ b/app/src/main/java/com/simplemobiletools/filemanager/Config.java @@ -37,4 +37,12 @@ public class Config { public void setShowHidden(boolean show) { mPrefs.edit().putBoolean(Constants.SHOW_HIDDEN, show).apply(); } + + public String getTreeUri() { + return mPrefs.getString(Constants.TREE_URI, ""); + } + + public void setTreeUri(String uri) { + mPrefs.edit().putString(Constants.TREE_URI, uri).apply(); + } } diff --git a/app/src/main/java/com/simplemobiletools/filemanager/Constants.java b/app/src/main/java/com/simplemobiletools/filemanager/Constants.java index 30f531a7..4e9d0cc2 100644 --- a/app/src/main/java/com/simplemobiletools/filemanager/Constants.java +++ b/app/src/main/java/com/simplemobiletools/filemanager/Constants.java @@ -2,6 +2,7 @@ package com.simplemobiletools.filemanager; public class Constants { public static final String PATH = "path"; + public static final String TREE_URI = "tree_uri"; // shared preferences public static final String PREFS_KEY = "File Manager"; diff --git a/app/src/main/java/com/simplemobiletools/filemanager/Utils.kt b/app/src/main/java/com/simplemobiletools/filemanager/Utils.kt index fe969f89..59e18dc1 100644 --- a/app/src/main/java/com/simplemobiletools/filemanager/Utils.kt +++ b/app/src/main/java/com/simplemobiletools/filemanager/Utils.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.pm.PackageManager import android.support.v4.content.ContextCompat import android.widget.Toast +import com.simplemobiletools.filepicker.extensions.getSDCardPath import java.util.regex.Pattern object Utils { @@ -29,4 +30,8 @@ object Utils { val matcher = pattern.matcher(name) return matcher.matches() } + + fun isPathOnSD(context: Context, path: String): Boolean { + return path.startsWith(context.getSDCardPath()) + } } 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 07ad43a8..da93bd8d 100644 --- a/app/src/main/java/com/simplemobiletools/filemanager/fragments/ItemsFragment.java +++ b/app/src/main/java/com/simplemobiletools/filemanager/fragments/ItemsFragment.java @@ -137,7 +137,7 @@ public class ItemsFragment extends android.support.v4.app.Fragment if (files != null) { for (File file : files) { final String curPath = file.getAbsolutePath(); - final String curName = Utils.getFilename(curPath); + final String curName = Utils.INSTANCE.getFilename(curPath); if (!mShowHidden && curName.startsWith(".")) continue; @@ -181,7 +181,7 @@ public class ItemsFragment extends android.support.v4.app.Fragment } else { final String path = item.getPath(); final File file = new File(path); - String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(Utils.getFileExtension(path)); + String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(Utils.INSTANCE.getFileExtension(path)); if (mimeType == null) mimeType = "text/plain"; @@ -192,7 +192,7 @@ public class ItemsFragment extends android.support.v4.app.Fragment startActivity(intent); } catch (ActivityNotFoundException e) { if (!tryGenericMimeType(intent, mimeType, file)) { - Utils.showToast(getContext(), R.string.no_app_found); + Utils.INSTANCE.showToast(getContext(), R.string.no_app_found); } } } @@ -302,7 +302,7 @@ public class ItemsFragment extends android.support.v4.app.Fragment } if (uris.isEmpty()) { - Utils.showToast(getContext(), R.string.no_files_selected); + Utils.INSTANCE.showToast(getContext(), R.string.no_files_selected); return; } @@ -493,7 +493,7 @@ public class ItemsFragment extends android.support.v4.app.Fragment @Override public void copyFailed() { - Utils.showToast(getContext(), R.string.copy_failed); + Utils.INSTANCE.showToast(getContext(), R.string.copy_failed); } public interface ItemInteractionListener { 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 5788cccf..5c229fbb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/activities/MainActivity.kt @@ -1,8 +1,11 @@ package com.simplemobiletools.filemanager.activities import android.Manifest +import android.annotation.TargetApi +import android.app.Activity import android.content.Intent import android.content.pm.PackageManager +import android.os.Build import android.os.Bundle import android.os.Handler import android.support.v4.app.ActivityCompat @@ -14,11 +17,14 @@ import com.simplemobiletools.filemanager.Utils 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.models.FileDirItem import com.simplemobiletools.filepicker.views.Breadcrumbs import kotlinx.android.synthetic.main.activity_main.* +import java.io.File class MainActivity : SimpleActivity(), ItemsFragment.ItemInteractionListener, Breadcrumbs.BreadcrumbsListener { + val OPEN_DOCUMENT_TREE = 1 var mBasePath = getInternalStoragePath() override fun onCreate(savedInstanceState: Bundle?) { @@ -112,8 +118,7 @@ class MainActivity : SimpleActivity(), ItemsFragment.ItemInteractionListener, Br if (id == 0) { StoragePickerDialog(this@MainActivity, mBasePath, object : StoragePickerDialog.OnStoragePickerListener { override fun onPick(pickedPath: String) { - mBasePath = pickedPath - openPath(pickedPath) + changePath(pickedPath) } }) } else { @@ -122,6 +127,41 @@ class MainActivity : SimpleActivity(), ItemsFragment.ItemInteractionListener, Br } } + fun changePath(pickedPath: String) { + if (checkStupidAndroidFiveSDCardWritePermission(pickedPath)) { + mBasePath = pickedPath + openPath(pickedPath) + } + } + + fun checkStupidAndroidFiveSDCardWritePermission(pickedPath: String): Boolean { + val file = File(pickedPath) + return if (!file.canWrite() && Utils.isPathOnSD(applicationContext, pickedPath) && mConfig.treeUri.isEmpty()) { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + startActivityForResult(intent, OPEN_DOCUMENT_TREE) + false + } else + true + } + + @TargetApi(Build.VERSION_CODES.KITKAT) + public override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + if (requestCode == OPEN_DOCUMENT_TREE) { + if (resultCode == Activity.RESULT_OK && resultData != null) { + val treeUri = resultData.data + mConfig.treeUri = resultData.data.toString() + + val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION + contentResolver.takePersistableUriPermission(treeUri, takeFlags) + + changePath(getSDCardPath()) + } else { + changePath(getInternalStoragePath()) + } + } + } + companion object { private val STORAGE_PERMISSION = 1 private val BACK_PRESS_TIMEOUT = 5000