Merge pull request #136 from schrodingerspet/fix/media-resend-duration-pr

fix: preserve queued snap duration for media resend flow
This commit is contained in:
Aditya Akolkar
2026-04-19 11:35:20 +05:30
committed by GitHub
3 changed files with 37 additions and 14 deletions

View File

@@ -74,6 +74,7 @@ class MediaFilePicker : Feature("Media File Picker") {
private var originalUnsplitItem: Any? = null
private var reusableOriginalItem: Any? = null
private var queuedOverrideType: String? = null
private var queuedOverrideSnapDurationMs: Int? = null
private var bypassSplitOnce = false
private var sendSingleItemHandler: ((Any) -> Boolean)? = null
private var cleanupItemHandler: ((String) -> Unit)? = null
@@ -81,10 +82,12 @@ class MediaFilePicker : Feature("Media File Picker") {
fun hasPendingSplitCleanup(): Boolean = queuedSplitItemIds.isNotEmpty()
fun hasOriginalUnsplitItem(): Boolean = originalUnsplitItem != null
fun hasReusableOriginalItem(): Boolean = reusableOriginalItem != null
fun setQueuedOverrideType(value: String?) {
fun setQueuedOverrideType(value: String?, snapDurationMs: Int? = 10_000) {
queuedOverrideType = value
queuedOverrideSnapDurationMs = if (value == null) null else snapDurationMs
}
fun getQueuedOverrideType(): String? = queuedOverrideType
fun getQueuedOverrideSnapDurationMs(): Int? = queuedOverrideSnapDurationMs
fun clearQueuedSplitItems(deleteTempItems: Boolean = true) {
if (deleteTempItems) {
val cleanup = cleanupItemHandler
@@ -97,6 +100,7 @@ class MediaFilePicker : Feature("Media File Picker") {
queuedSplitCleanupUris.clear()
originalUnsplitItem = null
queuedOverrideType = null
queuedOverrideSnapDurationMs = null
}
fun sendReusableOriginalItem(): Boolean {
val item = reusableOriginalItem ?: return false
@@ -116,8 +120,10 @@ class MediaFilePicker : Feature("Media File Picker") {
fun sendOriginalUnsplitItem(): Boolean {
val item = originalUnsplitItem ?: return false
val overrideType = queuedOverrideType
val overrideSnapDurationMs = queuedOverrideSnapDurationMs
clearQueuedSplitItems(deleteTempItems = true)
queuedOverrideType = overrideType
queuedOverrideSnapDurationMs = overrideSnapDurationMs
bypassSplitOnce = true
val sender = sendSingleItemHandler ?: return false
return sender(item)
@@ -130,10 +136,12 @@ class MediaFilePicker : Feature("Media File Picker") {
}
if (queuedSplitItems.isEmpty()) {
queuedOverrideType = null
queuedOverrideSnapDurationMs = null
return false
}
val next = queuedSplitItems.removeFirstOrNull() ?: run {
queuedOverrideType = null
queuedOverrideSnapDurationMs = null
return false
}
val sender = sendSingleItemHandler ?: return false

View File

@@ -67,16 +67,19 @@ class SendOverride : Feature("Send Override") {
private val internalMultipartSend = ThreadLocal.withInitial { false }
private var queuedOriginalItemRepeatCount = 0
private var queuedOriginalItemRepeatOverrideType: String? = null
private var queuedOriginalItemRepeatSnapDurationMs: Int? = null
private fun queueOriginalItemRepeats(repeatCount: Int, overrideType: String) {
private fun queueOriginalItemRepeats(repeatCount: Int, overrideType: String, snapDurationMs: Int?) {
queuedOriginalItemRepeatCount = repeatCount
queuedOriginalItemRepeatOverrideType = overrideType
MediaFilePicker.setQueuedOverrideType(overrideType)
queuedOriginalItemRepeatSnapDurationMs = snapDurationMs
MediaFilePicker.setQueuedOverrideType(overrideType, snapDurationMs)
}
private fun clearQueuedOriginalItemRepeats() {
queuedOriginalItemRepeatCount = 0
queuedOriginalItemRepeatOverrideType = null
queuedOriginalItemRepeatSnapDurationMs = null
}
private fun handleQueuedOriginalItemRepeatSuccess(): Boolean {
@@ -89,9 +92,10 @@ class SendOverride : Feature("Send Override") {
clearQueuedOriginalItemRepeats()
return false
}
val snapDurationMs = queuedOriginalItemRepeatSnapDurationMs
queuedOriginalItemRepeatCount--
MediaFilePicker.setQueuedOverrideType(overrideType)
MediaFilePicker.setQueuedOverrideType(overrideType, snapDurationMs)
val result = MediaFilePicker.sendReusableOriginalItem()
if (!result) {
queuedOriginalItemRepeatCount++
@@ -830,8 +834,14 @@ class SendOverride : Feature("Send Override") {
return applyOverride(localMessageContent, messageProtoReader, overrideType, snapDurationMs)
}
val resolvedOverrideType = MediaFilePicker.getQueuedOverrideType()
val queuedOverrideType = MediaFilePicker.getQueuedOverrideType()
val resolvedOverrideType = queuedOverrideType
?: configOverrideType?.takeIf { it != "always_ask" }
val resolvedSnapDurationMs = if (queuedOverrideType != null) {
MediaFilePicker.getQueuedOverrideSnapDurationMs()
} else {
10000
}
fun attachQueuedRepeatCallbacks(sendEvent: SendMessageWithContentEvent) {
sendEvent.addCallbackResult("onSuccess") {
@@ -858,7 +868,7 @@ class SendOverride : Feature("Send Override") {
if (MediaFilePicker.hasPendingSplitCleanup() || MediaFilePicker.getQueuedOverrideType() != null || queuedOriginalItemRepeatCount > 0) {
attachQueuedRepeatCallbacks(event)
}
if (sendMedia(resolvedOverrideType, 10000)) {
if (sendMedia(resolvedOverrideType, resolvedSnapDurationMs)) {
if (event.canceled) invokeOriginalAndRestoreResult(event)
}
return@subscribe
@@ -1274,6 +1284,11 @@ class SendOverride : Feature("Send Override") {
}
Button(onClick = {
val finalSelectedType = selectedType
val selectedSnapDurationMs = if (finalSelectedType != "SAVEABLE_SNAP") {
convertDuration(customDuration)
} else {
null
}
val repeatCount = if (continuousSendEnabled) {
continuousSendCount.toIntOrNull()?.takeIf { it > 0 }
} else {
@@ -1295,13 +1310,13 @@ class SendOverride : Feature("Send Override") {
}
alertDialog.dismiss()
if (disableSplitForCurrentSend && MediaFilePicker.hasOriginalUnsplitItem()) {
MediaFilePicker.setQueuedOverrideType(finalSelectedType)
MediaFilePicker.setQueuedOverrideType(finalSelectedType, selectedSnapDurationMs)
if (!MediaFilePicker.sendOriginalUnsplitItem()) {
MediaFilePicker.setQueuedOverrideType(null)
}
return@Button
} else if (MediaFilePicker.hasPendingSplitCleanup()) {
MediaFilePicker.setQueuedOverrideType(finalSelectedType)
MediaFilePicker.setQueuedOverrideType(finalSelectedType, selectedSnapDurationMs)
event.addCallbackResult("onSuccess") {
context.runOnUiThread {
if (!MediaFilePicker.handleCurrentQueuedItemSuccess()) {
@@ -1361,7 +1376,7 @@ class SendOverride : Feature("Send Override") {
if (sendRepeatedMediaManual(
repeatCount,
finalSelectedType,
if (finalSelectedType != "SAVEABLE_SNAP") convertDuration(customDuration) else null
selectedSnapDurationMs
)) {
val successText = context.translation.format("schedule_sent_to", "name" to recipientNameForTask) ?: "Sent to $recipientNameForTask"
context.inAppOverlay.showStatusToast(
@@ -1410,13 +1425,13 @@ class SendOverride : Feature("Send Override") {
}
} else {
if (repeatCount == 1) {
if (sendMedia(finalSelectedType, if (finalSelectedType != "SAVEABLE_SNAP") convertDuration(customDuration) else null)) {
if (sendMedia(finalSelectedType, selectedSnapDurationMs)) {
invokeOriginalAndRestoreResult(event)
}
} else if (MediaFilePicker.hasReusableOriginalItem()) {
queueOriginalItemRepeats(repeatCount - 1, finalSelectedType)
queueOriginalItemRepeats(repeatCount - 1, finalSelectedType, selectedSnapDurationMs)
attachQueuedRepeatCallbacks(event)
if (sendMedia(finalSelectedType, if (finalSelectedType != "SAVEABLE_SNAP") convertDuration(customDuration) else null)) {
if (sendMedia(finalSelectedType, selectedSnapDurationMs)) {
invokeOriginalAndRestoreResult(event)
} else {
clearQueuedOriginalItemRepeats()
@@ -1425,7 +1440,7 @@ class SendOverride : Feature("Send Override") {
sendRepeatedMediaManual(
repeatCount,
finalSelectedType,
if (finalSelectedType != "SAVEABLE_SNAP") convertDuration(customDuration) else null
selectedSnapDurationMs
)
}
}

View File

@@ -115,8 +115,8 @@ dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://api.xposed.info/") }
maven { url = uri("https://jitpack.io") }
maven { url = uri("https://api.xposed.info/") }
}
}