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:
parent
27fe37ee21
commit
4a53e869fa
@ -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(), "_")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user