From 6f496dc5273f176f184969512010c5e0b719c2c8 Mon Sep 17 00:00:00 2001 From: saunak Date: Thu, 27 Aug 2020 02:52:21 +0530 Subject: [PATCH 1/7] Fix for displaying shortcuts for different files and the broadcast event listener. --- .../asynctasks/LoadFilesListTask.java | 51 ++++++------------- .../ui/activities/MainActivity.java | 2 +- .../filemanager/ui/views/drawer/Drawer.java | 3 -- 3 files changed, 17 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java index a4c9fd736c..85eaf4f074 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java @@ -22,7 +22,6 @@ import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.Date; @@ -51,6 +50,7 @@ import android.content.Context; import android.database.Cursor; +import android.net.Uri; import android.os.AsyncTask; import android.provider.MediaStore; import android.text.format.Formatter; @@ -302,26 +302,24 @@ private LayoutElementParcelable createListParcelables(HybridFileParcelable baseF private ArrayList listImages() { final String[] projection = {MediaStore.Images.Media.DATA}; - return listMediaCommon(projection, null); + return listMediaCommon(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null); } private ArrayList listVideos() { final String[] projection = {MediaStore.Video.Media.DATA}; - return listMediaCommon(projection, null); + return listMediaCommon(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, null); } private ArrayList listaudio() { String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; String[] projection = {MediaStore.Audio.Media.DATA}; - return listMediaCommon(projection, selection); + return listMediaCommon(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection); } private @NonNull ArrayList listMediaCommon( - @NonNull String[] projection, @Nullable String selection) { + Uri contentUri, @NonNull String[] projection, @Nullable String selection) { Cursor cursor = - context - .getContentResolver() - .query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection, null, null); + context.getContentResolver().query(contentUri, projection, selection, null, null); ArrayList retval = new ArrayList<>(); if (cursor == null) return retval; @@ -346,37 +344,20 @@ private ArrayList listDocs() { context .getContentResolver() .query(MediaStore.Files.getContentUri("external"), projection, null, null, null); - String[] types = - new String[] { - ".pdf", - ".xml", - ".html", - ".asm", - ".text/x-asm", - ".def", - ".in", - ".rc", - ".list", - ".log", - ".pl", - ".prop", - ".properties", - ".rc", - ".doc", - ".docx", - ".msg", - ".odt", - ".pages", - ".rtf", - ".txt", - ".wpd", - ".wps" - }; + if (cursor == null) return docs; else if (cursor.getCount() > 0 && cursor.moveToFirst()) { do { String path = cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA)); - if (path != null && Arrays.asList(types).contains(path)) { + + if (path != null + && (path.endsWith(".pdf") + || path.endsWith(".doc") + || path.endsWith(".docx") + || path.endsWith("txt") + || path.endsWith(".rtf") + || path.endsWith(".odt") + || path.endsWith(".html"))) { HybridFileParcelable strings = RootHelper.generateBaseFile(new File(path), showHiddenFiles); if (strings != null) { diff --git a/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java b/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java index c4771eb5ad..2e9df46674 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java +++ b/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java @@ -1219,7 +1219,7 @@ protected void onPause() { unregisterReceiver(mainActivityHelper.mNotificationReceiver); unregisterReceiver(receiver2); - if (SDK_INT >= Build.VERSION_CODES.KITKAT && SDK_INT < Build.VERSION_CODES.N) { + if (SDK_INT >= Build.VERSION_CODES.KITKAT) { unregisterReceiver(mOtgReceiver); } killToast(); diff --git a/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java b/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java index 33ae923492..af373d3dbb 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java +++ b/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java @@ -571,7 +571,6 @@ private void addNewItem( if (!mainActivity.getAppTheme().equals(AppTheme.LIGHT)) { imageView.setColorFilter(Color.WHITE); } - item.getActionView().setOnClickListener((view) -> onNavigationItemActionClick(item)); } } @@ -586,7 +585,6 @@ private void addNewItem( @DrawableRes Integer actionViewIcon) { if (BuildConfig.DEBUG && menu.findItem(order) != null) throw new IllegalStateException("Item already id exists: " + order); - MenuItem item = menu.add(group, order, order, text).setIcon(icon); dataUtils.putDrawerMetadata(item, meta); @@ -598,7 +596,6 @@ private void addNewItem( if (!mainActivity.getAppTheme().equals(AppTheme.LIGHT)) { imageView.setColorFilter(Color.WHITE); } - item.getActionView().setOnClickListener((view) -> onNavigationItemActionClick(item)); } } From b6ea0f9a4609a7e7994c7dc77c4e43e5830b1f72 Mon Sep 17 00:00:00 2001 From: saunak Date: Thu, 3 Sep 2020 21:34:03 +0530 Subject: [PATCH 2/7] Added missing file extensions for filtering non media files. --- .../asynctasks/LoadFilesListTask.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java index 85eaf4f074..898f36cd40 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java @@ -357,7 +357,23 @@ else if (cursor.getCount() > 0 && cursor.moveToFirst()) { || path.endsWith("txt") || path.endsWith(".rtf") || path.endsWith(".odt") - || path.endsWith(".html"))) { + || path.endsWith(".html") + || path.endsWith(".xml") + || path.endsWith(".text/x-asm") + || path.endsWith(".def") + || path.endsWith(".in") + || path.endsWith(".rc") + || path.endsWith(".list") + || path.endsWith(".log") + || path.endsWith(".pl") + || path.endsWith(".prop") + || path.endsWith(".properties") + || path.endsWith(".rc") + || path.endsWith(".msg") + || path.endsWith(".odt") + || path.endsWith(".pages") + || path.endsWith(".wpd") + || path.endsWith(".wps"))) { HybridFileParcelable strings = RootHelper.generateBaseFile(new File(path), showHiddenFiles); if (strings != null) { From f92f05c90cfd07f849c7162117428c3220c16397 Mon Sep 17 00:00:00 2001 From: TranceLove Date: Tue, 25 Aug 2020 23:18:19 +0800 Subject: [PATCH 3/7] Add support for writing Amaze's content URIs requiring root access Fixes #1966. Attempt to resolve content:// URIs used by Amaze as files that will need root access. - added FileUtils.fromContentUri() to resolve path to root files by simply cut off the prefixes - Modified WriteFileAbstraction and ReadFileTask to switch to root read/write mode as necessary --- .../asynchronous/asynctasks/ReadFileTask.java | 63 ++++++++++++------- .../asynctasks/WriteFileAbstraction.java | 58 +++++++++++------ .../filesystem/files/FileUtils.java | 11 ++++ 3 files changed, 90 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java index 5831a82fc3..73e7316e40 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java @@ -28,16 +28,20 @@ import java.io.InputStream; import java.io.InputStreamReader; +import com.amaze.filemanager.application.AppConfig; import com.amaze.filemanager.exceptions.ShellNotRunningException; import com.amaze.filemanager.exceptions.StreamNotFoundException; import com.amaze.filemanager.filesystem.EditableFileAbstraction; import com.amaze.filemanager.filesystem.HybridFileParcelable; +import com.amaze.filemanager.filesystem.files.FileUtils; import com.amaze.filemanager.utils.OnAsyncTaskFinished; import com.amaze.filemanager.utils.RootUtils; import android.content.ContentResolver; import android.os.AsyncTask; +import androidx.documentfile.provider.DocumentFile; + /** @author Emmanuel Messulam on 16/1/2018, at 18:05. */ public class ReadFileTask extends AsyncTask { @@ -78,7 +82,11 @@ protected ReturnedValues doInBackground(Void... params) { if (fileAbstraction.uri == null) throw new NullPointerException("Something went really wrong!"); - inputStream = contentResolver.openInputStream(fileAbstraction.uri); + DocumentFile documentFile = + DocumentFile.fromSingleUri(AppConfig.getInstance(), fileAbstraction.uri); + if (documentFile != null && documentFile.exists() && documentFile.canRead()) + inputStream = contentResolver.openInputStream(documentFile.getUri()); + else inputStream = loadFile(FileUtils.fromContentUri(fileAbstraction.uri)); break; case FILE: final HybridFileParcelable hybridFileParcelable = fileAbstraction.hybridFileParcelable; @@ -86,30 +94,8 @@ protected ReturnedValues doInBackground(Void... params) { throw new NullPointerException("Something went really wrong!"); File file = hybridFileParcelable.getFile(); + inputStream = loadFile(file); - if (!file.canWrite() && isRootExplorer) { - // try loading stream associated using root - try { - cachedFile = new File(externalCacheDir, hybridFileParcelable.getName()); - // creating a cache file - RootUtils.copy(hybridFileParcelable.getPath(), cachedFile.getPath()); - - inputStream = new FileInputStream(cachedFile); - } catch (ShellNotRunningException e) { - e.printStackTrace(); - inputStream = null; - } catch (FileNotFoundException e) { - e.printStackTrace(); - inputStream = null; - } - } else if (file.canRead()) { - // readable file in filesystem - try { - inputStream = new FileInputStream(hybridFileParcelable.getPath()); - } catch (FileNotFoundException e) { - inputStream = null; - } - } break; default: throw new IllegalArgumentException( @@ -145,6 +131,35 @@ protected void onPostExecute(ReturnedValues s) { onAsyncTaskFinished.onAsyncTaskFinished(s); } + private InputStream loadFile(File file) { + InputStream inputStream = null; + if (!file.canWrite() && isRootExplorer) { + // try loading stream associated using root + try { + cachedFile = new File(externalCacheDir, file.getName()); + // creating a cache file + RootUtils.copy(file.getAbsolutePath(), cachedFile.getPath()); + + inputStream = new FileInputStream(cachedFile); + } catch (ShellNotRunningException e) { + e.printStackTrace(); + inputStream = null; + } catch (FileNotFoundException e) { + e.printStackTrace(); + inputStream = null; + } + } else if (file.canRead()) { + // readable file in filesystem + try { + inputStream = new FileInputStream(file.getAbsolutePath()); + } catch (FileNotFoundException e) { + inputStream = null; + } + } + + return inputStream; + } + public static class ReturnedValues { public final String fileContents; public final int error; diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/WriteFileAbstraction.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/WriteFileAbstraction.java index 3470e6ffc1..6f94215b70 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/WriteFileAbstraction.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/WriteFileAbstraction.java @@ -27,11 +27,13 @@ import java.io.OutputStream; import java.lang.ref.WeakReference; +import com.amaze.filemanager.application.AppConfig; import com.amaze.filemanager.exceptions.ShellNotRunningException; import com.amaze.filemanager.exceptions.StreamNotFoundException; import com.amaze.filemanager.filesystem.EditableFileAbstraction; import com.amaze.filemanager.filesystem.FileUtil; import com.amaze.filemanager.filesystem.HybridFileParcelable; +import com.amaze.filemanager.filesystem.files.FileUtils; import com.amaze.filemanager.utils.OnAsyncTaskFinished; import com.amaze.filemanager.utils.RootUtils; @@ -39,6 +41,10 @@ import android.content.Context; import android.os.AsyncTask; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.documentfile.provider.DocumentFile; + /** @author Emmanuel Messulam on 16/1/2018, at 18:36. */ public class WriteFileAbstraction extends AsyncTask { @@ -77,6 +83,7 @@ public WriteFileAbstraction( protected Integer doInBackground(Void... voids) { try { OutputStream outputStream; + File destFile = null; switch (fileAbstraction.scheme) { case CONTENT: @@ -84,11 +91,17 @@ protected Integer doInBackground(Void... voids) { throw new NullPointerException("Something went really wrong!"); try { - outputStream = contentResolver.openOutputStream(fileAbstraction.uri); + DocumentFile documentFile = + DocumentFile.fromSingleUri(AppConfig.getInstance(), fileAbstraction.uri); + if (documentFile != null && documentFile.exists() && documentFile.canWrite()) + outputStream = contentResolver.openOutputStream(fileAbstraction.uri); + else { + destFile = FileUtils.fromContentUri(fileAbstraction.uri); + outputStream = openFile(destFile, context.get()); + } } catch (RuntimeException e) { throw new StreamNotFoundException(e); } - break; case FILE: final HybridFileParcelable hybridFileParcelable = fileAbstraction.hybridFileParcelable; @@ -100,19 +113,8 @@ protected Integer doInBackground(Void... voids) { cancel(true); return null; } - outputStream = FileUtil.getOutputStream(hybridFileParcelable.getFile(), context); - - if (isRootExplorer && outputStream == null) { - // try loading stream associated using root - try { - if (cachedFile != null && cachedFile.exists()) { - outputStream = new FileOutputStream(cachedFile); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - outputStream = null; - } - } + outputStream = openFile(hybridFileParcelable.getFile(), context); + destFile = fileAbstraction.hybridFileParcelable.getFile(); break; default: throw new IllegalArgumentException( @@ -124,10 +126,9 @@ protected Integer doInBackground(Void... voids) { outputStream.write(dataToSave.getBytes()); outputStream.close(); - if (cachedFile != null && cachedFile.exists()) { + if (cachedFile != null && cachedFile.exists() && destFile != null) { // cat cache content to original file and delete cache file - RootUtils.cat(cachedFile.getPath(), fileAbstraction.hybridFileParcelable.getPath()); - + RootUtils.cat(cachedFile.getPath(), destFile.getPath()); cachedFile.delete(); } @@ -151,4 +152,25 @@ protected void onPostExecute(Integer integer) { onAsyncTaskFinished.onAsyncTaskFinished(integer); } + + private OutputStream openFile(@Nullable File file, @NonNull Context context) + throws FileNotFoundException { + if (file == null) throw new IllegalArgumentException("File cannot be null"); + + OutputStream outputStream = FileUtil.getOutputStream(file, context); + + if (isRootExplorer && outputStream == null) { + // try loading stream associated using root + try { + if (cachedFile != null && cachedFile.exists()) { + outputStream = new FileOutputStream(cachedFile); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + outputStream = null; + } + } + + return outputStream; + } } diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/files/FileUtils.java b/app/src/main/java/com/amaze/filemanager/filesystem/files/FileUtils.java index 1c340e724b..52340d7cc7 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/files/FileUtils.java +++ b/app/src/main/java/com/amaze/filemanager/filesystem/files/FileUtils.java @@ -20,6 +20,8 @@ package com.amaze.filemanager.filesystem.files; +import static com.amaze.filemanager.filesystem.EditableFileAbstraction.Scheme.CONTENT; + import java.io.File; import java.text.ParsePosition; import java.text.SimpleDateFormat; @@ -842,4 +844,13 @@ public void invalidName(HybridFile file) {} }); } } + + public static File fromContentUri(@NonNull Uri uri) { + if (!CONTENT.name().equalsIgnoreCase(uri.getScheme())) { + throw new IllegalArgumentException( + "URI must start with content://. URI was [" + uri.toString() + "]"); + } else { + return new File(uri.getPath().substring(FILE_PROVIDER_PREFIX.length() + 1)); + } + } } From c9dac48a00910a0b014a4c3460ca547b9a88d10d Mon Sep 17 00:00:00 2001 From: TranceLove Date: Wed, 26 Aug 2020 12:09:04 +0800 Subject: [PATCH 4/7] Convert content URI to filesystem's absolute path only if URI authority is ours This will ensure compatibility with other apps. --- .../asynchronous/asynctasks/ReadFileTask.java | 14 +++++++++----- .../asynctasks/WriteFileAbstraction.java | 16 ++++++++++------ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java index 73e7316e40..6aadf54455 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java @@ -82,11 +82,15 @@ protected ReturnedValues doInBackground(Void... params) { if (fileAbstraction.uri == null) throw new NullPointerException("Something went really wrong!"); - DocumentFile documentFile = - DocumentFile.fromSingleUri(AppConfig.getInstance(), fileAbstraction.uri); - if (documentFile != null && documentFile.exists() && documentFile.canRead()) - inputStream = contentResolver.openInputStream(documentFile.getUri()); - else inputStream = loadFile(FileUtils.fromContentUri(fileAbstraction.uri)); + if (fileAbstraction.uri.getAuthority().equals(AppConfig.getInstance().getPackageName())) { + DocumentFile documentFile = + DocumentFile.fromSingleUri(AppConfig.getInstance(), fileAbstraction.uri); + if (documentFile != null && documentFile.exists() && documentFile.canRead()) + inputStream = contentResolver.openInputStream(documentFile.getUri()); + else inputStream = loadFile(FileUtils.fromContentUri(fileAbstraction.uri)); + } else { + inputStream = contentResolver.openInputStream(fileAbstraction.uri); + } break; case FILE: final HybridFileParcelable hybridFileParcelable = fileAbstraction.hybridFileParcelable; diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/WriteFileAbstraction.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/WriteFileAbstraction.java index 6f94215b70..e7ea319d74 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/WriteFileAbstraction.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/WriteFileAbstraction.java @@ -91,13 +91,17 @@ protected Integer doInBackground(Void... voids) { throw new NullPointerException("Something went really wrong!"); try { - DocumentFile documentFile = - DocumentFile.fromSingleUri(AppConfig.getInstance(), fileAbstraction.uri); - if (documentFile != null && documentFile.exists() && documentFile.canWrite()) + if (fileAbstraction.uri.getAuthority().equals(context.get().getPackageName())) { + DocumentFile documentFile = + DocumentFile.fromSingleUri(AppConfig.getInstance(), fileAbstraction.uri); + if (documentFile != null && documentFile.exists() && documentFile.canWrite()) + outputStream = contentResolver.openOutputStream(fileAbstraction.uri); + else { + destFile = FileUtils.fromContentUri(fileAbstraction.uri); + outputStream = openFile(destFile, context.get()); + } + } else { outputStream = contentResolver.openOutputStream(fileAbstraction.uri); - else { - destFile = FileUtils.fromContentUri(fileAbstraction.uri); - outputStream = openFile(destFile, context.get()); } } catch (RuntimeException e) { throw new StreamNotFoundException(e); From 30fdf67d8668d472346e9dd37a0c01723bfe2b46 Mon Sep 17 00:00:00 2001 From: TranceLove Date: Wed, 2 Sep 2020 17:50:42 +0800 Subject: [PATCH 5/7] Changes per PR feedback - check for DocumentFile.canWrite() instead of canRead() to decide if we need to create the cache file - log error if ReadFileTask eventually unable to read the file - Fix file details dialog did not show for content URI (either third party apps or root files). If content URI's authority is ours, display properties for the actual file --- .../asynchronous/asynctasks/ReadFileTask.java | 6 +++++- .../filemanager/ui/activities/TextEditorActivity.java | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java index 6aadf54455..112a5ba661 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/ReadFileTask.java @@ -39,12 +39,15 @@ import android.content.ContentResolver; import android.os.AsyncTask; +import android.util.Log; import androidx.documentfile.provider.DocumentFile; /** @author Emmanuel Messulam on 16/1/2018, at 18:05. */ public class ReadFileTask extends AsyncTask { + private static final String TAG = ReadFileTask.class.getSimpleName(); + public static final int NORMAL = 0; public static final int EXCEPTION_STREAM_NOT_FOUND = -1; public static final int EXCEPTION_IO = -2; @@ -85,7 +88,7 @@ protected ReturnedValues doInBackground(Void... params) { if (fileAbstraction.uri.getAuthority().equals(AppConfig.getInstance().getPackageName())) { DocumentFile documentFile = DocumentFile.fromSingleUri(AppConfig.getInstance(), fileAbstraction.uri); - if (documentFile != null && documentFile.exists() && documentFile.canRead()) + if (documentFile != null && documentFile.exists() && documentFile.canWrite()) inputStream = contentResolver.openInputStream(documentFile.getUri()); else inputStream = loadFile(FileUtils.fromContentUri(fileAbstraction.uri)); } else { @@ -157,6 +160,7 @@ private InputStream loadFile(File file) { try { inputStream = new FileInputStream(file.getAbsolutePath()); } catch (FileNotFoundException e) { + Log.e(TAG, "Unable to open file [" + file.getAbsolutePath() + "] for reading", e); inputStream = null; } } diff --git a/app/src/main/java/com/amaze/filemanager/ui/activities/TextEditorActivity.java b/app/src/main/java/com/amaze/filemanager/ui/activities/TextEditorActivity.java index 51f15ff510..c39be98fc8 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/activities/TextEditorActivity.java +++ b/app/src/main/java/com/amaze/filemanager/ui/activities/TextEditorActivity.java @@ -20,6 +20,7 @@ package com.amaze.filemanager.ui.activities; +import static com.amaze.filemanager.filesystem.EditableFileAbstraction.Scheme.CONTENT; import static com.amaze.filemanager.filesystem.EditableFileAbstraction.Scheme.FILE; import static com.amaze.filemanager.ui.fragments.preference_fragments.PreferencesConstants.PREFERENCE_COLORED_NAVIGATION; import static com.amaze.filemanager.ui.fragments.preference_fragments.PreferencesConstants.PREFERENCE_TEXTEDITOR_NEWSTACK; @@ -36,12 +37,14 @@ import com.amaze.filemanager.asynchronous.asynctasks.SearchTextTask; import com.amaze.filemanager.asynchronous.asynctasks.WriteFileAbstraction; import com.amaze.filemanager.filesystem.EditableFileAbstraction; +import com.amaze.filemanager.filesystem.HybridFileParcelable; import com.amaze.filemanager.filesystem.files.FileUtils; import com.amaze.filemanager.ui.activities.superclasses.ThemedActivity; import com.amaze.filemanager.ui.colors.ColorPreferenceHelper; import com.amaze.filemanager.ui.dialogs.GeneralDialogCreation; import com.amaze.filemanager.ui.theme.AppTheme; import com.amaze.filemanager.utils.MapEntry; +import com.amaze.filemanager.utils.OpenMode; import com.amaze.filemanager.utils.PreferenceUtils; import com.amaze.filemanager.utils.Utils; import com.google.android.material.snackbar.Snackbar; @@ -407,6 +410,13 @@ public boolean onOptionsItemSelected(MenuItem item) { if (mFile.scheme.equals(FILE) && mFile.hybridFileParcelable.getFile().exists()) { GeneralDialogCreation.showPropertiesDialogWithoutPermissions( mFile.hybridFileParcelable, this, getAppTheme()); + } else if (mFile.scheme.equals(CONTENT)) { + if (getApplicationContext().getPackageName().equals(mFile.uri.getAuthority())) { + File file = FileUtils.fromContentUri(mFile.uri); + HybridFileParcelable p = new HybridFileParcelable(file.getAbsolutePath()); + if (isRootExplorer()) p.setMode(OpenMode.ROOT); + GeneralDialogCreation.showPropertiesDialogWithoutPermissions(p, this, getAppTheme()); + } } else { Toast.makeText(this, R.string.no_obtainable_info, Toast.LENGTH_SHORT).show(); } From 51a039c56faf53ed2af4bea0728f5b00bcecd91e Mon Sep 17 00:00:00 2001 From: saunak Date: Sun, 6 Sep 2020 09:27:59 +0530 Subject: [PATCH 6/7] Removed size of recent file size check. --- .../asynchronous/asynctasks/LoadFilesListTask.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java index 898f36cd40..45dc0f0ac1 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java @@ -469,10 +469,6 @@ private ArrayList listRecentFiles() { } cursor.close(); Collections.sort(recentFiles, (lhs, rhs) -> -1 * Long.valueOf(lhs.date).compareTo(rhs.date)); - if (recentFiles.size() > 20) - for (int i = recentFiles.size() - 1; i > 20; i--) { - recentFiles.remove(i); - } return recentFiles; } From c36672f2605059132b926d170935dbdfa16da76b Mon Sep 17 00:00:00 2001 From: VishalNehra Date: Sun, 13 Sep 2020 22:36:54 +0530 Subject: [PATCH 7/7] Fix recent files sort query --- .../asynctasks/LoadFilesListTask.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java index 45dc0f0ac1..1d5e7c3acb 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/LoadFilesListTask.java @@ -385,10 +385,6 @@ else if (cursor.getCount() > 0 && cursor.moveToFirst()) { } cursor.close(); Collections.sort(docs, (lhs, rhs) -> -1 * Long.valueOf(lhs.date).compareTo(rhs.date)); - if (docs.size() > 20) - for (int i = docs.size() - 1; i > 20; i--) { - docs.remove(i); - } return docs; } @@ -441,17 +437,20 @@ private ArrayList listRecent() { } private ArrayList listRecentFiles() { - ArrayList recentFiles = new ArrayList<>(); - final String[] projection = { - MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.DATE_MODIFIED - }; + ArrayList recentFiles = new ArrayList<>(20); + final String[] projection = {MediaStore.Files.FileColumns.DATA}; Calendar c = Calendar.getInstance(); c.set(Calendar.DAY_OF_YEAR, c.get(Calendar.DAY_OF_YEAR) - 2); Date d = c.getTime(); Cursor cursor = this.context .getContentResolver() - .query(MediaStore.Files.getContentUri("external"), projection, null, null, null); + .query( + MediaStore.Files.getContentUri("external"), + projection, + null, + null, + MediaStore.Files.FileColumns.DATE_MODIFIED + " DESC LIMIT 20"); if (cursor == null) return recentFiles; if (cursor.getCount() > 0 && cursor.moveToFirst()) { do { @@ -468,7 +467,6 @@ private ArrayList listRecentFiles() { } while (cursor.moveToNext()); } cursor.close(); - Collections.sort(recentFiles, (lhs, rhs) -> -1 * Long.valueOf(lhs.date).compareTo(rhs.date)); return recentFiles; }