summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Android/app/src/main/java')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java8
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java4
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java4
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/ContentHandler.java31
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/FileBrowserHelper.java76
5 files changed, 114 insertions, 9 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java
index 6486b0353b..29d992a156 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivity.java
@@ -175,12 +175,14 @@ public final class SettingsActivity extends AppCompatActivity implements Setting
if (requestCode == MainPresenter.REQUEST_SD_FILE)
{
Uri uri = canonicalizeIfPossible(result.getData());
-
int takeFlags = result.getFlags() &
(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- getContentResolver().takePersistableUriPermission(uri, takeFlags);
- getFragment().getAdapter().onFilePickerConfirmation(uri.toString());
+ FileBrowserHelper.runAfterExtensionCheck(this, uri, FileBrowserHelper.RAW_EXTENSION, () ->
+ {
+ getContentResolver().takePersistableUriPermission(uri, takeFlags);
+ getFragment().getAdapter().onFilePickerConfirmation(uri.toString());
+ });
}
else
{
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java
index 53306d8e4d..cd5dd80c75 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java
@@ -205,7 +205,9 @@ public final class MainActivity extends AppCompatActivity implements MainView
break;
case MainPresenter.REQUEST_WAD_FILE:
- mPresenter.installWAD(result.getData().toString());
+ FileBrowserHelper.runAfterExtensionCheck(this, result.getData(),
+ FileBrowserHelper.WAD_EXTENSION,
+ () -> mPresenter.installWAD(result.getData().toString()));
break;
}
}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java
index f1c8c37a41..23d1050d04 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java
@@ -229,7 +229,9 @@ public final class TvMainActivity extends FragmentActivity implements MainView
break;
case MainPresenter.REQUEST_WAD_FILE:
- mPresenter.installWAD(result.getData().toString());
+ FileBrowserHelper.runAfterExtensionCheck(this, result.getData(),
+ FileBrowserHelper.WAD_EXTENSION,
+ () -> mPresenter.installWAD(result.getData().toString()));
break;
}
}
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 dc4472a212..7cf7c24253 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
@@ -1,8 +1,13 @@
package org.dolphinemu.dolphinemu.utils;
import android.content.ContentResolver;
+import android.database.Cursor;
import android.net.Uri;
import android.provider.DocumentsContract;
+import android.provider.DocumentsContract.Document;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import org.dolphinemu.dolphinemu.DolphinApplication;
@@ -14,8 +19,7 @@ public class ContentHandler
{
try
{
- return DolphinApplication.getAppContext().getContentResolver()
- .openFileDescriptor(Uri.parse(uri), mode).detachFd();
+ return getContentResolver().openFileDescriptor(Uri.parse(uri), mode).detachFd();
}
// Some content providers throw IllegalArgumentException for invalid modes,
// despite the documentation saying that invalid modes result in a FileNotFoundException
@@ -29,8 +33,7 @@ public class ContentHandler
{
try
{
- ContentResolver resolver = DolphinApplication.getAppContext().getContentResolver();
- return DocumentsContract.deleteDocument(resolver, Uri.parse(uri));
+ return DocumentsContract.deleteDocument(getContentResolver(), Uri.parse(uri));
}
catch (FileNotFoundException e)
{
@@ -38,4 +41,24 @@ public class ContentHandler
return true;
}
}
+
+ @Nullable
+ public static String getDisplayName(@NonNull Uri uri)
+ {
+ final String[] projection = new String[]{Document.COLUMN_DISPLAY_NAME};
+ try (Cursor cursor = getContentResolver().query(uri, projection, null, null, null))
+ {
+ if (cursor != null && cursor.moveToFirst())
+ {
+ return cursor.getString(0);
+ }
+ }
+
+ return null;
+ }
+
+ private static ContentResolver getContentResolver()
+ {
+ return DolphinApplication.getAppContext().getContentResolver();
+ }
}
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 949cee554c..1d0c982b65 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
@@ -1,23 +1,28 @@
package org.dolphinemu.dolphinemu.utils;
+import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentActivity;
import com.nononsenseapps.filepicker.FilePickerActivity;
import com.nononsenseapps.filepicker.Utils;
+import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.activities.CustomFilePickerActivity;
import org.dolphinemu.dolphinemu.ui.main.MainPresenter;
import java.io.File;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
+import java.util.Set;
public final class FileBrowserHelper
{
@@ -27,6 +32,9 @@ public final class FileBrowserHelper
public static final HashSet<String> RAW_EXTENSION = new HashSet<>(Collections.singletonList(
"raw"));
+ public static final HashSet<String> WAD_EXTENSION = new HashSet<>(Collections.singletonList(
+ "wad"));
+
public static void openDirectoryPicker(FragmentActivity activity, HashSet<String> extensions)
{
Intent i = new Intent(activity, CustomFilePickerActivity.class);
@@ -85,4 +93,72 @@ public final class FileBrowserHelper
return null;
}
+
+ public static void runAfterExtensionCheck(Context context, Uri uri, Set<String> validExtensions,
+ Runnable runnable)
+ {
+ String extension = null;
+
+ String path = uri.getLastPathSegment();
+ if (path != null)
+ extension = getExtension(new File(path).getName());
+
+ if (extension == null)
+ extension = getExtension(ContentHandler.getDisplayName(uri));
+
+ if (extension != null && validExtensions.contains(extension))
+ {
+ runnable.run();
+ return;
+ }
+
+ String message;
+ if (extension == null)
+ {
+ message = context.getString(R.string.no_file_extension);
+ }
+ else
+ {
+ int messageId = validExtensions.size() == 1 ?
+ R.string.wrong_file_extension_single : R.string.wrong_file_extension_multiple;
+
+ ArrayList<String> extensionsList = new ArrayList<>(validExtensions);
+ Collections.sort(extensionsList);
+
+ message = context.getString(messageId, extension, join(", ", extensionsList));
+ }
+
+ new AlertDialog.Builder(context, R.style.DolphinDialogBase)
+ .setMessage(message)
+ .setPositiveButton(R.string.yes, (dialogInterface, i) -> runnable.run())
+ .setNegativeButton(R.string.no, null)
+ .show();
+ }
+
+ @Nullable
+ private static String getExtension(@Nullable String fileName)
+ {
+ if (fileName == null)
+ return null;
+
+ int dotIndex = fileName.lastIndexOf(".");
+ return dotIndex != -1 ? fileName.substring(dotIndex + 1) : null;
+ }
+
+ // TODO: Replace this with String.join once we can use Java 8
+ private static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
+ {
+ StringBuilder sb = new StringBuilder();
+
+ boolean first = true;
+ for (CharSequence element : elements)
+ {
+ if (!first)
+ sb.append(delimiter);
+ first = false;
+ sb.append(element);
+ }
+
+ return sb.toString();
+ }
}