diff --git a/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/experiments/MediaFilePicker.kt b/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/experiments/MediaFilePicker.kt index 391b1043..9b0e715b 100644 --- a/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/experiments/MediaFilePicker.kt +++ b/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/experiments/MediaFilePicker.kt @@ -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 diff --git a/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/messaging/SendOverride.kt b/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/messaging/SendOverride.kt index 71beb462..68734871 100644 --- a/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/messaging/SendOverride.kt +++ b/core/src/main/kotlin/me/eternal/purrfectsnap/core/features/impl/messaging/SendOverride.kt @@ -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 ) } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 7007fcab..eb0029da 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -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/") } } }