summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2020-12-28 13:25:24 +0100
committerJosJuice <josjuice@gmail.com>2020-12-28 21:00:10 +0100
commitd78277c063d43e3234fe80a38d272500f3dfce3a (patch)
treea66fd4f943abb38b4aa47f91a57d7569f0f5be29 /Source/Android/app/src/main/java
parent01b964b01aad3f46611e5fec8c44b60ed04a9b3f (diff)
Android: Add specialized content provider implementation of DoFileSearch
Diffstat (limited to 'Source/Android/app/src/main/java')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java4
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ContentHandler.java90
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/FileBrowserHelper.java10
3 files changed, 84 insertions, 20 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java
index ff34ea2f1b..1456bb6654 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java
@@ -130,8 +130,8 @@ public final class MainPresenter
boolean recursive = BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBooleanGlobal();
String[] childNames = ContentHandler.getChildNames(uri, recursive);
- if (Arrays.stream(childNames).noneMatch((name) ->
- FileBrowserHelper.GAME_EXTENSIONS.contains(FileBrowserHelper.getExtension(name))))
+ if (Arrays.stream(childNames).noneMatch((name) -> FileBrowserHelper.GAME_EXTENSIONS.contains(
+ FileBrowserHelper.getExtension(name, false))))
{
AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.DolphinDialogBase);
builder.setMessage(mContext.getString(R.string.wrong_file_extension_in_directory,
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ContentHandler.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ContentHandler.java
index ebedef4b60..52600fe488 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ContentHandler.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ContentHandler.java
@@ -15,7 +15,9 @@ import org.dolphinemu.dolphinemu.DolphinApplication;
import java.io.FileNotFoundException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
+import java.util.function.Predicate;
/*
We use a lot of "catch (Exception e)" in this class. This is for two reasons:
@@ -184,34 +186,94 @@ public class ContentHandler
public static String[] getChildNames(@NonNull Uri uri, boolean recursive)
{
ArrayList<String> result = new ArrayList<>();
- getChildNames(uri, DocumentsContract.getDocumentId(treeToDocument(uri)), recursive, result);
+
+ ForEachChildCallback callback = new ForEachChildCallback()
+ {
+ @Override
+ public void run(String displayName, String documentId, boolean isDirectory)
+ {
+ if (recursive && isDirectory)
+ {
+ forEachChild(uri, documentId, this);
+ }
+ else
+ {
+ result.add(displayName);
+ }
+ }
+ };
+
+ forEachChild(uri, DocumentsContract.getDocumentId(treeToDocument(uri)), callback);
+
+ return result.toArray(new String[0]);
+ }
+
+ @NonNull @Keep
+ public static String[] doFileSearch(@NonNull String directory, @NonNull String[] extensions,
+ boolean recursive)
+ {
+ ArrayList<String> result = new ArrayList<>();
+
+ try
+ {
+ Uri uri = unmangle(directory);
+ String documentId = DocumentsContract.getDocumentId(treeToDocument(uri));
+ boolean acceptAll = extensions.length == 0;
+ Predicate<String> extensionCheck = (displayName) ->
+ {
+ String extension = FileBrowserHelper.getExtension(displayName, true);
+ return extension != null && Arrays.stream(extensions).anyMatch(extension::equalsIgnoreCase);
+ };
+ doFileSearch(uri, directory, documentId, recursive, result, acceptAll, extensionCheck);
+ }
+ catch (Exception ignored)
+ {
+ }
+
return result.toArray(new String[0]);
}
- private static void getChildNames(@NonNull Uri uri, @NonNull String documentId, boolean recursive,
- List<String> resultOut)
+ private static void doFileSearch(@NonNull Uri baseUri, @NonNull String path,
+ @NonNull String documentId, boolean recursive, @NonNull List<String> resultOut,
+ boolean acceptAll, @NonNull Predicate<String> extensionCheck)
+ {
+ forEachChild(baseUri, documentId, (displayName, childDocumentId, isDirectory) ->
+ {
+ String childPath = path + '/' + displayName;
+ if (acceptAll || (!isDirectory && extensionCheck.test(displayName)))
+ {
+ resultOut.add(childPath);
+ }
+ if (recursive && isDirectory)
+ {
+ doFileSearch(baseUri, childPath, childDocumentId, recursive, resultOut, acceptAll,
+ extensionCheck);
+ }
+ });
+ }
+
+ private interface ForEachChildCallback
+ {
+ void run(String displayName, String documentId, boolean isDirectory);
+ }
+
+ private static void forEachChild(@NonNull Uri uri, @NonNull String documentId,
+ @NonNull ForEachChildCallback callback)
{
try
{
Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(uri, documentId);
- final String[] projection = recursive ? new String[]{Document.COLUMN_DISPLAY_NAME,
- Document.COLUMN_MIME_TYPE, Document.COLUMN_DOCUMENT_ID} :
- new String[]{Document.COLUMN_DISPLAY_NAME};
+ final String[] projection = new String[]{Document.COLUMN_DISPLAY_NAME,
+ Document.COLUMN_MIME_TYPE, Document.COLUMN_DOCUMENT_ID};
try (Cursor cursor = getContentResolver().query(childrenUri, projection, null, null, null))
{
if (cursor != null)
{
while (cursor.moveToNext())
{
- if (recursive && Document.MIME_TYPE_DIR.equals(cursor.getString(1)))
- {
- getChildNames(uri, cursor.getString(2), recursive, resultOut);
- }
- else
- {
- resultOut.add(cursor.getString(0));
- }
+ callback.run(cursor.getString(0), cursor.getString(2),
+ Document.MIME_TYPE_DIR.equals(cursor.getString(1)));
}
}
}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/FileBrowserHelper.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/FileBrowserHelper.java
index 82f16519fa..f68bc46857 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/FileBrowserHelper.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/FileBrowserHelper.java
@@ -88,10 +88,10 @@ public final class FileBrowserHelper
String path = uri.getLastPathSegment();
if (path != null)
- extension = getExtension(new File(path).getName());
+ extension = getExtension(new File(path).getName(), false);
if (extension == null)
- extension = getExtension(ContentHandler.getDisplayName(uri));
+ extension = getExtension(ContentHandler.getDisplayName(uri), false);
if (extension != null && validExtensions.contains(extension))
{
@@ -122,13 +122,15 @@ public final class FileBrowserHelper
}
@Nullable
- public static String getExtension(@Nullable String fileName)
+ public static String getExtension(@Nullable String fileName, boolean includeDot)
{
if (fileName == null)
return null;
int dotIndex = fileName.lastIndexOf(".");
- return dotIndex != -1 ? fileName.substring(dotIndex + 1) : null;
+ if (dotIndex == -1)
+ return null;
+ return fileName.substring(dotIndex + (includeDot ? 0 : 1));
}
public static String setToSortedDelimitedString(Set<String> set)