diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt b/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt index d49fd6999975..afe5c5bf6909 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt @@ -660,7 +660,7 @@ open class DeckPicker : try { // Intent is nullable because `clip.getItemAt(0).intent` always returns null - ImportUtils.FileImporter().handleContentProviderFile(this, uri) + ImportUtils.FileImporter().handleContentProviderFile(this, uri, Intent().setData(uri)) onResume() } catch (e: Exception) { Timber.w(e) diff --git a/AnkiDroid/src/main/java/com/ichi2/utils/ImportUtils.kt b/AnkiDroid/src/main/java/com/ichi2/utils/ImportUtils.kt index e314e374e6df..b212c267aa51 100644 --- a/AnkiDroid/src/main/java/com/ichi2/utils/ImportUtils.kt +++ b/AnkiDroid/src/main/java/com/ichi2/utils/ImportUtils.kt @@ -33,6 +33,7 @@ import com.ichi2.anki.R import com.ichi2.anki.dialogs.DialogHandler import com.ichi2.anki.dialogs.DialogHandlerMessage import com.ichi2.anki.dialogs.ImportDialog +import com.ichi2.anki.onSelectedCsvForImport import com.ichi2.anki.showImportDialog import com.ichi2.annotations.NeedsTest import com.ichi2.compat.CompatHelper @@ -99,6 +100,20 @@ object ImportUtils { fun isFileAValidDeck(fileName: String): Boolean = FileImporter.hasExtension(fileName, "apkg") || FileImporter.hasExtension(fileName, "colpkg") + @NeedsTest("Verify that only valid text or data file MIME types return true") + fun isValidTextOrDataFile( + context: Context, + uri: Uri, + ): Boolean { + val mimeType = context.contentResolver.getType(uri) + return mimeType in + listOf( + "text/plain", + "text/comma-separated-values", + "text/tab-separated-values", + ) + } + @SuppressWarnings("WeakerAccess") open class FileImporter { /** @@ -200,7 +215,10 @@ object ImportUtils { } } val tempOutDir: String - if (!isValidPackageName(filename)) { + if (isValidTextOrDataFile(context, importPathUri)) { + (context as Activity).onSelectedCsvForImport(intent!!) + return ImportResult.fromSuccess() + } else if (!isValidPackageName(filename)) { return if (isAnkiDatabase(filename)) { // .anki2 files aren't supported by Anki Desktop, we should eventually support them, because we can // but for now, show a "nice" error. @@ -242,6 +260,7 @@ object ImportUtils { return when { isDeckPackage(fileName) -> true isCollectionPackage(fileName) -> true + isValidTextOrDataFile(context, importPathUri) -> true else -> false } }