From 2a535c9470786ae4b1bd4d21c8cb537578360b8d Mon Sep 17 00:00:00 2001
From: David Allison <62114487+david-allison@users.noreply.github.com>
Date: Fri, 24 Jan 2025 22:34:08 +0000
Subject: [PATCH] fix(import): import CSV/TSV files
CSV files from Gmail on my S21 (Android 14)
are text/csv
text/tsv is also used when coming from Gmail
Fixes 17866 (maybe)
---
AnkiDroid/src/main/AndroidManifest.xml | 2 ++
.../src/main/java/com/ichi2/anki/IntentHandler.kt | 11 +++++++++--
.../ichi2/anki/dialogs/ImportFileSelectionFragment.kt | 1 +
.../src/test/java/com/ichi2/anki/IntentHandlerTest.kt | 4 ++++
4 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/AnkiDroid/src/main/AndroidManifest.xml b/AnkiDroid/src/main/AndroidManifest.xml
index ba8d6f6cc241..c309eb61c2f5 100644
--- a/AnkiDroid/src/main/AndroidManifest.xml
+++ b/AnkiDroid/src/main/AndroidManifest.xml
@@ -241,6 +241,8 @@
+
+
diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/IntentHandler.kt b/AnkiDroid/src/main/java/com/ichi2/anki/IntentHandler.kt
index d6164158555d..6f2075c69247 100644
--- a/AnkiDroid/src/main/java/com/ichi2/anki/IntentHandler.kt
+++ b/AnkiDroid/src/main/java/com/ichi2/anki/IntentHandler.kt
@@ -299,6 +299,14 @@ class IntentHandler : AbstractIntentHandler() {
private const val CLIPBOARD_INTENT = "com.ichi2.anki.COPY_DEBUG_INFO"
private const val CLIPBOARD_INTENT_EXTRA_DATA = "clip_data"
+ private val textMimeTypes =
+ setOf(
+ "text/tab-separated-values",
+ "text/tsv",
+ "text/comma-separated-values",
+ "text/csv",
+ )
+
private fun isValidViewIntent(intent: Intent): Boolean {
// Negating a negative because we want to call specific attention to the fact that it's invalid
// #6312 - Smart Launcher provided an empty ACTION_VIEW, no point in importing here.
@@ -333,8 +341,7 @@ class IntentHandler : AbstractIntentHandler() {
val mimeType = intent.resolveMimeType()
when {
mimeType?.startsWith("image/") == true -> LaunchType.IMAGE_IMPORT
- mimeType == "text/tab-separated-values" ||
- mimeType == "text/comma-separated-values" -> LaunchType.TEXT_IMPORT
+ textMimeTypes.contains(mimeType) -> LaunchType.TEXT_IMPORT
else -> LaunchType.FILE_IMPORT
}
} else if ("com.ichi2.anki.DO_SYNC" == action) {
diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ImportFileSelectionFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ImportFileSelectionFragment.kt
index 2675d6da36e1..63852ac8c5dd 100644
--- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ImportFileSelectionFragment.kt
+++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/ImportFileSelectionFragment.kt
@@ -103,6 +103,7 @@ class ImportFileSelectionFragment : DialogFragment() {
"text/comma-separated-values",
"text/csv",
"text/tab-separated-values",
+ "text/tsv",
),
),
)
diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/IntentHandlerTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/IntentHandlerTest.kt
index bc60042fdf3c..911496e58672 100644
--- a/AnkiDroid/src/test/java/com/ichi2/anki/IntentHandlerTest.kt
+++ b/AnkiDroid/src/test/java/com/ichi2/anki/IntentHandlerTest.kt
@@ -96,10 +96,14 @@ class IntentHandlerTest {
fun textImportIntentReturnsTextImport() {
testIntentType("content://valid", "text/tab-separated-values", LaunchType.TEXT_IMPORT)
testIntentType("content://valid", "text/comma-separated-values", LaunchType.TEXT_IMPORT)
+ testIntentType("content://valid", "text/csv", LaunchType.TEXT_IMPORT)
+ testIntentType("content://valid", "text/tsv", LaunchType.TEXT_IMPORT)
// Test for ACTION_SEND
testIntentType("content://valid", "text/tab-separated-values", LaunchType.TEXT_IMPORT, Intent.ACTION_SEND)
testIntentType("content://valid", "text/comma-separated-values", LaunchType.TEXT_IMPORT, Intent.ACTION_SEND)
+ testIntentType("content://valid", "text/csv", LaunchType.TEXT_IMPORT, Intent.ACTION_SEND)
+ testIntentType("content://valid", "text/tsv", LaunchType.TEXT_IMPORT, Intent.ACTION_SEND)
}
private fun testIntentType(