0
0
mirror of https://github.com/ankidroid/Anki-Android.git synced 2024-09-20 12:02:16 +02:00

refactor: generify handleMediaSelection

To help with adding videos in a future commit

Issue 10315
This commit is contained in:
David Allison 2022-02-12 12:42:39 +00:00 committed by Mike Hardy
parent 27fe37ee21
commit 4a53e869fa

View File

@ -91,18 +91,18 @@ class BasicAudioClipFieldController : FieldControllerBase(), IFieldController {
@KotlinCleanup("make data non-null")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (resultCode != Activity.RESULT_CANCELED && requestCode == ACTIVITY_SELECT_AUDIO_CLIP) {
executeSafe(mActivity, "handleAudioSelection:unhandled") {
handleAudioSelection(data!!)
executeSafe(mActivity, "handleMediaSelection:unhandled") {
handleMediaSelection(data!!, "ankidroid_audioclip_")
}
}
}
private fun handleAudioSelection(data: Intent) {
private fun handleMediaSelection(data: Intent, clipNamePrefix: String) {
val selectedClip = data.data
// Get information about the selected document
val queryColumns = arrayOf(MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.SIZE, MediaStore.MediaColumns.MIME_TYPE)
var audioClipFullNameParts: Array<String>
var mediaClipFullNameParts: Array<String>
mActivity.contentResolver.query(selectedClip!!, queryColumns, null, null, null).use { cursor ->
if (cursor == null) {
showThemedToast(
@ -112,19 +112,19 @@ class BasicAudioClipFieldController : FieldControllerBase(), IFieldController {
return
}
cursor.moveToFirst()
var audioClipFullName = cursor.getString(0)
audioClipFullName = checkFileName(audioClipFullName)
audioClipFullNameParts = audioClipFullName.split("\\.").toTypedArray()
if (audioClipFullNameParts.size < 2) {
audioClipFullNameParts = try {
Timber.i("Audio clip name does not have extension, using second half of mime type")
arrayOf(audioClipFullName, cursor.getString(2).split("/").toTypedArray()[1])
var mediaClipFullName = cursor.getString(0)
mediaClipFullName = checkFileName(mediaClipFullName)
mediaClipFullNameParts = mediaClipFullName.split("\\.").toTypedArray()
if (mediaClipFullNameParts.size < 2) {
mediaClipFullNameParts = try {
Timber.i("Media clip name does not have extension, using second half of mime type")
arrayOf(mediaClipFullName, cursor.getString(2).split("/").toTypedArray()[1])
} catch (e: Exception) {
Timber.w(e)
// This code is difficult to stabilize - it is not clear how to handle files with no extension
// and apparently we may fail to get MIME_TYPE information - in that case we will gather information
// about what people are experiencing in the real world and decide later, but without crashing at least
AnkiDroidApp.sendExceptionReport(e, "Audio Clip addition failed. Name " + audioClipFullName + " / cursor mime type column type " + cursor.getType(2))
AnkiDroidApp.sendExceptionReport(e, "Media Clip addition failed. Name " + mediaClipFullName + " / cursor mime type column type " + cursor.getType(2))
showThemedToast(
AnkiDroidApp.getInstance().applicationContext,
AnkiDroidApp.getInstance().getString(R.string.multimedia_editor_something_wrong), true
@ -138,14 +138,14 @@ class BasicAudioClipFieldController : FieldControllerBase(), IFieldController {
val clipCopy: File
try {
clipCopy = File.createTempFile(
"ankidroid_audioclip_" + audioClipFullNameParts[0],
"." + audioClipFullNameParts[1],
clipNamePrefix + mediaClipFullNameParts[0],
"." + mediaClipFullNameParts[1],
storingDirectory
)
Timber.d("audio clip picker file path is: %s", clipCopy.absolutePath)
Timber.d("media clip picker file path is: %s", clipCopy.absolutePath)
} catch (e: Exception) {
Timber.e(e, "Could not create temporary audio file. ")
AnkiDroidApp.sendExceptionReport(e, "handleAudioSelection:tempFile")
Timber.e(e, "Could not create temporary media file. ")
AnkiDroidApp.sendExceptionReport(e, "handleMediaSelection:tempFile")
showThemedToast(
AnkiDroidApp.getInstance().applicationContext,
AnkiDroidApp.getInstance().getString(R.string.multimedia_editor_something_wrong), true
@ -165,8 +165,8 @@ class BasicAudioClipFieldController : FieldControllerBase(), IFieldController {
tvAudioClip!!.visibility = View.VISIBLE
}
} catch (e: Exception) {
Timber.e(e, "Unable to copy audio file from ContentProvider")
AnkiDroidApp.sendExceptionReport(e, "handleAudioSelection:copyFromProvider")
Timber.e(e, "Unable to copy media file from ContentProvider")
AnkiDroidApp.sendExceptionReport(e, "handleMediaSelection:copyFromProvider")
showThemedToast(
AnkiDroidApp.getInstance().applicationContext,
AnkiDroidApp.getInstance().getString(R.string.multimedia_editor_something_wrong), true
@ -188,17 +188,18 @@ class BasicAudioClipFieldController : FieldControllerBase(), IFieldController {
companion object {
private const val ACTIVITY_SELECT_AUDIO_CLIP = 1
private const val ACTIVITY_SELECT_VIDEO_CLIP = 2
/**
* This method replaces any character that isn't a number, letter or underscore with underscore in file name.
* This method doesn't check that file name is valid or not it simply operates on all file name.
* @param audioClipFullName name of the file.
* @param mediaClipFullName name of the file.
* @return file name which is valid.
*/
@JvmStatic
@VisibleForTesting
fun checkFileName(audioClipFullName: String): String {
return audioClipFullName.replace("[^\\w.]+".toRegex(), "_")
fun checkFileName(mediaClipFullName: String): String {
return mediaClipFullName.replace("[^\\w.]+".toRegex(), "_")
}
}
}