From af44b25c29f73f8c7ff1259970c040fa124036df Mon Sep 17 00:00:00 2001 From: Garrit Franke <32395585+garritfra@users.noreply.github.com> Date: Sun, 25 Oct 2020 18:41:11 +0100 Subject: [PATCH] Delete scheduled post after editing (#1947) * Delete scheduled post after editing This ensures that editing a scheduled toot will not duplicate it. Fixes #1924 * Fix scheduled toot editing * Convert isEditingScheduledToot to property * Replace MediatorLiveData with combineLiveData * Remove dead code * Fix observer emission * Fix "Finish media upload" appearing for split second --- .../tusky/SavedTootActivity.java | 1 + .../components/compose/ComposeActivity.kt | 9 +++++--- .../components/compose/ComposeViewModel.kt | 21 ++++++++++++++++++- .../scheduled/ScheduledTootActivity.kt | 1 + 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java b/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java index 2e7321635..9a1639898 100644 --- a/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java +++ b/app/src/main/java/com/keylesspalace/tusky/SavedTootActivity.java @@ -164,6 +164,7 @@ public final class SavedTootActivity extends BaseActivity implements SavedTootAd List descriptions = gson.fromJson(item.getDescriptions(), stringListType); ComposeOptions composeOptions = new ComposeOptions( + /*scheduledTootUid*/null, item.getUid(), item.getText(), jsonUrls, diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt index c803b8e1b..f81354ed4 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt @@ -744,9 +744,11 @@ class ComposeActivity : BaseActivity(), composeEditField.error = getString(R.string.error_empty) enableButtons(true) } else if (characterCount <= maximumTootCharacters) { - finishingUploadDialog = ProgressDialog.show( - this, getString(R.string.dialog_title_finishing_media_upload), - getString(R.string.dialog_message_uploading_media), true, true) + if (viewModel.media.value!!.isNotEmpty()) { + finishingUploadDialog = ProgressDialog.show( + this, getString(R.string.dialog_title_finishing_media_upload), + getString(R.string.dialog_message_uploading_media), true, true) + } viewModel.sendStatus(contentText, spoilerText).observe(this, { finishingUploadDialog?.dismiss() @@ -1001,6 +1003,7 @@ class ComposeActivity : BaseActivity(), @Parcelize data class ComposeOptions( // Let's keep fields var until all consumers are Kotlin + var scheduledTootUid: String? = null, var savedTootUid: Int? = null, var tootText: String? = null, var mediaUrls: List? = null, diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt index 9cd4b777a..63ab13eab 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt @@ -19,8 +19,10 @@ import android.net.Uri import android.util.Log import androidx.core.net.toUri import androidx.lifecycle.LiveData +import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer +import androidx.work.impl.utils.LiveDataUtils import com.keylesspalace.tusky.adapter.ComposeAutoCompleteAdapter import com.keylesspalace.tusky.components.compose.ComposeActivity.QueuedMedia import com.keylesspalace.tusky.components.search.SearchType @@ -33,6 +35,8 @@ import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.service.ServiceClient import com.keylesspalace.tusky.service.TootToSend import com.keylesspalace.tusky.util.* +import io.reactivex.Observable.empty +import io.reactivex.Observable.just import io.reactivex.disposables.Disposable import io.reactivex.rxkotlin.Singles import java.util.* @@ -58,6 +62,7 @@ class ComposeViewModel private var replyingStatusContent: String? = null internal var startingText: String? = null private var savedTootUid: Int = 0 + private var scheduledTootUid: String? = null private var startingContentWarning: String = "" private var inReplyToId: String? = null private var startingVisibility: Status.Visibility = Status.Visibility.UNKNOWN @@ -94,6 +99,7 @@ class ComposeViewModel private val mediaToDisposable = mutableMapOf() + private val isEditingScheduledToot get() = !scheduledTootUid.isNullOrEmpty() init { @@ -241,7 +247,14 @@ class ComposeViewModel content: String, spoilerText: String ): LiveData { - return media + + val deletionObservable = if (isEditingScheduledToot) { + api.deleteScheduledStatus(scheduledTootUid.toString()).toObservable().map { Unit } + } else { + just(Unit) + }.toLiveData() + + val sendObservable = media .filter { items -> items.all { it.uploadPercent == -1 } } .map { val mediaIds = ArrayList() @@ -272,8 +285,13 @@ class ComposeViewModel idempotencyKey = randomAlphanumericString(16), retries = 0 ) + serviceClient.sendToot(tootToSend) } + + return combineLiveData(deletionObservable, sendObservable) { _, _ -> Unit } + + } fun updateDescription(localId: Long, description: String): LiveData { @@ -406,6 +424,7 @@ class ComposeViewModel savedTootUid = composeOptions?.savedTootUid ?: 0 + scheduledTootUid = composeOptions?.scheduledTootUid startingText = composeOptions?.tootText diff --git a/app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledTootActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledTootActivity.kt index f8cdd5806..18b04df52 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledTootActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledTootActivity.kt @@ -120,6 +120,7 @@ class ScheduledTootActivity : BaseActivity(), ScheduledTootActionListener, Injec override fun edit(item: ScheduledStatus) { val intent = ComposeActivity.startIntent(this, ComposeActivity.ComposeOptions( + scheduledTootUid = item.id, tootText = item.params.text, contentWarning = item.params.spoilerText, mediaAttachments = item.mediaAttachments,