Add support for updating media description and focus point when editing statuses (#3215)

* Add support for updating media description and focus point when editing statuses

* Don't publish description/focus point updates via the standard api when editing a published post
This commit is contained in:
Levi Bard 2023-02-14 21:13:38 +01:00 committed by GitHub
parent d34586b7c8
commit 395e21c956
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 43 additions and 17 deletions

View file

@ -335,17 +335,20 @@ class ComposeViewModel @Inject constructor(
}
}
val updatedItem = newMediaList.find { it.localId == localId }
if (updatedItem?.id != null) {
val focus = updatedItem.focus
val focusString = if (focus != null) "${focus.x},${focus.y}" else null
return api.updateMedia(updatedItem.id, updatedItem.description, focusString)
.fold({
true
}, { throwable ->
Log.w(TAG, "failed to update media", throwable)
false
})
if (!editing) {
// Updates to media for already-published statuses need to go through the status edit api
val updatedItem = newMediaList.find { it.localId == localId }
if (updatedItem?.id != null) {
val focus = updatedItem.focus
val focusString = if (focus != null) "${focus.x},${focus.y}" else null
return api.updateMedia(updatedItem.id, updatedItem.description, focusString)
.fold({
true
}, { throwable ->
Log.w(TAG, "failed to update media", throwable)
false
})
}
}
return true
}

View file

@ -48,11 +48,12 @@ class MediaPreviewAdapter(
val addFocusId = 2
val editImageId = 3
val removeId = 4
if (item.state != ComposeActivity.QueuedMedia.State.PUBLISHED) {
// Already-published items can't have their metadata edited
popup.menu.add(0, addCaptionId, 0, R.string.action_set_caption)
if (item.type == ComposeActivity.QueuedMedia.Type.IMAGE) {
popup.menu.add(0, addFocusId, 0, R.string.action_set_focus)
popup.menu.add(0, addCaptionId, 0, R.string.action_set_caption)
if (item.type == ComposeActivity.QueuedMedia.Type.IMAGE) {
popup.menu.add(0, addFocusId, 0, R.string.action_set_focus)
if (item.state != ComposeActivity.QueuedMedia.State.PUBLISHED) {
// Already-published items can't be edited
popup.menu.add(0, editImageId, 0, R.string.action_edit_image)
}
}

View file

@ -83,7 +83,9 @@ data class Attachment(
data class Focus(
val x: Float,
val y: Float
) : Parcelable
) : Parcelable {
fun toMastodonApiString(): String = "$x,$y"
}
/**
* The size of an image, used to specify the width/height.

View file

@ -26,6 +26,7 @@ data class NewStatus(
val visibility: String,
val sensitive: Boolean,
@SerializedName("media_ids") val mediaIds: List<String>?,
@SerializedName("media_attributes") val mediaAttributes: List<MediaAttribute>?,
@SerializedName("scheduled_at") val scheduledAt: String?,
val poll: NewPoll?,
val language: String?,
@ -37,3 +38,13 @@ data class NewPoll(
@SerializedName("expires_in") val expiresIn: Int,
val multiple: Boolean
) : Parcelable
// It would be nice if we could reuse MediaToSend,
// but the server requires a different format for focus
@Parcelize
data class MediaAttribute(
val id: String,
val description: String?,
val focus: String?,
val thumbnail: String?,
) : Parcelable

View file

@ -29,6 +29,7 @@ import com.keylesspalace.tusky.components.notifications.NotificationHelper
import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.di.Injectable
import com.keylesspalace.tusky.entity.Attachment
import com.keylesspalace.tusky.entity.MediaAttribute
import com.keylesspalace.tusky.entity.NewPoll
import com.keylesspalace.tusky.entity.NewStatus
import com.keylesspalace.tusky.entity.Status
@ -190,6 +191,14 @@ class SendStatusService : Service(), Injectable {
scheduledAt = statusToSend.scheduledAt,
poll = statusToSend.poll,
language = statusToSend.language,
mediaAttributes = media.map { media ->
MediaAttribute(
id = media.id!!,
description = media.description,
focus = media.focus?.toMastodonApiString(),
thumbnail = null,
)
},
)
val sendResult = if (statusToSend.statusId == null) {