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(