mirror of
https://github.com/ankidroid/Anki-Android.git
synced 2024-09-19 19:42:17 +02:00
rename 'image' to 'media'
In preparation for 'Drag & Drop' work, which will allow importing of media
This commit is contained in:
parent
06e8ac2ef3
commit
9d036f61e8
@ -41,8 +41,8 @@ import com.ichi2.anki.preferences.sharedPrefs
|
||||
import com.ichi2.anki.servicelayer.NoteService
|
||||
import com.ichi2.ui.FixedEditText
|
||||
import com.ichi2.utils.ClipboardUtil.IMAGE_MIME_TYPES
|
||||
import com.ichi2.utils.ClipboardUtil.getImageUri
|
||||
import com.ichi2.utils.ClipboardUtil.getPlainText
|
||||
import com.ichi2.utils.ClipboardUtil.getUri
|
||||
import com.ichi2.utils.ClipboardUtil.hasImage
|
||||
import com.ichi2.utils.KotlinCleanup
|
||||
import kotlinx.parcelize.Parcelize
|
||||
@ -55,7 +55,7 @@ class FieldEditText : FixedEditText, NoteService.NoteField {
|
||||
override var ord = 0
|
||||
private var origBackground: Drawable? = null
|
||||
private var selectionChangeListener: TextSelectionListener? = null
|
||||
private var imageListener: ImagePasteListener? = null
|
||||
private var pasteListener: PasteListener? = null
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
|
||||
var clipboard: ClipboardManager? = null
|
||||
@ -96,8 +96,8 @@ class FieldEditText : FixedEditText, NoteService.NoteField {
|
||||
setDefaultStyle()
|
||||
}
|
||||
|
||||
fun setImagePasteListener(imageListener: ImagePasteListener?) {
|
||||
this.imageListener = imageListener
|
||||
fun setPasteListener(pasteListener: PasteListener) {
|
||||
this.pasteListener = pasteListener
|
||||
}
|
||||
|
||||
@KotlinCleanup("add extension method to iterate clip items")
|
||||
@ -113,7 +113,7 @@ class FieldEditText : FixedEditText, NoteService.NoteField {
|
||||
val uriContent = pair.first
|
||||
val remaining = pair.second
|
||||
|
||||
if (imageListener == null || uriContent == null) {
|
||||
if (pasteListener == null || uriContent == null) {
|
||||
return remaining
|
||||
}
|
||||
|
||||
@ -127,7 +127,7 @@ class FieldEditText : FixedEditText, NoteService.NoteField {
|
||||
for (i in 0 until clip.itemCount) {
|
||||
val uri = clip.getItemAt(i).uri
|
||||
try {
|
||||
onImagePaste(uri)
|
||||
onPaste(uri)
|
||||
} catch (e: Exception) {
|
||||
Timber.w(e)
|
||||
CrashReportService.sendExceptionReport(e, "NoteEditor::onImage")
|
||||
@ -191,10 +191,10 @@ class FieldEditText : FixedEditText, NoteService.NoteField {
|
||||
}
|
||||
|
||||
override fun onTextContextMenuItem(id: Int): Boolean {
|
||||
// This handles both CTRL+V and "Paste"
|
||||
// The current function is called both by Ctrl+V and pasting from the context menu
|
||||
if (id == android.R.id.paste) {
|
||||
if (hasImage(clipboard)) {
|
||||
return onImagePaste(getImageUri(clipboard))
|
||||
return onPaste(getUri(clipboard))
|
||||
}
|
||||
return pastePlainText()
|
||||
}
|
||||
@ -215,11 +215,11 @@ class FieldEditText : FixedEditText, NoteService.NoteField {
|
||||
return false
|
||||
}
|
||||
|
||||
private fun onImagePaste(imageUri: Uri?): Boolean {
|
||||
return if (imageUri == null) {
|
||||
private fun onPaste(mediaUri: Uri?): Boolean {
|
||||
return if (mediaUri == null) {
|
||||
false
|
||||
} else {
|
||||
imageListener!!.onImagePaste(this, imageUri)
|
||||
pasteListener!!.onPaste(this, mediaUri)
|
||||
}
|
||||
}
|
||||
|
||||
@ -251,8 +251,8 @@ class FieldEditText : FixedEditText, NoteService.NoteField {
|
||||
fun onSelectionChanged(selStart: Int, selEnd: Int)
|
||||
}
|
||||
|
||||
fun interface ImagePasteListener {
|
||||
fun onImagePaste(editText: EditText, uri: Uri?): Boolean
|
||||
fun interface PasteListener {
|
||||
fun onPaste(editText: EditText, uri: Uri?): Boolean
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
@ -39,15 +39,15 @@ import java.io.InputStream
|
||||
*/
|
||||
class MediaRegistration(private val context: Context) {
|
||||
// Use the same HTML if the same image is pasted multiple times.
|
||||
private val pastedImageCache = HashMap<String, String?>()
|
||||
private val pastedMediaCache = HashMap<String, String?>()
|
||||
|
||||
/**
|
||||
* Loads an image into the collection.media directory and returns a HTML reference
|
||||
* Loads media into the collection.media directory and returns a HTML reference
|
||||
* @param uri The uri of the image to load
|
||||
* @return HTML referring to the loaded image
|
||||
*/
|
||||
@Throws(IOException::class)
|
||||
fun loadImageIntoCollection(uri: Uri): String? {
|
||||
fun loadMediaIntoCollection(uri: Uri): String? {
|
||||
val fileName: String
|
||||
val filename = getFileName(context.contentResolver, uri)
|
||||
val fd = openInputStreamWithURI(uri)
|
||||
@ -87,7 +87,7 @@ class MediaRegistration(private val context: Context) {
|
||||
}
|
||||
val field = ImageField()
|
||||
field.hasTemporaryMedia = true
|
||||
field.extraImagePathRef = tempFilePath
|
||||
field.mediaPath = tempFilePath
|
||||
return field.formattedValue
|
||||
}
|
||||
|
||||
@ -129,13 +129,13 @@ class MediaRegistration(private val context: Context) {
|
||||
return fileNameAndExtension.key.length <= 3
|
||||
}
|
||||
|
||||
fun onImagePaste(uri: Uri): String? {
|
||||
fun onPaste(uri: Uri): String? {
|
||||
return try {
|
||||
// check if cache already holds registered file or not
|
||||
if (!pastedImageCache.containsKey(uri.toString())) {
|
||||
pastedImageCache[uri.toString()] = loadImageIntoCollection(uri)
|
||||
if (!pastedMediaCache.containsKey(uri.toString())) {
|
||||
pastedMediaCache[uri.toString()] = loadMediaIntoCollection(uri)
|
||||
}
|
||||
pastedImageCache[uri.toString()]
|
||||
pastedMediaCache[uri.toString()]
|
||||
} catch (ex: NullPointerException) {
|
||||
// Tested under FB Messenger and GMail, both apps do nothing if this occurs.
|
||||
// This typically works if the user copies again - don't know the exact cause
|
||||
@ -143,28 +143,28 @@ class MediaRegistration(private val context: Context) {
|
||||
// java.lang.SecurityException: Permission Denial: opening provider
|
||||
// org.chromium.chrome.browser.util.ChromeFileProvider from ProcessRecord{80125c 11262:com.ichi2.anki/u0a455}
|
||||
// (pid=11262, uid=10455) that is not exported from UID 10057
|
||||
Timber.w(ex, "Failed to paste image")
|
||||
Timber.w(ex, "Failed to paste media")
|
||||
null
|
||||
} catch (ex: SecurityException) {
|
||||
Timber.w(ex, "Failed to paste image")
|
||||
Timber.w(ex, "Failed to paste media")
|
||||
null
|
||||
} catch (e: Exception) {
|
||||
// NOTE: This is happy path coding which works on Android 9.
|
||||
CrashReportService.sendExceptionReport("File is invalid issue:8880", "RegisterMediaForWebView:onImagePaste URI of file:$uri")
|
||||
Timber.w(e, "Failed to paste image")
|
||||
Timber.w(e, "Failed to paste media")
|
||||
showThemedToast(context, context.getString(R.string.multimedia_editor_something_wrong), false)
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
@CheckResult
|
||||
fun registerMediaForWebView(imagePath: String?): Boolean {
|
||||
if (imagePath == null) {
|
||||
fun registerMediaForWebView(mediaPath: String?): Boolean {
|
||||
if (mediaPath == null) {
|
||||
// Nothing to register - continue with execution.
|
||||
return true
|
||||
}
|
||||
Timber.i("Adding media to collection: %s", imagePath)
|
||||
val f = File(imagePath)
|
||||
Timber.i("Adding media to collection: %s", mediaPath)
|
||||
val f = File(mediaPath)
|
||||
return try {
|
||||
CollectionManager.getColUnsafe().media.addFile(f)
|
||||
true
|
||||
|
@ -623,7 +623,7 @@ class NoteEditor : AnkiFragment(R.layout.note_editor), DeckSelectionListener, Su
|
||||
// TODO: Support all extensions
|
||||
// See https://github.com/ankitects/anki/blob/6f3550464d37aee1b8b784e431cbfce8382d3ce7/rslib/src/image_occlusion/imagedata.rs#L154
|
||||
if (ClipboardUtil.hasImage(clipboard)) {
|
||||
val uri = ClipboardUtil.getImageUri(clipboard)
|
||||
val uri = ClipboardUtil.getUri(clipboard)
|
||||
val i = Intent().apply {
|
||||
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
clipData = ClipData.newUri(requireActivity().contentResolver, uri.toString(), uri)
|
||||
@ -1594,8 +1594,8 @@ class NoteEditor : AnkiFragment(R.layout.note_editor), DeckSelectionListener, Su
|
||||
val editLineView = editLines[i]
|
||||
customViewIds.add(editLineView.id)
|
||||
val newEditText = editLineView.editText
|
||||
newEditText.setImagePasteListener { editText: EditText?, uri: Uri? ->
|
||||
onImagePaste(
|
||||
newEditText.setPasteListener { editText: EditText?, uri: Uri? ->
|
||||
onPaste(
|
||||
editText!!,
|
||||
uri!!
|
||||
)
|
||||
@ -1837,9 +1837,9 @@ class NoteEditor : AnkiFragment(R.layout.note_editor), DeckSelectionListener, Su
|
||||
}
|
||||
}
|
||||
|
||||
private fun onImagePaste(editText: EditText, uri: Uri): Boolean {
|
||||
val imageTag = mediaRegistration!!.onImagePaste(uri) ?: return false
|
||||
insertStringInField(editText, imageTag)
|
||||
private fun onPaste(editText: EditText, uri: Uri): Boolean {
|
||||
val mediaTag = mediaRegistration!!.onPaste(uri) ?: return false
|
||||
insertStringInField(editText, mediaTag)
|
||||
return true
|
||||
}
|
||||
|
||||
|
@ -54,7 +54,7 @@ object ClipboardUtil {
|
||||
?.takeIf { it.itemCount > 0 }
|
||||
?.getItemAt(0)
|
||||
|
||||
fun getImageUri(clipboard: ClipboardManager?): Uri? {
|
||||
fun getUri(clipboard: ClipboardManager?): Uri? {
|
||||
return getFirstItem(clipboard)?.uri
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user